X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Pattern.hxx;h=e49b498ecb838b6868d403333fb2b0b3feeadee6;hp=670578ce459d1e04bfb6eab8028309fb57c9d848;hb=d5f8c39955a2ef0d57238a360a746268994e549a;hpb=e465982eeb48dded773c5e18053a8da7fcf15222 diff --git a/src/SMESH/SMESH_Pattern.hxx b/src/SMESH/SMESH_Pattern.hxx index 670578ce4..e49b498ec 100644 --- a/src/SMESH/SMESH_Pattern.hxx +++ b/src/SMESH/SMESH_Pattern.hxx @@ -41,6 +41,7 @@ class SMDS_MeshFace; class SMDS_MeshVolume; class SMDS_MeshNode; class SMESH_Mesh; +class SMESHDS_SubMesh; class TopoDS_Shell; class TopoDS_Vertex; class TopoDS_Face; @@ -100,9 +101,9 @@ class SMESH_Pattern { // the loaded pattern to . The first key-point // will be mapped into -th node - bool Apply (std::set theFaces, - const int theNodeIndexOnKeyPoint1, - const bool theReverse); + bool Apply (std::set& theFaces, + const int theNodeIndexOnKeyPoint1, + const bool theReverse); // Compute nodes coordinates applying // the loaded pattern to . The first key-point // will be mapped into -th node @@ -116,9 +117,9 @@ class SMESH_Pattern { // (0,0,1) key-point will be mapped into -th // node. - bool Apply (std::set theVolumes, - const int theNode000Index, - const int theNode001Index); + bool Apply (std::set& theVolumes, + const int theNode000Index, + const int theNode001Index); // Compute nodes coordinates applying // the loaded pattern to . The (0,0,0) key-point // will be mapped into -th node. The @@ -128,7 +129,9 @@ class SMESH_Pattern { bool GetMappedPoints ( std::list & thePoints ) const; // Return nodes coordinates computed by Apply() method - bool MakeMesh(SMESH_Mesh* theMesh); + bool MakeMesh(SMESH_Mesh* theMesh, + const bool toCreatePolygons = false, + const bool toCreatePolyedrs = false); // Create nodes and elements in using nodes // coordinates computed by either of Apply...() methods @@ -271,41 +274,87 @@ class SMESH_Pattern { // are appended to theEdgesPointsList typedef std::set TNodeSet; - void mergePoints (std::map > >& xyzIndGroups, - std::map< int, std::list< std::list< int >* > >& reverseConnectivity); - // Look for coincident points between myXYZs indexed with - // list of each element of xyzIndGroups. Coincident indices - // are merged in myElemXYZIDs using reverseConnectivity. + + void mergePoints (const bool uniteGroups); + // Merge XYZ on edges and/or faces. + + void makePolyElements(const std::vector< const SMDS_MeshNode* >& theNodes, + const bool toCreatePolygons, + const bool toCreatePolyedrs); + // prepare intermediate data to create Polygons and Polyhedrons + + void createElements(SMESH_Mesh* theMesh, + const std::vector& theNodesVector, + const std::list< std::list< int > > & theElemNodeIDs, + const std::vector& theElements); + // add elements to the mesh + + bool getFacesDefinition(const SMDS_MeshNode** theBndNodes, + const int theNbBndNodes, + const std::vector< const SMDS_MeshNode* >& theNodes, + std::list< int >& theFaceDefs, + std::vector& theQuantity); + // fill faces definition for a volume face defined by theBndNodes + // return true if a face definition changes + + + bool isReversed(const SMDS_MeshNode* theFirstNode, + const std::list< int >& theIdsList) const; + // check xyz ids order in theIdsList taking into account + // theFirstNode on a link + + void clearMesh(SMESH_Mesh* theMesh) const; + // clear mesh elements existing on myShape in theMesh + + static SMESHDS_SubMesh * getSubmeshWithElements(SMESH_Mesh* theMesh, + const TopoDS_Shape& theShape); + // return submesh containing elements bound to theShape in theMesh private: // fields - bool myIs2D; - std::vector< TPoint > myPoints; - std::list< int > myKeyPointIDs; - std::list< std::list< int > > myElemPointIDs; + typedef std::list< int > TElemDef; // element definition is its nodes ids + + bool myIs2D; + std::vector< TPoint > myPoints; + std::list< int > myKeyPointIDs; + std::list< TElemDef > myElemPointIDs; - ErrorCode myErrorCode; - bool myIsComputed; - bool myIsBoundaryPointsFound; + ErrorCode myErrorCode; + bool myIsComputed; + bool myIsBoundaryPointsFound; - TopoDS_Shape myShape; + TopoDS_Shape myShape; // all functions assure that shapes are indexed so that first go // ordered vertices, then ordered edge, then faces and maybe a shell - TopTools_IndexedMapOfOrientedShape myShapeIDMap; - //TopTools_IndexedMapOfShape myShapeIDMap; - std::map< int, list< TPoint* > > myShapeIDToPointsMap; + TopTools_IndexedMapOfOrientedShape myShapeIDMap; + std::map< int, list< TPoint* > > myShapeIDToPointsMap; // for the 2d case: // nb of key-points in each of pattern boundaries - std::list< int > myNbKeyPntInBoundary; + std::list< int > myNbKeyPntInBoundary; + // to compute while applying to mesh elements, not to shapes - std::vector myXYZ; - std::list< std::list< int > > myElemXYZIDs; - std::map< int, const SMDS_MeshNode*> myXYZIdToNodeMap; // map id to node of a refined element - std::vector myElements; // refined elements - std::vector myOrderedNodes; + + std::vector myXYZ; // XYZ of nodes to create + std::list< TElemDef > myElemXYZIDs; // new elements definitions + std::map< int, const SMDS_MeshNode*> myXYZIdToNodeMap; // map XYZ id to node of a refined element + std::vector myElements; // refined elements + std::vector myOrderedNodes; + + // elements to replace with polygon or polyhedron + std::vector myPolyElems; + // definitions of new poly elements + std::list< TElemDef > myPolyElemXYZIDs; + std::list< std::vector > myPolyhedronQuantities; + + // map a boundary to XYZs on it; + // a boundary (edge or face) is defined as a set of its nodes, + // XYZs on a boundary are indices of myXYZ s + std::map > > myIdsOnBoundary; + // map XYZ id to element it is in + std::map< int, std::list< TElemDef* > > myReverseConnectivity; };