+ Standard_Boolean aValid = Standard_True;
+
+ ModuleBase_ViewerPrsPtr aPrs(new ModuleBase_ViewerPrs());
+ myWorkshop->selection()->fillPresentation(aPrs, theOwner);
+ ResultPtr aResult = myWorkshop->selection()->getResult(aPrs);
+ // to filter infinite construction results
+ if (aResult.get() && aResult->groupName() == ModelAPI_ResultConstruction::group()) {
+ ResultConstructionPtr aConstruction =
+ std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aResult);
+ if (aConstruction.get() && aConstruction->isInfinite()) {
+ Handle(StdSelect_BRepOwner) aBRepOwner = Handle(StdSelect_BRepOwner)::DownCast(theOwner);
+ if (!aBRepOwner.IsNull() && aBRepOwner->HasShape()) {
+ const TopoDS_Shape& aShape = aBRepOwner->Shape();
+ TopAbs_ShapeEnum anOwnerShapeType = aShape.ShapeType();
+
+ TopAbs_ShapeEnum aResultShapeType = TopAbs_SHAPE;
+ GeomShapePtr aResultShape = aResult->shape();
+ if (aResultShape.get()) {
+ TopoDS_Shape aResultTopoShape = aResultShape->impl<TopoDS_Shape>();
+ aResultShapeType = aResultTopoShape.ShapeType();
+ }
+ // for infinite object, the selection is possible only
+ // for shapes of owners, which are coincide
+ // to the shape of corresponded AIS object.
+ // In other words, for axis, only edge can be selected
+ // (vertices are not selectable), for planes,
+ // only faces can be selected (not edges or vertices)
+ aValid = anOwnerShapeType == aResultShapeType;
+ }
+ }