X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModel%2FModel_Update.cpp;h=bb00695b2f8fe2b726a2ab875535d059871d1e20;hb=b12bbd2a734142a2596a91c729b6670060b6b7e9;hp=c081fbd7079b1dd1691ccb4a116d7452dad0d93e;hpb=471cc7b52168016a3b6fff7e64cdd800cd7d8f91;p=modules%2Fshaper.git diff --git a/src/Model/Model_Update.cpp b/src/Model/Model_Update.cpp index c081fbd70..bb00695b2 100755 --- a/src/Model/Model_Update.cpp +++ b/src/Model/Model_Update.cpp @@ -71,9 +71,19 @@ bool Model_Update::addModified(FeaturePtr theFeature, FeaturePtr theReason) { if (!theFeature->data()->isValid()) return false; // delete an extrusion created on the sketch - if (theFeature->isPersistentResult()) { - if (!std::dynamic_pointer_cast((theFeature)->document())->executeFeatures()) + bool isNotExecuted = theFeature->isPersistentResult() && + !std::dynamic_pointer_cast((theFeature)->document())->executeFeatures(); + if (isNotExecuted) { + if (!theReason.get()) // no reason => no construction reason return false; + if (myNotPersistentRefs.find(theFeature) == myNotPersistentRefs.end()) { + myNotPersistentRefs[theFeature].insert(theReason); + } else { + std::set > aNewSet; + aNewSet.insert(theReason); + myNotPersistentRefs[theFeature] = aNewSet; + } + return false; } // update arguments for "apply button" state change @@ -95,13 +105,21 @@ bool Model_Update::addModified(FeaturePtr theFeature, FeaturePtr theReason) { static ModelAPI_ValidatorsFactory* aFactory = ModelAPI_Session::get()->validators(); aFactory->validate(theFeature); // need to be validated to update the "Apply" state if not previewed + // to redisplay split's arguments presentation, even result is not computed + if (!theFeature->isPreviewNeeded()) { + static Events_Loop* aLoop = Events_Loop::loop(); + static const Events_ID kRedisplayEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); + ModelAPI_EventCreator::get()->sendUpdated(theFeature, kRedisplayEvent); + aLoop->flush(kRedisplayEvent); + } + if (!myIsPreviewBlocked) return true; } if (myModified.find(theFeature) != myModified.end()) { if (theReason.get()) { #ifdef DEB_UPDATE - std::cout<<"*** Add already modified "<name()<<" reason "<name()<name()<<" reason "<name()<name()<<" reason "<name()<name()<name()<<" reason "<name()<name()<data()->execState() == ModelAPI_StateDone) @@ -132,7 +151,7 @@ bool Model_Update::addModified(FeaturePtr theFeature, FeaturePtr theReason) { else return true; // do not need iteration deeply if it is already marked as modified or so #ifdef DEB_UPDATE - std::cout<<"*** Set modified state "<name()<name()<& theMessag } else if (theMessage->eventID() == kReorderEvent) { std::shared_ptr aMsg = std::dynamic_pointer_cast(theMessage); - addModified(aMsg->reordered(), aMsg->reordered()); // to update all attributes + if (aMsg->reordered().get()) + addModified(aMsg->reordered(), aMsg->reordered()); // to update all attributes } } @@ -441,6 +461,10 @@ bool Model_Update::processFeature(FeaturePtr theFeature) } } updateArguments(theFeature); + // send event that sketch is prepared to be recomputed + static Events_ID& anID = Events_Loop::eventByName("SketchPrepared"); + std::shared_ptr aMsg(new Events_Message(anID, this)); + Events_Loop::loop()->send(aMsg); } if (!aIsModified) { // no modification is needed @@ -504,6 +528,8 @@ bool Model_Update::processFeature(FeaturePtr theFeature) // add this feature to the processed right now to be able remove it from this list on // update signal during this feature execution myModified.erase(theFeature); + if (myNotPersistentRefs.find(theFeature) != myNotPersistentRefs.end()) + myNotPersistentRefs.erase(theFeature); if (theFeature->data()->execState() == ModelAPI_StateMustBeUpdated) theFeature->data()->execState(ModelAPI_StateDone); @@ -727,18 +753,33 @@ bool Model_Update::isReason(std::shared_ptr& theFeature, { std::map, std::set > > ::iterator aReasonsIt = myModified.find(theFeature); - if (aReasonsIt == myModified.end()) - return false; // this case only for not-previewed items update state, nothing is changed in args for it - if (aReasonsIt->second.find(theFeature) != aReasonsIt->second.end()) - return true; // any is reason if it contains itself - FeaturePtr aReasFeat = std::dynamic_pointer_cast(theReason); - if (!aReasFeat.get()) { // try to get feature of this result - ResultPtr aReasRes = std::dynamic_pointer_cast(theReason); - if (aReasRes.get()) - aReasFeat = theReason->document()->feature(aReasRes); - } - return aReasonsIt->second.find(aReasFeat) != aReasonsIt->second.end(); + if (aReasonsIt != myModified.end()) { + if (aReasonsIt->second.find(theFeature) != aReasonsIt->second.end()) + return true; // any is reason if it contains itself + FeaturePtr aReasFeat = std::dynamic_pointer_cast(theReason); + if (!aReasFeat.get()) { // try to get feature of this result + ResultPtr aReasRes = std::dynamic_pointer_cast(theReason); + if (aReasRes.get()) + aReasFeat = theReason->document()->feature(aReasRes); + } + if (aReasonsIt->second.find(aReasFeat) != aReasonsIt->second.end()) + return true; + } + // another try: postponed modification by not-persistences + std::map, std::set > > + ::iterator aNotPersist = myNotPersistentRefs.find(theFeature); + if (aNotPersist != myNotPersistentRefs.end()) { + FeaturePtr aReasFeat = std::dynamic_pointer_cast(theReason); + if (!aReasFeat.get()) { // try to get feature of this result + ResultPtr aReasRes = std::dynamic_pointer_cast(theReason); + if (aReasRes.get()) + aReasFeat = theReason->document()->feature(aReasRes); + } + if (aNotPersist->second.find(aReasFeat) != aNotPersist->second.end()) + return true; + } + return false; // this case only for not-previewed items update state, nothing is changed in args for it } void Model_Update::executeFeature(FeaturePtr theFeature)