Salome HOME
PAL10719: Portability gcc4.0.1. Fix by Erwan ADAM.
[modules/smesh.git] / src / SMESHDS / SMESHDS_Mesh.hxx
index d7eccde86aa41e923c19bdc8e7ef484a48494e6d..a5a54907b5855004ce5d61545f54cc4809ecebd5 100644 (file)
 #ifndef _SMESHDS_Mesh_HeaderFile
 #define _SMESHDS_Mesh_HeaderFile
 
-#ifndef _Standard_HeaderFile
-#include <Standard.hxx>
-#endif
-#ifndef _Handle_SMESHDS_Mesh_HeaderFile
-#include "Handle_SMESHDS_Mesh.hxx"
-#endif
+#include "SMDS_Mesh.hxx"
+#include "SMDS_MeshNode.hxx"
+#include "SMDS_MeshEdge.hxx"
+#include "SMDS_MeshFace.hxx"
+#include "SMDS_MeshVolume.hxx"
+#include "SMESHDS_Hypothesis.hxx"
+#include "SMESHDS_SubMesh.hxx"
+#include "SMESHDS_Script.hxx"
 
-#ifndef _Standard_Integer_HeaderFile
-#include <Standard_Integer.hxx>
-#endif
-#ifndef _TopoDS_Shape_HeaderFile
+#include <TopTools_IndexedMapOfShape.hxx>
 #include <TopoDS_Shape.hxx>
-#endif
-#ifndef _TopoDS_Shell_HeaderFile
+#include <TopoDS_Solid.hxx>
 #include <TopoDS_Shell.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <TopoDS_Edge.hxx>
+#include <map>
+#ifdef WNT
+#include <hash_map>
 #endif
-#ifndef _TopTools_IndexedMapOfShape_HeaderFile
-#include <TopTools_IndexedMapOfShape.hxx>
-#endif
-#ifndef _SMESHDS_DataMapOfIntegerSubMesh_HeaderFile
-#include "SMESHDS_DataMapOfIntegerSubMesh.hxx"
-#endif
-#ifndef _SMESHDS_DataMapOfShapeListOfPtrHypothesis_HeaderFile
-#include "SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx"
-#endif
-#ifndef _Handle_SMESHDS_Script_HeaderFile
-#include "Handle_SMESHDS_Script.hxx"
-#endif
-#ifndef _SMDS_Mesh_HeaderFile
-#include "SMDS_Mesh.hxx"
-#endif
-#ifndef _Standard_Boolean_HeaderFile
-#include <Standard_Boolean.hxx>
-#endif
-#ifndef _SMESHDS_PtrHypothesis_HeaderFile
-#include "SMESHDS_PtrHypothesis.hxx"
-#endif
-#ifndef _Standard_Real_HeaderFile
-#include <Standard_Real.hxx>
-#endif
-#ifndef _Handle_SMDS_MeshNode_HeaderFile
-#include "Handle_SMDS_MeshNode.hxx"
-#endif
-#ifndef _Handle_SMDS_MeshElement_HeaderFile
-#include "Handle_SMDS_MeshElement.hxx"
-#endif
-#ifndef _Handle_SMESHDS_SubMesh_HeaderFile
-#include "Handle_SMESHDS_SubMesh.hxx"
+
+//Not portable see http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_4 to know more.
+#ifdef __GNUC__
+  #if __GNUC__ < 3
+    #include <hash_map.h>
+    namespace gstd { using ::hash_map; }; // inherit globals
+  #elif __GNUC__ == 3
+    #include <ext/hash_map>
+    #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 <ext/hash_map>
+    namespace gstd = ::__gnu_cxx;
+  #endif
+#else      // ...  there are other compilers, right?
+  namespace gstd = std;
 #endif
-class SMESHDS_Script;
-class TopoDS_Shape;
-class SMDS_MeshNode;
-class TopoDS_Shell;
-class TopoDS_Face;
-class TopoDS_Edge;
-class TopoDS_Vertex;
-class SMDS_MeshElement;
-class SMESHDS_SubMesh;
-class SMESHDS_ListOfPtrHypothesis;
 
+#if defined WNT && defined WIN32 && defined SMESHDS_EXPORTS
+#define SMESHDS_WNT_EXPORT __declspec( dllexport )
+#else
+#define SMESHDS_WNT_EXPORT
+#endif
 
-class SMESHDS_Mesh : public SMDS_Mesh {
+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);
 
