diff --git a/libsrc/csg/csgeom.hpp b/libsrc/csg/csgeom.hpp index 0983749e..21407d8e 100644 --- a/libsrc/csg/csgeom.hpp +++ b/libsrc/csg/csgeom.hpp @@ -366,8 +366,6 @@ namespace netgen virtual int GenerateMesh (shared_ptr & mesh, MeshingParameters & mparam) override; - virtual const Refinement & GetRefinement () const override; - void AddSplineSurface (shared_ptr ss) { spline_surfaces.Append(ss); } }; diff --git a/libsrc/stlgeom/meshstlsurface.cpp b/libsrc/stlgeom/meshstlsurface.cpp index ace69e6d..b02d4098 100644 --- a/libsrc/stlgeom/meshstlsurface.cpp +++ b/libsrc/stlgeom/meshstlsurface.cpp @@ -1068,183 +1068,4 @@ double MeshingSTLSurface :: Area () const return geom.Area(); } -void MeshOptimizeSTLSurface :: SelectSurfaceOfPoint (const Point<3> & p, - const PointGeomInfo & gi) -{ - // (*testout) << "sel char: " << gi.trignum << endl; - - geom.SelectChartOfTriangle (gi.trignum); - // geom.SelectChartOfPoint (p); -} - - -void MeshOptimizeSTLSurface :: ProjectPoint (INDEX surfind, Point<3> & p) const -{ - if (!geom.Project (p)) - { - PrintMessage(7,"project failed"); - - if (!geom.ProjectOnWholeSurface(p)) - { - PrintMessage(7, "project on whole surface failed"); - } - } - - // geometry.GetSurface(surfind)->Project (p); -} - -void MeshOptimizeSTLSurface :: ProjectPoint2 (INDEX surfind, INDEX surfind2, Point<3> & p) const -{ - /* - ProjectToEdge ( geometry.GetSurface(surfind), - geometry.GetSurface(surfind2), p); - */ -} - -int MeshOptimizeSTLSurface :: CalcPointGeomInfo(PointGeomInfo& gi, const Point<3> & p3) const -{ - Point<3> hp = p3; - gi.trignum = geom.Project (hp); - - if (gi.trignum) return 1; - - return 0; - -} - -void MeshOptimizeSTLSurface :: GetNormalVector(INDEX surfind, const Point<3> & p, Vec<3> & n) const -{ - n = geom.GetChartNormalVector(); -} - - - - - - - - - - -RefinementSTLGeometry :: RefinementSTLGeometry (const STLGeometry & ageom) - : Refinement(), geom(ageom) -{ - ; -} - -RefinementSTLGeometry :: ~RefinementSTLGeometry () -{ - ; -} - -void RefinementSTLGeometry :: -PointBetween (const Point<3> & p1, const Point<3> & p2, double secpoint, - int surfi, - const PointGeomInfo & gi1, - const PointGeomInfo & gi2, - Point<3> & newp, PointGeomInfo & newgi) const -{ - newp = p1+secpoint*(p2-p1); - - /* - (*testout) << "surf-between: p1 = " << p1 << ", p2 = " << p2 - << ", gi = " << gi1 << " - " << gi2 << endl; - */ - - if (gi1.trignum > 0) - { - // ((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum); - - Point<3> np1 = newp; - Point<3> np2 = newp; - ((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum); - int tn1 = geom.Project (np1); - - ((STLGeometry&)geom).SelectChartOfTriangle (gi2.trignum); - int tn2 = geom.Project (np2); - - newgi.trignum = tn1; //urspruengliche version - newp = np1; //urspruengliche version - - if (!newgi.trignum) - { newgi.trignum = tn2; newp = np2; } - if (!newgi.trignum) newgi.trignum = gi1.trignum; - - /* - if (tn1 != 0 && tn2 != 0 && ((STLGeometry&)geom).GetAngle(tn1,tn2) < M_PI*0.05) { - newgi.trignum = tn1; - newp = np1; - } - else - { - newp = ((STLGeometry&)geom).PointBetween(p1, gi1.trignum, p2, gi2.trignum); - tn1 = ((STLGeometry&)geom).Project(newp); - newgi.trignum = tn1; - - if (!tn1) - { - newp = Center (p1, p2); - newgi.trignum = 0; - - } - } - */ - } - else - { - // (*testout) << "WARNING: PointBetween got geominfo = 0" << endl; - newp = p1+secpoint*(p2-p1); - newgi.trignum = 0; - } - - // (*testout) << "newp = " << newp << ", ngi = " << newgi << endl; -} - -void RefinementSTLGeometry :: -PointBetween (const Point<3> & p1, const Point<3> & p2, double secpoint, - int surfi1, int surfi2, - const EdgePointGeomInfo & gi1, - const EdgePointGeomInfo & gi2, - Point<3> & newp, EdgePointGeomInfo & newgi) const -{ - /* - (*testout) << "edge-between: p1 = " << p1 << ", p2 = " << p2 - << ", gi1,2 = " << gi1 << ", " << gi2 << endl; - */ - /* - newp = Center (p1, p2); - ((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum); - newgi.trignum = geom.Project (newp); - */ - int hi; - newgi.dist = (1.0-secpoint) * gi1.dist + secpoint*gi2.dist; - newgi.edgenr = gi1.edgenr; - - /* - (*testout) << "p1 = " << p1 << ", p2 = " << p2 << endl; - (*testout) << "refedge: " << gi1.edgenr - << " d1 = " << gi1.dist << ", d2 = " << gi2.dist << endl; - */ - newp = geom.GetLine (gi1.edgenr)->GetPointInDist (geom.GetPoints(), newgi.dist, hi); - - // (*testout) << "newp = " << newp << endl; -} - - -void RefinementSTLGeometry :: ProjectToSurface (Point<3> & p, int surfi) const -{ - cout << "RefinementSTLGeometry :: ProjectToSurface not implemented!" << endl; -}; - - -void RefinementSTLGeometry :: ProjectToSurface (Point<3> & p, int surfi, - PointGeomInfo & gi) const -{ - ((STLGeometry&)geom).SelectChartOfTriangle (gi.trignum); - gi.trignum = geom.Project (p); - // if (!gi.trignum) - // cout << "projectSTL failed" << endl; -}; - - } diff --git a/libsrc/stlgeom/stlgeom.cpp b/libsrc/stlgeom/stlgeom.cpp index 5c01d88f..21dbf076 100644 --- a/libsrc/stlgeom/stlgeom.cpp +++ b/libsrc/stlgeom/stlgeom.cpp @@ -44,7 +44,6 @@ void STLMeshing (STLGeometry & geom, lineendpoints(), spiralpoints(), selectedmultiedge() */ { - ref = NULL; edgedata = make_unique(*this); externaledges.SetSize(0); Clear(); @@ -101,6 +100,125 @@ int STLGeometry :: GenerateMesh (shared_ptr & mesh, MeshingParameters & mp return STLMeshingDummy (this, mesh, mparam, stlpar); } +Vec<3> STLGeometry :: GetNormal(INDEX surfind, const Point<3> & p) const +{ + return GetChartNormalVector(); +} + +bool STLGeometry :: CalcPointGeomInfo(int /*surfind*/, PointGeomInfo& gi, const Point<3> & p3) const +{ + Point<3> hp = p3; + SelectChartOfTriangle(gi.trignum); + + gi.trignum = Project (hp); + + if (gi.trignum) return true; + + return false; +} + +bool STLGeometry :: ProjectPointGI (int surfind, Point<3> & p, PointGeomInfo & gi) const +{ + SelectChartOfTriangle(gi.trignum); + gi.trignum = Project (p); + if (!gi.trignum) + { + PrintMessage(7,"project failed"); + + gi.trignum = ProjectOnWholeSurface(p); + if (!gi.trignum) + { + PrintMessage(7, "project on whole surface failed"); + return false; + } + } + return true; +} + +void STLGeometry :: ProjectPoint (INDEX surfind, Point<3> & p) const +{ + if (!Project (p)) + { + PrintMessage(7,"project failed"); + + if (!ProjectOnWholeSurface(p)) + { + PrintMessage(7, "project on whole surface failed"); + } + } +} + +void STLGeometry :: +PointBetween (const Point<3> & p1, const Point<3> & p2, double secpoint, + int surfi, + const PointGeomInfo & gi1, + const PointGeomInfo & gi2, + Point<3> & newp, PointGeomInfo & newgi) const +{ + newp = p1+secpoint*(p2-p1); + + /* + (*testout) << "surf-between: p1 = " << p1 << ", p2 = " << p2 + << ", gi = " << gi1 << " - " << gi2 << endl; + */ + + if (gi1.trignum > 0) + { + // ((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum); + + Point<3> np1 = newp; + Point<3> np2 = newp; + SelectChartOfTriangle (gi1.trignum); + int tn1 = Project (np1); + + SelectChartOfTriangle (gi2.trignum); + int tn2 = Project (np2); + + newgi.trignum = tn1; //urspruengliche version + newp = np1; //urspruengliche version + + if (!newgi.trignum) + { newgi.trignum = tn2; newp = np2; } + if (!newgi.trignum) newgi.trignum = gi1.trignum; + } + else + { + // (*testout) << "WARNING: PointBetween got geominfo = 0" << endl; + newp = p1+secpoint*(p2-p1); + newgi.trignum = 0; + } +} + +void STLGeometry :: +PointBetweenEdge (const Point<3> & p1, const Point<3> & p2, double secpoint, + int surfi1, int surfi2, + const EdgePointGeomInfo & gi1, + const EdgePointGeomInfo & gi2, + Point<3> & newp, EdgePointGeomInfo & newgi) const +{ + /* + (*testout) << "edge-between: p1 = " << p1 << ", p2 = " << p2 + << ", gi1,2 = " << gi1 << ", " << gi2 << endl; + */ + /* + newp = Center (p1, p2); + ((STLGeometry&)geom).SelectChartOfTriangle (gi1.trignum); + newgi.trignum = geom.Project (newp); + */ + int hi; + newgi.dist = (1.0-secpoint) * gi1.dist + secpoint*gi2.dist; + newgi.edgenr = gi1.edgenr; + + /* + (*testout) << "p1 = " << p1 << ", p2 = " << p2 << endl; + (*testout) << "refedge: " << gi1.edgenr + << " d1 = " << gi1.dist << ", d2 = " << gi2.dist << endl; + */ + newp = GetLine (gi1.edgenr)->GetPointInDist (GetPoints(), newgi.dist, hi); + + // (*testout) << "newp = " << newp << endl; +} + void STLGeometry :: STLInfo(double* data) { data[0] = GetNT(); diff --git a/libsrc/stlgeom/stlgeom.hpp b/libsrc/stlgeom/stlgeom.hpp index 3d6ddb22..25994ce2 100644 --- a/libsrc/stlgeom/stlgeom.hpp +++ b/libsrc/stlgeom/stlgeom.hpp @@ -148,7 +148,7 @@ namespace netgen //for meshing and project: NgArray meshcharttrigs; //per trig: 1=belong to chart, 0 not - int meshchart; + mutable int meshchart; NgArray ha_points; // help array, np long, filled with 0 @@ -159,12 +159,10 @@ namespace netgen //transformation: - Vec<3> meshtrignv; + mutable Vec<3> meshtrignv; Vec<3> ex, ey, ez; Point<3> p1; - mutable class RefinementSTLGeometry * ref; - public: int edgesfound; int surfacemeshed; @@ -194,6 +192,23 @@ namespace netgen virtual void Save (string filename) const override; + bool CalcPointGeomInfo(int surfind, PointGeomInfo& gi, const Point<3> & p3) const override; + void ProjectPoint(INDEX surfind, Point<3> & p) const override; + bool ProjectPointGI (int surfind, Point<3> & p, PointGeomInfo & gi) const override; + Vec<3> GetNormal(int surfind, const Point<3> & p) const override; + void PointBetween(const Point<3> & p1, const Point<3> & p2, + double secpoint, int surfi, + const PointGeomInfo & gi1, + const PointGeomInfo & gi2, + Point<3> & newp, PointGeomInfo & newgi) const override; + + void PointBetweenEdge(const Point<3> & p1, const Point<3> & p2, double secpoint, + int surfi1, int surfi2, + const EdgePointGeomInfo & ap1, + const EdgePointGeomInfo & ap2, + Point<3> & newp, EdgePointGeomInfo & newgi) const override; + + DLL_HEADER void STLInfo(double* data); //stldoctor: @@ -419,7 +434,7 @@ namespace netgen // void DefineTangentialPlane(const Point<3> & ap1, const Point<3> & ap2, int trig); // - void SelectChartOfTriangle (int trignum); + void SelectChartOfTriangle (int trignum) const; // void SelectChartOfPoint (const Point<3> & p); // @@ -459,8 +474,6 @@ namespace netgen int GenerateMesh (shared_ptr & mesh, MeshingParameters & mparam) override; - virtual const Refinement & GetRefinement () const override; - // Add additional Point to chart to close the surface and write the resulting stl to a file DLL_HEADER void WriteChartToFile( ChartId chartnumber, string filename="chart.slb" ); }; diff --git a/libsrc/stlgeom/stlgeommesh.cpp b/libsrc/stlgeom/stlgeommesh.cpp index ca1552e2..a5d32c9e 100644 --- a/libsrc/stlgeom/stlgeommesh.cpp +++ b/libsrc/stlgeom/stlgeommesh.cpp @@ -392,7 +392,7 @@ void STLGeometry :: DefineTangentialPlane (const Point<3> & ap1, const Point<3> } -void STLGeometry :: SelectChartOfTriangle (int trignum) +void STLGeometry :: SelectChartOfTriangle (int trignum) const { meshchart = GetChartNr(trignum); meshtrignv = GetTriangle(trignum).Normal();