From fe32f03e63f723b93f1dfbbc707aa800f85106ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Sat, 27 Aug 2016 16:05:26 +0200 Subject: [PATCH] Extension: Port ViewProvider of OriginGroup --- src/Gui/CMakeLists.txt | 2 + .../ViewProviderGeoFeatureGroupExtension.cpp | 2 + src/Gui/ViewProviderOriginGroup.cpp | 145 +------------ src/Gui/ViewProviderOriginGroup.h | 25 +-- src/Gui/ViewProviderOriginGroupExtension.cpp | 192 ++++++++++++++++++ src/Gui/ViewProviderOriginGroupExtension.h | 65 ++++++ 6 files changed, 271 insertions(+), 160 deletions(-) create mode 100644 src/Gui/ViewProviderOriginGroupExtension.cpp create mode 100644 src/Gui/ViewProviderOriginGroupExtension.h diff --git a/src/Gui/CMakeLists.txt b/src/Gui/CMakeLists.txt index ab332f309c..d6b367c710 100644 --- a/src/Gui/CMakeLists.txt +++ b/src/Gui/CMakeLists.txt @@ -824,6 +824,7 @@ SET(Viewprovider_CPP_SRCS ViewProviderExtension.cpp ViewProviderGroupExtension.cpp ViewProviderGeoFeatureGroupExtension.cpp + ViewProviderOriginGroupExtension.cpp ViewProviderAnnotation.cpp ViewProviderDocumentObject.cpp ViewProviderDocumentObjectGroup.cpp @@ -854,6 +855,7 @@ SET(Viewprovider_SRCS ViewProviderExtension.h ViewProviderGroupExtension.h ViewProviderGeoFeatureGroupExtension.h + ViewProviderOriginGroupExtension.h ViewProviderAnnotation.h ViewProviderDocumentObject.h ViewProviderDocumentObjectGroup.h diff --git a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp index 465b0b3627..217f73bd13 100644 --- a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp +++ b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp @@ -1,4 +1,6 @@ /*************************************************************************** + * Copyright (c) 2011 Juergen Riegel * + * Copyright (c) 2015 Alexander Golubev (Fat-Zer) * * Copyright (c) 2016 Stefan Tröger * * * * This file is part of the FreeCAD CAx development system. * diff --git a/src/Gui/ViewProviderOriginGroup.cpp b/src/Gui/ViewProviderOriginGroup.cpp index 57e1db81d5..bac87aeed4 100644 --- a/src/Gui/ViewProviderOriginGroup.cpp +++ b/src/Gui/ViewProviderOriginGroup.cpp @@ -45,146 +45,13 @@ using namespace Gui; -PROPERTY_SOURCE(Gui::ViewProviderOriginGroup, Gui::ViewProviderGeoFeatureGroup) +PROPERTY_SOURCE_WITH_EXTENSIONS(Gui::ViewProviderOriginGroup, Gui::ViewProviderDocumentObject, (Gui::ViewProviderOriginGroupExtension)) ViewProviderOriginGroup::ViewProviderOriginGroup () -{ } - -ViewProviderOriginGroup::~ViewProviderOriginGroup () { - connectChangedObjectApp.disconnect(); - connectChangedObjectGui.disconnect(); +{ + initExtension(this); } -std::vector ViewProviderOriginGroup::constructChildren ( - const std::vector &children ) const -{ - auto group = dynamic_cast ( getObject()->getExtension(App::OriginGroupExtension::getClassTypeId()) ); - App::DocumentObject *originObj = group->Origin.getValue(); - - // Origin must be first - if (originObj) { - std::vector rv; - rv.push_back (originObj); - std::copy (children.begin(), children.end(), std::back_inserter (rv)); - return rv; - } else { // Generally shouldn't happen but must be handled in case origin is lost - return children; - } -} - - -std::vector ViewProviderOriginGroup::claimChildren () const { - return constructChildren ( ViewProviderGeoFeatureGroup::claimChildren () ); -} - -std::vector ViewProviderOriginGroup::claimChildren3D () const { - return constructChildren ( ViewProviderGeoFeatureGroup::claimChildren3D () ); -} - -void ViewProviderOriginGroup::attach(App::DocumentObject *pcObject) { - ViewProviderGeoFeatureGroup::attach ( pcObject ); - - App::Document *adoc = pcObject->getDocument (); - Gui::Document *gdoc = Gui::Application::Instance->getDocument ( adoc ) ; - - assert ( adoc ); - assert ( gdoc ); - - connectChangedObjectApp = adoc->signalChangedObject.connect ( - boost::bind ( &ViewProviderOriginGroup::slotChangedObjectApp, this, _1) ); - - connectChangedObjectGui = gdoc->signalChangedObject.connect ( - boost::bind ( &ViewProviderOriginGroup::slotChangedObjectGui, this, _1) ); -} - -void ViewProviderOriginGroup::updateData ( const App::Property* prop ) { - - auto group = dynamic_cast ( getObject()->getExtension(App::OriginGroupExtension::getClassTypeId()) ); - if ( group && prop == &group->Group ) { - updateOriginSize(); - } - - ViewProviderGeoFeatureGroup::updateData ( prop ); -} - -void ViewProviderOriginGroup::slotChangedObjectApp ( const App::DocumentObject& obj) { - auto group = dynamic_cast ( getObject()->getExtension(App::OriginGroupExtension::getClassTypeId()) ); - if ( group && group->hasObject (&obj, /*recusive=*/ true ) ) { - updateOriginSize (); - } -} - -void ViewProviderOriginGroup::slotChangedObjectGui ( const Gui::ViewProviderDocumentObject& vp) { - if ( !vp.isDerivedFrom ( Gui::ViewProviderOrigin::getClassTypeId () ) && - !vp.isDerivedFrom ( Gui::ViewProviderOriginFeature::getClassTypeId () ) ) { - // Ignore origins to avoid infinite recursion (not likely in a well-formed focument, - // but may happen in documents designed in old versions of assembly branch ) - auto group = dynamic_cast ( getObject()->getExtension(App::OriginGroupExtension::getClassTypeId()) ); - App::DocumentObject *obj = vp.getObject (); - - if ( group && obj && group->hasObject (obj, /*recusive=*/ true ) ) { - updateOriginSize (); - } - } -} - -void ViewProviderOriginGroup::updateOriginSize () { - auto group = dynamic_cast ( getObject()->getExtension(App::OriginGroupExtension::getClassTypeId()) ); - - // obtain an Origin and it's ViewProvider - App::Origin* origin = 0; - Gui::ViewProviderOrigin* vpOrigin = 0; - try { - origin = group->getOrigin (); - assert (origin); - - Gui::ViewProvider *vp = Gui::Application::Instance->getViewProvider(origin); - if (!vp) { - throw Base::Exception ("No view provider linked to the Origin"); - } - assert ( vp->isDerivedFrom ( Gui::ViewProviderOrigin::getClassTypeId () ) ); - vpOrigin = static_cast ( vp ); - } catch (const Base::Exception &ex) { - Base::Console().Error ("%s\n", ex.what() ); - return; - } - - - Gui::Document* gdoc = Gui::Application::Instance->getDocument(getObject()->getDocument()); - if(!gdoc) - return; - - Gui::MDIView* view = gdoc->getViewOfViewProvider(this); - if(!view) - return; - - Gui::View3DInventorViewer* viewer = static_cast(view)->getViewer(); - SoGetBoundingBoxAction bboxAction(viewer->getSoRenderManager()->getViewportRegion()); - - // calculate the bounding box for out content - SbBox3f bbox(0,0,0, 0,0,0); - for(App::DocumentObject* obj : group->getGeoSubObjects()) { - ViewProvider *vp = Gui::Application::Instance->getViewProvider(obj); - if (!vp) { - continue; - } - - bboxAction.apply ( vp->getRoot () ); - bbox.extendBy ( bboxAction.getBoundingBox () ); - }; - - // get the bounding box values - SbVec3f max = bbox.getMax(); - SbVec3f min = bbox.getMin(); - - Base::Vector3d size; - - for (uint_fast8_t i=0; i<3; i++) { - size[i] = std::max ( fabs ( max[i] ), fabs ( min[i] ) ); - if (size[i] < 1e-7) { // TODO replace the magic values (2015-08-31, Fat-Zer) - size[i] = ViewProviderOrigin::defaultSize(); - } - } - - vpOrigin->Size.setValue ( size * 1.3 ); -} +ViewProviderOriginGroup::~ViewProviderOriginGroup () +{ +} \ No newline at end of file diff --git a/src/Gui/ViewProviderOriginGroup.h b/src/Gui/ViewProviderOriginGroup.h index c381f77450..06ff7112f4 100644 --- a/src/Gui/ViewProviderOriginGroup.h +++ b/src/Gui/ViewProviderOriginGroup.h @@ -26,34 +26,17 @@ #include #include "ViewProviderGeoFeatureGroup.h" +#include "ViewProviderOriginGroupExtension.h" namespace Gui { -class GuiExport ViewProviderOriginGroup: public ViewProviderGeoFeatureGroup +class GuiExport ViewProviderOriginGroup: public ViewProviderDocumentObject, + public ViewProviderOriginGroupExtension { - PROPERTY_HEADER(Gui::ViewProviderOriginGroup); + PROPERTY_HEADER_WITH_EXTENSIONS(Gui::ViewProviderOriginGroup); public: ViewProviderOriginGroup (); virtual ~ViewProviderOriginGroup (); - - virtual std::vector claimChildren(void)const; - virtual std::vector claimChildren3D(void)const; - - virtual void attach(App::DocumentObject *pcObject); - virtual void updateData(const App::Property* prop); - - void updateOriginSize(); - -protected: - void slotChangedObjectApp ( const App::DocumentObject& obj ); - void slotChangedObjectGui ( const Gui::ViewProviderDocumentObject& obj ); - -private: - std::vector constructChildren ( - const std::vector &children ) const; - - boost::signals::connection connectChangedObjectApp; - boost::signals::connection connectChangedObjectGui; }; } /* Gui */ diff --git a/src/Gui/ViewProviderOriginGroupExtension.cpp b/src/Gui/ViewProviderOriginGroupExtension.cpp new file mode 100644 index 0000000000..72466579f5 --- /dev/null +++ b/src/Gui/ViewProviderOriginGroupExtension.cpp @@ -0,0 +1,192 @@ +/*************************************************************************** + * Copyright (c) 2015 Alexander Golubev (Fat-Zer) * + * Copyright (c) 2016 Stefan Tröger * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#include "PreCompiled.h" + +#ifndef _PreComp_ +#endif + +#include "ViewProviderOriginGroupExtension.h" +#include "Application.h" +#include "Document.h" +#include "ViewProviderOriginFeature.h" +#include "ViewProviderOrigin.h" +#include "View3DInventorViewer.h" +#include "View3DInventor.h" +#include +#include +#include +#include +#include +#include +#include + +using namespace Gui; + +PROPERTY_SOURCE(Gui::ViewProviderOriginGroupExtension, Gui::ViewProviderGeoFeatureGroupExtension) + +ViewProviderOriginGroupExtension::ViewProviderOriginGroupExtension() +{ + initExtension(ViewProviderOriginGroupExtension::getClassTypeId()); +} + +ViewProviderOriginGroupExtension::~ViewProviderOriginGroupExtension() +{ + connectChangedObjectApp.disconnect(); + connectChangedObjectGui.disconnect(); +} + +std::vector ViewProviderOriginGroupExtension::constructChildren ( + const std::vector &children ) const +{ + auto* group = getExtendedViewProvider()->getObject()->getExtensionByType(); + App::DocumentObject *originObj = group->Origin.getValue(); + + // Origin must be first + if (originObj) { + std::vector rv; + rv.push_back (originObj); + std::copy (children.begin(), children.end(), std::back_inserter (rv)); + return rv; + } else { // Generally shouldn't happen but must be handled in case origin is lost + return children; + } +} + + +std::vector ViewProviderOriginGroupExtension::extensionClaimChildren () const { + return constructChildren ( ViewProviderGeoFeatureGroupExtension::extensionClaimChildren () ); +} + +std::vector ViewProviderOriginGroupExtension::extensionClaimChildren3D () const { + return constructChildren ( ViewProviderGeoFeatureGroupExtension::extensionClaimChildren3D () ); +} + +void ViewProviderOriginGroupExtension::extensionAttach(App::DocumentObject *pcObject) { + ViewProviderOriginGroupExtension::extensionAttach ( pcObject ); + + App::Document *adoc = pcObject->getDocument (); + Gui::Document *gdoc = Gui::Application::Instance->getDocument ( adoc ) ; + + assert ( adoc ); + assert ( gdoc ); + + connectChangedObjectApp = adoc->signalChangedObject.connect ( + boost::bind ( &ViewProviderOriginGroupExtension::slotChangedObjectApp, this, _1) ); + + connectChangedObjectGui = gdoc->signalChangedObject.connect ( + boost::bind ( &ViewProviderOriginGroupExtension::slotChangedObjectGui, this, _1) ); +} + +void ViewProviderOriginGroupExtension::extensionUpdateData( const App::Property* prop ) { + + auto* group = getExtendedViewProvider()->getObject()->getExtensionByType(); + if ( prop == &group->Group ) { + updateOriginSize(); + } + + ViewProviderOriginGroupExtension::extensionUpdateData ( prop ); +} + +void ViewProviderOriginGroupExtension::slotChangedObjectApp ( const App::DocumentObject& obj) { + auto* group = getExtendedViewProvider()->getObject()->getExtensionByType(); + if ( group->hasObject (&obj, /*recusive=*/ true ) ) { + updateOriginSize (); + } +} + +void ViewProviderOriginGroupExtension::slotChangedObjectGui ( const Gui::ViewProviderDocumentObject& vp) { + if ( !vp.hasExtension ( Gui::ViewProviderOrigin::getClassTypeId () ) && + !vp.isDerivedFrom ( Gui::ViewProviderOriginFeature::getClassTypeId () ) ) { + // Ignore origins to avoid infinite recursion (not likely in a well-formed focument, + // but may happen in documents designed in old versions of assembly branch ) + auto* group = getExtendedViewProvider()->getObject()->getExtensionByType(); + App::DocumentObject *obj = vp.getObject (); + + if ( group && obj && group->hasObject (obj, /*recusive=*/ true ) ) { + updateOriginSize (); + } + } +} + +void ViewProviderOriginGroupExtension::updateOriginSize () { + auto* group = getExtendedViewProvider()->getObject()->getExtensionByType(); + + // obtain an Origin and it's ViewProvider + App::Origin* origin = 0; + Gui::ViewProviderOrigin* vpOrigin = 0; + try { + origin = group->getOrigin (); + assert (origin); + + Gui::ViewProvider *vp = Gui::Application::Instance->getViewProvider(origin); + if (!vp) { + throw Base::Exception ("No view provider linked to the Origin"); + } + assert ( vp->isDerivedFrom ( Gui::ViewProviderOrigin::getClassTypeId () ) ); + vpOrigin = static_cast ( vp ); + } catch (const Base::Exception &ex) { + Base::Console().Error ("%s\n", ex.what() ); + return; + } + + + Gui::Document* gdoc = getExtendedViewProvider()->getDocument(); + if(!gdoc) + return; + + Gui::MDIView* view = gdoc->getViewOfViewProvider(getExtendedViewProvider()); + if(!view) + return; + + Gui::View3DInventorViewer* viewer = static_cast(view)->getViewer(); + SoGetBoundingBoxAction bboxAction(viewer->getSoRenderManager()->getViewportRegion()); + + // calculate the bounding box for out content + SbBox3f bbox(0,0,0, 0,0,0); + for(App::DocumentObject* obj : group->getGeoSubObjects()) { + ViewProvider *vp = Gui::Application::Instance->getViewProvider(obj); + if (!vp) { + continue; + } + + bboxAction.apply ( vp->getRoot () ); + bbox.extendBy ( bboxAction.getBoundingBox () ); + }; + + // get the bounding box values + SbVec3f max = bbox.getMax(); + SbVec3f min = bbox.getMin(); + + Base::Vector3d size; + + for (uint_fast8_t i=0; i<3; i++) { + size[i] = std::max ( fabs ( max[i] ), fabs ( min[i] ) ); + if (size[i] < 1e-7) { // TODO replace the magic values (2015-08-31, Fat-Zer) + size[i] = ViewProviderOrigin::defaultSize(); + } + } + + vpOrigin->Size.setValue ( size * 1.3 ); +} diff --git a/src/Gui/ViewProviderOriginGroupExtension.h b/src/Gui/ViewProviderOriginGroupExtension.h new file mode 100644 index 0000000000..8647978192 --- /dev/null +++ b/src/Gui/ViewProviderOriginGroupExtension.h @@ -0,0 +1,65 @@ +/*************************************************************************** + * Copyright (c) 2015 Alexander Golubev (Fat-Zer) * + * Copyright (c) 2016 Stefan Tröger * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#ifndef GUI_VIEWPROVIDERORIGINGROUPEXTENSION_H +#define GUI_VIEWPROVIDERORIGINGROUPEXTENSION_H + +#include +#include "ViewProviderGeoFeatureGroup.h" + +namespace Gui +{ + +class GuiExport ViewProviderOriginGroupExtension : public ViewProviderGeoFeatureGroupExtension +{ + PROPERTY_HEADER(Gui::ViewProviderOriginGroupExtension); + +public: + /// Constructor + ViewProviderOriginGroupExtension(void); + virtual ~ViewProviderOriginGroupExtension(); + + virtual std::vector extensionClaimChildren(void)const override; + virtual std::vector extensionClaimChildren3D(void)const override; + + virtual void extensionAttach(App::DocumentObject *pcObject) override; + virtual void extensionUpdateData(const App::Property* prop) override; + + void updateOriginSize(); + +protected: + void slotChangedObjectApp ( const App::DocumentObject& obj ); + void slotChangedObjectGui ( const Gui::ViewProviderDocumentObject& obj ); + +private: + std::vector constructChildren ( + const std::vector &children ) const; + + boost::signals::connection connectChangedObjectApp; + boost::signals::connection connectChangedObjectGui; +}; + +} //namespace Gui + +#endif // GUI_VIEWPROVIDERORIGINGROUPEXTENSION_H