]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Make correct management of concealed on history position changes (on edit, manual...
authormpv <mpv@opencascade.com>
Wed, 1 Jul 2015 14:50:40 +0000 (17:50 +0300)
committermpv <mpv@opencascade.com>
Wed, 1 Jul 2015 14:50:40 +0000 (17:50 +0300)
src/Model/Model_Data.cpp
src/Model/Model_Data.h
src/Model/Model_Document.cpp
src/Model/Model_Document.h
src/Model/Model_ResultPart.cpp
src/Model/Model_Update.cpp
src/Model/Model_Update.h
src/ModelAPI/ModelAPI_Document.h

index ae09db9b06f8fbb9155e3007648aff42fc3a4d9d..12f79ae5db1f0b6c324579d7f02cabb1a97f6c58 100644 (file)
@@ -324,27 +324,7 @@ void Model_Data::removeBackReference(FeaturePtr theFeature, std::string theAttrI
 
   // remove concealment immideately: on deselection it must be posible to reselect in GUI the same
   if (ModelAPI_Session::get()->validators()->isConcealed(theFeature->getKind(), theAttrID)) {
-    std::set<AttributePtr>::iterator aRefsIter = myRefsToMe.begin();
-    for(; aRefsIter != myRefsToMe.end(); aRefsIter++) {
-      if (aRefsIter->get()) {
-        FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>((*aRefsIter)->owner());
-        if (aFeature.get()) {
-          if (ModelAPI_Session::get()->validators()->isConcealed(
-                aFeature->getKind(), (*aRefsIter)->id())) {
-            return; // it is still concealed, nothing to do
-          }
-        }
-      }
-    }
-    // thus, no concealment references anymore => make not-concealed
-    std::shared_ptr<ModelAPI_Result> aRes = 
-      std::dynamic_pointer_cast<ModelAPI_Result>(myObject);
-    if (aRes.get()) {
-      aRes->setIsConcealed(false);
-      static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_CREATED);
-      ModelAPI_EventCreator::get()->sendUpdated(aRes, anEvent);
-      Events_Loop::loop()->flush(anEvent);
-    }
+    updateConcealmentFlag();
   }
 }
 
@@ -370,6 +350,31 @@ void Model_Data::addBackReference(FeaturePtr theFeature, std::string theAttrID,
   }
 }
 