-    inline void* operator new(size_t,void* anAddress) 
-      {
-        return anAddress;
-      }
-    inline void* operator new(size_t size) 
-      { 
-        return Standard::Allocate(size); 
-      }
-    inline void  operator delete(void *anAddress) 
-      { 
-        if (anAddress) Standard::Free((Standard_Address&)anAddress); 
-      }
-//    inline void  operator delete(void *anAddress, size_t size) 
-//      { 
-//        if (anAddress) Standard::Free((Standard_Address&)anAddress,size); 
-//      }
- // Methods PUBLIC
- // 
-Standard_EXPORT SMESHDS_Mesh(const Standard_Integer MeshID);
-Standard_EXPORT   void ShapeToMesh(const TopoDS_Shape& S) ;
-Standard_EXPORT   Standard_Boolean AddHypothesis(const TopoDS_Shape& SS,const SMESHDS_PtrHypothesis& H) ;
-Standard_EXPORT   Standard_Boolean RemoveHypothesis(const TopoDS_Shape& S,const SMESHDS_PtrHypothesis& H) ;
-Standard_EXPORT virtual  Standard_Integer AddNode(const Standard_Real x,const Standard_Real y,const Standard_Real z) ;
-Standard_EXPORT virtual  void RemoveNode(const Standard_Integer ID) ;
-Standard_EXPORT   void MoveNode(const Standard_Integer ID,const Standard_Real x,const Standard_Real y,const Standard_Real z) ;
-Standard_EXPORT virtual  Standard_Integer AddEdge(const Standard_Integer idnode1,const Standard_Integer idnode2) ;
-Standard_EXPORT virtual  Standard_Integer AddFace(const Standard_Integer idnode1,const Standard_Integer idnode2,const Standard_Integer idnode3) ;
-Standard_EXPORT virtual  Standard_Integer AddFace(const Standard_Integer idnode1,const Standard_Integer idnode2,const Standard_Integer idnode3,const Standard_Integer idnode4) ;
-Standard_EXPORT virtual  Standard_Integer AddVolume(const Standard_Integer idnode1,const Standard_Integer idnode2,const Standard_Integer idnode3,const Standard_Integer idnode4) ;
-Standard_EXPORT virtual  Standard_Integer AddVolume(const Standard_Integer idnode1,const Standard_Integer idnode2,const Standard_Integer idnode3,const Standard_Integer idnode4,const Standard_Integer idnode5) ;
-Standard_EXPORT virtual  Standard_Integer AddVolume(const Standard_Integer idnode1,const Standard_Integer idnode2,const Standard_Integer idnode3,const Standard_Integer idnode4,const Standard_Integer idnode5,const Standard_Integer idnode6) ;
-Standard_EXPORT virtual  Standard_Integer AddVolume(const Standard_Integer idnode1,const Standard_Integer idnode2,const Standard_Integer idnode3,const Standard_Integer idnode4,const Standard_Integer idnode5,const Standard_Integer idnode6,const Standard_Integer idnode7,const Standard_Integer idnode8) ;
-Standard_EXPORT virtual  void RemoveElement(const Standard_Integer IDelem) ;
-Standard_EXPORT   void SetNodeInVolume(const Handle(SMDS_MeshNode)& aNode,const TopoDS_Shell& S) ;
-Standard_EXPORT   void SetNodeOnFace(const Handle(SMDS_MeshNode)& aNode,const TopoDS_Face& S) ;
-Standard_EXPORT   void SetNodeOnEdge(const Handle(SMDS_MeshNode)& aNode,const TopoDS_Edge& S) ;
-Standard_EXPORT   void SetNodeOnVertex(const Handle(SMDS_MeshNode)& aNode,const TopoDS_Vertex& S) ;
-Standard_EXPORT   void UnSetNodeOnShape(const Handle(SMDS_MeshNode)& aNode) ;
-Standard_EXPORT   void SetMeshElementOnShape(const Handle(SMDS_MeshElement)& anElt,const TopoDS_Shape& S) ;
-Standard_EXPORT   void UnSetMeshElementOnShape(const Handle(SMDS_MeshElement)& anElt,const TopoDS_Shape& S) ;
-Standard_EXPORT   TopoDS_Shape ShapeToMesh() ;
-Standard_EXPORT   Standard_Boolean HasMeshElements(const TopoDS_Shape& S) ;
-Standard_EXPORT   Handle_SMESHDS_SubMesh MeshElements(const TopoDS_Shape& S) ;
-Standard_EXPORT   Standard_Boolean HasHypothesis(const TopoDS_Shape& S) ;
-Standard_EXPORT  const SMESHDS_ListOfPtrHypothesis& GetHypothesis(const TopoDS_Shape& S) ;
-Standard_EXPORT  const Handle_SMESHDS_Script& GetScript() ;
-Standard_EXPORT   void ClearScript() ;
-Standard_EXPORT   Standard_Integer ShapeToIndex(const TopoDS_Shape& aShape) ;
-Standard_EXPORT   TopoDS_Shape IndexToShape(const Standard_Integer ShapeIndex) ;
-Standard_EXPORT   void NewSubMesh(const Standard_Integer Index) ;
-Standard_EXPORT   void SetNodeInVolume(const Handle(SMDS_MeshNode)& aNode,const Standard_Integer Index) ;
-Standard_EXPORT   void SetNodeOnFace(const Handle(SMDS_MeshNode)& aNode,const Standard_Integer Index) ;
-Standard_EXPORT   void SetNodeOnEdge(const Handle(SMDS_MeshNode)& aNode,const Standard_Integer Index) ;
-Standard_EXPORT   void SetNodeOnVertex(const Handle(SMDS_MeshNode)& aNode,const Standard_Integer Index) ;
-Standard_EXPORT   void SetMeshElementOnShape(const Handle(SMDS_MeshElement)& anElt,const Standard_Integer Index) ;
-Standard_EXPORT ~SMESHDS_Mesh();
-
-
-
-
- // Type management
- //
- Standard_EXPORT friend Handle_Standard_Type& SMESHDS_Mesh_Type_();
- Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
- Standard_EXPORT Standard_Boolean             IsKind(const Handle(Standard_Type)&) const;
-
-protected:
-
- // Methods PROTECTED
- // 
-
-
- // Fields PROTECTED
- //
-
-
-private: 
-
- // Methods PRIVATE
- // 
-
-
- // Fields PRIVATE
- //
-Standard_Integer myMeshID;
-TopoDS_Shape myShape;
-TopTools_IndexedMapOfShape myIndexToShape;
-SMESHDS_DataMapOfIntegerSubMesh myShapeIndexToSubMesh;
-SMESHDS_DataMapOfShapeListOfPtrHypothesis myShapeToHypothesis;
-Handle_SMESHDS_Script myScript;
+  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<int> nodes_ids,
+                                                 const int        ID);
 
