X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.hxx;h=65c3f600d9f8e9bd29162044f3c651703b5764db;hb=fd8513f94e2c17a62fb9a654cdbf0d7ea58d6692;hp=f88f1fc08e0732b60c2a42140967ea005f5454e4;hpb=0635c9fc80f67d1e5dc0e94ec85f487286a92070;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MesherHelper.hxx b/src/SMESH/SMESH_MesherHelper.hxx index f88f1fc08..65c3f600d 100644 --- a/src/SMESH/SMESH_MesherHelper.hxx +++ b/src/SMESH/SMESH_MesherHelper.hxx @@ -28,18 +28,19 @@ #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; +typedef std::map TLinkNodeMap; +typedef std::map::iterator ItTLinkNode; /*! * \brief It helps meshers to add elements @@ -90,9 +91,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 @@ -106,6 +106,13 @@ public: return ind; } + /*! + * \brief Return number of unique ancestors of the shape + */ + static int NbAncestors(const TopoDS_Shape& shape, + const SMESH_Mesh& mesh, + TopAbs_ShapeEnum ancestorType=TopAbs_SHAPE); + public: // ---------- PUBLIC INSTANCE METHODS ---------- @@ -118,7 +125,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); /*! @@ -131,6 +138,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 @@ -138,6 +151,15 @@ public: */ void SetElementsOnShape(bool toSet) { mySetElemOnShape = toSet; } + /*! + * \brief Enable/disable checking of node parameters on shapes while adding elements. + * In case of incorrect parameters mudium node place is computed as the middle + * of two nodes. Default is false. + * NOTE that this flag is reset to "not to check" if check with non-default partameter + * is successful + */ + void SetCheckNodePosition(bool toCheck) { myCheckNodePos = toCheck; } + /*! * \brief Set shape to make elements on without calling IsQuadraticSubMesh() */ @@ -228,14 +250,22 @@ public: * \brief Return U of the given node on the edge */ double GetNodeU(const TopoDS_Edge& theEdge, - const SMDS_MeshNode* theNode); + const SMDS_MeshNode* theNode, + 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 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 Check if inFaceNode argument is necessary for call GetNodeUV(F,..) * \retval bool - return true if the face is periodic @@ -309,21 +339,21 @@ public: const SMDS_MeshNode* n2, const bool force3d); /*! - * Auxilary function for filling myNLinkNodeMap + * Auxilary function for filling myTLinkNodeMap */ - 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 + * Auxilary function for filling myTLinkNodeMap */ - 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, @@ -349,7 +379,7 @@ 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; @@ -363,6 +393,7 @@ protected: // to create quadratic elements bool myCreateQuadratic; bool mySetElemOnShape; + bool myCheckNodePos; };