From 92032c15f93f9cb6a0477de161ea932a5df01cd3 Mon Sep 17 00:00:00 2001 From: nds Date: Wed, 18 Nov 2015 12:47:59 +0300 Subject: [PATCH] External point/edge on trihedron when it is selected in the viewer. Create a sketch line starting in the orgin of the trihedron. --- src/PartSet/PartSet_WidgetPoint2d.cpp | 7 ++--- src/XGUI/XGUI_Selection.cpp | 43 +++++++++++++++++++++++++++ src/XGUI/XGUI_Selection.h | 5 ++++ 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/PartSet/PartSet_WidgetPoint2d.cpp b/src/PartSet/PartSet_WidgetPoint2d.cpp index ccf1a3f14..7f44ef948 100644 --- a/src/PartSet/PartSet_WidgetPoint2d.cpp +++ b/src/PartSet/PartSet_WidgetPoint2d.cpp @@ -352,9 +352,9 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous ObjectPtr aObject = aObjects.front(); FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aObject); bool anExternal = false; - if (aSelectedFeature.get() != NULL) { - std::shared_ptr aSPFeature = - std::dynamic_pointer_cast(aSelectedFeature); + std::shared_ptr aSPFeature; + if (aSelectedFeature.get() != NULL) + aSPFeature = std::dynamic_pointer_cast(aSelectedFeature); if ((!aSPFeature) && (!aShape.IsNull())) { anExternal = true; ResultPtr aFixedObject = PartSet_Tools::findFixedObjectByExternal(aShape, aObject, mySketch); @@ -377,7 +377,6 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous emit focusOutWidget(this); } } - } if (!anExternal) { double aX, aY; bool isProcessed = false; diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index 49b698830..1b6f86542 100644 --- a/src/XGUI/XGUI_Selection.cpp +++ b/src/XGUI/XGUI_Selection.cpp @@ -27,6 +27,8 @@ #include +#define DEBUG_DELIVERY + XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) : myWorkshop(theWorkshop) { @@ -126,9 +128,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,6 +161,7 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, thePrs.setShape(aVertex); } } +#endif } XGUI_Displayer* aDisplayer = myWorkshop->displayer(); @@ -262,6 +270,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 +326,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; +} diff --git a/src/XGUI/XGUI_Selection.h b/src/XGUI/XGUI_Selection.h index 5e4b672bc..d81ef7eda 100644 --- a/src/XGUI/XGUI_Selection.h +++ b/src/XGUI/XGUI_Selection.h @@ -106,6 +106,11 @@ protected: /// \param thePresentations an output list of presentation void getSelectedInBrowser(QList& thePresentations) const; + /// Generates a vertex or edge by the give IO if it is an AIS created on trihedron + /// \param theIO a selected object + /// \return created shape or empty shape + TopoDS_Shape findAxisShape(Handle(AIS_InteractiveObject) theIO) const; + private: XGUI_Workshop* myWorkshop; }; -- 2.39.2