2009-01-13 04:40:13 +05:00
|
|
|
#ifndef FILE_STLTOOL
|
|
|
|
#define FILE_STLTOOL
|
|
|
|
|
|
|
|
|
|
|
|
//#include "gprim/gprim.hh"
|
|
|
|
|
|
|
|
/**************************************************************************/
|
|
|
|
/* File: stlgeom.hh */
|
|
|
|
/* Author: Joachim Schoeberl */
|
|
|
|
/* Author2: Johannes Gerstmayr */
|
|
|
|
/* Date: 20. Nov. 99 */
|
|
|
|
/**************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// use one normal vector for whole chart
|
|
|
|
extern int usechartnormal;
|
|
|
|
extern int chartdebug;
|
|
|
|
|
|
|
|
extern int geomsearchtreeon;
|
2019-07-09 13:39:16 +05:00
|
|
|
extern int AddPointIfNotExists(NgArray<Point3d>& ap, const Point3d& p, double eps = 1e-8);
|
2009-01-13 04:40:13 +05:00
|
|
|
//get distance from line lp1-lp2 to point p
|
|
|
|
extern double GetDistFromLine(const Point<3>& lp1, const Point<3>& lp2, Point<3>& p);
|
|
|
|
extern double GetDistFromInfiniteLine(const Point<3>& lp1, const Point<3>& lp2, const Point<3>& p);
|
|
|
|
|
|
|
|
|
|
|
|
extern void FIOReadInt(istream& ios, int& i);
|
|
|
|
extern void FIOWriteInt(ostream& ios, const int& i);
|
|
|
|
extern void FIOReadDouble(istream& ios, double& i);
|
|
|
|
extern void FIOWriteDouble(ostream& ios, const double& i);
|
|
|
|
extern void FIOReadFloat(istream& ios, float& i);
|
|
|
|
extern void FIOWriteFloat(ostream& ios, const float& i);
|
|
|
|
extern void FIOReadString(istream& ios, char* str, int len);
|
|
|
|
extern void FIOReadStringE(istream& ios, char* str, int len);
|
|
|
|
extern void FIOWriteString(ostream& ios, char* str, int len);
|
|
|
|
|
|
|
|
|
2019-07-09 13:39:16 +05:00
|
|
|
typedef NgArray <int> * ArrayINTPTR;
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
class STLGeometry;
|
2019-08-02 19:22:53 +05:00
|
|
|
class STLParameters;
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
class STLChart
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
STLGeometry * geometry;
|
2019-07-09 13:39:16 +05:00
|
|
|
NgArray<int> charttrigs; // trigs which only belong to this chart
|
|
|
|
NgArray<int> outertrigs; // trigs which belong to other charts
|
2017-11-10 17:22:20 +05:00
|
|
|
BoxTree<3> * searchtree; // ADT containing outer trigs
|
2009-01-13 04:40:13 +05:00
|
|
|
|
2019-07-09 13:39:16 +05:00
|
|
|
NgArray<twoint> olimit; //outer limit of outer chart
|
|
|
|
NgArray<twoint> ilimit; //outer limit of inner chart
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
2019-08-02 19:22:53 +05:00
|
|
|
STLChart(STLGeometry * ageometry, const STLParameters& stlparam);
|
2018-07-29 15:03:56 +05:00
|
|
|
~STLChart();
|
2009-01-13 04:40:13 +05:00
|
|
|
void AddChartTrig(int i);
|
|
|
|
void AddOuterTrig(int i);
|
|
|
|
|
|
|
|
int IsInWholeChart(int nr) const;
|
|
|
|
|
2018-07-29 15:03:56 +05:00
|
|
|
int GetChartTrig(int i) const {return charttrigs.Get(i);}
|
|
|
|
int GetOuterTrig(int i) const {return outertrigs.Get(i);}
|
2009-01-13 04:40:13 +05:00
|
|
|
//get all trigs:
|
|
|
|
int GetTrig(int i) const
|
|
|
|
{
|
2018-07-29 15:03:56 +05:00
|
|
|
if (i <= charttrigs.Size()) {return charttrigs.Get(i);}
|
|
|
|
else {return outertrigs.Get(i-charttrigs.Size());}
|
2009-01-13 04:40:13 +05:00
|
|
|
}
|
|
|
|
|
2018-07-29 15:03:56 +05:00
|
|
|
int GetNChartT() const {return charttrigs.Size();}
|
|
|
|
int GetNOuterT() const {return outertrigs.Size();}
|
|
|
|
int GetNT() const {return charttrigs.Size()+outertrigs.Size(); }
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
void GetTrianglesInBox (const Point3d & pmin,
|
|
|
|
const Point3d & pmax,
|
2019-07-09 13:39:16 +05:00
|
|
|
NgArray<int> & trias) const;
|
2018-07-29 15:03:56 +05:00
|
|
|
void AddOLimit(twoint l) {olimit.Append(l);}
|
|
|
|
void AddILimit(twoint l) {ilimit.Append(l);}
|
2009-01-13 04:40:13 +05:00
|
|
|
|
2018-07-29 15:03:56 +05:00
|
|
|
void ClearOLimit() {olimit.SetSize(0);}
|
|
|
|
void ClearILimit() {ilimit.SetSize(0);}
|
2009-01-13 04:40:13 +05:00
|
|
|
|
2018-07-29 15:03:56 +05:00
|
|
|
int GetNOLimit() const {return olimit.Size();}
|
|
|
|
int GetNILimit() const {return ilimit.Size();}
|
2009-01-13 04:40:13 +05:00
|
|
|
|
2018-07-29 15:03:56 +05:00
|
|
|
twoint GetOLimit(int i) const {return olimit.Get(i);}
|
|
|
|
twoint GetILimit(int i) const {return ilimit.Get(i);}
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
//move triangles trigs (local chart-trig numbers) to outer chart
|
2019-07-09 13:39:16 +05:00
|
|
|
void MoveToOuterChart(const NgArray<int>& trigs);
|
|
|
|
void DelChartTrigs(const NgArray<int>& trigs);
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
|
|
|
|
// define local coordinate system, JS:
|
|
|
|
private:
|
|
|
|
Vec<3> normal;
|
|
|
|
Point<3> pref;
|
|
|
|
Vec<3> t1, t2;
|
|
|
|
public:
|
|
|
|
void SetNormal (const Point<3> & apref, const Vec<3> & anormal);
|
|
|
|
const Vec<3> & GetNormal () const { return normal; }
|
2014-04-28 13:14:34 +06:00
|
|
|
Point<2> Project2d (const Point<3> & p3d) const
|
|
|
|
{
|
|
|
|
Vec<3> v = p3d-pref;
|
|
|
|
return Point<2> (t1 * v, t2 * v);
|
|
|
|
}
|
2009-01-13 04:40:13 +05:00
|
|
|
};
|
|
|
|
|
|
|
|
class STLBoundarySeg
|
|
|
|
{
|
|
|
|
Point<3> p1, p2, center;
|
|
|
|
Point<2> p2d1, p2d2;
|
|
|
|
Box<2> boundingbox;
|
|
|
|
// Point<2> p2dmin, p2dmax;
|
|
|
|
|
|
|
|
double rad;
|
|
|
|
int i1, i2;
|
|
|
|
int smoothedge;
|
|
|
|
public:
|
|
|
|
STLBoundarySeg () { ; }
|
2019-07-09 13:39:16 +05:00
|
|
|
STLBoundarySeg (int ai1, int ai2, const NgArray<Point<3> > & points,
|
2014-04-28 13:14:34 +06:00
|
|
|
const STLChart * chart)
|
|
|
|
: p1(points.Get(ai1)), p2(points.Get(ai2)),
|
|
|
|
i1(ai1), i2(ai2)
|
|
|
|
{
|
|
|
|
center = ::netgen::Center (p1, p2);
|
|
|
|
rad = Dist (p1, center);
|
|
|
|
|
|
|
|
p2d1 = chart->Project2d (p1);
|
|
|
|
p2d2 = chart->Project2d (p2);
|
|
|
|
|
|
|
|
boundingbox.Set (p2d1);
|
|
|
|
boundingbox.Add (p2d2);
|
|
|
|
}
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
int operator== (const STLBoundarySeg & s2) const
|
|
|
|
{ return i1 == s2.i1 && i2 == s2.i2; }
|
|
|
|
void Swap ();
|
|
|
|
int I1() const { return i1; }
|
|
|
|
int I2() const { return i2; }
|
|
|
|
const Point<3> & P1() const { return p1; }
|
|
|
|
const Point<3> & P2() const { return p2; }
|
|
|
|
const Point<2> & P2D1() const { return p2d1; }
|
|
|
|
const Point<2> & P2D2() const { return p2d2; }
|
|
|
|
const Point<2> & P2DMin() const { return boundingbox.PMin(); }
|
|
|
|
const Point<2> & P2DMax() const { return boundingbox.PMax(); }
|
|
|
|
const Point<3> & Center() const { return center; }
|
|
|
|
const Box<2> & BoundingBox() const { return boundingbox; }
|
|
|
|
double Radius () const { return rad; }
|
|
|
|
|
|
|
|
void SetSmoothEdge (int se) { smoothedge = se; }
|
|
|
|
int IsSmoothEdge () const { return smoothedge; }
|
|
|
|
friend class STLBoundary;
|
|
|
|
};
|
|
|
|
|
|
|
|
class STLBoundary
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
STLGeometry * geometry;
|
|
|
|
const STLChart * chart;
|
2019-07-09 13:39:16 +05:00
|
|
|
NgArray<STLBoundarySeg> boundary;
|
2017-11-13 15:58:03 +05:00
|
|
|
ClosedHashTable<INDEX_2, STLBoundarySeg> boundary_ht;
|
|
|
|
BoxTree<2,INDEX_2> * searchtree = nullptr;
|
2009-01-13 04:40:13 +05:00
|
|
|
public:
|
|
|
|
STLBoundary(STLGeometry * ageometry);
|
2017-11-10 17:22:20 +05:00
|
|
|
~STLBoundary() { delete searchtree; }
|
2009-01-13 04:40:13 +05:00
|
|
|
|
2017-11-13 15:58:03 +05:00
|
|
|
void Clear() {boundary.SetSize(0); boundary_ht = ClosedHashTable<INDEX_2,STLBoundarySeg>(); }
|
2009-01-13 04:40:13 +05:00
|
|
|
void SetChart (const STLChart * achart) { chart = achart; }
|
|
|
|
//don't check, if already exists!
|
|
|
|
void AddNewSegment(const STLBoundarySeg & seg) {boundary.Append(seg);};
|
|
|
|
//check if segment exists
|
|
|
|
void AddOrDelSegment(const STLBoundarySeg & seg);
|
|
|
|
//addordelsegment for all 3 triangle segments!
|
|
|
|
void AddTriangle(const STLTriangle & t);
|
|
|
|
int NOSegments() {return boundary.Size();};
|
|
|
|
const STLBoundarySeg & GetSegment(int i) {return boundary.Get(i);}
|
|
|
|
|
2017-11-10 17:22:20 +05:00
|
|
|
void BuildSearchTree();
|
|
|
|
void DeleteSearchTree();
|
2009-01-13 04:40:13 +05:00
|
|
|
int TestSeg(const Point<3> & p1, const Point<3> & p2, const Vec<3> & sn,
|
2019-07-09 13:39:16 +05:00
|
|
|
double sinchartangle, int divisions, NgArray<Point<3> >& points,
|
2009-01-13 04:40:13 +05:00
|
|
|
double eps);
|
|
|
|
|
|
|
|
int TestSegChartNV(const Point3d& p1, const Point3d& p2, const Vec3d& sn);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class STLDoctorParams
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
int drawmeshededges;
|
|
|
|
double geom_tol_fact;
|
|
|
|
|
|
|
|
double longlinefact;
|
|
|
|
int showexcluded;
|
|
|
|
|
|
|
|
int selectmode; //0==trig, 1==edge, 2==point, 3==multiedge, 4==line cluster
|
|
|
|
int edgeselectmode;
|
|
|
|
|
|
|
|
int useexternaledges;
|
|
|
|
int showfaces;
|
|
|
|
int showedgecornerpoints;
|
|
|
|
int showtouchedtrigchart;
|
|
|
|
int conecheck;
|
|
|
|
int spiralcheck;
|
|
|
|
int selecttrig;
|
|
|
|
int nodeofseltrig;
|
|
|
|
int selectwithmouse;
|
|
|
|
int showmarkedtrigs;
|
|
|
|
double dirtytrigfact;
|
|
|
|
double smoothangle;
|
|
|
|
|
|
|
|
double smoothnormalsweight;
|
|
|
|
|
|
|
|
int showvicinity;
|
|
|
|
int vicinity;
|
|
|
|
///
|
|
|
|
STLDoctorParams();
|
|
|
|
///
|
|
|
|
void Print (ostream & ost) const;
|
|
|
|
};
|
|
|
|
|
2015-10-19 13:08:30 +05:00
|
|
|
DLL_HEADER extern STLDoctorParams stldoctor;
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
|
|
|
|
|
2019-08-02 19:22:53 +05:00
|
|
|
// TODO change enable flag to optional parameters
|
2009-01-13 04:40:13 +05:00
|
|
|
class STLParameters
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/// angle for edge detection
|
2019-08-02 19:22:53 +05:00
|
|
|
double yangle = 30.;
|
2009-01-13 04:40:13 +05:00
|
|
|
double contyangle; //edges continued with contyangle
|
|
|
|
/// angle of geometry edge at which the mesher should set a point
|
2019-08-02 19:22:53 +05:00
|
|
|
double edgecornerangle = 60.;
|
2009-01-13 04:40:13 +05:00
|
|
|
/// angle inside on chart
|
2019-08-02 19:22:53 +05:00
|
|
|
double chartangle = 15.;
|
2009-01-13 04:40:13 +05:00
|
|
|
/// angle for overlapping parts of char
|
2019-08-02 19:22:53 +05:00
|
|
|
double outerchartangle = 70.;
|
2009-01-13 04:40:13 +05:00
|
|
|
/// 0 .. no, 1 .. local, (2 .. global)
|
|
|
|
int usesearchtree;
|
|
|
|
///
|
|
|
|
double resthatlasfac;
|
2019-08-02 19:22:53 +05:00
|
|
|
bool resthatlasenable;
|
2009-01-13 04:40:13 +05:00
|
|
|
double atlasminh;
|
|
|
|
|
2019-08-02 19:22:53 +05:00
|
|
|
double resthsurfcurvfac = 1.;
|
|
|
|
bool resthsurfcurvenable = false;
|
2009-01-13 04:40:13 +05:00
|
|
|
|
2019-08-02 19:22:53 +05:00
|
|
|
double resthchartdistfac = 1.5;
|
|
|
|
bool resthchartdistenable = true;
|
2009-01-13 04:40:13 +05:00
|
|
|
|
2019-08-02 19:22:53 +05:00
|
|
|
double resthcloseedgefac = 2.;
|
|
|
|
bool resthcloseedgeenable = true;
|
2009-01-13 04:40:13 +05:00
|
|
|
|
2019-08-02 19:22:53 +05:00
|
|
|
double resthedgeanglefac = 1.;
|
|
|
|
bool resthedgeangleenable = false;
|
2009-01-13 04:40:13 +05:00
|
|
|
|
2019-08-02 19:22:53 +05:00
|
|
|
double resthsurfmeshcurvfac = 2.;
|
|
|
|
bool resthsurfmeshcurvenable = false;
|
2009-01-13 04:40:13 +05:00
|
|
|
|
2019-08-02 19:22:53 +05:00
|
|
|
double resthlinelengthfac = 0.5;
|
|
|
|
bool resthlinelengthenable = true;
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
///
|
2019-08-02 19:22:53 +05:00
|
|
|
bool recalc_h_opt = true;
|
2009-01-13 04:40:13 +05:00
|
|
|
///
|
|
|
|
STLParameters();
|
|
|
|
///
|
|
|
|
void Print (ostream & ost) const;
|
|
|
|
};
|
|
|
|
|
2015-10-19 13:08:30 +05:00
|
|
|
DLL_HEADER extern STLParameters stlparam;
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
|
|
|
|
void STLMeshing (STLGeometry & geom,
|
2019-08-06 13:42:53 +05:00
|
|
|
Mesh & mesh,
|
|
|
|
const MeshingParameters& mparam,
|
|
|
|
const STLParameters& stlpar);
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
|
|
|
|
int STLSurfaceMeshing (STLGeometry & geom,
|
2019-08-06 13:42:53 +05:00
|
|
|
Mesh & mesh,
|
|
|
|
const MeshingParameters& mparam);
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
void STLSurfaceOptimization (STLGeometry & geom,
|
2019-08-06 13:42:53 +05:00
|
|
|
Mesh & mesh,
|
|
|
|
const MeshingParameters & mparam);
|
2009-01-13 04:40:13 +05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|