Salome HOME
In Split(), fix removal from a set being iterated, leading to exception at study...
[modules/smesh.git] / src / DriverMED / DriverMED_Family.cxx
index ee1123ccd0719e9f7f380d0cca33b0a845d4455b..d9ff5b249dcc2f766d2e8b65fa093af45b8e520a 100644 (file)
 //  $Header$
 
 #include "DriverMED_Family.h"
+#include "MED_Factory.hxx"
+
 #include <sstream>     
 
+using namespace std;
+
 //=============================================================================
 /*!
  *  Split each group from list <aGroups> on some parts (families)
@@ -37,7 +41,7 @@
 //=============================================================================
 list<DriverMED_FamilyPtr> DriverMED_Family::MakeFamilies
                          (const map <int, SMESHDS_SubMesh*>& theSubMeshes,
-                          const list<SMESHDS_Group*>& theGroups,
+                          const list<SMESHDS_GroupBase*>& theGroups,
                           const bool doGroupOfNodes,
                           const bool doGroupOfEdges,
                           const bool doGroupOfFaces,
@@ -60,6 +64,8 @@ list<DriverMED_FamilyPtr> DriverMED_Family::MakeFamilies
   map<int, SMESHDS_SubMesh*>::const_iterator aSMIter = theSubMeshes.begin();
   for (; aSMIter != theSubMeshes.end(); aSMIter++)
   {
+    if ( aSMIter->second->IsComplexSubmesh() )
+      continue; // submesh containing other submeshs
     list<DriverMED_FamilyPtr> aSMFams = SplitByType((*aSMIter).second, (*aSMIter).first);
     list<DriverMED_FamilyPtr>::iterator aSMFamsIter = aSMFams.begin();
     for (; aSMFamsIter != aSMFams.end(); aSMFamsIter++)
@@ -95,7 +101,7 @@ list<DriverMED_FamilyPtr> DriverMED_Family::MakeFamilies
   }
 
   // Process groups
-  list<SMESHDS_Group*>::const_iterator aGroupsIter = theGroups.begin();
+  list<SMESHDS_GroupBase*>::const_iterator aGroupsIter = theGroups.begin();
   for (; aGroupsIter != theGroups.end(); aGroupsIter++)
   {
     DriverMED_FamilyPtr aFam2 (new DriverMED_Family);
@@ -187,10 +193,10 @@ list<DriverMED_FamilyPtr> DriverMED_Family::MakeFamilies
     aFamilies.push_back(aFreeVolumesFam);
   }
 
-  DriverMED_FamilyPtr aNullFam (new DriverMED_Family);
-  aNullFam->SetId(0);
-  aNullFam->myType = SMDSAbs_All;
-  aFamilies.push_back(aNullFam);
+  //DriverMED_FamilyPtr aNullFam (new DriverMED_Family);
+  //aNullFam->SetId(0);
+  //aNullFam->myType = SMDSAbs_All;
+  //aFamilies.push_back(aNullFam);
 
   return aFamilies;
 }
@@ -200,8 +206,9 @@ list<DriverMED_FamilyPtr> DriverMED_Family::MakeFamilies
  *  Create TFamilyInfo for this family
  */
 //=============================================================================
-MEDA::PFamilyInfo DriverMED_Family::GetFamilyInfo
-                  (const MEDA::PMeshInfo& theMeshInfo) const
+MED::PFamilyInfo 
+DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper, 
+                               const MED::PMeshInfo& theMeshInfo) const
 {
   string aValue;
   ostringstream aStr;
@@ -211,11 +218,13 @@ MEDA::PFamilyInfo DriverMED_Family::GetFamilyInfo
   MED::TIntVector anAttrIds (1, myId);        // Id=0,
   MED::TIntVector anAttrVals (1, myId);       // Value=0
 
-  MEDA::PFamilyInfo anInfo = MEDA::TWrapper::CrFamilyInfo(theMeshInfo,
-                                                          aValue,
-                                                          myId,
-                                                          myGroupNames,
-                                                          anAttrDescs,anAttrIds,anAttrVals);
+  MED::PFamilyInfo anInfo = theWrapper->CrFamilyInfo(theMeshInfo,
+                                                    aValue,
+                                                    myId,
+                                                    myGroupNames,
+                                                    anAttrDescs,
+                                                    anAttrIds,
+                                                    anAttrVals);
 
 //  cout << endl;
 //  cout << "Groups: ";
@@ -239,25 +248,25 @@ MEDA::PFamilyInfo DriverMED_Family::GetFamilyInfo
 
 //=============================================================================
 /*!
- *  Initialize the tool by SMESHDS_Group
+ *  Initialize the tool by SMESHDS_GroupBase
  */
 //=============================================================================
-void DriverMED_Family::Init (SMESHDS_Group* group)
+void DriverMED_Family::Init (SMESHDS_GroupBase* theGroup)
 {
   // Elements
   myElements.clear();
-  group->InitIterator();
-  while (group->More())
+  SMDS_ElemIteratorPtr elemIt = theGroup->GetElements();
+  while (elemIt->more())
   {
-    myElements.insert(group->Next());
+    myElements.insert(elemIt->next());
   }
 
   // Type
-  myType = group->GetType();
+  myType = theGroup->GetType();
 
   // Groups list
   myGroupNames.clear();
-  myGroupNames.insert(string(group->GetStoreName()));
+  myGroupNames.insert(string(theGroup->GetStoreName()));
 }
 
 //=============================================================================
@@ -341,14 +350,16 @@ void DriverMED_Family::Split (DriverMED_FamilyPtr by,
 {
   // Elements
   set<const SMDS_MeshElement *>::iterator anIter = by->myElements.begin();
-  for (; anIter != by->myElements.end(); anIter++)
+  while ( anIter != by->myElements.end())
   {
     if (myElements.find(*anIter) != myElements.end())
     {
       common->myElements.insert(*anIter);
       myElements.erase(*anIter);
-      by->myElements.erase(*anIter);
+      by->myElements.erase(anIter++);
     }
+    else
+      anIter++;
   }
 
   if (!common->IsEmpty())