]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fixed crash with abort of sketch in the Part document
authormpv <mikhail.ponikarov@opencascade.com>
Wed, 17 Sep 2014 06:38:18 +0000 (10:38 +0400)
committermpv <mikhail.ponikarov@opencascade.com>
Wed, 17 Sep 2014 06:38:18 +0000 (10:38 +0400)
src/Model/Model_Document.cpp
src/Model/Model_Document.h
src/ModelAPI/ModelAPI_Feature.cpp

index cb5d283942c06fad20d8fc8286e78db7b56dacc0..9057ab82ffd1eee2a582310b9258a2d6c51a617d 100644 (file)
@@ -224,9 +224,9 @@ void Model_Document::startOperation()
       myNestedNum = 0;
       myDoc->InitDeltaCompaction();
     }
-    myIsEmptyTr[myTransactionsAfterSave] = false;
+    myIsEmptyTr[myTransactionsAfterSave] = !myDoc->CommitCommand();
     myTransactionsAfterSave++;
-    myDoc->NewCommand();
+    myDoc->OpenCommand();
   } else {  // start the simple command
     myDoc->NewCommand();
   }
@@ -236,7 +236,7 @@ void Model_Document::startOperation()
     subDoc(*aSubIter)->startOperation();
 }
 
-void Model_Document::compactNested()
+bool Model_Document::compactNested()
 {
   bool allWasEmpty = true;
   while (myNestedNum != -1) {
@@ -250,6 +250,7 @@ void Model_Document::compactNested()
   myIsEmptyTr[myTransactionsAfterSave] = allWasEmpty;
   myTransactionsAfterSave++;
   myDoc->PerformDeltaCompaction();
+  return !allWasEmpty;
 }
 
 void Model_Document::finishOperation()
@@ -291,9 +292,10 @@ void Model_Document::abortOperation()
 {
   if (myNestedNum > 0 && !myDoc->HasOpenCommand()) {  // abort all what was done in nested
       // first compact all nested
-    compactNested();
-    // for nested it is undo and clear redos
-    myDoc->Undo();
+    if (compactNested()) {
+      // for nested it is undo and clear redos
+      myDoc->Undo();
+    }
     myDoc->ClearRedos();
     myTransactionsAfterSave--;
     myIsEmptyTr.erase(myTransactionsAfterSave);
index 598c3b633f674c283e69f89c7b1edaff4f75341b..f9bbd080944bd6ac10fb41b3a82bcd571e1ba81d 100644 (file)
@@ -145,8 +145,9 @@ class Model_Document : public ModelAPI_Document
     return myDoc;
   }
 
-  //! performas compactification of all nested operations into one
-  void compactNested();
+  //! performs compactification of all nested operations into one
+  //! \returns true if resulting transaction is not empty and can be undoed
+  bool compactNested();
 
   //! Initializes the data fields of the feature
   void initData(ObjectPtr theObj, TDF_Label theLab, const int theTag);
index a34d71bc56236ee18ea9891c353c0b9b08b1b02f..aec952e79bd94dfee020e27ef64785f0cd13c393 100644 (file)
@@ -77,13 +77,17 @@ void ModelAPI_Feature::removeResult(const boost::shared_ptr<ModelAPI_Result>& th
 
 void ModelAPI_Feature::eraseResults()
 {
-  std::list<boost::shared_ptr<ModelAPI_Result> >::iterator aResIter = myResults.begin();
-  for(; aResIter != myResults.end(); aResIter++) {
-      (*aResIter)->data()->erase();
-      static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_DELETED);
-      ModelAPI_EventCreator::get()->sendDeleted(document(), (*aResIter)->groupName());
+  if (!myResults.empty()) {
+    static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_DELETED);
+    std::list<boost::shared_ptr<ModelAPI_Result> >::iterator aResIter = myResults.begin();
+    for(; aResIter != myResults.end(); aResIter++) {
+        (*aResIter)->data()->erase();
+        ModelAPI_EventCreator::get()->sendDeleted(document(), (*aResIter)->groupName());
+    }
+    myResults.clear();
+    // flush it to avoid left presentations after input of invalid arguments (radius=0)
+    Events_Loop::loop()->flush(anEvent);
   }
-  myResults.clear();
 }
 
 boost::shared_ptr<ModelAPI_Document> ModelAPI_Feature::documentToAdd()