From 89bbb81521fd069f451716115116aa466199275f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Wed, 21 Sep 2016 06:25:51 +0200 Subject: [PATCH] Extension: Fix order-of-initialisation crash FreeCADs property system utilises some pointer math to calculate the offset between property and base class. Due to virtual inheritance of th ePropertyContainer the memory layout has been changed to rather random, which has lead to crashes dependend on the order of object initialisation. The solution is to not make PropertyContaner virtual but a class below, Base::Persitance. Then the memory layout is random for Persistance, but it is perfectly aligned for the base class chains from PropertyContainer onwards as well as from Extension onwards. Hence the proeprty system was changed to take the offset always from those two. --- src/App/DocumentObjectExtension.cpp | 2 +- src/App/DocumentObjectExtension.h | 2 +- src/App/DocumentObjectGroup.cpp | 2 +- src/App/DynamicProperty.cpp | 33 +++++ src/App/Extension.cpp | 78 +++++++++-- src/App/Extension.h | 127 ++++++++++++++---- src/App/ExtensionContainer.cpp | 78 ++++------- src/App/ExtensionContainer.h | 26 ++-- src/App/ExtensionContainerPyImp.cpp | 2 +- src/App/GeoFeatureGroupExtension.cpp | 6 +- src/App/GeoFeatureGroupExtension.h | 2 +- src/App/GroupExtension.cpp | 6 +- src/App/GroupExtension.h | 2 +- src/App/OriginGroupExtension.cpp | 6 +- src/App/OriginGroupExtension.h | 3 +- src/App/Part.cpp | 2 +- src/App/PropertyContainer.cpp | 28 ++-- src/App/PropertyContainer.h | 32 ++--- src/Base/Persistence.h | 6 +- src/Gui/ViewProviderDocumentObjectGroup.cpp | 2 +- src/Gui/ViewProviderExtension.cpp | 4 +- src/Gui/ViewProviderExtension.h | 6 +- src/Gui/ViewProviderGeoFeatureGroup.cpp | 2 +- .../ViewProviderGeoFeatureGroupExtension.cpp | 4 +- .../ViewProviderGeoFeatureGroupExtension.h | 2 +- src/Gui/ViewProviderGroupExtension.cpp | 4 +- src/Gui/ViewProviderGroupExtension.h | 2 +- src/Gui/ViewProviderOriginGroup.cpp | 2 +- src/Gui/ViewProviderOriginGroupExtension.cpp | 4 +- src/Gui/ViewProviderOriginGroupExtension.h | 2 +- src/Gui/ViewProviderPart.cpp | 2 +- 31 files changed, 310 insertions(+), 169 deletions(-) diff --git a/src/App/DocumentObjectExtension.cpp b/src/App/DocumentObjectExtension.cpp index 9c6bd5bff4..9976fde101 100644 --- a/src/App/DocumentObjectExtension.cpp +++ b/src/App/DocumentObjectExtension.cpp @@ -33,7 +33,7 @@ using namespace App; -PROPERTY_SOURCE(App::DocumentObjectExtension, App::Extension) +EXTENSION_PROPERTY_SOURCE(App::DocumentObjectExtension, App::Extension) DocumentObjectExtension::DocumentObjectExtension() { diff --git a/src/App/DocumentObjectExtension.h b/src/App/DocumentObjectExtension.h index eac9af9068..7cba330a09 100644 --- a/src/App/DocumentObjectExtension.h +++ b/src/App/DocumentObjectExtension.h @@ -38,7 +38,7 @@ class AppExport DocumentObjectExtension : public App::Extension //The cass does not have properties itself, but it is important to provide the property access //functions. see cpp file for details - PROPERTY_HEADER(App::DocumentObjectExtension ); + EXTENSION_PROPERTY_HEADER(App::DocumentObjectExtension ); public: diff --git a/src/App/DocumentObjectGroup.cpp b/src/App/DocumentObjectGroup.cpp index 8181340188..3f52cb986b 100644 --- a/src/App/DocumentObjectGroup.cpp +++ b/src/App/DocumentObjectGroup.cpp @@ -33,7 +33,7 @@ using namespace App; -PROPERTY_SOURCE_WITH_EXTENSIONS(App::DocumentObjectGroup, App::DocumentObject, (App::GroupExtension)) +PROPERTY_SOURCE_WITH_EXTENSIONS(App::DocumentObjectGroup, App::DocumentObject) DocumentObjectGroup::DocumentObjectGroup(void): DocumentObject(), GroupExtension() { diff --git a/src/App/DynamicProperty.cpp b/src/App/DynamicProperty.cpp index 8d691bdc5f..a58b411d46 100644 --- a/src/App/DynamicProperty.cpp +++ b/src/App/DynamicProperty.cpp @@ -30,6 +30,7 @@ #include "Property.h" #include "PropertyContainer.h" #include "Application.h" +#include "ExtensionContainer.h" #include #include #include @@ -69,6 +70,10 @@ Property *DynamicProperty::getPropertyByName(const char* name) const std::map::const_iterator it = props.find(name); if (it != props.end()) return it->second.property; + + if(this->pc->isDerivedFrom(App::ExtensionContainer::getClassTypeId())) + return static_cast(this->pc)->ExtensionContainer::getPropertyByName(name); + return this->pc->PropertyContainer::getPropertyByName(name); } @@ -113,6 +118,10 @@ const char* DynamicProperty::getPropertyName(const Property* prop) const if (it->second.property == prop) return it->first.c_str(); } + + if(this->pc->isDerivedFrom(App::ExtensionContainer::getClassTypeId())) + return static_cast(this->pc)->ExtensionContainer::getPropertyName(prop); + return this->pc->PropertyContainer::getPropertyName(prop); } @@ -139,6 +148,10 @@ short DynamicProperty::getPropertyType(const Property* prop) const return attr; } } + + if(this->pc->isDerivedFrom(App::ExtensionContainer::getClassTypeId())) + return static_cast(this->pc)->ExtensionContainer::getPropertyType(prop); + return this->pc->PropertyContainer::getPropertyType(prop); } @@ -153,6 +166,10 @@ short DynamicProperty::getPropertyType(const char *name) const attr |= Prop_ReadOnly; return attr; } + + if(this->pc->isDerivedFrom(App::ExtensionContainer::getClassTypeId())) + return static_cast(this->pc)->ExtensionContainer::getPropertyType(name); + return this->pc->PropertyContainer::getPropertyType(name); } @@ -162,6 +179,10 @@ const char* DynamicProperty::getPropertyGroup(const Property* prop) const if (it->second.property == prop) return it->second.group.c_str(); } + + if(this->pc->isDerivedFrom(App::ExtensionContainer::getClassTypeId())) + return static_cast(this->pc)->ExtensionContainer::getPropertyGroup(prop); + return this->pc->PropertyContainer::getPropertyGroup(prop); } @@ -170,6 +191,10 @@ const char* DynamicProperty::getPropertyGroup(const char *name) const std::map::const_iterator it = props.find(name); if (it != props.end()) return it->second.group.c_str(); + + if(this->pc->isDerivedFrom(App::ExtensionContainer::getClassTypeId())) + return static_cast(this->pc)->ExtensionContainer::getPropertyGroup(name); + return this->pc->PropertyContainer::getPropertyGroup(name); } @@ -179,6 +204,10 @@ const char* DynamicProperty::getPropertyDocumentation(const Property* prop) cons if (it->second.property == prop) return it->second.doc.c_str(); } + + if(this->pc->isDerivedFrom(App::ExtensionContainer::getClassTypeId())) + return static_cast(this->pc)->ExtensionContainer::getPropertyDocumentation(prop); + return this->pc->PropertyContainer::getPropertyDocumentation(prop); } @@ -187,6 +216,10 @@ const char* DynamicProperty::getPropertyDocumentation(const char *name) const std::map::const_iterator it = props.find(name); if (it != props.end()) return it->second.doc.c_str(); + + if(this->pc->isDerivedFrom(App::ExtensionContainer::getClassTypeId())) + return static_cast(this->pc)->ExtensionContainer::getPropertyDocumentation(name); + return this->pc->PropertyContainer::getPropertyDocumentation(name); } diff --git a/src/App/Extension.cpp b/src/App/Extension.cpp index e63bfd59cd..d99f0b49ab 100644 --- a/src/App/Extension.cpp +++ b/src/App/Extension.cpp @@ -34,19 +34,15 @@ #include #include -/* We do not use a standart property macro for type initiation. The reason is that we want to expose all property functions, - * to allow the derived classes to access the private property data, but we do not want to have our - * property data a reference to the parent data. That is because the extension is used in a multi - * inheritance way, and hence our propertydata partent data would point to the same property data - * as any other parent of the inherited class. It makes more sense to create a total unrelated line - * of property datas which are added as additional parent to the extended class. +/* We do not use a standart property macro for type initiation. The reason is that we have the first + * PropertyData in the extension chain, there is no parent property data. */ TYPESYSTEM_SOURCE_P(App::Extension); -const App::PropertyData * App::Extension::getPropertyDataPtr(void){return &propertyData;} -const App::PropertyData & App::Extension::getPropertyData(void) const{return propertyData;} +const App::PropertyData * App::Extension::extensionGetPropertyDataPtr(void){return &propertyData;} +const App::PropertyData & App::Extension::extensionGetPropertyData(void) const{return propertyData;} App::PropertyData App::Extension::propertyData; void App::Extension::init(void){ - initSubclass(App::Extension::classTypeId, "App::Extension" , "App::PropertyContainer", &(App::Extension::create) ); + initSubclass(App::Extension::classTypeId, "App::Extension" , "Base::Persistence", &(App::Extension::create) ); } using namespace App; @@ -57,7 +53,6 @@ Extension::Extension() Extension::~Extension() { - Base::Console().Message("Delete extension\n"); if (!ExtensionPythonObject.is(Py::_None())){ // Remark: The API of Py::Object has been changed to set whether the wrapper owns the passed // Python object or not. In the constructor we forced the wrapper to own the object so we need @@ -82,6 +77,13 @@ void Extension::initExtension(ExtensionContainer* obj) { if(m_extensionType.isBad()) throw Base::Exception("Extension: Extension type not set"); + //all properties are initialised without PropertyContainer father. Now that we know it we can + //finaly finsih the property initialisation + std::vector list; + extensionGetPropertyData().getPropertyList(this, list); + for(Property* prop : list) + prop->setContainer(obj); + m_base = obj; m_base->registerExtension( m_extensionType, this ); } @@ -106,8 +108,62 @@ const char* Extension::name() { return std::string().c_str(); } + + +Property* Extension::extensionGetPropertyByName(const char* name) const { + + return extensionGetPropertyData().getPropertyByName(this, name); +} + +short int Extension::extensionGetPropertyType(const Property* prop) const { + + return extensionGetPropertyData().getType(this, prop); +} + +short int Extension::extensionGetPropertyType(const char* name) const { + + return extensionGetPropertyData().getType(this, name); +} + +const char* Extension::extensionGetPropertyName(const Property* prop) const { + + return extensionGetPropertyData().getName(this,prop); +} + +const char* Extension::extensionGetPropertyGroup(const Property* prop) const { + + return extensionGetPropertyData().getGroup(this,prop); +} + +const char* Extension::extensionGetPropertyGroup(const char* name) const { + + return extensionGetPropertyData().getGroup(this,name); +} + + +const char* Extension::extensionGetPropertyDocumentation(const Property* prop) const { + + return extensionGetPropertyData().getDocumentation(this, prop); +} + +const char* Extension::extensionGetPropertyDocumentation(const char* name) const { + + return extensionGetPropertyData().getDocumentation(this, name); +} + +void Extension::extensionGetPropertyList(std::vector< Property* >& List) const { + + extensionGetPropertyData().getPropertyList(this, List); +} + +void Extension::extensionGetPropertyMap(std::map< std::string, Property* >& Map) const { + + extensionGetPropertyData().getPropertyMap(this, Map); +} + + namespace App { -PROPERTY_SOURCE_TEMPLATE(App::ExtensionPython, App::ExtensionPython::Inherited) +EXTENSION_PROPERTY_SOURCE_TEMPLATE(App::ExtensionPython, App::ExtensionPython::Inherited) // explicit template instantiation template class AppExport ExtensionPythonT; diff --git a/src/App/Extension.h b/src/App/Extension.h index 2029ca2f4a..d4cdfc8433 100644 --- a/src/App/Extension.h +++ b/src/App/Extension.h @@ -33,6 +33,35 @@ namespace App { class ExtensionContainer; +// init property stuff +#define EXTENSION_PROPERTY_HEADER(_class_) \ + TYPESYSTEM_HEADER(); \ +protected: \ + static const App::PropertyData * extensionGetPropertyDataPtr(void); \ + virtual const App::PropertyData &extensionGetPropertyData(void) const; \ +private: \ + static App::PropertyData propertyData + +#define EXTENSION_PROPERTY_SOURCE(_class_, _parentclass_) \ +TYPESYSTEM_SOURCE_P(_class_);\ +const App::PropertyData * _class_::extensionGetPropertyDataPtr(void){return &propertyData;} \ +const App::PropertyData & _class_::extensionGetPropertyData(void) const{return propertyData;} \ +App::PropertyData _class_::propertyData; \ +void _class_::init(void){\ + initSubclass(_class_::classTypeId, #_class_ , #_parentclass_, &(_class_::create) ); \ + _class_::propertyData.addParentPropertyData(_parentclass_::extensionGetPropertyDataPtr());\ +} + +#define EXTENSION_PROPERTY_SOURCE_TEMPLATE(_class_, _parentclass_) \ +TYPESYSTEM_SOURCE_TEMPLATE(_class_);\ +template<> App::PropertyData _class_::propertyData = App::PropertyData(); \ +template<> const App::PropertyData * _class_::extensionGetPropertyDataPtr(void){return &propertyData;} \ +template<> const App::PropertyData & _class_::extensionGetPropertyData(void) const{return propertyData;} \ +template<> void _class_::init(void){\ + initSubclass(_class_::classTypeId, #_class_ , #_parentclass_, &(_class_::create) ); \ + _class_::propertyData.addParentPropertyData(_parentclass_::extensionGetPropertyDataPtr());\ +} + /** * @brief Base class for all extension that can be added to a DocumentObject * @@ -41,15 +70,22 @@ class ExtensionContainer; * * Extensions are like every other FreeCAD object and based on properties. All information storage * and persistance should be achieved by use of those. Additional any number of methods can be - * added to provide funtionality around the proerties. The only difference to normal objects is that - * extensions must derive from the Extension class and that the tye needs to be initialised. This - * works as simple as + * added to provide funtionality around the properties. There are 3 samll difference to normal objects: + * 1. They must be derived from Extension class + * 2. Properties must be handled with special extension macros + * 3. Extensions must be initialised + * This works as simple as * @code * class MyExtension : public Extension { + * EXTENSION_PROPERTY_HEADER(MyExtension); + * PropertyInt MyProp; * virtual bool overridableMethod(DocumentObject* obj) {}; * }; * + * EXTENSION_PROPERTY_SOURCE(App::MyExtension, App::Extension) * MyExtension::MyExtension() { + * + * EXTENSION_ADD_PROPERTY(MyProp, (0)) * * initExtension(MyExtension::getClassTypeId()); * } * typedef ExtensionPythonT MyExtensionPython; @@ -125,40 +161,79 @@ class ExtensionContainer; * exension creators responsibility to ensure full implementation. * */ -class AppExport Extension : public virtual App::PropertyContainer +class AppExport Extension : public virtual Base::Persistence { - //The cass does not have properties itself, but it is important to provide the property access - //functions. see cpp file for details - PROPERTY_HEADER(App::Extension); + //The cass does not have properties itself, but it is important to provide the property access + //functions. see cpp file for details + EXTENSION_PROPERTY_HEADER(App::Extension); public: - Extension(); - virtual ~Extension(); + Extension(); + virtual ~Extension(); - void initExtension(App::ExtensionContainer* obj); + void initExtension(App::ExtensionContainer* obj); - App::ExtensionContainer* getExtendedContainer() {return m_base;}; - const App::ExtensionContainer* getExtendedContainer() const {return m_base;}; + App::ExtensionContainer* getExtendedContainer() {return m_base;}; + const App::ExtensionContainer* getExtendedContainer() const {return m_base;}; - //get extension name without namespace - const char* name(); - - bool isPythonExtension() {return m_isPythonExtension;}; + //get extension name without namespace + const char* name(); + + bool isPythonExtension() {return m_isPythonExtension;}; - virtual PyObject* getExtensionPyObject(void); + virtual PyObject* getExtensionPyObject(void); + + + /** @name Access properties */ + //@{ + /// find a property by its name + virtual Property *extensionGetPropertyByName(const char* name) const; + /// get the name of a property + virtual const char* extensionGetPropertyName(const Property* prop) const; + /// get all properties of the class (including properties of the parent) + virtual void extensionGetPropertyMap(std::map &Map) const; + /// get all properties of the class (including properties of the parent) + virtual void extensionGetPropertyList(std::vector &List) const; + + /// get the Type of a Property + virtual short extensionGetPropertyType(const Property* prop) const; + /// get the Type of a named Property + virtual short extensionGetPropertyType(const char *name) const; + /// get the Group of a Property + virtual const char* extensionGetPropertyGroup(const Property* prop) const; + /// get the Group of a named Property + virtual const char* extensionGetPropertyGroup(const char *name) const; + /// get the Group of a Property + virtual const char* extensionGetPropertyDocumentation(const Property* prop) const; + /// get the Group of a named Property + virtual const char* extensionGetPropertyDocumentation(const char *name) const; + //@} protected: - void initExtension(Base::Type type); - bool m_isPythonExtension = false; - Py::Object ExtensionPythonObject; + void initExtension(Base::Type type); + bool m_isPythonExtension = false; + Py::Object ExtensionPythonObject; private: - Base::Type m_extensionType; - App::ExtensionContainer* m_base = nullptr; + Base::Type m_extensionType; + App::ExtensionContainer* m_base = nullptr; }; +// Property define +#define EXTENSION_ADD_PROPERTY(_prop_, _defaultval_) \ + do { \ + this->_prop_.setValue _defaultval_;\ + propertyData.addProperty(static_cast(this), #_prop_, &this->_prop_); \ + } while (0) + +#define EXTENSION_ADD_PROPERTY_TYPE(_prop_, _defaultval_, _group_,_type_,_Docu_) \ + do { \ + this->_prop_.setValue _defaultval_;\ + propertyData.addProperty(static_cast(this), #_prop_, &this->_prop_, (_group_),(_type_),(_Docu_)); \ + } while (0) + /** * Generic Python extension class which allows to behave every extension @@ -167,7 +242,7 @@ private: template class ExtensionPythonT : public ExtensionT { - PROPERTY_HEADER(App::ExtensionPythonT); + EXTENSION_PROPERTY_HEADER(App::ExtensionPythonT); public: typedef ExtensionT Inherited; @@ -175,7 +250,7 @@ public: ExtensionPythonT() { ExtensionT::m_isPythonExtension = true; - ADD_PROPERTY(ExtensionProxy,(Py::Object())); + EXTENSION_ADD_PROPERTY(ExtensionProxy,(Py::Object())); } virtual ~ExtensionPythonT() { } @@ -185,12 +260,12 @@ public: typedef ExtensionPythonT ExtensionPython; -//helper macros to define python extensions +// Helper macros to define python extensions #define EXTENSION_PROXY_FIRST(function) \ Base::PyGILStateLocker lock;\ Py::Object result;\ try {\ - Property* proxy = this->getPropertyByName("ExtensionProxy");\ + Property* proxy = this->extensionGetPropertyByName("ExtensionProxy");\ if (proxy && proxy->getTypeId() == PropertyPythonObject::getClassTypeId()) {\ Py::Object feature = static_cast(proxy)->getValue();\ if (feature.hasAttr(std::string("function"))) {\ diff --git a/src/App/ExtensionContainer.cpp b/src/App/ExtensionContainer.cpp index b3329f1181..6fd4e9487e 100644 --- a/src/App/ExtensionContainer.cpp +++ b/src/App/ExtensionContainer.cpp @@ -133,18 +133,14 @@ std::vector< Extension* > ExtensionContainer::getExtensionsDerivedFrom(Base::Typ void ExtensionContainer::getPropertyList(std::vector< Property* >& List) const { App::PropertyContainer::getPropertyList(List); - for(auto entry : _extensions) { - if(entry.second->isPythonExtension()) - entry.second->getPropertyList(List); - } + for(auto entry : _extensions) + entry.second->extensionGetPropertyList(List); } void ExtensionContainer::getPropertyMap(std::map< std::string, Property* >& Map) const { App::PropertyContainer::getPropertyMap(Map); - for(auto entry : _extensions) { - if(entry.second->isPythonExtension()) - entry.second->getPropertyMap(Map); - } + for(auto entry : _extensions) + entry.second->extensionGetPropertyMap(Map); } Property* ExtensionContainer::getPropertyByName(const char* name) const { @@ -153,11 +149,9 @@ Property* ExtensionContainer::getPropertyByName(const char* name) const { return prop; for(auto entry : _extensions) { - if(entry.second->isPythonExtension()){ - auto prop = entry.second->getPropertyByName(name); - if(prop) - return prop; - } + auto prop = entry.second->extensionGetPropertyByName(name); + if(prop) + return prop; } return nullptr; @@ -170,11 +164,9 @@ short int ExtensionContainer::getPropertyType(const Property* prop) const { return res; for(auto entry : _extensions) { - if(entry.second->isPythonExtension()) { - res = entry.second->getPropertyType(prop); - if(res != 0) - return res; - } + res = entry.second->extensionGetPropertyType(prop); + if(res != 0) + return res; } return 0; @@ -187,11 +179,9 @@ short int ExtensionContainer::getPropertyType(const char* name) const { return res; for(auto entry : _extensions) { - if(entry.second->isPythonExtension()) { - res = entry.second->getPropertyType(name); - if(res != 0) - return res; - } + res = entry.second->extensionGetPropertyType(name); + if(res != 0) + return res; } return 0; @@ -205,11 +195,9 @@ const char* ExtensionContainer::getPropertyName(const Property* prop) const { return res; for(auto entry : _extensions) { - if(entry.second->isPythonExtension()) { - res = entry.second->getPropertyName(prop); - if(res != 0) - return res; - } + res = entry.second->extensionGetPropertyName(prop); + if(res != 0) + return res; } return 0; @@ -222,11 +210,9 @@ const char* ExtensionContainer::getPropertyGroup(const Property* prop) const { return res; for(auto entry : _extensions) { - if(entry.second->isPythonExtension()) { - res = entry.second->getPropertyGroup(prop); - if(res != 0) - return res; - } + res = entry.second->extensionGetPropertyGroup(prop); + if(res != 0) + return res; } return 0; @@ -239,11 +225,9 @@ const char* ExtensionContainer::getPropertyGroup(const char* name) const { return res; for(auto entry : _extensions) { - if(entry.second->isPythonExtension()) { - res = entry.second->getPropertyGroup(name); - if(res != 0) - return res; - } + res = entry.second->extensionGetPropertyGroup(name); + if(res != 0) + return res; } return 0; @@ -257,11 +241,9 @@ const char* ExtensionContainer::getPropertyDocumentation(const Property* prop) c return res; for(auto entry : _extensions) { - if(entry.second->isPythonExtension()) { - res = entry.second->getPropertyDocumentation(prop); - if(res != 0) - return res; - } + res = entry.second->extensionGetPropertyDocumentation(prop); + if(res != 0) + return res; } return 0; @@ -274,11 +256,9 @@ const char* ExtensionContainer::getPropertyDocumentation(const char* name) const return res; for(auto entry : _extensions) { - if(entry.second->isPythonExtension()) { - res = entry.second->getPropertyDocumentation(name); - if(res != 0) - return res; - } + res = entry.second->extensionGetPropertyDocumentation(name); + if(res != 0) + return res; } return 0; @@ -294,7 +274,7 @@ void ExtensionContainer::onChanged(const Property* prop) { //if a extension gets registered from python. This is only for synchronisation. if(strcmp(prop->getName(), "Proxy")) { for(auto entry : _extensions) - entry.second->getExtensionPyObject().setValue(static_cast(prop)->getValue()); + entry.second->extensionGetExtensionPyObject().setValue(static_cast(prop)->getValue()); }*/ App::PropertyContainer::onChanged(prop); diff --git a/src/App/ExtensionContainer.h b/src/App/ExtensionContainer.h index 1eeb09d003..0cbbae40df 100644 --- a/src/App/ExtensionContainer.h +++ b/src/App/ExtensionContainer.h @@ -30,8 +30,6 @@ #include "DynamicProperty.h" #include -#include - namespace App { /** @@ -73,14 +71,18 @@ namespace App { * access the universal extension API. As DocumentObject itself derives from ExtensionContainer this * should be the case automatically in most circumstances. * - * Note that a small boilerplate change is needed next to the multiple inheritance when adding - * extensions from c++. It must be ensured that the type registration is aware of the extensions. + * Note that two small boilerplate changes are needed next to the multiple inheritance when adding + * extensions from c++. + * 1. It must be ensured that the property and type registration is aware of the extensions by using + * special macros. + * 2. The extensions need to be initialised in the constructor + * * Here a working example: * @code * class AppExport Part : public App::DocumentObject, public App::FirstExtension, public App::SecondExtension { * PROPERTY_HEADER_WITH_EXTENSIONS(App::Part); * }; - * PROPERTY_SOURCE_WITH_EXTENSIONS(App::Part, App::DocumentObject, (App::FirstExtension)(App::SecondExtension)) + * PROPERTY_SOURCE_WITH_EXTENSIONS(App::Part, App::DocumentObject) * Part::Part(void) { * FirstExtension::initExtension(this); * SecondExtension::initExtension(this); @@ -107,7 +109,7 @@ namespace App { * * For information on howto create extension see the documentation of Extension */ -class AppExport ExtensionContainer : public virtual App::PropertyContainer +class AppExport ExtensionContainer : public App::PropertyContainer { TYPESYSTEM_HEADER(); @@ -179,24 +181,18 @@ private: std::map _extensions; }; - #define PROPERTY_HEADER_WITH_EXTENSIONS(_class_) \ PROPERTY_HEADER(_class) -//helper macro to add parent to property data -#define ADD_PARENT(r, data, elem)\ - data::propertyData.parentPropertyData.push_back(elem::getPropertyDataPtr()); - -/// -#define PROPERTY_SOURCE_WITH_EXTENSIONS(_class_, _parentclass_, _extensions_) \ +/// We make sur that the PropertyData of the container is not connected to the one of the extension +#define PROPERTY_SOURCE_WITH_EXTENSIONS(_class_, _parentclass_) \ TYPESYSTEM_SOURCE_P(_class_);\ const App::PropertyData * _class_::getPropertyDataPtr(void){return &propertyData;} \ const App::PropertyData & _class_::getPropertyData(void) const{return propertyData;} \ App::PropertyData _class_::propertyData; \ void _class_::init(void){\ initSubclass(_class_::classTypeId, #_class_ , #_parentclass_, &(_class_::create) ); \ - ADD_PARENT(0, _class_, _parentclass_)\ - BOOST_PP_SEQ_FOR_EACH(ADD_PARENT, _class_, _extensions_)\ + _class_::propertyData.addParentPropertyData(_parentclass_::getPropertyDataPtr());\ } } //App diff --git a/src/App/ExtensionContainerPyImp.cpp b/src/App/ExtensionContainerPyImp.cpp index d218ae9af4..afe3e386cf 100644 --- a/src/App/ExtensionContainerPyImp.cpp +++ b/src/App/ExtensionContainerPyImp.cpp @@ -152,7 +152,7 @@ PyObject* ExtensionContainerPy::addExtension(PyObject *args) { ext->initExtension(getExtensionContainerPtr()); //set the proxy to allow python overrides - App::Property* pp = ext->getPropertyByName("ExtensionProxy"); + App::Property* pp = ext->extensionGetPropertyByName("ExtensionProxy"); if(!pp) { std::stringstream str; str << "Accessing the proxy property failed!" << std::ends; diff --git a/src/App/GeoFeatureGroupExtension.cpp b/src/App/GeoFeatureGroupExtension.cpp index 180368f941..243aed3f77 100644 --- a/src/App/GeoFeatureGroupExtension.cpp +++ b/src/App/GeoFeatureGroupExtension.cpp @@ -36,7 +36,7 @@ using namespace App; -PROPERTY_SOURCE(App::GeoFeatureGroupExtension, App::GroupExtension) +EXTENSION_PROPERTY_SOURCE(App::GeoFeatureGroupExtension, App::GroupExtension) //=========================================================================== @@ -47,7 +47,7 @@ GeoFeatureGroupExtension::GeoFeatureGroupExtension(void) { initExtension(GeoFeatureGroupExtension::getClassTypeId()); - ADD_PROPERTY(Placement,(Base::Placement())); + EXTENSION_ADD_PROPERTY(Placement,(Base::Placement())); } GeoFeatureGroupExtension::~GeoFeatureGroupExtension(void) @@ -148,7 +148,7 @@ DocumentObject* GeoFeatureGroupExtension::getGroupOfObject(const DocumentObject* // Python feature --------------------------------------------------------- namespace App { -PROPERTY_SOURCE_TEMPLATE(App::GeoFeatureGroupExtensionPython, App::GeoFeatureGroupExtension) +EXTENSION_PROPERTY_SOURCE_TEMPLATE(App::GeoFeatureGroupExtensionPython, App::GeoFeatureGroupExtension) // explicit template instantiation template class AppExport ExtensionPythonT>; diff --git a/src/App/GeoFeatureGroupExtension.h b/src/App/GeoFeatureGroupExtension.h index 6f3bbeab8a..f26382c621 100644 --- a/src/App/GeoFeatureGroupExtension.h +++ b/src/App/GeoFeatureGroupExtension.h @@ -38,7 +38,7 @@ namespace App */ class AppExport GeoFeatureGroupExtension : public App::GroupExtension { - PROPERTY_HEADER(App::GeoFeatureGroupExtension); + EXTENSION_PROPERTY_HEADER(App::GeoFeatureGroupExtension); public: PropertyPlacement Placement; diff --git a/src/App/GroupExtension.cpp b/src/App/GroupExtension.cpp index 7162a6d411..391fd7efb3 100644 --- a/src/App/GroupExtension.cpp +++ b/src/App/GroupExtension.cpp @@ -34,13 +34,13 @@ using namespace App; -PROPERTY_SOURCE(App::GroupExtension, App::DocumentObjectExtension) +EXTENSION_PROPERTY_SOURCE(App::GroupExtension, App::DocumentObjectExtension) GroupExtension::GroupExtension() { initExtension(GroupExtension::getClassTypeId()); - ADD_PROPERTY_TYPE(Group,(0),"Base",(App::PropertyType)(Prop_Output),"List of referenced objects"); + EXTENSION_ADD_PROPERTY_TYPE(Group,(0),"Base",(App::PropertyType)(Prop_Output),"List of referenced objects"); } GroupExtension::~GroupExtension() @@ -202,7 +202,7 @@ PyObject* GroupExtension::getExtensionPyObject(void) { namespace App { -PROPERTY_SOURCE_TEMPLATE(App::GroupExtensionPython, App::GroupExtension) +EXTENSION_PROPERTY_SOURCE_TEMPLATE(App::GroupExtensionPython, App::GroupExtension) // explicit template instantiation template class AppExport ExtensionPythonT>; diff --git a/src/App/GroupExtension.h b/src/App/GroupExtension.h index 84b0b9c886..589f72854a 100644 --- a/src/App/GroupExtension.h +++ b/src/App/GroupExtension.h @@ -37,7 +37,7 @@ class GroupExtensionPy; class AppExport GroupExtension : public DocumentObjectExtension { - PROPERTY_HEADER(App::GroupExtension); + EXTENSION_PROPERTY_HEADER(App::GroupExtension); public: /// Constructor diff --git a/src/App/OriginGroupExtension.cpp b/src/App/OriginGroupExtension.cpp index afe14a5192..302ea76b15 100644 --- a/src/App/OriginGroupExtension.cpp +++ b/src/App/OriginGroupExtension.cpp @@ -35,13 +35,13 @@ using namespace App; -PROPERTY_SOURCE(App::OriginGroupExtension, App::GeoFeatureGroupExtension); +EXTENSION_PROPERTY_SOURCE(App::OriginGroupExtension, App::GeoFeatureGroupExtension); OriginGroupExtension::OriginGroupExtension () { initExtension(OriginGroupExtension::getClassTypeId()); - ADD_PROPERTY_TYPE ( Origin, (0), 0, App::Prop_Hidden, "Origin linked to the group" ); + EXTENSION_ADD_PROPERTY_TYPE ( Origin, (0), 0, App::Prop_Hidden, "Origin linked to the group" ); } OriginGroupExtension::~OriginGroupExtension () @@ -131,7 +131,7 @@ void OriginGroupExtension::onExtendedUnsetupObject () { // Python feature --------------------------------------------------------- namespace App { -PROPERTY_SOURCE_TEMPLATE(App::OriginGroupExtensionPython, App::OriginGroupExtension) +EXTENSION_PROPERTY_SOURCE_TEMPLATE(App::OriginGroupExtensionPython, App::OriginGroupExtension) // explicit template instantiation template class AppExport ExtensionPythonT>; diff --git a/src/App/OriginGroupExtension.h b/src/App/OriginGroupExtension.h index e254648f13..fe5cb89f36 100644 --- a/src/App/OriginGroupExtension.h +++ b/src/App/OriginGroupExtension.h @@ -34,7 +34,8 @@ class Origin; */ class AppExport OriginGroupExtension : public App::GeoFeatureGroupExtension { - PROPERTY_HEADER(App::OriginGroupExtension); + EXTENSION_PROPERTY_HEADER(App::OriginGroupExtension); + public: OriginGroupExtension (); virtual ~OriginGroupExtension (); diff --git a/src/App/Part.cpp b/src/App/Part.cpp index 656e49e116..96303bad40 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, (App::OriginGroupExtension)) +PROPERTY_SOURCE_WITH_EXTENSIONS(App::Part, App::DocumentObject) //=========================================================================== diff --git a/src/App/PropertyContainer.cpp b/src/App/PropertyContainer.cpp index 3d4353a864..0581e32036 100644 --- a/src/App/PropertyContainer.cpp +++ b/src/App/PropertyContainer.cpp @@ -259,7 +259,7 @@ void PropertyContainer::Restore(Base::XMLReader &reader) reader.readEndElement("Properties"); } -void PropertyData::addProperty(const PropertyContainer *container,const char* PropName, Property *Prop, const char* PropertyGroup , PropertyType Type, const char* PropertyDocu) +void PropertyData::addProperty(const void* container,const char* PropName, Property *Prop, const char* PropertyGroup , PropertyType Type, const char* PropertyDocu) { bool IsIn = false; for (vector::const_iterator It = propertyData.begin(); It != propertyData.end(); ++It) @@ -285,7 +285,7 @@ void PropertyData::addParentPropertyData(const PropertyData* data) { } -const PropertyData::PropertySpec *PropertyData::findProperty(const PropertyContainer *container,const char* PropName) const +const PropertyData::PropertySpec *PropertyData::findProperty(const void* container,const char* PropName) const { for (vector::const_iterator It = propertyData.begin(); It != propertyData.end(); ++It) if(strcmp(It->Name,PropName)==0) @@ -300,13 +300,13 @@ const PropertyData::PropertySpec *PropertyData::findProperty(const PropertyConta return 0; } -const PropertyData::PropertySpec *PropertyData::findProperty(const PropertyContainer *container,const Property* prop) const +const PropertyData::PropertySpec *PropertyData::findProperty(const void* container,const Property* prop) const { const int diff = (int) ((char*)prop - (char*)container); for (vector::const_iterator It = propertyData.begin(); It != propertyData.end(); ++It) if(diff == It->Offset) - return &(*It); + return &(*It); for(auto data : parentPropertyData) { auto res = data->findProperty(container,prop); @@ -317,7 +317,7 @@ const PropertyData::PropertySpec *PropertyData::findProperty(const PropertyConta return 0; } -const char* PropertyData::getName(const PropertyContainer *container,const Property* prop) const +const char* PropertyData::getName(const void* container,const Property* prop) const { const PropertyData::PropertySpec* Spec = findProperty(container,prop); @@ -338,7 +338,7 @@ const char* PropertyData::getName(const PropertyContainer *container,const Prope */ } -short PropertyData::getType(const PropertyContainer *container,const Property* prop) const +short PropertyData::getType(const void* container,const Property* prop) const { const PropertyData::PropertySpec* Spec = findProperty(container,prop); @@ -361,7 +361,7 @@ short PropertyData::getType(const PropertyContainer *container,const Property* p */ } -short PropertyData::getType(const PropertyContainer *container,const char* name) const +short PropertyData::getType(const void* container,const char* name) const { const PropertyData::PropertySpec* Spec = findProperty(container,name); @@ -371,7 +371,7 @@ short PropertyData::getType(const PropertyContainer *container,const char* name) return 0; } -const char* PropertyData::getGroup(const PropertyContainer *container,const Property* prop) const +const char* PropertyData::getGroup(const void* container,const Property* prop) const { const PropertyData::PropertySpec* Spec = findProperty(container,prop); @@ -394,7 +394,7 @@ const char* PropertyData::getGroup(const PropertyContainer *container,const Prop */ } -const char* PropertyData::getGroup(const PropertyContainer *container,const char* name) const +const char* PropertyData::getGroup(const void* container,const char* name) const { const PropertyData::PropertySpec* Spec = findProperty(container,name); @@ -404,7 +404,7 @@ const char* PropertyData::getGroup(const PropertyContainer *container,const char return 0; } -const char* PropertyData::getDocumentation(const PropertyContainer *container,const Property* prop) const +const char* PropertyData::getDocumentation(const void* container,const Property* prop) const { const PropertyData::PropertySpec* Spec = findProperty(container,prop); @@ -414,7 +414,7 @@ const char* PropertyData::getDocumentation(const PropertyContainer *container,co return 0; } -const char* PropertyData::getDocumentation(const PropertyContainer *container,const char* name) const +const char* PropertyData::getDocumentation(const void* container,const char* name) const { const PropertyData::PropertySpec* Spec = findProperty(container,name); @@ -426,7 +426,7 @@ const char* PropertyData::getDocumentation(const PropertyContainer *container,co -Property *PropertyData::getPropertyByName(const PropertyContainer *container,const char* name) const +Property *PropertyData::getPropertyByName(const void* container,const char* name) const { const PropertyData::PropertySpec* Spec = findProperty(container,name); @@ -449,7 +449,7 @@ Property *PropertyData::getPropertyByName(const PropertyContainer *container,con }*/ } -void PropertyData::getPropertyMap(const PropertyContainer *container,std::map &Map) const +void PropertyData::getPropertyMap(const void* container,std::map &Map) const { for (vector::const_iterator It = propertyData.begin(); It != propertyData.end(); ++It) Map[It->Name] = (Property *) (It->Offset + (char *)container); @@ -467,7 +467,7 @@ void PropertyData::getPropertyMap(const PropertyContainer *container,std::map &List) const +void PropertyData::getPropertyList(const void* container,std::vector &List) const { for (vector::const_iterator It = propertyData.begin(); It != propertyData.end(); ++It) List.push_back((Property *) (It->Offset + (char *)container) ); diff --git a/src/App/PropertyContainer.h b/src/App/PropertyContainer.h index 512680ec92..c38d54726e 100644 --- a/src/App/PropertyContainer.h +++ b/src/App/PropertyContainer.h @@ -60,29 +60,29 @@ struct AppExport PropertyData std::vector propertyData; std::vector parentPropertyData; - void addProperty(const PropertyContainer *container,const char* PropName, Property *Prop, const char* PropertyGroup= 0, PropertyType = Prop_None, const char* PropertyDocu= 0 ); + void addProperty(const void* container,const char* PropName, Property *Prop, const char* PropertyGroup= 0, PropertyType = Prop_None, const char* PropertyDocu= 0 ); void addParentPropertyData(const PropertyData* data); - const PropertySpec *findProperty(const PropertyContainer *container,const char* PropName) const; - const PropertySpec *findProperty(const PropertyContainer *container,const Property* prop) const; + const PropertySpec *findProperty(const void* container,const char* PropName) const; + const PropertySpec *findProperty(const void* container,const Property* prop) const; - const char* getName (const PropertyContainer *container,const Property* prop) const; - short getType (const PropertyContainer *container,const Property* prop) const; - short getType (const PropertyContainer *container,const char* name) const; - const char* getGroup (const PropertyContainer *container,const char* name) const; - const char* getGroup (const PropertyContainer *container,const Property* prop) const; - const char* getDocumentation(const PropertyContainer *container,const char* name) const; - const char* getDocumentation(const PropertyContainer *container,const Property* prop) const; + const char* getName (const void* container,const Property* prop) const; + short getType (const void* container,const Property* prop) const; + short getType (const void* container,const char* name) const; + const char* getGroup (const void* container,const char* name) const; + const char* getGroup (const void* container,const Property* prop) const; + const char* getDocumentation(const void* container,const char* name) const; + const char* getDocumentation(const void* container,const Property* prop) const; - Property *getPropertyByName(const PropertyContainer *container,const char* name) const; - void getPropertyMap(const PropertyContainer *container,std::map &Map) const; - void getPropertyList(const PropertyContainer *container,std::vector &List) const; + Property *getPropertyByName(const void* container,const char* name) const; + void getPropertyMap(const void* container,std::map &Map) const; + void getPropertyList(const void* container,std::vector &List) const; }; /** Base class of all classes with properties */ -class AppExport PropertyContainer: public Base::Persistence +class AppExport PropertyContainer: public virtual Base::Persistence { TYPESYSTEM_HEADER(); @@ -191,14 +191,14 @@ private: do { \ this->_prop_.setValue _defaultval_;\ this->_prop_.setContainer(this); \ - propertyData.addProperty(this, #_prop_, &this->_prop_); \ + propertyData.addProperty(static_cast(this), #_prop_, &this->_prop_); \ } while (0) #define ADD_PROPERTY_TYPE(_prop_, _defaultval_, _group_,_type_,_Docu_) \ do { \ this->_prop_.setValue _defaultval_;\ this->_prop_.setContainer(this); \ - propertyData.addProperty(this, #_prop_, &this->_prop_, (_group_),(_type_),(_Docu_)); \ + propertyData.addProperty(static_cast(this), #_prop_, &this->_prop_, (_group_),(_type_),(_Docu_)); \ } while (0) diff --git a/src/Base/Persistence.h b/src/Base/Persistence.h index f3901153bf..1b92e9c6ee 100644 --- a/src/Base/Persistence.h +++ b/src/Base/Persistence.h @@ -48,7 +48,7 @@ public: * It is not meant to have the exact size, it is more or less an estimation * which runs fast! Is it two bytes or a GB? */ - virtual unsigned int getMemSize (void) const = 0; + virtual unsigned int getMemSize (void) const; /** This method is used to save properties to an XML document. * A good example you'll find in PropertyStandard.cpp, e.g. the vector: * \code @@ -65,7 +65,7 @@ public: * is written. This means closing tags and writing UTF-8. * @see Base::Writer */ - virtual void Save (Writer &/*writer*/) const = 0; + virtual void Save (Writer &/*writer*/) const; /** This method is used to restore properties from an XML document. * It uses the XMLReader class, which bases on SAX, to read the in Save() * written information. Again the Vector as an example: @@ -81,7 +81,7 @@ public: * } * \endcode */ - virtual void Restore(XMLReader &/*reader*/) = 0; + virtual void Restore(XMLReader &/*reader*/); /** This method is used to save large amounts of data to a binary file. * Sometimes it makes no sense to write property data as XML. In case the * amount of data is too big or the data type has a more effective way to diff --git a/src/Gui/ViewProviderDocumentObjectGroup.cpp b/src/Gui/ViewProviderDocumentObjectGroup.cpp index 018755f139..32a372d824 100644 --- a/src/Gui/ViewProviderDocumentObjectGroup.cpp +++ b/src/Gui/ViewProviderDocumentObjectGroup.cpp @@ -47,7 +47,7 @@ using namespace Gui; -PROPERTY_SOURCE_WITH_EXTENSIONS(Gui::ViewProviderDocumentObjectGroup, Gui::ViewProviderDocumentObject, (Gui::ViewProviderGroupExtension)) +PROPERTY_SOURCE_WITH_EXTENSIONS(Gui::ViewProviderDocumentObjectGroup, Gui::ViewProviderDocumentObject) /** diff --git a/src/Gui/ViewProviderExtension.cpp b/src/Gui/ViewProviderExtension.cpp index 784ac76ebb..2ee8d94c7d 100644 --- a/src/Gui/ViewProviderExtension.cpp +++ b/src/Gui/ViewProviderExtension.cpp @@ -33,7 +33,7 @@ using namespace Gui; -PROPERTY_SOURCE(Gui::ViewProviderExtension, App::Extension) +EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderExtension, App::Extension) ViewProviderExtension::ViewProviderExtension() { @@ -62,7 +62,7 @@ void ViewProviderExtension::extensionUpdateData(const App::Property*) { } namespace Gui { -PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderExtensionPython, Gui::ViewProviderExtension) +EXTENSION_PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderExtensionPython, Gui::ViewProviderExtension) // explicit template instantiation template class GuiExport ViewProviderExtensionPythonT; diff --git a/src/Gui/ViewProviderExtension.h b/src/Gui/ViewProviderExtension.h index 9a2cc02396..cc8218e23d 100644 --- a/src/Gui/ViewProviderExtension.h +++ b/src/Gui/ViewProviderExtension.h @@ -39,7 +39,7 @@ class GuiExport ViewProviderExtension : public App::Extension //The cass does not have properties itself, but it is important to provide the property access //functions. - PROPERTY_HEADER(Gui::ViewProviderExtension); + EXTENSION_PROPERTY_HEADER(Gui::ViewProviderExtension); public: @@ -90,7 +90,7 @@ private: template class ViewProviderExtensionPythonT : public ExtensionT { - PROPERTY_HEADER(Gui::ViewProviderExtensionPythonT); + EXTENSION_PROPERTY_HEADER(Gui::ViewProviderExtensionPythonT); public: typedef ExtensionT Inherited; @@ -98,7 +98,7 @@ public: ViewProviderExtensionPythonT() { ExtensionT::m_isPythonExtension = true; - ADD_PROPERTY(Proxy,(Py::Object())); + EXTENSION_ADD_PROPERTY(Proxy,(Py::Object())); } virtual ~ViewProviderExtensionPythonT() { } diff --git a/src/Gui/ViewProviderGeoFeatureGroup.cpp b/src/Gui/ViewProviderGeoFeatureGroup.cpp index 4d4f0c6aa2..98246fd9c8 100644 --- a/src/Gui/ViewProviderGeoFeatureGroup.cpp +++ b/src/Gui/ViewProviderGeoFeatureGroup.cpp @@ -36,7 +36,7 @@ using namespace Gui; -PROPERTY_SOURCE_WITH_EXTENSIONS(Gui::ViewProviderGeoFeatureGroup, Gui::ViewProviderDocumentObject, (Gui::ViewProviderGeoFeatureGroupExtension)) +PROPERTY_SOURCE_WITH_EXTENSIONS(Gui::ViewProviderGeoFeatureGroup, Gui::ViewProviderDocumentObject) ViewProviderGeoFeatureGroup::ViewProviderGeoFeatureGroup() { diff --git a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp index 867e2d87f8..6217b1b8db 100644 --- a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp +++ b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp @@ -34,7 +34,7 @@ using namespace Gui; -PROPERTY_SOURCE(Gui::ViewProviderGeoFeatureGroupExtension, Gui::ViewProviderGroupExtension) +EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderGeoFeatureGroupExtension, Gui::ViewProviderGroupExtension) ViewProviderGeoFeatureGroupExtension::ViewProviderGeoFeatureGroupExtension() { @@ -93,7 +93,7 @@ void ViewProviderGeoFeatureGroupExtension::extensionUpdateData(const App::Proper namespace Gui { -PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderGeoFeatureGroupExtensionPython, Gui::ViewProviderGeoFeatureGroupExtension) +EXTENSION_PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderGeoFeatureGroupExtensionPython, Gui::ViewProviderGeoFeatureGroupExtension) // explicit template instantiation template class GuiExport ViewProviderExtensionPythonT; diff --git a/src/Gui/ViewProviderGeoFeatureGroupExtension.h b/src/Gui/ViewProviderGeoFeatureGroupExtension.h index e5dc29e0da..0521ac0b21 100644 --- a/src/Gui/ViewProviderGeoFeatureGroupExtension.h +++ b/src/Gui/ViewProviderGeoFeatureGroupExtension.h @@ -34,7 +34,7 @@ namespace Gui class GuiExport ViewProviderGeoFeatureGroupExtension : public ViewProviderGroupExtension { - PROPERTY_HEADER(Gui::ViewProviderGeoFeatureGroupExtension); + EXTENSION_PROPERTY_HEADER(Gui::ViewProviderGeoFeatureGroupExtension); public: /// Constructor diff --git a/src/Gui/ViewProviderGroupExtension.cpp b/src/Gui/ViewProviderGroupExtension.cpp index 5415ccf563..c8ed1ed0a6 100644 --- a/src/Gui/ViewProviderGroupExtension.cpp +++ b/src/Gui/ViewProviderGroupExtension.cpp @@ -40,7 +40,7 @@ using namespace Gui; -PROPERTY_SOURCE(Gui::ViewProviderGroupExtension, Gui::ViewProviderExtension) +EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderGroupExtension, Gui::ViewProviderExtension) ViewProviderGroupExtension::ViewProviderGroupExtension() : visible(false) { @@ -199,7 +199,7 @@ bool ViewProviderGroupExtension::extensionOnDelete(const std::vector< std::strin namespace Gui { -PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderGroupExtensionPython, Gui::ViewProviderGroupExtension) +EXTENSION_PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderGroupExtensionPython, Gui::ViewProviderGroupExtension) // explicit template instantiation template class GuiExport ViewProviderExtensionPythonT; diff --git a/src/Gui/ViewProviderGroupExtension.h b/src/Gui/ViewProviderGroupExtension.h index 7ead76f589..09800a1c4b 100644 --- a/src/Gui/ViewProviderGroupExtension.h +++ b/src/Gui/ViewProviderGroupExtension.h @@ -32,7 +32,7 @@ namespace Gui class GuiExport ViewProviderGroupExtension : public ViewProviderExtension { - PROPERTY_HEADER(Gui::ViewProviderGroupExtension); + EXTENSION_PROPERTY_HEADER(Gui::ViewProviderGroupExtension); public: /// Constructor diff --git a/src/Gui/ViewProviderOriginGroup.cpp b/src/Gui/ViewProviderOriginGroup.cpp index bac87aeed4..6a423653c2 100644 --- a/src/Gui/ViewProviderOriginGroup.cpp +++ b/src/Gui/ViewProviderOriginGroup.cpp @@ -45,7 +45,7 @@ using namespace Gui; -PROPERTY_SOURCE_WITH_EXTENSIONS(Gui::ViewProviderOriginGroup, Gui::ViewProviderDocumentObject, (Gui::ViewProviderOriginGroupExtension)) +PROPERTY_SOURCE_WITH_EXTENSIONS(Gui::ViewProviderOriginGroup, Gui::ViewProviderDocumentObject) ViewProviderOriginGroup::ViewProviderOriginGroup () { diff --git a/src/Gui/ViewProviderOriginGroupExtension.cpp b/src/Gui/ViewProviderOriginGroupExtension.cpp index 45e8a7139b..f19ae96553 100644 --- a/src/Gui/ViewProviderOriginGroupExtension.cpp +++ b/src/Gui/ViewProviderOriginGroupExtension.cpp @@ -44,7 +44,7 @@ using namespace Gui; -PROPERTY_SOURCE(Gui::ViewProviderOriginGroupExtension, Gui::ViewProviderGeoFeatureGroupExtension) +EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderOriginGroupExtension, Gui::ViewProviderGeoFeatureGroupExtension) ViewProviderOriginGroupExtension::ViewProviderOriginGroupExtension() { @@ -198,7 +198,7 @@ void ViewProviderOriginGroupExtension::updateOriginSize () { namespace Gui { -PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderOriginGroupExtensionPython, Gui::ViewProviderOriginGroupExtension) +EXTENSION_PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderOriginGroupExtensionPython, Gui::ViewProviderOriginGroupExtension) // explicit template instantiation template class GuiExport ViewProviderExtensionPythonT; diff --git a/src/Gui/ViewProviderOriginGroupExtension.h b/src/Gui/ViewProviderOriginGroupExtension.h index fb5bb11b0b..33137c8a77 100644 --- a/src/Gui/ViewProviderOriginGroupExtension.h +++ b/src/Gui/ViewProviderOriginGroupExtension.h @@ -33,7 +33,7 @@ namespace Gui class GuiExport ViewProviderOriginGroupExtension : public ViewProviderGeoFeatureGroupExtension { - PROPERTY_HEADER(Gui::ViewProviderOriginGroupExtension); + EXTENSION_PROPERTY_HEADER(Gui::ViewProviderOriginGroupExtension); public: /// Constructor diff --git a/src/Gui/ViewProviderPart.cpp b/src/Gui/ViewProviderPart.cpp index 2d7083caa8..525c69ab68 100644 --- a/src/Gui/ViewProviderPart.cpp +++ b/src/Gui/ViewProviderPart.cpp @@ -43,7 +43,7 @@ using namespace Gui; -PROPERTY_SOURCE_WITH_EXTENSIONS(Gui::ViewProviderPart, Gui::ViewProviderDocumentObject, (Gui::ViewProviderOriginGroupExtension)) +PROPERTY_SOURCE_WITH_EXTENSIONS(Gui::ViewProviderPart, Gui::ViewProviderDocumentObject) /**