Salome HOME
IMP 0020089: Take into account 0D elements (MED_POINT1)
[modules/smesh.git] / src / SMDS / SMDS_Mesh.hxx
index ab76e9b9c03af61e9ea36c0632ceae3a1fcda5c4..df4a2b3567cbbfb67a77664384ac4ea01f3699b0 100644 (file)
 //  SMESH SMDS : implementaion of Salome mesh data structure
 //  File   : SMDS_Mesh.hxx
 //  Module : SMESH
-//
+
 #ifndef _SMDS_Mesh_HeaderFile
 #define _SMDS_Mesh_HeaderFile
 
 #include "SMESH_SMDS.hxx"
 
 #include "SMDS_MeshNode.hxx"
+#include "SMDS_Mesh0DElement.hxx"
 #include "SMDS_MeshEdge.hxx"
 #include "SMDS_MeshFace.hxx"
 #include "SMDS_MeshVolume.hxx"
 
 class SMDS_EXPORT SMDS_Mesh:public SMDS_MeshObject{
 public:
-  
+
   SMDS_Mesh();
-  
+
   SMDS_NodeIteratorPtr nodesIterator() const;
+  SMDS_0DElementIteratorPtr elements0dIterator() const;
   SMDS_EdgeIteratorPtr edgesIterator() const;
   SMDS_FaceIteratorPtr facesIterator() const;
   SMDS_VolumeIteratorPtr volumesIterator() const;
-  SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;  
-  
+  SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
+
   SMDSAbs_ElementType GetElementType( const int id, const bool iselem ) const;
 
   SMDS_Mesh *AddSubMesh();
-  
+
   virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID);
   virtual SMDS_MeshNode* AddNode(double x, double y, double z);
-  
+
+  virtual SMDS_Mesh0DElement* Add0DElementWithID(int n, int ID);
+  virtual SMDS_Mesh0DElement* Add0DElementWithID(const SMDS_MeshNode * n, int ID);
+  virtual SMDS_Mesh0DElement* Add0DElement      (const SMDS_MeshNode * n);
+
   virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID);
   virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
-                                      const SMDS_MeshNode * n2, 
+                                      const SMDS_MeshNode * n2,
                                       int ID);
   virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
                                 const SMDS_MeshNode * n2);
-  
+
   // 2d order edge with 3 nodes: n12 - node between n1 and n2
   virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int n12, int ID);
   virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
-                                      const SMDS_MeshNode * n2, 
-                                      const SMDS_MeshNode * n12, 
+                                      const SMDS_MeshNode * n2,
+                                      const SMDS_MeshNode * n12,
                                       int ID);
   virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
                                  const SMDS_MeshNode * n2,
@@ -79,23 +85,23 @@ public:
   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, 
+                                      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, 
+                                      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_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
                                        const SMDS_MeshEdge * e2,
                                        const SMDS_MeshEdge * e3, int ID);
@@ -117,10 +123,10 @@ public:
                                        int n12,int n23,int n31, int ID);
   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
                                       const SMDS_MeshNode * n2,
-                                      const SMDS_MeshNode * n3, 
+                                      const SMDS_MeshNode * n3,
                                       const SMDS_MeshNode * n12,
                                       const SMDS_MeshNode * n23,
-                                      const SMDS_MeshNode * n31, 
+                                      const SMDS_MeshNode * n31,
                                       int ID);
   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
                                 const SMDS_MeshNode * n2,
@@ -135,11 +141,11 @@ public:
   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
                                       const SMDS_MeshNode * n2,
                                       const SMDS_MeshNode * n3,
-                                      const SMDS_MeshNode * n4, 
+                                      const SMDS_MeshNode * n4,
                                       const SMDS_MeshNode * n12,
                                       const SMDS_MeshNode * n23,
                                       const SMDS_MeshNode * n34,
-                                      const SMDS_MeshNode * n41, 
+                                      const SMDS_MeshNode * n41,
                                       int ID);
   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
                                 const SMDS_MeshNode * n2,
@@ -154,27 +160,27 @@ public:
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                           const SMDS_MeshNode * n2,
                                           const SMDS_MeshNode * n3,
-                                          const SMDS_MeshNode * n4, 
+                                          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, 
+                                          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,
@@ -182,7 +188,7 @@ public:
                                           const SMDS_MeshNode * n3,
                                           const SMDS_MeshNode * n4,
                                           const SMDS_MeshNode * n5,
-                                          const SMDS_MeshNode * n6, 
+                                          const SMDS_MeshNode * n6,
                                           int ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                     const SMDS_MeshNode * n2,
@@ -190,7 +196,7 @@ public:
                                     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,
@@ -200,7 +206,7 @@ public:
                                           const SMDS_MeshNode * n5,
                                           const SMDS_MeshNode * n6,
                                           const SMDS_MeshNode * n7,
-                                          const SMDS_MeshNode * n8, 
+                                          const SMDS_MeshNode * n8,
                                           int ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                     const SMDS_MeshNode * n2,
