X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModelAPI%2FModelAPI_Feature.cpp;h=3c78c82d0a254403579b4068b47877724efb30d6;hb=4af82842098757e6e7f4f28e2eb744d184bb2b3e;hp=14a1e396f55f0ad3c252e315a7c2c8f93d1937d0;hpb=758a57d77b6fa3a0485fa3378a1280c7e87a74aa;p=modules%2Fshaper.git diff --git a/src/ModelAPI/ModelAPI_Feature.cpp b/src/ModelAPI/ModelAPI_Feature.cpp index 14a1e396f..3c78c82d0 100644 --- a/src/ModelAPI/ModelAPI_Feature.cpp +++ b/src/ModelAPI/ModelAPI_Feature.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: ModelAPI_Feature.cpp // Created: 17 Jul 2014 // Author: Mikhail PONIKAROV @@ -10,60 +12,69 @@ #include #include -const std::list >& ModelAPI_Feature::results() +const std::list >& ModelAPI_Feature::results() { return myResults; } -boost::shared_ptr ModelAPI_Feature::firstResult() +std::shared_ptr ModelAPI_Feature::firstResult() { - return myResults.empty() ? boost::shared_ptr() : *(myResults.begin()); + return myResults.empty() ? std::shared_ptr() : *(myResults.begin()); } -void ModelAPI_Feature::setResult(const boost::shared_ptr& theResult) +std::shared_ptr ModelAPI_Feature::lastResult() { - if (firstResult() == theResult) { // just updated - static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); - ModelAPI_EventCreator::get()->sendUpdated(theResult, anEvent); - return; - } - // created - while (!myResults.empty()) { // remove one by one with messages - boost::shared_ptr aRes = *(myResults.begin()); - myResults.erase(myResults.begin()); - ModelAPI_EventCreator::get()->sendDeleted(aRes->document(), aRes->groupName()); + return myResults.empty() ? std::shared_ptr() : *(myResults.rbegin()); +} + +void ModelAPI_Feature::setResult(const std::shared_ptr& theResult) +{ + static Events_ID EVENT_UPD = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); + static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); + + if (firstResult() == theResult) { + // nothing to change + } else if (!myResults.empty()) { // all except first become disabled + std::list >::iterator aResIter = myResults.begin(); + *aResIter = theResult; + aECreator->sendUpdated(theResult, EVENT_UPD); + for(aResIter++; aResIter != myResults.end(); aResIter++) { + (*aResIter)->setDisabled((*aResIter), true); + } + } else { + myResults.push_back(theResult); } - myResults.push_back(theResult); - static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_CREATED); - ModelAPI_EventCreator::get()->sendUpdated(theResult, anEvent); - // Create event for first Feature - Events_Loop::loop()->flush(anEvent); + // in any case result becomes enabled + theResult->setDisabled(theResult, false); } -void ModelAPI_Feature::setResult(const boost::shared_ptr& theResult, +void ModelAPI_Feature::setResult(const std::shared_ptr& theResult, const int theIndex) { - std::list >::iterator aResIter = myResults.begin(); + std::list >::iterator aResIter = myResults.begin(); for (int anIndex = 0; anIndex < theIndex; anIndex++) { aResIter++; } if (aResIter == myResults.end()) { // append myResults.push_back(theResult); - static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_CREATED); - ModelAPI_EventCreator::get()->sendUpdated(theResult, anEvent); - // Create event for first Feature, send it to make "created" earlier than "updated" - // VSV: Commenting out of this statement causes problems with circle operation for example - Events_Loop::loop()->flush(anEvent); } else { // update *aResIter = theResult; - static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); - ModelAPI_EventCreator::get()->sendUpdated(theResult, anEvent); } + theResult->setDisabled(theResult, false); } -void ModelAPI_Feature::removeResult(const boost::shared_ptr& theResult) +void ModelAPI_Feature::removeResult(const std::shared_ptr& theResult) { - std::list >::iterator aResIter = myResults.begin(); + theResult->setDisabled(theResult, true); + // flush visualisation changes + static Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); + aLoop->flush(aRedispEvent); +} + +void ModelAPI_Feature::eraseResultFromList(const std::shared_ptr& theResult) +{ + std::list >::iterator aResIter = myResults.begin(); for(; aResIter != myResults.end(); aResIter++) { ResultPtr aRes = *aResIter; if (aRes == theResult) { @@ -71,7 +82,6 @@ void ModelAPI_Feature::removeResult(const boost::shared_ptr& th aRes->data()->erase(); myResults.erase(aResIter); - static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_DELETED); static Events_Loop* aLoop = Events_Loop::loop(); static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); @@ -82,42 +92,62 @@ void ModelAPI_Feature::removeResult(const boost::shared_ptr& th } } -void ModelAPI_Feature::eraseResults() +void ModelAPI_Feature::removeResults(const int theSinceIndex, const bool theFlush) { - if (!myResults.empty()) { - static Events_Loop* aLoop = Events_Loop::loop(); - static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); - static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); - - std::list >::iterator aResIter = myResults.begin(); - for(; aResIter != myResults.end(); aResIter++) { - (*aResIter)->data()->erase(); - ModelAPI_EventCreator::get()->sendDeleted(document(), (*aResIter)->groupName()); - aECreator->sendUpdated(*aResIter, EVENT_DISP); + std::list >::iterator aResIter = myResults.begin(); + for(int anIndex = 0; anIndex < theSinceIndex && aResIter != myResults.end(); anIndex++) + aResIter++; + + std::string aGroup; + std::list >::iterator aNextIter = aResIter; + while( aNextIter != myResults.end()) { + aGroup = (*aNextIter)->groupName(); + // remove previously erased results: to enable later if needed only actual (of history change) + if (theSinceIndex == 0 && (*aNextIter)->isDisabled()) { + aNextIter = myResults.erase(aNextIter); + } else { + (*aNextIter)->setDisabled(*aNextIter, true); // just disable results + aNextIter++; } - myResults.clear(); - // flush it to avoid left presentations after input of invalid arguments (radius=0) - static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_DELETED); - Events_Loop::loop()->flush(anEvent); + } + if (!aGroup.empty() && theFlush) { + // flush visualisation changes + static Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); + aLoop->flush(aRedispEvent); + static Events_ID aDelEvent = aLoop->eventByName(EVENT_OBJECT_DELETED); + aLoop->flush(aDelEvent); } } -boost::shared_ptr ModelAPI_Feature::documentToAdd() +void ModelAPI_Feature::eraseResults() { - return ModelAPI_Session::get()->activeDocument(); + removeResults(0); +} + +const std::string& ModelAPI_Feature::documentToAdd() +{ + // empty to use the current document + static const std::string anEmpty; + return anEmpty; } void ModelAPI_Feature::erase() { + // if this is the current feature, make the upper feature as current before removing + if (document().get() && document()->currentFeature(false).get() == this) { + document()->setCurrentFeatureUp(); + } + static Events_Loop* aLoop = Events_Loop::loop(); static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); while (!myResults.empty()) { // remove one by one with messages - boost::shared_ptr aRes = *(myResults.begin()); - myResults.erase(myResults.begin()); - aECreator->sendDeleted(aRes->document(), aRes->groupName()); - aECreator->sendUpdated(aRes, EVENT_DISP); + std::shared_ptr aRes = *(myResults.begin()); + aRes->setDisabled(aRes, true); // to avoid activation of the Part result + if (!myResults.empty()) // disabling result may erase the list (on undo of Part, issue 665) + myResults.erase(myResults.begin()); } ModelAPI_Object::erase(); } @@ -129,9 +159,9 @@ ModelAPI_Feature::~ModelAPI_Feature() FeaturePtr ModelAPI_Feature::feature(ObjectPtr theObject) { - FeaturePtr aFeature = boost::dynamic_pointer_cast(theObject); + FeaturePtr aFeature = std::dynamic_pointer_cast(theObject); if (!aFeature) { - ResultPtr aResult = boost::dynamic_pointer_cast(theObject); + ResultPtr aResult = std::dynamic_pointer_cast(theObject); if (aResult) { DocumentPtr aDoc = aResult->document(); return aDoc->feature(aResult); @@ -139,3 +169,36 @@ FeaturePtr ModelAPI_Feature::feature(ObjectPtr theObject) } return aFeature; } + +bool ModelAPI_Feature::isMacro() const +{ + return false; +} + +bool ModelAPI_Feature::setDisabled(const bool theFlag) +{ + if (myIsDisabled != theFlag) { + myIsDisabled = theFlag; + if (myIsDisabled) { + removeResults(0, false); // flush will be in setCurrentFeature + } else { + // enable all disabled previously results + std::list >::iterator aResIter = myResults.begin(); + for(; aResIter != myResults.end(); aResIter++) { + (*aResIter)->setDisabled(*aResIter, false); + } + } + return true; + } + return false; +} + +bool ModelAPI_Feature::isDisabled() const +{ + return myIsDisabled; +} + +bool ModelAPI_Feature::isPreviewNeeded() const +{ + return true; +}