X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.hxx;h=3fece8a8264aabfc4289f8873b54ccc6d3d3e74f;hb=refs%2Ftags%2Fsmds_memimp_V5_1_4rc1;hp=f9f906240dd4d2c44a76d2ef2ef97479864dc835;hpb=18711ecd04aae33b11daba496d584465d969531c;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MesherHelper.hxx b/src/SMESH/SMESH_MesherHelper.hxx index f9f906240..3fece8a82 100644 --- a/src/SMESH/SMESH_MesherHelper.hxx +++ b/src/SMESH/SMESH_MesherHelper.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -19,6 +19,7 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // File: SMESH_MesherHelper.hxx // Created: 15.02.06 14:48:09 // Author: Sergey KUUL @@ -28,19 +29,31 @@ #include "SMESH_SMESH.hxx" -#include -#include +#include "SMESH_MeshEditor.hxx" // needed for many meshers #include +#include + +#include #include +#include #include -#include #include -typedef std::pair NLink; -typedef std::map NLinkNodeMap; -typedef std::map::iterator ItNLinkNode; +class GeomAPI_ProjectPointOnSurf; + +typedef std::map TLinkNodeMap; +typedef std::map::iterator ItTLinkNode; +typedef SMDS_Iterator PShapeIterator; +typedef boost::shared_ptr< PShapeIterator > PShapeIteratorPtr; + +typedef std::vector TNodeColumn; +typedef std::map< double, TNodeColumn > TParam2ColumnMap; + +typedef gp_XY (*xyFunPtr)(const gp_XY& uv1, const gp_XY& uv2); + +//======================================================================= /*! * \brief It helps meshers to add elements * @@ -49,9 +62,7 @@ typedef std::map::iterator ItNLinkNode; * It defines degree of elements to create when IsQuadraticSubMesh() * is called. */ - -typedef std::vector TNodeColumn; -typedef std::map< double, TNodeColumn > TParam2ColumnMap; +//======================================================================= class SMESH_EXPORT SMESH_MesherHelper { @@ -90,9 +101,8 @@ public: * \param meshDS - mesh DS * \retval TopoDS_Shape - found support shape */ - static const TopoDS_Shape& GetSubShapeByNode(const SMDS_MeshNode* node, - SMESHDS_Mesh* meshDS) - { return meshDS->IndexToShape( node->GetPosition()->GetShapeId() ); } + static TopoDS_Shape GetSubShapeByNode(const SMDS_MeshNode* node, + SMESHDS_Mesh* meshDS); /*! * \brief Return a valid node index, fixing the given one if necessary @@ -112,6 +122,23 @@ public: static int NbAncestors(const TopoDS_Shape& shape, const SMESH_Mesh& mesh, TopAbs_ShapeEnum ancestorType=TopAbs_SHAPE); + /*! + * \brief Return iterator on ancestors of the given type + */ + static PShapeIteratorPtr GetAncestors(const TopoDS_Shape& shape, + const SMESH_Mesh& mesh, + TopAbs_ShapeEnum ancestorType); + + /*! + * \brief Return orientation of sub-shape in the main shape + */ + static TopAbs_Orientation GetSubShapeOri(const TopoDS_Shape& shape, + const TopoDS_Shape& subShape); + + static bool IsSubShape( const TopoDS_Shape& shape, const TopoDS_Shape& mainShape ); + + static bool IsSubShape( const TopoDS_Shape& shape, SMESH_Mesh* aMesh ); + public: // ---------- PUBLIC INSTANCE METHODS ---------- @@ -125,7 +152,7 @@ public: /*! * Check submesh for given shape: if all elements on this shape are quadratic, - * quadratic elements will be created. Also fill myNLinkNodeMap + * quadratic elements will be created. Also fill myTLinkNodeMap */ bool IsQuadraticSubMesh(const TopoDS_Shape& theShape); /*! @@ -138,6 +165,12 @@ public: */ bool GetIsQuadratic() const { return myCreateQuadratic; } + /*! + * \brief Move medium nodes of faces and volumes to fix distorted elements + * \param volumeOnly - fix nodes on geom faces or not if the shape is solid + */ + void FixQuadraticElements(bool volumeOnly=true); + /*! * \brief To set created elements on the shape set by IsQuadraticSubMesh() * or the next methods. By defaul elements are set on the shape if @@ -158,7 +191,7 @@ public: /*! * \brief Return the shape set by IsQuadraticSubMesh() or SetSubShape() */ - TopoDS_Shape GetSubShape() const { return myShape; } + const TopoDS_Shape& GetSubShape() const { return myShape; } /*! * Creates a node @@ -178,7 +211,7 @@ public: const SMDS_MeshNode* n2, const SMDS_MeshNode* n3, const int id=0, - const bool force3d = false); + const bool force3d = false); /*! * Creates quadratic or linear quadrangle */ @@ -187,7 +220,7 @@ public: const SMDS_MeshNode* n3, const SMDS_MeshNode* n4, const int id = 0, - const bool force3d = false); + const bool force3d = false); /*! * Creates quadratic or linear tetraahedron */ @@ -196,7 +229,7 @@ public: const SMDS_MeshNode* n3, const SMDS_MeshNode* n4, const int id = 0, - const bool force3d = true); + const bool force3d = true); /*! * Creates quadratic or linear pyramid */ @@ -206,7 +239,7 @@ public: const SMDS_MeshNode* n4, const SMDS_MeshNode* n5, const int id = 0, - const bool force3d = true); + const bool force3d = true); /*! * Creates quadratic or linear pentahedron */ @@ -217,7 +250,7 @@ public: const SMDS_MeshNode* n5, const SMDS_MeshNode* n6, const int id = 0, - const bool force3d = true); + const bool force3d = true); /*! * Creates quadratic or linear hexahedron */ @@ -230,28 +263,86 @@ public: const SMDS_MeshNode* n7, const SMDS_MeshNode* n8, const int id = 0, - bool force3d = true); + bool force3d = true); /*! * \brief Return U of the given node on the edge */ double GetNodeU(const TopoDS_Edge& theEdge, - const SMDS_MeshNode* theNode); + const SMDS_MeshNode* theNode, + const SMDS_MeshNode* inEdgeNode=0, + bool* check=0); /*! * \brief Return node UV on face - * \param inFaceNode - a node of element being created located inside a face + * \param inFaceNode - a node of element being created located inside a face */ gp_XY GetNodeUV(const TopoDS_Face& F, const SMDS_MeshNode* n, - const SMDS_MeshNode* inFaceNode=0) const; + const SMDS_MeshNode* inFaceNode=0, + bool* check=0) const; + /*! + * \brief Check and fix node UV on a face + * \param force - check even if checks of other nodes on this face passed OK + * \retval bool - false if UV is bad and could not be fixed + */ + bool CheckNodeUV(const TopoDS_Face& F, + const SMDS_MeshNode* n, + gp_XY& uv, + const double tol, + const bool force=false) const; + /*! + * \brief Check and fix node U on an edge + * \param force - check even if checks of other nodes on this edge passed OK + * \retval bool - false if U is bad and could not be fixed + */ + bool CheckNodeU(const TopoDS_Edge& E, + const SMDS_MeshNode* n, + double& u, + const double tol, + const bool force=false) const; + /*! + * \brief Return middle UV taking in account surface period + */ + static gp_XY GetMiddleUV(const Handle(Geom_Surface)& surface, + const gp_XY& uv1, + const gp_XY& uv2); + /*! + * \brief Define a pointer to wrapper over a function of gp_XY class, + * suitable to pass as xyFunPtr to applyIn2D(). + * For exaple gp_XY_FunPtr(Added) defines pointer gp_XY_Added to function + * calling gp_XY::Added(gp_XY), which is to be used like following + * applyIn2D(surf, uv1, uv2, gp_XY_Added) + */ +#define gp_XY_FunPtr(meth) \ + static gp_XY __gpXY_##meth (const gp_XY& uv1, const gp_XY& uv2) { return uv1.meth( uv2 ); } \ + static xyFunPtr gp_XY_##meth = & __gpXY_##meth + + /*! + * \brief Perform given operation on two 2d points in parameric space of given surface. + * It takes into account period of the surface. Use gp_XY_FunPtr macro + * to easily define pointer to function of gp_XY class. + */ + static gp_XY applyIn2D(const Handle(Geom_Surface)& surface, + const gp_XY& uv1, + const gp_XY& uv2, + xyFunPtr fun, + const bool resultInPeriod=true); + /*! * \brief Check if inFaceNode argument is necessary for call GetNodeUV(F,..) * \retval bool - return true if the face is periodic * - * if F is Null, answer about subshape set through IsQuadraticSubMesh() or + * If F is Null, answer about subshape set through IsQuadraticSubMesh() or * SetSubShape() */ bool GetNodeUVneedInFaceNode(const TopoDS_Face& F = TopoDS_Face()) const; + /*! + * \brief Return projector intitialized by given face without location, which is returned + */ + GeomAPI_ProjectPointOnSurf& GetProjector(const TopoDS_Face& F, + TopLoc_Location& loc, + double tol=0 ) const; + /*! * \brief Check if shape is a degenerated edge or it's vertex * \param subShape - edge or vertex index in SMESHDS @@ -261,6 +352,13 @@ public: */ bool IsDegenShape(const int subShape) const { return myDegenShapeIds.find( subShape ) != myDegenShapeIds.end(); } + /*! + * \brief Check if the shape set through IsQuadraticSubMesh() or SetSubShape() + * has a degenerated edges + * \retval bool - true if it has + */ + bool HasDegeneratedEdges() const { return !myDegenShapeIds.empty(); } + /*! * \brief Check if shape is a seam edge or it's vertex * \param subShape - edge or vertex index in SMESHDS @@ -309,28 +407,31 @@ public: */ double GetOtherParam(const double param) const; - /** - * Special function for search or creation medium node + /*! + * \brief Return existing or create new medium nodes between given ones + * \param force3d - true means node creation at the middle between the + * two given nodes, else node position is found on its + * supporting geometrical shape, if any. */ const SMDS_MeshNode* GetMediumNode(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2, const bool force3d); /*! - * Auxilary function for filling myNLinkNodeMap + * \brief Add a link in my data structure */ - void AddNLinkNode(const SMDS_MeshNode* n1, + void AddTLinkNode(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2, const SMDS_MeshNode* n12); - /** - * Auxilary function for filling myNLinkNodeMap + /*! + * \brief Add many links in my data structure */ - void AddNLinkNodeMap(const NLinkNodeMap& aMap) - { myNLinkNodeMap.insert(aMap.begin(), aMap.end()); } + void AddTLinkNodeMap(const TLinkNodeMap& aMap) + { myTLinkNodeMap.insert(aMap.begin(), aMap.end()); } /** - * Returns myNLinkNodeMap + * Returns myTLinkNodeMap */ - const NLinkNodeMap& GetNLinkNodeMap() const { return myNLinkNodeMap; } + const TLinkNodeMap& GetTLinkNodeMap() const { return myTLinkNodeMap; } /** * Check mesh without geometry for: if all elements on this shape are quadratic, @@ -340,6 +441,8 @@ public: enum MType{ LINEAR, QUADRATIC, COMP }; MType IsQuadraticMesh(); + virtual ~SMESH_MesherHelper(); + protected: /*! @@ -356,12 +459,15 @@ protected: SMESH_MesherHelper (const SMESH_MesherHelper& theOther) {}; // special map for using during creation of quadratic elements - NLinkNodeMap myNLinkNodeMap; + TLinkNodeMap myTLinkNodeMap; std::set< int > myDegenShapeIds; std::set< int > mySeamShapeIds; - double myPar1, myPar2; // bounds of a closed periodic surface - int myParIndex; // bounds' index (1-U, 2-V) + double myPar1[2], myPar2[2]; // U and V bounds of a closed periodic surface + int myParIndex; // bounds' index (1-U, 2-V, 3-both) + + typedef std::map< int, GeomAPI_ProjectPointOnSurf* > TID2Projector; + TID2Projector myFace2Projector; TopoDS_Shape myShape; SMESH_Mesh* myMesh; @@ -370,6 +476,7 @@ protected: // to create quadratic elements bool myCreateQuadratic; bool mySetElemOnShape; + std::set< int > myOkNodePosShapes; };