From 624a3c41466e7e052d1cd6629598ad14b2bf390f Mon Sep 17 00:00:00 2001 From: DeepSOIC Date: Wed, 3 May 2017 16:50:23 +0300 Subject: [PATCH] Gui: PickRadius support for View3DPy.getObjectInfo() requested by Chris_G in forum thread "ActiveView.getObjectInfo ignores pickRadius ?" https://forum.freecadweb.org/viewtopic.php?f=22&t=22196 --- src/Gui/View3DPy.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Gui/View3DPy.cpp b/src/Gui/View3DPy.cpp index 7e8f2183a4..cbee1dda94 100644 --- a/src/Gui/View3DPy.cpp +++ b/src/Gui/View3DPy.cpp @@ -127,14 +127,14 @@ void View3DInventorPy::init_type() "Return the current cursor position relative to the coordinate system of the\n" "viewport region.\n"); add_varargs_method("getObjectInfo",&View3DInventorPy::getObjectInfo, - "getObjectInfo(tuple of integers) -> dictionary or None\n" + "getObjectInfo(tuple(int,int), [pick_radius]) -> dictionary or None\n" "\n" "Return a dictionary with the name of document, object and component. The\n" "dictionary also contains the coordinates of the appropriate 3d point of\n" "the underlying geometry in the scenegraph.\n" "If no geometry was found 'None' is returned, instead.\n"); add_varargs_method("getObjectsInfo",&View3DInventorPy::getObjectsInfo, - "getObjectsInfo(tuple of integers) -> dictionary or None\n" + "getObjectsInfo(tuple(int,int), [pick_radius]) -> dictionary or None\n" "\n" "Does the same as getObjectInfo() but returns a list of dictionaries or None.\n"); add_varargs_method("getSize",&View3DInventorPy::getSize,"getSize()"); @@ -1172,7 +1172,8 @@ Py::Object View3DInventorPy::getCursorPos(const Py::Tuple& args) Py::Object View3DInventorPy::getObjectInfo(const Py::Tuple& args) { PyObject* object; - if (!PyArg_ParseTuple(args.ptr(), "O", &object)) + float r = _view->getViewer()->getPickRadius(); + if (!PyArg_ParseTuple(args.ptr(), "O|f", &object, &r)) throw Py::Exception(); try { @@ -1191,6 +1192,7 @@ Py::Object View3DInventorPy::getObjectInfo(const Py::Tuple& args) // which is regarded as error-prone. SoRayPickAction action(_view->getViewer()->getSoRenderManager()->getViewportRegion()); action.setPoint(SbVec2s((long)x,(long)y)); + action.setRadius(r); action.apply(_view->getViewer()->getSoRenderManager()->getSceneGraph()); SoPickedPoint *Point = action.getPickedPoint(); @@ -1241,7 +1243,8 @@ Py::Object View3DInventorPy::getObjectInfo(const Py::Tuple& args) Py::Object View3DInventorPy::getObjectsInfo(const Py::Tuple& args) { PyObject* object; - if (!PyArg_ParseTuple(args.ptr(), "O", &object)) + float r = _view->getViewer()->getPickRadius(); + if (!PyArg_ParseTuple(args.ptr(), "O|f", &object, &r)) throw Py::Exception(); try { @@ -1260,6 +1263,7 @@ Py::Object View3DInventorPy::getObjectsInfo(const Py::Tuple& args) // which is regarded as error-prone. SoRayPickAction action(_view->getViewer()->getSoRenderManager()->getViewportRegion()); action.setPickAll(true); + action.setRadius(r); action.setPoint(SbVec2s((long)x,(long)y)); action.apply(_view->getViewer()->getSoRenderManager()->getSceneGraph()); const SoPickedPointList& pp = action.getPickedPointList();