X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MeshEditor.hxx;h=ce52a9c051c342ac2a049cb0fa19b1c929982b36;hb=9645435524d6601ce3d0da6d226d9c11991d864e;hp=337ce138df8d664a23e0c57f9e0a0c53efa4e159;hpb=59fe802c137b0b00d131ed88462157577f64eae5;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index 337ce138d..ce52a9c05 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) @@ -35,6 +34,7 @@ #include "SMESH_Controls.hxx" #include "SMESH_Mesh.hxx" #include "SMESH_TypeDefs.hxx" +#include "SMESH_ComputeError.hxx" #include @@ -66,28 +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; - - virtual TopAbs_State GetPointState(const gp_Pnt& point) = 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; + }; // ============================================================ @@ -102,13 +111,23 @@ 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; } + void CrearLastCreated(); + + 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 = -1); + const int ID = -1, + const double ballDiameter=0.); /*! * \brief Add element */ @@ -121,6 +140,12 @@ public: // Remove a node or an element. // Modify a compute state of sub-meshes which become empty + void Create0DElementsOnAllNodes( const TIDSortedElemSet& elements, + TIDSortedElemSet& all0DElems); + // Create 0D elements on all nodes of the given object except those + // nodes on which a 0D element already exists. \a all0DElems returns + // all 0D elements found or created on nodes of \a elements + bool InverseDiag (const SMDS_MeshElement * theTria1, const SMDS_MeshElement * theTria2 ); // Replace two neighbour triangles with ones built on the same 4 nodes @@ -142,6 +167,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. @@ -149,7 +179,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, @@ -159,7 +189,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); @@ -168,7 +198,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); @@ -177,7 +207,7 @@ 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); @@ -230,7 +260,7 @@ public: }; /*! - * special structire for control of extrusion functionality + * special structure for control of extrusion functionality */ struct ExtrusParam { gp_Dir myDir; // direction of extrusion @@ -240,7 +270,7 @@ public: /*! * Create new node in the mesh with given coordinates - * (auxilary for advanced extrusion) + * (auxiliary for advanced extrusion) */ const SMDS_MeshNode* CreateNode(const double x, const double y, @@ -252,12 +282,12 @@ public: * Generate new elements by extrusion of theElements * It is a method used in .idl file. All functionality * is implemented in the next method (see below) which - * is used in the cuurent method. - * param theElems - list of elements for extrusion - * param newElemsMap returns history of extrusion - * param theFlags set flags for performing extrusion (see description + * is used in the current method. + * @param theElems - list of elements for extrusion + * @param newElemsMap returns history of extrusion + * @param theFlags set flags for performing extrusion (see description * of enum ExtrusionFlags for additional information) - * param theTolerance - uses for comparing locations of nodes if flag + * @param theTolerance - uses for comparing locations of nodes if flag * EXTRUSION_FLAG_SEW is set */ PGroupIDs ExtrusionSweep (TIDSortedElemSet & theElems, @@ -270,13 +300,13 @@ public: /*! * Generate new elements by extrusion of theElements - * param theElems - list of elements for extrusion - * param newElemsMap returns history of extrusion - * param theFlags set flags for performing extrusion (see description + * @param theElems - list of elements for extrusion + * @param newElemsMap returns history of extrusion + * @param theFlags set flags for performing extrusion (see description * of enum ExtrusionFlags for additional information) - * param theTolerance - uses for comparing locations of nodes if flag + * @param theTolerance - uses for comparing locations of nodes if flag * EXTRUSION_FLAG_SEW is set - * param theParams - special structure for manage of extrusion + * @param theParams - special structure for manage of extrusion */ PGroupIDs ExtrusionSweep (TIDSortedElemSet & theElems, ExtrusParam& theParams, @@ -327,36 +357,24 @@ public: SMESH_Mesh* theTargetMesh=0); // Move or copy theElements applying theTrsf to their nodes - - typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes; - - 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. The caller is responsible for deleteing it */ SMESH_NodeSearcher* GetNodeSearcher(); /*! - * \brief Return SMESH_ElementSearcher. The caller is responsible for deleteing it + * \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 ); + typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes; - int SimplifyFace (const std::vector faceNodes, - std::vector& poly_nodes, - std::vector& quantities) const; - // Split face, defined by , into several faces by repeating nodes. - // Is used by MergeNodes() + 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. void MergeNodes (TListOfListOfNodes & theNodeGroups); // In each group, the cdr of nodes are substituted by the first one @@ -364,8 +382,8 @@ public: typedef std::list< std::list< int > > TListOfListOfElementsID; - void FindEqualElements(std::set & theElements, - TListOfListOfElementsID & theGroupsOfElementsID); + void FindEqualElements(TIDSortedElemSet & theElements, + TListOfListOfElementsID & theGroupsOfElementsID); // Return list of group of elements build on the same nodes. // Search among theElements or in the whole mesh if theElements is empty. @@ -376,6 +394,19 @@ public: // Remove all but one of elements built on the same nodes. // Return nb of successfully merged groups. + /*! + * \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 double GetDistance( const SMDS_MeshFace* face, const gp_Pnt& point ); + + int SimplifyFace (const std::vector faceNodes, + std::vector& poly_nodes, + std::vector& quantities) const; + // Split face, defined by , into several faces by repeating nodes. + // Is used by MergeNodes() + static bool CheckFreeBorderNodes(const SMDS_MeshNode* theNode1, const SMDS_MeshNode* theNode2, const SMDS_MeshNode* theNode3 = 0); @@ -523,7 +554,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, @@ -537,7 +568,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); @@ -546,14 +577,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 ); @@ -561,13 +584,29 @@ 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 @@ -591,7 +630,7 @@ public: /*! * \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, @@ -599,7 +638,7 @@ public: /*! * \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, @@ -623,11 +662,11 @@ public: /*! * \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, @@ -637,12 +676,12 @@ public: /*! * \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, @@ -690,18 +729,13 @@ public: 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