Salome HOME
Copyright update 2021
[modules/smesh.git] / src / SMESHDS / SMESHDS_Mesh.hxx
index 360b8ef6b8742814104c3ee7c16b4a2af2258ca4..ad5f0aaeb11b6785f22394c21338e45ce3a7b469 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -35,6 +35,8 @@
 #include <TopTools_IndexedMapOfShape.hxx>
 #include <TopoDS_Shape.hxx>
 
+#include <map>
+
 class TopoDS_Solid ;
 class TopoDS_Shell ;
 class TopoDS_Face  ;
@@ -50,19 +52,21 @@ class SMDS_MeshVolume   ;
 class SMDS_Mesh0DElement;
 class SMDS_BallElement;
 
-#include <NCollection_DataMap.hxx>
-#include <map>
 /*
  * Using of native hash_map isn't portable and don't work on WIN32 platform.
  * So this functionality implement on new NCollection_DataMap technology
  */
+#include <NCollection_DataMap.hxx>
 #include "SMESHDS_DataMapOfShape.hxx"
+typedef std::list<const SMESHDS_Hypothesis*>                          THypList;
+typedef NCollection_DataMap< TopoDS_Shape, THypList, SMESHDS_Hasher > ShapeToHypothesis;
 
 class SMESHDS_GroupBase;
 class DownIdType;
 
-class SMESHDS_EXPORT SMESHDS_Mesh:public SMDS_Mesh{
-public:
+class SMESHDS_EXPORT SMESHDS_Mesh : public SMDS_Mesh
+{
+ public:
   SMESHDS_Mesh(int theMeshID, bool theIsEmbeddedMode);
   bool IsEmbeddedMode();
   void SetPersistentId(int id);
@@ -385,6 +389,52 @@ public:
                                      const SMDS_MeshNode * n25,
                                      const SMDS_MeshNode * n36);
 
+  // 2d order Pentahedron with 18 nodes
+  virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3,
+                                           int n4, int n5, int n6,
+                                           int n12,int n23,int n31,
+                                           int n45,int n56,int n64,
+                                           int n14,int n25,int n36,
+                                           int n1245, int n2356, int n1346,
+                                           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 * n12,
+                                           const SMDS_MeshNode * n23,
+                                           const SMDS_MeshNode * n31,
+                                           const SMDS_MeshNode * n45,
+                                           const SMDS_MeshNode * n56,
+                                           const SMDS_MeshNode * n64,
+                                           const SMDS_MeshNode * n14,
+                                           const SMDS_MeshNode * n25,
+                                           const SMDS_MeshNode * n36,
+                                           const SMDS_MeshNode * n1245,
+                                           const SMDS_MeshNode * n2356,
+                                           const SMDS_MeshNode * n1346,
+                                           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 * n12,
+                                     const SMDS_MeshNode * n23,
+                                     const SMDS_MeshNode * n31,
+                                     const SMDS_MeshNode * n45,
+                                     const SMDS_MeshNode * n56,
+                                     const SMDS_MeshNode * n64,
+                                     const SMDS_MeshNode * n14,
+                                     const SMDS_MeshNode * n25,
+                                     const SMDS_MeshNode * n36,
+                                     const SMDS_MeshNode * n1245,
+                                     const SMDS_MeshNode * n2356,
+                                     const SMDS_MeshNode * n1346);
+
   // 2d order Hexahedrons with 20 nodes
   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
                                            int n5, int n6, int n7, int n8,
@@ -507,19 +557,27 @@ public:
 
   virtual SMDS_MeshFace* AddPolygonalFace (const std::vector<const SMDS_MeshNode*>& nodes);
 
+  virtual SMDS_MeshFace* AddQuadPolygonalFaceWithID(const std::vector<int> & nodes_ids,
+                                                    const int                ID);
+
+  virtual SMDS_MeshFace* AddQuadPolygonalFaceWithID(const std::vector<const SMDS_MeshNode*> & nodes,
+                                                    const int                                 ID);
+
+  virtual SMDS_MeshFace* AddQuadPolygonalFace(const std::vector<const SMDS_MeshNode*> & nodes);
+
   virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
-                           (const std::vector<int>& nodes_ids,
-                            const std::vector<int>& quantities,
-                            const int               ID);
+    (const std::vector<int>& nodes_ids,
+     const std::vector<int>& quantities,
+     const int               ID);
 
   virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
-                           (const std::vector<const SMDS_MeshNode*>& nodes,
-                            const std::vector<int>&                  quantities,
-                            const int                                ID);
+    (const std::vector<const SMDS_MeshNode*>& nodes,
+     const std::vector<int>&                  quantities,
+     const int                                ID);
 
   virtual SMDS_MeshVolume* AddPolyhedralVolume
