]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Make feature nested into other feature makes all nested features active
authormpv <mpv@opencascade.com>
Wed, 20 May 2015 12:59:59 +0000 (15:59 +0300)
committermpv <mpv@opencascade.com>
Wed, 20 May 2015 12:59:59 +0000 (15:59 +0300)
src/Model/Model_Document.cpp
src/ModelAPI/ModelAPI_Feature.cpp
src/ModelAPI/ModelAPI_Feature.h
src/ModelAPI/ModelAPI_Result.cpp

index 4bf71d0346a33bc709a7d05e9d0c4cc0b3a6860f..3f1ae6a4d2da036ba6fbc0bab291a725b8fdfcfb 100644 (file)
@@ -655,6 +655,7 @@ void Model_Document::setCurrentFeature(std::shared_ptr<ModelAPI_Feature> theCurr
 {
   TDF_Label aRefLab = generalLabel().FindChild(TAG_CURRENT_FEATURE);
   if (theCurrent.get()) {
+    /*
     if (theVisible) { // make features below which are not in history also enabled: sketch subs
       FeaturePtr aNext = myObjs->nextFeature(theCurrent);
       for (; aNext.get(); aNext = myObjs->nextFeature(theCurrent)) {
@@ -664,7 +665,18 @@ void Model_Document::setCurrentFeature(std::shared_ptr<ModelAPI_Feature> theCurr
           theCurrent = aNext;
         }
       }
+    }*/
+    // if feature nests into compisite feature, make the composite feature as current
+    const std::set<AttributePtr>& aRefsToMe = theCurrent->data()->refsToMe();
+    std::set<AttributePtr>::const_iterator aRefToMe = aRefsToMe.begin();
+    for(; aRefToMe != aRefsToMe.end(); aRefToMe++) {
+      CompositeFeaturePtr aComposite = 
+        std::dynamic_pointer_cast<ModelAPI_CompositeFeature>((*aRefToMe)->owner());
+      if (aComposite.get() && aComposite->isSub(theCurrent)) {
+        theCurrent = aComposite;
+      }
     }
+
     std::shared_ptr<Model_Data> aData = std::static_pointer_cast<Model_Data>(theCurrent->data());
     if (!aData.get()) return; // unknown case
     TDF_Label aFeatureLabel = aData->label().Father();
@@ -679,19 +691,31 @@ void Model_Document::setCurrentFeature(std::shared_ptr<ModelAPI_Feature> theCurr
     aRefLab.ForgetAttribute(TDF_Reference::GetID());
   }
   // make all features after this feature disabled in reversed order (to remove results without deps)
+  static Events_Loop* aLoop = Events_Loop::loop();
+  static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+
+  // if the current feature is composite features, all sub-features also must be enabled
+  CompositeFeaturePtr aCurComp = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(theCurrent);
+
+
   bool aPassed = false; // flag that the current object is already passed in cycle
   FeaturePtr anIter = myObjs->lastFeature();
   for(; anIter.get(); anIter = myObjs->nextFeature(anIter, true)) {
     // check this before passed become enabled: the current feature is enabled!
     if (anIter == theCurrent) aPassed = true;
 
-    if (anIter->setDisabled(!aPassed)) {
+    bool aDisabledFlag = !aPassed;
+    if (aCurComp.get() && aCurComp->isSub(anIter))
+      aDisabledFlag = false;
+    if (anIter->setDisabled(aDisabledFlag)) {
       // state of feature is changed => so feature become updated
-      static Events_ID anUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED);
+      static Events_ID anUpdateEvent = aLoop->eventByName(EVENT_OBJECT_UPDATED);
       ModelAPI_EventCreator::get()->sendUpdated(anIter, anUpdateEvent);
-
+      // flush is in the end of this method
+      ModelAPI_EventCreator::get()->sendUpdated(anIter, aRedispEvent /*, false*/);
     }
   }
+  aLoop->flush(aRedispEvent);
 }
 
 TDF_Label Model_Document::generalLabel() const
index 3002d889e840e5358a867786c069d17b1a23e13a..1fe0244f0d91aa4a654cf10bdf77d4a00668f4f3 100644 (file)
@@ -45,8 +45,11 @@ void ModelAPI_Feature::setResult(const std::shared_ptr<ModelAPI_Result>& theResu
   } else {
     myResults.push_back(theResult);
   }
-  // in any case result decomes enabled
+  // in any case result becomes enabled
   theResult->setDisabled(theResult, false);
+  // flush vidualisation changes
+  static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+  aLoop->flush(aRedispEvent);
 }
 
 void ModelAPI_Feature::setResult(const std::shared_ptr<ModelAPI_Result>& theResult,
@@ -62,14 +65,22 @@ void ModelAPI_Feature::setResult(const std::shared_ptr<ModelAPI_Result>& theResu
     *aResIter = theResult;
   }
   theResult->setDisabled(theResult, false);
+  // flush visualisation changes
+  static Events_Loop* aLoop = Events_Loop::loop();
+  static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+  aLoop->flush(aRedispEvent);
 }
 
 void ModelAPI_Feature::removeResult(const std::shared_ptr<ModelAPI_Result>& theResult)
 {
   theResult->setDisabled(theResult, true);
+  // flush visualisation changes
+  static Events_Loop* aLoop = Events_Loop::loop();
+  static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+  aLoop->flush(aRedispEvent);
 }
 
-void ModelAPI_Feature::removeResults(const int theSinceIndex)
+void ModelAPI_Feature::removeResults(const int theSinceIndex, const bool theFlush)
 {
   std::list<std::shared_ptr<ModelAPI_Result> >::iterator aResIter = myResults.begin();
   for(int anIndex = 0; anIndex < theSinceIndex && aResIter != myResults.end(); anIndex++)
@@ -84,6 +95,12 @@ void ModelAPI_Feature::removeResults(const int theSinceIndex)
       aNextIter++;
     }
   }
