]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix for the issue #1089
authormpv <mpv@opencascade.com>
Tue, 17 Nov 2015 07:15:15 +0000 (10:15 +0300)
committermpv <mpv@opencascade.com>
Tue, 17 Nov 2015 07:15:15 +0000 (10:15 +0300)
src/Model/Model_Objects.cpp
src/Model/Model_Update.cpp
src/ModelAPI/ModelAPI_Tools.cpp
src/ModelAPI/ModelAPI_Tools.h

index 87848db8410b9d1cf6944865403f915a564819ad..045dfe44e09e25f08abd933711fce983973450a3 100644 (file)
@@ -792,14 +792,15 @@ void Model_Objects::synchronizeBackRefs()
       synchronizeBackRefsForObject(aFound->second, aFeature);
     }
     // also for results
-    const std::list<std::shared_ptr<ModelAPI_Result> >& aResults = aFeature->results();
-    std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aRes = aResults.cbegin();
-    for(; aRes != aResults.cend(); aRes++) {
-      aFound = allRefs.find(*aRes);
+    std::list<ResultPtr> aResults;
+    ModelAPI_Tools::allResults(aFeature, aResults);
+    std::list<ResultPtr>::iterator aRIter = aResults.begin();
+    for(; aRIter != aResults.cend(); aRIter++) {
+      aFound = allRefs.find(*aRIter);
       if (aFound == allRefs.end()) { // not found => erase all back references
-        synchronizeBackRefsForObject(anEmpty, *aRes);
+        synchronizeBackRefsForObject(anEmpty, *aRIter);
       } else {
-        synchronizeBackRefsForObject(aFound->second, *aRes);
+        synchronizeBackRefsForObject(aFound->second, *aRIter);
       }
     }
   }
