X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultCompSolid.cpp;h=00ca3915dcf558830a21b2eff65517d88e287793;hb=73b293b1c77ab13ac9fbbb2aefb3b8573e63180b;hp=5209b2d686648376481fb6b48f563898be6301d9;hpb=f89745134c4ef9681dddbcf7ac5ab2a25d4831da;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultCompSolid.cpp b/src/Model/Model_ResultCompSolid.cpp index 5209b2d68..00ca3915d 100755 --- a/src/Model/Model_ResultCompSolid.cpp +++ b/src/Model/Model_ResultCompSolid.cpp @@ -10,8 +10,6 @@ #include #include #include -#include -#include #include #include #include @@ -23,7 +21,7 @@ Model_ResultCompSolid::Model_ResultCompSolid() { myBuilder = new Model_BodyBuilder(this); - setIsConcealed(false); + myLastConcealed = false; updateSubs(shape()); // in case of open, etc. } @@ -32,12 +30,6 @@ Model_ResultCompSolid::~Model_ResultCompSolid() updateSubs(std::shared_ptr()); // erase sub-results } -void Model_ResultCompSolid::initAttributes() -{ - DataPtr aData = data(); - aData->addAttribute(COLOR_ID(), ModelAPI_AttributeIntArray::typeId()); -} - void Model_ResultCompSolid::store(const std::shared_ptr& theShape) { ModelAPI_ResultCompSolid::store(theShape); @@ -60,7 +52,7 @@ void Model_ResultCompSolid::storeModified(const std::shared_ptr& int Model_ResultCompSolid::numberOfSubs(bool forTree) const { - return mySubs.size(); + return int(mySubs.size()); } std::shared_ptr Model_ResultCompSolid::subResult(const int theIndex, @@ -98,13 +90,63 @@ bool Model_ResultCompSolid::setDisabled(std::shared_ptr theThis bool Model_ResultCompSolid::isConcealed() { - if (ModelAPI_ResultCompSolid::isConcealed()) - return true; - std::vector >::const_iterator aSubIter = mySubs.cbegin(); - for(; aSubIter != mySubs.cend(); aSubIter++) - if ((*aSubIter)->isConcealed()) - return true; - return false; + bool aResult = false;; + if (ModelAPI_ResultCompSolid::isConcealed()) { + aResult = true; + } else { + std::vector >::const_iterator aSubIter = mySubs.cbegin(); + 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 + std::vector >::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) +{ + if (theValue != ModelAPI_ResultCompSolid::isConcealed()) { + std::vector >::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); + // to set correct myLastConcealed + isConcealed(); + } + //myLastConcealed = theValue; } void Model_ResultCompSolid::updateSubs(const std::shared_ptr& theThisShape) @@ -121,10 +163,10 @@ void Model_ResultCompSolid::updateSubs(const std::shared_ptr& the bool aWasEmpty = mySubs.empty(); Model_Objects* anObjects = std::dynamic_pointer_cast(document())->objects(); unsigned int aSubIndex = 0; - TopExp_Explorer aSolids(aThisShape, TopAbs_SOLID); - for(; aSolids.More(); aSolids.Next(), aSubIndex++) { - std::shared_ptr aSolidShape(new GeomAPI_Shape); - aSolidShape->setImpl(new TopoDS_Shape(aSolids.Current())); + TopoDS_Iterator aShapesIter(aThisShape); + for(; aShapesIter.More(); aShapesIter.Next(), aSubIndex++) { + std::shared_ptr aShape(new GeomAPI_Shape); + aShape->setImpl(new TopoDS_Shape(aShapesIter.Value())); ResultBodyPtr aSub; if (mySubs.size() <= aSubIndex) { // it is needed to create a new sub-result aSub = anObjects->createBody(this->data(), aSubIndex); @@ -132,12 +174,13 @@ void Model_ResultCompSolid::updateSubs(const std::shared_ptr& the } else { // just update shape of this result aSub = mySubs[aSubIndex]; } - if (!aSolidShape->isEqual(aSub->shape())) { - aSub->store(aSolidShape); + if (!aShape->isEqual(aSub->shape())) { + aSub->store(aShape, false); aECreator->sendUpdated(aSub, EVENT_DISP); aECreator->sendUpdated(aSub, EVENT_UPD); } aSub->setDisabled(aSub, isDisabled()); + aSub->setIsConcealed(myLastConcealed); } // erase left, unused results while(mySubs.size() > aSubIndex) { @@ -159,3 +202,17 @@ void Model_ResultCompSolid::updateSubs(const std::shared_ptr& the aECreator->sendUpdated(data()->owner(), EVENT_DISP); } } + +bool Model_ResultCompSolid::isLatestEqual(const std::shared_ptr& theShape) +{ + if (myBuilder->isLatestEqual(theShape)) + return true; + // also check that it is asked for sub-elements + std::vector >::const_iterator aSubIter = mySubs.cbegin(); + for(; aSubIter != mySubs.cend(); aSubIter++) { + if (aSubIter->get() && (*aSubIter)->isLatestEqual(theShape)) { + return true; + } + } + return false; +}