+  if (theFlush) {
+    // flush visualisation changes
+    static Events_Loop* aLoop = Events_Loop::loop();
+    static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+    aLoop->flush(aRedispEvent);
+  }
 }
 
 void ModelAPI_Feature::eraseResults()
@@ -131,7 +148,6 @@ FeaturePtr ModelAPI_Feature::feature(ObjectPtr theObject)
   return aFeature;
 }
 
-
 bool ModelAPI_Feature::isMacro() const
 {
   return false;
@@ -142,12 +158,12 @@ bool ModelAPI_Feature::setDisabled(const bool theFlag)
   if (myIsDisabled != theFlag) {
     myIsDisabled = theFlag;
     if (myIsDisabled) {
-      eraseResults();
+      removeResults(0, false); // flush will be in setCurrentFeature
     } else {
       // enable all disabled previously results
       std::list<std::shared_ptr<ModelAPI_Result> >::iterator aResIter = myResults.begin();
       for(; aResIter != myResults.end(); aResIter++) {
-        (*aResIter)->setDisabled(*aResIter, false); // just enable results
+        (*aResIter)->setDisabled(*aResIter, false);
       }
     }
     return true;
index 72d58660dadb2ccbd6cfca172c189d0e70afa59a..436a1adbfec81f98050d257a3084e5993634eafe 100644 (file)
@@ -83,7 +83,9 @@ class ModelAPI_Feature : public ModelAPI_Object
   /// removes the result from the feature
   MODELAPI_EXPORT void removeResult(const std::shared_ptr<ModelAPI_Result>& theResult);
   /// removes all results starting from the gived index (zero-based)
-  MODELAPI_EXPORT void removeResults(const int theSinceIndex);
+  /// \param theSinceIndex - index of the deleted result and all after also will be deleted
+  /// \param theFlush - if it is false, REDISPLAY message is not flushed
+  MODELAPI_EXPORT void removeResults(const int theSinceIndex, const bool theFlush = true);
   /// removes all results from the feature
   MODELAPI_EXPORT void eraseResults();
   /// removes all fields from this feature: results, data, etc
index c16732d99a9d9d0ad8ce117e7f5eede5ef277df0..1816c54d990c9392093afc6958decc215000bf3c 100644 (file)
@@ -27,10 +27,10 @@ bool ModelAPI_Result::setDisabled(std::shared_ptr<ModelAPI_Result> theThis, cons
       aECreator->sendDeleted(document(), groupName());
     } else { // un-disabled equals to created
       static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_CREATED);
-      aECreator->sendUpdated(theThis, anEvent, false); // do not group: creation must be immediate
+      aECreator->sendUpdated(theThis, anEvent /*, false*/); // flush is in setCurrentFeature
     }
     static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
-    aECreator->sendUpdated(theThis, EVENT_DISP, false);
+    aECreator->sendUpdated(theThis, EVENT_DISP/*, false*/); // flush is in setCurrentFeature
     return true;
   }
   return false;