#! python # -*- coding: utf-8 -*- # (c) 2006 Juergen Riegel import template,os,sys import generateBase.generateModel_Module import generateBase.generateTools class TemplateClassPyExport (template.ModelTemplate): def Generate(self): #self.ParentNamespace = "Base" #self.Namespace = "Base" encoding = sys.getfilesystemencoding() path = self.path.decode(encoding) exportName = self.export.Name.decode(encoding) dirname = self.dirname.decode(encoding) print "TemplateClassPyExport",path + exportName # Imp.cpp must not exist, neither in path nor in dirname if(not os.path.exists(path + exportName + "Imp.cpp")): if(not os.path.exists(dirname + exportName + "Imp.cpp")): file = open(path + exportName + "Imp.cpp",'w') generateBase.generateTools.replace(self.TemplateImplement,locals(),file) file = open(path + exportName + ".cpp",'w') generateBase.generateTools.replace(self.TemplateModule,locals(),file) file = open(path + exportName + ".h",'w') generateBase.generateTools.replace(self.TemplateHeader,locals(),file) #file.write( generateBase.generateTools.replace(self.Template,locals())) TemplateHeader = """ // This file is generated by src/Tools/generateTemaplates/templateClassPyExport.py out of the XML file // Every change you make here get lost at the next full rebuild! #ifndef @self.export.Namespace.upper()@_@self.export.Name.upper()@_H #define @self.export.Namespace.upper()@_@self.export.Name.upper()@_H #include <@self.export.FatherInclude@> #include <@self.export.Include@> #include namespace @self.export.Namespace@ { //=========================================================================== // @self.export.Name@ - Python wrapper //=========================================================================== /** The python export class for @self.export.Twin@ */ class @self.export.Namespace@Export @self.export.Name@ : public @self.export.FatherNamespace@::@self.export.Father@ { public: static PyTypeObject Type; static PyMethodDef Methods[]; + if (self.export.NumberProtocol): static PyNumberMethods Number[]; - + if (self.export.Sequence): static PySequenceMethods Sequence[]; - + if (self.export.RichCompare): static PyObject * richCompare(PyObject *v, PyObject *w, int op); - static PyGetSetDef GetterSetter[]; static PyParentObject Parents[]; virtual PyTypeObject *GetType(void) {return &Type;}; virtual PyParentObject *GetParents(void) {return Parents;} public: @self.export.Name@(@self.export.TwinPointer@ *pcObject, PyTypeObject *T = &Type); static PyObject *PyMake(struct _typeobject *, PyObject *, PyObject *); virtual int PyInit(PyObject* args, PyObject*k); ~@self.export.Name@(); typedef @self.export.TwinPointer@* PointerType ; virtual PyObject *_repr(void); // the representation std::string representation(void) const; /** @name callbacks and implementers for the python object methods */ //@{ + for i in self.export.Methode: + if i.Keyword: /// callback for the @i.Name@() method static PyObject * staticCallback_@i.Name@ (PyObject *self, PyObject *args, PyObject *kwd); /// implementer for the @i.Name@() method PyObject* @i.Name@(PyObject *args, PyObject *kwd); = else: /// callback for the @i.Name@() method static PyObject * staticCallback_@i.Name@ (PyObject *self, PyObject *args); /// implementer for the @i.Name@() method PyObject* @i.Name@(PyObject *args); - - //@} + if (self.export.NumberProtocol): /** @name callbacks and implementers for the python object number protocol */ //@{ /// callback for the number_add_handler static PyObject * number_add_handler (PyObject *self, PyObject *other); /// callback for the number_subtract_handler static PyObject * number_subtract_handler (PyObject *self, PyObject *other); /// callback for the number_multiply_handler static PyObject * number_multiply_handler (PyObject *self, PyObject *other); //@} - + if (self.export.Sequence): /** @name callbacks and implementers for the python object sequence protocol */ //@{ + if (self.export.Sequence.sq_length): static Py_ssize_t sequence_length(PyObject *); - + if (self.export.Sequence.sq_concat): static PyObject* sequence_concat(PyObject *, PyObject *); - + if (self.export.Sequence.sq_repeat): static PyObject * sequence_repeat(PyObject *, Py_ssize_t); - + if (self.export.Sequence.sq_item): static PyObject * sequence_item(PyObject *, Py_ssize_t); - + if (self.export.Sequence.sq_slice): static PyObject * sequence_slice(PyObject *, Py_ssize_t, Py_ssize_t); - + if (self.export.Sequence.sq_ass_item): static int sequence_ass_item(PyObject *, Py_ssize_t, PyObject *); - + if (self.export.Sequence.sq_ass_slice): static int sequence_ass_slice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); - + if (self.export.Sequence.sq_contains): static int sequence_contains(PyObject *, PyObject *); - + if (self.export.Sequence.sq_inplace_concat): static PyObject* sequence_inplace_concat(PyObject *, PyObject *); - + if (self.export.Sequence.sq_inplace_repeat): static PyObject * sequence_inplace_repeat(PyObject *, Py_ssize_t); - //@} - /** @name callbacks and implementers for the python object attributes */ //@{ + for i in self.export.Attribute: ///getter callback for the @i.Name@ attribute static PyObject * staticCallback_get@i.Name@ (PyObject *self, void *closure); /// getter for the @i.Name@ attribute Py::@i.Parameter.Type@ get@i.Name@(void) const; /// setter callback for the @i.Name@ attribute static int staticCallback_set@i.Name@ (PyObject *self, PyObject *value, void *closure); + if (i.ReadOnly): // no setter method, @i.Name@ is read only! = else: /// setter for the @i.Name@ attribute void set@i.Name@(Py::@i.Parameter.Type@ arg); - - //@} + if(self.export.CustomAttributes != None): /// getter method for special attributes (e.g. dynamic ones) PyObject *getCustomAttributes(const char* attr) const; /// setter for special attributes (e.g. dynamic ones) int setCustomAttributes(const char* attr, PyObject *obj); PyObject *_getattr(char *attr); // __getattr__ function int _setattr(char *attr, PyObject *value); // __setattr__ function - /// getter for the object handled by this class @self.export.TwinPointer@ *get@self.export.Twin@Ptr(void) const; + if(self.export.ClassDeclarations != None): /** @name additional declarations and methods for the wrapper class */ //@{ @self.export.ClassDeclarations@ //@} - }; #define PARENTS@self.export.Namespace@@self.export.Name@ &@self.export.Name@::Type,PARENTS@self.export.FatherNamespace@@self.export.Father@ } //namespace @self.export.Namespace@ #endif // @self.export.Namespace.upper()@_@self.export.Name.upper()@_H """ TemplateModule = """ // This file is generated by src/Tools/generateTemaplates/templateClassPyExport.py out of the .XML file // Every change you make here get lost at the next full rebuild! // This File is normaly build as an include in @self.export.Name@Imp.cpp! Its not intended to be in a project! #include #include #include #include #include #include #include #define new DEBUG_CLIENTBLOCK using Base::streq; using namespace @self.export.Namespace@; /// Type structure of @self.export.Name@ PyTypeObject @self.export.Name@::Type = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "@self.export.Namespace@.@self.export.Twin@", /*tp_name*/ sizeof(@self.export.Name@), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ PyDestructor, /*tp_dealloc*/ 0, /*tp_print*/ __getattr, /*tp_getattr*/ __setattr, /*tp_setattr*/ 0, /*tp_compare*/ __repr, /*tp_repr*/ + if (self.export.NumberProtocol): @self.export.Namespace@::@self.export.Name@::Number, /*tp_as_number*/ = else: 0, /*tp_as_number*/ - + if (self.export.Sequence): @self.export.Namespace@::@self.export.Name@::Sequence, /*tp_as_sequence*/ = else: 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call */ 0, /*tp_str */ 0, /*tp_getattro*/ 0, /*tp_setattro*/ /* --- Functions to access object as input/output buffer ---------*/ 0, /* tp_as_buffer */ /* --- Flags to define presence of optional/expanded features */ + if (self.export.RichCompare): Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_CLASS|Py_TPFLAGS_HAVE_RICHCOMPARE, /*tp_flags */ = else: Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_CLASS, /*tp_flags */ - "@self.export.Documentation.UserDocu.replace('\\n','\\\\n\\"\\n \\"')@", /*tp_doc */ 0, /*tp_traverse */ 0, /*tp_clear */ + if (self.export.RichCompare): @self.export.Namespace@::@self.export.Name@::richCompare, /*tp_richcompare*/ = else: 0, /*tp_richcompare */ - 0, /*tp_weaklistoffset */ 0, /*tp_iter */ 0, /*tp_iternext */ @self.export.Namespace@::@self.export.Name@::Methods, /*tp_methods */ 0, /*tp_members */ @self.export.Namespace@::@self.export.Name@::GetterSetter, /*tp_getset */ &@self.export.FatherNamespace@::@self.export.Father@::Type, /*tp_base */ 0, /*tp_dict */ 0, /*tp_descr_get */ 0, /*tp_descr_set */ 0, /*tp_dictoffset */ __PyInit, /*tp_init */ 0, /*tp_alloc */ @self.export.Namespace@::@self.export.Name@::PyMake,/*tp_new */ 0, /*tp_free Low-level free-memory routine */ 0, /*tp_is_gc For PyObject_IS_GC */ 0, /*tp_bases */ 0, /*tp_mro method resolution order */ 0, /*tp_cache */ 0, /*tp_subclasses */ 0, /*tp_weaklist */ 0 /*tp_del */ }; /// Methods structure of @self.export.Name@ PyMethodDef @self.export.Name@::Methods[] = { + for i in self.export.Methode: {"@i.Name@", (PyCFunction) staticCallback_@i.Name@, + if i.Keyword: METH_VARARGS|METH_KEYWORDS, = else: METH_VARARGS, - "@i.Documentation.UserDocu.replace('\\n','\\\\n')@" }, - {NULL, NULL, 0, NULL} /* Sentinel */ }; + if (self.export.NumberProtocol): PyNumberMethods @self.export.Name@::Number[] = { { number_add_handler, number_subtract_handler, number_multiply_handler, NULL } }; - + if (self.export.Sequence): PySequenceMethods VectorPy::Sequence[] = { { + if (self.export.Sequence.sq_length): sequence_length, = else: 0, - + if (self.export.Sequence.sq_concat): sequence_concat, = else: 0, - + if (self.export.Sequence.sq_repeat): sequence_repeat, = else: 0, - + if (self.export.Sequence.sq_item): sequence_item, = else: 0, - + if (self.export.Sequence.sq_slice): sequence_slice, = else: 0, - + if (self.export.Sequence.sq_ass_item): sequence_ass_item, = else: 0, - + if (self.export.Sequence.sq_ass_slice): sequence_ass_slice, = else: 0, - + if (self.export.Sequence.sq_contains): sequence_contains, = else: 0, - + if (self.export.Sequence.sq_inplace_concat): sequence_inplace_concat, = else: 0, - + if (self.export.Sequence.sq_inplace_repeat): sequence_inplace_repeat, = else: 0 - } }; - /// Attribute structure of @self.export.Name@ PyGetSetDef @self.export.Name@::GetterSetter[] = { + for i in self.export.Attribute: {"@i.Name@", (getter) staticCallback_get@i.Name@, (setter) staticCallback_set@i.Name@, "@i.Documentation.UserDocu.replace('\\n','\\\\n')@", NULL }, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; + for i in self.export.Methode: // @i.Name@() callback and implementer // PyObject* @self.export.Name@::@i.Name@(PyObject *args){}; // has to be implemented in @self.export.Name@Imp.cpp + if i.Keyword: PyObject * @self.export.Name@::staticCallback_@i.Name@ (PyObject *self, PyObject *args, PyObject * kwd) = else: PyObject * @self.export.Name@::staticCallback_@i.Name@ (PyObject *self, PyObject *args) - { // test if twin object not allready deleted if (!((PyObjectBase*) self)->isValid()){ PyErr_SetString(PyExc_ReferenceError, "This object is already deleted most likely through closing a document. This reference is no longer valid!"); return NULL; } + if (not i.Const): // test if object is set Const if (((PyObjectBase*) self)->isConst()){ PyErr_SetString(PyExc_ReferenceError, "This object is immutable, you can not set any attribute or call a non const method"); return NULL; } - try { // catches all exceptions coming up from c++ and generate a python exception + if i.Keyword: PyObject* ret = ((@self.export.Name@*)self)->@i.Name@(args, kwd); = else: PyObject* ret = ((@self.export.Name@*)self)->@i.Name@(args); - + if (not i.Const): if (ret != 0) ((@self.export.Name@*)self)->startNotify(); - return ret; } catch(const Base::Exception& e) // catch the FreeCAD exceptions { std::string str; str += "FreeCAD exception thrown ("; str += e.what(); str += ")"; e.ReportException(); PyErr_SetString(PyExc_Exception,str.c_str()); return NULL; } catch(const boost::filesystem::filesystem_error& e) // catch boost filesystem exception { std::string str; str += "File system exception thrown ("; //str += e.who(); //str += ", "; str += e.what(); str += ")\\n"; Base::Console().Error(str.c_str()); PyErr_SetString(PyExc_Exception,str.c_str()); return NULL; } catch(const Py::Exception&) { // The exception text is already set return NULL; } catch(const char* e) // catch simple string exceptions { Base::Console().Error(e); PyErr_SetString(PyExc_Exception,e); return NULL; } // in debug not all exceptions will be catched to get the attention of the developer! #ifndef DONT_CATCH_CXX_EXCEPTIONS catch(const std::exception& e) // catch other c++ exceptions { std::string str; str += "FC++ exception thrown ("; str += e.what(); str += ")"; Base::Console().Error(str.c_str()); PyErr_SetString(PyExc_Exception,str.c_str()); return NULL; } catch(...) // catch the rest! { PyErr_SetString(PyExc_Exception,"Unknown C++ exception"); return NULL; } #endif } - + for i in self.export.Attribute: // @i.Name@() callback and implementer // PyObject* @self.export.Name@::@i.Name@(PyObject *args){}; // has to be implemented in @self.export.Name@Imp.cpp PyObject * @self.export.Name@::staticCallback_get@i.Name@ (PyObject *self, void * /*closure*/) { if (!((PyObjectBase*) self)->isValid()){ PyErr_SetString(PyExc_ReferenceError, "This object is already deleted most likely through closing a document. This reference is no longer valid!"); return NULL; } try { return Py::new_reference_to(((@self.export.Name@*)self)->get@i.Name@()); } catch (const Py::Exception&) { // The exception text is already set return NULL; } catch (...) { PyErr_SetString(PyExc_Exception, "Unknown exception while reading attribute '@i.Name@' of object '@self.export.Twin@'"); return NULL; } } + if (i.ReadOnly): int @self.export.Name@::staticCallback_set@i.Name@ (PyObject *self, PyObject * /*value*/, void * /*closure*/) { if (!((PyObjectBase*) self)->isValid()){ PyErr_SetString(PyExc_ReferenceError, "This object is already deleted most likely through closing a document. This reference is no longer valid!"); return -1; } PyErr_SetString(PyExc_AttributeError, "Attribute '@i.Name@' of object '@self.export.Twin@' is read-only"); return -1; } = else: int @self.export.Name@::staticCallback_set@i.Name@ (PyObject *self, PyObject *value, void * /*closure*/) { if (!((PyObjectBase*) self)->isValid()){ PyErr_SetString(PyExc_ReferenceError, "This object is already deleted most likely through closing a document. This reference is no longer valid!"); return -1; } if (((PyObjectBase*) self)->isConst()){ PyErr_SetString(PyExc_ReferenceError, "This object is immutable, you can not set any attribute or call a method"); return -1; } try { + if (i.Parameter.Type == "Float"): ((@self.export.Name@*)self)->set@i.Name@(Py::@i.Parameter.Type@(PyNumber_Float(value),true)); = else: ((@self.export.Name@*)self)->set@i.Name@(Py::@i.Parameter.Type@(value,false)); - return 0; } catch (const Py::Exception&) { // The exception text is already set return -1; } catch (...) { PyErr_SetString(PyExc_Exception, "Unknown exception while writing attribute '@i.Name@' of object '@self.export.Twin@'"); return -1; } } - - //-------------------------------------------------------------------------- // Parents structure //-------------------------------------------------------------------------- PyParentObject @self.export.Name@::Parents[] = { PARENTS@self.export.Namespace@@self.export.Name@ }; //-------------------------------------------------------------------------- // Constructor //-------------------------------------------------------------------------- @self.export.Name@::@self.export.Name@(@self.export.TwinPointer@ *pcObject, PyTypeObject *T) : @self.export.Father@(reinterpret_cast<@self.export.Father@::PointerType>(pcObject), T) { + if (self.export.Reference): pcObject->ref(); - } + if not (self.export.Constructor): PyObject *@self.export.Name@::PyMake(struct _typeobject *, PyObject *, PyObject *) // Python wrapper { // never create such objects with the constructor PyErr_SetString(PyExc_RuntimeError, "You cannot create directly an instance of '@self.export.Name@'."); return 0; } int @self.export.Name@::PyInit(PyObject* /*args*/, PyObject* /*kwd*/) { return 0; } - //-------------------------------------------------------------------------- // destructor //-------------------------------------------------------------------------- @self.export.Name@::~@self.export.Name@() // Everything handled in parent { + if (self.export.Reference): get@self.export.Twin@Ptr()->unref(); - + if (self.export.Delete): // delete the handled object when the PyObject dies @self.export.Name@::PointerType ptr = reinterpret_cast<@self.export.Name@::PointerType>(_pcTwinPointer); delete ptr; - } //-------------------------------------------------------------------------- // @self.export.Name@ representation //-------------------------------------------------------------------------- PyObject *@self.export.Name@::_repr(void) { return Py_BuildValue("s", representation().c_str()); } + if(self.export.CustomAttributes != None): //-------------------------------------------------------------------------- // @self.export.Name@ Attributes //-------------------------------------------------------------------------- PyObject *@self.export.Name@::_getattr(char *attr) // __getattr__ function: note only need to handle new state { try { // getter method for special Attributes (e.g. dynamic ones) PyObject *r = getCustomAttributes(attr); if(r) return r; } #ifndef DONT_CATCH_CXX_EXCEPTIONS catch(const Base::Exception& e) // catch the FreeCAD exceptions { std::string str; str += "FreeCAD exception thrown ("; str += e.what(); str += ")"; e.ReportException(); PyErr_SetString(PyExc_Exception,str.c_str()); return NULL; } catch(const std::exception& e) // catch other c++ exceptions { std::string str; str += "FC++ exception thrown ("; str += e.what(); str += ")"; Base::Console().Error(str.c_str()); PyErr_SetString(PyExc_Exception,str.c_str()); return NULL; } catch(const Py::Exception&) { // The exception text is already set return NULL; } catch(...) // catch the rest! { PyErr_SetString(PyExc_Exception,"Unknown C++ exception"); return NULL; } #else // DONT_CATCH_CXX_EXCEPTIONS catch(const Base::Exception& e) // catch the FreeCAD exceptions { std::string str; str += "FreeCAD exception thrown ("; str += e.what(); str += ")"; e.ReportException(); PyErr_SetString(PyExc_Exception,str.c_str()); return NULL; } catch(const Py::Exception&) { // The exception text is already set return NULL; } #endif // DONT_CATCH_CXX_EXCEPTIONS PyObject *rvalue = Py_FindMethod(Methods, this, attr); if (rvalue == NULL) { PyErr_Clear(); return @self.export.Father@::_getattr(attr); } else { return rvalue; } } int @self.export.Name@::_setattr(char *attr, PyObject *value) // __setattr__ function: note only need to handle new state { try { // setter for special Attributes (e.g. dynamic ones) int r = setCustomAttributes(attr, value); if(r==1) return 0; } #ifndef DONT_CATCH_CXX_EXCEPTIONS catch(const Base::Exception& e) // catch the FreeCAD exceptions { std::string str; str += "FreeCAD exception thrown ("; str += e.what(); str += ")"; e.ReportException(); PyErr_SetString(PyExc_Exception,str.c_str()); return -1; } catch(const std::exception& e) // catch other c++ exceptions { std::string str; str += "FC++ exception thrown ("; str += e.what(); str += ")"; Base::Console().Error(str.c_str()); PyErr_SetString(PyExc_Exception,str.c_str()); return -1; } catch(const Py::Exception&) { // The exception text is already set return -1; } catch(...) // catch the rest! { PyErr_SetString(PyExc_Exception,"Unknown C++ exception"); return -1; } #else // DONT_CATCH_CXX_EXCEPTIONS catch(const Base::Exception& e) // catch the FreeCAD exceptions { std::string str; str += "FreeCAD exception thrown ("; str += e.what(); str += ")"; e.ReportException(); PyErr_SetString(PyExc_Exception,str.c_str()); return -1; } catch(const Py::Exception&) { // The exception text is already set return -1; } #endif // DONT_CATCH_CXX_EXCEPTIONS return @self.export.Father@::_setattr(attr, value); } - @self.export.TwinPointer@ *@self.export.Name@::get@self.export.Twin@Ptr(void) const { return static_cast<@self.export.TwinPointer@ *>(_pcTwinPointer); } #if 0 /* From here on come the methods you have to implement, but NOT in this module. Implement in @self.export.Name@Imp.cpp! This prototypes * are just for convenience when you add a new method. */ + if (self.export.Constructor): PyObject *@self.export.Name@::PyMake(struct _typeobject *, PyObject *, PyObject *) // Python wrapper { // create a new instance of @self.export.Name@ and the Twin object return new @self.export.Name@(new @self.export.TwinPointer@); } // constructor method int @self.export.Name@::PyInit(PyObject* /*args*/, PyObject* /*kwd*/) { return 0; } - // returns a string which represents the object e.g. when printed in python std::string @self.export.Name@::representation(void) const { return std::string("<@self.export.Twin@ object>"); } + for i in self.export.Methode: + if i.Keyword: PyObject* @self.export.Name@::@i.Name@(PyObject *args, PyObject *kwds) = else: PyObject* @self.export.Name@::@i.Name@(PyObject *args) - { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.NumberProtocol): PyObject* @self.export.Name@::number_add_handler(PyObject *self, PyObject *other) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } PyObject* @self.export.Name@::number_subtract_handler(PyObject *self, PyObject *other) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } PyObject* @self.export.Name@::number_multiply_handler(PyObject *self, PyObject *other) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence): + if (self.export.Sequence.sq_length): Py_ssize_t @self.export.Name@::sequence_length(PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return -1; } - + if (self.export.Sequence.sq_concat): PyObject* @self.export.Name@::sequence_concat(PyObject *, PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence.sq_repeat): PyObject * @self.export.Name@::sequence_repeat(PyObject *, Py_ssize_t) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence.sq_item): PyObject * @self.export.Name@::sequence_item(PyObject *, Py_ssize_t) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence.sq_slice): PyObject * @self.export.Name@::sequence_slice(PyObject *, Py_ssize_t, Py_ssize_t) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence.sq_ass_item): int @self.export.Name@::sequence_ass_item(PyObject *, Py_ssize_t, PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return -1; } - + if (self.export.Sequence.sq_ass_slice): int @self.export.Name@::sequence_ass_slice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return -1; } - + if (self.export.Sequence.sq_contains): int @self.export.Name@::sequence_contains(PyObject *, PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return -1; } - + if (self.export.Sequence.sq_inplace_concat): PyObject* @self.export.Name@::sequence_inplace_concat(PyObject *, PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence.sq_inplace_repeat): PyObject * @self.export.Name@::sequence_inplace_repeat(PyObject *, Py_ssize_t) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - - + if (self.export.RichCompare): PyObject* @self.export.Name@::richCompare(PyObject *v, PyObject *w, int op) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + for i in self.export.Attribute: Py::@i.Parameter.Type@ @self.export.Name@::get@i.Name@(void) const { //return Py::@i.Parameter.Type@(); throw Py::AttributeError("Not yet implemented"); } + if (i.ReadOnly): = else: void @self.export.Name@::set@i.Name@(Py::@i.Parameter.Type@ arg) { throw Py::AttributeError("Not yet implemented"); } - - + if(self.export.CustomAttributes != None): PyObject *@self.export.Name@::getCustomAttributes(const char* attr) const { return 0; } int @self.export.Name@::setCustomAttributes(const char* attr, PyObject *obj) { return 0; } - #endif """ # here the template for the user part of the implementation. This gets NOT overridden when already existing TemplateImplement = """ #include "PreCompiled.h" #include "@self.export.Include@" // inclusion of the generated files (generated out of @self.export.Name@.xml) #include "@self.export.Name@.h" #include "@self.export.Name@.cpp" using namespace @self.export.Namespace@; // returns a string which represents the object e.g. when printed in python std::string @self.export.Name@::representation(void) const { return std::string("<@self.export.Twin@ object>"); } + if (self.export.Constructor): PyObject *@self.export.Name@::PyMake(struct _typeobject *, PyObject *, PyObject *) // Python wrapper { // create a new instance of @self.export.Name@ and the Twin object return new @self.export.Name@(new @self.export.TwinPointer@); } // constructor method int @self.export.Name@::PyInit(PyObject* /*args*/, PyObject* /*kwd*/) { return 0; } - + for i in self.export.Methode: + if i.Keyword: PyObject* @self.export.Name@::@i.Name@(PyObject * /*args*/, PyObject * /*kwds*/) = else: PyObject* @self.export.Name@::@i.Name@(PyObject * /*args*/) - { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.NumberProtocol): PyObject* @self.export.Name@::number_add_handler(PyObject *self, PyObject *other) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } PyObject* @self.export.Name@::number_subtract_handler(PyObject *self, PyObject *other) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } PyObject* @self.export.Name@::number_multiply_handler(PyObject *self, PyObject *other) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence): + if (self.export.Sequence.sq_length): Py_ssize_t @self.export.Name@::sequence_length(PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return -1; } - + if (self.export.Sequence.sq_concat): PyObject* @self.export.Name@::sequence_concat(PyObject *, PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence.sq_repeat): PyObject * @self.export.Name@::sequence_repeat(PyObject *, Py_ssize_t) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence.sq_item): PyObject * @self.export.Name@::sequence_item(PyObject *, Py_ssize_t) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence.sq_slice): PyObject * @self.export.Name@::sequence_slice(PyObject *, Py_ssize_t, Py_ssize_t) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence.sq_ass_item): int @self.export.Name@::sequence_ass_item(PyObject *, Py_ssize_t, PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return -1; } - + if (self.export.Sequence.sq_ass_slice): int @self.export.Name@::sequence_ass_slice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return -1; } - + if (self.export.Sequence.sq_contains): int @self.export.Name@::sequence_contains(PyObject *, PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return -1; } - + if (self.export.Sequence.sq_inplace_concat): PyObject* @self.export.Name@::sequence_inplace_concat(PyObject *, PyObject *) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + if (self.export.Sequence.sq_inplace_repeat): PyObject * @self.export.Name@::sequence_inplace_repeat(PyObject *, Py_ssize_t) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - - + if (self.export.RichCompare): PyObject* @self.export.Name@::richCompare(PyObject *v, PyObject *w, int op) { PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); return 0; } - + for i in self.export.Attribute: Py::@i.Parameter.Type@ @self.export.Name@::get@i.Name@(void) const { //return Py::@i.Parameter.Type@(); throw Py::AttributeError("Not yet implemented"); } + if (i.ReadOnly): = else: void @self.export.Name@::set@i.Name@(Py::@i.Parameter.Type@ /*arg*/) { throw Py::AttributeError("Not yet implemented"); } - - + if(self.export.CustomAttributes != None): PyObject *@self.export.Name@::getCustomAttributes(const char* /*attr*/) const { return 0; } int @self.export.Name@::setCustomAttributes(const char* /*attr*/, PyObject* /*obj*/) { return 0; } - """