]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix for the issue #2819 : Fatal error when undo
authormpv <mpv@opencascade.com>
Fri, 21 Dec 2018 08:06:00 +0000 (11:06 +0300)
committermpv <mpv@opencascade.com>
Fri, 21 Dec 2018 08:06:00 +0000 (11:06 +0300)
src/Model/Model_AttributeRefList.cpp
src/Model/Model_AttributeRefList.h
src/Model/Model_Objects.cpp

index 7ffe0c4d38333c3e13ff49358c54272873fc3588..23849b7c53dfa60d0da454a10e0db392476377e5 100644 (file)
@@ -315,8 +315,9 @@ void Model_AttributeRefList::reinit()
 
 void Model_AttributeRefList::createHash()
 {
-  if (myHashUsed)
+  if (myHashUsed) {
     return;
+  }
   eraseHash();
   std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(
     owner()->document());
@@ -331,8 +332,6 @@ void Model_AttributeRefList::createHash()
         myHashObjects.insert(anObj);
       }
     }
-    if (!myHashObjects.empty()) // on open document with multi-rotation referenced have no results
-      myHashUsed = true;
   }
 }
 
index 9780013ef40159a4b45cdb38a1bf161afab3dd97..f8502a8b5b382967eb4794c2b411ab1cf52be434 100644 (file)
@@ -86,7 +86,11 @@ public:
 
   /// Returns true if attribute was  initialized by some value
   MODEL_EXPORT virtual bool isInitialized();
- protected:
+
+  /// Erases the hashed objects caused by complicated modifications in the list
+  void eraseHash();
+
+protected:
   /// Objects are created for features automatically
   MODEL_EXPORT Model_AttributeRefList(TDF_Label& theLabel);
   /// Reinitializes the internal state of the attribute (may be needed on undo/redo, abort, etc)
@@ -97,8 +101,6 @@ public:
     std::shared_ptr<Model_Document> theDoc) const;
   /// Creates the hash-objects containers (does nothing if hash is already correct)
   void createHash();
-  /// Erases the hashed objects caused by complicated modifications in the list
-  void eraseHash();
 
   friend class Model_Data;
 };
index 0d6479c3f8b149cb23c341d540a10883542c3573..3fc0035b2b2d818623eaf0496f3cd4f37dabcd0c 100644 (file)
@@ -29,6 +29,7 @@
 #include <Model_ResultGroup.h>
 #include <Model_ResultField.h>
 #include <Model_ResultParameter.h>
+#include <Model_AttributeRefList.h>
 #include <ModelAPI_Validator.h>
 #include <ModelAPI_CompositeFeature.h>
 #include <ModelAPI_Tools.h>
@@ -995,6 +996,12 @@ void Model_Objects::synchronizeBackRefsForObject(const std::set<AttributePtr>& t
   // iterate new list to compare with current
   std::set<AttributePtr>::iterator aNewIter = theNewRefs.begin();
   for(; aNewIter != theNewRefs.end(); aNewIter++) {
+    // for the Model_AttributeRefList erase cash (issue #2819)
+    std::shared_ptr<Model_AttributeRefList> aRefList =
+      std::dynamic_pointer_cast<Model_AttributeRefList>(*aNewIter);
+    if (aRefList)
+      aRefList->eraseHash();
+
     if (aData->refsToMe().find(*aNewIter) == aData->refsToMe().end()) {
       FeaturePtr aRefFeat = std::dynamic_pointer_cast<ModelAPI_Feature>((*aNewIter)->owner());
       if (aRefFeat)