mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-26 22:00:33 +05:00
Clean up STLGeometry
This commit is contained in:
parent
05881c0eb5
commit
562800babc
@ -366,8 +366,6 @@ namespace netgen
|
|||||||
|
|
||||||
virtual int GenerateMesh (shared_ptr<Mesh> & mesh, MeshingParameters & mparam) override;
|
virtual int GenerateMesh (shared_ptr<Mesh> & mesh, MeshingParameters & mparam) override;
|
||||||
|
|
||||||
virtual const Refinement & GetRefinement () const override;
|
|
||||||
|
|
||||||
void AddSplineSurface (shared_ptr<SplineSurface> ss) { spline_surfaces.Append(ss); }
|
void AddSplineSurface (shared_ptr<SplineSurface> ss) { spline_surfaces.Append(ss); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1068,183 +1068,4 @@ double MeshingSTLSurface :: Area () const
|
|||||||
return geom.Area();
|
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;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,6 @@ void STLMeshing (STLGeometry & geom,
|
|||||||
lineendpoints(), spiralpoints(), selectedmultiedge()
|
lineendpoints(), spiralpoints(), selectedmultiedge()
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
ref = NULL;
|
|
||||||
edgedata = make_unique<STLEdgeDataList>(*this);
|
edgedata = make_unique<STLEdgeDataList>(*this);
|
||||||
externaledges.SetSize(0);
|
externaledges.SetSize(0);
|
||||||
Clear();
|
Clear();
|
||||||
@ -101,6 +100,125 @@ int STLGeometry :: GenerateMesh (shared_ptr<Mesh> & mesh, MeshingParameters & mp
|
|||||||
return STLMeshingDummy (this, mesh, mparam, stlpar);
|
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)
|
void STLGeometry :: STLInfo(double* data)
|
||||||
{
|
{
|
||||||
data[0] = GetNT();
|
data[0] = GetNT();
|
||||||
|
@ -148,7 +148,7 @@ namespace netgen
|
|||||||
|
|
||||||
//for meshing and project:
|
//for meshing and project:
|
||||||
NgArray<int> meshcharttrigs; //per trig: 1=belong to chart, 0 not
|
NgArray<int> meshcharttrigs; //per trig: 1=belong to chart, 0 not
|
||||||
int meshchart;
|
mutable int meshchart;
|
||||||
|
|
||||||
NgArray<int> ha_points; // help array, np long, filled with 0
|
NgArray<int> ha_points; // help array, np long, filled with 0
|
||||||
|
|
||||||
@ -159,12 +159,10 @@ namespace netgen
|
|||||||
|
|
||||||
|
|
||||||
//transformation:
|
//transformation:
|
||||||
Vec<3> meshtrignv;
|
mutable Vec<3> meshtrignv;
|
||||||
Vec<3> ex, ey, ez;
|
Vec<3> ex, ey, ez;
|
||||||
Point<3> p1;
|
Point<3> p1;
|
||||||
|
|
||||||
mutable class RefinementSTLGeometry * ref;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int edgesfound;
|
int edgesfound;
|
||||||
int surfacemeshed;
|
int surfacemeshed;
|
||||||
@ -194,6 +192,23 @@ namespace netgen
|
|||||||
|
|
||||||
virtual void Save (string filename) const override;
|
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);
|
DLL_HEADER void STLInfo(double* data);
|
||||||
//stldoctor:
|
//stldoctor:
|
||||||
@ -419,7 +434,7 @@ namespace netgen
|
|||||||
//
|
//
|
||||||
void DefineTangentialPlane(const Point<3> & ap1, const Point<3> & ap2, int trig);
|
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);
|
void SelectChartOfPoint (const Point<3> & p);
|
||||||
//
|
//
|
||||||
@ -459,8 +474,6 @@ namespace netgen
|
|||||||
|
|
||||||
int GenerateMesh (shared_ptr<Mesh> & mesh, MeshingParameters & mparam) override;
|
int GenerateMesh (shared_ptr<Mesh> & 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
|
// 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" );
|
DLL_HEADER void WriteChartToFile( ChartId chartnumber, string filename="chart.slb" );
|
||||||
};
|
};
|
||||||
|
@ -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);
|
meshchart = GetChartNr(trignum);
|
||||||
meshtrignv = GetTriangle(trignum).Normal();
|
meshtrignv = GetTriangle(trignum).Normal();
|
||||||
|
Loading…
Reference in New Issue
Block a user