From f6f4976402eea6a86956c0483805d45ce1c7c05d Mon Sep 17 00:00:00 2001 From: Matthias Hochsteger Date: Fri, 20 Sep 2019 11:31:52 +0200 Subject: [PATCH 1/8] Import STL as Mesh --- libsrc/interface/readuser.cpp | 28 ++++++++++++++++++++++++++++ ng/menustat.tcl | 1 + ng/ngpkg.cpp | 1 + ng/onetcl.cpp | 1 + 4 files changed, 31 insertions(+) diff --git a/libsrc/interface/readuser.cpp b/libsrc/interface/readuser.cpp index f53b9b40..f4311185 100644 --- a/libsrc/interface/readuser.cpp +++ b/libsrc/interface/readuser.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "writeuser.hpp" @@ -648,6 +649,33 @@ namespace netgen ReadFNFFormat (mesh, filename); } + if ( ( (strlen (filename) > 4) && strcmp (&filename[strlen (filename)-4], ".stl") == 0 ) || + ( (strlen (filename) > 5) && strcmp (&filename[strlen (filename)-5], ".stlb") == 0 ) ) + { + ifstream ist{string{filename}}; + auto geom = shared_ptr(STLGeometry::Load(ist)); + + mesh.SetDimension (3); + + auto & points = geom->GetPoints(); + + for (auto & p : points) + mesh.AddPoint(MeshPoint(p)); + + mesh.AddFaceDescriptor (FaceDescriptor (1, 1, 0, 1)); + + for (auto ti : IntRange(geom->GetNT())) + { + auto & trig = geom->GetTriangle(ti); + Element2d el(TRIG); + for (auto i : IntRange(3)) + el[i] = (*geom)[STLTrigIndex(ti)][i]; + + el.SetIndex(1); + + mesh.AddSurfaceElement(el); + } + } } } diff --git a/ng/menustat.tcl b/ng/menustat.tcl index 930a8602..48ce38e5 100644 --- a/ng/menustat.tcl +++ b/ng/menustat.tcl @@ -231,6 +231,7 @@ loadmeshinifile; {"Universal format" {.unv} } {"Olaf format" {.emt} } {"TET format" {.tet} } + {"STL format" {.stl .stlb} } {"Pro/ENGINEER neutral format" {.fnf} } } set file [tk_getOpenFile -filetypes $types ] diff --git a/ng/ngpkg.cpp b/ng/ngpkg.cpp index c5dfa128..47e85828 100644 --- a/ng/ngpkg.cpp +++ b/ng/ngpkg.cpp @@ -405,6 +405,7 @@ namespace netgen PrintMessage (2, mesh->GetNP(), " Points, ", mesh->GetNE(), " Elements."); + SetGlobalMesh (mesh); mesh->SetGlobalH (mparam.maxh); mesh->CalcLocalH(mparam.grading); diff --git a/ng/onetcl.cpp b/ng/onetcl.cpp index bfe9f31a..e61239bb 100644 --- a/ng/onetcl.cpp +++ b/ng/onetcl.cpp @@ -861,6 +861,7 @@ const char * ngscript[] = {"" ,"{\"Universal format\" {.unv} }\n" ,"{\"Olaf format\" {.emt} }\n" ,"{\"TET format\" {.tet} }\n" +,"{\"STL format\" {.stl .stlb} }\n" ,"{\"Pro/ENGINEER neutral format\" {.fnf} }\n" ,"}\n" ,"set file [tk_getOpenFile -filetypes $types ]\n" From 5cfb449d7a967599fb390a41578cf36fd1d8ae79 Mon Sep 17 00:00:00 2001 From: Matthias Hochsteger Date: Fri, 20 Sep 2019 11:55:46 +0200 Subject: [PATCH 2/8] Automatically distinguish between ASCII and binary stl files --- libsrc/stlgeom/stltopology.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libsrc/stlgeom/stltopology.cpp b/libsrc/stlgeom/stltopology.cpp index a1a1ef61..62f931b8 100644 --- a/libsrc/stlgeom/stltopology.cpp +++ b/libsrc/stlgeom/stltopology.cpp @@ -338,6 +338,18 @@ void STLTopology :: Save (const char* filename) const STLGeometry * STLTopology ::Load (istream & ist) { + // Check if the file starts with "solid". If not, the file is binary + { + char buf[5+1]; + FIOReadStringE(ist,buf,5); + if (strcmp(buf, "solid") != 0) + { + for (auto i : Range(5)) + ist.unget(); + return LoadBinary(ist); + } + } + STLGeometry * geom = new STLGeometry(); NgArray readtrigs; From 6b8867d76a670d11e385c14fe026d002455cb374 Mon Sep 17 00:00:00 2001 From: Christopher Lackner Date: Fri, 20 Sep 2019 12:37:40 +0200 Subject: [PATCH 3/8] generate volume mesh on GenerateMesh button if no geometry but mesh exists --- ng/ngpkg.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ng/ngpkg.cpp b/ng/ngpkg.cpp index 47e85828..c4866ab7 100644 --- a/ng/ngpkg.cpp +++ b/ng/ngpkg.cpp @@ -1373,6 +1373,12 @@ namespace netgen return 0; } } + else if (mesh) + { + MeshVolume(mparam, *mesh); + OptimizeVolume(mparam, *mesh); + return 0; + } else // no ng_geometry { multithread.task = savetask; From fc1dbc29577fea7a9394aad7f1a9cc093f6e1c63 Mon Sep 17 00:00:00 2001 From: Matthias Hochsteger Date: Fri, 20 Sep 2019 12:46:44 +0200 Subject: [PATCH 4/8] Revert "Change elementsonnode only when applying optimization" This reverts commit 6c0171f2c0067a8785e2df25696208754cc1c20f. --- libsrc/meshing/improve3.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libsrc/meshing/improve3.cpp b/libsrc/meshing/improve3.cpp index 263bad57..beb3cd5a 100644 --- a/libsrc/meshing/improve3.cpp +++ b/libsrc/meshing/improve3.cpp @@ -1027,6 +1027,9 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, el33[3] = pi3; el33.SetIndex (mattyp); + elementsonnode.Add (pi4, hasbothpoints[1]); + elementsonnode.Add (pi3, hasbothpoints[2]); + bad1 = CalcBad (mesh.Points(), el31, 0) + CalcBad (mesh.Points(), el32, 0) + CalcBad (mesh.Points(), el33, 0); @@ -1118,9 +1121,6 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, mesh[hasbothpoints[2]][l].Invalidate(); mesh[hasbothpoints[2]].Delete(); - elementsonnode.Add (pi4, hasbothpoints[1]); - elementsonnode.Add (pi3, hasbothpoints[2]); - for (int k = 0; k < 2; k++) for (int l = 0; l < 4; l++) elementsonnode.Add (mesh[hasbothpoints[k]][l], hasbothpoints[k]); From 8688c135b2fd4dde60ab712afe84778ed142f931 Mon Sep 17 00:00:00 2001 From: Matthias Hochsteger Date: Fri, 20 Sep 2019 12:47:25 +0200 Subject: [PATCH 5/8] Revert "Parallelize SwapImprove()" This reverts commit 8c9d75f5f473e8fbbf801f8cd0c5a580d9d39d9f. --- libsrc/meshing/improve3.cpp | 67 +++++++++++++++---------------------- libsrc/meshing/improve3.hpp | 2 +- 2 files changed, 28 insertions(+), 41 deletions(-) diff --git a/libsrc/meshing/improve3.cpp b/libsrc/meshing/improve3.cpp index beb3cd5a..d9ff8c61 100644 --- a/libsrc/meshing/improve3.cpp +++ b/libsrc/meshing/improve3.cpp @@ -897,7 +897,7 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, const NgBitArray * working_elements, TABLE & elementsonnode, INDEX_3_HASHTABLE & faces, - PointIndex pi1, PointIndex pi2, bool check_only + PointIndex pi1, PointIndex pi2 ) { PointIndex pi3(PointIndex::INVALID), pi4(PointIndex::INVALID), @@ -1100,7 +1100,6 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, // (*mycout) << "3->2 " << flush; // (*testout) << "3->2 conversion" << endl; do_swap = true; - if(check_only) return do_swap; /* @@ -1329,7 +1328,6 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, { // (*mycout) << "4->4 " << flush; do_swap = true; - if(check_only) return do_swap; // (*testout) << "4->4 conversion" << "\n"; /* (*testout) << "bad1 = " << bad1 @@ -1592,7 +1590,6 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, { // (*mycout) << nsuround << "->" << 2 * (nsuround-2) << " " << flush; do_swap = true; - if(check_only) return do_swap; for (int k = bestl+1; k <= nsuround + bestl - 2; k++) { @@ -1656,8 +1653,6 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal, int np = mesh.GetNP(); int ne = mesh.GetNE(); - mesh.BoundaryEdge (1,2); // ensure the boundary-elements table is built - // contains at least all elements at node TABLE elementsonnode(np); @@ -1669,6 +1664,8 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal, const char * savetask = multithread.task; multithread.task = "Swap Improve"; + // mesh.CalcSurfacesOfNode (); + INDEX_3_HASHTABLE faces(mesh.GetNOpenElements()/3 + 2); if (goal == OPT_CONFORM) { @@ -1696,52 +1693,42 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal, Array> edges; BuildEdgeList(mesh, elementsonnode, edges); - Array candidate_edges(edges.Size()); - std::atomic improvement_counter(0); - tloop.Start(); - ParallelForRange(Range(edges), [&] (auto myrange) - { - for(auto i : myrange) - { - if (multithread.terminate) - break; - - auto [pi0, pi1] = edges[i]; - if(SwapImproveEdge (mesh, goal, working_elements, elementsonnode, faces, pi0, pi1, true)) - candidate_edges[improvement_counter++] = i; - } - }); - // Sequential version: - /* - for(auto i : edges.Range()) + for (auto [pi1, pi2] : edges) { if (multithread.terminate) break; - - auto [pi0, pi1] = edges[i]; - if(SwapImproveEdge (mesh, goal, working_elements, elementsonnode, faces, pi0, pi1, true)) - candidate_edges[improvement_counter++] = i; + cnt += SwapImproveEdge (mesh, goal, working_elements, elementsonnode, faces, pi1, pi2); } - */ - - auto edges_with_improvement = candidate_edges.Part(0, improvement_counter.load()); - QuickSort(edges_with_improvement); - - for(auto ei : edges_with_improvement) - { - auto [pi0,pi1] = edges[ei]; - if(SwapImproveEdge (mesh, goal, working_elements, elementsonnode, faces, pi0, pi1, false)) - cnt++; - } - tloop.Stop(); PrintMessage (5, cnt, " swaps performed"); + + + + mesh.Compress (); + /* + if (goal == OPT_QUALITY) + { + bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements()); + // (*testout) << "Total badness = " << bad1 << endl; + } + */ + + /* + for (i = 1; i <= GetNE(); i++) + if (volelements.Get(i)[0]) + if (!mesh.LegalTet (volelements.Get(i))) + { + cout << "detected illegal tet, 2" << endl; + (*testout) << "detected illegal tet1: " << i << endl; + } + */ + multithread.task = savetask; } diff --git a/libsrc/meshing/improve3.hpp b/libsrc/meshing/improve3.hpp index 36500d00..798db3d8 100644 --- a/libsrc/meshing/improve3.hpp +++ b/libsrc/meshing/improve3.hpp @@ -27,7 +27,7 @@ public: void SplitImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); - bool SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, const NgBitArray * working_elements, TABLE & elementsonnode, INDEX_3_HASHTABLE & faces, PointIndex pi1, PointIndex pi2, bool check_only=false); + bool SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, const NgBitArray * working_elements, TABLE & elementsonnode, INDEX_3_HASHTABLE & faces, PointIndex pi1, PointIndex pi2); void SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY, const NgBitArray * working_elements = NULL); void SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY, From 5724b397d115086a59f540f3576ad59b45f94193 Mon Sep 17 00:00:00 2001 From: Matthias Hochsteger Date: Fri, 20 Sep 2019 12:47:34 +0200 Subject: [PATCH 6/8] Revert "Separate function SwapImproveEdge(), iterate over list of edges instead of elements and edges per element" This reverts commit c22f44617bec695965a024f8e63c76a0b3a87a2d. --- libsrc/meshing/improve3.cpp | 238 +++++++++++++++++++++--------------- libsrc/meshing/improve3.hpp | 2 - 2 files changed, 137 insertions(+), 103 deletions(-) diff --git a/libsrc/meshing/improve3.cpp b/libsrc/meshing/improve3.cpp index d9ff8c61..019d8812 100644 --- a/libsrc/meshing/improve3.cpp +++ b/libsrc/meshing/improve3.cpp @@ -893,29 +893,127 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh, -bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, - const NgBitArray * working_elements, - TABLE & elementsonnode, - INDEX_3_HASHTABLE & faces, - PointIndex pi1, PointIndex pi2 - ) + + +void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal, + const NgBitArray * working_elements) { + static Timer t("MeshOptimize3d::SwapImprove"); RegionTimer reg(t); + static Timer tloop("MeshOptimize3d::SwapImprove loop"); + PointIndex pi3(PointIndex::INVALID), pi4(PointIndex::INVALID), pi5(PointIndex::INVALID), pi6(PointIndex::INVALID); - - double bad1, bad2, bad3; + int cnt = 0; Element el21(TET), el22(TET), el31(TET), el32(TET), el33(TET); Element el1(TET), el2(TET), el3(TET), el4(TET); Element el1b(TET), el2b(TET), el3b(TET), el4b(TET); - ArrayMem hasbothpoints; + + double bad1, bad2, bad3; + + int np = mesh.GetNP(); + int ne = mesh.GetNE(); + + // contains at least all elements at node + TABLE elementsonnode(np); + + NgArray hasbothpoints; + + PrintMessage (3, "SwapImprove "); + (*testout) << "\n" << "Start SwapImprove" << endl; + + const char * savetask = multithread.task; + multithread.task = "Swap Improve"; + + // mesh.CalcSurfacesOfNode (); + + INDEX_3_HASHTABLE faces(mesh.GetNOpenElements()/3 + 2); + if (goal == OPT_CONFORM) + { + for (int i = 1; i <= mesh.GetNOpenElements(); i++) + { + const Element2d & hel = mesh.OpenElement(i); + INDEX_3 face(hel[0], hel[1], hel[2]); + face.Sort(); + faces.Set (face, 1); + } + } + + // Calculate total badness + if (goal == OPT_QUALITY) + { + bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements()); + (*testout) << "Total badness = " << bad1 << endl; + } + + // find elements on node + for (ElementIndex ei = 0; ei < ne; ei++) + for (PointIndex pi : mesh[ei].PNums()) + elementsonnode.Add (pi, ei); + /* + for (int j = 0; j < mesh[ei].GetNP(); j++) + elementsonnode.Add (mesh[ei][j], ei); + */ + + + // INDEX_2_HASHTABLE edgeused(2 * ne + 5); + INDEX_2_CLOSED_HASHTABLE edgeused(12 * ne + 5); + + tloop.Start(); + for (ElementIndex ei = 0; ei < ne; ei++) + { + if (multithread.terminate) + break; + + if (mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(ei).GetIndex()) + continue; + + multithread.percent = 100.0 * (ei+1) / ne; + + if ((mesh.ElementType(ei)) == FIXEDELEMENT) + continue; + + if(working_elements && + ei < working_elements->Size() && + !working_elements->Test(ei)) + continue; + + if (mesh[ei].IsDeleted()) + continue; + + if ((goal == OPT_LEGAL) && + mesh.LegalTet (mesh[ei]) && + CalcBad (mesh.Points(), mesh[ei], 0) < 1e3) + continue; + + // int onlybedges = 1; + + for (int j = 0; j < 6; j++) + { + // loop over edges + + const Element & elemi = mesh[ei]; + if (elemi.IsDeleted()) continue; + + int mattyp = elemi.GetIndex(); + + static const int tetedges[6][2] = + { { 0, 1 }, { 0, 2 }, { 0, 3 }, + { 1, 2 }, { 1, 3 }, { 2, 3 } }; + + PointIndex pi1 = elemi[tetedges[j][0]]; + PointIndex pi2 = elemi[tetedges[j][1]]; - bool do_swap = false; if (pi2 < pi1) Swap (pi1, pi2); - if (mesh.BoundaryEdge (pi1, pi2)) return false; + if (mesh.BoundaryEdge (pi1, pi2)) continue; + INDEX_2 i2 (pi1, pi2); + i2.Sort(); + if (edgeused.Used(i2)) continue; + edgeused.Set (i2, 1); + hasbothpoints.SetSize (0); for (int k = 0; k < elementsonnode[pi1].Size(); k++) { @@ -923,7 +1021,7 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, ElementIndex elnr = elementsonnode[pi1][k]; const Element & elem = mesh[elnr]; - if (elem.IsDeleted()) return false; + if (elem.IsDeleted()) continue; for (int l = 0; l < elem.GetNP(); l++) { @@ -943,34 +1041,14 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, } } + bool puretet = true; for (ElementIndex ei : hasbothpoints) - { - if (mesh[ei].GetType () != TET) - return false; - - if (mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(ei).GetIndex()) - return false; - - - if ((mesh.ElementType(ei)) == FIXEDELEMENT) - return false; - - if(working_elements && - ei < working_elements->Size() && - !working_elements->Test(ei)) - return false; - - if (mesh[ei].IsDeleted()) - return false; - - if ((goal == OPT_LEGAL) && - mesh.LegalTet (mesh[ei]) && - CalcBad (mesh.Points(), mesh[ei], 0) < 1e3) - return false; - } + if (mesh[ei].GetType () != TET) + puretet = false; + + if (!puretet) continue; int nsuround = hasbothpoints.Size(); - int mattyp = mesh[hasbothpoints[0]].GetIndex(); if ( nsuround == 3 ) { @@ -1099,7 +1177,7 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, { // (*mycout) << "3->2 " << flush; // (*testout) << "3->2 conversion" << endl; - do_swap = true; + cnt++; /* @@ -1327,7 +1405,7 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, if (swap2 || swap3) { // (*mycout) << "4->4 " << flush; - do_swap = true; + cnt++; // (*testout) << "4->4 conversion" << "\n"; /* (*testout) << "bad1 = " << bad1 @@ -1589,7 +1667,7 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, if (bestl != -1) { // (*mycout) << nsuround << "->" << 2 * (nsuround-2) << " " << flush; - do_swap = true; + cnt++; for (int k = bestl+1; k <= nsuround + bestl - 2; k++) { @@ -1639,70 +1717,28 @@ bool MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, } } } - return do_swap; -} - -void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal, - const NgBitArray * working_elements) -{ - static Timer t("MeshOptimize3d::SwapImprove"); RegionTimer reg(t); - static Timer tloop("MeshOptimize3d::SwapImprove loop"); - - int cnt = 0; - - int np = mesh.GetNP(); - int ne = mesh.GetNE(); - - // contains at least all elements at node - TABLE elementsonnode(np); - - NgArray hasbothpoints; - - PrintMessage (3, "SwapImprove "); - (*testout) << "\n" << "Start SwapImprove" << endl; - - const char * savetask = multithread.task; - multithread.task = "Swap Improve"; - - // mesh.CalcSurfacesOfNode (); - - INDEX_3_HASHTABLE faces(mesh.GetNOpenElements()/3 + 2); - if (goal == OPT_CONFORM) - { - for (int i = 1; i <= mesh.GetNOpenElements(); i++) - { - const Element2d & hel = mesh.OpenElement(i); - INDEX_3 face(hel[0], hel[1], hel[2]); - face.Sort(); - faces.Set (face, 1); } + + /* + if (onlybedges) + { + (*testout) << "bad tet: " + << volelements.Get(i)[0] + << volelements.Get(i)[1] + << volelements.Get(i)[2] + << volelements.Get(i)[3] << "\n"; + + if (!mesh.LegalTet (volelements.Get(i))) + cerr << "Illegal tet" << "\n"; + } + */ } - - // Calculate total badness - if (goal == OPT_QUALITY) - { - double bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements()); - (*testout) << "Total badness = " << bad1 << endl; - } - - // find elements on node - for (ElementIndex ei = 0; ei < ne; ei++) - for (PointIndex pi : mesh[ei].PNums()) - elementsonnode.Add (pi, ei); - - Array> edges; - BuildEdgeList(mesh, elementsonnode, edges); - - tloop.Start(); - - for (auto [pi1, pi2] : edges) - { - if (multithread.terminate) - break; - cnt += SwapImproveEdge (mesh, goal, working_elements, elementsonnode, faces, pi1, pi2); - } + // (*mycout) << endl; tloop.Stop(); - + /* + cout << "edgeused: "; + edgeused.PrintMemInfo(cout); + */ PrintMessage (5, cnt, " swaps performed"); diff --git a/libsrc/meshing/improve3.hpp b/libsrc/meshing/improve3.hpp index 798db3d8..9c4934fc 100644 --- a/libsrc/meshing/improve3.hpp +++ b/libsrc/meshing/improve3.hpp @@ -26,8 +26,6 @@ public: void CombineImproveSequential (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); void SplitImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); - - bool SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, const NgBitArray * working_elements, TABLE & elementsonnode, INDEX_3_HASHTABLE & faces, PointIndex pi1, PointIndex pi2); void SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY, const NgBitArray * working_elements = NULL); void SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY, From 3f255d91391ca47aa800aa973e4c3a340db40eeb Mon Sep 17 00:00:00 2001 From: Christopher Lackner Date: Fri, 20 Sep 2019 13:08:15 +0200 Subject: [PATCH 7/8] fix set stl tolerance from gui --- ng/dialog.tcl | 12 ++++++------ ng/onetcl.cpp | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ng/dialog.tcl b/ng/dialog.tcl index 8faac639..f081959c 100644 --- a/ng/dialog.tcl +++ b/ng/dialog.tcl @@ -2228,7 +2228,7 @@ proc stloptionsdialog { } { } proc stldoctordialog { } { - Ng_STLDoctor 0 0 + Ng_STLDoctor set wd .stldoctor_dlg if {[winfo exists .stldoctor_dlg] == 1} { @@ -2642,17 +2642,17 @@ proc stldoctordialog { } { #tixControl $f.gtol -label "load-geometry tolerance factor" -integer false \ - -variable stldoctor.geom_tol_fact \ - -options { + # -variable stldoctor.geom_tol_fact \ + # -options { # entry.width 8 # label.width 30 # label.anchor e #} - ttk::spinbox $f.gtol -from 1 -to 20 -textvariable stldoctor.geom_tol_fact -width 8 - pack $f.gtol + ttk::label $f.gtol_lbl -text "LoadSTL tolerance factor" + ttk::spinbox $f.gtol -from 1e-15 -to 0.001 -textvariable stldoctor.geom_tol_fact -width 8 + pack $f.gtol_lbl $f.gtol ttk::button $f.adap -text "Apply" -command { - .stldoctor_dlg.nb.advanced.gtol invoke Ng_STLDoctor; } pack $f.adap -expand yes diff --git a/ng/onetcl.cpp b/ng/onetcl.cpp index e61239bb..9841677b 100644 --- a/ng/onetcl.cpp +++ b/ng/onetcl.cpp @@ -2804,7 +2804,7 @@ const char * ngscript[] = {"" ,"}\n" ,"}\n" ,"proc stldoctordialog { } {\n" -,"Ng_STLDoctor 0 0\n" +,"Ng_STLDoctor\n" ,"set wd .stldoctor_dlg\n" ,"if {[winfo exists .stldoctor_dlg] == 1} {\n" ,"wm withdraw $wd\n" @@ -3055,10 +3055,10 @@ const char * ngscript[] = {"" ,"-variable stldoctor.conecheck \\\n" ,"-command {Ng_STLDoctor;}\n" ,"pack $f.sc.bu $f.sc.bu2\n" -,"ttk::spinbox $f.gtol -from 1 -to 20 -textvariable stldoctor.geom_tol_fact -width 8\n" -,"pack $f.gtol\n" +,"ttk::label $f.gtol_lbl -text \"LoadSTL tolerance factor\"\n" +,"ttk::spinbox $f.gtol -from 1e-15 -to 0.001 -textvariable stldoctor.geom_tol_fact -width 8\n" +,"pack $f.gtol_lbl $f.gtol\n" ,"ttk::button $f.adap -text \"Apply\" -command {\n" -,".stldoctor_dlg.nb.advanced.gtol invoke\n" ,"Ng_STLDoctor;\n" ,"}\n" ,"pack $f.adap -expand yes\n" From 681628bd40b0ec4a50b64fe0f61f06edd079b9bb Mon Sep 17 00:00:00 2001 From: Christopher Lackner Date: Fri, 20 Sep 2019 13:45:23 +0200 Subject: [PATCH 8/8] remove unnecessary line --- libsrc/interface/readuser.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libsrc/interface/readuser.cpp b/libsrc/interface/readuser.cpp index f4311185..2b5ce21c 100644 --- a/libsrc/interface/readuser.cpp +++ b/libsrc/interface/readuser.cpp @@ -666,7 +666,6 @@ namespace netgen for (auto ti : IntRange(geom->GetNT())) { - auto & trig = geom->GetTriangle(ti); Element2d el(TRIG); for (auto i : IntRange(3)) el[i] = (*geom)[STLTrigIndex(ti)][i];