X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModel%2FModel_Update.cpp;h=98d13b066b410deb6d813c01e22827520efa7214;hb=97917d3698f5a2f7fc9596e7c755ff8f6751e373;hp=45aee1b8a7b7df33eb6e0ab6403c2efd87ccbb5a;hpb=8338c0986c3e651d44c2e7cd1de6d0c86ce5c4a8;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 45aee1b8a..98d13b066 --- 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 @@ -40,8 +39,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -76,10 +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 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); + 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; @@ -240,8 +239,6 @@ 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()<& 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) { @@ -568,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; @@ -714,7 +724,8 @@ bool Model_Update::processFeature(FeaturePtr theFeature) 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->firstResult()->groupName() == ModelAPI_ResultPart::group() || + theFeature->getKind() == "Sketch"); } else { aDoExecute = aState != ModelAPI_StateInvalidArgument; } @@ -903,7 +914,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( @@ -913,7 +924,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) @@ -991,6 +1002,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(); @@ -1043,6 +1056,7 @@ void Model_Update::updateStability(void* theSender) } } } +// LCOV_EXCL_STOP void Model_Update::updateSelection(const std::set >& theObjects) {