Skip to content

Commit

Permalink
Extensions: Make Python Integration work
Browse files Browse the repository at this point in the history
  • Loading branch information
ickby authored and wwmayer committed Oct 8, 2016
1 parent 9322209 commit 7bcb651
Show file tree
Hide file tree
Showing 19 changed files with 626 additions and 373 deletions.
1 change: 1 addition & 0 deletions src/App/Application.cpp
Expand Up @@ -1139,6 +1139,7 @@ void Application::initTypes(void)
App ::Extension ::init();
App ::DocumentObjectExtension ::init();
App ::GroupExtension ::init();
App ::GroupExtensionPython ::init();
App ::GeoFeatureGroupExtension ::init();
App ::OriginGroupExtension ::init();

Expand Down
2 changes: 2 additions & 0 deletions src/App/CMakeLists.txt
Expand Up @@ -97,6 +97,7 @@ SET(Document_CPP_SRCS
ExtensionPyImp.cpp
DocumentObjectExtension.cpp
DocumentObjectExtensionPyImp.cpp
ExtensionContainer.cpp
ExtensionContainerPyImp.cpp
GroupExtension.cpp
GroupExtensionPyImp.cpp
Expand Down Expand Up @@ -137,6 +138,7 @@ SET(Document_HPP_SRCS
Document.h
DocumentObject.h
Extension.h
ExtensionContainer.h
GroupExtension.h
DocumentObjectExtension.h
DocumentObjectFileIncluded.h
Expand Down
16 changes: 6 additions & 10 deletions src/App/DocumentObject.h.orig
Expand Up @@ -24,11 +24,11 @@
#ifndef APP_DOCUMENTOBJECT_H
#define APP_DOCUMENTOBJECT_H

<<<<<<< 51e23d854e59ab0a23a9ea9b19e74e5f02753d82
<<<<<<< 75964436541d26c663d0ad51ae81c5ab359a539c
#include <App/TransactionalObject.h>
=======
#include <App/Extension.h>
>>>>>>> Introduce extensions and port App groups
#include <App/ExtensionContainer.h>
>>>>>>> Extensions: Make Python Integration work
#include <App/PropertyStandard.h>
#include <App/PropertyLinks.h>
#include <App/PropertyExpressionEngine.h>
Expand Down Expand Up @@ -80,11 +80,7 @@ public:

/** Base class of all Classes handled in the Document
*/
<<<<<<< 51e23d854e59ab0a23a9ea9b19e74e5f02753d82
class AppExport DocumentObject: public App::TransactionalObject
=======
class AppExport DocumentObject : public App::ExtensionContainer
>>>>>>> Introduce extensions and port App groups
{
PROPERTY_HEADER(App::DocumentObject);

Expand Down Expand Up @@ -241,11 +237,11 @@ protected:
/// get called after a document has been fully restored
virtual void onDocumentRestored() {}
/// get called after setting the document
virtual void onSettingDocument() {}
virtual void onSettingDocument();
/// get called after a brand new object was created
virtual void setupObject() {}
virtual void setupObject();
/// get called when object is going to be removed from the document
virtual void unsetupObject() {}
virtual void unsetupObject();

/// python object of this class and all descendend
protected: // attributes
Expand Down
4 changes: 1 addition & 3 deletions src/App/DocumentObjectExtension.cpp
Expand Up @@ -45,7 +45,7 @@ DocumentObjectExtension::~DocumentObjectExtension()

}

short int DocumentObjectExtension::extensionMustExecute(void) const {
short int DocumentObjectExtension::extensionMustExecute(void) {

return 0;
}
Expand Down Expand Up @@ -75,5 +75,3 @@ PyObject* DocumentObjectExtension::getExtensionPyObject(void) {
}
return Py::new_reference_to(ExtensionPythonObject);
}


2 changes: 1 addition & 1 deletion src/App/DocumentObjectExtension.h
Expand Up @@ -46,7 +46,7 @@ class AppExport DocumentObjectExtension : public App::Extension
virtual ~DocumentObjectExtension ();

//override if execution is nesseccary
virtual short extensionMustExecute(void) const;
virtual short extensionMustExecute(void);
virtual App::DocumentObjectExecReturn *extensionExecute(void);


Expand Down
251 changes: 5 additions & 246 deletions src/App/Extension.cpp
Expand Up @@ -52,7 +52,6 @@ using namespace App;

Extension::Extension()
{

}

Extension::~Extension()
Expand Down Expand Up @@ -96,249 +95,9 @@ const char* Extension::name() {
return std::string().c_str();
}

namespace App {
PROPERTY_SOURCE_TEMPLATE(App::ExtensionPython, App::ExtensionPython::Inherited)


TYPESYSTEM_SOURCE(App::ExtensionContainer, App::PropertyContainer);

ExtensionContainer::ExtensionContainer() {

};

ExtensionContainer::~ExtensionContainer() {

};

void ExtensionContainer::registerExtension(Base::Type extension, Extension* ext) {

if(ext->getExtendedObject() != this)
throw Base::Exception("ExtensionContainer::registerExtension: Extension has not this as base object");

//no duplicate extensions (including base classes)
if(hasExtension(extension)) {
for(auto entry : _extensions) {
if(entry.first == extension || entry.first.isDerivedFrom(extension)) {
_extensions.erase(entry.first);
break;
}
}
}

_extensions[extension] = ext;
}

bool ExtensionContainer::hasExtension(Base::Type t) const {

//check for the exact type
bool found = _extensions.find(t) != _extensions.end();
if(!found) {
//and for types derived from it, as they can be cast to the extension
for(auto entry : _extensions) {
if(entry.first.isDerivedFrom(t))
return true;
}
return false;
}
return true;
}

bool ExtensionContainer::hasExtension(const char* name) const {

//and for types derived from it, as they can be cast to the extension
for(auto entry : _extensions) {
if(strcmp(entry.second->name(), name) == 0)
return true;
}
return false;
}


Extension* ExtensionContainer::getExtension(Base::Type t) {

auto result = _extensions.find(t);
if(result == _extensions.end()) {
//we need to check for derived types
for(auto entry : _extensions) {
if(entry.first.isDerivedFrom(t))
return entry.second;
}
//if we arive hear we don't have anything matching
throw Base::Exception("ExtensionContainer::getExtension: No extension of given type available");
}

return result->second;
}

Extension* ExtensionContainer::getExtension(const char* name) {

//and for types derived from it, as they can be cast to the extension
for(auto entry : _extensions) {
if(strcmp(entry.second->name(), name) == 0)
return entry.second;
}
return nullptr;
}

std::vector< Extension* > ExtensionContainer::getExtensionsDerivedFrom(Base::Type type) const {

std::vector<Extension*> vec;
//and for types derived from it, as they can be cast to the extension
for(auto entry : _extensions) {
if(entry.first.isDerivedFrom(type))
vec.push_back(entry.second);
}
return vec;
}

void ExtensionContainer::getPropertyList(std::vector< Property* >& List) const {
App::PropertyContainer::getPropertyList(List);
for(auto entry : _extensions) {
if(entry.second->isPythonExtension())
entry.second->getPropertyList(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);
}
}

Property* ExtensionContainer::getPropertyByName(const char* name) const {
auto prop = App::PropertyContainer::getPropertyByName(name);
if(prop)
return prop;

for(auto entry : _extensions) {
if(entry.second->isPythonExtension()){
auto prop = entry.second->getPropertyByName(name);
if(prop)
return prop;
}
}

return nullptr;
}


short int ExtensionContainer::getPropertyType(const Property* prop) const {
short int res = App::PropertyContainer::getPropertyType(prop);
if(res != 0)
return res;

for(auto entry : _extensions) {
if(entry.second->isPythonExtension()) {
res = entry.second->getPropertyType(prop);
if(res != 0)
return res;
}
}

return 0;
}

short int ExtensionContainer::getPropertyType(const char* name) const {

short int res = App::PropertyContainer::getPropertyType(name);
if(res != 0)
return res;

for(auto entry : _extensions) {
if(entry.second->isPythonExtension()) {
res = entry.second->getPropertyType(name);
if(res != 0)
return res;
}
}

return 0;
}


const char* ExtensionContainer::getPropertyName(const Property* prop) const {

const char* res = App::PropertyContainer::getPropertyName(prop);
if(res != 0)
return res;

for(auto entry : _extensions) {
if(entry.second->isPythonExtension()) {
res = entry.second->getPropertyName(prop);
if(res != 0)
return res;
}
}

return 0;
}

const char* ExtensionContainer::getPropertyGroup(const Property* prop) const {

const char* res = App::PropertyContainer::getPropertyGroup(prop);
if(res != 0)
return res;

for(auto entry : _extensions) {
if(entry.second->isPythonExtension()) {
res = entry.second->getPropertyGroup(prop);
if(res != 0)
return res;
}
}

return 0;
}

const char* ExtensionContainer::getPropertyGroup(const char* name) const {

const char* res = App::PropertyContainer::getPropertyGroup(name);
if(res != 0)
return res;

for(auto entry : _extensions) {
if(entry.second->isPythonExtension()) {
res = entry.second->getPropertyGroup(name);
if(res != 0)
return res;
}
}

return 0;
}


const char* ExtensionContainer::getPropertyDocumentation(const Property* prop) const {

const char* res = App::PropertyContainer::getPropertyDocumentation(prop);
if(res != 0)
return res;

for(auto entry : _extensions) {
if(entry.second->isPythonExtension()) {
res = entry.second->getPropertyDocumentation(prop);
if(res != 0)
return res;
}
}

return 0;
}

const char* ExtensionContainer::getPropertyDocumentation(const char* name) const {

const char* res = App::PropertyContainer::getPropertyDocumentation(name);
if(res != 0)
return res;

for(auto entry : _extensions) {
if(entry.second->isPythonExtension()) {
res = entry.second->getPropertyDocumentation(name);
if(res != 0)
return res;
}
}

return 0;
}

// explicit template instantiation
template class AppExport ExtensionPythonT<Extension>;
}

0 comments on commit 7bcb651

Please sign in to comment.