@@ -251,13 +257,13 @@ public:
   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
                                           const SMDS_MeshNode * n2,
                                           const SMDS_MeshNode * n3,
-                                          const SMDS_MeshNode * n4, 
+                                          const SMDS_MeshNode * n4,
                                           const SMDS_MeshNode * n12,
                                           const SMDS_MeshNode * n23,
                                           const SMDS_MeshNode * n31,
-                                          const SMDS_MeshNode * n14, 
+                                          const SMDS_MeshNode * n14,
                                           const SMDS_MeshNode * n24,
-                                          const SMDS_MeshNode * n34, 
+                                          const SMDS_MeshNode * n34,
                                           int ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                     const SMDS_MeshNode * n2,
@@ -266,7 +272,7 @@ public:
                                      const SMDS_MeshNode * n12,
                                      const SMDS_MeshNode * n23,
                                      const SMDS_MeshNode * n31,
-                                     const SMDS_MeshNode * n14, 
+                                     const SMDS_MeshNode * n14,
                                      const SMDS_MeshNode * n24,
                                      const SMDS_MeshNode * n34);
 
@@ -279,15 +285,15 @@ public:
                                           const SMDS_MeshNode * n2,
                                           const SMDS_MeshNode * n3,
                                           const SMDS_MeshNode * n4,
-                                          const SMDS_MeshNode * n5, 
+                                          const SMDS_MeshNode * n5,
                                           const SMDS_MeshNode * n12,
                                           const SMDS_MeshNode * n23,
                                           const SMDS_MeshNode * n34,
-                                          const SMDS_MeshNode * n41, 
+                                          const SMDS_MeshNode * n41,
                                           const SMDS_MeshNode * n15,
                                           const SMDS_MeshNode * n25,
                                           const SMDS_MeshNode * n35,
-                                          const SMDS_MeshNode * n45, 
+                                          const SMDS_MeshNode * n45,
                                           int ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                     const SMDS_MeshNode * n2,
@@ -297,7 +303,7 @@ public:
                                      const SMDS_MeshNode * n12,
                                      const SMDS_MeshNode * n23,
                                      const SMDS_MeshNode * n34,
-                                     const SMDS_MeshNode * n41, 
+                                     const SMDS_MeshNode * n41,
                                      const SMDS_MeshNode * n15,
                                      const SMDS_MeshNode * n25,
                                      const SMDS_MeshNode * n35,
@@ -315,29 +321,29 @@ public:
                                           const SMDS_MeshNode * n3,
                                           const SMDS_MeshNode * n4,
                                           const SMDS_MeshNode * n5,
-                                          const SMDS_MeshNode * n6, 
+                                          const SMDS_MeshNode * n6,
                                           const SMDS_MeshNode * n12,
                                           const SMDS_MeshNode * n23,
-                                          const SMDS_MeshNode * n31, 
+                                          const SMDS_MeshNode * n31,
                                           const SMDS_MeshNode * n45,
                                           const SMDS_MeshNode * n56,
-                                          const SMDS_MeshNode * n64, 
+                                          const SMDS_MeshNode * n64,
                                           const SMDS_MeshNode * n14,
                                           const SMDS_MeshNode * n25,
-                                          const SMDS_MeshNode * n36, 
+                                          const SMDS_MeshNode * n36,
                                           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 * n6,
                                      const SMDS_MeshNode * n12,
                                      const SMDS_MeshNode * n23,
-                                     const SMDS_MeshNode * n31, 
+                                     const SMDS_MeshNode * n31,
                                      const SMDS_MeshNode * n45,
                                      const SMDS_MeshNode * n56,
-                                     const SMDS_MeshNode * n64, 
+                                     const SMDS_MeshNode * n64,
                                      const SMDS_MeshNode * n14,
                                      const SMDS_MeshNode * n25,
                                      const SMDS_MeshNode * n36);
@@ -356,19 +362,19 @@ public:
                                           const SMDS_MeshNode * n5,
                                           const SMDS_MeshNode * n6,
                                           const SMDS_MeshNode * n7,
-                                          const SMDS_MeshNode * n8, 
+                                          const SMDS_MeshNode * n8,
                                           const SMDS_MeshNode * n12,
                                           const SMDS_MeshNode * n23,
                                           const SMDS_MeshNode * n34,
-                                          const SMDS_MeshNode * n41, 
+                                          const SMDS_MeshNode * n41,
                                           const SMDS_MeshNode * n56,
                                           const SMDS_MeshNode * n67,
                                           const SMDS_MeshNode * n78,
-                                          const SMDS_MeshNode * n85, 
+                                          const SMDS_MeshNode * n85,
                                           const SMDS_MeshNode * n15,
                                           const SMDS_MeshNode * n26,
                                           const SMDS_MeshNode * n37,
