- ObjectPtr aSelectedObject = theSelectedObject;
- GeomShapePtr aShape = theShape;
-
- if (!aSelectedObject)
- return false;
-
- FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aSelectedObject);
- if (aSelectedFeature == myFeature) // In order to avoid selection of the same object
- return false;
- std::shared_ptr<SketchPlugin_Feature> aSPFeature =
- std::dynamic_pointer_cast<SketchPlugin_Feature>(aSelectedFeature);
- if ((!aSPFeature) && (!aShape->isNull())) {
- // Processing of external (non-sketch) object
- ObjectPtr aObj = PartSet_Tools::createFixedObjectByExternal(aShape->impl<TopoDS_Shape>(),
- aSelectedObject, mySketch);
- if (aObj) {
- PartSet_WidgetShapeSelector* that = (PartSet_WidgetShapeSelector*) this;
- aSelectedObject = aObj;
- } else
- return false;
- } else {
- // Processing of sketch object
- DataPtr aData = myFeature->data();
- if (aShape) {
- AttributePtr aAttr = aData->attribute(attributeID());
- AttributeRefAttrPtr aRefAttr =
- std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aAttr);
- if (aRefAttr) {
- TopoDS_Shape aTDSShape = aShape->impl<TopoDS_Shape>();
- AttributePtr aPntAttr = PartSet_Tools::findAttributeBy2dPoint(aSelectedObject, aTDSShape, mySketch);
-
- // this is an alternative, whether the attribute should be set or object in the attribute
- // the first check is the attribute because the object already exist
- // the object is set only if there is no selected attribute
- // test case is - preselection for distance operation, which contains two points selected on lines
- if (aPntAttr)
- aRefAttr->setAttr(aPntAttr);
- else if (aSelectedObject)
- aRefAttr->setObject(aSelectedObject);
- //updateObject(myFeature);
- return true;
- }
- }
+ ModuleBase_WidgetShapeSelector::selectionFilters(theModuleSelectionFilters, theSelectionFilters);
+
+ if (!myUseSketchPlane) {
+ if (theModuleSelectionFilters.contains(SF_SketchPlaneFilter))
+ theModuleSelectionFilters.removeAll(SF_SketchPlaneFilter);
+ }
+}
+
+//********************************************************************
+bool PartSet_WidgetShapeSelector::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs)
+{
+ bool aValid = false;
+ if (thePrs.get() && thePrs->interactive().get() &&
+ thePrs->interactive()->IsKind(STANDARD_TYPE(PartSet_CenterPrs)))
+ aValid = true; // we should not check acceptSubShape for such presentation
+ else
+ aValid = ModuleBase_WidgetShapeSelector::isValidSelectionCustom(thePrs);
+
+ if (aValid) {
+ ObjectPtr anObject = myWorkshop->selection()->getResult(thePrs);
+ aValid = myExternalObjectMgr->isValidObject(anObject);