X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Selection.cpp;h=079c30cba599938890356ce430a0cb9d2c1727d2;hb=220bd2b37119be1c65abf88a88792445cb9d99f8;hp=49b69883083fb7b99c9857aea76db05c680dc0ad;hpb=42985955d89fa845790a7e38609f5b6838285147;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index 49b698830..079c30cba 100644 --- a/src/XGUI/XGUI_Selection.cpp +++ b/src/XGUI/XGUI_Selection.cpp @@ -10,7 +10,10 @@ #include "XGUI_ViewerProxy.h" #include "XGUI_ObjectsBrowser.h" +#include "ModuleBase_ResultPrs.h" + #include +#include #include #include @@ -27,6 +30,8 @@ #include +#define DEBUG_DELIVERY + XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) : myWorkshop(theWorkshop) { @@ -126,9 +131,14 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, // the located method is called in the context to obtain the shape by the SelectedShape() method, // so the shape is located by the same rules TopoDS_Shape aShape = aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location()); +#ifndef DEBUG_DELIVERY + if (aShape.IsNull()) + aShape = findAxisShape(anIO); +#endif if (!aShape.IsNull()) thePrs.setShape(aShape); } else { +#ifdef DEBUG_DELIVERY // Fill by trihedron shapes Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(anIO); if (!aAxis.IsNull()) { @@ -154,10 +164,31 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, thePrs.setShape(aVertex); } } +#endif } XGUI_Displayer* aDisplayer = myWorkshop->displayer(); ObjectPtr aFeature = aDisplayer->getObject(anIO); + + Handle(ModuleBase_BRepOwner) aCompSolidBRO = Handle(ModuleBase_BRepOwner)::DownCast(theOwner); + if (!aCompSolidBRO.IsNull()) { + // If ModuleBase_BRepOwner object is created then it means that TopAbs_COMPSOLID selection mode + // is On and we have to use parent result which corresponds to the CompSolid shape + ResultPtr aResult = std::dynamic_pointer_cast(aFeature); + if (aResult.get()) { + ResultCompSolidPtr aCompSolid = ModelAPI_Tools::compSolidOwner(aResult); + if (aCompSolid.get()) { + GeomShapePtr aShapePtr = aCompSolid->shape(); + if (aShapePtr.get()) { + TopoDS_Shape aShape = aShapePtr->impl(); + if (aShape.IsEqual(thePrs.shape())) { + thePrs.setObject(aCompSolid); + return; + } + } + } + } + } thePrs.setObject(aFeature); } @@ -262,6 +293,9 @@ void XGUI_Selection::selectedShapes(NCollection_List& theList, for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { TopoDS_Shape aShape = aContext->SelectedShape(); + if (aShape.IsNull()) { + aShape = findAxisShape(aContext->SelectedInteractive()); + } if (!aShape.IsNull()) { theList.Append(aShape); Handle(SelectMgr_EntityOwner) aEO = aContext->SelectedOwner(); @@ -315,3 +349,35 @@ void XGUI_Selection::entityOwners(const Handle(AIS_InteractiveObject)& theObject } } } + +//************************************************************** +TopoDS_Shape XGUI_Selection::findAxisShape(Handle(AIS_InteractiveObject) theIO) const +{ + TopoDS_Shape aShape; + // Fill by trihedron shapes + Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(theIO); + if (!aAxis.IsNull()) { + // an Axis from Trihedron + Handle(Geom_Line) aLine = aAxis->Component(); + Handle(Prs3d_DatumAspect) DA = aAxis->Attributes()->DatumAspect(); + Handle(Geom_TrimmedCurve) aTLine = new Geom_TrimmedCurve(aLine, 0, DA->FirstAxisLength()); + + BRep_Builder aBuilder; + TopoDS_Edge aEdge; + aBuilder.MakeEdge(aEdge, aTLine, Precision::Confusion()); + if (!aEdge.IsNull()) + aShape = aEdge; + } else { + Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast(theIO); + if (!aPoint.IsNull()) { + // A point from trihedron + Handle(Geom_Point) aPnt = aPoint->Component(); + BRep_Builder aBuilder; + TopoDS_Vertex aVertex; + aBuilder.MakeVertex(aVertex, aPnt->Pnt(), Precision::Confusion()); + if (!aVertex.IsNull()) + aShape = aVertex; + } + } + return aShape; +}