X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Pattern.hxx;h=9699064ad5567b4cd7419a7af28fcf36d06d9530;hp=9358fae472122de0bdfb69a72636297efdf952cc;hb=9d11375af40826e967ab2c3bcb77d1f9d439c90c;hpb=ed456586bfb1411c5bff73b221658766689a6253 diff --git a/src/SMESH/SMESH_Pattern.hxx b/src/SMESH/SMESH_Pattern.hxx index 9358fae47..9699064ad 100644 --- a/src/SMESH/SMESH_Pattern.hxx +++ b/src/SMESH/SMESH_Pattern.hxx @@ -15,7 +15,7 @@ // 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // File : SMESH_Pattern.hxx // Created : Mon Aug 2 10:30:00 2004 @@ -24,9 +24,12 @@ #ifndef SMESH_Pattern_HeaderFile #define SMESH_Pattern_HeaderFile +#include "SMESH_SMESH.hxx" + #include #include #include +#include #include #include @@ -35,7 +38,12 @@ #include #include +class SMDS_MeshElement; +class SMDS_MeshFace; +class SMDS_MeshVolume; +class SMDS_MeshNode; class SMESH_Mesh; +class SMESHDS_SubMesh; class TopoDS_Shell; class TopoDS_Vertex; class TopoDS_Face; @@ -47,7 +55,7 @@ class TopoDS_Edge; // of 6 faces. // -class SMESH_Pattern { +class SMESH_EXPORT SMESH_Pattern { public: SMESH_Pattern (); @@ -56,11 +64,11 @@ class SMESH_Pattern { // clear fields bool Load (const char* theFileContents); - // Load a pattern from + // Load a pattern from bool Load (SMESH_Mesh* theMesh, const TopoDS_Face& theFace, - bool theProject); + bool theProject = false); // Create a pattern from the mesh built on . // ==true makes override nodes positions // on computed by mesher @@ -88,15 +96,50 @@ class SMESH_Pattern { // will be mapped into . The // (0,0,1) key-point will be mapped into . - bool GetMappedPoints ( std::list & thePoints ); + bool Apply (const SMDS_MeshFace* theFace, + const int theNodeIndexOnKeyPoint1, + const bool theReverse); + // Compute nodes coordinates applying + // 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); + // Compute nodes coordinates applying + // the loaded pattern to . The first key-point + // will be mapped into -th node + + bool Apply (const SMDS_MeshVolume* theVolume, + 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 + // (0,0,1) key-point will be mapped into -th + // node. + + 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 + // (0,0,1) key-point will be mapped into -th + // node. + + 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 - + // ---------- // Inquiries + // ---------- enum ErrorCode { ERR_OK, @@ -117,6 +160,7 @@ class SMESH_Pattern { // Load(face) ERR_LOADF_NARROW_FACE, // too narrow face ERR_LOADF_CLOSED_FACE, // closed face + ERR_LOADF_CANT_PROJECT, // impossible to project nodes // Load(volume) ERR_LOADV_BAD_SHAPE, // volume is not a brick of 6 faces ERR_LOADV_COMPUTE_PARAMS, // cant compute point parameters @@ -131,6 +175,8 @@ class SMESH_Pattern { ERR_APPLF_INTERNAL_EEROR, // program error // Apply(volume) ERR_APPLV_BAD_SHAPE, // volume is not a brick of 6 faces + // Apply(mesh_face) + ERR_APPLF_BAD_FACE_GEOM, // bad face geometry // MakeMesh ERR_MAKEM_NOT_COMPUTED // mapping failed }; @@ -151,15 +197,25 @@ class SMESH_Pattern { // Return indices of key-points within the sequences returned by // GetPoints() and GetMappedPoints() - const std::list< std::list< int > >& GetElementPointIDs () const - { return myElemPointIDs; } + const std::list< std::list< int > >& GetElementPointIDs (bool applied) const + { return myElemXYZIDs.empty() || !applied ? myElemPointIDs : myElemXYZIDs; } // Return nodal connectivity of the elements of the pattern void DumpPoints() const; // Debug + // ----------------------------- + // Utilities for advanced usage + // ----------------------------- - private: + TopoDS_Shape GetSubShape( const int i ) const { + if ( i < 1 || i > myShapeIDMap.Extent() ) return TopoDS_Shape(); + return myShapeIDMap( i ); + } + // Return a shape from myShapeIDMap where shapes are indexed so that first go + // ordered vertices, then ordered edge, then faces and maybe a shell + +private: // private methods struct TPoint { @@ -230,27 +286,89 @@ class SMESH_Pattern { // of boundaries; after sorting, edges in the wires are put // in a good order, point UVs on edges are computed and points // are appended to theEdgesPointsList + + typedef std::set TNodeSet; + + 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 a shell - TopTools_IndexedMapOfOrientedShape myShapeIDMap; - //TopTools_IndexedMapOfShape myShapeIDMap; - std::map< int, list< TPoint* > > myShapeIDToPointsMap; + // ordered vertices, then ordered edge, then faces and maybe a shell + TopTools_IndexedMapOfOrientedShape myShapeIDMap; + std::map< int, list< TPoint* > > myShapeIDToPointsMap; - std::list< int > myNbKeyPntInBoundary; //for the 2d case + // for the 2d case: + // nb of key-points in each of pattern boundaries + std::list< int > myNbKeyPntInBoundary; + + + // to compute while applying to mesh elements, not to shapes + + 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; };