X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_FilterInfinite.cpp;h=7b8d328bac88f44067bb6cbdb6e478f5c09f3539;hb=3205d0f18200948632155bbe7b640bc1e482243d;hp=28f6795504dae192cf0e85178db55c7a3f93851a;hpb=5e9152f6da5141e26c07727e26a0ec89255ade87;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_FilterInfinite.cpp b/src/PartSet/PartSet_FilterInfinite.cpp index 28f679550..7b8d328ba 100755 --- a/src/PartSet/PartSet_FilterInfinite.cpp +++ b/src/PartSet/PartSet_FilterInfinite.cpp @@ -6,17 +6,54 @@ #include "PartSet_FilterInfinite.h" +#include +#include +#include + #include +#include +#include +#include IMPLEMENT_STANDARD_HANDLE(PartSet_FilterInfinite, SelectMgr_Filter); IMPLEMENT_STANDARD_RTTIEXT(PartSet_FilterInfinite, SelectMgr_Filter); +PartSet_FilterInfinite::PartSet_FilterInfinite(ModuleBase_IWorkshop* theWorkshop) +: SelectMgr_Filter(), myWorkshop(theWorkshop) +{ +} + Standard_Boolean PartSet_FilterInfinite::IsOk(const Handle(SelectMgr_EntityOwner)& theOwner) const { - Handle(AIS_InteractiveObject) anAISObj = - Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable()); - if (!anAISObj.IsNull() && anAISObj->IsInfinite()) { - return Standard_False; + Standard_Boolean aValid = Standard_True; + + ModuleBase_ViewerPrs aPrs; + 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(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(); + 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; + } + } } - return Standard_True; +#ifdef DEBUG_FILTERS + qDebug(QString("PartSet_FilterInfinite::IsOk = %1").arg(aValid).toStdString().c_str()); +#endif + return aValid; }