]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix for the issue #937 and crashes:
authormpv <mpv@opencascade.com>
Thu, 10 Sep 2015 16:35:08 +0000 (19:35 +0300)
committermpv <mpv@opencascade.com>
Thu, 10 Sep 2015 16:35:08 +0000 (19:35 +0300)
src/Model/Model_Document.cpp
src/Model/Model_Objects.cpp

index 21f5f1aa44920b96562d6c710f85e1b1a4faf5c5..d85fb7b292b9abcbdddf464d43ece287587726ac 100644 (file)
@@ -68,6 +68,8 @@ Model_Document::Model_Document(const std::string theID, const std::string theKin
   // in transaction for nesting correct working
   myDoc->NewCommand();
   TDataStd_Integer::Set(myDoc->Main().Father(), 0);
+  // this to avoid creation of integer attribute outside the transaction after undo
+  transactionID();
   myDoc->CommitCommand();
 }
 
@@ -278,6 +280,7 @@ void Model_Document::close(const bool theForever)
 
   // close all only if it is really asked, otherwise it can be undoed/redoed
   if (theForever) {
+    // flush everything to avoid messages with bad objects
     delete myObjs;
     myObjs = 0;
     if (myDoc->CanClose() == CDM_CCS_OK)
index 988b2eb8753e679f741af3d6c2723afa113308d0..b30356fffe7c4449f063a15733bfd1930b54c124 100644 (file)
@@ -79,6 +79,7 @@ Model_Objects::~Model_Objects()
     myFeatures.UnBind(aFeaturesIter.Key());
   }
   aLoop->activateFlushes(isActive);
+  aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
   aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED));
   aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
 
@@ -611,6 +612,16 @@ void Model_Objects::synchronizeFeatures(
       aKeptFeatures.insert(aFeature);
       if (anUpdatedMap.Contains(aFeatureLabel)) {
         ModelAPI_EventCreator::get()->sendUpdated(aFeature, anUpdateEvent);
+        if (aFeature->getKind() == "Parameter") { // if parameters are changed, update the results (issue 937)
+          const std::list<std::shared_ptr<ModelAPI_Result> >& aResults = aFeature->results();
+          std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aRIter = aResults.begin();
+          for (; aRIter != aResults.cend(); aRIter++) {
+            std::shared_ptr<ModelAPI_Result> aRes = *aRIter;
+            if (aRes->data()->isValid() && !aRes->isDisabled()) {
+              ModelAPI_EventCreator::get()->sendUpdated(aRes, anUpdateEvent);
+            }
+          }
+        }
       }
     }
   }