]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #295: the rest files for the fix
authormpv <mikhail.ponikarov@opencascade.com>
Tue, 23 Dec 2014 13:04:02 +0000 (16:04 +0300)
committermpv <mikhail.ponikarov@opencascade.com>
Tue, 23 Dec 2014 13:04:02 +0000 (16:04 +0300)
src/Model/Model_Document.cpp
src/Model/Model_Document.h
src/Model/Model_ResultPart.cpp
src/Model/Model_ResultPart.h
src/Model/Model_Session.cpp
src/Model/Model_Update.cpp

index 3dedf9e1a7b8e8580c58eb6941a18eb80f91daae..1e38773f03f964aa93d42e1b23b65273b6c0d61a 100644 (file)
@@ -205,19 +205,17 @@ bool Model_Document::save(const char* theFileName, std::list<std::string>& theRe
   myTransactionSave = myTransactionsCounter;
   if (isDone) {  // save also sub-documents if any
     theResults.push_back(TCollection_AsciiString(aPath).ToCString());
-    std::set<std::string>::iterator aSubIter = mySubs.begin();
-    for (; aSubIter != mySubs.end() && isDone; aSubIter++) {
+    const std::set<std::string> aSubs = subDocuments(true);
+    std::set<std::string>::iterator aSubIter = aSubs.begin();
+    for (; aSubIter != aSubs.end() && isDone; aSubIter++) {
       isDone = subDoc(*aSubIter)->save(theFileName, theResults);
     }
+    const std::set<std::string> allSubs = subDocuments(false);
     if (isDone) { // also try to copy the not-activated sub-documents
-      // they are not in mySubs but as ResultParts
-      int aPartsNum = size(ModelAPI_ResultPart::group());
-      for(int aPart = 0; aPart < aPartsNum; aPart++) {
-        ResultPartPtr aPartRes = std::dynamic_pointer_cast<ModelAPI_ResultPart>
-          (object(ModelAPI_ResultPart::group(), aPart));
-        if (aPartRes) {
-          std::string aDocName = aPartRes->data()->name();
-          if (!aDocName.empty() && mySubs.find(aDocName) == mySubs.end()) {
+      for(aSubIter = allSubs.begin(); aSubIter != allSubs.end(); aSubIter++) {
+        if (aSubs.find(*aSubIter) == aSubs.end()) { // filter out the active subs
+          std::string aDocName = *aSubIter;
+          if (!aDocName.empty() && aSubs.find(aDocName) == aSubs.end()) {
             // just copy file
             TCollection_AsciiString aSubPath(DocFileName(anApp->loadPath().c_str(), aDocName));
             OSD_Path aPath(aSubPath);
@@ -246,10 +244,10 @@ void Model_Document::close(const bool theForever)
     aPM->setActiveDocument(aPM->moduleDocument());
   }
   // close all subs
-  std::set<std::string>::iterator aSubIter = mySubs.begin();
-  for (; aSubIter != mySubs.end(); aSubIter++)
+  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);
-  mySubs.clear();
 
   // close for thid document needs no transaction in this document
   std::static_pointer_cast<Model_Session>(Model_Session::get())->setCheckTransactions(false);
@@ -294,8 +292,9 @@ void Model_Document::startOperation()
     myDoc->NewCommand();
   }
   // new command for all subs
-  std::set<std::string>::iterator aSubIter = mySubs.begin();
-  for (; aSubIter != mySubs.end(); aSubIter++)
+  const std::set<std::string> aSubs = subDocuments(true);
+  std::set<std::string>::iterator aSubIter = aSubs.begin();
+  for (; aSubIter != aSubs.end(); aSubIter++)
     subDoc(*aSubIter)->startOperation();
 }
 
@@ -353,8 +352,9 @@ void Model_Document::finishOperation()
         ->setCheckTransactions(true);  // for nested transaction commit
 
   // finish for all subs first: to avoid nested finishing and "isOperation" calls problems inside
-  std::set<std::string>::iterator aSubIter = mySubs.begin();
-  for (; aSubIter != mySubs.end(); aSubIter++)
+  const std::set<std::string> aSubs = subDocuments(true);
+  std::set<std::string>::iterator aSubIter = aSubs.begin();
+  for (; aSubIter != aSubs.end(); aSubIter++)
     subDoc(*aSubIter)->finishOperation();
 
   if (myNestedNum != -1)  // this nested transaction is owervritten
@@ -388,8 +388,9 @@ void Model_Document::abortOperation()
   }
   synchronizeFeatures(true, false); // references were not changed since transaction start
   // abort for all subs
-  std::set<std::string>::iterator aSubIter = mySubs.begin();
-  for (; aSubIter != mySubs.end(); aSubIter++)
+  const std::set<std::string> aSubs = subDocuments(true);
+  std::set<std::string>::iterator aSubIter = aSubs.begin();
+  for (; aSubIter != aSubs.end(); aSubIter++)
     subDoc(*aSubIter)->abortOperation();
 }
 
@@ -411,8 +412,9 @@ bool Model_Document::canUndo()
       && myTransactionsCounter != 0 /* for omitting the first useless transaction */)
     return true;
   // check other subs contains operation that can be undoed
-  std::set<std::string>::iterator aSubIter = mySubs.begin();
-  for (; aSubIter != mySubs.end(); aSubIter++)
+  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;
   return false;
@@ -427,8 +429,9 @@ void Model_Document::undo()
     myDoc->Undo();
   synchronizeFeatures(true, true);
   // undo for all subs
-  std::set<std::string>::iterator aSubIter = mySubs.begin();
-  for (; aSubIter != mySubs.end(); aSubIter++)
+  const std::set<std::string> aSubs = subDocuments(true);
+  std::set<std::string>::iterator aSubIter = aSubs.begin();
+  for (; aSubIter != aSubs.end(); aSubIter++)
     subDoc(*aSubIter)->undo();
 }
 
@@ -437,8 +440,9 @@ bool Model_Document::canRedo()
   if (myDoc->GetAvailableRedos() > 0)
     return true;
   // check other subs contains operation that can be redoed
-  std::set<std::string>::iterator aSubIter = mySubs.begin();
-  for (; aSubIter != mySubs.end(); aSubIter++)
+  const std::set<std::string> aSubs = subDocuments(true);
+  std::set<std::string>::iterator aSubIter = aSubs.begin();
+  for (; aSubIter != aSubs.end(); aSubIter++)
     if (subDoc(*aSubIter)->canRedo())
       return true;
   return false;
@@ -453,8 +457,9 @@ void Model_Document::redo()
   myTransactionsCounter++;
   synchronizeFeatures(true, true);
   // redo for all subs
-  std::set<std::string>::iterator aSubIter = mySubs.begin();
-  for (; aSubIter != mySubs.end(); aSubIter++)
+  const std::set<std::string> aSubs = subDocuments(true);
+  std::set<std::string>::iterator aSubIter = aSubs.begin();
+  for (; aSubIter != aSubs.end(); aSubIter++)
     subDoc(*aSubIter)->redo();
 }
 
@@ -579,7 +584,7 @@ void Model_Document::removeFeature(FeaturePtr theFeature, const bool theCheck)
   ModelAPI_EventCreator::get()->sendDeleted(theFeature->document(), ModelAPI_Feature::group());
 }
 