+  virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<const SMDS_MeshNode*> nodes,
+                                                 const int                         ID);
 
+  virtual SMDS_MeshFace* AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes);
 
-// other inline functions and methods (like "C++: function call" methods)
-//
+  virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
+                           (std::vector<int> nodes_ids,
+                            std::vector<int> quantities,
+                            const int        ID);
+
+  virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
+                           (std::vector<const SMDS_MeshNode*> nodes,
+                            std::vector<int>                  quantities,
+                            const int                         ID);
+
+  virtual SMDS_MeshVolume* AddPolyhedralVolume
+                           (std::vector<const SMDS_MeshNode*> nodes,
+                            std::vector<int>                  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<const SMDS_MeshNode*> nodes);
+  bool ChangePolyhedronNodes(const SMDS_MeshElement * elem,
+                             std::vector<const SMDS_MeshNode*> nodes,
+                             std::vector<int>                  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<int> SubMeshIndices();
+  const std::map<int,SMESHDS_SubMesh*>& SubMeshes()
+  { return myShapeIndexToSubMesh; }
+
+  bool HasHypothesis(const TopoDS_Shape & S);
+  const std::list<const SMESHDS_Hypothesis*>& 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<SMESHDS_GroupBase*>& 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<TopoDS_Shape> > 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;
+       }
+  };
+
+
+
+#endif
+
+  void addNodeToSubmesh( const SMDS_MeshNode* aNode, int Index )
+  {
+    //Update or build submesh
+    map<int,SMESHDS_SubMesh*>::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<const SMESHDS_Hypothesis*> THypList;
+
+#ifndef WNT
+  typedef gstd::hash_map<TopoDS_Shape,THypList,HashTopoDS_Shape> ShapeToHypothesis;
+#else
+  typedef gstd::hash_map<TopoDS_Shape,THypList,HashTopoDS_Shape> ShapeToHypothesis;
+#endif
+
+  ShapeToHypothesis          myShapeToHypothesis;
+
+  int                        myMeshID;
+  TopoDS_Shape               myShape;
+
+  typedef std::map<int,SMESHDS_SubMesh*> TShapeIndexToSubMesh;
+  TShapeIndexToSubMesh myShapeIndexToSubMesh;
+
+  TopTools_IndexedMapOfShape myIndexToShape;
+
+  typedef std::set<SMESHDS_GroupBase*> TGroups;
+  TGroups myGroups;
+
+  SMESHDS_Script*            myScript;
+};
 
 
 #endif