X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModelAPI%2FModelAPI_Feature.cpp;h=236ee3dffae018b4abd0b3d589a3f5ede79e74b2;hb=dc1f458b1518baeab0479275e47fd60d50bc18b7;hp=3d8e5d57f27d488e0159feae9392c3867ed51f79;hpb=f328eabbb64e9fe347f36728710ebe1ebb00de6e;p=modules%2Fshaper.git diff --git a/src/ModelAPI/ModelAPI_Feature.cpp b/src/ModelAPI/ModelAPI_Feature.cpp index 3d8e5d57f..236ee3dff 100644 --- a/src/ModelAPI/ModelAPI_Feature.cpp +++ b/src/ModelAPI/ModelAPI_Feature.cpp @@ -1,8 +1,22 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: ModelAPI_Feature.cpp -// Created: 17 Jul 2014 -// Author: Mikhail PONIKAROV +// Copyright (C) 2014-2017 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or +// email : webmaster.salome@opencascade.com +// #include "ModelAPI_Feature.h" #include @@ -11,6 +25,16 @@ #include #include #include +#include + +void ModelAPI_Feature::setError(const std::string& theError, + bool isSend, + bool isTranslate) +{ + std::string anError = isTranslate ? Config_Translator::translate(getKind(), theError) + : theError; + data()->setError(anError, isSend); +} const std::list >& ModelAPI_Feature::results() { @@ -45,7 +69,8 @@ void ModelAPI_Feature::setResult(const std::shared_ptr& theResu myResults.push_back(theResult); } // in any case result becomes enabled - theResult->setDisabled(theResult, false); + if (!isDisabled()) // disabled feature may be executed when it is added as not enabled (#2078) + theResult->setDisabled(theResult, false); } void ModelAPI_Feature::setResult(const std::shared_ptr& theResult, @@ -79,6 +104,7 @@ void ModelAPI_Feature::eraseResultFromList(const std::shared_ptrgroupName(); + aRes->setDisabled(aRes, true); // for complex results to disable all subs aRes->data()->erase(); myResults.erase(aResIter); @@ -92,7 +118,8 @@ void ModelAPI_Feature::eraseResultFromList(const std::shared_ptr >::iterator aResIter = myResults.begin(); for(int anIndex = 0; anIndex < theSinceIndex && aResIter != myResults.end(); anIndex++) @@ -103,10 +130,10 @@ void ModelAPI_Feature::removeResults(const int theSinceIndex, const bool theFlus 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)->setDisabled(*aNextIter, true); // just disable results + if (theForever) { aNextIter = myResults.erase(aNextIter); } else { - (*aNextIter)->setDisabled(*aNextIter, true); // just disable results aNextIter++; } } @@ -120,9 +147,9 @@ void ModelAPI_Feature::removeResults(const int theSinceIndex, const bool theFlus } } -void ModelAPI_Feature::eraseResults() +void ModelAPI_Feature::eraseResults(const bool theForever) { - removeResults(0); + removeResults(0, theForever, true); } const std::string& ModelAPI_Feature::documentToAdd() @@ -154,7 +181,8 @@ void ModelAPI_Feature::erase() ModelAPI_Feature::~ModelAPI_Feature() { - erase(); + if (data() && data()->isValid()) + erase(); } FeaturePtr ModelAPI_Feature::feature(ObjectPtr theObject) @@ -180,25 +208,61 @@ bool ModelAPI_Feature::setDisabled(const bool theFlag) if (myIsDisabled != theFlag) { myIsDisabled = theFlag; if (myIsDisabled) { - removeResults(0, false); // flush will be in setCurrentFeature + removeResults(0, false, 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); } + // update selection for the case something was updated higher in the history + // while this feature was disabled + static Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID kUpdatedSel = aLoop->eventByName(EVENT_UPDATE_SELECTION); + static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); + aECreator->sendUpdated(data()->owner(), kUpdatedSel, false); } return true; } return false; } -bool ModelAPI_Feature::isDisabled() const +bool ModelAPI_Feature::isDisabled() { return myIsDisabled; } +bool ModelAPI_Feature::setStable(const bool theFlag) +{ + if (myIsStable != theFlag) { + myIsStable = theFlag; + // send an event about the stability change (editing is started/finished) + static Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID EVENT_STAB = aLoop->eventByName(EVENT_STABILITY_CHANGED); + std::shared_ptr aMessage(new Events_Message(EVENT_STAB, this)); + aLoop->send(aMessage, false); + return true; + } + return false; +} + +bool ModelAPI_Feature::isStable() +{ + return myIsStable; +} + +bool ModelAPI_Feature::customAction(const std::string& theActionId) +{ + return false; +} + bool ModelAPI_Feature::isPreviewNeeded() const { return true; } + +void ModelAPI_Feature::init() +{ + myIsDisabled = false; + myIsStable = true; +}