little OCC-meshing cleanup

This commit is contained in:
Joachim Schöberl 2019-07-28 20:22:48 +02:00
parent 954cae2686
commit 321bee9b02
4 changed files with 1235 additions and 1231 deletions

View File

@ -21,6 +21,7 @@ namespace netgen
Meshing2 :: Meshing2 (const MeshingParameters & mp, const Box<3> & aboundingbox) Meshing2 :: Meshing2 (const MeshingParameters & mp, const Box<3> & aboundingbox)
{ {
static Timer t("Mesing2::Meshing2"); RegionTimer r(t);
boundingbox = aboundingbox; boundingbox = aboundingbox;
LoadRules (NULL, mp.quad); LoadRules (NULL, mp.quad);

File diff suppressed because it is too large Load Diff

View File

@ -128,321 +128,317 @@ namespace netgen
class EntityVisualizationCode class EntityVisualizationCode
{ {
int code; int code;
public: public:
EntityVisualizationCode() EntityVisualizationCode()
{ code = ENTITYISVISIBLE + !ENTITYISHIGHLIGHTED + ENTITYISDRAWABLE;} { code = ENTITYISVISIBLE + !ENTITYISHIGHLIGHTED + ENTITYISDRAWABLE;}
int IsVisible () int IsVisible ()
{ return code & ENTITYISVISIBLE;} { return code & ENTITYISVISIBLE;}
int IsHighlighted () int IsHighlighted ()
{ return code & ENTITYISHIGHLIGHTED;} { return code & ENTITYISHIGHLIGHTED;}
int IsDrawable () int IsDrawable ()
{ return code & ENTITYISDRAWABLE;} { return code & ENTITYISDRAWABLE;}
void Show () void Show ()
{ code |= ENTITYISVISIBLE;} { code |= ENTITYISVISIBLE;}
void Hide () void Hide ()
{ code &= ~ENTITYISVISIBLE;} { code &= ~ENTITYISVISIBLE;}
void Highlight () void Highlight ()
{ code |= ENTITYISHIGHLIGHTED;} { code |= ENTITYISHIGHLIGHTED;}
void Lowlight () void Lowlight ()
{ code &= ~ENTITYISHIGHLIGHTED;} { code &= ~ENTITYISHIGHLIGHTED;}
void SetDrawable () void SetDrawable ()
{ code |= ENTITYISDRAWABLE;} { code |= ENTITYISDRAWABLE;}
void SetNotDrawable () void SetNotDrawable ()
{ code &= ~ENTITYISDRAWABLE;} { code &= ~ENTITYISDRAWABLE;}
}; };
class Line class Line
{ {
public: public:
Point<3> p0, p1; Point<3> p0, p1;
double Dist (Line l);
double Dist (Line l); double Length () { return (p1-p0).Length(); }
};
double Length ();
};
inline double Det3 (double a00, double a01, double a02, inline double Det3 (double a00, double a01, double a02,
double a10, double a11, double a12, double a10, double a11, double a12,
double a20, double a21, double a22) double a20, double a21, double a22)
{ {
return a00*a11*a22 + a01*a12*a20 + a10*a21*a02 - a20*a11*a02 - a10*a01*a22 - a21*a12*a00; return a00*a11*a22 + a01*a12*a20 + a10*a21*a02 - a20*a11*a02 - a10*a01*a22 - a21*a12*a00;
} }
class OCCGeometry : public NetgenGeometry class OCCGeometry : public NetgenGeometry
{ {
Point<3> center; Point<3> center;
public: public:
TopoDS_Shape shape; TopoDS_Shape shape;
TopTools_IndexedMapOfShape fmap, emap, vmap, somap, shmap, wmap; TopTools_IndexedMapOfShape fmap, emap, vmap, somap, shmap, wmap;
NgArray<bool> fsingular, esingular, vsingular; NgArray<bool> fsingular, esingular, vsingular;
Box<3> boundingbox; Box<3> boundingbox;
NgArray<string> fnames, enames, snames; NgArray<string> fnames, enames, snames;
// Philippose - 29/01/2009 // Philippose - 29/01/2009
// OpenCascade XDE Support // OpenCascade XDE Support
// XCAF Handle to make the face colours available to the rest of // XCAF Handle to make the face colours available to the rest of
// the system // the system
Handle_XCAFDoc_ColorTool face_colours; Handle_XCAFDoc_ColorTool face_colours;
mutable int changed; mutable int changed;
NgArray<int> facemeshstatus; NgArray<int> facemeshstatus;
// Philippose - 15/01/2009 // Philippose - 15/01/2009
// Maximum mesh size for a given face // Maximum mesh size for a given face
// (Used to explicitly define mesh size limits on individual faces) // (Used to explicitly define mesh size limits on individual faces)
NgArray<double> face_maxh; NgArray<double> face_maxh;
// Philippose - 14/01/2010 // Philippose - 14/01/2010
// Boolean array to detect whether a face has been explicitly modified // Boolean array to detect whether a face has been explicitly modified
// by the user or not // by the user or not
NgArray<bool> face_maxh_modified; NgArray<bool> face_maxh_modified;
// Philippose - 15/01/2009 // Philippose - 15/01/2009
// Indicates which faces have been selected by the user in geometry mode // Indicates which faces have been selected by the user in geometry mode
// (Currently handles only selection of one face at a time, but an array would // (Currently handles only selection of one face at a time, but an array would
// help to extend this to multiple faces) // help to extend this to multiple faces)
NgArray<bool> face_sel_status; NgArray<bool> face_sel_status;
NgArray<EntityVisualizationCode> fvispar, evispar, vvispar; NgArray<EntityVisualizationCode> fvispar, evispar, vvispar;
double tolerance; double tolerance;
bool fixsmalledges; bool fixsmalledges;
bool fixspotstripfaces; bool fixspotstripfaces;
bool sewfaces; bool sewfaces;
bool makesolids; bool makesolids;
bool splitpartitions; bool splitpartitions;
OCCGeometry() OCCGeometry()
{ {
somap.Clear(); somap.Clear();
shmap.Clear(); shmap.Clear();
fmap.Clear(); fmap.Clear();
wmap.Clear(); wmap.Clear();
emap.Clear(); emap.Clear();
vmap.Clear(); vmap.Clear();
} }
DLL_HEADER virtual void Save (string filename) const; DLL_HEADER virtual void Save (string filename) const;
void DoArchive(Archive& ar); void DoArchive(Archive& ar);
DLL_HEADER void BuildFMap(); DLL_HEADER void BuildFMap();
Box<3> GetBoundingBox() Box<3> GetBoundingBox() const
{ return boundingbox;} { return boundingbox; }
int NrSolids() int NrSolids() const
{ return somap.Extent();} { return somap.Extent(); }
// Philippose - 17/01/2009 // Philippose - 17/01/2009
// Total number of faces in the geometry // Total number of faces in the geometry
int NrFaces() int NrFaces() const
{ return fmap.Extent();} { return fmap.Extent(); }
void SetCenter() void SetCenter()
{ center = boundingbox.Center();} { center = boundingbox.Center(); }
Point<3> Center() Point<3> Center() const
{ return center;} { return center; }
void Project (int surfi, Point<3> & p) const; void Project (int surfi, Point<3> & p) const;
bool FastProject (int surfi, Point<3> & ap, double& u, double& v) const; bool FastProject (int surfi, Point<3> & ap, double& u, double& v) const;
OCCSurface GetSurface (int surfi) OCCSurface GetSurface (int surfi)
{ {
cout << "OCCGeometry::GetSurface using PLANESPACE" << endl; cout << "OCCGeometry::GetSurface using PLANESPACE" << endl;
return OCCSurface (TopoDS::Face(fmap(surfi)), PLANESPACE); return OCCSurface (TopoDS::Face(fmap(surfi)), PLANESPACE);
} }
DLL_HEADER void CalcBoundingBox (); DLL_HEADER void CalcBoundingBox ();
DLL_HEADER void BuildVisualizationMesh (double deflection); DLL_HEADER void BuildVisualizationMesh (double deflection);
void RecursiveTopologyTree (const TopoDS_Shape & sh, void RecursiveTopologyTree (const TopoDS_Shape & sh,
stringstream & str, stringstream & str,
TopAbs_ShapeEnum l, TopAbs_ShapeEnum l,
bool free, bool free,
const char * lname); const char * lname);
DLL_HEADER void GetTopologyTree (stringstream & str); DLL_HEADER void GetTopologyTree (stringstream & str);
DLL_HEADER void PrintNrShapes (); DLL_HEADER void PrintNrShapes ();
DLL_HEADER void CheckIrregularEntities (stringstream & str); DLL_HEADER void CheckIrregularEntities (stringstream & str);
DLL_HEADER void SewFaces(); DLL_HEADER void SewFaces();
DLL_HEADER void MakeSolid(); DLL_HEADER void MakeSolid();
DLL_HEADER void HealGeometry(); DLL_HEADER void HealGeometry();
// Philippose - 15/01/2009 // Philippose - 15/01/2009
// Sets the maximum mesh size for a given face // Sets the maximum mesh size for a given face
// (Note: Local mesh size limited by the global max mesh size) // (Note: Local mesh size limited by the global max mesh size)
void SetFaceMaxH(int facenr, double faceh, const MeshingParameters & mparam) void SetFaceMaxH(int facenr, double faceh, const MeshingParameters & mparam)
{ {
if((facenr> 0) && (facenr <= fmap.Extent())) if((facenr> 0) && (facenr <= fmap.Extent()))
{ {
face_maxh[facenr-1] = min(mparam.maxh,faceh); face_maxh[facenr-1] = min(mparam.maxh,faceh);
// Philippose - 14/01/2010 // Philippose - 14/01/2010
// If the face maxh is greater than or equal to the // If the face maxh is greater than or equal to the
// current global maximum, then identify the face as // current global maximum, then identify the face as
// not explicitly controlled by the user any more // not explicitly controlled by the user any more
if(faceh >= mparam.maxh) if(faceh >= mparam.maxh)
{ {
face_maxh_modified[facenr-1] = 0; face_maxh_modified[facenr-1] = 0;
} }
else else
{ {
face_maxh_modified[facenr-1] = 1; face_maxh_modified[facenr-1] = 1;
} }
} }
} }
// Philippose - 15/01/2009 // Philippose - 15/01/2009
// Returns the local mesh size of a given face // Returns the local mesh size of a given face
double GetFaceMaxH(int facenr) double GetFaceMaxH(int facenr)
{ {
if((facenr> 0) && (facenr <= fmap.Extent())) if((facenr> 0) && (facenr <= fmap.Extent()))
{ {
return face_maxh[facenr-1]; return face_maxh[facenr-1];
} }
else else
{ {
return 0.0; return 0.0;
} }
} }
// Philippose - 14/01/2010 // Philippose - 14/01/2010
// Returns the flag whether the given face // Returns the flag whether the given face
// has a mesh size controlled by the user or not // has a mesh size controlled by the user or not
bool GetFaceMaxhModified(int facenr) bool GetFaceMaxhModified(int facenr)
{ {
return face_maxh_modified[facenr-1]; return face_maxh_modified[facenr-1];
} }
// Philippose - 17/01/2009 // Philippose - 17/01/2009
// Returns the index of the currently selected face // Returns the index of the currently selected face
int SelectedFace() int SelectedFace()
{ {
int i; for(int i = 1; i <= fmap.Extent(); i++)
{
for(i = 1; i <= fmap.Extent(); i++) if(face_sel_status[i-1])
{
if(face_sel_status[i-1])
{ {
return i; return i;
} }
} }
return 0; return 0;
} }
// Philippose - 17/01/2009 // Philippose - 17/01/2009
// Sets the currently selected face // Sets the currently selected face
void SetSelectedFace(int facenr) void SetSelectedFace(int facenr)
{ {
face_sel_status = 0; face_sel_status = 0;
if((facenr >= 1) && (facenr <= fmap.Extent())) if((facenr >= 1) && (facenr <= fmap.Extent()))
{ {
face_sel_status[facenr-1] = 1; face_sel_status[facenr-1] = 1;
} }
} }
void LowLightAll() void LowLightAll()
{ {
for (int i = 1; i <= fmap.Extent(); i++) for (int i = 1; i <= fmap.Extent(); i++)
fvispar[i-1].Lowlight(); fvispar[i-1].Lowlight();
for (int i = 1; i <= emap.Extent(); i++) for (int i = 1; i <= emap.Extent(); i++)
evispar[i-1].Lowlight(); evispar[i-1].Lowlight();
for (int i = 1; i <= vmap.Extent(); i++) for (int i = 1; i <= vmap.Extent(); i++)
vvispar[i-1].Lowlight(); vvispar[i-1].Lowlight();
} }
DLL_HEADER void GetUnmeshedFaceInfo (stringstream & str); DLL_HEADER void GetUnmeshedFaceInfo (stringstream & str);
DLL_HEADER void GetNotDrawableFaces (stringstream & str); DLL_HEADER void GetNotDrawableFaces (stringstream & str);
DLL_HEADER bool ErrorInSurfaceMeshing (); DLL_HEADER bool ErrorInSurfaceMeshing ();
// void WriteOCC_STL(char * filename); // void WriteOCC_STL(char * filename);
DLL_HEADER virtual int GenerateMesh (shared_ptr<Mesh> & mesh, MeshingParameters & mparam); DLL_HEADER virtual int GenerateMesh (shared_ptr<Mesh> & mesh, MeshingParameters & mparam);
DLL_HEADER virtual const Refinement & GetRefinement () const; DLL_HEADER virtual const Refinement & GetRefinement () const;
}; };
class DLL_HEADER OCCParameters class DLL_HEADER OCCParameters
{ {
public: public:
/// Factor for meshing close edges /// Factor for meshing close edges
double resthcloseedgefac; double resthcloseedgefac;
/// Enable / Disable detection of close edges /// Enable / Disable detection of close edges
int resthcloseedgeenable; int resthcloseedgeenable;
/// Minimum edge length to be used for dividing edges to mesh points /// Minimum edge length to be used for dividing edges to mesh points
double resthminedgelen; double resthminedgelen;
/// Enable / Disable use of the minimum edge length (by default use 1e-4) /// Enable / Disable use of the minimum edge length (by default use 1e-4)
int resthminedgelenenable; int resthminedgelenenable;
/*! /*!
Default Constructor for the OpenCascade Default Constructor for the OpenCascade
Mesh generation parameter set Mesh generation parameter set
*/ */
OCCParameters(); OCCParameters();
/*! /*!
Dump all the OpenCascade specific meshing parameters Dump all the OpenCascade specific meshing parameters
to console to console
*/ */
void Print (ostream & ost) const; void Print (ostream & ost) const;
}; };
void PrintContents (OCCGeometry * geom); void PrintContents (OCCGeometry * geom);
DLL_HEADER OCCGeometry * LoadOCC_IGES (const char * filename); DLL_HEADER OCCGeometry * LoadOCC_IGES (const char * filename);
DLL_HEADER OCCGeometry * LoadOCC_STEP (const char * filename); DLL_HEADER OCCGeometry * LoadOCC_STEP (const char * filename);
DLL_HEADER OCCGeometry * LoadOCC_BREP (const char * filename); DLL_HEADER OCCGeometry * LoadOCC_BREP (const char * filename);
DLL_HEADER extern OCCParameters occparam; DLL_HEADER extern OCCParameters occparam;
// Philippose - 31.09.2009 // Philippose - 31.09.2009
// External access to the mesh generation functions within the OCC // External access to the mesh generation functions within the OCC
// subsystem (Not sure if this is the best way to implement this....!!) // subsystem (Not sure if this is the best way to implement this....!!)
DLL_HEADER extern int OCCGenerateMesh (OCCGeometry & occgeometry, shared_ptr<Mesh> & mesh, DLL_HEADER extern int OCCGenerateMesh (OCCGeometry & occgeometry, shared_ptr<Mesh> & mesh,
MeshingParameters & mparam); MeshingParameters & mparam);
DLL_HEADER extern void OCCSetLocalMeshSize(OCCGeometry & geom, Mesh & mesh, const MeshingParameters & mparam); DLL_HEADER extern void OCCSetLocalMeshSize(OCCGeometry & geom, Mesh & mesh, const MeshingParameters & mparam);

View File

@ -55,6 +55,7 @@ protected:
public: public:
OCCSurface (const TopoDS_Face & aface, int aprojecttype) OCCSurface (const TopoDS_Face & aface, int aprojecttype)
{ {
static Timer t("occurface ctor"); RegionTimer r(t);
topods_face = aface; topods_face = aface;
occface = BRep_Tool::Surface(topods_face); occface = BRep_Tool::Surface(topods_face);
orient = topods_face.Orientation(); orient = topods_face.Orientation();