X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHDS%2FSMESHDS_Mesh.hxx;h=a5a54907b5855004ce5d61545f54cc4809ecebd5;hp=6159a4fca69bb143cdc7bd1520d4894cee54436b;hb=e83db15137230fbe580ba47c5d9f28aacb2aca9e;hpb=bef85377644b6a909a8f798c46362b898d43be3b diff --git a/src/SMESHDS/SMESHDS_Mesh.hxx b/src/SMESHDS/SMESHDS_Mesh.hxx index 6159a4fca..a5a54907b 100644 --- a/src/SMESHDS/SMESHDS_Mesh.hxx +++ b/src/SMESHDS/SMESHDS_Mesh.hxx @@ -38,113 +38,274 @@ #include #include +#include #include #include #include #include +#include +#ifdef WNT +#include +#endif //Not portable see http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_4 to know more. #ifdef __GNUC__ -#if __GNUC__ < 3 - #include -#else - #include - using namespace __gnu_cxx; + #if __GNUC__ < 3 + #include + namespace gstd { using ::hash_map; }; // inherit globals + #elif __GNUC__ == 3 + #include + #if __GNUC_MINOR__ == 0 + namespace gstd = std; // GCC 3.0 + #else + namespace gstd = ::__gnu_cxx; // GCC 3.1 and later + #endif + #else // GCC 4.0 and later + #include + namespace gstd = ::__gnu_cxx; + #endif +#else // ... there are other compilers, right? + namespace gstd = std; #endif + +#if defined WNT && defined WIN32 && defined SMESHDS_EXPORTS +#define SMESHDS_WNT_EXPORT __declspec( dllexport ) +#else +#define SMESHDS_WNT_EXPORT #endif -using namespace std; +class SMESHDS_GroupBase; + +class SMESHDS_WNT_EXPORT SMESHDS_Mesh:public SMDS_Mesh{ +public: + SMESHDS_Mesh(int MeshID); + void ShapeToMesh(const TopoDS_Shape & S); + bool AddHypothesis(const TopoDS_Shape & SS, const SMESHDS_Hypothesis * H); + bool RemoveHypothesis(const TopoDS_Shape & S, const SMESHDS_Hypothesis * H); + + virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID); + virtual SMDS_MeshNode * AddNode(double x, double y, double z); + + virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID); + virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + int ID); + virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2); + + virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID); + virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + int ID); + virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3); + + virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID); + virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + int ID); + virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8); + + virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector nodes_ids, + const int ID); + + virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector nodes, + const int ID); + + virtual SMDS_MeshFace* AddPolygonalFace (std::vector nodes); + + virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID + (std::vector nodes_ids, + std::vector quantities, + const int ID); + + virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID + (std::vector nodes, + std::vector quantities, + const int ID); + + virtual SMDS_MeshVolume* AddPolyhedralVolume + (std::vector nodes, + std::vector quantities); + + void MoveNode(const SMDS_MeshNode *, double x, double y, double z); + virtual void RemoveNode(const SMDS_MeshNode *); + void RemoveElement(const SMDS_MeshElement *); + bool ChangeElementNodes(const SMDS_MeshElement * elem, + const SMDS_MeshNode * nodes[], + const int nbnodes); + bool ChangePolygonNodes(const SMDS_MeshElement * elem, + std::vector nodes); + bool ChangePolyhedronNodes(const SMDS_MeshElement * elem, + std::vector nodes, + std::vector quantities); + void Renumber (const bool isNodes, const int startID=1, const int deltaID=1); + + void SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Shell & S); + void SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Solid & S); + void SetNodeOnFace(SMDS_MeshNode * aNode, const TopoDS_Face & S, double u=0., double v=0.); + void SetNodeOnEdge(SMDS_MeshNode * aNode, const TopoDS_Edge & S, double u=0.); + void SetNodeOnVertex(SMDS_MeshNode * aNode, const TopoDS_Vertex & S); + void UnSetNodeOnShape(const SMDS_MeshNode * aNode); + void SetMeshElementOnShape(const SMDS_MeshElement * anElt, + const TopoDS_Shape & S); + void UnSetMeshElementOnShape(const SMDS_MeshElement * anElt, + const TopoDS_Shape & S); + TopoDS_Shape ShapeToMesh() const; + bool HasMeshElements(const TopoDS_Shape & S); + SMESHDS_SubMesh * MeshElements(const TopoDS_Shape & S) const; + SMESHDS_SubMesh * MeshElements(const int Index); + std::list SubMeshIndices(); + const std::map& SubMeshes() + { return myShapeIndexToSubMesh; } + + bool HasHypothesis(const TopoDS_Shape & S); + const std::list& GetHypothesis(const TopoDS_Shape & S) const; + SMESHDS_Script * GetScript(); + void ClearScript(); + int ShapeToIndex(const TopoDS_Shape & aShape) const; + TopoDS_Shape IndexToShape(int ShapeIndex); + + SMESHDS_SubMesh * NewSubMesh(int Index); + int AddCompoundSubmesh(const TopoDS_Shape& S, TopAbs_ShapeEnum type = TopAbs_SHAPE); + void SetNodeInVolume(const SMDS_MeshNode * aNode, int Index); + void SetNodeOnFace(SMDS_MeshNode * aNode, int Index , double u=0., double v=0.); + void SetNodeOnEdge(SMDS_MeshNode * aNode, int Index , double u=0.); + void SetNodeOnVertex(SMDS_MeshNode * aNode, int Index); + void SetMeshElementOnShape(const SMDS_MeshElement * anElt, int Index); + + void AddGroup (SMESHDS_GroupBase* theGroup) { myGroups.insert(theGroup); } + void RemoveGroup (SMESHDS_GroupBase* theGroup) { myGroups.erase(theGroup); } + int GetNbGroups() const { return myGroups.size(); } + const std::set& GetGroups() const { return myGroups; } -class SMESHDS_Mesh:public SMDS_Mesh -{ + bool IsGroupOfSubShapes (const TopoDS_Shape& aSubShape) const; + ~SMESHDS_Mesh(); + +private: +#ifndef WNT + struct HashTopoDS_Shape{ + size_t operator()(const TopoDS_Shape& S) const { + return S.HashCode(2147483647); + } + }; +#else + typedef gstd::hash_compare< TopoDS_Shape, less > HashTopoDS; + + class HashTopoDS_Shape : public HashTopoDS { public: + + size_t operator()(const TopoDS_Shape& S) const { + return S.HashCode(2147483647); + } + + bool operator()(const TopoDS_Shape& S1,const TopoDS_Shape& S2) const { + return S1==S2; + } + }; + + - SMESHDS_Mesh(int MeshID); - void ShapeToMesh(const TopoDS_Shape & S); - bool AddHypothesis(const TopoDS_Shape & SS, const SMESHDS_Hypothesis * H); - bool RemoveHypothesis(const TopoDS_Shape & S, const SMESHDS_Hypothesis * H); - SMDS_MeshNode * AddNode(double x, double y, double z); - void RemoveNode(const SMDS_MeshNode *); - void MoveNode(const SMDS_MeshNode *, double x, double y, double z); - SMDS_MeshEdge* AddEdge( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); - SMDS_MeshFace* AddFace( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3); - SMDS_MeshFace* AddFace( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4); - SMDS_MeshVolume* AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4); - SMDS_MeshVolume* AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5); - SMDS_MeshVolume* AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6); - SMDS_MeshVolume* AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8); - - void RemoveElement(const SMDS_MeshElement *); - void SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Shell & S); - void SetNodeOnFace(SMDS_MeshNode * aNode, const TopoDS_Face & S); - void SetNodeOnEdge(SMDS_MeshNode * aNode, const TopoDS_Edge & S); - void SetNodeOnVertex(SMDS_MeshNode * aNode, const TopoDS_Vertex & S); - void UnSetNodeOnShape(const SMDS_MeshNode * aNode); - void SetMeshElementOnShape(const SMDS_MeshElement * anElt, - const TopoDS_Shape & S); - void UnSetMeshElementOnShape(const SMDS_MeshElement * anElt, - const TopoDS_Shape & S); - TopoDS_Shape ShapeToMesh() const; - bool HasMeshElements(const TopoDS_Shape & S); - SMESHDS_SubMesh * MeshElements(const TopoDS_Shape & S); - bool HasHypothesis(const TopoDS_Shape & S); - const list& GetHypothesis(const TopoDS_Shape & S) const; - SMESHDS_Script * GetScript(); - void ClearScript(); - int ShapeToIndex(const TopoDS_Shape & aShape); - TopoDS_Shape IndexToShape(int ShapeIndex); - void NewSubMesh(int Index); - void SetNodeInVolume(const SMDS_MeshNode * aNode, int Index); - void SetNodeOnFace(SMDS_MeshNode * aNode, int Index); - void SetNodeOnEdge(SMDS_MeshNode * aNode, int Index); - void SetNodeOnVertex(SMDS_MeshNode * aNode, int Index); - void SetMeshElementOnShape(const SMDS_MeshElement * anElt, int Index); - ~SMESHDS_Mesh(); - - private: - struct HashTopoDS_Shape - { - size_t operator()(const TopoDS_Shape& S) const {return S.HashCode(2147483647);} - }; - typedef hash_map,HashTopoDS_Shape > ShapeToHypothesis; - int myMeshID; - TopoDS_Shape myShape; - TopTools_IndexedMapOfShape myIndexToShape; - map myShapeIndexToSubMesh; - ShapeToHypothesis myShapeToHypothesis; - SMESHDS_Script * myScript; +#endif + + void addNodeToSubmesh( const SMDS_MeshNode* aNode, int Index ) + { + //Update or build submesh + map::iterator it = myShapeIndexToSubMesh.find( Index ); + if ( it == myShapeIndexToSubMesh.end() ) + it = myShapeIndexToSubMesh.insert( make_pair(Index, new SMESHDS_SubMesh() )).first; + it->second->AddNode( aNode ); // add aNode to submesh + } + + typedef std::list THypList; + +#ifndef WNT + typedef gstd::hash_map ShapeToHypothesis; +#else + typedef gstd::hash_map ShapeToHypothesis; +#endif + + ShapeToHypothesis myShapeToHypothesis; + + int myMeshID; + TopoDS_Shape myShape; + + typedef std::map TShapeIndexToSubMesh; + TShapeIndexToSubMesh myShapeIndexToSubMesh; + + TopTools_IndexedMapOfShape myIndexToShape; + + typedef std::set TGroups; + TGroups myGroups; + + SMESHDS_Script* myScript; }; + + #endif