Salome HOME
Speed up "Clear mesh data"
[modules/smesh.git] / src / SMESHDS / SMESHDS_Mesh.cxx
index 18b13fc5d4ccc2f4b1bf57e70f1c1c598e8c3371..da435996b7c69e36c490be34a8e9290cfbb3b7e4 100644 (file)
@@ -769,13 +769,11 @@ void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, SMESHDS_SubMe
 
   // Rm from group
   // Node can belong to several groups
-  if (!myGroups.empty()) {
-    set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
-    for (; GrIt != myGroups.end(); GrIt++) {
-      SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
-      if (!group || group->IsEmpty()) continue;
+  set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
+  for (; GrIt != myGroups.end(); GrIt++) {
+    SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
+    if (group && !group->IsEmpty())
       group->SMDSGroup().Remove(elt);
-    }
   }
 
   // Rm from sub-mesh
@@ -786,6 +784,33 @@ void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, SMESHDS_SubMe
   SMDS_Mesh::RemoveFreeElement(elt);
 }
 
+//================================================================================
+/*!
+ * \brief Remove all data from the mesh
+ */
+//================================================================================
+
+void SMESHDS_Mesh::ClearMesh()
+{
+  myScript->ClearMesh();
+  SMDS_Mesh::Clear();
+
+  // clear submeshes
+  map<int,SMESHDS_SubMesh*>::iterator sub, subEnd = myShapeIndexToSubMesh.end();
+  for ( sub = myShapeIndexToSubMesh.begin(); sub != subEnd; ++sub )
+    sub->second->Clear();
+
+  // clear groups
+  TGroups::iterator group, groupEnd = myGroups.end();
+  for ( group = myGroups.begin(); group != groupEnd; ++group ) {
+    if ( SMESHDS_Group* g = dynamic_cast<SMESHDS_Group*>(*group)) {
+      SMDSAbs_ElementType groupType = g->GetType();
+      g->Clear();
+      g->SetType( groupType );
+    }
+  }
+}
+
 //================================================================================
 /*!
  * \brief return submesh by shape