X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultCompSolid.cpp;h=633e8cd08d920035e40ca45483629af46de0ff02;hb=69290817c24cb8b9d240129d8573b46807a007ef;hp=c1bfa0f4f0d00a81a84bc494db13c2be27b28c84;hpb=f328eabbb64e9fe347f36728710ebe1ebb00de6e;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultCompSolid.cpp b/src/Model/Model_ResultCompSolid.cpp index c1bfa0f4f..633e8cd08 100755 --- a/src/Model/Model_ResultCompSolid.cpp +++ b/src/Model/Model_ResultCompSolid.cpp @@ -23,6 +23,9 @@ Model_ResultCompSolid::Model_ResultCompSolid() { myBuilder = new Model_BodyBuilder(this); + myLastConcealed = false; + setIsConcealed(myLastConcealed); + myIsDisabled = true; // by default it is not initialized and false to be after created updateSubs(shape()); // in case of open, etc. } @@ -90,17 +93,62 @@ bool Model_ResultCompSolid::setDisabled(std::shared_ptr theThis bool aChanged = ModelAPI_ResultBody::setDisabled(theThis, theFlag); if (aChanged) { // state is changed, so modifications are needed myBuilder->evolutionToSelection(theFlag); + updateSubs(shape()); // to set disabled/enabled } return aChanged; } +bool Model_ResultCompSolid::isConcealed() +{ + bool aResult = false;; + if (ModelAPI_ResultCompSolid::isConcealed()) { + aResult = true; + } else { + std::vector >::const_iterator aSubIter = mySubs.cbegin(); + for(; aSubIter != mySubs.cend(); aSubIter++) + if ((*aSubIter)->isConcealed()) + aResult = true; + } + if (myLastConcealed != aResult) { + myLastConcealed = aResult; + setIsConcealed(aResult); // set for all subs the same result + } + return aResult; +} + +void Model_ResultCompSolid::setIsConcealed(const bool theValue) +{ + ModelAPI_ResultCompSolid::setIsConcealed(theValue); + std::vector >::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); + } + } + } +} + void Model_ResultCompSolid::updateSubs(const std::shared_ptr& theThisShape) { + static Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); + static Events_ID EVENT_UPD = aLoop->eventByName(EVENT_OBJECT_UPDATED); + static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); // iterate all sub-solids of compsolid to make sub-results synchronized with them TopoDS_Shape aThisShape; if (theThisShape.get()) aThisShape = theThisShape->impl(); if (!aThisShape.IsNull() && (aThisShape.ShapeType() == TopAbs_COMPSOLID || aThisShape.ShapeType() == TopAbs_COMPOUND)) { + bool aWasEmpty = mySubs.empty(); Model_Objects* anObjects = std::dynamic_pointer_cast(document())->objects(); unsigned int aSubIndex = 0; TopExp_Explorer aSolids(aThisShape, TopAbs_SOLID); @@ -108,7 +156,7 @@ void Model_ResultCompSolid::updateSubs(const std::shared_ptr& the std::shared_ptr aSolidShape(new GeomAPI_Shape); aSolidShape->setImpl(new TopoDS_Shape(aSolids.Current())); ResultBodyPtr aSub; - if (mySubs.size() >= aSubIndex) { // it is needed to create a new sub-result + if (mySubs.size() <= aSubIndex) { // it is needed to create a new sub-result aSub = anObjects->createBody(this->data(), aSubIndex); mySubs.push_back(aSub); } else { // just update shape of this result @@ -116,14 +164,11 @@ void Model_ResultCompSolid::updateSubs(const std::shared_ptr& the } if (!aSolidShape->isEqual(aSub->shape())) { aSub->store(aSolidShape); - static Events_Loop* aLoop = Events_Loop::loop(); - static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); - static Events_ID EVENT_UPD = aLoop->eventByName(EVENT_OBJECT_UPDATED); - static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); aECreator->sendUpdated(aSub, EVENT_DISP); aECreator->sendUpdated(aSub, EVENT_UPD); } - aSub->setDisabled(aSub, false); + aSub->setDisabled(aSub, isDisabled()); + aSub->setIsConcealed(myLastConcealed); } // erase left, unused results while(mySubs.size() > aSubIndex) { @@ -131,11 +176,17 @@ void Model_ResultCompSolid::updateSubs(const std::shared_ptr& the anErased->setDisabled(anErased, true); mySubs.pop_back(); } - } else { // erase all subs + if (aWasEmpty) { // erase all subs + // redisplay this because result with and without subs are displayed differently + aECreator->sendUpdated(data()->owner(), EVENT_DISP); + } + } else if (!mySubs.empty()) { // erase all subs while(!mySubs.empty()) { ResultBodyPtr anErased = *(mySubs.rbegin()); anErased->setDisabled(anErased, true); mySubs.pop_back(); } + // redisplay this because result with and without subs are displayed differently + aECreator->sendUpdated(data()->owner(), EVENT_DISP); } -} \ No newline at end of file +}