-                                          const SMDS_MeshNode * n48, 
+                                          const SMDS_MeshNode * n48,
                                           int ID);
   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
                                     const SMDS_MeshNode * n2,
@@ -377,15 +383,15 @@ public:
                                     const SMDS_MeshNode * n5,
                                     const SMDS_MeshNode * n6,
                                     const SMDS_MeshNode * n7,
-                                    const SMDS_MeshNode * n8, 
+                                    const SMDS_MeshNode * n8,
                                      const SMDS_MeshNode * n12,
                                      const SMDS_MeshNode * n23,
                                      const SMDS_MeshNode * n34,
-                                     const SMDS_MeshNode * n41, 
+                                     const SMDS_MeshNode * n41,
                                      const SMDS_MeshNode * n56,
                                      const SMDS_MeshNode * n67,
                                      const SMDS_MeshNode * n78,
-                                     const SMDS_MeshNode * n85, 
+                                     const SMDS_MeshNode * n85,
                                      const SMDS_MeshNode * n15,
                                      const SMDS_MeshNode * n26,
                                      const SMDS_MeshNode * n37,
@@ -419,6 +425,7 @@ public:
                              const bool                      removenodes = false);
   virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false);
   virtual void RemoveNode(const SMDS_MeshNode * node);
+  virtual void Remove0DElement(const SMDS_Mesh0DElement * elem0d);
   virtual void RemoveEdge(const SMDS_MeshEdge * edge);
   virtual void RemoveFace(const SMDS_MeshFace * face);
   virtual void RemoveVolume(const SMDS_MeshVolume * volume);
@@ -430,7 +437,7 @@ public:
   virtual void RemoveFreeElement(const SMDS_MeshElement * elem);
 
   virtual void Clear();
-  
+
   virtual bool RemoveFromParent();
   virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh);
 
@@ -445,6 +452,7 @@ public:
   // Renumber all nodes or elements.
 
   const SMDS_MeshNode *FindNode(int idnode) const;
+  const SMDS_Mesh0DElement* Find0DElement(int idnode) const;
   const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const;
   const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2, int idnode3) const;
   const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const;
@@ -454,6 +462,7 @@ public:
   const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4,
                                 int idnode5, int idnode6, int idnode7, int idnode8) const;
   const SMDS_MeshElement *FindElement(int IDelem) const;
+  static const SMDS_Mesh0DElement* Find0DElement(const SMDS_MeshNode * n);
   static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
                                        const SMDS_MeshNode * n2);
   static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
@@ -499,11 +508,13 @@ public:
   const SMDS_MeshInfo& GetMeshInfo() const { return myInfo; }
 
   int NbNodes() const;
+  int Nb0DElements() const;
   int NbEdges() const;
   int NbFaces() const;
   int NbVolumes() const;
   int NbSubMesh() const;
   void DumpNodes() const;
+  void Dump0DElements() const;
   void DumpEdges() const;
   void DumpFaces() const;
   void DumpVolumes() const;
@@ -527,6 +538,7 @@ public:
   bool Contains (const SMDS_MeshElement* elem) const;
 
   typedef NCollection_Map<SMDS_MeshNode *> SetOfNodes;
+  typedef NCollection_Map<SMDS_Mesh0DElement *> SetOf0DElements;
   typedef NCollection_Map<SMDS_MeshEdge *> SetOfEdges;
   typedef NCollection_Map<SMDS_MeshFace *> SetOfFaces;
   typedef NCollection_Map<SMDS_MeshVolume *> SetOfVolumes;
@@ -534,13 +546,14 @@ public:
 private:
   SMDS_Mesh(SMDS_Mesh * parent);
 
-  SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1, 
-                                const SMDS_MeshNode * node2, 
+  SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1,
+                                const SMDS_MeshNode * node2,
                                 const SMDS_MeshNode * node3);
   SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1,
-                                  const SMDS_MeshNode * node2, 
-                                  const SMDS_MeshNode * node3, 
+                                  const SMDS_MeshNode * node2,
+                                  const SMDS_MeshNode * node3,
                                   const SMDS_MeshNode * node4);
+  SMDS_Mesh0DElement* Find0DElementOrCreate(const SMDS_MeshNode * n);
   SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1,
                                  const SMDS_MeshNode * n2);
   SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
@@ -553,13 +566,14 @@ private:
 
   bool registerElement(int ID, SMDS_MeshElement * element);
 
-  void addChildrenWithNodes(std::set<const SMDS_MeshElement*>& setOfChildren, 
-                           const SMDS_MeshElement * element, 
+  void addChildrenWithNodes(std::set<const SMDS_MeshElement*>& setOfChildren,
+                           const SMDS_MeshElement * element,
                            std::set<const SMDS_MeshElement*>& nodes);
 
   // Fields PRIVATE
-  
+
   SetOfNodes             myNodes;
+  SetOf0DElements        my0DElements;
   SetOfEdges             myEdges;
   SetOfFaces             myFaces;
   SetOfVolumes           myVolumes;