mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-25 21:40: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 const Refinement & GetRefinement () const override;
|
||||
|
||||
void AddSplineSurface (shared_ptr<SplineSurface> ss) { spline_surfaces.Append(ss); }
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
@ -44,7 +44,6 @@ void STLMeshing (STLGeometry & geom,
|
||||
lineendpoints(), spiralpoints(), selectedmultiedge()
|
||||
*/
|
||||
{
|
||||
ref = NULL;
|
||||
edgedata = make_unique<STLEdgeDataList>(*this);
|
||||
externaledges.SetSize(0);
|
||||
Clear();
|
||||
@ -101,6 +100,125 @@ int STLGeometry :: GenerateMesh (shared_ptr<Mesh> & 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();
|
||||
|
@ -148,7 +148,7 @@ namespace netgen
|
||||
|
||||
//for meshing and project:
|
||||
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
|
||||
|
||||
@ -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> & 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" );
|
||||
};
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user