Salome HOME
Update state of Apply and Continue button
[modules/shaper.git] / src / Model / Model_Update.cpp
index f86c3076b240ecde193a2eb4955552fbbed23100..09a56b18841be280804691a95982130a7ea5da6f 100644 (file)
@@ -441,7 +441,7 @@ void Model_Update::processEvent(const std::shared_ptr<Events_Message>& theMessag
     Events_Loop::loop()->flush(kRedisplayEvent);
 
     // in the end of transaction everything is updated, so clear the old objects
-    myIsParamUpdated = false;
+    //myIsParamUpdated = false; // to avoid problems in sprocket.py parameter update
     myWaitForFinish.clear();
   } else if (theMessage->eventID() == kReorderEvent) {
     std::shared_ptr<ModelAPI_OrderUpdatedMessage> aMsg =
@@ -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
@@ -722,10 +727,8 @@ bool Model_Update::processFeature(FeaturePtr theFeature)
       if (myUpdateBlocked) {
         if (!theFeature->isStable()) {
           aDoExecute = true;
-        } else if (theFeature->results().size()) { // execute only not-results features
-          aDoExecute = !(theFeature->firstResult()->groupName() == ModelAPI_ResultBody::group() ||
-            theFeature->firstResult()->groupName() == ModelAPI_ResultPart::group() ||
-            theFeature->getKind() == "Sketch");
+        } else if (theFeature->results().size()) { // execute only not persistent results features
+          aDoExecute = !theFeature->isPersistentResult();
         } else {
           aDoExecute = aState != ModelAPI_StateInvalidArgument;
         }