diff --git a/src/App/DocumentObjectExtension.cpp b/src/App/DocumentObjectExtension.cpp
index 9c6bd5bff..9976fde10 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 eac9af906..7cba330a0 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 818134018..3f52cb986 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 8d691bdc5..a58b411d4 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 e63bfd59c..d99f0b49a 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 2029ca2f4..d4cdfc843 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 b3329f118..6fd4e9487 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 1eeb09d00..0cbbae40d 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 d218ae9af..afe3e386c 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 180368f94..243aed3f7 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 6f3bbeab8..f26382c62 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 7162a6d41..391fd7efb 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 84b0b9c88..589f72854 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 afe14a519..302ea76b1 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 e254648f1..fe5cb89f3 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 656e49e11..96303bad4 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 3d4353a86..0581e3203 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 512680ec9..c38d54726 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 f3901153b..1b92e9c6e 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 018755f13..32a372d82 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 784ac76eb..2ee8d94c7 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 9a2cc0239..cc8218e23 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 4d4f0c6aa..98246fd9c 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 867e2d87f..6217b1b8d 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 e5dc29e0d..0521ac0b2 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 5415ccf56..c8ed1ed0a 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 7ead76f58..09800a1c4 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 bac87aeed..6a423653c 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 45e8a7139..f19ae9655 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 fb5bb11b0..33137c8a7 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 2d7083caa..525c69ab6 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)
/**