X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Update.cpp;h=23d96f4298a3d909c0a248f30e9c9f3e19a32080;hb=f36409774efce7c530518a1553946c9c76526fb9;hp=05a9998d837bbb127b30c31ac007a0f779d66395;hpb=41d3b8e362cefd0e733fda4ba7bd38db1fe27bbf;p=modules%2Fshaper.git diff --git a/src/Model/Model_Update.cpp b/src/Model/Model_Update.cpp index 05a9998d8..23d96f429 100755 --- a/src/Model/Model_Update.cpp +++ b/src/Model/Model_Update.cpp @@ -38,6 +38,8 @@ #include #include #include +#include +#include #include #include #include @@ -74,12 +76,17 @@ Model_Update::Model_Update() aLoop->registerListener(this, kReorderEvent); static const Events_ID kUpdatedSel = aLoop->eventByName(EVENT_UPDATE_SELECTION); aLoop->registerListener(this, kUpdatedSel); + static const Events_ID kAutomaticOff = aLoop->eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE); + aLoop->registerListener(this, kAutomaticOff); + static const Events_ID kAutomaticOn = aLoop->eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE); + aLoop->registerListener(this, kAutomaticOn); // Config_PropManager::findProp("Model update", "automatic_rebuild")->value() == "true"; myIsParamUpdated = false; myIsFinish = false; myIsProcessed = false; myIsPreviewBlocked = false; + myUpdateBlocked = false; } bool Model_Update::addModified(FeaturePtr theFeature, FeaturePtr theReason) { @@ -161,7 +168,7 @@ bool Model_Update::addModified(FeaturePtr theFeature, FeaturePtr theReason) { if (theReason.get()) aNewSet.insert(theReason); } - myModified[theFeature] = aNewSet; + myModified[theFeature] = aNewSet; #ifdef DEB_UPDATE if (theReason.get()) { //std::cout<<"*** Add modified "<name() @@ -191,7 +198,7 @@ bool Model_Update::addModified(FeaturePtr theFeature, FeaturePtr theReason) { } } } - // proccess also results + // process also results std::list allResults; // list of this feature and results ModelAPI_Tools::allResults(theFeature, allResults); std::list::iterator aRes = allResults.begin(); @@ -221,6 +228,7 @@ bool Model_Update::addModified(FeaturePtr theFeature, FeaturePtr theReason) { void Model_Update::processEvent(const std::shared_ptr& theMessage) { static Events_Loop* aLoop = Events_Loop::loop(); + static ModelAPI_ValidatorsFactory* aFactory = ModelAPI_Session::get()->validators(); static const Events_ID kCreatedEvent = aLoop->eventByName(EVENT_OBJECT_CREATED); static const Events_ID kUpdatedEvent = aLoop->eventByName(EVENT_OBJECT_UPDATED); static const Events_ID kOpFinishEvent = aLoop->eventByName("FinishOperation"); @@ -232,10 +240,38 @@ void Model_Update::processEvent(const std::shared_ptr& theMessag static const Events_ID kReorderEvent = aLoop->eventByName(EVENT_ORDER_UPDATED); static const Events_ID kRedisplayEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); static const Events_ID kUpdatedSel = aLoop->eventByName(EVENT_UPDATE_SELECTION); + static const Events_ID kAutomaticOff = aLoop->eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE); + static const Events_ID kAutomaticOn = aLoop->eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE); #ifdef DEB_UPDATE std::cout<<"****** Event "<eventID().eventText()<isAutoUpdateBlocked(); + if (myUpdateBlocked != aNewAutomaticState) { + myUpdateBlocked = aNewAutomaticState; + if (!myUpdateBlocked) { // process all modified features, even if preview is blocked + bool aPreviewBlockedState = myIsPreviewBlocked; // to update the selected arguments + myIsPreviewBlocked = false; + // iterate everything and add features in state "MustBeUpdated" into modified + std::list > allDocs = + ModelAPI_Session::get()->allOpenedDocuments(); + std::list >::iterator aDoc = allDocs.begin(); + for(; aDoc != allDocs.end(); aDoc++) { + std::list > allFeats = (*aDoc)->allFeatures(); + std::list >::iterator aFeat = allFeats.begin(); + for(; aFeat != allFeats.end(); aFeat++) { + if ((*aFeat)->data()->isValid() && + (*aFeat)->data()->execState() == ModelAPI_StateMustBeUpdated) { + addModified(*aFeat, FeaturePtr()); + } + } + } + processFeatures(); + myIsPreviewBlocked = myIsPreviewBlocked; + } + } + if (theMessage->eventID() == kStabilityEvent) { updateStability(theMessage->sender()); return; @@ -246,9 +282,12 @@ void Model_Update::processEvent(const std::shared_ptr& theMessag } if (theMessage->eventID() == kPreviewRequestedEvent) { if (myIsPreviewBlocked) { + bool anUpdateState = myUpdateBlocked; + myUpdateBlocked = false; myIsPreviewBlocked = false; processFeatures(); myIsPreviewBlocked = true; + myUpdateBlocked = anUpdateState; } return; } @@ -292,11 +331,23 @@ void Model_Update::processEvent(const std::shared_ptr& theMessag if ((*anObjIter)->groupName() == ModelAPI_ResultParameter::group()) { myIsParamUpdated = true; } - // on undo/redo, abort do not update persisten features + // on undo/redo, abort do not update persistent features FeaturePtr anUpdated = std::dynamic_pointer_cast(*anObjIter); if (anUpdated.get()) { if (addModified(anUpdated, FeaturePtr())) aSomeModified = true; + if (myUpdateBlocked) { // execute this feature anyway to show the current result + /*if (!anUpdated->isStable() && anUpdated->results().size() && ( + anUpdated->firstResult()->groupName() == ModelAPI_ResultBody::group() || + anUpdated->firstResult()->groupName() == ModelAPI_ResultPart::group())) { + if (aFactory->validate(anUpdated)) { + executeFeature(anUpdated); + redisplayWithResults(anUpdated, ModelAPI_StateNothing, false); + static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); + aLoop->flush(EVENT_DISP); + } + }*/ + } } else { // process the updated result as update of features that refers to this result const std::set >& @@ -325,7 +376,7 @@ void Model_Update::processEvent(const std::shared_ptr& theMessag theMessage->eventID() == kOpStartEvent) { myIsPreviewBlocked = false; - if (theMessage->eventID() == kOpFinishEvent) { + if (theMessage->eventID() == kOpFinishEvent) {// if update is blocked, skip myIsFinish = true; // add features that wait for finish as modified std::map, std::set > >:: @@ -337,14 +388,14 @@ void Model_Update::processEvent(const std::shared_ptr& theMessag continue; } std::set >::iterator aReasons; - for(aReasons = aFeature->second.begin(); aReasons != aFeature->second.end(); aReasons++) { + for(aReasons = aFeature->second.begin(); aReasons != aFeature->second.end(); aReasons++){ addModified(aFeature->first, *aReasons); } } } myIsFinish = false; } - // processed features must be only on finish, so clear anyway (to avoid reimport on load) + // processed features must be only on finish, so clear anyway (to avoid re-import on load) myProcessOnFinish.clear(); // #2156: current must be sketch, left after the macro execution @@ -362,7 +413,6 @@ void Model_Update::processEvent(const std::shared_ptr& theMessag anActiveDoc->setCurrentFeature(aCurrent, false); // #2156 make the current feature back } - // remove all macros before clearing all created std::set::iterator anUpdatedIter = myWaitForFinish.begin(); while(anUpdatedIter != myWaitForFinish.end()) { @@ -433,7 +483,7 @@ void Model_Update::processFeatures(const bool theFlushRedisplay) } } -// collects all the feautres this feature depends on: reasons +// collects all the features this feature depends on: reasons static void allReasons(FeaturePtr theFeature, std::set& theReasons) { std::list > > > aDeps; theFeature->data()->referencesToObjects(aDeps); @@ -640,7 +690,7 @@ bool Model_Update::processFeature(FeaturePtr theFeature) theFeature->data()->execState(ModelAPI_StateDone); // this checking must be after the composite feature sub-elements processing: - // composite feature status may depend on it's subelements + // composite feature status may depend on it's sub-elements if ((theFeature->data()->execState() == ModelAPI_StateInvalidArgument || isReferencedInvalid) && theFeature->getKind() != "Part") { // don't disable Part because it will make disabled all the features @@ -657,7 +707,23 @@ bool Model_Update::processFeature(FeaturePtr theFeature) ModelAPI_ExecState aState = theFeature->data()->execState(); if (aFactory->validate(theFeature)) { if (!isPostponedMain) { - executeFeature(theFeature); + bool aDoExecute = true; + if (myUpdateBlocked) { + if (!theFeature->isStable()) { + aDoExecute = true; + } else if (theFeature->results().size()) { // execute only not-results features + aDoExecute = !(theFeature->firstResult()->groupName() == ModelAPI_ResultBody::group() || + theFeature->firstResult()->groupName() == ModelAPI_ResultPart::group()); + } else { + aDoExecute = aState != ModelAPI_StateInvalidArgument; + } + } + if (aDoExecute) { + executeFeature(theFeature); + } else { + // store information that this feature must be executed later + theFeature->data()->execState(ModelAPI_StateMustBeUpdated); + } } } else { #ifdef DEB_UPDATE