diff --git a/libsrc/meshing/meshing2.cpp b/libsrc/meshing/meshing2.cpp index 7780b545..a696e608 100644 --- a/libsrc/meshing/meshing2.cpp +++ b/libsrc/meshing/meshing2.cpp @@ -759,6 +759,7 @@ namespace netgen { for (int i = 1; i <= chartboundpoints.Size(); i++) { + pindex.Append(-1); plainpoints.Append (chartboundpoints.Get(i)); locpoints.Append (chartboundpoints3d.Get(i)); legalpoints.Append (0); @@ -1986,6 +1987,20 @@ namespace netgen namespace netgen { void glrender (int wait) - { ; } + { ; + /* + if (multithread.drawing) + { + // vssurfacemeshing.Render(); + // Render (); + + if (wait || multithread.testmode) + { + multithread.pause = 1; + } + while (multithread.pause); + } + */ + } } #endif diff --git a/libsrc/meshing/meshtype.hpp b/libsrc/meshing/meshtype.hpp index 0d22722d..11c4d8f5 100644 --- a/libsrc/meshing/meshtype.hpp +++ b/libsrc/meshing/meshtype.hpp @@ -175,7 +175,7 @@ namespace netgen constexpr operator int () const { return i; } PointIndex operator++ (int) { PointIndex hi(*this); i++; return hi; } PointIndex operator-- (int) { PointIndex hi(*this); i--; return hi; } - PointIndex operator++ () { i++; return *this; } + PointIndex & operator++ () { i++; return *this; } PointIndex operator-- () { i--; return *this; } void Invalidate() { i = PointIndex::BASE-1; } bool IsValid() const { return i != PointIndex::BASE-1; } diff --git a/libsrc/stlgeom/stlgeom.cpp b/libsrc/stlgeom/stlgeom.cpp index 253ff02f..68a6225f 100644 --- a/libsrc/stlgeom/stlgeom.cpp +++ b/libsrc/stlgeom/stlgeom.cpp @@ -64,7 +64,7 @@ void STLMeshing (STLGeometry & geom, STLGeometry :: ~STLGeometry() { - for (auto p : atlas) delete p; + // for (auto p : atlas) delete p; delete edgedata; delete ref; } @@ -1389,7 +1389,7 @@ void STLGeometry :: DestroyDirtyTrigs() { for (k = i+1; k <= GetNT(); k++) { - trias.Elem(k-1) = trias.Get(k); + trias[k-1] = trias[k]; // readtrias: not longer permanent, JS // readtrias.Elem(k-1) = readtrias.Get(k); } @@ -1495,8 +1495,8 @@ void STLGeometry :: PrintSelectInfo() //int p = GetTriangle(trig).PNum(GetNodeOfSelTrig()); PrintMessage(1,"touch triangle ", GetSelectTrig() - , ", local node ", GetNodeOfSelTrig() - , " (=", GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig()), ")"); + , ", local node ", GetNodeOfSelTrig() + , " (=", int(GetTriangle(GetSelectTrig()).PNum(GetNodeOfSelTrig())), ")"); if (AtlasMade() && GetSelectTrig() >= 1 && GetSelectTrig() <= GetNT()) { PrintMessage(1," chartnum=",GetChartNr(GetSelectTrig())); @@ -1533,11 +1533,11 @@ void STLGeometry :: ShowSelectedTrigCoords() if (st >= 1 && st <= GetNT()) { PrintMessage(1, "coordinates of selected trig ", st, ":"); - PrintMessage(1, " p1 = ", GetTriangle(st).PNum(1), " = ", + PrintMessage(1, " p1 = ", int(GetTriangle(st).PNum(1)), " = ", Point3d (GetPoint(GetTriangle(st).PNum(1)))); - PrintMessage(1, " p2 = ", GetTriangle(st).PNum(2), " = ", + PrintMessage(1, " p2 = ", int(GetTriangle(st).PNum(2)), " = ", Point3d (GetPoint(GetTriangle(st).PNum(2)))); - PrintMessage(1, " p3 = ", GetTriangle(st).PNum(3), " = ", + PrintMessage(1, " p3 = ", int(GetTriangle(st).PNum(3)), " = ", Point3d (GetPoint(GetTriangle(st).PNum(3)))); } } @@ -3111,10 +3111,10 @@ void STLGeometry :: BuildSmoothEdges () -int STLGeometry :: IsSmoothEdge (int pi1, int pi2) const +bool STLGeometry :: IsSmoothEdge (int pi1, int pi2) const { if (!smoothedges) - return 0; + return false; INDEX_2 i2(pi1, pi2); i2.Sort(); return smoothedges->Used (i2); @@ -3138,7 +3138,7 @@ int IsInArray(int n, const NgArray& ia) void STLGeometry :: AddConeAndSpiralEdges(const STLParameters& stlparam) { PrintMessage(5,"have now ", GetNE(), " edges with yellow angle = ", stlparam.yangle, " degree"); - + PrintFnStart("AddConeAndSpiralEdges"); int i,j,k,n; diff --git a/libsrc/stlgeom/stlgeom.hpp b/libsrc/stlgeom/stlgeom.hpp index 7f31c151..0302a007 100644 --- a/libsrc/stlgeom/stlgeom.hpp +++ b/libsrc/stlgeom/stlgeom.hpp @@ -23,6 +23,11 @@ #include +#include "stltopology.hpp" +#include "stltool.hpp" +#include "stlline.hpp" + + namespace netgen { @@ -44,10 +49,6 @@ namespace netgen -#include "stltopology.hpp" -#include "stltool.hpp" -#include "stlline.hpp" - @@ -138,9 +139,9 @@ namespace netgen //spiralpoints: NgArray spiralpoints; // - NgArray atlas; + Array, ChartId> atlas; //marks all already charted trigs with chartnumber - NgArray chartmark; + NgArray chartmark; //outerchartspertrig, ascending sorted TABLE outerchartspertrig; @@ -367,8 +368,8 @@ namespace netgen void AddConeAndSpiralEdges(const STLParameters& stlparam); void AddFaceEdges(); //each face should have at least one starting edge (outherwise it won't be meshed) - void GetDirtyChartTrigs(int chartnum, STLChart& chart, const NgArray& outercharttrigs, - NgArray& chartpointchecked, NgArray& dirtytrigs); + void GetDirtyChartTrigs(int chartnum, STLChart& chart, const NgArray& outercharttrigs, + NgArray& chartpointchecked, NgArray& dirtytrigs); void ClearSpiralPoints(); void SetSpiralPoint(int pn) {spiralpoints.Elem(pn) = 1;}; @@ -378,7 +379,7 @@ namespace netgen // smooth edges: sharp geometric edges not declared as edges void BuildSmoothEdges (); - int IsSmoothEdge (int pi1, int pi2) const; + bool IsSmoothEdge (int pi1, int pi2) const; //make charts with regions of a max. angle @@ -394,16 +395,16 @@ namespace netgen //get chart number of a trig or 0 if unmarked int GetChartNr(int i) const; - int GetMarker(int i) const + ChartId GetMarker(int i) const { return chartmark.Get(i); } - void SetMarker(int nr, int m); - int GetNOCharts() const; + void SetMarker(int nr, ChartId m); + int GetNOCharts() const { return atlas.Size(); } //get a chart from atlas - const STLChart& GetChart(int nr) const; - STLChart& GetChart(int nr) {return *(atlas.Get(nr));}; + const STLChart& GetChart(ChartId nr) const { return *atlas[nr];}; + STLChart & GetChart(ChartId nr) { return *atlas[nr];}; int AtlasMade() const; - void GetInnerChartLimes(NgArray& limes, int chartnum); + void GetInnerChartLimes(NgArray& limes, ChartId chartnum); //FOR MESHING int GetMeshChartNr () { return meshchart; } @@ -452,7 +453,7 @@ namespace netgen DLL_HEADER void RestrictLocalH(class Mesh & mesh, double gh, const STLParameters& stlparam); void RestrictLocalHCurv(class Mesh & mesh, double gh, const STLParameters& stlparam); - void RestrictHChartDistOneChart(int chartnum, NgArray& acttrigs, class Mesh & mesh, + void RestrictHChartDistOneChart(ChartId chartnum, NgArray& acttrigs, class Mesh & mesh, double gh, double fact, double minh, const STLParameters& stlparam); friend class MeshingSTLSurface; diff --git a/libsrc/stlgeom/stlgeomchart.cpp b/libsrc/stlgeom/stlgeomchart.cpp index b913ebde..bd67ebf0 100644 --- a/libsrc/stlgeom/stlgeomchart.cpp +++ b/libsrc/stlgeom/stlgeomchart.cpp @@ -69,10 +69,10 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons double sinchartangle = sin(chartangle); double sinouterchartangle = sin(outerchartangle); - NgArray outermark(GetNT()); //marks all trigs form actual outer region - NgArray outertested(GetNT()); //marks tested trigs for outer region - NgArray pointstochart(GetNP()); //point in chart becomes chartnum - NgArray innerpointstochart(GetNP()); //point in chart becomes chartnum + NgArray outermark(GetNT()); //marks all trigs form actual outer region + NgArray outertested(GetNT()); //marks tested trigs for outer region + NgArray pointstochart(GetNP()); //point in chart becomes chartnum + NgArray innerpointstochart(GetNP()); //point in chart becomes chartnum NgArray chartpoints; //point in chart becomes chartnum NgArray innerchartpoints; NgArray> innerchartpts; @@ -86,38 +86,32 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons //int chartboundarydivisions = 10; markedsegs.SetSize(0); //for testing!!! - NgArray chartpointchecked(GetNP()); //for dirty-chart-trigs + NgArray chartpointchecked(GetNP()); //for dirty-chart-trigs - pointstochart.SetSize(GetNP()); - innerpointstochart.SetSize(GetNP()); chartmark.SetSize(GetNT()); - for (int i = 1; i <= GetNP(); i++) - { - innerpointstochart.Elem(i) = 0; - pointstochart.Elem(i) = 0; - chartpointchecked.Elem(i) = 0; - } + innerpointstochart = ChartId::INVALID; + pointstochart = ChartId::INVALID; + chartpointchecked = ChartId::INVALID; double eps = 1e-12 * Dist (boundingbox.PMin(), boundingbox.PMax()); int spiralcheckon = stldoctor.spiralcheck; if (!spiralcheckon) {PrintWarning("++++++++++++\nspiral deactivated by user!!!!\n+++++++++++++++"); } - chartmark = 0; - outermark = 0; - outertested = 0; + chartmark = ChartId::INVALID; + outermark = ChartId::INVALID; + outertested = ChartId::INVALID; double atlasarea = Area(); double workedarea = 0; double showinc = 100.*5000./(double)GetNT(); double nextshow = 0; - // Point<3> startp; int lastunmarked = 1; PrintMessage(5,"one dot per 5000 triangles: "); - int markedtrigcnt = 0; + size_t markedtrigcnt = 0; while (markedtrigcnt < GetNT()) { if (multithread.terminate) { PopStatus(); return; } @@ -128,11 +122,9 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons SetThreadPercent(100.0 * workedarea / atlasarea); - STLChart * chart = new STLChart(this, stlparam); - atlas.Append(chart); - - // *testout << "Chart " << atlas.Size() << endl; - + atlas.Append (make_unique (this, stlparam)); + STLChart & chart = *atlas.Last(); + //find unmarked trig int prelastunmarked = lastunmarked; @@ -149,29 +141,29 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons innerchartpoints.SetSize(0); innerchartpts.SetSize(0); chartbound.Clear(); - chartbound.SetChart(chart); + chartbound.SetChart(&chart); chartbound.BuildSearchTree(); // different !!! - if (!found) { PrintSysError("Make Atlas, no starttrig found"); return; } + if (!found) { throw Exception("Make Atlas, no starttrig found"); } //find surrounding trigs // int starttrig = j; int starttrig = lastunmarked; - Point<3> startp = GetPoint(GetTriangle(starttrig).PNum(1)); + Point<3> startp = GetPoint(GetTriangle(starttrig)[0]); - int accepted; - int chartnum = GetNOCharts(); + bool accepted; + ChartId chartnum = GetNOCharts(); Vec<3> sn = GetTriangle(starttrig).Normal(); - chart->SetNormal (startp, sn); + chart.SetNormal (startp, sn); // *testout << "first trig " << starttrig << ", n = " << sn << endl; SetMarker(starttrig, chartnum); markedtrigcnt++; - chart->AddChartTrig(starttrig); + chart.AddChartTrig(starttrig); chartbound.AddTriangle(GetTriangle(starttrig)); workedarea += GetTriangle(starttrig).Area(points); @@ -195,11 +187,11 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons { changed = false; oldstartic2 = oldstartic; - oldstartic = chart->GetNT(); + oldstartic = chart.GetNT(); // for (ic = oldstartic2; ic <= chart->GetNT(); ic++) for (int ic = oldstartic2; ic <= oldstartic; ic++) { - int i = chart->GetTrig(ic); + int i = chart.GetTrig(ic); if (GetMarker(i) == chartnum) { for (int j = 1; j <= NONeighbourTrigs(i); j++) @@ -215,7 +207,7 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons if ( (n2 * sn) >= coschartangle ) { // *testout << "good angle " << endl; - accepted = 1; + accepted = true; /* //alter spiralentest, schnell, aber ungenau for (k = 1; k <= 3; k++) @@ -261,7 +253,7 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons Vec<3> n3 = GetTriangle(nnt).Normal(); if ( (n3 * sn) >= coschartangle && IsSmoothEdge (nnp1, nnp2) ) - accepted = 1; + accepted = true; } if (!accepted) break; @@ -275,7 +267,7 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons changed = true; markedtrigcnt++; workedarea += GetTriangle(nt).Area(points); - chart->AddChartTrig(nt); + chart.AddChartTrig(nt); chartbound.AddTriangle(GetTriangle(nt)); @@ -320,11 +312,11 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons { changed = false; oldstartic2 = oldstartic; - oldstartic = chart->GetNT(); + oldstartic = chart.GetNT(); for (int ic = oldstartic2; ic <= oldstartic; ic++) { - int i = chart->GetTrig(ic); + int i = chart.GetTrig(ic); if (outermark.Get(i) != chartnum) continue; for (int j = 1; j <= NONeighbourTrigs(i); j++) @@ -350,7 +342,7 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons //abfragen, ob noch im tolerierten Winkel if ( (n2 * sn) >= cosouterchartangle ) { - accepted = 1; + accepted = true; // NgProfiler::StartTimer (timer4); bool isdirtytrig = false; @@ -392,7 +384,7 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons Vec<3> n3 = GetTriangle(nnt).Normal(); if ( (n3 * sn) >= cosouterchartangle && IsSmoothEdge (nnp1, nnp2) ) - accepted = 1; + accepted = true; // NgProfiler::StopTimer (timer4e); } // NgProfiler::StopTimer (timer4b); @@ -411,12 +403,12 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons if (accepted) { // NgProfiler::StartTimer (timer5a); - accepted = 0; + accepted = false; for (int k = 1; k <= 3; k++) if (innerpointstochart.Get(ntrig.PNum(k)) == chartnum) { - accepted = 1; + accepted = true; break; } @@ -445,7 +437,7 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons double tdist = Dist2(pt, innerchartpts[l]); if (tdist < 4 * h2) { - accepted = 1; + accepted = true; break; } } @@ -464,7 +456,7 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons if (GetMarker(nt) != chartnum) { chartbound.AddTriangle(GetTriangle(nt)); - chart->AddOuterTrig(nt); + chart.AddOuterTrig(nt); for (int k = 1; k <= 3; k++) { if (pointstochart.Get(GetTriangle(nt).PNum(k)) @@ -486,26 +478,26 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons // NgProfiler::StartTimer (timere); // NgProfiler::StartTimer (timere1); //end of while loop for outer chart - GetDirtyChartTrigs(chartnum, *chart, outermark, chartpointchecked, dirtycharttrigs); + GetDirtyChartTrigs(chartnum, chart, outermark, chartpointchecked, dirtycharttrigs); //dirtycharttrigs are local (chart) point numbers!!!!!!!!!!!!!!!! if (dirtycharttrigs.Size() != 0 && - (dirtycharttrigs.Size() != chart->GetNChartT() || dirtycharttrigs.Size() != 1)) + (dirtycharttrigs.Size() != chart.GetNChartT() || dirtycharttrigs.Size() != 1)) { - if (dirtycharttrigs.Size() == chart->GetNChartT() && dirtycharttrigs.Size() != 1) + if (dirtycharttrigs.Size() == chart.GetNChartT() && dirtycharttrigs.Size() != 1) { //if all trigs would be eliminated -> leave 1 trig! dirtycharttrigs.SetSize(dirtycharttrigs.Size() - 1); } for (int k = 1; k <= dirtycharttrigs.Size(); k++) { - int tn = chart->GetChartTrig(dirtycharttrigs.Get(k)); + int tn = chart.GetChartTrig(dirtycharttrigs.Get(k)); outermark.Elem(tn) = 0; //not necessary, for later use SetMarker(tn, 0); markedtrigcnt--; workedarea -= GetTriangle(tn).Area(points); } - chart->MoveToOuterChart(dirtycharttrigs); + chart.MoveToOuterChart(dirtycharttrigs); lastunmarked = 1; lastunmarked = prelastunmarked; } @@ -537,7 +529,8 @@ void STLGeometry :: MakeAtlas(Mesh & mesh, const MeshingParameters& mparam, cons int cnttrias = 0; outerchartspertrig.SetSize(GetNT()); - for (int i = 1; i <= atlas.Size(); i++) + // for (int i = 1; i <= atlas.Size(); i++) + for (ChartId i : atlas.Range()) { for (int j = 1; j <= GetChart(i).GetNT(); j++) { @@ -633,23 +626,10 @@ int STLGeometry :: GetMarker(int i) const return chartmark.Get(i); } */ -void STLGeometry :: SetMarker(int nr, int m) +void STLGeometry :: SetMarker(int nr, ChartId m) { chartmark.Elem(nr) = m; } -int STLGeometry :: GetNOCharts() const -{ - return atlas.Size(); -} -const STLChart& STLGeometry :: GetChart(int nr) const -{ - if (nr > atlas.Size()) - { - PrintSysError("GetChart(", nr, ") not possible!!!"); - nr = 1; - } - return *(atlas.Get(nr)); -} int STLGeometry :: AtlasMade() const { @@ -671,7 +651,7 @@ int AddIfNotExists(NgArray& list, int x) } */ -void STLGeometry :: GetInnerChartLimes(NgArray& limes, int chartnum) +void STLGeometry :: GetInnerChartLimes(NgArray& limes, ChartId chartnum) { int j, k; @@ -732,8 +712,8 @@ void STLGeometry :: GetInnerChartLimes(NgArray& limes, int chartnum) void STLGeometry :: GetDirtyChartTrigs(int chartnum, STLChart& chart, - const NgArray& outercharttrigs, - NgArray& chartpointchecked, + const NgArray& outercharttrigs, + NgArray& chartpointchecked, NgArray& dirtytrigs) { dirtytrigs.SetSize(0); diff --git a/libsrc/stlgeom/stlgeommesh.cpp b/libsrc/stlgeom/stlgeommesh.cpp index 301799d8..d565f6bd 100644 --- a/libsrc/stlgeom/stlgeommesh.cpp +++ b/libsrc/stlgeom/stlgeommesh.cpp @@ -1116,7 +1116,7 @@ void STLGeometry :: RestrictLocalH(class Mesh & mesh, double gh, const STLParame } } -void STLGeometry :: RestrictHChartDistOneChart(int chartnum, NgArray& acttrigs, +void STLGeometry :: RestrictHChartDistOneChart(ChartId chartnum, NgArray& acttrigs, class Mesh & mesh, double gh, double fact, double minh, const STLParameters& stlparam) { diff --git a/libsrc/stlgeom/stlline.cpp b/libsrc/stlgeom/stlline.cpp index c95dbd43..3b89ed34 100644 --- a/libsrc/stlgeom/stlline.cpp +++ b/libsrc/stlgeom/stlline.cpp @@ -581,59 +581,57 @@ int STLLine :: GetRightTrig(int nr) const return righttrigs.Get(nr); }; -double STLLine :: GetSegLen(const NgArray >& ap, int nr) const +double STLLine :: GetSegLen(const Array,STLPointId>& ap, int nr) const { - return Dist(ap.Get(PNum(nr)),ap.Get(PNum(nr+1))); + return Dist(ap[PNum(nr)],ap[PNum(nr+1)]); } -double STLLine :: GetLength(const NgArray >& ap) const +double STLLine :: GetLength(const Array,STLPointId>& ap) const { double len = 0; for (int i = 2; i <= pts.Size(); i++) - { - len += (ap.Get(pts.Get(i)) - ap.Get(pts.Get(i-1))).Length(); - } + len += (ap[pts.Get(i)] - ap[pts.Get(i-1)]).Length(); return len; } -void STLLine :: GetBoundingBox (const NgArray > & ap, Box<3> & box) const +void STLLine :: GetBoundingBox (const Array,STLPointId> & ap, Box<3> & box) const { - box.Set (ap.Get (pts[0])); + box.Set (ap[pts[0]]); for (int i = 1; i < pts.Size(); i++) - box.Add (ap.Get(pts[i])); + box.Add (ap[pts[i]]); } Point<3> STLLine :: -GetPointInDist(const NgArray >& ap, double dist, int& index) const +GetPointInDist(const Array,STLPointId>& ap, double dist, int& index) const { if (dist <= 0) { index = 1; - return ap.Get(StartP()); + return ap[StartP()]; } double len = 0; int i; for (i = 1; i < pts.Size(); i++) { - double seglen = Dist (ap.Get(pts.Get(i)), - ap.Get(pts.Get(i+1))); + double seglen = Dist (ap[pts.Get(i)], + ap[pts.Get(i+1)]); if (len + seglen > dist) { index = i; double relval = (dist - len) / (seglen + 1e-16); - Vec3d v (ap.Get(pts.Get(i)), ap.Get(pts.Get(i+1))); - return ap.Get(pts.Get(i)) + relval * v; + Vec3d v (ap[pts.Get(i)], ap[pts.Get(i+1)]); + return ap[pts.Get(i)] + relval * v; } len += seglen; } index = pts.Size() - 1; - return ap.Get(EndP()); + return ap[EndP()]; } @@ -644,7 +642,7 @@ double GetH(const Point3d& p, double x) return stlgh;//+0.5)*(x+0.5); } */ -STLLine* STLLine :: Mesh(const NgArray >& ap, +STLLine* STLLine :: Mesh(const Array,STLPointId>& ap, NgArray& mp, double ghi, class Mesh& mesh) const { @@ -720,7 +718,7 @@ STLLine* STLLine :: Mesh(const NgArray >& ap, int j = 1; - p = ap.Get(StartP()); + p = ap[StartP()]; int pn = AddPointIfNotExists(mp, p, 1e-10*diam); int segn = 1; @@ -773,7 +771,7 @@ STLLine* STLLine :: Mesh(const NgArray >& ap, NgProfiler::StartTimer (timer3); - p = ap.Get(EndP()); + p = ap[EndP()]; pn = AddPointIfNotExists(mp, p, 1e-10*diam); segn = GetNS(); line->AddPoint(pn); diff --git a/libsrc/stlgeom/stlline.hpp b/libsrc/stlgeom/stlline.hpp index 547dd44b..c6a06c7b 100644 --- a/libsrc/stlgeom/stlline.hpp +++ b/libsrc/stlgeom/stlline.hpp @@ -9,6 +9,8 @@ /* Date: 20. Nov. 99 */ /**************************************************************************/ +namespace netgen { + class STLGeometry; class STLTopology; @@ -158,11 +160,11 @@ public: int NP() const {return pts.Size();} int GetNS() const; void GetSeg(int nr, int& p1, int& p2) const; - double GetSegLen(const NgArray >& ap, int nr) const; + double GetSegLen(const Array,STLPointId>& ap, int nr) const; int GetLeftTrig(int nr) const; int GetRightTrig(int nr) const; double GetDist(int nr) const { return dists.Get(nr);}; - void GetBoundingBox (const NgArray > & ap, Box<3> & box) const; + void GetBoundingBox (const Array,STLPointId> & ap, Box<3> & box) const; void AddLeftTrig(int nr) {lefttrigs.Append(nr);} void AddRightTrig(int nr) {righttrigs.Append(nr);} @@ -170,14 +172,14 @@ public: int StartP() const {return pts.Get(1);} int EndP() const {return pts.Get(pts.Size());} - double GetLength(const NgArray >& ap) const; + double GetLength(const Array,STLPointId>& ap) const; //suche punkt in entfernung (in linienkoordinaten) dist //in index ist letzter punkt VOR dist (d.h. max pts.Size()-1) - Point<3> GetPointInDist(const NgArray >& ap, double dist, int& index) const; + Point<3> GetPointInDist(const Array,STLPointId>& ap, double dist, int& index) const; //return a meshed polyline - STLLine* Mesh(const NgArray >& ap, + STLLine* Mesh(const Array,STLPointId>& ap, NgArray& mp, double ghi, class Mesh& mesh) const; @@ -185,4 +187,7 @@ public: int ShouldSplit() const {return split;} }; + +} // namespace netgen + #endif diff --git a/libsrc/stlgeom/stltool.cpp b/libsrc/stlgeom/stltool.cpp index 06ab66ac..53bb6a2c 100644 --- a/libsrc/stlgeom/stltool.cpp +++ b/libsrc/stlgeom/stltool.cpp @@ -282,7 +282,7 @@ STLReadTriangle :: STLReadTriangle (const Point<3> * apts, -STLTriangle :: STLTriangle(const int * apts) +STLTriangle :: STLTriangle(const STLPointId * apts) { pts[0] = apts[0]; pts[1] = apts[1]; @@ -349,11 +349,11 @@ int STLTriangle :: GetNeighbourPointsAndOpposite(const STLTriangle& t, int& p1, return 0; } -Vec<3> STLTriangle :: GeomNormal(const NgArray >& ap) const +Vec<3> STLTriangle :: GeomNormal(const Array,STLPointId>& ap) const { - const Point<3> & p1 = ap.Get(PNum(1)); - const Point<3> & p2 = ap.Get(PNum(2)); - const Point<3> & p3 = ap.Get(PNum(3)); + const Point<3> & p1 = ap[PNum(1)]; + const Point<3> & p2 = ap[PNum(2)]; + const Point<3> & p3 = ap[PNum(3)]; return Cross(p2-p1, p3-p1); } @@ -382,13 +382,13 @@ void STLTriangle :: ChangeOrientation() -double STLTriangle :: Area(const NgArray >& ap) const +double STLTriangle :: Area(const Array,STLPointId>& ap) const { - return 0.5 * Cross(ap.Get(PNum(2))-ap.Get(PNum(1)), - ap.Get(PNum(3))-ap.Get(PNum(1))).Length(); + return 0.5 * Cross(ap[PNum(2)]-ap[PNum(1)], + ap[PNum(3)]-ap[PNum(1)]).Length(); } -double STLTriangle :: MinHeight(const NgArray >& ap) const +double STLTriangle :: MinHeight(const Array,STLPointId>& ap) const { double ml = MaxLength(ap); if (ml != 0) {return 2.*Area(ap)/ml;} @@ -396,19 +396,19 @@ double STLTriangle :: MinHeight(const NgArray >& ap) const return 0; } -double STLTriangle :: MaxLength(const NgArray >& ap) const +double STLTriangle :: MaxLength(const Array,STLPointId>& ap) const { - return max3(Dist(ap.Get(PNum(1)),ap.Get(PNum(2))), - Dist(ap.Get(PNum(2)),ap.Get(PNum(3))), - Dist(ap.Get(PNum(3)),ap.Get(PNum(1)))); + return max3(Dist(ap[PNum(1)],ap[PNum(2)]), + Dist(ap[PNum(2)],ap[PNum(3)]), + Dist(ap[PNum(3)],ap[PNum(1)])); } -void STLTriangle :: ProjectInPlain(const NgArray >& ap, +void STLTriangle :: ProjectInPlain(const Array,STLPointId>& ap, const Vec<3> & n, Point<3> & pp) const { - const Point<3> & p1 = ap.Get(PNum(1)); - const Point<3> & p2 = ap.Get(PNum(2)); - const Point<3> & p3 = ap.Get(PNum(3)); + const Point<3> & p1 = ap[PNum(1)]; + const Point<3> & p2 = ap[PNum(2)]; + const Point<3> & p3 = ap[PNum(3)]; Vec<3> v1 = p2 - p1; Vec<3> v2 = p3 - p1; @@ -430,13 +430,13 @@ void STLTriangle :: ProjectInPlain(const NgArray >& ap, } -int STLTriangle :: ProjectInPlain (const NgArray >& ap, +int STLTriangle :: ProjectInPlain (const Array,STLPointId>& ap, const Vec<3> & nproj, Point<3> & pp, Vec<3> & lam) const { - const Point<3> & p1 = ap.Get(PNum(1)); - const Point<3> & p2 = ap.Get(PNum(2)); - const Point<3> & p3 = ap.Get(PNum(3)); + const Point<3> & p1 = ap[PNum(1)]; + const Point<3> & p2 = ap[PNum(2)]; + const Point<3> & p3 = ap[PNum(3)]; Vec<3> v1 = p2-p1; Vec<3> v2 = p3-p1; @@ -468,12 +468,12 @@ int STLTriangle :: ProjectInPlain (const NgArray >& ap, -void STLTriangle :: ProjectInPlain(const NgArray >& ap, +void STLTriangle :: ProjectInPlain(const Array,STLPointId>& ap, Point<3> & pp) const { - const Point<3> & p1 = ap.Get(PNum(1)); - const Point<3> & p2 = ap.Get(PNum(2)); - const Point<3> & p3 = ap.Get(PNum(3)); + const Point<3> & p1 = ap[PNum(1)]; + const Point<3> & p2 = ap[PNum(2)]; + const Point<3> & p3 = ap[PNum(3)]; Vec<3> v1 = p2 - p1; Vec<3> v2 = p3 - p1; @@ -488,12 +488,12 @@ void STLTriangle :: ProjectInPlain(const NgArray >& ap, pp = pp + (nfact) * nt; } -int STLTriangle :: PointInside(const NgArray > & ap, +int STLTriangle :: PointInside(const Array,STLPointId> & ap, const Point<3> & pp) const { - const Point<3> & p1 = ap.Get(PNum(1)); - const Point<3> & p2 = ap.Get(PNum(2)); - const Point<3> & p3 = ap.Get(PNum(3)); + const Point<3> & p1 = ap[PNum(1)]; + const Point<3> & p2 = ap[PNum(2)]; + const Point<3> & p3 = ap[PNum(3)]; Vec<3> v1 = p2 - p1; Vec<3> v2 = p3 - p1; @@ -532,7 +532,7 @@ int STLTriangle :: PointInside(const NgArray > & ap, return 0; } -double STLTriangle :: GetNearestPoint(const NgArray >& ap, +double STLTriangle :: GetNearestPoint(const Array,STLPointId>& ap, Point<3> & p3d) const { Point<3> p = p3d; @@ -548,7 +548,7 @@ double STLTriangle :: GetNearestPoint(const NgArray >& ap, for (int j = 1; j <= 3; j++) { p = p3d; - dist = GetDistFromLine(ap.Get(PNum(j)), ap.Get(PNumMod(j+1)), p); + dist = GetDistFromLine(ap[PNum(j)], ap[PNumMod(j+1)], p); if (dist < nearest) { nearest = dist; @@ -690,15 +690,15 @@ void STLChart :: AddOuterTrig(int i) {searchtree->Insert (pmin, pmax, i);} } -int STLChart :: IsInWholeChart(int nr) const +bool STLChart :: IsInWholeChart(int nr) const { for (int i = 1; i <= charttrigs.Size(); i++) - if (charttrigs.Get(i) == nr) return 1; + if (charttrigs.Get(i) == nr) return true; for (int i = 1; i <= outertrigs.Size(); i++) - if (outertrigs.Get(i) == nr) return 1; + if (outertrigs.Get(i) == nr) return true; - return 0; + return false; } void STLChart :: GetTrianglesInBox (const Point3d & pmin, @@ -1040,8 +1040,8 @@ void STLBoundary ::AddTriangle(const STLTriangle & t) // NgProfiler::StopTimer (timer_new); } -int STLBoundary :: TestSeg(const Point<3>& p1, const Point<3> & p2, const Vec<3> & sn, - double sinchartangle, int divisions, NgArray >& points, double eps) +bool STLBoundary :: TestSeg(const Point<3>& p1, const Point<3> & p2, const Vec<3> & sn, + double sinchartangle, int divisions, Array,STLPointId>& points, double eps) { if (usechartnormal) return TestSegChartNV (p1, p2, sn); @@ -1276,7 +1276,7 @@ void STLBoundary :: DeleteSearchTree() } // checks, whether 2d projection intersects -int STLBoundary :: TestSegChartNV(const Point3d & p1, const Point3d& p2, +bool STLBoundary :: TestSegChartNV(const Point3d & p1, const Point3d& p2, const Vec3d& sn) { // static int timerquick = NgProfiler::CreateTimer ("TestSegChartNV-searchtree"); diff --git a/libsrc/stlgeom/stltool.hpp b/libsrc/stlgeom/stltool.hpp index f03c31dd..6b9c9c3f 100644 --- a/libsrc/stlgeom/stltool.hpp +++ b/libsrc/stlgeom/stltool.hpp @@ -1,7 +1,6 @@ #ifndef FILE_STLTOOL #define FILE_STLTOOL - //#include "gprim/gprim.hh" /**************************************************************************/ @@ -11,7 +10,7 @@ /* Date: 20. Nov. 99 */ /**************************************************************************/ - +namespace netgen { // use one normal vector for whole chart extern int usechartnormal; @@ -40,6 +39,32 @@ typedef NgArray * ArrayINTPTR; class STLGeometry; class STLParameters; +// typedef int ChartId +class ChartId +{ + int i; +public: + class t_invalid { public: constexpr t_invalid() = default; }; + static constexpr t_invalid INVALID{}; + + ChartId() { } + constexpr ChartId(t_invalid inv) : i(0) { ; } + constexpr ChartId(int ai) : i(ai) { } + operator int() const { return i; } + ChartId operator++ (int) { ChartId hi(*this); i++; return hi; } + ChartId & operator++ () { i++; return *this; } +}; +} + +namespace ngcore +{ + template<> + constexpr netgen::ChartId IndexBASE () { return netgen::ChartId(1); } +} + + +namespace netgen { + class STLChart { private: @@ -60,7 +85,7 @@ public: void AddChartTrig(int i); void AddOuterTrig(int i); - int IsInWholeChart(int nr) const; + bool IsInWholeChart(int nr) const; int GetChartTrig(int i) const {return charttrigs.Get(i);} int GetOuterTrig(int i) const {return outertrigs.Get(i);} @@ -118,13 +143,13 @@ class STLBoundarySeg // Point<2> p2dmin, p2dmax; double rad; - int i1, i2; + STLPointId i1, i2; int smoothedge; public: STLBoundarySeg () { ; } - STLBoundarySeg (int ai1, int ai2, const NgArray > & points, + STLBoundarySeg (STLPointId ai1, STLPointId ai2, const Array,STLPointId> & points, const STLChart * chart) - : p1(points.Get(ai1)), p2(points.Get(ai2)), + : p1(points[ai1]), p2(points[ai2]), i1(ai1), i2(ai2) { center = ::netgen::Center (p1, p2); @@ -182,11 +207,11 @@ public: void BuildSearchTree(); void DeleteSearchTree(); - int TestSeg(const Point<3> & p1, const Point<3> & p2, const Vec<3> & sn, - double sinchartangle, int divisions, NgArray >& points, - double eps); - - int TestSegChartNV(const Point3d& p1, const Point3d& p2, const Vec3d& sn); + bool TestSeg(const Point<3> & p1, const Point<3> & p2, const Vec<3> & sn, + double sinchartangle, int divisions, Array,STLPointId>& points, + double eps); + + bool TestSegChartNV(const Point3d& p1, const Point3d& p2, const Vec3d& sn); }; @@ -292,6 +317,6 @@ void STLSurfaceOptimization (STLGeometry & geom, const MeshingParameters & mparam); - +} // namespace netgen #endif diff --git a/libsrc/stlgeom/stltopology.cpp b/libsrc/stlgeom/stltopology.cpp index 62f931b8..bc8ee62d 100644 --- a/libsrc/stlgeom/stltopology.cpp +++ b/libsrc/stlgeom/stltopology.cpp @@ -515,9 +515,9 @@ void STLTopology :: InitSTLGeometry(const NgArray & readtrigs) foundpos = AddPoint(p); pointtree->Insert (p, foundpos); } - if (Dist(p, points.Get(foundpos)) > 1e-10) - cout << "identify close points: " << p << " " << points.Get(foundpos) - << ", dist = " << Dist(p, points.Get(foundpos)) + if (Dist(p, points[foundpos]) > 1e-10) + cout << "identify close points: " << p << " " << points[foundpos] + << ", dist = " << Dist(p, points[foundpos]) << endl; st[k] = foundpos; } @@ -711,14 +711,14 @@ void STLTopology :: FindNeighbourTrigs() - for (STLTrigIndex ti = 0; ti < GetNT(); ti++) + for (STLTrigId ti = 0; ti < GetNT(); ti++) { STLTriangle & trig = trias[ti]; for (int k = 0; k < 3; k++) { - STLPointIndex pi = trig[k] - STLBASE; - STLPointIndex pi2 = trig[(k+1)%3] - STLBASE; - STLPointIndex pi3 = trig[(k+2)%3] - STLBASE; + STLPointId pi = trig[k]; // - STLBASE; + STLPointId pi2 = trig[(k+1)%3]; // - STLBASE; + STLPointId pi3 = trig[(k+2)%3]; // - STLBASE; // vector along edge Vec<3> ve = points[pi2] - points[pi]; @@ -736,24 +736,24 @@ void STLTopology :: FindNeighbourTrigs() for (int j = 0; j < trigsperpoint[pi].Size(); j++) { - STLTrigIndex ti2 = trigsperpoint[pi][j] - STLBASE; + STLTrigId ti2 = trigsperpoint[pi][j]; // - STLBASE; const STLTriangle & trig2 = trias[ti2]; if (ti == ti2) continue; bool hasboth = 0; for (int l = 0; l < 3; l++) - if (trig2[l] - STLBASE == pi2) + if (trig2[l] /* - STLBASE */ == pi2) { hasboth = 1; break; } if (!hasboth) continue; - STLPointIndex pi4(0); + STLPointId pi4(0); for (int l = 0; l < 3; l++) - if (trig2[l] - STLBASE != pi && trig2[l] - STLBASE != pi2) - pi4 = trig2[l] - STLBASE; + if (trig2[l] /* - STLBASE */ != pi && trig2[l] /* - STLBASE */ != pi2) + pi4 = trig2[l] /* - STLBASE */; Vec<3> vt2 = points[pi4] - points[pi]; @@ -763,12 +763,12 @@ void STLTopology :: FindNeighbourTrigs() if (phi < phimin) { phimin = phi; - trig.NBTrig (0, (k+2)%3) = ti2 + STLBASE; + trig.NBTrig (0, (k+2)%3) = ti2; // + STLBASE; } if (phi > phimax) { phimax = phi; - trig.NBTrig (1, (k+2)%3) = ti2 + STLBASE; + trig.NBTrig (1, (k+2)%3) = ti2; // + STLBASE; } } } diff --git a/libsrc/stlgeom/stltopology.hpp b/libsrc/stlgeom/stltopology.hpp index 0c4abeb9..dd5e9d97 100644 --- a/libsrc/stlgeom/stltopology.hpp +++ b/libsrc/stlgeom/stltopology.hpp @@ -14,41 +14,58 @@ */ +namespace netgen { + class STLGeometry; -#define STLBASE 1 + // #define STLBASE 1 -class STLPointIndex +class STLPointId { int i; public: - STLPointIndex () { ; } - STLPointIndex (int ai) : i(ai) { ; } - STLPointIndex & operator= (const STLPointIndex & ai) { i = ai.i; return *this; } - STLPointIndex & operator= (int ai) { i = ai; return *this; } + STLPointId () { ; } + constexpr STLPointId (int ai) : i(ai) { ; } + STLPointId & operator= (const STLPointId & ai) { i = ai.i; return *this; } + STLPointId & operator= (int ai) { i = ai; return *this; } operator int () const { return i; } - STLPointIndex operator++ (int) { return i++; } - STLPointIndex operator-- (int) { return i--; } + STLPointId operator++ (int) { return i++; } + STLPointId operator-- (int) { return i--; } + + void DoArchive(Archive& ar) { ar & i; } }; -class STLTrigIndex +class STLTrigId { int i; public: - STLTrigIndex () { ; } - STLTrigIndex (int ai) : i(ai) { ; } - STLTrigIndex & operator= (const STLTrigIndex & ai) { i = ai.i; return *this; } - STLTrigIndex & operator= (int ai) { i = ai; return *this; } + STLTrigId () { ; } + constexpr STLTrigId (int ai) : i(ai) { ; } + STLTrigId & operator= (const STLTrigId & ai) { i = ai.i; return *this; } + STLTrigId & operator= (int ai) { i = ai; return *this; } operator int () const { return i; } - STLTrigIndex operator++ (int) { return i++; } - STLTrigIndex operator-- (int) { return i--; } + STLTrigId operator++ (int) { return i++; } + STLTrigId operator-- (int) { return i--; } }; +} +namespace ngcore +{ + template<> + constexpr netgen::STLPointId IndexBASE () { return netgen::STLPointId(1); } + template<> + constexpr netgen::STLTrigId IndexBASE () { return netgen::STLTrigId(1); } +} + + + +namespace netgen { + // triangle structure for loading stl files class STLReadTriangle @@ -73,7 +90,7 @@ class STLTriangle // normalized stored normal vector ?? Vec<3> normal; // point numbers of triangle - int pts[3]; + STLPointId pts[3]; // front-side and back-side domains int domains[2]; @@ -93,22 +110,23 @@ public: - STLTriangle (const int * apts); + STLTriangle (const STLPointId * apts); STLTriangle () {pts[0]=0;pts[1]=0;pts[2]=0;} void DoArchive(Archive& ar) { ar.Do(&topedges[0],3); ar.Do(&nbtrigs[0][0], 6); - ar.Do(&pts[0],3); + // ar.Do(&pts[0],3); + ar & pts[0] & pts[1] & pts[2]; ar.Do(&domains[0],2); size_t i = flags.toperror; ar & normal & box & center & rad & facenum & i; flags.toperror = i; } - int operator[] (int i) const { return pts[i]; } - int & operator[] (int i) { return pts[i]; } + STLPointId operator[] (int i) const { return pts[i]; } + STLPointId & operator[] (int i) { return pts[i]; } int EdgeNum(int i) const { return topedges[(i-1)]; } int & EdgeNum(int i) { return topedges[(i-1)]; } @@ -123,10 +141,10 @@ public: // obsolete: - int PNum(int i) const { return pts[(i-1)]; } - int & PNum(int i) { return pts[(i-1)]; } - int PNumMod(int i) const { return pts[(i-1)%3]; } - int & PNumMod(int i) { return pts[(i-1)%3]; } + STLPointId PNum(int i) const { return pts[(i-1)]; } + STLPointId & PNum(int i) { return pts[(i-1)]; } + STLPointId PNumMod(int i) const { return pts[(i-1)%3]; } + STLPointId & PNumMod(int i) { return pts[(i-1)%3]; } int EdgeNumMod(int i) const { return topedges[(i-1)%3]; } int & EdgeNumMod(int i) { return topedges[(i-1)%3]; } @@ -149,7 +167,7 @@ public: // NON-normalized geometry - normal vector - Vec<3> GeomNormal(const NgArray >& ap) const; + Vec<3> GeomNormal(const Array,STLPointId>& ap) const; // Stored normal vector, normalized void SetNormal (const Vec<3> & n); @@ -159,10 +177,10 @@ public: void ChangeOrientation(); //project with a certain normal vector in plane - void ProjectInPlain(const NgArray >& ap, + void ProjectInPlain(const Array, STLPointId>& ap, const Vec<3> & n, Point<3> & pp) const; //project with the triangle's normal vector in plane - void ProjectInPlain(const NgArray > & ap, Point<3> & pp) const; + void ProjectInPlain(const Array, STLPointId> & ap, Point<3> & pp) const; /* @@ -177,20 +195,20 @@ public: pp(output) = P1 + lam1 v1 + lam2 v2 */ - int ProjectInPlain (const NgArray >& ap, + int ProjectInPlain (const Array,STLPointId>& ap, const Vec<3> & nproj, Point<3> & pp, Vec<3> & lam) const; - int PointInside(const NgArray >& ap, const Point<3> & pp) const; + int PointInside(const Array,STLPointId>& ap, const Point<3> & pp) const; //get nearest point on triangle and distance to it - double GetNearestPoint(const NgArray >& ap, + double GetNearestPoint(const Array,STLPointId>& ap, Point<3> & p3d) const; - double Area(const NgArray >& ap) const; + double Area(const Array,STLPointId>& ap) const; - double MinHeight(const NgArray >& ap) const; - double MaxLength(const NgArray >& ap) const; + double MinHeight(const Array,STLPointId>& ap) const; + double MaxLength(const Array,STLPointId>& ap) const; //max length of a side of triangle int GetFaceNum() {return facenum;} @@ -250,9 +268,9 @@ ostream& operator<<(ostream& os, const STLTriangle& t); class STLTopology { protected: - NgArray trias; + Array trias; NgArray topedges; - NgArray > points; + Array, STLPointId> points; // mapping of sorted pair of points to topedge INDEX_2_HASHTABLE * ht_topedges; @@ -312,24 +330,24 @@ public: int GetNP() const { return points.Size(); } int AddPoint(const Point<3> & p) { points.Append(p); return points.Size(); } - const Point<3> & GetPoint(int nr) const { return points.Get(nr); } + const Point<3> & GetPoint(int nr) const { return points[nr]; } // .Get(nr); } int GetPointNum (const Point<3> & p); - void SetPoint(int nr, const Point<3> & p) { points.Elem(nr) = p; } - const NgArray >& GetPoints() const { return points; } + void SetPoint(int nr, const Point<3> & p) { points[nr] = p; } // { points.Elem(nr) = p; } + auto & GetPoints() const { return points; } - const Point<3> & operator[] (STLPointIndex i) const { return points[i]; } - Point<3> & operator[] (STLPointIndex i) { return points[i]; } + const Point<3> & operator[] (STLPointId i) const { return points[i]; } + Point<3> & operator[] (STLPointId i) { return points[i]; } int GetNT() const { return trias.Size(); } void AddTriangle(const STLTriangle& t); - const STLTriangle & GetTriangle (int nr) const { return trias.Get(nr); } - STLTriangle & GetTriangle (int nr) { return trias.Elem(nr); } + const STLTriangle & GetTriangle (int nr) const { return trias[nr]; } // .Get(nr); } + STLTriangle & GetTriangle (int nr) { return trias[nr]; } // .Elem(nr); } - const STLTriangle & operator[] (STLTrigIndex i) const { return trias[i]; } - STLTriangle & operator[] (STLTrigIndex i) { return trias[i]; } + const STLTriangle & operator[] (STLTrigId i) const { return trias[i]; } + STLTriangle & operator[] (STLTrigId i) { return trias[i]; } int GetNTE() const { return topedges.Size(); } @@ -376,5 +394,6 @@ public: const Box<3> & GetBoundingBox () const { return boundingbox; } }; +} // namespace netgen #endif