From a025a20beddef4de89a4627b7ea8f4ae4caa5002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Sat, 10 Dec 2016 14:44:13 +0100 Subject: [PATCH] Extensions: GeoFeatureGroup only for GeoFeature --- src/App/DocumentObjectExtension.cpp | 2 +- src/App/Extension.cpp | 2 +- src/App/Extension.h | 6 ++--- src/App/GeoFeatureGroupExtension.cpp | 25 +++++++++++++++---- src/App/GeoFeatureGroupExtension.h | 4 ++- src/App/GroupExtension.cpp | 2 +- src/App/OriginGroupExtension.cpp | 2 +- src/App/Part.cpp | 2 +- src/App/Part.h | 2 +- src/Gui/ViewProviderExtension.cpp | 2 +- src/Gui/ViewProviderExtension.h | 2 +- .../ViewProviderGeoFeatureGroupExtension.cpp | 6 ++--- src/Gui/ViewProviderGroupExtension.cpp | 2 +- src/Gui/ViewProviderOriginGroupExtension.cpp | 2 +- src/Mod/Part/App/AttachExtension.cpp | 2 +- 15 files changed, 40 insertions(+), 23 deletions(-) diff --git a/src/App/DocumentObjectExtension.cpp b/src/App/DocumentObjectExtension.cpp index 526bda7764..9c8c5a34f7 100644 --- a/src/App/DocumentObjectExtension.cpp +++ b/src/App/DocumentObjectExtension.cpp @@ -37,7 +37,7 @@ EXTENSION_PROPERTY_SOURCE(App::DocumentObjectExtension, App::Extension) DocumentObjectExtension::DocumentObjectExtension() { - initExtension(App::DocumentObjectExtension::getExtensionClassTypeId()); + initExtensionType(App::DocumentObjectExtension::getExtensionClassTypeId()); } DocumentObjectExtension::~DocumentObjectExtension() diff --git a/src/App/Extension.cpp b/src/App/Extension.cpp index 35637df6d3..519982bc5b 100644 --- a/src/App/Extension.cpp +++ b/src/App/Extension.cpp @@ -71,7 +71,7 @@ Extension::~Extension() } } -void Extension::initExtension(Base::Type type) { +void Extension::initExtensionType(Base::Type type) { m_extensionType = type; if(m_extensionType.isBad()) diff --git a/src/App/Extension.h b/src/App/Extension.h index 1dfc8dab80..4b1137ed3b 100644 --- a/src/App/Extension.h +++ b/src/App/Extension.h @@ -215,7 +215,7 @@ public: Extension(); virtual ~Extension(); - void initExtension(App::ExtensionContainer* obj); + virtual void initExtension(App::ExtensionContainer* obj); App::ExtensionContainer* getExtendedContainer() {return m_base;} const App::ExtensionContainer* getExtendedContainer() const {return m_base;} @@ -272,7 +272,7 @@ protected: friend class App::ExtensionContainer; protected: - void initExtension(Base::Type type); + void initExtensionType(Base::Type type); bool m_isPythonExtension = false; Py::Object ExtensionPythonObject; @@ -309,7 +309,7 @@ public: ExtensionPythonT() { ExtensionT::m_isPythonExtension = true; - ExtensionT::initExtension(ExtensionPythonT::getExtensionClassTypeId()); + ExtensionT::initExtensionType(ExtensionPythonT::getExtensionClassTypeId()); EXTENSION_ADD_PROPERTY(ExtensionProxy,(Py::Object())); } diff --git a/src/App/GeoFeatureGroupExtension.cpp b/src/App/GeoFeatureGroupExtension.cpp index a76afbef84..a9dadff5f5 100644 --- a/src/App/GeoFeatureGroupExtension.cpp +++ b/src/App/GeoFeatureGroupExtension.cpp @@ -45,21 +45,36 @@ EXTENSION_PROPERTY_SOURCE(App::GeoFeatureGroupExtension, App::GroupExtension) GeoFeatureGroupExtension::GeoFeatureGroupExtension(void) { - initExtension(GeoFeatureGroupExtension::getExtensionClassTypeId()); - - EXTENSION_ADD_PROPERTY(Placement,(Base::Placement())); + initExtensionType(GeoFeatureGroupExtension::getExtensionClassTypeId()); } GeoFeatureGroupExtension::~GeoFeatureGroupExtension(void) { } +void GeoFeatureGroupExtension::initExtension(ExtensionContainer* obj) { + + if(!obj->isDerivedFrom(App::GeoFeature::getClassTypeId())) + throw Base::Exception("GeoFeatureGroupExtension can only be applied to GeoFeatures"); + + App::Extension::initExtension(obj); +} + +PropertyPlacement& GeoFeatureGroupExtension::placement() { + + if(!getExtendedContainer()) + throw Base::Exception("GeoFeatureGroupExtension was not applied to GeoFeature"); + + return static_cast(getExtendedContainer())->Placement; +} + + void GeoFeatureGroupExtension::transformPlacement(const Base::Placement &transform) { // NOTE: Keep in sync with APP::GeoFeature - Base::Placement plm = this->Placement.getValue(); + Base::Placement plm = this->placement().getValue(); plm = transform * plm; - this->Placement.setValue(plm); + this->placement().setValue(plm); } std::vector GeoFeatureGroupExtension::getGeoSubObjects () const { diff --git a/src/App/GeoFeatureGroupExtension.h b/src/App/GeoFeatureGroupExtension.h index 31f22eb3d7..bc76371524 100644 --- a/src/App/GeoFeatureGroupExtension.h +++ b/src/App/GeoFeatureGroupExtension.h @@ -41,7 +41,9 @@ class AppExport GeoFeatureGroupExtension : public App::GroupExtension EXTENSION_PROPERTY_HEADER(App::GeoFeatureGroupExtension); public: - PropertyPlacement Placement; + PropertyPlacement& placement(); + + virtual void initExtension(ExtensionContainer* obj); /** * @brief transformPlacement applies transform to placement of this shape. diff --git a/src/App/GroupExtension.cpp b/src/App/GroupExtension.cpp index a070840b5d..54e3ce95a6 100644 --- a/src/App/GroupExtension.cpp +++ b/src/App/GroupExtension.cpp @@ -38,7 +38,7 @@ EXTENSION_PROPERTY_SOURCE(App::GroupExtension, App::DocumentObjectExtension) GroupExtension::GroupExtension() { - initExtension(GroupExtension::getExtensionClassTypeId()); + initExtensionType(GroupExtension::getExtensionClassTypeId()); EXTENSION_ADD_PROPERTY_TYPE(Group,(0),"Base",(App::PropertyType)(Prop_Output),"List of referenced objects"); } diff --git a/src/App/OriginGroupExtension.cpp b/src/App/OriginGroupExtension.cpp index 2f0ac1468c..739d01f838 100644 --- a/src/App/OriginGroupExtension.cpp +++ b/src/App/OriginGroupExtension.cpp @@ -39,7 +39,7 @@ EXTENSION_PROPERTY_SOURCE(App::OriginGroupExtension, App::GeoFeatureGroupExtensi OriginGroupExtension::OriginGroupExtension () { - initExtension(OriginGroupExtension::getExtensionClassTypeId()); + initExtensionType(OriginGroupExtension::getExtensionClassTypeId()); EXTENSION_ADD_PROPERTY_TYPE ( Origin, (0), 0, App::Prop_Hidden, "Origin linked to the group" ); } diff --git a/src/App/Part.cpp b/src/App/Part.cpp index 96303bad40..8030c0212d 100644 --- a/src/App/Part.cpp +++ b/src/App/Part.cpp @@ -35,7 +35,7 @@ using namespace App; -PROPERTY_SOURCE_WITH_EXTENSIONS(App::Part, App::DocumentObject) +PROPERTY_SOURCE_WITH_EXTENSIONS(App::Part, App::GeoFeature) //=========================================================================== diff --git a/src/App/Part.h b/src/App/Part.h index d34388fe48..089c0d6888 100644 --- a/src/App/Part.h +++ b/src/App/Part.h @@ -35,7 +35,7 @@ namespace App /** Base class of all geometric document objects. */ -class AppExport Part : public App::DocumentObject, public App::OriginGroupExtension +class AppExport Part : public App::GeoFeature, public App::OriginGroupExtension { PROPERTY_HEADER_WITH_EXTENSIONS(App::Part); diff --git a/src/Gui/ViewProviderExtension.cpp b/src/Gui/ViewProviderExtension.cpp index 0cbba6602b..49386eb93d 100644 --- a/src/Gui/ViewProviderExtension.cpp +++ b/src/Gui/ViewProviderExtension.cpp @@ -37,7 +37,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderExtension, App::Extension) ViewProviderExtension::ViewProviderExtension() { - initExtension(Gui::ViewProviderExtension::getExtensionClassTypeId()); + initExtensionType(Gui::ViewProviderExtension::getExtensionClassTypeId()); } ViewProviderExtension::~ViewProviderExtension() diff --git a/src/Gui/ViewProviderExtension.h b/src/Gui/ViewProviderExtension.h index ed3e90b9d8..4e4520d100 100644 --- a/src/Gui/ViewProviderExtension.h +++ b/src/Gui/ViewProviderExtension.h @@ -97,7 +97,7 @@ public: ViewProviderExtensionPythonT() { ExtensionT::m_isPythonExtension = true; - ExtensionT::initExtension(ViewProviderExtensionPythonT::getExtensionClassTypeId()); + ExtensionT::initExtensionType(ViewProviderExtensionPythonT::getExtensionClassTypeId()); EXTENSION_ADD_PROPERTY(ExtensionProxy,(Py::Object())); } diff --git a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp index e700b91dd2..41255be876 100644 --- a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp +++ b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp @@ -38,7 +38,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderGeoFeatureGroupExtension, Gui::ViewPr ViewProviderGeoFeatureGroupExtension::ViewProviderGeoFeatureGroupExtension() { - initExtension(ViewProviderGeoFeatureGroupExtension::getExtensionClassTypeId()); + initExtensionType(ViewProviderGeoFeatureGroupExtension::getExtensionClassTypeId()); pcGroupChildren = new SoGroup(); pcGroupChildren->ref(); @@ -84,8 +84,8 @@ std::vector ViewProviderGeoFeatureGroupExtension::extensionGetDispl void ViewProviderGeoFeatureGroupExtension::extensionUpdateData(const App::Property* prop) { auto obj = getExtendedViewProvider()->getObject()->getExtensionByType(); - if (obj && prop == &obj->Placement) { - getExtendedViewProvider()->setTransformation ( obj->Placement.getValue().toMatrix() ); + if (obj && prop == &obj->placement()) { + getExtendedViewProvider()->setTransformation ( obj->placement().getValue().toMatrix() ); } else { ViewProviderGroupExtension::extensionUpdateData ( prop ); } diff --git a/src/Gui/ViewProviderGroupExtension.cpp b/src/Gui/ViewProviderGroupExtension.cpp index 317073a6cb..d1d234a62a 100644 --- a/src/Gui/ViewProviderGroupExtension.cpp +++ b/src/Gui/ViewProviderGroupExtension.cpp @@ -45,7 +45,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderGroupExtension, Gui::ViewProviderExte ViewProviderGroupExtension::ViewProviderGroupExtension() : visible(false) { - initExtension(ViewProviderGroupExtension::getExtensionClassTypeId()); + initExtensionType(ViewProviderGroupExtension::getExtensionClassTypeId()); } ViewProviderGroupExtension::~ViewProviderGroupExtension() diff --git a/src/Gui/ViewProviderOriginGroupExtension.cpp b/src/Gui/ViewProviderOriginGroupExtension.cpp index c87341641a..226af9a9c8 100644 --- a/src/Gui/ViewProviderOriginGroupExtension.cpp +++ b/src/Gui/ViewProviderOriginGroupExtension.cpp @@ -48,7 +48,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderOriginGroupExtension, Gui::ViewProvid ViewProviderOriginGroupExtension::ViewProviderOriginGroupExtension() { - initExtension(ViewProviderOriginGroupExtension::getExtensionClassTypeId()); + initExtensionType(ViewProviderOriginGroupExtension::getExtensionClassTypeId()); } ViewProviderOriginGroupExtension::~ViewProviderOriginGroupExtension() diff --git a/src/Mod/Part/App/AttachExtension.cpp b/src/Mod/Part/App/AttachExtension.cpp index c15cec8e21..ce6e0a773a 100644 --- a/src/Mod/Part/App/AttachExtension.cpp +++ b/src/Mod/Part/App/AttachExtension.cpp @@ -59,7 +59,7 @@ AttachExtension::AttachExtension() EXTENSION_ADD_PROPERTY_TYPE(superPlacement, (Base::Placement()), "Attachment", App::Prop_None, "Extra placement to apply in addition to attachment (in local coordinates)"); setAttacher(new AttachEngine3D);//default attacher - initExtension(AttachExtension::getExtensionClassTypeId()); + initExtensionType(AttachExtension::getExtensionClassTypeId()); } AttachExtension::~AttachExtension()