X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetSelector.cpp;h=11811c4220061e53355709ed179bf44471f4fd49;hb=d75b1b5c09b57fd8326d846118fa3246a9857492;hp=5f57ebb15e4338277ac6c0dd60d2330361f9349e;hpb=78246681ed6d62bdad42d0677e1aae3a0af8af47;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetSelector.cpp b/src/ModuleBase/ModuleBase_WidgetSelector.cpp index 5f57ebb15..11811c422 100755 --- a/src/ModuleBase/ModuleBase_WidgetSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetSelector.cpp @@ -8,16 +8,26 @@ #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, - const std::string& theParentId) - : ModuleBase_WidgetValidated(theParent, theWorkshop, theData, theParentId) + const Config_WidgetAPI* theData) +: ModuleBase_WidgetValidated(theParent, theWorkshop, theData) { } @@ -27,7 +37,7 @@ ModuleBase_WidgetSelector::~ModuleBase_WidgetSelector() } //******************************************************************** -void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrs& thePrs, +void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrsPtr& thePrs, ObjectPtr& theObject, GeomShapePtr& theShape) { @@ -39,20 +49,52 @@ void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrs& the //******************************************************************** void ModuleBase_WidgetSelector::onSelectionChanged() { - clearAttribute(); + QList aSelected = getFilteredSelected(); + // equal vertices should not be used here + ModuleBase_ISelection::filterSelectionOnEqualPoints(aSelected); - QList aSelected = getFilteredSelected(); + bool isDone = setSelection(aSelected, true/*false*/); + updateOnSelectionChanged(isDone); +} - bool isDone = setSelection(aSelected, false); +//******************************************************************** +void ModuleBase_WidgetSelector::updateOnSelectionChanged(const bool theDone) +{ + // "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); - if (isDone) + // we need to forget about previous validation result as the current selection can influence on it + clearValidatedCash(); + + if (theDone) updateFocus(); } +//******************************************************************** +QIntList ModuleBase_WidgetSelector::getShapeTypes() const +{ + QIntList aShapeTypes = shapeTypes(); + // this type should be mentioned in XML, poor selection otherwise + if (/*aShapeTypes.contains(TopAbs_SOLID) ||*/ + aShapeTypes.contains(ModuleBase_ResultPrs::Sel_Result/*TopAbs_SHAPE*/)) { + // it should be selectable for both, "solids" and "objects" types + aShapeTypes.append(TopAbs_COMPSOLID); + } + return aShapeTypes; +} + +//******************************************************************** +QList ModuleBase_WidgetSelector::getAttributeSelection() const +{ + return QList(); +} + //******************************************************************** bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, const ResultPtr& theResult) const @@ -60,6 +102,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 as Object, the whole result shape should be selected. + if (!aShape.get() && aShapeTypes.contains(ModuleBase_ResultPrs::Sel_Result)) { + aValid = true; + return aValid; + } + if (!aShape.get() && theResult.get()) { if (theResult.get()) aShape = theResult->shape(); @@ -72,30 +126,16 @@ 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) + for (; anIt != aLast && !aValid; anIt++) { + TopAbs_ShapeEnum aCurrentShapeType = (TopAbs_ShapeEnum)*anIt; + if (aShapeType == aCurrentShapeType) aValid = true; - else if (*anIt == TopAbs_FACE) { + else if (aCurrentShapeType == 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 = @@ -108,7 +148,7 @@ bool ModuleBase_WidgetSelector::acceptSubShape(const GeomShapePtr& theShape, } //******************************************************************** -void ModuleBase_WidgetSelector::activateSelection(bool toActivate) +bool ModuleBase_WidgetSelector::activateSelectionAndFilters(bool toActivate) { updateSelectionName(); @@ -117,6 +157,7 @@ void ModuleBase_WidgetSelector::activateSelection(bool toActivate) } else { myWorkshop->deactivateSubShapesSelection(); } + return activateFilters(toActivate); } //******************************************************************** @@ -124,17 +165,17 @@ void ModuleBase_WidgetSelector::activateCustom() { connect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()), Qt::UniqueConnection); - - activateSelection(true); - // Restore selection in the viewer by the attribute selection list - myWorkshop->setSelected(getAttributeSelection()); + activateSelectionAndFilters(true); - activateFilters(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); + ModelAPI_EventCreator::get()->sendUpdated(myFeature, anEvent); } //******************************************************************** -bool ModuleBase_WidgetSelector::isValidSelectionCustom(const ModuleBase_ViewerPrs& thePrs) +bool ModuleBase_WidgetSelector::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs) { GeomShapePtr aShape = myWorkshop->selection()->getShape(thePrs); ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); @@ -150,21 +191,62 @@ bool ModuleBase_WidgetSelector::isValidSelectionCustom(const ModuleBase_ViewerPr } //******************************************************************** -bool ModuleBase_WidgetSelector::setSelectionCustom(const ModuleBase_ViewerPrs& thePrs) +bool ModuleBase_WidgetSelector::setSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs) { ObjectPtr anObject; GeomShapePtr aShape; getGeomSelection(thePrs, anObject, aShape); - setObject(anObject, aShape); - return true; + // the last flag is to be depending on hasObject is called before. To be corrected later + return ModuleBase_Tools::setObject(attribute(), anObject, aShape, + myWorkshop, myIsInValidate, true); } //******************************************************************** void ModuleBase_WidgetSelector::deactivate() { + ModuleBase_ModelWidget::deactivate(); disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); - activateSelection(false); - activateFilters(false); + activateSelectionAndFilters(false); + + /// clear temporary cash + AttributePtr anAttribute = attribute(); + if (!anAttribute.get()) + return; + std::string aType = anAttribute->attributeType(); + if (anAttribute->attributeType() == ModelAPI_AttributeSelection::typeId()) { + AttributeSelectionPtr aSelectAttr = + std::dynamic_pointer_cast(anAttribute); + aSelectAttr->removeTemporaryValues(); + } + else if (anAttribute->attributeType() == ModelAPI_AttributeSelectionList::typeId()) { + AttributeSelectionListPtr aSelectAttr = + std::dynamic_pointer_cast(anAttribute); + aSelectAttr->removeTemporaryValues(); + } } +//******************************************************************** +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(theAttribute->id(), anAttributeTitle); + + std::stringstream aStreamName; + aStreamName << theAttribute->owner()->data()->name() << "/"<< anAttributeTitle.c_str(); + aName = aStreamName.str(); + } + } + return aName; +}