-// 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
//
// 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<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include <Model_Update.h>
std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
const std::set<ObjectPtr>& anObjs = aMsg->objects();
std::set<ObjectPtr>::const_iterator anObjIter = anObjs.cbegin();
+ std::list<ObjectPtr> aFeatures, aResults;
for(; anObjIter != anObjs.cend(); anObjIter++) {
if (std::dynamic_pointer_cast<Model_Document>((*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) {
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<ModelAPI_OrderUpdatedMessage> aMsg =
}
// searching for the next not used reason
aProcessedReasons.insert(aReason);
- aReasons.erase(aReason);
+ // check theFeature is still in the list of modified, because it may be removed sometimes
+ // while updating SketchPlugin_Ellipse
+ if (myModified.find(theFeature) != myModified.end())
+ aReasons.erase(aReason);
+ else
+ break;
}
// restore the modified reasons: they will be used in the update of arguments
if (allSubsUsed) { // restore theFeature in this set
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;
}
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(
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)
for (; aRefsIter != aRefs.end(); aRefsIter++) {
std::shared_ptr<Model_AttributeSelection> aSel =
std::dynamic_pointer_cast<Model_AttributeSelection>(*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<int> aRemoveSet;
std::shared_ptr<ModelAPI_AttributeSelectionList> aSel =
std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(*aRefsIter);
for(int a = aSel->size() - 1; a >= 0; a--) {
std::shared_ptr<Model_AttributeSelection> aSelAttr =
std::dynamic_pointer_cast<Model_AttributeSelection>(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);
}
}
}