]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix for the issue #1103
authormpv <mpv@opencascade.com>
Mon, 21 Dec 2015 08:46:09 +0000 (11:46 +0300)
committermpv <mpv@opencascade.com>
Mon, 21 Dec 2015 08:46:09 +0000 (11:46 +0300)
src/Model/Model_Data.cpp
src/Model/Model_ResultBody.cpp
src/Model/Model_ResultBody.h
src/Model/Model_ResultCompSolid.cpp

index ed612e5184306a7e84ff161ebdee3033815de629..47f27eaad514f8e309cc1894addc4d5f9eea34e6 100644 (file)
@@ -427,14 +427,10 @@ void Model_Data::updateConcealmentFlag()
       }
     }
   }
-  // thus, no concealment references anymore => make not-concealed
   std::shared_ptr<ModelAPI_Result> aRes = 
     std::dynamic_pointer_cast<ModelAPI_Result>(myObject);
   if (aRes.get()) {
-    // if compsolid result has subs, do nothing directly: it depends on the sub's status (#1100)
-    ResultCompSolidPtr aComp = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(myObject);
-    if (!aComp || aComp->numberOfSubs() == 0 || aComp->ModelAPI_ResultCompSolid::isConcealed())
-      aRes->setIsConcealed(false);
+    aRes->setIsConcealed(false);
   }
 }
 
index 8418ba22fa5c63adfe506f5f044f939c64ddc977..c4abb777c014ee86b92384a375cf3cdc677208ea 100644 (file)
@@ -7,6 +7,7 @@
 #include <Model_ResultBody.h>
 #include <Model_BodyBuilder.h>
 #include <ModelAPI_AttributeIntArray.h>
+#include <ModelAPI_Tools.h>
 #include <Config_PropManager.h>
 // DEB
 //#include <TCollection_AsciiString.hxx>
@@ -46,3 +47,18 @@ bool Model_ResultBody::isLatestEqual(const std::shared_ptr<GeomAPI_Shape>& theSh
 {
   return myBuilder->isLatestEqual(theShape);
 }
+
+bool Model_ResultBody::isConcealed()
+{
+  if (ModelAPI_ResultBody::isConcealed())
+    return true;
+  ResultPtr aThis = std::dynamic_pointer_cast<ModelAPI_Result>(data()->owner());
+  if (aThis.get()) {
+    ResultCompSolidPtr aParent = ModelAPI_Tools::compSolidOwner(aThis);
+    if (aParent.get()) {
+      if (aParent->isConcealed())
+        return true;
+    }
+  }
+  return false;
+}
index 3c4b0f9caad6e4a898ae28c6d78d607a1928866d..282c070470d48bf5c21df2c2eee497dbf55094a9 100644 (file)
@@ -41,6 +41,10 @@ public:
   MODEL_EXPORT virtual bool setDisabled(std::shared_ptr<ModelAPI_Result> theThis,
     const bool theFlag);
 
+  /// The compsolid is concealed if at least one of the sub is concealed,
+  /// so, sub is Concealed if at least one sub is concealed
+  MODEL_EXPORT virtual bool isConcealed();
+
   /// Returns true if the latest modification of this body in the naming history
   // is equal to the given shape
   MODEL_EXPORT virtual bool isLatestEqual(const std::shared_ptr<GeomAPI_Shape>& theShape);
index 96cdf32fce3e54337422005673f9a2907b137270..9022902982baa17301b3f14d8b5303f8c96f3320 100755 (executable)
@@ -103,36 +103,56 @@ bool Model_ResultCompSolid::isConcealed()
     aResult = true;
   } else {
     std::vector<std::shared_ptr<ModelAPI_ResultBody> >::const_iterator aSubIter = mySubs.cbegin();
-    for(; aSubIter != mySubs.cend(); aSubIter++)
-      if ((*aSubIter)->isConcealed())
+    for(; aSubIter != mySubs.cend(); aSubIter++) {
+      if ((*aSubIter)->ModelAPI_ResultBody::isConcealed()) {
         aResult = true;
+        break;
+      }
+    }
   }
   if (myLastConcealed != aResult) {
     myLastConcealed = aResult;
-    setIsConcealed(aResult); // set for all subs the same result
+    //setIsConcealed(aResult); // set for all subs the same result
+    std::vector<std::shared_ptr<ModelAPI_ResultBody> >::const_iterator aSubIter = mySubs.cbegin();
+    for(; aSubIter != mySubs.cend(); aSubIter++) { // update the visualization status of each sub
+      if ((*aSubIter)->ModelAPI_ResultBody::isConcealed() != aResult) {
+        if (aResult) { // hidden unit must be redisplayed (hidden)
+          ModelAPI_EventCreator::get()->sendDeleted(document(), (*aSubIter)->groupName());
+          // redisplay for the viewer (it must be disappeared also)
+          static Events_ID EVENT_DISP = 
+            Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+          ModelAPI_EventCreator::get()->sendUpdated(*aSubIter, EVENT_DISP);
+        } else { // was not concealed become concealed => delete event
+          static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_CREATED);
+          ModelAPI_EventCreator::get()->sendUpdated(*aSubIter, anEvent);
+        }
+      }
+    }
   }
   return aResult;
 }
 
 void Model_ResultCompSolid::setIsConcealed(const bool theValue)
 {
-  ModelAPI_ResultCompSolid::setIsConcealed(theValue);
-  std::vector<std::shared_ptr<ModelAPI_ResultBody> >::const_iterator aSubIter = mySubs.cbegin();
-  for(; aSubIter != mySubs.cend(); aSubIter++) {
-    if ((*aSubIter)->isConcealed() != theValue) {
-      (*aSubIter)->setIsConcealed(theValue);
-      if (theValue) { // hidden unit must be redisplayed (hidden)
-        ModelAPI_EventCreator::get()->sendDeleted(document(), (*aSubIter)->groupName());
-        // redisplay for the viewer (it must be disappeared also)
-        static Events_ID EVENT_DISP = 
-          Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
-        ModelAPI_EventCreator::get()->sendUpdated(*aSubIter, EVENT_DISP);
-      } else { // was not concealed become concealed => delete event
-        static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_CREATED);
-        ModelAPI_EventCreator::get()->sendUpdated(*aSubIter, anEvent);
+  if (theValue != ModelAPI_ResultCompSolid::isConcealed()) {
+    std::vector<std::shared_ptr<ModelAPI_ResultBody> >::const_iterator aSubIter = mySubs.cbegin();
+    for(; aSubIter != mySubs.cend(); aSubIter++) {
+      if ((*aSubIter)->ModelAPI_ResultBody::isConcealed() != theValue) {
+        if (theValue) { // hidden unit must be redisplayed (hidden)
+          ModelAPI_EventCreator::get()->sendDeleted(document(), (*aSubIter)->groupName());
+          // redisplay for the viewer (it must be disappeared also)
+          static Events_ID EVENT_DISP = 
+            Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+          ModelAPI_EventCreator::get()->sendUpdated(*aSubIter, EVENT_DISP);
+        } else { // was not concealed become concealed => delete event
+          static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_CREATED);
+          ModelAPI_EventCreator::get()->sendUpdated(*aSubIter, anEvent);
+        }
       }
     }
+    ModelAPI_ResultCompSolid::setIsConcealed(theValue);
   }
+  myLastConcealed = theValue;
 }
 
 void Model_ResultCompSolid::updateSubs(const std::shared_ptr<GeomAPI_Shape>& theThisShape)