diff --git a/libsrc/csg/genmesh.cpp b/libsrc/csg/genmesh.cpp index b00ecc34..3bc1c440 100644 --- a/libsrc/csg/genmesh.cpp +++ b/libsrc/csg/genmesh.cpp @@ -504,6 +504,8 @@ namespace netgen for (SurfaceElementIndex sei = oldnf; sei < mesh.GetNSE(); sei++) mesh[sei].SetIndex (k); + auto n_illegal_trigs = mesh.FindIllegalTrigs(); + PrintMessage (3, n_illegal_trigs, " illegal triangles"); // mesh.CalcSurfacesOfNode(); diff --git a/libsrc/meshing/meshclass.cpp b/libsrc/meshing/meshclass.cpp index dd89e962..23157576 100644 --- a/libsrc/meshing/meshclass.cpp +++ b/libsrc/meshing/meshclass.cpp @@ -3689,31 +3689,51 @@ namespace netgen return 0; } + int Mesh :: FindIllegalTrigs () + { + // Temporary table to store the vertex numbers of all triangles + INDEX_3_CLOSED_HASHTABLE temp_tab(3*GetNSE() + 1); + size_t cnt = 0; + for (SurfaceElementIndex sei = 0; sei < GetNSE(); sei++) + { + const Element2d & sel = surfelements[sei]; + if (sel.IsDeleted()) continue; + + INDEX_3 i3(sel[0], sel[1], sel[2]); + i3.Sort(); + if(temp_tab.Used(i3)) + { + temp_tab.Set (i3, -1); + cnt++; + } + else + { + temp_tab.Set (i3, sei); + } + } + + illegal_trigs = make_unique> (2*cnt+1); + for (SurfaceElementIndex sei = 0; sei < GetNSE(); sei++) + { + const Element2d & sel = surfelements[sei]; + if (sel.IsDeleted()) continue; + + INDEX_3 i3(sel[0], sel[1], sel[2]); + i3.Sort(); + if(temp_tab.Get(i3)==-1) + illegal_trigs -> Set (i3, 1); + } + return cnt; + } bool Mesh :: LegalTrig (const Element2d & el) const { // Search for surface trigs with same vertices ( may happen for instance with close surfaces in stl geometies ) if(!illegal_trigs) - { - auto & tab = const_cast(illegal_trigs); - tab = make_unique> (3*GetNSE() + 1); - for (SurfaceElementIndex sei = 0; sei < GetNSE(); sei++) - { - const Element2d & sel = surfelements[sei]; - if (sel.IsDeleted()) continue; - - INDEX_3 i3(sel[0], sel[1], sel[2]); - i3.Sort(); - if(tab->Used(i3) && tab->Get(i3)!=sei) - tab -> Set (i3, -1); - else - tab -> Set (i3, sei); - } - - } + throw Exception("In Mesh::LegalTrig() - illegal_trigs table not built"); INDEX_3 i3 (el[0], el[1], el[2]); i3.Sort(); - if(illegal_trigs->Used(i3) && illegal_trigs->Get(i3)==-1) + if(illegal_trigs->Used(i3)) return false; return 1; diff --git a/libsrc/meshing/meshclass.hpp b/libsrc/meshing/meshclass.hpp index d310df67..2e548f28 100644 --- a/libsrc/meshing/meshclass.hpp +++ b/libsrc/meshing/meshclass.hpp @@ -571,6 +571,10 @@ namespace netgen /// + // Find trigs with same vertices + // return: number of illegal trigs + int FindIllegalTrigs (); + bool LegalTrig (const Element2d & el) const; /** if values non-null, return values in 4-double array: diff --git a/libsrc/occ/occgenmesh.cpp b/libsrc/occ/occgenmesh.cpp index 414b52f6..78c72cb2 100644 --- a/libsrc/occ/occgenmesh.cpp +++ b/libsrc/occ/occgenmesh.cpp @@ -862,6 +862,9 @@ namespace netgen for (SurfaceElementIndex sei = oldnf; sei < mesh.GetNSE(); sei++) mesh[sei].SetIndex (k); + + auto n_illegal_trigs = mesh.FindIllegalTrigs(); + PrintMessage (3, n_illegal_trigs, " illegal triangles"); } // ofstream problemfile("occmesh.rep"); diff --git a/libsrc/stlgeom/meshstlsurface.cpp b/libsrc/stlgeom/meshstlsurface.cpp index 4eadc1e0..87ab7f39 100644 --- a/libsrc/stlgeom/meshstlsurface.cpp +++ b/libsrc/stlgeom/meshstlsurface.cpp @@ -279,6 +279,9 @@ int STLSurfaceMeshing (STLGeometry & geom, class Mesh & mesh, const MeshingParam mesh.FindOpenSegments(); nopen = mesh.GetNOpenSegments(); + auto n_illegal_trigs = mesh.FindIllegalTrigs(); + PrintMessage (3, n_illegal_trigs, " illegal triangles"); + if (nopen) { geom.ClearMarkedSegs();