-FeaturePtr Model_Document::feature(TDF_Label& theLabel)
+FeaturePtr Model_Document::feature(TDF_Label& theLabel) const
 {
   if (myObjs.IsBound(theLabel))
     return myObjs.Find(theLabel);
@@ -609,17 +614,35 @@ ObjectPtr Model_Document::object(TDF_Label theLabel)
 
 std::shared_ptr<ModelAPI_Document> Model_Document::subDocument(std::string theDocID)
 {
-  // just store sub-document identifier here to manage it later
-  if (mySubs.find(theDocID) == mySubs.end())
-    mySubs.insert(theDocID);
   return Model_Application::getApplication()->getDocument(theDocID);
 }
 
+const std::set<std::string> Model_Document::subDocuments(const bool theActivatedOnly) const
+{
+  std::set<std::string> aResult;
+  // comment must be in any feature: it is kind
+  int anIndex = 0;
+  TDF_ChildIDIterator aLabIter(featuresLabel(), TDataStd_Comment::GetID());
+  for (; aLabIter.More(); aLabIter.Next()) {
+    TDF_Label aFLabel = aLabIter.Value()->Label();
+    FeaturePtr aFeature = feature(aFLabel);
+    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++) {
+      if ((*aRIter)->groupName() != ModelAPI_ResultPart::group()) continue;
+      if ((*aRIter)->isInHistory()) {
+        ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(*aRIter);
+        if (aPart && (!theActivatedOnly || aPart->isActivated()))
+          aResult.insert(aPart->data()->name());
+      }
+    }
+  }
+  return aResult;
+}
+
 std::shared_ptr<Model_Document> Model_Document::subDoc(std::string theDocID)
 {
   // just store sub-document identifier here to manage it later
-  if (mySubs.find(theDocID) == mySubs.end())
-    mySubs.insert(theDocID);
   return std::dynamic_pointer_cast<Model_Document>(
     Model_Application::getApplication()->getDocument(theDocID));
 }
@@ -710,7 +733,7 @@ int Model_Document::size(const std::string& theGroupID, const bool theHidden)
   return aResult;
 }
 
-TDF_Label Model_Document::featuresLabel()
+TDF_Label Model_Document::featuresLabel() const
 {
   return myDoc->Main().FindChild(TAG_OBJECTS);
 }
index 75825586474b1dd93bef02be0455018c9a034273..6aa9ef4e83578e0e0793e58107c887da9086960e 100644 (file)
@@ -85,7 +85,7 @@ class Model_Document : public ModelAPI_Document
 
   //! Returns the existing feature by the label
   //! \param theLabel base label of the feature
