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 Length () { return (p1-p0).Length(); }
};
double Dist (Line l);
double Length (); inline double Det3 (double a00, double a01, double a02,
}; double a10, double a11, double a12,
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;
}
inline double Det3 (double a00, double a01, double a02, class OCCGeometry : public NetgenGeometry
double a10, double a11, double a12, {
double a20, double a21, double a22) Point<3> center;
{
return a00*a11*a22 + a01*a12*a20 + a10*a21*a02 - a20*a11*a02 - a10*a01*a22 - a21*a12*a00;
}
public:
TopoDS_Shape shape;
TopTools_IndexedMapOfShape fmap, emap, vmap, somap, shmap, wmap;
NgArray<bool> fsingular, esingular, vsingular;
Box<3> boundingbox;
NgArray<string> fnames, enames, snames;
// Philippose - 29/01/2009
// OpenCascade XDE Support
// XCAF Handle to make the face colours available to the rest of
// the system
Handle_XCAFDoc_ColorTool face_colours;
mutable int changed;
NgArray<int> facemeshstatus;
// Philippose - 15/01/2009
// Maximum mesh size for a given face
// (Used to explicitly define mesh size limits on individual faces)
NgArray<double> face_maxh;
// Philippose - 14/01/2010
// Boolean array to detect whether a face has been explicitly modified
// by the user or not
NgArray<bool> face_maxh_modified;
// Philippose - 15/01/2009
// 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
// help to extend this to multiple faces)
NgArray<bool> face_sel_status;
NgArray<EntityVisualizationCode> fvispar, evispar, vvispar;
double tolerance;
bool fixsmalledges;
bool fixspotstripfaces;
bool sewfaces;
bool makesolids;
bool splitpartitions;
OCCGeometry()
{
somap.Clear();
shmap.Clear();
fmap.Clear();
wmap.Clear();
emap.Clear();
vmap.Clear();
}
DLL_HEADER virtual void Save (string filename) const;
void DoArchive(Archive& ar);
DLL_HEADER void BuildFMap();
Box<3> GetBoundingBox() const
{ return boundingbox; }
int NrSolids() const
{ return somap.Extent(); }
class OCCGeometry : public NetgenGeometry // Philippose - 17/01/2009
{ // Total number of faces in the geometry
Point<3> center; int NrFaces() const
{ return fmap.Extent(); }
public: void SetCenter()
TopoDS_Shape shape; { center = boundingbox.Center(); }
TopTools_IndexedMapOfShape fmap, emap, vmap, somap, shmap, wmap;
NgArray<bool> fsingular, esingular, vsingular;
Box<3> boundingbox;
NgArray<string> fnames, enames, snames;
// Philippose - 29/01/2009
// OpenCascade XDE Support
// XCAF Handle to make the face colours available to the rest of
// the system
Handle_XCAFDoc_ColorTool face_colours;
mutable int changed; Point<3> Center() const
NgArray<int> facemeshstatus; { return center; }
// Philippose - 15/01/2009 void Project (int surfi, Point<3> & p) const;
// Maximum mesh size for a given face bool FastProject (int surfi, Point<3> & ap, double& u, double& v) const;
// (Used to explicitly define mesh size limits on individual faces)
NgArray<double> face_maxh;
// Philippose - 14/01/2010
// Boolean array to detect whether a face has been explicitly modified
// by the user or not
NgArray<bool> face_maxh_modified;
// Philippose - 15/01/2009 OCCSurface GetSurface (int surfi)
// 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 cout << "OCCGeometry::GetSurface using PLANESPACE" << endl;
// help to extend this to multiple faces) return OCCSurface (TopoDS::Face(fmap(surfi)), PLANESPACE);
NgArray<bool> face_sel_status; }
NgArray<EntityVisualizationCode> fvispar, evispar, vvispar; DLL_HEADER void CalcBoundingBox ();
DLL_HEADER void BuildVisualizationMesh (double deflection);
void RecursiveTopologyTree (const TopoDS_Shape & sh,
stringstream & str,
TopAbs_ShapeEnum l,
bool free,
const char * lname);
double tolerance; DLL_HEADER void GetTopologyTree (stringstream & str);
bool fixsmalledges;
bool fixspotstripfaces;
bool sewfaces;
bool makesolids;
bool splitpartitions;
OCCGeometry() DLL_HEADER void PrintNrShapes ();
{
somap.Clear();
shmap.Clear();
fmap.Clear();
wmap.Clear();
emap.Clear();
vmap.Clear();
}
DLL_HEADER void CheckIrregularEntities (stringstream & str);
DLL_HEADER virtual void Save (string filename) const; DLL_HEADER void SewFaces();
void DoArchive(Archive& ar); DLL_HEADER void MakeSolid();
DLL_HEADER void BuildFMap(); DLL_HEADER void HealGeometry();
Box<3> GetBoundingBox() // Philippose - 15/01/2009
{ return boundingbox;} // Sets the maximum mesh size for a given face
// (Note: Local mesh size limited by the global max mesh size)
int NrSolids() void SetFaceMaxH(int facenr, double faceh, const MeshingParameters & mparam)
{ return somap.Extent();} {
if((facenr> 0) && (facenr <= fmap.Extent()))
// Philippose - 17/01/2009 {
// Total number of faces in the geometry face_maxh[facenr-1] = min(mparam.maxh,faceh);
int NrFaces()
{ return fmap.Extent();}
void SetCenter()
{ center = boundingbox.Center();}
Point<3> Center()
{ return center;}
void Project (int surfi, Point<3> & p) const;
bool FastProject (int surfi, Point<3> & ap, double& u, double& v) const;
OCCSurface GetSurface (int surfi)
{
cout << "OCCGeometry::GetSurface using PLANESPACE" << endl;
return OCCSurface (TopoDS::Face(fmap(surfi)), PLANESPACE);
}
DLL_HEADER void CalcBoundingBox ();
DLL_HEADER void BuildVisualizationMesh (double deflection);
void RecursiveTopologyTree (const TopoDS_Shape & sh,
stringstream & str,
TopAbs_ShapeEnum l,
bool free,
const char * lname);
DLL_HEADER void GetTopologyTree (stringstream & str);
DLL_HEADER void PrintNrShapes ();
DLL_HEADER void CheckIrregularEntities (stringstream & str);
DLL_HEADER void SewFaces();
DLL_HEADER void MakeSolid();
DLL_HEADER void HealGeometry();
// Philippose - 15/01/2009
// Sets the maximum mesh size for a given face
// (Note: Local mesh size limited by the global max mesh size)
void SetFaceMaxH(int facenr, double faceh, const MeshingParameters & mparam)
{
if((facenr> 0) && (facenr <= fmap.Extent()))
{
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();