X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetSelector.cpp;h=7694a6207711019d3f73939ec497c1822f91e7cb;hb=46c0759fa291dad10b713cf02b341d6e9e60c1a4;hp=bb4bbc4a110d0ce01d5f04feb28cb47c018878c3;hpb=87b6a30a3afb8fb32e7e43ade8d9c947d9eb1684;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetSelector.cpp b/src/ModuleBase/ModuleBase_WidgetSelector.cpp old mode 100755 new mode 100644 index bb4bbc4a1..7694a6207 --- a/src/ModuleBase/ModuleBase_WidgetSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetSelector.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2020 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 @@ -12,37 +12,43 @@ // // 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include +#include +#include #include +#include #include -#include #include #include -#include -#include #include +#include #include -#include +#include -#include -#include #include #include +#include +#include + +#include #include ModuleBase_WidgetSelector::ModuleBase_WidgetSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData) -: ModuleBase_WidgetValidated(theParent, theWorkshop, theData) +: ModuleBase_WidgetValidated(theParent, theWorkshop, theData), +myIsPointsFiltering(true) { + QString aFiltering = QString::fromStdString(theData->getProperty("filter_points")); + if (aFiltering.toLower() == "false") + myIsPointsFiltering = false; } //******************************************************************** @@ -57,18 +63,23 @@ void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrsPtr& { ModuleBase_ISelection* aSelection = myWorkshop->selection(); theObject = aSelection->getResult(thePrs); + if (!theObject.get()) + theObject = thePrs->object(); theShape = aSelection->getShape(thePrs); } //******************************************************************** -void ModuleBase_WidgetSelector::onSelectionChanged() +bool ModuleBase_WidgetSelector::processSelection() { QList aSelected = getFilteredSelected(); // equal vertices should not be used here - ModuleBase_ISelection::filterSelectionOnEqualPoints(aSelected); + if (myIsPointsFiltering) + ModuleBase_ISelection::filterSelectionOnEqualPoints(aSelected); bool isDone = setSelection(aSelected, true/*false*/); updateOnSelectionChanged(isDone); + + return isDone; } //******************************************************************** @@ -123,7 +134,9 @@ bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, return aValid; } // when the SHAPE type is provided by XML as Object, the whole result shape should be selected. - if (!aShape.get() && aShapeTypes.contains(ModuleBase_ResultPrs::Sel_Result)) { + //if (!aShape.get() && aShapeTypes.contains(ModuleBase_ResultPrs::Sel_Result)) { + // In case of selection of a feature aShape could be not NULL, but result has to be selected + if (aShapeTypes.contains(ModuleBase_ResultPrs::Sel_Result)) { aValid = true; return aValid; } @@ -136,11 +149,13 @@ bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, if (aShape.get()) { // Check that the selection corresponds to selection type TopoDS_Shape aTopoShape = aShape->impl(); - aShapeType = aTopoShape.ShapeType(); - // for compounds check sub-shapes: it may be compound of needed type: - // Booleans may produce compounds of Solids - if (aShapeType == TopAbs_COMPOUND) { - aShapeType = ModuleBase_Tools::getCompoundSubType(aTopoShape); + if (!aTopoShape.IsNull()) { + aShapeType = aTopoShape.ShapeType(); + // for compounds check sub-shapes: it may be compound of needed type: + // Booleans may produce compounds of Solids + if (aShapeType == TopAbs_COMPOUND) { + aShapeType = ModuleBase_Tools::getCompoundSubType(aTopoShape); + } } } @@ -162,26 +177,27 @@ bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, } //******************************************************************** -bool ModuleBase_WidgetSelector::activateSelectionAndFilters(bool toActivate) +void ModuleBase_WidgetSelector::selectionModes(int& theModuleSelectionModes, QIntList& theModes) +{ + theModuleSelectionModes = -1; + theModes.append(getShapeTypes()); +} + +//******************************************************************** +void ModuleBase_WidgetSelector::updateSelectionModesAndFilters(bool toActivate) { updateSelectionName(); - if (toActivate) { - myWorkshop->activateSubShapesSelection(getShapeTypes()); - } else { - myWorkshop->deactivateSubShapesSelection(); - } - return activateFilters(toActivate); + myWorkshop->selectionActivate()->updateSelectionFilters(); + myWorkshop->selectionActivate()->updateSelectionModes(); + + if (!toActivate) + clearValidatedCash(); } //******************************************************************** void ModuleBase_WidgetSelector::activateCustom() { - connect(myWorkshop, SIGNAL(selectionChanged()), this, - SLOT(onSelectionChanged()), Qt::UniqueConnection); - - activateSelectionAndFilters(true); - // Restore selection in the viewer by the attribute selection list // it should be postponed to have current widget as active to validate restored selection static Events_ID anEvent = Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION); @@ -193,11 +209,13 @@ bool ModuleBase_WidgetSelector::isValidSelectionCustom(const ModuleBase_ViewerPr { GeomShapePtr aShape = myWorkshop->selection()->getShape(thePrs); ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); - bool aValid = acceptSubShape(aShape, aResult); + bool aValid = aResult.get(); + if (!isWholeResultAllowed()) + aValid = acceptSubShape(aShape, aResult); if (aValid) { // In order to avoid selection of the same object - ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); + aResult = myWorkshop->selection()->getResult(thePrs); FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aResult); aValid = aSelectedFeature != myFeature; } @@ -219,10 +237,7 @@ bool ModuleBase_WidgetSelector::setSelectionCustom(const ModuleBase_ViewerPrsPtr //******************************************************************** void ModuleBase_WidgetSelector::deactivate() { - ModuleBase_ModelWidget::deactivate(); - disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); - activateSelectionAndFilters(false); - + ModuleBase_WidgetValidated::deactivate(); /// clear temporary cash AttributePtr anAttribute = attribute(); if (!anAttribute.get()) @@ -241,26 +256,14 @@ void ModuleBase_WidgetSelector::deactivate() } //******************************************************************** -std::string ModuleBase_WidgetSelector::generateName(const AttributePtr& theAttribute, - ModuleBase_IWorkshop* theWorkshop) +bool ModuleBase_WidgetSelector::isWholeResultAllowed() const { - std::string aName; - if (theAttribute.get() != NULL) { - ModuleBase_Operation* anOperation = theWorkshop->currentOperation(); - - FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner()); - if (aFeature.get()) { - std::string aXmlCfg, aDescription; - theWorkshop->module()->getXMLRepresentation(aFeature->getKind(), aXmlCfg, aDescription); - - ModuleBase_WidgetFactory aFactory(aXmlCfg, theWorkshop); - std::string anAttributeTitle; - aFactory.getAttributeTitle(theAttribute->id(), anAttributeTitle); - - std::stringstream aStreamName; - aStreamName << theAttribute->owner()->data()->name() << "/"<< anAttributeTitle.c_str(); - aName = aStreamName.str(); - } + AttributePtr anAttribute = attribute(); + if (anAttribute.get()) { + AttributeSelectionListPtr aSelAttr = + std::dynamic_pointer_cast(anAttribute); + if (aSelAttr.get()) + return aSelAttr->isWholeResultAllowed(); } - return aName; + return false; }