Salome HOME
Update copyright info (2010->2011)
[modules/smesh.git] / src / SMESH / SMESH_Mesh.hxx
index 91ae67eda4fb1ccfe496f9c93922f268bb8a91fe..4f56154bda41599a3023f7bebff92b1465ecbb78 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2011  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
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  SMESH SMESH : implementaion of SMESH idl descriptions
 //  File   : SMESH_Mesh.hxx
 //  Author : Paul RASCLE, EDF
 #include <TopoDS_Shape.hxx>
 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
 
-#include <list>
 #include <map>
+#include <list>
+
+#ifdef WNT
+#pragma warning(disable:4251) // Warning DLL Interface ...
+#pragma warning(disable:4290) // Warning Exception ...
+#endif
 
 class SMESH_Gen;
 class SMESHDS_Document;
@@ -51,14 +57,17 @@ class SMESH_subMesh;
 class SMESH_HypoFilter;
 class TopoDS_Solid;
 
+typedef std::list<int> TListOfInt;
+typedef std::list<TListOfInt> TListOfListOfInt;
+
 class SMESH_EXPORT SMESH_Mesh
 {
 public:
   SMESH_Mesh(int               theLocalId, 
-            int               theStudyId, 
-            SMESH_Gen*        theGen,
-            bool              theIsEmbeddedMode,
-            SMESHDS_Document* theDocument);
+             int               theStudyId, 
+             SMESH_Gen*        theGen,
+             bool              theIsEmbeddedMode,
+             SMESHDS_Document* theDocument);
   
   virtual ~SMESH_Mesh();
   
@@ -162,7 +171,7 @@ public:
    * \brief Return True if anHyp is used to mesh aSubShape
    */
   bool IsUsedHypothesis(SMESHDS_Hypothesis *  anHyp,
-                       const SMESH_subMesh * aSubMesh);
+                        const SMESH_subMesh * aSubMesh);
   /*!
    * \brief check if a hypothesis alowing notconform mesh is present
    */
@@ -179,6 +188,21 @@ public:
 
   bool GetAutoColor() throw(SALOME_Exception);
 
+  /*!
+   * \brief Set the flag meaning that the mesh has been edited "manually".
+   * It is to set to false after Clear() and to set to true by MeshEditor
+   */
+  void SetIsModified(bool isModified);
+
+  bool GetIsModified() const { return _isModified; }
+
+  /*!
+   * \brief Return true if the mesh has been edited since a total re-compute
+   *        and those modifications may prevent successful partial re-compute.
+   *        As a side effect reset _isModified flag if mesh is empty
+   */
+  bool HasModificationsToDiscard() const;
+
   /*!
    * \brief Return data map of descendant to ancestor shapes
    */
@@ -191,9 +215,9 @@ public:
   bool HasDuplicatedGroupNamesMED();
 
   void ExportMED(const char *file, 
-                const char* theMeshName = NULL, 
-                bool theAutoGroups = true, 
-                int theVersion = 0) 
+                 const char* theMeshName = NULL, 
+                 bool theAutoGroups = true, 
+                 int theVersion = 0) 
     throw(SALOME_Exception);
 
   void ExportDAT(const char *file) throw(SALOME_Exception);
@@ -202,6 +226,8 @@ public:
   
   int NbNodes() throw(SALOME_Exception);
   
+  int Nb0DElements() throw(SALOME_Exception);
+  
   int NbEdges(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
   
   int NbFaces(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
@@ -229,8 +255,8 @@ public:
   int NbGroup() const { return _mapGroup.size(); }
   
   SMESH_Group* AddGroup (const SMDSAbs_ElementType theType,
-                        const char*               theName,
-                        int&                      theId,
+                         const char*               theName,
+                         int&                      theId,
                          const TopoDS_Shape&       theShape=TopoDS_Shape());
   
   typedef boost::shared_ptr< SMDS_Iterator<SMESH_Group*> > GroupIteratorPtr;
@@ -246,17 +272,33 @@ public:
 
   SMDSAbs_ElementType GetElementType( const int id, const bool iselem );
 
+  void ClearMeshOrder();
+  void SetMeshOrder(const TListOfListOfInt& theOrder );
+  const TListOfListOfInt& GetMeshOrder() const;
+
+  /*!
+   * \brief sort submeshes according to stored mesh order
+   * \param theListToSort in out list to be sorted
+   * \return FALSE if nothing sorted
+   */
+  bool SortByMeshOrder(std::list<SMESH_subMesh*>& theListToSort) const;
+
   //
   
   ostream& Dump(ostream & save);
   
 private:
+
+  void fillAncestorsMap(const TopoDS_Shape& theShape);
+  std::list<SMESH_subMesh*> getAncestorsSubMeshes
+    (const TopoDS_Shape& theSubShape) const;
   
 protected:
   int                        _id;           // id given by creator (unique within the creator instance)
   int                        _studyId;
   int                        _idDoc;        // id given by SMESHDS_Document
   int                        _groupId;      // id generator for group objects
+  int                        _nbSubShapes;  // initial nb of subshapes in the shape to mesh
   bool                       _isShapeToMesh;// set to true when a shape is given (only once)
   std::list <SMESH_subMesh*> _subMeshesUsingHypothesisList;
   SMESHDS_Document *         _myDocument;
@@ -264,13 +306,16 @@ protected:
   std::map <int, SMESH_subMesh*> _mapSubMesh;
   std::map <int, SMESH_Group*>   _mapGroup;
   SMESH_Gen *                _gen;
-
+  
   bool                       _isAutoColor;
+  bool                       _isModified; //!< modified since last total re-compute, issue 0020693
 
   double                     _shapeDiagonal; //!< diagonal size of bounding box of shape to mesh
   
   TopTools_IndexedDataMapOfShapeListOfShape _mapAncestors;
 
+  TListOfListOfInt           _mySubMeshOrder;
+
 protected:
   SMESH_Mesh() {};
   SMESH_Mesh(const SMESH_Mesh&) {};