X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.hxx;h=65c3f600d9f8e9bd29162044f3c651703b5764db;hb=40b2818f18601091d81e0d9d749a3fd6808c31ce;hp=41544a3f48304abe137fba028bdcb420a3cd7abd;hpb=79b1ac2b6df9117f16f11d444b1f165d477a1813;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MesherHelper.hxx b/src/SMESH/SMESH_MesherHelper.hxx index 41544a3f4..65c3f600d 100644 --- a/src/SMESH/SMESH_MesherHelper.hxx +++ b/src/SMESH/SMESH_MesherHelper.hxx @@ -1,44 +1,46 @@ -// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// 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 - - +// #ifndef SMESH_MesherHelper_HeaderFile #define SMESH_MesherHelper_HeaderFile #include "SMESH_SMESH.hxx" -#include -#include +#include "SMESH_MeshEditor.hxx" // needed for many meshers #include +#include + +#include #include +#include #include -#include #include -typedef pair NLink; -typedef map NLinkNodeMap; -typedef map::iterator ItNLinkNode; +typedef std::map TLinkNodeMap; +typedef std::map::iterator ItTLinkNode; /*! * \brief It helps meshers to add elements @@ -89,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 @@ -105,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 ---------- @@ -117,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); /*! @@ -130,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 @@ -137,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() */ @@ -227,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 @@ -258,7 +289,8 @@ public: * \param subShape - edge or vertex index in SMESHDS * \retval bool - true if subShape is a seam shape * - * It works only if IsQuadraticSubMesh() or SetSubShape() has been called + * It works only if IsQuadraticSubMesh() or SetSubShape() has been called. + * Seam shape has two 2D alternative represenations on the face */ bool IsSeamShape(const int subShape) const { return mySeamShapeIds.find( subShape ) != mySeamShapeIds.end(); } @@ -267,10 +299,23 @@ public: * \param subShape - edge or vertex * \retval bool - true if subShape is a seam shape * - * It works only if IsQuadraticSubMesh() or SetSubShape() has been called + * It works only if IsQuadraticSubMesh() or SetSubShape() has been called. + * Seam shape has two 2D alternative represenations on the face */ bool IsSeamShape(const TopoDS_Shape& subShape) const { return IsSeamShape( GetMeshDS()->ShapeToIndex( subShape )); } + /*! + * \brief Return true if an edge or a vertex encounters twice in face wire + * \param subShape - Id of edge or vertex + */ + bool IsRealSeam(const int subShape) const + { return mySeamShapeIds.find( -subShape ) != mySeamShapeIds.end(); } + /*! + * \brief Return true if an edge or a vertex encounters twice in face wire + * \param subShape - edge or vertex + */ + bool IsRealSeam(const TopoDS_Shape& subShape) const + { return IsRealSeam( GetMeshDS()->ShapeToIndex( subShape)); } /*! * \brief Check if the shape set through IsQuadraticSubMesh() or SetSubShape() * has a seam edge @@ -282,6 +327,10 @@ public: * \retval int - 1 for U, 2 for V direction */ int GetPeriodicIndex() const { return myParIndex; } + /*! + * \brief Return an alternative parameter for a node on seam + */ + double GetOtherParam(const double param) const; /** * Special function for search or creation medium node @@ -290,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, @@ -330,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; @@ -344,6 +393,7 @@ protected: // to create quadratic elements bool myCreateQuadratic; bool mySetElemOnShape; + bool myCheckNodePos; };