-                           (const std::vector<const SMDS_MeshNode*>& nodes,
-                            const std::vector<int>&                  quantities);
+    (const std::vector<const SMDS_MeshNode*>& nodes,
+     const std::vector<int>&                  quantities);
 
   virtual void MoveNode(const SMDS_MeshNode *, double x, double y, double z);
   virtual void RemoveNode(const SMDS_MeshNode *);
@@ -529,7 +587,7 @@ public:
    *  Methods do not work for meshes with descendants.
    *  Implemented for fast cleaning of meshes.
    */
-  void RemoveFreeNode   (const SMDS_MeshNode *,    SMESHDS_SubMesh *, bool fromGroups=true);
+  bool RemoveFreeNode   (const SMDS_MeshNode *,    SMESHDS_SubMesh *, bool fromGroups=true);
   void RemoveFreeElement(const SMDS_MeshElement *, SMESHDS_SubMesh *, bool fromGroups=true);
 
   void ClearMesh();
@@ -539,9 +597,9 @@ public:
                           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);
+  bool ChangePolyhedronNodes(const SMDS_MeshElement *                 elem,
+                             const std::vector<const SMDS_MeshNode*>& nodes,
+                             const std::vector<int>&                  quantities);
   bool ModifyCellNodes(int smdsVolId, std::map<int,int> localClonedNodeIds);
   void Renumber (const bool isNodes, const int startID=1, const int deltaID=1);
 
@@ -562,15 +620,16 @@ public:
   SMESHDS_SubMesh * MeshElements(const TopoDS_Shape & S) const;
   SMESHDS_SubMesh * MeshElements(const int Index) const;
   std::list<int> SubMeshIndices() const;
-  const std::map<int,SMESHDS_SubMesh*>& SubMeshes() const
-  { return myShapeIndexToSubMesh; }
-  const TopoDS_Shape& GetCurrentSubShape() const { return myCurSubShape; }
+  SMESHDS_SubMeshIteratorPtr SubMeshes() const;
 
   bool HasHypothesis(const TopoDS_Shape & S);
   const std::list<const SMESHDS_Hypothesis*>& GetHypothesis(const TopoDS_Shape & S) const;
   bool IsUsedHypothesis(const SMESHDS_Hypothesis * H) const;
+  const ShapeToHypothesis & GetHypotheses() const { return myShapeToHypothesis; }
+
   SMESHDS_Script * GetScript();
   void ClearScript();
+
   int ShapeToIndex(const TopoDS_Shape & aShape) const;
   const TopoDS_Shape& IndexToShape(int ShapeIndex) const;
   int MaxShapeIndex() const { return myIndexToShape.Extent(); }
@@ -587,55 +646,32 @@ public:
 
   bool IsGroupOfSubShapes (const TopoDS_Shape& aSubShape) const;
 
-  virtual void compactMesh();
+  virtual void CompactMesh();
   void CleanDownWardConnectivity();
   void BuildDownWardConnectivity(bool withEdges);
 
   ~SMESHDS_Mesh();
   
-private:
-  void addNodeToSubmesh( const SMDS_MeshNode* aNode, int Index )
-  {
-    //Update or build submesh
-    std::map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find( Index );
-    if ( it == myShapeIndexToSubMesh.end() )
-      it = myShapeIndexToSubMesh.insert( std::make_pair(Index, new SMESHDS_SubMesh(this, Index) )).first;
-    it->second->AddNode( aNode ); // add aNode to submesh
-  }
-  
-  /*int HashCode( const TopoDS_Shape& S, const Standard_Integer theUpper ) const
-  {
-      return S.HashCode(2147483647);
-  }*/ 
-
-  typedef std::list<const SMESHDS_Hypothesis*> THypList;
-
-  typedef NCollection_DataMap< TopoDS_Shape, THypList > ShapeToHypothesis;
+ private:
 
   ShapeToHypothesis          myShapeToHypothesis;
 
   int                        myMeshID, myPersistentID;
   TopoDS_Shape               myShape;
 
-  typedef std::map<int,SMESHDS_SubMesh*> TShapeIndexToSubMesh;
-  TShapeIndexToSubMesh myShapeIndexToSubMesh;
+  class SubMeshHolder;
+  SubMeshHolder*             mySubMeshHolder;
 
   TopTools_IndexedMapOfShape myIndexToShape;
 
   typedef std::set<SMESHDS_GroupBase*> TGroups;
-  TGroups myGroups;
+  TGroups                    myGroups;
 
   SMESHDS_Script*            myScript;
   bool                       myIsEmbeddedMode;
 
-  // optimize addition of nodes/elements to submeshes by, SetNodeInVolume() etc:
-  // avoid search of submeshes in maps
-  bool add( const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh );
+  int add( const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh );
   SMESHDS_SubMesh* getSubmesh( const TopoDS_Shape & shape);
-  SMESHDS_SubMesh* getSubmesh( const int            Index );
-  int                        myCurSubID;
-  TopoDS_Shape               myCurSubShape;
-  SMESHDS_SubMesh*           myCurSubMesh;
 };