fixes #0003350: Draft Snapping does not recognize App::Part container

This commit is contained in:
wmayer
2018-02-20 11:19:49 +01:00
parent 2983f624de
commit 91fe3d46fe
2 changed files with 39 additions and 42 deletions

View File

@@ -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 App::DocumentObject*,ViewProviderDocumentObject*>::const_iterator it = d->_ViewProviderMap.begin();
for(;it!= d->_ViewProviderMap.end();++it)
std::map<const App::DocumentObject*,ViewProviderDocumentObject*>::const_iterator it;
for(it = d->_ViewProviderMap.begin();it!= d->_ViewProviderMap.end();++it) {
if (node == it->second->getRoot())
return it->second;
}
}
}

View File

@@ -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<ViewProviderDocumentObject*>(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<ViewProviderDocumentObject*>(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;