From 1e19ef5be4735f4200eaf99ce9e487d2be6f4151 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 24 Aug 2019 13:33:21 +0200 Subject: [PATCH] issue #0004088: Visibility of origin feature of Part container changes when undocking the 3d view --- src/Gui/Document.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index 42c6812944..a385cd0169 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -1562,8 +1562,8 @@ MDIView *Document::createView(const Base::Type& typeId) std::vector children = It2->second->claimChildren3D(); child_vps.insert(child_vps.end(), children.begin(), children.end()); } - - for(App::DocumentObject* obj : child_vps) + + for (App::DocumentObject* obj : child_vps) view3D->getViewer()->removeViewProvider(getViewProvider(obj)); const char* name = getDocument()->Label.getValue(); @@ -1575,7 +1575,7 @@ MDIView *Document::createView(const Base::Type& typeId) view3D->setWindowIcon(QApplication::windowIcon()); view3D->resize(400, 300); - if(cameraSettings.size()) { + if (!cameraSettings.empty()) { const char *ppReturn = 0; view3D->onMsg(cameraSettings.c_str(),&ppReturn); } @@ -1593,13 +1593,29 @@ Gui::MDIView* Document::cloneView(Gui::MDIView* oldview) if (oldview->getTypeId() == View3DInventor::getClassTypeId()) { View3DInventor* view3D = new View3DInventor(this, getMainWindow()); - // attach the viewprovider + View3DInventor* firstView = static_cast(oldview); + std::string overrideMode = firstView->getViewer()->getOverrideMode(); + view3D->getViewer()->setOverrideMode(overrideMode); + + // attach the viewproviders. we need to make sure that we only attach the toplevel ones + // and not viewproviders which are claimed by other providers. To ensure this we first + // add all providers and then remove the ones already claimed std::map::const_iterator It1; - for (It1=d->_ViewProviderMap.begin();It1!=d->_ViewProviderMap.end();++It1) + std::vector child_vps; + for (It1=d->_ViewProviderMap.begin();It1!=d->_ViewProviderMap.end();++It1) { view3D->getViewer()->addViewProvider(It1->second); + std::vector children = It1->second->claimChildren3D(); + child_vps.insert(child_vps.end(), children.begin(), children.end()); + } std::map::const_iterator It2; - for (It2=d->_ViewProviderMapAnnotation.begin();It2!=d->_ViewProviderMapAnnotation.end();++It2) + for (It2=d->_ViewProviderMapAnnotation.begin();It2!=d->_ViewProviderMapAnnotation.end();++It2) { view3D->getViewer()->addViewProvider(It2->second); + std::vector children = It2->second->claimChildren3D(); + child_vps.insert(child_vps.end(), children.begin(), children.end()); + } + + for (App::DocumentObject* obj : child_vps) + view3D->getViewer()->removeViewProvider(getViewProvider(obj)); view3D->setWindowTitle(oldview->windowTitle()); view3D->setWindowModified(oldview->isWindowModified());