X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetSelector.cpp;h=e2233ab7c96229ed3866d3d88f9117bd93a94184;hb=f9fd953bf814fad40ae045f6164c7f80229b0872;hp=f15479dd5a6bbf7c8c23e99572652a8ca26aeb88;hpb=5b0a1b660acf209c220744eb75c54652ee81efde;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetSelector.cpp b/src/ModuleBase/ModuleBase_WidgetSelector.cpp index f15479dd5..e2233ab7c 100755 --- a/src/ModuleBase/ModuleBase_WidgetSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetSelector.cpp @@ -1,6 +1,6 @@ // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -// File: ModuleBase_WidgetSelector.h +// File: ModuleBase_WidgetSelector.cpp // Created: 19 June 2015 // Author: Natalia ERMOLAEVA @@ -9,12 +9,15 @@ #include #include +#include + +#include + ModuleBase_WidgetSelector::ModuleBase_WidgetSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData, const std::string& theParentId) - : ModuleBase_WidgetValidated(theParent, theData, theParentId), - myWorkshop(theWorkshop) + : ModuleBase_WidgetValidated(theParent, theWorkshop, theData, theParentId) { } @@ -44,35 +47,67 @@ void ModuleBase_WidgetSelector::onSelectionChanged() { clearAttribute(); - QList aSelected = myWorkshop->selection()->getSelected( - ModuleBase_ISelection::AllControls); - setSelection(aSelected); + QList aSelected = getFilteredSelected(); + bool isDone = setSelection(aSelected, false); emit valuesChanged(); // the updateObject method should be called to flush the updated sigal. The workshop listens it, // calls validators for the feature and, as a result, updates the Apply button state. updateObject(myFeature); - updateFocus(); + if (isDone) + updateFocus(); } //******************************************************************** -bool ModuleBase_WidgetSelector::acceptSubShape(const TopoDS_Shape& theShape) const +bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, + const ResultPtr& theResult) const { - bool aValid = true; - if (theShape.IsNull()) { - aValid = true; // do not check the shape type if the shape is empty - // extrusion uses a sketch object selectected in Object browser + bool aValid = false; + + GeomShapePtr aShape = theShape; + if (!aShape.get() && theResult.get()) { + if (theResult.get()) + aShape = theResult->shape(); } - else { - aValid = false; - TopAbs_ShapeEnum aShapeType = theShape.ShapeType(); - QIntList aShapeTypes = getShapeTypes(); - - QIntList::const_iterator anIt = aShapeTypes.begin(), aLast = aShapeTypes.end(); - for (; anIt != aLast; anIt++) { - if (aShapeType == *anIt) - aValid = true; + TopAbs_ShapeEnum aShapeType = TopAbs_SHAPE; + 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) { + for(TopoDS_Iterator aSubs(aTopoShape); aSubs.More(); aSubs.Next()) { + if (!aSubs.Value().IsNull()) { + TopAbs_ShapeEnum aSubType = aSubs.Value().ShapeType(); + if (aSubType == TopAbs_COMPOUND) { // compound of compound(s) + aShapeType = TopAbs_COMPOUND; + break; + } + if (aShapeType == TopAbs_COMPOUND) { + aShapeType = aSubType; + } else if (aShapeType != aSubType) { // compound of shapes of different types + aShapeType = TopAbs_COMPOUND; + break; + } + } + } + } + } + + QIntList aShapeTypes = getShapeTypes(); + QIntList::const_iterator anIt = aShapeTypes.begin(), aLast = aShapeTypes.end(); + for (; anIt != aLast; anIt++) { + if (aShapeType == *anIt) + aValid = true; + else if (*anIt == TopAbs_FACE) { + // try to process the construction shape only if there is no a selected shape in the viewer + if (!theShape.get() && theResult.get()) { + ResultConstructionPtr aCResult = + std::dynamic_pointer_cast(theResult); + aValid = aCResult.get() && aCResult->facesNum() > 0; + } } } return aValid; @@ -101,22 +136,16 @@ void ModuleBase_WidgetSelector::activateCustom() // Restore selection in the viewer by the attribute selection list myWorkshop->setSelected(getAttributeSelection()); - activateFilters(myWorkshop, true); + activateFilters(true); } //******************************************************************** bool ModuleBase_WidgetSelector::isValidSelectionCustom(const ModuleBase_ViewerPrs& thePrs) { GeomShapePtr aShape = myWorkshop->selection()->getShape(thePrs); - bool aValid; - // if there is no selected shape, the method returns true - if (!aShape.get()) - aValid = true; - else { - // Check that the selection corresponds to selection type - TopoDS_Shape aTopoShape = aShape->impl(); - aValid = acceptSubShape(aTopoShape); - } + ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); + bool aValid = acceptSubShape(aShape, aResult); + if (aValid) { // In order to avoid selection of the same object ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); @@ -142,5 +171,6 @@ void ModuleBase_WidgetSelector::deactivate() { disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); activateSelection(false); - activateFilters(myWorkshop, false); + activateFilters(false); } +