]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Make second open notcrashed in this vearion
authormpv <mpv@opencascade.com>
Wed, 27 May 2015 08:47:07 +0000 (11:47 +0300)
committermpv <mpv@opencascade.com>
Wed, 27 May 2015 08:47:07 +0000 (11:47 +0300)
src/Model/Model_Document.cpp
src/Model/Model_Update.cpp

index a554fd5994a88b7d0318db65defda9fc16e92280..3a341a5acf03cfe2a1e599f5107fb6f5908c62f8 100644 (file)
@@ -257,8 +257,11 @@ void Model_Document::close(const bool theForever)
   // close all subs
   const std::set<std::string> aSubs = subDocuments(true);
   std::set<std::string>::iterator aSubIter = aSubs.begin();
-  for (; aSubIter != aSubs.end(); aSubIter++)
-    subDoc(*aSubIter)->close(theForever);
+  for (; aSubIter != aSubs.end(); aSubIter++) {
+    std::shared_ptr<Model_Document> aSub = subDoc(*aSubIter);
+    if (aSub->myObjs) // if it was not closed before
+      aSub->close(theForever);
+  }
 
   // close for thid document needs no transaction in this document
   std::static_pointer_cast<Model_Session>(Model_Session::get())->setCheckTransactions(false);
@@ -423,9 +426,14 @@ bool Model_Document::canUndo()
   // check other subs contains operation that can be undoed
   const std::set<std::string> aSubs = subDocuments(true);
   std::set<std::string>::iterator aSubIter = aSubs.begin();
-  for (; aSubIter != aSubs.end(); aSubIter++)
-    if (subDoc(*aSubIter)->canUndo())
-      return true;
+  for (; aSubIter != aSubs.end(); aSubIter++) {
+    std::shared_ptr<Model_Document> aSub = subDoc(*aSubIter);
+    if (aSub->myObjs) {// if it was not closed before
+      if (aSub->canUndo())
+        return true;
+    }
+  }
+
   return false;
 }
 
@@ -444,8 +452,11 @@ void Model_Document::undoInternal(const bool theWithSubs, const bool theSynchron
     // undo for all subs
     const std::set<std::string> aSubs = subDocuments(true);
     std::set<std::string>::iterator aSubIter = aSubs.begin();
-    for (; aSubIter != aSubs.end(); aSubIter++)
+    for (; aSubIter != aSubs.end(); aSubIter++) {
+      if (!subDoc(*aSubIter)->myObjs)
+        continue;
       subDoc(*aSubIter)->undoInternal(theWithSubs, theSynchronize);
+    }
   }
   // after redo of all sub-documents to avoid updates on not-modified data (issue 370)
   if (theSynchronize) {
@@ -467,9 +478,12 @@ bool Model_Document::canRedo()
   // check other subs contains operation that can be redoed
   const std::set<std::string> aSubs = subDocuments(true);
   std::set<std::string>::iterator aSubIter = aSubs.begin();
-  for (; aSubIter != aSubs.end(); aSubIter++)
+  for (; aSubIter != aSubs.end(); aSubIter++) {
+    if (!subDoc(*aSubIter)->myObjs)
+      continue;
     if (subDoc(*aSubIter)->canRedo())
       return true;
+  }
   return false;
 }
 
@@ -677,7 +691,7 @@ void Model_Document::setCurrentFeature(std::shared_ptr<ModelAPI_Feature> theCurr
   }
   if (theCurrent.get()) {
     std::shared_ptr<Model_Data> aData = std::static_pointer_cast<Model_Data>(theCurrent->data());
-    if (!aData.get()) return; // unknown case
+    if (!aData.get() || !aData->isValid()) return;
     TDF_Label aFeatureLabel = aData->label().Father();
 
     Handle(TDF_Reference) aRef;
@@ -717,10 +731,10 @@ void Model_Document::setCurrentFeature(std::shared_ptr<ModelAPI_Feature> theCurr
 
 void Model_Document::setCurrentFeatureUp()
 {
-  FeaturePtr aCurrent = currentFeature(false);
+  FeaturePtr aCurrent = currentFeature(true);
   if (aCurrent.get()) { // if not, do nothing because null is the upper
     FeaturePtr aPrev = myObjs->nextFeature(aCurrent, true);
-    setCurrentFeature(aPrev, false);
+    setCurrentFeature(aPrev, true);
   }
 }
 
index 08a7d4097feabb6af6c8341c5a88771aa9bdb32b..765ff15826d38a28036df34c4c20877fabec6842 100644 (file)
@@ -191,6 +191,8 @@ void Model_Update::updateInDoc(std::shared_ptr<ModelAPI_Document> theDoc)
   if (!anObjs) return;
   FeaturePtr aFeatureIter = anObjs->firstFeature();
   for (; aFeatureIter.get(); aFeatureIter = anObjs->nextFeature(aFeatureIter)) {
+    if (!aFeatureIter->data()->isValid()) // this may be on close of the document
+      continue;
     if (aFeatureIter && alreadyProcessed.find(aFeatureIter) == alreadyProcessed.end()) {
       // update selection and parameters attributes first, before sub-features analysis (sketch plane)
       updateArguments(aFeatureIter);