]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix for the issue #2020 : take into account not yet loaded documents to generate...
authormpv <mpv@opencascade.com>
Wed, 22 Mar 2017 14:44:51 +0000 (17:44 +0300)
committermpv <mpv@opencascade.com>
Wed, 22 Mar 2017 14:45:12 +0000 (17:45 +0300)
src/Model/Model_Application.cpp
src/Model/Model_Application.h
src/Model/Model_Document.cpp
src/Model/Model_ResultPart.cpp

index 50fa75c0478896d638676807d39ea928d8dad73b..e6170af5c12bee586e13fab20b10fce79a011b5a 100644 (file)
@@ -116,9 +116,9 @@ const std::string& Model_Application::loadPath() const
 }
 
 //=======================================================================
-void Model_Application::setLoadByDemand(std::string theID)
+void Model_Application::setLoadByDemand(std::string theID, const int theDocID)
 {
-  myLoadedByDemand.insert(theID);
+  myLoadedByDemand[theID] = theDocID;
 }
 
 //=======================================================================
@@ -150,8 +150,21 @@ void Model_Application::removeUselessDocuments(
 
 int Model_Application::generateDocumentId()
 {
-  int aResult = int(myDocs.size());
-  for(; myDocs.find(aResult) != myDocs.end(); aResult++) {} // count until the result id is unique
+  int aResult;
+  // count until the result id is unique
+  for(aResult = int(myDocs.size()); true; aResult++) {
+    if (myDocs.find(aResult) == myDocs.end()) {
+      bool aFound = false;
+      std::map<std::string, int>::iterator aLBDIter = myLoadedByDemand.begin();
+      for(; aLBDIter != myLoadedByDemand.end(); aLBDIter++) {
+        if (aLBDIter->second == aResult) {
+          aFound = true;
+          break;
+        }
+      }
+      if (!aFound) break;
+    }
+  }
   return aResult;
 }
 
index 492326dc32657f5e61fabb33cde4bac0e7d6cdb3..f1ca5af06b6eb2fb0ecce309471b268b29bd2f96 100644 (file)
@@ -61,7 +61,7 @@ public:
   //! Returns the path for the loaded by demand documents
   const std::string& loadPath() const;
   //! Defines that specified document must be loaded by demand
-  void setLoadByDemand(std::string theID);
+  void setLoadByDemand(std::string theID, const int theDocID);
   //! Returns true if specified document must be loaded by demand
   bool isLoadByDemand(std::string theID);
   //! Closes and removes the documents that are not loaded by demand and
@@ -88,8 +88,8 @@ public:
   std::map<int, std::shared_ptr<Model_Document> > myDocs;
   /// Path for the loaded by demand documents
   std::string myPath;
-  /// Path for the loaded by demand documents
-  std::set<std::string> myLoadedByDemand;
+  /// Path for the loaded by demand documents (and the persistent ID as the value)
+  std::map<std::string, int> myLoadedByDemand;
 };
 
 #endif
index d4e7b2d23a2bf5bdd88e30bd4fb5a62acf31ebc3..ce8386a2ef30547398597ecd3b3321697c0979bd 100755 (executable)
@@ -222,7 +222,8 @@ bool Model_Document::load(const char* theDirName, const char* theFileName, Docum
     for(; aPartRes != aPartResults.end(); aPartRes++) {
       ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(*aPartRes);
       if (aPart.get())
-        anApp->setLoadByDemand(aPart->data()->name());
+        anApp->setLoadByDemand(aPart->data()->name(),
+          aPart->data()->document(ModelAPI_ResultPart::DOC_REF())->docId());
     }
 
   } else { // open failed, but new documnet was created to work with it: inform the model
index 93830df4439592b7e13183b1432131460f41df3e..d067868692f3cc37314523c448165cbd02fb313c 100644 (file)
@@ -43,7 +43,7 @@ void Model_ResultPart::initAttributes()
 
   if (aDocRef->isInitialized() && // initialized immideately means already exist and will be loaded
       !Model_Application::getApplication()->hasDocument(aDocRef->docId()))
-    Model_Application::getApplication()->setLoadByDemand(data()->name());
+    Model_Application::getApplication()->setLoadByDemand(data()->name(), aDocRef->docId());
 }
 
 std::shared_ptr<ModelAPI_Document> Model_ResultPart::partDoc()