-  MODEL_EXPORT virtual FeaturePtr feature(TDF_Label& theLabel);
+  MODEL_EXPORT virtual FeaturePtr feature(TDF_Label& theLabel) const;
 
   //! Returns the existing object: result or feature
   //! \param theLabel base label of the object
@@ -144,7 +144,7 @@ class Model_Document : public ModelAPI_Document
  protected:
 
   //! Returns (creates if needed) the features label
-  TDF_Label featuresLabel();
+  TDF_Label featuresLabel() const;
 
   //! Initializes feature with a unique name in this group (unique name is generated as 
   //! feature type + "_" + index
@@ -184,7 +184,7 @@ class Model_Document : public ModelAPI_Document
   void updateResults(FeaturePtr theFeature);
 
   //! Returns all sub documents
-  const std::set<std::string>& subDocuments() const {return mySubs;}
+  const std::set<std::string> subDocuments(const bool theActivatedOnly) const;
 
   friend class Model_Application;
   friend class Model_Session;
@@ -208,8 +208,6 @@ class Model_Document : public ModelAPI_Document
   /// Optimization for finding the shape-label by topological naming names
   std::map<std::string, TDF_Label> myNamingNames;
 
-  ///< set of identifiers of sub-documents of this document
-  std::set<std::string> mySubs;
   /// transaction indexes (related to myTransactionsAfterSave) which were empty in this doc
   std::map<int, bool> myIsEmptyTr;
   /// If it is true, features are not executed on update (on abort, undo, redo)
index cc1666e5b3a43976ba1d61d718bebbcc69565d1d..1ec015c90c4d117a2c83468d615fbb35d383f6ef 100644 (file)
@@ -36,7 +36,7 @@ void Model_ResultPart::activate()
 {
   std::shared_ptr<ModelAPI_AttributeDocRef> aDocRef = data()->document(DOC_REF());
   
-  if (!aDocRef->value()) {  // create (or open) a document if it is not yet created
+  if (!aDocRef->value().get()) {  // create (or open) a document if it is not yet created
     std::shared_ptr<ModelAPI_Document> aDoc = document()->subDocument(data()->name());
     if (aDoc) {
       aDocRef->setValue(aDoc);
@@ -45,3 +45,9 @@ void Model_ResultPart::activate()
   if (aDocRef->value())
     ModelAPI_Session::get()->setActiveDocument(aDocRef->value());
 }
+
+bool Model_ResultPart::isActivated() 
+{
+  std::shared_ptr<ModelAPI_AttributeDocRef> aDocRef = data()->document(DOC_REF());
+  return aDocRef->value().get();
+}
index e88d22aa28caa47d10dc550521524220bd9b4e12..8397a9766969df1b7f1561410ff00dd7ee34717b 100644 (file)
@@ -35,6 +35,9 @@ protected:
   /// Sets the data manager of an object (document does), here also attributes are initialized
   virtual void setData(std::shared_ptr<ModelAPI_Data> theData);
 
+  /// Returns true if document is activated (loaded into the memory)
+  virtual bool isActivated();
+
   friend class Model_Document;
 };
 
index 9430c7a16fce92d46ae8ac72f9cd2c08504e160d..88d9f81d47c47720e58b62e8010b83fa365259ef 100644 (file)
@@ -190,8 +190,9 @@ std::list<std::shared_ptr<ModelAPI_Document> > Model_Session::allOpenedDocuments
     DocumentPtr anAPIDoc = *aDoc;
     std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(anAPIDoc);
     if (aDoc) {
-      std::set<std::string>::const_iterator aSubIter = aDoc->subDocuments().cbegin();
-      for(; aSubIter != aDoc->subDocuments().cend(); aSubIter++) {
+      const std::set<std::string> aSubs = aDoc->subDocuments(true);
+      std::set<std::string>::const_iterator aSubIter = aSubs.cbegin();
+      for(; aSubIter != aSubs.cend(); aSubIter++) {
         if (!Model_Application::getApplication()->isLoadByDemand(*aSubIter)) {
           aResult.push_back(Model_Application::getApplication()->getDocument(*aSubIter));
         }
index 91751aa772becc664787e5ce6007dfe6f0c17507..d6f02c5f79f2bf3eae4970f4042fa91e4b40f390 100644 (file)
@@ -155,7 +155,7 @@ void Model_Update::updateInDoc(std::shared_ptr<ModelAPI_Document> theDoc)
   // all sub-documents one by one
   std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(theDoc);
   if (aDoc) {
-    const std::set<std::string>& aSubs = aDoc->subDocuments();
+    const std::set<std::string> aSubs = aDoc->subDocuments(true);
     for(std::set<std::string>::iterator aSub = aSubs.begin(); aSub != aSubs.end(); aSub++) {
       DocumentPtr aSubDoc = theDoc->subDocument(*aSub);
       if (aSubDoc) {