X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MeshEditor.hxx;h=1874360a79fdda983309e0359d18dea871d32e7e;hb=ac003a0da5e5603dcb3735d807ee10a0521b9840;hp=d9f4b5d28a737e19894bb570146b6c9f0cb7f594;hpb=9357f5c87098aff2b95b754d69f66c76d2df9c24;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index d9f4b5d28..1874360a7 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -1,26 +1,25 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 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 +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// 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. +// 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. // -// 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 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. // -// 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 +// 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses // File : SMESH_MeshEditor.hxx // Created : Mon Apr 12 14:56:19 2004 // Author : Edward AGAPOV (eap) @@ -34,8 +33,8 @@ #include "SMDS_MeshElement.hxx" #include "SMESH_Controls.hxx" #include "SMESH_Mesh.hxx" -#include "SMESH_SequenceOfElemPtr.hxx" -#include "SMESH_SequenceOfNode.hxx" +#include "SMESH_TypeDefs.hxx" +#include "SMESH_ComputeError.hxx" #include @@ -54,16 +53,6 @@ class gp_Pnt; class SMESH_MesherHelper; -typedef std::map > TElemOfElemListMap; -typedef std::map TNodeNodeMap; - -//!< Set of elements sorted by ID, to be used to assure predictability of edition -typedef std::set< const SMDS_MeshElement*, TIDCompare > TIDSortedElemSet; - -typedef pair< const SMDS_MeshNode*, const SMDS_MeshNode* > NLink; - - //======================================================================= /*! * \brief Searcher for the node closest to point @@ -77,50 +66,37 @@ struct SMESH_NodeSearcher //======================================================================= /*! - * \brief Find elements of given type where the given point is IN or ON. - * Returns nb of found elements and elements them-selves. - * Another task is to find out if the given point is out of closed 2D mesh. - * - * 'ALL' type means elements of any type excluding nodes and 0D elements + * \brief Searcher for elements */ //======================================================================= struct SMESH_ElementSearcher { + /*! + * \brief Find elements of given type where the given point is IN or ON. + * Returns nb of found elements and elements them-selves. + * + * 'ALL' type means elements of any type excluding nodes and 0D elements + */ virtual int FindElementsByPoint(const gp_Pnt& point, SMDSAbs_ElementType type, std::vector< const SMDS_MeshElement* >& foundElems)=0; - + /*! + * \brief Return an element most close to the given point + */ + virtual const SMDS_MeshElement* FindClosestTo( const gp_Pnt& point, + SMDSAbs_ElementType type) = 0; + /*! + * \brief Return elements possibly intersecting the line + */ + virtual void GetElementsNearLine( const gp_Ax1& line, + SMDSAbs_ElementType type, + std::vector< const SMDS_MeshElement* >& foundElems)=0; + /*! + * \brief Find out if the given point is out of closed 2D mesh. + */ virtual TopAbs_State GetPointState(const gp_Pnt& point) = 0; -}; -//======================================================================= -/*! - * \brief A sorted pair of nodes - */ -//======================================================================= - -struct SMESH_TLink: public NLink -{ - SMESH_TLink(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2 ):NLink( n1, n2 ) - { if ( n1->GetID() < n2->GetID() ) std::swap( first, second ); } - SMESH_TLink(const NLink& link ):NLink( link ) - { if ( first->GetID() < second->GetID() ) std::swap( first, second ); } - const SMDS_MeshNode* node1() const { return first; } - const SMDS_MeshNode* node2() const { return second; } -}; - -//======================================================================= -/*! - * \brief SMESH_TLink knowing its orientation - */ -//======================================================================= - -struct SMESH_OrientedLink: public SMESH_TLink -{ - bool _reversed; - SMESH_OrientedLink(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2 ) - : SMESH_TLink( n1, n2 ), _reversed( n1 != node1() ) {} }; // ============================================================ @@ -131,47 +107,35 @@ struct SMESH_OrientedLink: public SMESH_TLink class SMESH_EXPORT SMESH_MeshEditor { -public: - //------------------------------------------ - /*! - * \brief SMDS_MeshNode -> gp_XYZ convertor - */ - //------------------------------------------ - struct TNodeXYZ : public gp_XYZ - { - const SMDS_MeshNode* _node; - TNodeXYZ( const SMDS_MeshElement* e):gp_XYZ(0,0,0),_node(0) { - if (e) { - ASSERT( e->GetType() == SMDSAbs_Node ); - _node = static_cast(e); - SetCoord( _node->X(), _node->Y(), _node->Z() ); - } - } - double Distance(const SMDS_MeshNode* n) const { return (TNodeXYZ( n )-*this).Modulus(); } - double SquareDistance(const SMDS_MeshNode* n) const { return (TNodeXYZ( n )-*this).SquareModulus(); } - bool operator==(const TNodeXYZ& other) const { return _node == other._node; } - }; - public: SMESH_MeshEditor( SMESH_Mesh* theMesh ); + SMESH_Mesh * GetMesh() { return myMesh; } + SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); } + + const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; } + const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; } + + SMESH_ComputeErrorPtr & GetError() { return myError; } + /*! * \brief Add element */ SMDS_MeshElement* AddElement(const std::vector & nodes, const SMDSAbs_ElementType type, const bool isPoly, - const int ID = 0); + const int ID = -1, + const double ballDiameter=0.); /*! * \brief Add element */ SMDS_MeshElement* AddElement(const std::vector & nodeIDs, const SMDSAbs_ElementType type, const bool isPoly, - const int ID = 0); + const int ID = -1); - bool Remove (const std::list< int >& theElemIDs, const bool isNodes); + int Remove (const std::list< int >& theElemIDs, const bool isNodes); // Remove a node or an element. // Modify a compute state of sub-meshes which become empty @@ -196,6 +160,11 @@ public: bool Reorient (const SMDS_MeshElement * theElement); // Reverse theElement orientation + int Reorient2D (TIDSortedElemSet & theFaces, + const gp_Dir& theDirection, + const SMDS_MeshElement * theFace); + // Reverse theFaces whose orientation to be same as that of theFace + // oriented according to theDirection. Return nb of reoriented faces /*! * \brief Fuse neighbour triangles into quadrangles. @@ -203,7 +172,7 @@ public: * \param theCriterion - Is used to choose a neighbour to fuse with. * \param theMaxAngle - Is a max angle between element normals at which fusion * is still performed; theMaxAngle is mesured in radians. - * \retval bool - Success or not. + * \return bool - Success or not. */ bool TriToQuad (TIDSortedElemSet & theElems, SMESH::Controls::NumericalFunctorPtr theCriterion, @@ -213,7 +182,7 @@ public: * \brief Split quadrangles into triangles. * \param theElems - The faces to be splitted. * \param theCriterion - Is used to choose a diagonal for splitting. - * \retval bool - Success or not. + * \return bool - Success or not. */ bool QuadToTri (TIDSortedElemSet & theElems, SMESH::Controls::NumericalFunctorPtr theCriterion); @@ -222,7 +191,7 @@ public: * \brief Split quadrangles into triangles. * \param theElems - The faces to be splitted. * \param the13Diag - Is used to choose a diagonal for splitting. - * \retval bool - Success or not. + * \return bool - Success or not. */ bool QuadToTri (TIDSortedElemSet & theElems, const bool the13Diag); @@ -231,13 +200,13 @@ public: * \brief Find better diagonal for splitting. * \param theQuad - The face to find better splitting of. * \param theCriterion - Is used to choose a diagonal for splitting. - * \retval int - 1 for 1-3 diagonal, 2 for 2-4, -1 - for errors. + * \return int - 1 for 1-3 diagonal, 2 for 2-4, -1 - for errors. */ int BestSplit (const SMDS_MeshElement* theQuad, SMESH::Controls::NumericalFunctorPtr theCriterion); - enum SplitVolumToTetraFlags { HEXA_TO_5 = 1, HEXA_TO_6 = 2 };//!& theScaleFact, - const bool theCopy, - const bool theMakeGroups, - SMESH_Mesh* theTargetMesh=0); - typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes; - void FindCoincidentNodes (std::set & theNodes, - const double theTolerance, - TListOfListOfNodes & theGroupsOfNodes); + void FindCoincidentNodes (TIDSortedNodeSet & theNodes, + const double theTolerance, + TListOfListOfNodes & theGroupsOfNodes); // Return list of group of nodes close to each other within theTolerance. // Search among theNodes or in the whole mesh if theNodes is empty. /*! - * \brief Return SMESH_NodeSearcher + * \brief Return SMESH_NodeSearcher. The caller is responsible for deleteing it */ SMESH_NodeSearcher* GetNodeSearcher(); /*! - * \brief Return SMESH_ElementSearcher + * \brief Return SMESH_ElementSearcher. The caller is responsible for deleting it */ SMESH_ElementSearcher* GetElementSearcher(); + SMESH_ElementSearcher* GetElementSearcher( SMDS_ElemIteratorPtr elemIt ); /*! * \brief Return true if the point is IN or ON of the element */ - static bool isOut( const SMDS_MeshElement* element, const gp_Pnt& point, double tol ); + static bool IsOut( const SMDS_MeshElement* element, const gp_Pnt& point, double tol ); + static double GetDistance( const SMDS_MeshFace* face, const gp_Pnt& point ); int SimplifyFace (const std::vector faceNodes, std::vector& poly_nodes, @@ -532,12 +486,20 @@ public: // theBetweenNode1 - theBetweenNode2, between theBetweenNode1 and theBetweenNode2. void ConvertToQuadratic(const bool theForce3d); - //converts all mesh to quadratic one, deletes old elements, replacing - //them with quadratic ones with the same id. + void ConvertToQuadratic(const bool theForce3d, TIDSortedElemSet& theElements); + // Converts all mesh to quadratic one, deletes old elements, replacing + // them with quadratic ones with the same id. + // If theForce3d = 1; this results in the medium node lying at the + // middle of the line segments connecting start and end node of a mesh + // element + // If theForce3d = 0; this results in the medium node lying at the + // geometrical edge from which the mesh element is built bool ConvertFromQuadratic(); - //converts all mesh from quadratic to ordinary ones, deletes old quadratic elements, replacing - //them with ordinary mesh elements with the same id. + void ConvertFromQuadratic(TIDSortedElemSet& theElements); + // Converts all mesh from quadratic to ordinary ones, deletes old quadratic elements, replacing + // them with ordinary mesh elements with the same id. + // Returns true in case of success, false otherwise. static void AddToSameGroups (const SMDS_MeshElement* elemToAdd, const SMDS_MeshElement* elemInGroups, @@ -585,7 +547,7 @@ public: * \param theSecondNode1 - a boundary node of set 1 linked with theFirstNode1 * \param theSecondNode2 - a node of set 2 corresponding to theSecondNode1 * \param nReplaceMap - output map of corresponding nodes - * \retval Sew_Error - is a success or not + * \return Sew_Error - is a success or not */ static Sew_Error FindMatchingNodes(std::set& theSide1, std::set& theSide2, @@ -599,7 +561,7 @@ public: * \brief Returns true if given node is medium * \param n - node to check * \param typeToCheck - type of elements containing the node to ask about node status - * \retval bool - check result + * \return bool - check result */ static bool IsMedium(const SMDS_MeshNode* node, const SMDSAbs_ElementType typeToCheck = SMDSAbs_All); @@ -608,14 +570,6 @@ public: // Return an index of the shape theElem is on // or zero if a shape not found - SMESH_Mesh * GetMesh() { return myMesh; } - - SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); } - - const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; } - - const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; } - bool DoubleNodes( const std::list< int >& theListOfNodes, const std::list< int >& theListOfModifiedElems ); @@ -623,22 +577,53 @@ public: const TIDSortedElemSet& theNodesNot, const TIDSortedElemSet& theAffectedElems ); + bool AffectedElemGroupsInRegion( const TIDSortedElemSet& theElems, + const TIDSortedElemSet& theNodesNot, + const TopoDS_Shape& theShape, + TIDSortedElemSet& theAffectedElems); + bool DoubleNodesInRegion( const TIDSortedElemSet& theElems, const TIDSortedElemSet& theNodesNot, const TopoDS_Shape& theShape ); + double OrientedAngle(const gp_Pnt& p0, const gp_Pnt& p1, const gp_Pnt& g1, const gp_Pnt& g2); + + bool DoubleNodesOnGroupBoundaries( const std::vector& theElems, + bool createJointElems); + + bool CreateFlatElementsOnFacesGroups( const std::vector& theElems ); + + void CreateHoleSkin(double radius, + const TopoDS_Shape& theShape, + SMESH_NodeSearcher* theNodeSearcher, + const char* groupName, + std::vector& nodesCoords, + std::vector >& listOfListOfNodes); + /*! * \brief Generated skin mesh (containing 2D cells) from 3D mesh * The created 2D mesh elements based on nodes of free faces of boundary volumes * \return TRUE if operation has been completed successfully, FALSE otherwise */ bool Make2DMeshFrom3D(); - -private: + + enum Bnd_Dimension { BND_2DFROM3D, BND_1DFROM3D, BND_1DFROM2D }; + + int MakeBoundaryMesh(const TIDSortedElemSet& elements, + Bnd_Dimension dimension, + SMESH_Group* group = 0, + SMESH_Mesh* targetMesh = 0, + bool toCopyElements = false, + bool toCopyExistingBondary = false, + bool toAddExistingBondary = false, + bool aroundElements = false); + + + private: /*! * \brief Convert elements contained in a submesh to quadratic - * \retval int - nb of checked elements + * \return int - nb of checked elements */ int convertElemToQuadratic(SMESHDS_SubMesh * theSm, SMESH_MesherHelper& theHelper, @@ -646,7 +631,7 @@ private: /*! * \brief Convert quadratic elements to linear ones and remove quadratic nodes - * \retval int - nb of checked elements + * \return nb of checked elements */ int removeQuadElem( SMESHDS_SubMesh * theSm, SMDS_ElemIteratorPtr theItr, @@ -670,11 +655,11 @@ private: /*! * \brief Create elements by sweeping an element - * \param elem - element to sweep - * \param newNodesItVec - nodes generated from each node of the element - * \param newElems - generated elements - * \param nbSteps - number of sweeping steps - * \param srcElements - to append elem for each generated element + * \param elem - element to sweep + * \param newNodesItVec - nodes generated from each node of the element + * \param newElems - generated elements + * \param nbSteps - number of sweeping steps + * \param srcElements - to append elem for each generated element */ void sweepElement(const SMDS_MeshElement* elem, const std::vector & newNodesItVec, @@ -684,12 +669,12 @@ private: /*! * \brief Create 1D and 2D elements around swept elements - * \param mapNewNodes - source nodes and ones generated from them - * \param newElemsMap - source elements and ones generated from them - * \param elemNewNodesMap - nodes generated from each node of each element - * \param elemSet - all swept elements - * \param nbSteps - number of sweeping steps - * \param srcElements - to append elem for each generated element + * \param mapNewNodes - source nodes and ones generated from them + * \param newElemsMap - source elements and ones generated from them + * \param elemNewNodesMap - nodes generated from each node of each element + * \param elemSet - all swept elements + * \param nbSteps - number of sweeping steps + * \param srcElements - to append elem for each generated element */ void makeWalls (TNodeOfNodeListMap & mapNewNodes, TElemOfElemListMap & newElemsMap, @@ -737,18 +722,13 @@ private: private: - SMESH_Mesh * myMesh; - - /*! - * Sequence for keeping nodes created during last operation - */ - SMESH_SequenceOfElemPtr myLastCreatedNodes; + SMESH_Mesh * myMesh; - /*! - * Sequence for keeping elements created during last operation - */ - SMESH_SequenceOfElemPtr myLastCreatedElems; + // Nodes and elements created during last operation + SMESH_SequenceOfElemPtr myLastCreatedNodes, myLastCreatedElems; + // Description of error/warning occured during last operation + SMESH_ComputeErrorPtr myError; }; #endif