1 #include <mystdlib.h>
2 // #include <incopengl.hpp>
3 #include <inctcl.hpp>
4 
5 
6 #include <myadt.hpp>
7 #include <meshing.hpp>
8 #include <csg.hpp>
9 #include <stlgeom.hpp>
10 
11 
12 // #include <parallel.hpp>
13 #include <visual.hpp>
14 
15 #include <limits>
16 
17 
18 
19 
20 
21 
22 namespace netgen
23 
24 {
25 
26   /*
27   */
28 
29 
30 
31 
32 
33 
34 
35 
Ng_Vis_Set(ClientData clientData,Tcl_Interp * interp,int argc,tcl_const char * argv[])36   int Ng_Vis_Set (ClientData clientData,
37                   Tcl_Interp * interp,
38                   int argc, tcl_const char *argv[])
39 
40   {
41     auto & vssolution = netgen::GetVSSolution();
42     if (argc >= 2)
43       {
44         if (strcmp (argv[1], "parameters") == 0)
45           {
46             vssolution.imag_part =
47               atoi (Tcl_GetVar (interp, "::visoptions.imaginary", TCL_GLOBAL_ONLY));
48             vssolution.usetexture =
49               atoi (Tcl_GetVar (interp, "::visoptions.usetexture", TCL_GLOBAL_ONLY));
50             if (atoi (Tcl_GetVar (interp, "::visoptions.redrawperiodic", TCL_GLOBAL_ONLY)))
51               vssolution.usetexture = 2;
52 
53             vssolution.invcolor =
54               atoi (Tcl_GetVar (interp, "::visoptions.invcolor", TCL_GLOBAL_ONLY));
55 
56             vssolution.clipsolution = 0;
57 
58             if (strcmp (Tcl_GetVar (interp, "::visoptions.clipsolution", TCL_GLOBAL_ONLY),
59                         "scal") == 0)
60               vssolution.clipsolution = 1;
61             if (strcmp (Tcl_GetVar (interp, "::visoptions.clipsolution", TCL_GLOBAL_ONLY),
62                         "vec") == 0)
63               vssolution.clipsolution = 2;
64 
65             tcl_const char * scalname =
66               Tcl_GetVar (interp, "::visoptions.scalfunction", TCL_GLOBAL_ONLY);
67             tcl_const char * vecname =
68               Tcl_GetVar (interp, "::visoptions.vecfunction", TCL_GLOBAL_ONLY);
69             tcl_const char * fieldlines_vecname =
70               Tcl_GetVar (interp, "::visoptions.fieldlinesvecfunction", TCL_GLOBAL_ONLY);
71 
72 
73             vssolution.scalfunction = -1;
74             vssolution.vecfunction = -1;
75             vssolution.fieldlines_vecfunction = -1;
76 
77             int pointpos; // SZ
78             const char * pch = strchr(scalname,':');
79             pointpos = int(pch-scalname+1);
80 
81             for (int i = 0; i < vssolution.soldata.Size(); i++)
82               {
83                 if ( (strlen (vssolution.soldata[i]->name.c_str()) == size_t(pointpos-1)) &&
84                      (strncmp (vssolution.soldata[i]->name.c_str(), scalname, pointpos-1) == 0) )
85                   {
86                     vssolution.scalfunction = i;
87                     vssolution.scalcomp = atoi (scalname + pointpos);
88 		    if ( vssolution.scalcomp > vssolution.soldata[i]->components )
89                       vssolution.scalcomp = 1;
90 		    char newscalname[100];
91 		    for ( int ii = 0; ii < pointpos; ii++ )
92 		      newscalname[ii] = scalname[ii];
93 		    newscalname[pointpos] = ':';
94 		    sprintf (newscalname+pointpos, "%i", vssolution.scalcomp);
95 
96                     if (strcmp (scalname, newscalname) != 0)
97                       Tcl_SetVar ( interp, "::visoptions.scalfunction", newscalname, TCL_GLOBAL_ONLY );
98 		    scalname = Tcl_GetVar (interp, "::visoptions.scalfunction", TCL_GLOBAL_ONLY);
99                   }
100                 if (strcmp (vssolution.soldata[i]->name.c_str(), vecname) == 0)
101 		  vssolution.vecfunction = i;
102 
103                 if (strcmp (vssolution.soldata[i]->name.c_str(), fieldlines_vecname) == 0)
104 		  vssolution.fieldlines_vecfunction = i;
105               }
106 
107             if(vssolution.fieldlines_vecfunction != -1 &&
108                vssolution.vecfunction == -1)
109               {
110                 //cout << "WARNING: Setting vector function in Visualization toolbox to value from Fieldlines toolbox!" << endl;
111                 vssolution.vecfunction = vssolution.fieldlines_vecfunction;
112               }
113 
114 	    // reset visoptions.scalfunction and visoptions.vecfunction if not avialable
115 	    if ( vssolution.scalfunction == -1 && strcmp (scalname, "none") != 0)
116               Tcl_SetVar ( interp, "::visoptions.scalfunction", "none", TCL_GLOBAL_ONLY );
117 	    if ( vssolution.vecfunction == -1  && strcmp (vecname, "none") != 0)
118               Tcl_SetVar ( interp, "::visoptions.vecfunction", "none", TCL_GLOBAL_ONLY );
119 
120             tcl_const char * evalname =
121               Tcl_GetVar (interp, "::visoptions.evaluate", TCL_GLOBAL_ONLY);
122 
123             if (strcmp(evalname, "abs") == 0) vssolution.evalfunc = VisualSceneSolution::FUNC_ABS;
124             if (strcmp(evalname, "abstens") == 0) vssolution.evalfunc = VisualSceneSolution::FUNC_ABS_TENSOR;
125             if (strcmp(evalname, "mises") == 0) vssolution.evalfunc = VisualSceneSolution::FUNC_MISES;
126             if (strcmp(evalname, "main") == 0) vssolution.evalfunc = VisualSceneSolution::FUNC_MAIN;
127 
128             vssolution.gridsize =
129               atoi (Tcl_GetVar (interp, "::visoptions.gridsize", TCL_GLOBAL_ONLY));
130 
131             vssolution.xoffset =
132               atof (Tcl_GetVar (interp, "::visoptions.xoffset", TCL_GLOBAL_ONLY));
133 
134             //    cout << "x-offset:" << vssolution.xoffset << endl;
135 
136             vssolution.yoffset =
137               atof (Tcl_GetVar (interp, "::visoptions.yoffset", TCL_GLOBAL_ONLY));
138 
139             vssolution.autoscale =
140               atoi (Tcl_GetVar (interp, "::visoptions.autoscale", TCL_GLOBAL_ONLY));
141 
142 
143             /*
144               vssolution.linear_colors =
145               atoi (Tcl_GetVar (interp, "::visoptions.lineartexture", TCL_GLOBAL_ONLY));
146             */
147             vssolution.logscale =
148               atoi (Tcl_GetVar (interp, "::visoptions.logscale", TCL_GLOBAL_ONLY));
149 
150             vssolution.mminval =
151               atof (Tcl_GetVar (interp, "::visoptions.mminval", TCL_GLOBAL_ONLY));
152             vssolution.mmaxval =
153               atof (Tcl_GetVar (interp, "::visoptions.mmaxval", TCL_GLOBAL_ONLY));
154 
155             vssolution.showclipsolution =
156               atoi (Tcl_GetVar (interp, "::visoptions.showclipsolution", TCL_GLOBAL_ONLY));
157             vssolution.showsurfacesolution =
158               atoi (Tcl_GetVar (interp, "::visoptions.showsurfacesolution", TCL_GLOBAL_ONLY));
159             vssolution.lineartexture =
160               atoi (Tcl_GetVar (interp, "::visoptions.lineartexture", TCL_GLOBAL_ONLY));
161             vssolution.numtexturecols =
162               atoi (Tcl_GetVar (interp, "::visoptions.numtexturecols", TCL_GLOBAL_ONLY));
163 
164             vssolution.multidimcomponent =
165               atoi (Tcl_GetVar (interp, "::visoptions.multidimcomponent", TCL_GLOBAL_ONLY));
166 
167 	    vssolution.drawpointcurves =
168 	      atoi (Tcl_GetVar (interp, "::visoptions.drawpointcurves", TCL_GLOBAL_ONLY));
169 
170             vssolution.draw_fieldlines =
171 	      atoi (Tcl_GetVar (interp, "::visoptions.drawfieldlines", TCL_GLOBAL_ONLY));
172             vssolution.num_fieldlines =
173               atoi (Tcl_GetVar (interp, "::visoptions.numfieldlines", TCL_GLOBAL_ONLY));
174             vssolution.fieldlines_randomstart =
175               atoi (Tcl_GetVar (interp, "::visoptions.fieldlinesrandomstart", TCL_GLOBAL_ONLY));
176 
177             vssolution.fieldlines_reltolerance =
178               atof (Tcl_GetVar (interp, "::visoptions.fieldlinestolerance", TCL_GLOBAL_ONLY));
179 
180             if (strcmp (Tcl_GetVar (interp, "::visoptions.fieldlinesrktype", TCL_GLOBAL_ONLY),
181                         "euler") == 0)
182               vssolution.fieldlines_rktype = 0;
183             else if (strcmp (Tcl_GetVar (interp, "::visoptions.fieldlinesrktype", TCL_GLOBAL_ONLY),
184                              "eulercauchy") == 0)
185               vssolution.fieldlines_rktype = 1;
186             else if (strcmp (Tcl_GetVar (interp, "::visoptions.fieldlinesrktype", TCL_GLOBAL_ONLY),
187                              "simpson") == 0)
188               vssolution.fieldlines_rktype = 2;
189             else if (strcmp (Tcl_GetVar (interp, "::visoptions.fieldlinesrktype", TCL_GLOBAL_ONLY),
190                              "crungekutta") == 0)
191               vssolution.fieldlines_rktype = 3;
192 
193 
194             vssolution.fieldlines_rellength =
195               atof (Tcl_GetVar (interp, "::visoptions.fieldlineslength", TCL_GLOBAL_ONLY));
196 
197             vssolution.fieldlines_maxpoints =
198               atoi (Tcl_GetVar (interp, "::visoptions.fieldlinesmaxpoints", TCL_GLOBAL_ONLY));
199 
200             vssolution.fieldlines_relthickness =
201               atof (Tcl_GetVar (interp, "::visoptions.fieldlinesthickness", TCL_GLOBAL_ONLY));
202 
203 
204             vssolution.fieldlines_fixedphase =
205               (atoi (Tcl_GetVar (interp, "::visoptions.fieldlinesonlyonephase", TCL_GLOBAL_ONLY)) != 0);
206 
207             if(vssolution.fieldlines_fixedphase)
208               vssolution.fieldlines_phase =
209                 atof (Tcl_GetVar (interp, "::visoptions.fieldlinesphase", TCL_GLOBAL_ONLY));
210 
211 
212             if (strcmp (Tcl_GetVar (interp, "::visoptions.fieldlinesstartarea", TCL_GLOBAL_ONLY),
213                         "box") == 0)
214               vssolution.fieldlines_startarea  = 0;
215             else if (strcmp (Tcl_GetVar (interp, "::visoptions.fieldlinesstartarea", TCL_GLOBAL_ONLY),
216                              "file") == 0)
217               vssolution.fieldlines_startarea  = 1;
218             else if (strcmp (Tcl_GetVar (interp, "::visoptions.fieldlinesstartarea", TCL_GLOBAL_ONLY),
219                              "face") == 0)
220               vssolution.fieldlines_startarea  = 2;
221 
222 
223             if (vssolution.fieldlines_startarea == 0)
224               {
225                 vssolution.fieldlines_startarea_parameter.SetSize(6);
226                 vssolution.fieldlines_startarea_parameter[0] = atof (Tcl_GetVar (interp, "::visoptions.fieldlinesstartareap1x", TCL_GLOBAL_ONLY));
227                 vssolution.fieldlines_startarea_parameter[1] = atof (Tcl_GetVar (interp, "::visoptions.fieldlinesstartareap1y", TCL_GLOBAL_ONLY));
228                 vssolution.fieldlines_startarea_parameter[2] = atof (Tcl_GetVar (interp, "::visoptions.fieldlinesstartareap1z", TCL_GLOBAL_ONLY));
229                 vssolution.fieldlines_startarea_parameter[3] = atof (Tcl_GetVar (interp, "::visoptions.fieldlinesstartareap2x", TCL_GLOBAL_ONLY));
230                 vssolution.fieldlines_startarea_parameter[4] = atof (Tcl_GetVar (interp, "::visoptions.fieldlinesstartareap2y", TCL_GLOBAL_ONLY));
231                 vssolution.fieldlines_startarea_parameter[5] = atof (Tcl_GetVar (interp, "::visoptions.fieldlinesstartareap2z", TCL_GLOBAL_ONLY));
232               }
233             else if (vssolution.fieldlines_startarea == 1)
234               {
235                 vssolution.fieldlines_filename = Tcl_GetVar (interp, "::visoptions.fieldlinesfilename", TCL_GLOBAL_ONLY);
236               }
237             else if (vssolution.fieldlines_startarea == 2)
238               {
239                 vssolution.fieldlines_startface = atoi (Tcl_GetVar (interp, "::visoptions.fieldlinesstartface", TCL_GLOBAL_ONLY));
240               }
241 
242 
243             vssolution.deform =
244               atoi (Tcl_GetVar (interp, "::visoptions.deformation", TCL_GLOBAL_ONLY));
245             vssolution.scaledeform =
246               atof (Tcl_GetVar (interp, "::visoptions.scaledeform1", TCL_GLOBAL_ONLY)) *
247               atof (Tcl_GetVar (interp, "::visoptions.scaledeform2", TCL_GLOBAL_ONLY));
248 
249 
250             if (atoi (Tcl_GetVar (interp, "::visoptions.isolines", TCL_GLOBAL_ONLY)))
251               vssolution.numisolines = atoi (Tcl_GetVar (interp, "::visoptions.numiso", TCL_GLOBAL_ONLY));
252             else
253               vssolution.numisolines = 0;
254             vssolution.draw_isosurface =
255               atoi (Tcl_GetVar (interp, "::visoptions.isosurf", TCL_GLOBAL_ONLY));
256 
257             vssolution.SetSubdivision(atoi (Tcl_GetVar (interp, "::visoptions.subdivisions", TCL_GLOBAL_ONLY)));
258 
259             vssolution.UpdateSolutionTimeStamp();
260           }
261 
262         if (strcmp (argv[1], "parametersrange") == 0)
263           {
264             vssolution.invcolor =
265               atoi (Tcl_GetVar (interp, "::visoptions.invcolor", TCL_GLOBAL_ONLY));
266             vssolution.mminval =
267               atof (Tcl_GetVar (interp, "::visoptions.mminval", TCL_GLOBAL_ONLY));
268             vssolution.mmaxval =
269               atof (Tcl_GetVar (interp, "::visoptions.mmaxval", TCL_GLOBAL_ONLY));
270             vssolution.lineartexture =
271               atoi (Tcl_GetVar (interp, "::visoptions.lineartexture", TCL_GLOBAL_ONLY));
272             vssolution.numtexturecols =
273               atoi (Tcl_GetVar (interp, "::visoptions.numtexturecols", TCL_GLOBAL_ONLY));
274 
275             if (vssolution.usetexture == 0 || vssolution.logscale)
276               vssolution.UpdateSolutionTimeStamp();
277           }
278 
279 
280         if (argc >= 3 && strcmp (argv[1], "time") == 0)
281           {
282             vssolution.time = double (atoi (argv[2])) / 1000;
283 
284             vssolution.timetimestamp = NextTimeStamp();
285             cout << "\rtime = " << vssolution.time << "    " << flush;
286           }
287 
288       }
289 
290 
291     vsmesh.SetClippingPlane ();  // for computing parameters
292     vssolution.SetClippingPlane ();  // for computing parameters
293     glDisable(GL_CLIP_PLANE0);
294 
295 #ifdef PARALLELGL
296     vsmesh.Broadcast ();
297 #endif
298 
299 
300     return TCL_OK;
301   }
302 
Ng_Vis_Field(ClientData clientData,Tcl_Interp * interp,int argc,tcl_const char * argv[])303   int Ng_Vis_Field (ClientData clientData,
304                     Tcl_Interp * interp,
305                     int argc, tcl_const char *argv[])
306   {
307     int i;
308     char buf[1000];
309     buf[0] = 0;
310     auto & vssolution = netgen::GetVSSolution();
311 
312     if (argc >= 2)
313       {
314         if (strcmp (argv[1], "setfield") == 0)
315           {
316             if (argc < 3)
317               return TCL_ERROR;
318 
319             for (i = 0; i < vssolution.GetNSolData(); i++)
320               if (strcmp (vssolution.GetSolData(i)->name.c_str(), argv[2]) == 0)
321                 {
322                   cout << "found soldata " << i << endl;
323                 }
324           }
325 
326         if (strcmp (argv[1], "getnfieldnames") == 0)
327           {
328             sprintf (buf, "%d", vssolution.GetNSolData());
329           }
330 
331         if (strcmp (argv[1], "getfieldname") == 0)
332           {
333             sprintf (buf, "%s", vssolution.GetSolData(atoi(argv[2])-1)->name.c_str());
334           }
335 
336         if (strcmp (argv[1], "iscomplex") == 0)
337           {
338             sprintf (buf, "%d", vssolution.GetSolData(atoi(argv[2])-1)->iscomplex);
339           }
340 
341         if (strcmp (argv[1], "getfieldcomponents") == 0)
342           {
343             sprintf (buf, "%d", vssolution.GetSolData(atoi(argv[2])-1)->components);
344           }
345 
346 
347         if (strcmp (argv[1], "getfieldnames") == 0)
348           {
349             for (i = 0; i < vssolution.GetNSolData(); i++)
350               {
351                 strcat (buf, vssolution.GetSolData(i)->name.c_str());
352                 strcat (buf, " ");
353               }
354             strcat (buf, "var1 var2 var3");
355             Tcl_SetResult (interp, buf, TCL_STATIC);
356           }
357 
358         if (strcmp (argv[1], "setcomponent") == 0)
359           {
360             cout << "set component " << argv[2] << endl;
361           }
362 
363         if (strcmp (argv[1], "getactivefield") == 0)
364           {
365             sprintf (buf, "1");
366           }
367 
368         if (strcmp (argv[1], "getdimension") == 0)
369           {
370             auto mesh = vssolution.GetMesh();
371             sprintf (buf, "%d", mesh->GetDimension());
372           }
373       }
374 
375     Tcl_SetResult (interp, buf, TCL_STATIC);
376     return TCL_OK;
377   }
378 
379   VisualSceneMeshDoctor vsmeshdoc;
380   DLL_HEADER extern shared_ptr<Mesh> mesh;
381 
Ng_MeshDoctor(ClientData clientData,Tcl_Interp * interp,int argc,tcl_const char * argv[])382   int Ng_MeshDoctor(ClientData clientData,
383 	  Tcl_Interp * interp,
384 	  int argc, tcl_const char *argv[])
385   {
386 	  cout << "Mesh Doctor:" << endl;
387 	  int i;
388 	  for (i = 0; i < argc; i++)
389 		  cout << argv[i] << " ";
390 	  cout << endl;
391 
392 	  meshdoctor.active =
393 		  atoi(Tcl_GetVar(interp, "::meshdoctor.active", 0));
394 
395 
396 	  if (argc >= 2)
397 	  {
398 		  if (strcmp(argv[1], "markedgedist") == 0)
399 		  {
400 			  vsmeshdoc.SetMarkEdgeDist(atoi(argv[2]));
401 		  }
402 
403 		  if (strcmp(argv[1], "deletemarkedsegments") == 0)
404 		  {
405 			  for (i = 1; i <= mesh->GetNSeg(); i++)
406 				  if (vsmeshdoc.IsSegmentMarked(i))
407 					  mesh->DeleteSegment(i);
408 
409 			  //	  for (i = 1; i <= mesh->GetNSE(); i++)
410 			  //	    mesh->SurfaceElement(i).SetIndex (1);
411 			  mesh->Compress();
412 		  }
413 	  }
414 
415 
416 	  vsmeshdoc.UpdateTables();
417 	  vsmeshdoc.BuildScene();
418 	  return TCL_OK;
419   }
420 
421 
422   extern "C" int Ng_Vis_Init (Tcl_Interp * interp);
423 
Ng_Vis_Init(Tcl_Interp * interp)424   int Ng_Vis_Init (Tcl_Interp * interp)
425   {
426     Tcl_CreateCommand (interp, "Ng_Vis_Set", Ng_Vis_Set,
427                        (ClientData)NULL,
428                        (Tcl_CmdDeleteProc*) NULL);
429 
430     Tcl_CreateCommand (interp, "Ng_Vis_Field", Ng_Vis_Field,
431                        (ClientData)NULL,
432                        (Tcl_CmdDeleteProc*) NULL);
433 
434 
435     return TCL_OK;
436   }
437 
438 
439 
440 
441 }
442 
443