X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModelAPI%2FModelAPI_Feature.cpp;h=21370b2215537d52498d28a555c739969e3547ff;hb=9a661fe493a02eaeefa01965c76728c5421062d0;hp=5b9d7e3d4e0f3da971bd37d24dd6347179928f9f;hpb=1b93f1881c5fec599aa79707f93c84dd9c287bc0;p=modules%2Fshaper.git diff --git a/src/ModelAPI/ModelAPI_Feature.cpp b/src/ModelAPI/ModelAPI_Feature.cpp index 5b9d7e3d4..21370b221 100644 --- a/src/ModelAPI/ModelAPI_Feature.cpp +++ b/src/ModelAPI/ModelAPI_Feature.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: ModelAPI_Feature.cpp -// Created: 17 Jul 2014 -// Author: Mikhail PONIKAROV +// Copyright (C) 2014-2023 CEA, EDF +// +// 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 @@ -10,7 +23,20 @@ #include #include #include +#include +#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 +71,15 @@ 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); + + if (Config_PropManager::getAutoColorStatus() + && theResult->groupName() == ModelAPI_ResultGroup::group()) { + std::vector aColor; + ModelAPI_Tools::findRandomColor(aColor); + ModelAPI_Tools::setColor(theResult, aColor); + } } void ModelAPI_Feature::setResult(const std::shared_ptr& theResult, @@ -63,15 +97,6 @@ void ModelAPI_Feature::setResult(const std::shared_ptr& theResu theResult->setDisabled(theResult, false); } -void ModelAPI_Feature::removeResult(const std::shared_ptr& theResult) -{ - 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(); @@ -93,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++) @@ -104,15 +130,15 @@ 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 = myResults.erase(aNextIter); - //} else { - (*aNextIter)->setDisabled(*aNextIter, true); // just disable results + (*aNextIter)->setDisabled(*aNextIter, true); // just disable results + if (theForever) { + aNextIter = myResults.erase(aNextIter); + } else { aNextIter++; - //} + } } if (!aGroup.empty() && theFlush) { - // flush visualisation changes + // flush visualization changes static Events_Loop* aLoop = Events_Loop::loop(); static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); aLoop->flush(aRedispEvent); @@ -121,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() @@ -140,22 +166,21 @@ void ModelAPI_Feature::erase() 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 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) + if (!myResults.empty()) {// disabling result may erase the list (on undo of Part, issue 665) myResults.erase(myResults.begin()); + aRes->erase(); + } } ModelAPI_Object::erase(); } ModelAPI_Feature::~ModelAPI_Feature() { - erase(); + if (data() && data()->isValid()) + erase(); } FeaturePtr ModelAPI_Feature::feature(ObjectPtr theObject) @@ -181,13 +206,21 @@ 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, but avoid flushing it immediately and + // wait while all the previous features update myIsDisabled flag + // (flush will be called by the document) + 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, true); } return true; } @@ -199,6 +232,7 @@ bool ModelAPI_Feature::isDisabled() return myIsDisabled; } +// LCOV_EXCL_START bool ModelAPI_Feature::setStable(const bool theFlag) { if (myIsStable != theFlag) { @@ -212,12 +246,23 @@ bool ModelAPI_Feature::setStable(const bool theFlag) } return false; } +// LCOV_EXCL_STOP bool ModelAPI_Feature::isStable() { return myIsStable; } +bool ModelAPI_Feature::isEditable() +{ + return true; +} + +bool ModelAPI_Feature::customAction(const std::string& /*theActionId*/) +{ + return false; +} + bool ModelAPI_Feature::isPreviewNeeded() const { return true;