+void Model_Data::updateConcealmentFlag()
+{
+  std::set<AttributePtr>::iterator aRefsIter = myRefsToMe.begin();
+  for(; aRefsIter != myRefsToMe.end(); aRefsIter++) {
+    if (aRefsIter->get()) {
+      FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>((*aRefsIter)->owner());
+      if (aFeature.get() && !aFeature->isDisabled()) {
+        if (ModelAPI_Session::get()->validators()->isConcealed(
+              aFeature->getKind(), (*aRefsIter)->id())) {
+          return; // it is still concealed, nothing to do
+        }
+      }
+    }
+  }
+  // thus, no concealment references anymore => make not-concealed
+  std::shared_ptr<ModelAPI_Result> aRes = 
+    std::dynamic_pointer_cast<ModelAPI_Result>(myObject);
+  if (aRes.get()) {
+    aRes->setIsConcealed(false);
+    static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_CREATED);
+    ModelAPI_EventCreator::get()->sendUpdated(aRes, anEvent);
+    Events_Loop::loop()->flush(anEvent);
+  }
+}
+
 void Model_Data::referencesToObjects(
   std::list<std::pair<std::string, std::list<ObjectPtr> > >& theRefs)
 {
index 9b46312b80babac57da023c2bce956cf2f762d91..5e51c9d506e26316402676362a96689cc3be1876 100644 (file)
@@ -222,6 +222,9 @@ private:
   void addBackReference(FeaturePtr theFeature, std::string theAttrID, 
     const bool theApplyConcealment = true);
 
+  /// Makes the concealment flag up to date for this object-owner.
+  MODEL_EXPORT virtual void updateConcealmentFlag();
+
   /// Returns true if object must be displayed in the viewer: flag is stored in the
   /// data model, so on undo/redo, open/save or recreation of object by history-playing it keeps
   /// the original state i nthe current transaction.
index a18375f865debf61efa7489cb36dcda87f6a68e4..62e27bdd0cbdd343cd149ad0ed74b00bcd6bdbb0 100644 (file)
@@ -723,6 +723,7 @@ void Model_Document::setCurrentFeature(std::shared_ptr<ModelAPI_Feature> theCurr
 
   bool aPassed = false; // flag that the current object is already passed in cycle
   FeaturePtr anIter = myObjs->lastFeature();
+  bool aWasChanged = false;
   for(; anIter.get(); anIter = myObjs->nextFeature(anIter, true)) {
     // check this before passed become enabled: the current feature is enabled!
     if (anIter == theCurrent) aPassed = true;
@@ -738,6 +739,17 @@ void Model_Document::setCurrentFeature(std::shared_ptr<ModelAPI_Feature> theCurr
       ModelAPI_EventCreator::get()->sendUpdated(anIter, anUpdateEvent);
       // flush is in the end of this method
       ModelAPI_EventCreator::get()->sendUpdated(anIter, aRedispEvent /*, false*/);
+      aWasChanged = true;
+    }
+    // update for everyone the concealment flag immideately: on edit feature in the midle of history
+    if (aWasChanged) {
+      const std::list<std::shared_ptr<ModelAPI_Result> >& aResList = anIter->results();
+      std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aRes = aResList.begin();
+      for(; aRes != aResList.end(); aRes++) {
+        if ((*aRes).get() && (*aRes)->data()->isValid() && !(*aRes)->isDisabled())
+          std::dynamic_pointer_cast<Model_Data>((*aRes)->data())->updateConcealmentFlag();
+      }
+
     }
   }
   // unblock  the flush signals and up them after this
@@ -885,3 +897,8 @@ void Model_Document::decrementTransactionID()
   int aNewVal = transactionID() - 1;
   TDataStd_Integer::Set(generalLabel().FindChild(TAG_CURRENT_TRANSACTION), aNewVal);
 }
+
+bool Model_Document::isOpened()
+{
+  return myObjs && !myDoc.IsNull();
+}
index 1aaca02ac372e4563dd4ad1706f6c611e72f239e..586d50a28b8981ee6443a898a4a3c8d84c48a9d4 100644 (file)
@@ -179,6 +179,9 @@ class Model_Document : public ModelAPI_Document
   /// Decreases the transaction ID
   MODEL_EXPORT virtual void decrementTransactionID();
 
+  /// Returns true if document is opened and valid
+  MODEL_EXPORT virtual bool isOpened();
+
  protected:
   //! Returns (creates if needed) the general label
   TDF_Label generalLabel() const;
index 5216e6107e6ad8639f2d9ac374ff60407d0e1211..a376cc88f1af8f486ef95d7013ed7478e158792f 100644 (file)
@@ -78,7 +78,7 @@ bool Model_ResultPart::setDisabled(std::shared_ptr<ModelAPI_Result> theThis,
 {
   if (ModelAPI_ResultPart::setDisabled(theThis, theFlag)) {
     DocumentPtr aDoc = Model_ResultPart::partDoc();
-    if (aDoc.get()) {
+    if (aDoc.get() && aDoc->isOpened()) {
       // make the current feature the last in any case: to update shapes defore deactivation too
       FeaturePtr aLastFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aDoc->object(
         ModelAPI_Feature::group(), aDoc->size(ModelAPI_Feature::group()) - 1));
index e3e9f548b74d5c56d651992a5f8b20497f70d861..7e592744b5f2efefee426ac1e295b86e74d12983 100644 (file)
@@ -148,7 +148,7 @@ void Model_Update::processOperation(const bool theTotalUpdate, const bool theFin
   if (theFinish) {
     // the hardcode (DBC asked): hide the sketch referenced by extrusion on apply
     std::set<std::shared_ptr<ModelAPI_Object> >::iterator aFIter;
-    for(aFIter = myJustUpdated.begin(); aFIter != myJustUpdated.end(); aFIter++)
+    for(aFIter = myWaitForFinish.begin(); aFIter != myWaitForFinish.end(); aFIter++)
     {
       FeaturePtr aF = std::dynamic_pointer_cast<ModelAPI_Feature>(*aFIter);
       if (aF && aF->data()->isValid() && aF->getKind() == "Extrusion") {
@@ -163,6 +163,7 @@ void Model_Update::processOperation(const bool theTotalUpdate, const bool theFin
         }
       }
     }
+    myWaitForFinish.clear();
   }
   // perform update of everything if needed
   if (!myIsExecuted) {
@@ -444,6 +445,7 @@ void Model_Update::executeFeature(FeaturePtr theFeature)
       aState = ModelAPI_StateExecFailed;
     } else {
       aState = ModelAPI_StateDone;
+      myWaitForFinish.insert(theFeature);
     }
   } catch(...) {
     aState = ModelAPI_StateExecFailed;
index 56a16cbd2c69fa14616e7521d5e33bfc0df74dae..1ae12eb09a913cb9d83ec1d21beb72fb9093a2a0 100644 (file)
@@ -25,6 +25,8 @@ class Model_Update : public Events_Listener
 {
   /// updated features during this transaction: must be updated immediately
   std::set<std::shared_ptr<ModelAPI_Object> > myJustUpdated;
+  /// features that must be additionally processed after execution of finish operation
+  std::set<std::shared_ptr<ModelAPI_Object> > myWaitForFinish;
   /// to know that all next updates are caused by this execution
   bool myIsExecuted;
   /// to know execute or not automatically all update
index b1aa60c7b41840214668748b376e4479734580be..2a97982b0a79f8b8711a316ac37144bc2b6edd90 100644 (file)
@@ -134,6 +134,10 @@ public:
   //! Returns true if this document is currently active
   virtual bool isActive() const = 0;
 
+  /// Returns true if document is opened and valid
+  virtual bool isOpened() = 0;
+
+
 protected:
   //! Only for SWIG wrapping it is here
   MODELAPI_EXPORT ModelAPI_Document();