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