Salome HOME
0020918: EDF 1447 SMESH: Mesh common borders
authoreap <eap@opencascade.com>
Fri, 12 Nov 2010 14:39:34 +0000 (14:39 +0000)
committereap <eap@opencascade.com>
Fri, 12 Nov 2010 14:39:34 +0000 (14:39 +0000)
   Add means to notify CORBA API implementation level on group removal
   caused by hypotheses events (maybe in other mesh)

-  void RemoveGroup (const int theGroupID);
+  bool RemoveGroup (const int theGroupID);

+  struct TRmGroupCallUp
+  {
+    virtual void RemoveGroup (const int theGroupID)=0;
+    virtual ~TRmGroupCallUp() {}
+  };
+  void SetRemoveGroupCallUp( TRmGroupCallUp * upCaller );
+
+

src/SMESH/SMESH_Mesh.cxx
src/SMESH/SMESH_Mesh.hxx

index d7fb290db1224f5120d5897d6407493b346e83bf..39c2ca9762d8e6ce72a8ce054edef8dc5d140cfa 100644 (file)
@@ -101,6 +101,7 @@ SMESH_Mesh::SMESH_Mesh(int               theLocalId,
   _isAutoColor   = false;
   _isModified    = false;
   _shapeDiagonal = 0.0;
+  _rmGroupCallUp = 0;
   _myMeshDS->ShapeToMesh( PseudoShape() );
 }
 
@@ -126,6 +127,9 @@ SMESH_Mesh::~SMESH_Mesh()
     delete aGroup;
   }
   _mapGroup.clear();
+
+  if ( _rmGroupCallUp) delete _rmGroupCallUp;
+  _rmGroupCallUp = 0;
 }
 
 //=============================================================================
@@ -267,6 +271,7 @@ void SMESH_Mesh::Clear()
     while ( smIt->more() ) {
       sm = smIt->next();
       sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
+      sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); // for event listeners (issue 0020918)
     }
   }
   _isModified = false;
@@ -973,7 +978,7 @@ void SMESH_Mesh::NotifySubMeshesHypothesisModification(const SMESH_Hypothesis* h
       }
     }
   }
-  HasModificationsToDiscard(); // to reset _isModified flag if mesh become empty
+  HasModificationsToDiscard(); // to reset _isModified flag if mesh becomes empty
 }
 
 //=============================================================================
@@ -1413,6 +1418,18 @@ list<int> SMESH_Mesh::GetGroupIds() const
   return anIds;
 }
 
+//================================================================================
+/*!
+ * \brief Set a caller of RemoveGroup() at level of CORBA API implementation.
+ * The set upCaller will be deleted by SMESH_Mesh
+ */
+//================================================================================
+
+void SMESH_Mesh::SetRemoveGroupCallUp( TRmGroupCallUp* upCaller )
+{
+  if ( _rmGroupCallUp ) delete _rmGroupCallUp;
+  _rmGroupCallUp = upCaller;
+}
 
 //=============================================================================
 /*!
@@ -1420,13 +1437,16 @@ list<int> SMESH_Mesh::GetGroupIds() const
  */
 //=============================================================================
 
-void SMESH_Mesh::RemoveGroup (const int theGroupID)
+bool SMESH_Mesh::RemoveGroup (const int theGroupID)
 {
   if (_mapGroup.find(theGroupID) == _mapGroup.end())
-    return;
+    return false;
   GetMeshDS()->RemoveGroup( _mapGroup[theGroupID]->GetGroupDS() );
   delete _mapGroup[theGroupID];
   _mapGroup.erase (theGroupID);
+  if (_rmGroupCallUp)
+    _rmGroupCallUp->RemoveGroup( theGroupID );
+  return true;
 }
 
 //=======================================================================
index ac504ced6405f0ef75833629368cb9a48b016531..c88bbd02dee23a2066f6df93a5f3c08c8417a493 100644 (file)
@@ -141,12 +141,14 @@ public:
   
   void ClearLog() throw(SALOME_Exception);
   
-  int GetId()                { return _id; }
+  int GetId() const          { return _id; }
   
   SMESHDS_Mesh * GetMeshDS() { return _myMeshDS; }
   
-  SMESH_Gen *GetGen()        { return _gen; }
+  const SMESHDS_Mesh * GetMeshDS() const { return _myMeshDS; }
   
+  SMESH_Gen *GetGen()        { return _gen; }
+
   SMESH_subMesh *GetSubMesh(const TopoDS_Shape & aSubShape)
     throw(SALOME_Exception);
   
@@ -266,10 +268,18 @@ public:
   
   SMESH_Group* GetGroup (const int theGroupID);
 
-  void RemoveGroup (const int theGroupID);
+  bool RemoveGroup (const int theGroupID);
 
   SMESH_Group* ConvertToStandalone ( int theGroupID );
 
+  struct TRmGroupCallUp
+  {
+    virtual void RemoveGroup (const int theGroupID)=0;
+    virtual ~TRmGroupCallUp() {}
+  };
+  void SetRemoveGroupCallUp( TRmGroupCallUp * upCaller );
+
+
   SMDSAbs_ElementType GetElementType( const int id, const bool iselem );
 
   void ClearMeshOrder();
@@ -303,9 +313,9 @@ protected:
   std::list <SMESH_subMesh*> _subMeshesUsingHypothesisList;
   SMESHDS_Document *         _myDocument;
   SMESHDS_Mesh *             _myMeshDS;
+  SMESH_Gen *                _gen;
   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
@@ -316,6 +326,11 @@ protected:
 
   TListOfListOfInt           _mySubMeshOrder;
 
+  // Struct calling RemoveGroup at CORBA API implementation level, used
+  // to make an upper level be consistent with a lower one when group removal
+  // is invoked by hyp modification 
+  TRmGroupCallUp*            _rmGroupCallUp;
+
 protected:
   SMESH_Mesh() {};
   SMESH_Mesh(const SMESH_Mesh&) {};