index 96db87ded0cb7ece4401622ab801fb448aef57cb..e6d83e1970dbeebf619f32df6eb8dd12dc871bf1 100644 (file)
@@ -398,9 +398,11 @@ void Model_Update::redisplayWithResults(FeaturePtr theFeature, const ModelAPI_Ex
 {
   // make updated and redisplay all results
   static Events_ID EVENT_DISP = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
-  const std::list<std::shared_ptr<ModelAPI_Result> >& aResults = theFeature->results();
-  std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aRIter = aResults.begin();
-  for (; aRIter != aResults.cend(); aRIter++) {
+
+  std::list<ResultPtr> allResults;
+  ModelAPI_Tools::allResults(theFeature, allResults);
+  std::list<ResultPtr>::iterator aRIter = allResults.begin();
+  for (; aRIter != allResults.cend(); aRIter++) {
     std::shared_ptr<ModelAPI_Result> aRes = *aRIter;
     if (!aRes->isDisabled()) {// update state only for enabled results (Placement Result Part may make the original Part Result as invalid)
       aRes->data()->execState(theState);
@@ -411,23 +413,6 @@ void Model_Update::redisplayWithResults(FeaturePtr theFeature, const ModelAPI_Ex
       aRes->data()->setUpdateID(theFeature->data()->updateID());
     }
     ModelAPI_EventCreator::get()->sendUpdated(aRes, EVENT_DISP);
-    // iterate sub-bodies of compsolid
-    ResultCompSolidPtr aComp = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(aRes);
-    if (aComp.get()) {
-      int aNumSub = aComp->numberOfSubs();
-      for(int a = 0; a < aNumSub; a++) {
-        ResultPtr aSub = aComp->subResult(a);
-        if (!aSub->isDisabled()) {// update state only for enabled results (Placement Result Part may make the original Part Result as invalid)
-          aSub->data()->execState(theState);
-          if (theState == ModelAPI_StateDone) // feature become "done", so execution changed results
-            myUpdated[aSub] = myModification;
-        }
-        if (theFeature->data()->updateID() > aSub->data()->updateID()) {
-          aSub->data()->setUpdateID(theFeature->data()->updateID());
-        }
-        ModelAPI_EventCreator::get()->sendUpdated(aSub, EVENT_DISP);
-      }
-    }
   }
   // to redisplay "presentable" feature (for ex. distance constraint)
   ModelAPI_EventCreator::get()->sendUpdated(theFeature, EVENT_DISP);
@@ -463,8 +448,9 @@ bool Model_Update::isOlder(std::shared_ptr<ModelAPI_Feature> theFeature,
   // for the modification IDs compare results: modification ID of feature means only that attributes
   // of this feature were updated, but if results are obsolete relatively to the referenced results,
   // the feature must be updated
-  const std::list<std::shared_ptr<ModelAPI_Result> >& aResults = theFeature->results();
-  std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aRIter = aResults.begin();
+  std::list<ResultPtr> aResults;
+  ModelAPI_Tools::allResults(theFeature, aResults);
+  std::list<ResultPtr>::iterator aRIter = aResults.begin();
   for (; aRIter != aResults.cend(); aRIter++) {
     std::shared_ptr<ModelAPI_Result> aRes = *aRIter;
     if (!aRes->isDisabled()) {
@@ -473,21 +459,6 @@ bool Model_Update::isOlder(std::shared_ptr<ModelAPI_Feature> theFeature,
         return true;
       if (anRIter->second < anAIter->second)
         return true;
-      // iterate sub-bodies of compsolid
-      ResultCompSolidPtr aComp = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(aRes);
-      if (aComp.get()) {
-        int aNumSub = aComp->numberOfSubs();
-        for(int a = 0; a < aNumSub; a++) {
-          ResultPtr aSub = aComp->subResult(a);
-          if (!aSub->isDisabled()) {// update state only for enabled results (Placement Result Part may make the original Part Result as invalid)
-            std::map<std::shared_ptr<ModelAPI_Object>, int >::iterator anSIter = myUpdated.find(aSub);
-            if (anSIter == myUpdated.end()) // not updated at all
-              return true;
-            if (anSIter->second < anAIter->second)
-              return true;
-          }
-        }
-      }
     }
   }
   // also check a feature: some have no parameters,
index 56c2a0fe63e6aafcd1788b030e76ed4139765699..4fa9775d62a73cacacadc47df946fb5692e9ee33 100755 (executable)
@@ -211,5 +211,23 @@ bool hasSubResults(const ResultPtr& theResult)
   return aCompSolid.get() && aCompSolid->numberOfSubs() > 0;
 }
 
+void allResults(const FeaturePtr& theFeature, std::list<ResultPtr>& theResults)
+{
+  const std::list<std::shared_ptr<ModelAPI_Result> >& aResults = theFeature->results();
+  std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aRIter = aResults.begin();
+  for (; aRIter != aResults.cend(); aRIter++) {
+    theResults.push_back(*aRIter);
+    // iterate sub-bodies of compsolid
+    ResultCompSolidPtr aComp = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(*aRIter);
+    if (aComp.get()) {
+      int aNumSub = aComp->numberOfSubs();
+      for(int a = 0; a < aNumSub; a++) {
+        theResults.push_back(aComp->subResult(a));
+      }
+    }
+  }
+}
+
 } // namespace ModelAPI_Tools
 
+
index e404948351996280801243db79916e95448ee942..9d544cbf8e4afac7941e6ba851f1abf37e308c61 100755 (executable)
@@ -74,6 +74,11 @@ MODELAPI_EXPORT ResultCompSolidPtr compSolidOwner(const ResultPtr& theSub);
 */
 MODELAPI_EXPORT bool hasSubResults(const ResultPtr& theResult);
 
+/*!
+* Adds the results of the given feature to theResults list: including disabled and sub-results
+*/
+MODELAPI_EXPORT void allResults(const FeaturePtr& theFeature, std::list<ResultPtr>& theResults);
+
 }
 
 #endif