X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Update.cpp;h=07f87c3edadc54194c031f07628d568c490c5fbe;hb=4150a5d2828f69cb474640506a878074366ac1ec;hp=5e2ccff5f8726e77de59cbef4692acd2857e95ad;hpb=2039f5bde5c0079337835c88e62109bc7aa610fa;p=modules%2Fshaper.git diff --git a/src/Model/Model_Update.cpp b/src/Model/Model_Update.cpp old mode 100755 new mode 100644 index 5e2ccff5f..07f87c3ed --- a/src/Model/Model_Update.cpp +++ b/src/Model/Model_Update.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include @@ -43,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -77,6 +77,8 @@ 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 kAutoRecomp = aLoop->eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE); + aLoop->registerListener(this, kAutoRecomp); // Config_PropManager::findProp("Model update", "automatic_rebuild")->value() == "true"; myIsParamUpdated = false; @@ -298,16 +300,19 @@ void Model_Update::processEvent(const std::shared_ptr& theMessag std::dynamic_pointer_cast(theMessage); const std::set& anObjs = aMsg->objects(); std::set::const_iterator anObjIter = anObjs.cbegin(); + std::list aFeatures, aResults; for(; anObjIter != anObjs.cend(); anObjIter++) { if (std::dynamic_pointer_cast((*anObjIter)->document())->executeFeatures()) { if ((*anObjIter)->groupName() == ModelAPI_Feature::group()) { // results creation means enabling, not update - ModelAPI_EventCreator::get()->sendUpdated(*anObjIter, kUpdatedEvent); + aFeatures.push_back(*anObjIter); } else { - ModelAPI_EventCreator::get()->sendUpdated(*anObjIter, kRedisplayEvent); + aResults.push_back(*anObjIter); } } } + ModelAPI_EventCreator::get()->sendUpdated(aFeatures, kUpdatedEvent); + ModelAPI_EventCreator::get()->sendUpdated(aResults, kRedisplayEvent); return; } if (theMessage->eventID() == kUpdatedEvent) { @@ -436,7 +441,7 @@ void Model_Update::processEvent(const std::shared_ptr& theMessag Events_Loop::loop()->flush(kRedisplayEvent); // in the end of transaction everything is updated, so clear the old objects - myIsParamUpdated = false; + //myIsParamUpdated = false; // to avoid problems in sprocket.py parameter update myWaitForFinish.clear(); } else if (theMessage->eventID() == kReorderEvent) { std::shared_ptr aMsg = @@ -563,36 +568,46 @@ bool Model_Update::processFeature(FeaturePtr theFeature) // update the sketch plane before the sketch sub-elements are recomputed // (otherwise sketch will update plane, modify subs, after executed, but with old subs edges) - if (aIsModified && theFeature->getKind() == "Sketch") { + if (aIsModified && theFeature->getKind() == "Sketch") { #ifdef DEB_UPDATE - std::cout<<"****** Update sketch args "<name()<name() << std::endl; #endif - AttributeSelectionPtr anExtSel = theFeature->selection("External"); - if (anExtSel.get()) { - ResultPtr aContext = anExtSel->context(); - if (aContext.get() && aContext->document().get()) { - FeaturePtr anExtBase = aContext->document()->feature(aContext); - if (anExtBase.get()) { - processFeature(anExtBase); + AttributeSelectionPtr anExtSel = theFeature->selection("External"); + if (anExtSel.get()) { + ResultPtr aContext = anExtSel->context(); + if (aContext.get() && aContext->document().get()) { + FeaturePtr anExtBase = aContext->document()->feature(aContext); + if (anExtBase.get()) { + processFeature(anExtBase); + } + std::shared_ptr anOrigin = + std::dynamic_pointer_cast(theFeature->attribute("Origin")); + double anOX = anOrigin->x(), anOY = anOrigin->y(), anOZ = anOrigin->z(); + std::shared_ptr aDir = + std::dynamic_pointer_cast(theFeature->attribute("DirX")); + double aDX = aDir->x(), aDY = aDir->y(), aDZ = aDir->z(); + std::shared_ptr aNorm = + std::dynamic_pointer_cast(theFeature->attribute("Norm")); + double aNX = aNorm->x(), aNY = aNorm->y(), aNZ = aNorm->z(); + // update sketch plane + updateArguments(theFeature); + theFeature->attributeChanged("External"); // to recompute origin, direction and normal + // check it is updated, so all must be changed + if (anOrigin->x() != anOX || anOrigin->y() != anOY || anOrigin->z() != anOZ || + aDir->x() != aDX || aDir->y() != aDY || aDir->z() != aDZ || + aNorm->x() != aNX || aNorm->y() != aNY || aNorm->z() != aNZ) + { + std::set aWholeR; + allReasons(theFeature, aWholeR); + std::set::iterator aRIter = aWholeR.begin(); + for (; aRIter != aWholeR.end(); aRIter++) { + if ((*aRIter)->data()->selection("External").get()) + (*aRIter)->attributeChanged("External"); + } + } } } } - std::shared_ptr aShapeBefore = anExtSel->value(); - if (!aShapeBefore.get() && anExtSel->context()) aShapeBefore = anExtSel->context()->shape(); - updateArguments(theFeature); - std::shared_ptr aShapeAfter = anExtSel->value(); - if (!aShapeAfter.get() && anExtSel->context()) aShapeAfter = anExtSel->context()->shape(); - // if selected plane is changed, try to re-take external references of all subs of the sketch - if (aShapeBefore.get() && !aShapeBefore->isEqual(aShapeAfter)) { - std::set aWholeR; - allReasons(theFeature, aWholeR); - std::set::iterator aRIter = aWholeR.begin(); - for(; aRIter != aWholeR.end(); aRIter++) { - if ((*aRIter)->data()->selection("External")) - (*aRIter)->attributeChanged("External"); - } - } - } if (!aIsModified) { // no modification is needed return false; @@ -707,10 +722,8 @@ bool Model_Update::processFeature(FeaturePtr theFeature) 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() || - theFeature->getKind() == "Sketch"); + } else if (theFeature->results().size()) { // execute only not persistent results features + aDoExecute = !theFeature->isPersistentResult(); } else { aDoExecute = aState != ModelAPI_StateInvalidArgument; } @@ -899,7 +912,7 @@ void Model_Update::updateArguments(FeaturePtr theFeature) { if (aSelAttr) { ObjectPtr aContext = aSelAttr->context(); // update argument only if the referenced object is ready to use - if (aContext.get() && !aContext->isDisabled() && !aSelAttr->isInvalid()) { + if (aContext.get() && !aContext->isDisabled()) { if (isReason(theFeature, aContext)) { if (!aSelAttr->update()) { bool isObligatory = !aFactory->isNotObligatory( @@ -909,7 +922,7 @@ void Model_Update::updateArguments(FeaturePtr theFeature) { aState = ModelAPI_StateInvalidArgument; } } - } else if (aContext.get() || aSelAttr->isInvalid()) { + } else if (aContext.get()) { // here it may be not obligatory, but if the reference is wrong, it should not be correct bool isObligatory = aFactory->isCase(theFeature, theFeature->data()->id(aSel)); if (isObligatory) @@ -987,6 +1000,8 @@ void Model_Update::executeFeature(FeaturePtr theFeature) redisplayWithResults(theFeature, aState); } +// it is called on GUI edit of feature start +// LCOV_EXCL_START void Model_Update::updateStability(void* theSender) { static ModelAPI_ValidatorsFactory* aFactory = ModelAPI_Session::get()->validators(); @@ -1039,6 +1054,7 @@ void Model_Update::updateStability(void* theSender) } } } +// LCOV_EXCL_STOP void Model_Update::updateSelection(const std::set >& theObjects) { @@ -1050,19 +1066,27 @@ void Model_Update::updateSelection(const std::set aSel = std::dynamic_pointer_cast(*aRefsIter); - aSel->updateInHistory(); + bool aRemove = false; + aSel->updateInHistory(aRemove); } // update the selection list attributes if any aRefs = (*anObj)->data()->attributes(ModelAPI_AttributeSelectionList::typeId()); for (aRefsIter = aRefs.begin(); aRefsIter != aRefs.end(); aRefsIter++) { + std::set aRemoveSet; std::shared_ptr aSel = std::dynamic_pointer_cast(*aRefsIter); for(int a = aSel->size() - 1; a >= 0; a--) { std::shared_ptr aSelAttr = std::dynamic_pointer_cast(aSel->value(a)); - if (aSelAttr.get()) - aSelAttr->updateInHistory(); + if (aSelAttr.get()) { + bool theRemove = false; + aSelAttr->updateInHistory(theRemove); + if (theRemove) { + aRemoveSet.insert(a); + } + } } + aSel->remove(aRemoveSet); } } }