cuikmove.c
Go to the documentation of this file.
1 #include "cuikmove.h"
2 
3 #include "world.h"
4 #include "interval.h"
5 #include "defines.h"
6 #include "error.h"
7 
8 #include "cuikmove_interface.h"
9 #include "cuikplay_support.h"
10 
11 #include <gtk/gtk.h>
12 
13 #include <string.h>
14 #include <unistd.h>
15 #include <time.h>
16 
79 int main(int argc, char **arg)
80 {
81 
82  if (argc>1)
83  {
84  Tworld world;
85  Tparameters parameters;
86 
87  Tfilename fparam;
88  Tfilename fworld;
89 
90  Tplot3d pt;
91  double axesLength;
92 
93  TCuikMoveControl status;
94  Tinterval range;
95  unsigned int i;
96 
97  unsigned int accuracy,rep;
98  boolean dynamics;
99 
100  GtkWidget *window_cuikmove;
101 
102  FILE *initFile;
103 
104  CreateFileName(NULL,arg[1],NULL,PARAM_EXT,&fparam);
105  InitParametersFromFile(GetFileFullName(&fparam),&parameters);
106 
107  rep=(unsigned int)(GetParameter(CT_REPRESENTATION,&parameters));
108  if (rep!=REP_JOINTS)
109  {
110  Warning("Changing the representation to joints (this may cause problems if the world includes user-defined equations)");
111  ChangeParameter(CT_REPRESENTATION,(double)REP_JOINTS,&parameters);
112  }
113 
114  dynamics=(GetParameter(CT_DYNAMICS,&parameters)>0.5);
115  if (dynamics)
116  ChangeParameter(CT_DYNAMICS,0,&parameters);
117 
118  CreateFileName(NULL,arg[1],NULL,WORLD_EXT,&fworld);
119  InitWorldFromFile(&parameters,TRUE,TRUE,arg[1],&world);
120 
121  if (argc>2)
122  {
123  Tfilename finput;
124 
125  CreateFileName(NULL,arg[2],NULL,JOINTS_EXT,&finput);
126  initFile=fopen(GetFileFullName(&finput),"r");
127  DeleteFileName(&finput);
128  }
129  else
130  initFile=NULL;
131 
132  if (argc>3)
133  axesLength=atof(arg[3]);
134  else
135  axesLength=0.0;
136 
137  if (argc>4)
138  accuracy=atoi(arg[4]);
139  else
140  accuracy=3; /* about one 10th of a degree */
141 
142 
143  status.ndof=GetWorldNDOF(&world);
144  status.accuracy=accuracy;
145  status.changed=TRUE;
146  status.end=FALSE;
147  NEW(status.min,status.ndof,double);
148  NEW(status.max,status.ndof,double);
149  NEW(status.dof,status.ndof,double);
150  NEW(status.shown,status.ndof,boolean);
151  status.nShown=0;
152  for(i=0;i<status.ndof;i++)
153  {
154  GetWorldRangeDOF(i,&range,&world);
155  status.min[i]=LowerLimit(&range);
156  if (initFile==NULL)
157  status.dof[i]=IntervalCenter(&range);
158  else
159  fscanf(initFile,"%lf",&(status.dof[i]));
160  status.max[i]=UpperLimit(&range);
161  status.shown[i]=(IntervalSize(&range)>ZERO);
162  if (status.shown[i]) status.nShown++;
163  DeleteInterval(&range);
164  }
165  status.p=&parameters;
166  status.w=&world;
167  status.fw=GetFileBaseName(&fworld);
168  status.dynamics=dynamics;
169 
170  if (initFile!=NULL)
171  fclose(initFile);
172 
173  gtk_disable_setlocale();
174  gtk_init(&argc,&arg);
175 
176  window_cuikmove=create_window_cuikmove((gpointer)(&status));
177  gtk_widget_show(window_cuikmove);
178 
179  InitPlot3d(NULL,FALSE,argc,arg,&pt);
180  PlotWorld(&parameters,&pt,axesLength,&world); /* This initializes collision detection */
181  MoveWorldDOF(&parameters,&pt,status.dof,&world);
182  LookPlot3d(&pt);
183  status.changed=FALSE;
184 
185  while(!status.end)
186  {
187  if (status.changed)
188  {
189  MoveWorldDOF(&parameters,&pt,status.dof,&world);
190  status.changed=FALSE;
191  }
192 
193  gtk_main_iteration_do(FALSE);
194  }
195 
196  ClosePlot3d(TRUE,&pt);
197 
198  free(status.min);
199  free(status.max);
200  free(status.dof);
201  free(status.shown);
202 
203  DeleteWorld(&world);
204  DeleteParameters(&parameters);
205 
206  DeleteFileName(&fworld);
207  DeleteFileName(&fparam);
208  }
209  else
210  {
211  fprintf(stdout," Wrong number of parameters.\n");
212  fprintf(stdout," Use:\n");
213  fprintf(stdout," cuikmove <world>.world [<initFile>.dof <axes> <accuracy>]\n");
214  fprintf(stdout," Where:\n");
215  fprintf(stdout," <world>: File describing the problem\n");
216  fprintf(stdout," <initFile>: Optional. File from where to read the initial joint values.\n");
217  fprintf(stdout," <axes>: Optional. Length for the axes for each link.\n");
218  fprintf(stdout," The default value is 0, i.e., not to display them.\n");
219  fprintf(stdout," <accurary>: Optional. Size of each step in each DOF");
220  fprintf(stdout," (in decimal digits).\n");
221  fprintf(stdout," The default value is 3.\n");
222  fprintf(stdout," File extensions are not required\n");
223  }
224 
225  return(EXIT_SUCCESS);
226 }