X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetSelector.cpp;h=e8c6093438fc650319046cad21c6f5ddeeb31844;hb=eef14b29d313b9dd16453d12f20aa02383ee139c;hp=e8acbcbfc750022fbd07bed0cbf5a7850bb42f05;hpb=27fbd6131dcfe0618582edc25222e0506e138a2d;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetSelector.cpp b/src/ModuleBase/ModuleBase_WidgetSelector.cpp index e8acbcbfc..e8c609343 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 @@ -8,15 +8,21 @@ #include #include +#include +#include +#include +#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) { } @@ -25,12 +31,6 @@ ModuleBase_WidgetSelector::~ModuleBase_WidgetSelector() { } -//TODO: nds stabilization hotfix -void ModuleBase_WidgetSelector::disconnectSignals() -{ - disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); -} - //******************************************************************** void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrs& thePrs, ObjectPtr& theObject, @@ -44,23 +44,25 @@ void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrs& the //******************************************************************** void ModuleBase_WidgetSelector::onSelectionChanged() { - clearAttribute(); - - QList aSelected = myWorkshop->selection()->getSelected( - ModuleBase_ISelection::AllControls); - bool isDone = setSelection(aSelected); + QList aSelected = getFilteredSelected(); + bool isDone = setSelection(aSelected, true/*false*/); + // "false" flag should be used here, it connects to the #26658 OCC bug, when the user click in + // the same place repeatedly without mouse moved. In the case validation by filters is not + // perfromed, so an invalid object is selected. E.g. distance constraint, selection of a point. + // the 3rd click in the same point allow using this point. 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); + // we need to forget about previous validation result as the current selection can influence on it + clearValidatedCash(); + if (isDone) updateFocus(); } -#include - //******************************************************************** bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, const ResultPtr& theResult) const @@ -68,6 +70,18 @@ bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, bool aValid = false; GeomShapePtr aShape = theShape; + + QIntList aShapeTypes = getShapeTypes(); + if (aShapeTypes.empty()) { + aValid = true; + return aValid; + } + // when the SHAPE type is provided by XML, the hole result shape can be selected. + if (!aShape.get() && aShapeTypes.contains(TopAbs_SHAPE)) { + aValid = true; + return aValid; + } + if (!aShape.get() && theResult.get()) { if (theResult.get()) aShape = theResult->shape(); @@ -80,25 +94,10 @@ bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, // 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; - } - } - } + aShapeType = ModuleBase_Tools::getCompoundSubType(aTopoShape); } } - QIntList aShapeTypes = getShapeTypes(); QIntList::const_iterator anIt = aShapeTypes.begin(), aLast = aShapeTypes.end(); for (; anIt != aLast; anIt++) { if (aShapeType == *anIt) @@ -116,7 +115,7 @@ bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, } //******************************************************************** -void ModuleBase_WidgetSelector::activateSelection(bool toActivate) +bool ModuleBase_WidgetSelector::activateSelectionAndFilters(bool toActivate) { updateSelectionName(); @@ -125,6 +124,7 @@ void ModuleBase_WidgetSelector::activateSelection(bool toActivate) } else { myWorkshop->deactivateSubShapesSelection(); } + return activateFilters(toActivate); } //******************************************************************** @@ -133,12 +133,10 @@ void ModuleBase_WidgetSelector::activateCustom() connect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()), Qt::UniqueConnection); - activateSelection(true); + activateSelectionAndFilters(true); // Restore selection in the viewer by the attribute selection list myWorkshop->setSelected(getAttributeSelection()); - - activateFilters(myWorkshop, true); } //******************************************************************** @@ -171,7 +169,33 @@ bool ModuleBase_WidgetSelector::setSelectionCustom(const ModuleBase_ViewerPrs& t //******************************************************************** void ModuleBase_WidgetSelector::deactivate() { + ModuleBase_ModelWidget::deactivate(); disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); - activateSelection(false); - activateFilters(myWorkshop, false); + activateSelectionAndFilters(false); + ModuleBase_ModelWidget::deactivate(); +} + +//******************************************************************** +std::string ModuleBase_WidgetSelector::generateName(const AttributePtr& theAttribute, + ModuleBase_IWorkshop* theWorkshop) +{ + 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(aFeature->getKind(), theAttribute->id(), anAttributeTitle); + + std::stringstream aStreamName; + aStreamName << theAttribute->owner()->data()->name() << "/"<< anAttributeTitle.c_str(); + aName = aStreamName.str(); + } + } + return aName; }