Salome HOME
Merge branch 'master' of https://codev-tuleap.cea.fr/plugins/git/salome/shaper
[modules/shaper.git] / src / Model / Model_Update.cpp
index 07f87c3edadc54194c031f07628d568c490c5fbe..052468c7845d62c84ebfaae62300e2ae508063fd 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2020  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -535,9 +535,21 @@ bool Model_Update::processFeature(FeaturePtr theFeature)
       return false;
   }
 
+  // check this feature is not yet checked or processed
+  bool aIsModified = myModified.find(theFeature) != myModified.end();
+  if (!aIsModified && myIsFinish) { // get info about the modification for features without preview
+    if (theFeature->data()->execState() == ModelAPI_StateMustBeUpdated) {
+      aIsModified = true;
+      std::set<std::shared_ptr<ModelAPI_Feature> > aNewSet;
+      // contains itself, so, we don't know which was the reason and the reason is any
+      aNewSet.insert(theFeature);
+      myModified[theFeature] = aNewSet;
+    }
+  }
+
   if (myProcessed.find(theFeature) == myProcessed.end()) {
     myProcessed[theFeature] = 0;
-  } else {
+  } else if (aIsModified) {
     int aCount = myProcessed[theFeature];
     if (aCount > 100) {
       // too many repetition of processing (in VS it may crash on 330 with stack overflow)
@@ -550,18 +562,6 @@ bool Model_Update::processFeature(FeaturePtr theFeature)
     myProcessed[theFeature] = aCount + 1;
   }
 
-  // check this feature is not yet checked or processed
-  bool aIsModified = myModified.find(theFeature) != myModified.end();
-  if (!aIsModified && myIsFinish) { // get info about the modification for features without preview
-    if (theFeature->data()->execState() == ModelAPI_StateMustBeUpdated) {
-      aIsModified = true;
-      std::set<std::shared_ptr<ModelAPI_Feature> > aNewSet;
-      // contains itself, so, we don't know which was the reason and the reason is any
-      aNewSet.insert(theFeature);
-      myModified[theFeature] = aNewSet;
-    }
-  }
-
 #ifdef DEB_UPDATE
     std::cout<<"* Process feature "<<theFeature->name()<<std::endl;
 #endif
@@ -647,7 +647,12 @@ bool Model_Update::processFeature(FeaturePtr theFeature)
     }
     // searching for the next not used reason
     aProcessedReasons.insert(aReason);
-    aReasons.erase(aReason);
+    // check theFeature is still in the list of modified, because it may be removed sometimes
+    // while updating SketchPlugin_Ellipse
+    if (myModified.find(theFeature) != myModified.end())
+      aReasons.erase(aReason);
+    else
+      break;
   }
   // restore the modified reasons: they will be used in the update of arguments
   if (allSubsUsed) { // restore theFeature in this set