Salome HOME
Prepare version 1.2.1: quick fix for iteration 2 release
[modules/shaper.git] / src / Model / Model_Objects.cpp
index 6196ca95390c5353b62ccd0602aaabd1767aeab0..54033a49b0e8c519d48f41d548692550fe8c5934 100644 (file)
@@ -218,6 +218,10 @@ void Model_Objects::removeFeature(FeaturePtr theFeature)
         aComposite->removeFeature(theFeature);
       }
     }
+    // this must be before erase since theFeature erasing removes all information about
+    // the feature results and groups of results
+    // To reproduce: create sketch, extrusion, remove sketch => constructions tree is not updated
+    clearHistory(theFeature);
     // erase fields
     theFeature->erase();
 
@@ -225,8 +229,6 @@ void Model_Objects::removeFeature(FeaturePtr theFeature)
     if (myFeatures.IsBound(aFeatureLabel))
       myFeatures.UnBind(aFeatureLabel);
 
-    clearHistory(theFeature);
-
     static Events_ID EVENT_DISP = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
     ModelAPI_EventCreator::get()->sendUpdated(theFeature, EVENT_DISP);
     // erase all attributes under the label of feature
@@ -250,8 +252,13 @@ void Model_Objects::clearHistory(ObjectPtr theObj)
       myHistory.erase(aHIter); // erase from map => this means that it is not synchronized
     if (theObj->groupName() == ModelAPI_Feature::group()) { // clear results group of the feature
       FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theObj);
-      if (aFeature->firstResult().get())
-        clearHistory(aFeature->firstResult());
+      std::string aResultGroup = featureResultGroup(aFeature);
+      if (!aResultGroup.empty()) {
+        std::map<std::string, std::vector<ObjectPtr> >::iterator aHIter = 
+          myHistory.find(aResultGroup);
+        if (aHIter != myHistory.end())
+          myHistory.erase(aHIter); // erase from map => this means that it is not synchronized
+      }
     }
   }
 }
@@ -333,6 +340,9 @@ ObjectPtr Model_Objects::object(TDF_Label theLabel)
 ObjectPtr Model_Objects::object(const std::string& theGroupID, const int theIndex)
 {
   createHistory(theGroupID);
+  //TODO: mpv stabilization hotfix
+  if (myHistory[theGroupID].size() <= theIndex)
+    return ObjectPtr();
   return myHistory[theGroupID][theIndex];
 }
 
@@ -754,6 +764,22 @@ std::shared_ptr<ModelAPI_Feature> Model_Objects::feature(
   return FeaturePtr();
 }
 
+std::string Model_Objects::featureResultGroup(FeaturePtr theFeature)
+{
+  if (theFeature->data()->isValid()) {
+    TDF_ChildIterator aLabIter(resultLabel(theFeature->data(), 0).Father());
+    if (aLabIter.More()) {
+      TDF_Label anArgLab = aLabIter.Value();
+      Handle(TDataStd_Comment) aGroup;
+      if (aLabIter.Value().FindAttribute(TDataStd_Comment::GetID(), aGroup)) {
+        return TCollection_AsciiString(aGroup->Get()).ToCString();
+      }
+    }
+  }
+  static std::string anEmpty;
+  return anEmpty; // not found
+}
+
 void Model_Objects::updateResults(FeaturePtr theFeature)
 {
   // for not persistent is will be done by parametric updater automatically