X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultCompSolid.cpp;h=f7cbeba3ce63902964d5bc25827e3b9206cef889;hb=530f5aff42069e844c4a4ef164088ea23ba0e2dd;hp=4747d651174244f7cc3b9abc858af3067f289b54;hpb=4063affbf39e5baa78da18b4532003dfd329edba;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultCompSolid.cpp b/src/Model/Model_ResultCompSolid.cpp index 4747d6511..f7cbeba3c 100755 --- a/src/Model/Model_ResultCompSolid.cpp +++ b/src/Model/Model_ResultCompSolid.cpp @@ -23,8 +23,7 @@ Model_ResultCompSolid::Model_ResultCompSolid() { myBuilder = new Model_BodyBuilder(this); - setIsConcealed(false); - myIsDisabled = true; // by default it is not initialized and false to be after created + myLastConcealed = false; updateSubs(shape()); // in case of open, etc. } @@ -61,7 +60,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, @@ -99,13 +98,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) @@ -122,10 +171,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); @@ -133,12 +182,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) { @@ -160,3 +210,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; +}