From b2963382d3e8cd76a141cde8c7bdce8810f564f7 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 20 Feb 2018 11:19:49 +0100 Subject: [PATCH] fixes #0003350: Draft Snapping does not recognize App::Part container --- src/Gui/Document.cpp | 8 ++--- src/Gui/View3DPy.cpp | 73 +++++++++++++++++++++----------------------- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index 416fb68554..5d943c6058 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -611,15 +611,15 @@ bool Document::isModified() const ViewProvider* Document::getViewProviderByPathFromTail(SoPath * path) const { - // Make sure I'm the lowest LocHL in the pick path! + // Get the lowest root node in the pick path! for (int i = 0; i < path->getLength(); i++) { SoNode *node = path->getNodeFromTail(i); if (node->isOfType(SoSeparator::getClassTypeId())) { - std::map::const_iterator it = d->_ViewProviderMap.begin(); - for(;it!= d->_ViewProviderMap.end();++it) + std::map::const_iterator it; + for(it = d->_ViewProviderMap.begin();it!= d->_ViewProviderMap.end();++it) { if (node == it->second->getRoot()) return it->second; - + } } } diff --git a/src/Gui/View3DPy.cpp b/src/Gui/View3DPy.cpp index e2b8cf3872..c8722eff59 100644 --- a/src/Gui/View3DPy.cpp +++ b/src/Gui/View3DPy.cpp @@ -1153,33 +1153,32 @@ Py::Object View3DInventorPy::getObjectInfo(const Py::Tuple& args) dict.setItem("y", Py::Float(pt[1])); dict.setItem("z", Py::Float(pt[2])); - ViewProvider *vp = _view->getViewer()->getViewProviderByPath(Point->getPath()); - if (vp && vp->useNewSelectionModel() && vp->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) { + Gui::Document* doc = _view->getViewer()->getDocument(); + ViewProvider *vp = doc ? doc->getViewProviderByPathFromTail(Point->getPath()) + : _view->getViewer()->getViewProviderByPathFromTail(Point->getPath()); + if (vp && vp->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) { ViewProviderDocumentObject* vpd = static_cast(vp); dict.setItem("Document", Py::String(vpd->getObject()->getDocument()->getName())); dict.setItem("Object", Py::String(vpd->getObject()->getNameInDocument())); - dict.setItem("Component", - Py::String(vpd->getElement(Point->getDetail()))); + if (vp->useNewSelectionModel()) { + dict.setItem("Component", + Py::String(vpd->getElement(Point->getDetail()))); + } + else { + // search for a SoFCSelection node + SoFCDocumentObjectAction objaction; + objaction.apply(Point->getPath()); + if (objaction.isHandled()) { + dict.setItem("Component", + Py::String(objaction.componentName.getString())); + } + } + // ok, found the node of interest ret = dict; } - else { - // search for a SoFCSelection node - SoFCDocumentObjectAction objaction; - objaction.apply(Point->getPath()); - if (objaction.isHandled()) { - dict.setItem("Document", - Py::String(objaction.documentName.getString())); - dict.setItem("Object", - Py::String(objaction.objectName.getString())); - dict.setItem("Component", - Py::String(objaction.componentName.getString())); - // ok, found the node of interest - ret = dict; - } - } } return ret; @@ -1217,6 +1216,7 @@ Py::Object View3DInventorPy::getObjectsInfo(const Py::Tuple& args) action.apply(_view->getViewer()->getSoRenderManager()->getSceneGraph()); const SoPickedPointList& pp = action.getPickedPointList(); + Gui::Document* doc = _view->getViewer()->getDocument(); Py::Object ret = Py::None(); if (pp.getLength() > 0) { Py::List list; @@ -1228,33 +1228,30 @@ Py::Object View3DInventorPy::getObjectsInfo(const Py::Tuple& args) dict.setItem("y", Py::Float(pt[1])); dict.setItem("z", Py::Float(pt[2])); - ViewProvider *vp = _view->getViewer()->getViewProviderByPath(point->getPath()); - if (vp && vp->useNewSelectionModel() && vp->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) { + ViewProvider *vp = doc ? doc->getViewProviderByPathFromTail(point->getPath()) + : _view->getViewer()->getViewProviderByPathFromTail(point->getPath()); + if (vp && vp->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) { ViewProviderDocumentObject* vpd = static_cast(vp); dict.setItem("Document", Py::String(vpd->getObject()->getDocument()->getName())); dict.setItem("Object", Py::String(vpd->getObject()->getNameInDocument())); - dict.setItem("Component", - Py::String(vpd->getElement(point->getDetail()))); + if (vp->useNewSelectionModel()) { + dict.setItem("Component", + Py::String(vpd->getElement(point->getDetail()))); + } + else { + // search for a SoFCSelection node + SoFCDocumentObjectAction objaction; + objaction.apply(point->getPath()); + if (objaction.isHandled()) { + dict.setItem("Component", + Py::String(objaction.componentName.getString())); + } + } // ok, found the node of interest list.append(dict); } - else { - // search for a SoFCSelection node - SoFCDocumentObjectAction objaction; - objaction.apply(point->getPath()); - if (objaction.isHandled()) { - dict.setItem("Document", - Py::String(objaction.documentName.getString())); - dict.setItem("Object", - Py::String(objaction.objectName.getString())); - dict.setItem("Component", - Py::String(objaction.componentName.getString())); - // ok, found the node of interest - list.append(dict); - } - } } ret = list;