#include <ModelAPI_Validator.h>
#include <ModelAPI_ResultValidator.h>
#include <ModelAPI_RefAttrValidator.h>
+#include <ModelAPI_ShapeValidator.h>
#include <Config_WidgetAPI.h>
#include <Events_Error.h>
}
//********************************************************************
-bool ModuleBase_WidgetShapeSelector::storeValue() const
+bool ModuleBase_WidgetShapeSelector::storeValueCustom() const
{
FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(mySelectedObject);
if (aSelectedFeature == myFeature) // In order to avoid selection of the same object
// if (!acceptObjectShape(aObject))
// return false;
+ // Check whether the value is valid for the viewer selection filters
+ Handle(SelectMgr_EntityOwner) anOwner = theValue.owner();
+ if (!anOwner.IsNull()) {
+ SelectMgr_ListOfFilter aFilters;
+ selectionFilters(aFilters);
+ SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
+ for (; aIt.More(); aIt.Next()) {
+ const Handle(SelectMgr_Filter)& aFilter = aIt.Value();
+ if (!aFilter->IsOk(anOwner))
+ return false;
+ }
+ }
if (isValid(aObject, aShape)) {
setObject(aObject, aShape);
return true;
aList.append(shapeType(aType));
}
myWorkshop->activateSubShapesSelection(aList);
- if (!myObjectTypes.isEmpty()) {
- myObjTypeFilter = new ModuleBase_ObjectTypesFilter(myWorkshop, myObjectTypes);
- aViewer->clearSelectionFilters();
- aViewer->addSelectionFilter(myObjTypeFilter);
- }
} else {
disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
- if (!myObjTypeFilter.IsNull()) {
- aViewer->removeSelectionFilter(myObjTypeFilter);
- myObjTypeFilter.Nullify();
- }
myWorkshop->deactivateSubShapesSelection();
}
+
+ // the initial code is moved here in order to clear filters, it is possible, that it is excessive and
+ // is performed outside
+ if (myIsActive && !myObjectTypes.isEmpty()) {
+ aViewer->clearSelectionFilters();
+ }
+ SelectMgr_ListOfFilter aFilters;
+ selectionFilters(aFilters);
+ SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
+ for (; aIt.More(); aIt.Next()) {
+ const Handle(SelectMgr_Filter)& aSelFilter = aIt.Value();
+ if (myIsActive)
+ aViewer->addSelectionFilter(aSelFilter);
+ else
+ aViewer->removeSelectionFilter(aSelFilter);
+ }
+ // the internal filter should be removed by the widget deactivation, it is done historically
+ if (!myIsActive && !myObjTypeFilter.IsNull()) {
+ myObjTypeFilter.Nullify();
+ }
+}
+
+//********************************************************************
+void ModuleBase_WidgetShapeSelector::selectionFilters(SelectMgr_ListOfFilter& theFilters)
+{
+ if (!myObjectTypes.isEmpty()) {
+ myObjTypeFilter = new ModuleBase_ObjectTypesFilter(myWorkshop, myObjectTypes);
+ theFilters.Append(myObjTypeFilter);
+ }
// apply filters loaded from the XML definition of the widget
ModuleBase_FilterFactory* aFactory = myWorkshop->selectionFilters();
SelectMgr_ListOfFilter aFilters;
if (aSelFilter.IsNull())
continue;
- //Handle(ModuleBase_Filter) aFilter = Handle(ModuleBase_Filter)::DownCast(aIt.Value());
- //if (aFilter.IsNull())
- // continue;
- if (myIsActive)
- aViewer->addSelectionFilter(aSelFilter);
- else
- aViewer->removeSelectionFilter(aSelFilter);
+ theFilters.Append(aSelFilter);
}
}
return false;
}
}
+ else {
+ const ModelAPI_ShapeValidator* aShapeValidator =
+ dynamic_cast<const ModelAPI_ShapeValidator*>(*aValidator);
+ if (aShapeValidator) {
+ DataPtr aData = myFeature->data();
+ AttributeSelectionPtr aSelectAttr = aData->selection(attributeID());
+ if (!aShapeValidator->isValid(myFeature, *aArgs, theObj, aSelectAttr, theShape)) {
+ return false;
+ }
+ }
+ }
}
return true;
}
\ No newline at end of file