X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHDS%2FSMESHDS_Mesh.hxx;h=fdf90a30b400efc9238ac50e352d69dc58f7744b;hp=ef18cb4160a6113312e5a4e74159d0112d7e7189;hb=42c7eb97f9ec27537b638c98ef69dc55f19fa1cd;hpb=2d46bce2985c40bfac0593abad88d590a8efca48 diff --git a/src/SMESHDS/SMESHDS_Mesh.hxx b/src/SMESHDS/SMESHDS_Mesh.hxx index ef18cb416..fdf90a30b 100644 --- a/src/SMESHDS/SMESHDS_Mesh.hxx +++ b/src/SMESHDS/SMESHDS_Mesh.hxx @@ -42,72 +42,250 @@ #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. -#include -using namespace __gnu_cxx; +#ifdef __GNUC__ + #if __GNUC__ < 3 + #include + namespace gstd { using ::hash_map; }; // inherit globals + #else + #include + #if __GNUC_MINOR__ == 0 + namespace gstd = std; // GCC 3.0 + #else + namespace gstd = ::__gnu_cxx; // GCC 3.1 and later + #endif + #endif +#else // ... there are other compilers, right? + namespace gstd = std; +#endif + +class SMESHDS_GroupBase; + +class 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 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) 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); -using namespace std; + 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); + void SetNodeOnEdge(SMDS_MeshNode * aNode, int Index); + void SetNodeOnVertex(SMDS_MeshNode * aNode, int Index); + void SetMeshElementOnShape(const SMDS_MeshElement * anElt, int Index); -class SMESHDS_Mesh:public SMDS_Mesh -{ + 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; } + 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); - virtual void RemoveNode(int ID); - void MoveNode(int ID, double x, double y, double z); - SMDS_MeshEdge* AddEdge(int idnode1, int idnode2); - SMDS_MeshFace* AddFace(int idnode1, int idnode2, int idnode3); - SMDS_MeshFace* AddFace(int idnode1, int idnode2, int idnode3, int idnode4); - SMDS_MeshVolume* AddVolume(int idnode1, int idnode2, int idnode3, int idnode4); - SMDS_MeshVolume* AddVolume(int idnode1, int idnode2, int idnode3, int idnode4, - int idnode5); - SMDS_MeshVolume* AddVolume(int idnode1, int idnode2, int idnode3, int idnode4, - int idnode5, int idnode6); - SMDS_MeshVolume* AddVolume(int idnode1, int idnode2, int idnode3, int idnode4, - int idnode5, int idnode6, int idnode7, int idnode8); - virtual void RemoveElement(int IDelem); - 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 + + 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