From 6d40b1d64644dc06661353e1729fbd05c1ed3182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Fri, 28 Jul 2017 18:05:43 +0200 Subject: [PATCH] Ensure viewprovider is shown after drop from claimChildren3D fixes #0003078 --- src/Gui/Document.cpp | 26 +++++++++++++++++++ .../ViewProviderGeoFeatureGroupExtension.cpp | 6 +---- src/Gui/ViewProviderGroupExtension.cpp | 6 +---- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index a8869dfe6a..6c6de38e37 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -1473,6 +1473,7 @@ PyObject* Document::getPyObject(void) void Document::handleChildren3D(ViewProvider* viewProvider) { // check for children + bool rebuild = false; if (viewProvider && viewProvider->getChildRoot()) { std::vector children = viewProvider->claimChildren3D(); SoGroup* childGroup = viewProvider->getChildRoot(); @@ -1480,6 +1481,7 @@ void Document::handleChildren3D(ViewProvider* viewProvider) // size not the same -> build up the list new if (childGroup->getNumChildren() != static_cast(children.size())) { + rebuild = true; childGroup->removeAllChildren(); for (std::vector::iterator it=children.begin();it!=children.end();++it) { @@ -1522,4 +1524,28 @@ void Document::handleChildren3D(ViewProvider* viewProvider) } } } + + //find all unclaimed viewproviders and add them back to the document (this happens if a + //viewprovider has been claimed before, but the object droped it. + if(rebuild) { + auto vpmap = d->_ViewProviderMap; + for( auto& pair : d->_ViewProviderMap ) { + auto claimed = pair.second->claimChildren3D(); + for(auto obj : claimed) { + auto it = vpmap.find(obj); + if(it != vpmap.end()) + vpmap.erase(it); + } + } + for(auto& pair : vpmap) { + + // cycling to all views of the document to add the viewprovider to the viewer itself + for (std::list::iterator vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) { + View3DInventor *activeView = dynamic_cast(*vIt); + if (activeView && !activeView->getViewer()->hasViewProvider(pair.second)) { + activeView->getViewer()->addViewProvider(pair.second); + } + } + } + } } diff --git a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp index e7b16ff65a..0e9187e9d3 100644 --- a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp +++ b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp @@ -33,7 +33,6 @@ #include "Application.h" #include "Document.h" #include -#include #include using namespace Gui; @@ -76,13 +75,10 @@ std::vector ViewProviderGeoFeatureGroupExtension::extensio //object in the tree std::vector claim; auto objs = ext->Group.getValues(); - Base::Console().Message("Claim children GeoFatureGroup:\n"); for(auto obj : objs) { - if(obj->getInList().size()<=1) { - Base::Console().Message("%s\n", obj->getNameInDocument()); + if(obj->getInList().size()<=1) claim.push_back(obj); - } } return claim; } diff --git a/src/Gui/ViewProviderGroupExtension.cpp b/src/Gui/ViewProviderGroupExtension.cpp index 04ce06be2a..f78084830d 100644 --- a/src/Gui/ViewProviderGroupExtension.cpp +++ b/src/Gui/ViewProviderGroupExtension.cpp @@ -110,11 +110,7 @@ void ViewProviderGroupExtension::extensionDropObject(App::DocumentObject* obj) { std::vector< App::DocumentObject* > ViewProviderGroupExtension::extensionClaimChildren(void) const { - auto* group = getExtendedViewProvider()->getObject()->getExtensionByType(); - Base::Console().Message("Claim children group:\n"); - for(auto obj : group->Group.getValues()) - Base::Console().Message("%s\n", obj->getNameInDocument()); - + auto* group = getExtendedViewProvider()->getObject()->getExtensionByType(); return std::vector(group->Group.getValues()); }