X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_OperationFeature.cpp;h=47344a7a37d06aa2d125d450a82c530cc7bb5768;hb=a5a596631807c90ad33d0237e12fdb1ee77193ae;hp=82cf7906b46389333501c75b28d77f7769f83750;hpb=4d2337ff94a9db7aa38997a369c1cca470a3297c;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_OperationFeature.cpp b/src/ModuleBase/ModuleBase_OperationFeature.cpp old mode 100755 new mode 100644 index 82cf7906b..47344a7a3 --- a/src/ModuleBase/ModuleBase_OperationFeature.cpp +++ b/src/ModuleBase/ModuleBase_OperationFeature.cpp @@ -1,11 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -/* - * ModuleBase_OperationFeature.cpp - * - * Created on: Apr 2, 2014 - * Author: sbh - */ +// 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 +// 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 "ModuleBase_OperationFeature.h" @@ -49,8 +59,7 @@ #endif ModuleBase_OperationFeature::ModuleBase_OperationFeature(const QString& theId, QObject* theParent) -: ModuleBase_Operation(theId, theParent), - myIsEditing(false) +: ModuleBase_Operation(theId, theParent), myIsEditing(false), myNeedToBeAborted(false) { } @@ -102,6 +111,7 @@ bool ModuleBase_OperationFeature::isValid() const return true; std::string anError = ModelAPI_Tools::getFeatureError(myFeature); + //ModuleBase_Tools::translate(myFeature->getKind(), anError); return anError.empty(); } @@ -116,7 +126,8 @@ void ModuleBase_OperationFeature::startOperation() myVisualizedObjects.clear(); // store hidden result features - std::list aResults = aFeature->results(); + std::list aResults; + ModelAPI_Tools::allResults(aFeature, aResults); std::list::const_iterator aIt; for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { ObjectPtr anObject = *aIt; @@ -139,7 +150,8 @@ void ModuleBase_OperationFeature::stopOperation() return; // store hidden result features - std::list aResults = aFeature->results(); + std::list aResults; + ModelAPI_Tools::allResults(aFeature, aResults); std::list::const_iterator aIt; for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { ObjectPtr anObject = *aIt; @@ -174,10 +186,10 @@ FeaturePtr ModuleBase_OperationFeature::createFeature(const bool theFlushMessage }*/ } - if (theFlushMessage) { - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); - } + //if (theFlushMessage) { + // Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); + // Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + //} return myFeature; } @@ -193,24 +205,24 @@ bool ModuleBase_OperationFeature::hasObject(ObjectPtr theObj) const if (aFeature) { if (aFeature == theObj) return true; - std::list aResults = aFeature->results(); - std::list::const_iterator aIt; - for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { - if (theObj == (*aIt)) - return true; + ResultPtr anObjRes = std::dynamic_pointer_cast(theObj); + if (anObjRes.get() && aFeature == aFeature->document()->feature(anObjRes)) { + return true; } #ifdef DEBUG_DO_NOT_ACTIVATE_SUB_FEATURE if (aFeature->isMacro()) { - // macro feature may refers to sub-features, which also should be deactivated when the operation + // macro feature may refers to sub-features, + // which also should be deactivated when the operation // is active, e.g. rectangle'lines. FeaturePtr anObjectFeature = ModelAPI_Feature::feature(theObj); std::list anAttributes = aFeature->data()->attributes( ModelAPI_AttributeRefList::typeId()); - std::list::const_iterator anIt = anAttributes.begin(), aLast = anAttributes.end(); + std::list::const_iterator + anIt = anAttributes.begin(), aLast = anAttributes.end(); bool aFoundObject = false; for (; anIt != aLast && !aFoundObject; anIt++) { std::shared_ptr aCurSelList = - std::dynamic_pointer_cast(*anIt); + std::dynamic_pointer_cast(*anIt); for (int i = 0, aNb = aCurSelList->size(); i < aNb && !aFoundObject; i++) { ObjectPtr anObject = aCurSelList->object(i); FeaturePtr aFeature = std::dynamic_pointer_cast(anObject); @@ -324,6 +336,7 @@ bool ModuleBase_OperationFeature::commit() if (anActiveWidget && anActiveWidget->getValueState() == ModuleBase_ModelWidget::ModifiedInPP) { anActiveWidget->storeValue(); } + aPanel->onAcceptData(); } if (canBeCommitted()) { emit beforeCommitted(); @@ -338,24 +351,25 @@ bool ModuleBase_OperationFeature::commit() myFeature->setStable(true); - SessionPtr aMgr = ModelAPI_Session::get(); - /// Set current feature and remeber old current feature - commitOperation(); - aMgr->finishOperation(); stopOperation(); + + SessionPtr aMgr = ModelAPI_Session::get(); + aMgr->finishOperation(); + // Finish operation has to be before stopped because stopped caused update of Object browser + // If it will be done before of cleaning of obsolete objects it will cause crash emit stopped(); emit committed(); afterCommitOperation(); #ifdef DEBUG_OPERATION_START - qDebug("ModuleBase_OperationFeature::commit -- end : IMPOSSIBLE to commit"); + qDebug("ModuleBase_OperationFeature::commit -- end"); #endif return true; } #ifdef DEBUG_OPERATION_START - qDebug("ModuleBase_OperationFeature::commit -- end"); + qDebug("ModuleBase_OperationFeature::commit -- end : IMPOSSIBLE to commit"); #endif return false; } @@ -443,29 +457,31 @@ FeaturePtr ModuleBase_OperationFeature::previousCurrentFeature() return myPreviousCurrentFeature; } -void ModuleBase_OperationFeature::initSelection(ModuleBase_ISelection* theSelection, - ModuleBase_IViewer* theViewer) +void ModuleBase_OperationFeature::initSelection( + const QList& thePreSelected) { - QList aPreSelected; + QObjectPtrList aCurrentFeatureResults; + // Check that the selected result are not results of operation feature FeaturePtr aFeature = feature(); if (aFeature) { - QList aSelected = theSelection->getSelected(ModuleBase_ISelection::AllControls); - - std::list aResults = aFeature->results(); - QObjectPtrList aResList; + std::list aResults; + ModelAPI_Tools::allResults(aFeature, aResults); std::list::const_iterator aIt; for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) - aResList.append(*aIt); + aCurrentFeatureResults.append(*aIt); + } - foreach (ModuleBase_ViewerPrsPtr aPrs, aSelected) { - if ((!aResList.contains(aPrs->object())) && (aPrs->object() != aFeature)) + if (aCurrentFeatureResults.empty()) /// filtering of selection is not necessary + setPreselection(thePreSelected); + else { // create preselection list without results of current feature + QList aPreSelected; + foreach (ModuleBase_ViewerPrsPtr aPrs, thePreSelected) { + if ((!aCurrentFeatureResults.contains(aPrs->object())) && (aPrs->object() != aFeature)) aPreSelected.append(aPrs); } - } else - aPreSelected = theSelection->getSelected(ModuleBase_ISelection::AllControls); - - setPreselection(aPreSelected); + setPreselection(aPreSelected); + } } void ModuleBase_OperationFeature::setPreselection(const QList& theValues) @@ -479,7 +495,7 @@ void ModuleBase_OperationFeature::clearPreselection() myPreSelection.clear(); } -void ModuleBase_OperationFeature::setPropertyPanel(ModuleBase_IPropertyPanel* theProp) +void ModuleBase_OperationFeature::setPropertyPanel(ModuleBase_IPropertyPanel* theProp) { ModuleBase_Operation::setPropertyPanel(theProp); @@ -491,11 +507,12 @@ void ModuleBase_OperationFeature::setPropertyPanel(ModuleBase_IPropertyPanel* th for (aWIt = aWidgets.constBegin(); aWIt != aWidgets.constEnd(); ++aWIt) { ModuleBase_ModelWidget* aWgt = (*aWIt); connect(aWgt, SIGNAL(valuesChanged()), this, SLOT(onValuesChanged())); + connect(aWgt, SIGNAL(valueStateChanged(int)), this, SLOT(onValueStateChanged(int))); } } // Do not activate widgets by default if the current operation is editing operation - // Because we don't know which widget is going to be edited. + // Because we don't know which widget is going to be edited. if (!isEditOperation()) { // 4. activate the first obligatory widget theProp->activateNextWidget(NULL);