+ else {
+ //FeaturePtr aFeature = ModelAPI_Feature::feature(thePrs->object());
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(thePrs->object());
+ if (aFeature.get()) {
+ // Use feature as a reference to all its results
+ myPresentedObject = aFeature;
+ AttributePtr anAttr = attribute();
+ std::string aType = anAttr->attributeType();
+
+ // Check that results of Feature is acceptable by filters for selection attribute
+ if (aType == ModelAPI_AttributeSelection::typeId()) {
+ AttributeSelectionPtr aSelectAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(anAttr);
+ aSelectAttr->setValue(myPresentedObject, GeomShapePtr(), true);
+ GeomShapePtr aShapePtr = aSelectAttr->value();
+ if (!aShapePtr.get() && aSelectAttr->contextFeature().get() &&
+ aSelectAttr->contextFeature()->firstResult().get()) {
+ aShapePtr = aSelectAttr->contextFeature()->firstResult()->shape();
+ }
+ if (aShapePtr.get()) {
+ const TopoDS_Shape aTDShape = aShapePtr->impl<TopoDS_Shape>();
+ Handle(AIS_InteractiveObject) anIO = myWorkshop->selection()->getIO(thePrs);
+ aOwnersList.Append(new StdSelect_BRepOwner(aTDShape, anIO));
+ }
+ }
+ else {
+ ResultPtr aFirstRes = aFeature->firstResult();
+ if (aFirstRes.get()) {
+ ResultBodyPtr aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(aFirstRes);
+ if (aBody.get() && (aBody->numberOfSubs() > 0))
+ collectSubBodies(aBody, aOwnersList);
+ else {
+ GeomShapePtr aShapePtr = ModelAPI_Tools::shape(aFirstRes);
+ if (aShapePtr.get()) {
+ TopoDS_Shape aTDShape = aShapePtr->impl<TopoDS_Shape>();
+ AISObjectPtr aIOPtr = myWorkshop->findPresentation(aFirstRes);
+ if (aIOPtr.get()) {
+ Handle(AIS_InteractiveObject) anIO =
+ aIOPtr->impl<Handle(AIS_InteractiveObject)>();
+ aOwnersList.Append(new StdSelect_BRepOwner(aTDShape, anIO));
+ }
+ else
+ aOwnersList.Append(new StdSelect_BRepOwner(aTDShape));
+ }
+ }
+ }
+ }
+ }
+ }