diff --git a/src/Gui/ViewProvider.cpp b/src/Gui/ViewProvider.cpp index 773acd9acd..c2660bad09 100644 --- a/src/Gui/ViewProvider.cpp +++ b/src/Gui/ViewProvider.cpp @@ -882,12 +882,28 @@ std::vector< App::DocumentObject* > ViewProvider::claimChildren() const auto vector = getExtensionsDerivedFromType(); for (Gui::ViewProviderExtension* ext : vector) { std::vector< App::DocumentObject* > nvec = ext->extensionClaimChildren(); - if (!nvec.empty()) + if (!nvec.empty()){ vec.insert(std::end(vec), std::begin(nvec), std::end(nvec)); + } } return vec; } +std::vector< App::DocumentObject* > ViewProvider::claimChildrenRecursive() const +{ + std::vector children = claimChildren(); + for (auto* child : claimChildren()) { + auto* vp = Application::Instance->getViewProvider(child); + if (!vp) { continue; } + + std::vector nvec = vp->claimChildrenRecursive(); + if (!nvec.empty()){ + children.insert(std::end(children), std::begin(nvec), std::end(nvec)); + } + } + return children; +} + std::vector< App::DocumentObject* > ViewProvider::claimChildren3D() const { std::vector< App::DocumentObject* > vec; diff --git a/src/Gui/ViewProvider.h b/src/Gui/ViewProvider.h index a209ec7551..2652639573 100644 --- a/src/Gui/ViewProvider.h +++ b/src/Gui/ViewProvider.h @@ -264,6 +264,11 @@ public: virtual std::vector claimChildren() const; //@} + /** deliver the children belonging to this object recursively. + */ + virtual std::vector claimChildrenRecursive() const; + //@} + /** @name Drag and drop * To enable drag and drop you have to re-implement \ref canDragObjects() and * \ref canDropObjects() to return true. For finer control you can also re-implement diff --git a/src/Gui/ViewProviderPy.xml b/src/Gui/ViewProviderPy.xml index 591b845dcc..8ce41e4deb 100644 --- a/src/Gui/ViewProviderPy.xml +++ b/src/Gui/ViewProviderPy.xml @@ -201,6 +201,13 @@ trans : Base.Placement, Base.Matrix Returns list of objects that are to be grouped in tree under this object. + + + claimChildrenRecursive() -> list + +Returns list of objects that are to be grouped in tree under this object recursively. + + partialRender(sub=None, clear=False) -> int diff --git a/src/Gui/ViewProviderPyImp.cpp b/src/Gui/ViewProviderPyImp.cpp index c58086f53e..066ae1bd19 100644 --- a/src/Gui/ViewProviderPyImp.cpp +++ b/src/Gui/ViewProviderPyImp.cpp @@ -393,7 +393,23 @@ PyObject* ViewProviderPy::claimChildren(PyObject* args) std::vector children = this->getViewProviderPtr()->claimChildren(); Py::List ret; - for(App::DocumentObject* child: children){ + for(auto* child : children){ + if (child) + ret.append(Py::asObject(child->getPyObject())); + else + ret.append(Py::None()); + } + return Py::new_reference_to(ret); +} + +PyObject* ViewProviderPy::claimChildrenRecursive(PyObject* args) +{ + if (!PyArg_ParseTuple(args, "")) + return nullptr; + + std::vector children = this->getViewProviderPtr()->claimChildrenRecursive(); + Py::List ret; + for(auto* child : children){ if (child) ret.append(Py::asObject(child->getPyObject())); else diff --git a/src/Mod/Assembly/CommandInsertLink.py b/src/Mod/Assembly/CommandInsertLink.py index 6f17dc7304..75c403d569 100644 --- a/src/Mod/Assembly/CommandInsertLink.py +++ b/src/Mod/Assembly/CommandInsertLink.py @@ -165,7 +165,7 @@ class TaskAssemblyInsertLink(QtCore.QObject): def process_objects(objs, item): onlyParts = self.form.CheckBox_ShowOnlyParts.isChecked() for obj in objs: - if obj.Name == self.assembly.Name: + if obj == self.assembly: continue # Skip current assembly if ( @@ -180,7 +180,7 @@ class TaskAssemblyInsertLink(QtCore.QObject): (not onlyParts and child.isDerivedFrom("Part::Feature")) or child.isDerivedFrom("App::Part") ) - for child in obj.OutListRecursive + for child in obj.ViewObject.claimChildrenRecursive() ): continue # Skip this object if no relevant children @@ -201,7 +201,7 @@ class TaskAssemblyInsertLink(QtCore.QObject): if obj.isDerivedFrom("App::Part") or obj.isDerivedFrom( "App::DocumentObjectGroup" ): - process_objects(obj.OutList, objItem) + process_objects(obj.ViewObject.claimChildren(), objItem) guiDoc = Gui.getDocument(doc.Name) process_objects(guiDoc.TreeRootObjects, docItem)