itom 1.4.0
D:/git-itom/sources/itom/Qitom/python/pythonDataObject.h
00001 /* ********************************************************************
00002     itom software
00003     URL: http://www.uni-stuttgart.de/ito
00004     Copyright (C) 2013, Institut fuer Technische Optik (ITO),
00005     Universitaet Stuttgart, Germany
00006 
00007     This file is part of itom.
00008   
00009     itom is free software; you can redistribute it and/or modify it
00010     under the terms of the GNU Library General Public Licence as published by
00011     the Free Software Foundation; either version 2 of the Licence, or (at
00012     your option) any later version.
00013 
00014     itom is distributed in the hope that it will be useful, but
00015     WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library
00017     General Public Licence for more details.
00018 
00019     You should have received a copy of the GNU Library General Public License
00020     along with itom. If not, see <http://www.gnu.org/licenses/>.
00021 *********************************************************************** */
00022 
00023 #ifndef PYTHONDATAOBJECT
00024 #define PYTHONDATAOBJECT
00025 
00026 /* includes */
00027 #include <string>
00028 
00029 #ifndef ITOM_NPDATAOBJECT
00030     #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION //see comment in pythonNpDataObject.cpp
00031 #endif
00032 
00033 #ifndef Q_MOC_RUN
00034     #define PY_ARRAY_UNIQUE_SYMBOL itom_ARRAY_API //see numpy help ::array api :: Miscellaneous :: Importing the api (this line must before including global.h)
00035     #define NO_IMPORT_ARRAY
00036 
00037     //#define NPY_NO_DEPRECATED_API 0x00000007 //see comment in pythonNpDataObject.cpp
00038     //python
00039     // see http://vtk.org/gitweb?p=VTK.git;a=commitdiff;h=7f3f750596a105d48ea84ebfe1b1c4ca03e0bab3
00040     #if (defined _DEBUG) && (!defined linux)
00041         #undef _DEBUG
00042         #if (defined linux) | (defined CMAKE)
00043             #include "Python.h"
00044             #include "numpy/arrayobject.h"
00045         #else
00046             #include "Python.h"
00047             #include "../Lib/site-packages/numpy/core/include/numpy/arrayobject.h" //for numpy arrays
00048         #endif
00049         #define _DEBUG
00050     #else
00051         #ifdef linux
00052             #include "Python.h"
00053             #include "numpy/arrayobject.h"
00054         #else
00055             #include "Python.h"
00056             #include "../Lib/site-packages/numpy/core/include/numpy/arrayobject.h" //for numpy arrays
00057         #endif
00058     #endif
00059 #endif
00060 
00061 #include "../../DataObject/dataobj.h"
00062 //#include <qobject.h>
00063 
00064 namespace ito 
00065 {
00066 class PythonDataObject
00067 {
00068     public:
00069         //-------------------------------------------------------------------------------------------------
00070         // typedefs
00071         //------------------------------------------------------------------------------------------------- 
00072         typedef struct
00073         {
00074             PyObject_HEAD
00075             DataObject* dataObject;
00076             PyObject* base;
00077         }
00078         PyDataObject;
00079 
00080         typedef struct
00081         {
00082             char *name;
00083             int typeno;
00084         }
00085         PyDataObjectTypes;
00086 
00087         #define PyDataObject_Check(op) PyObject_TypeCheck(op, &PythonDataObject::PyDataObjectType)
00088 
00089         static inline void PyDataObject_SetBase( PyDataObject *op, PyObject *base )
00090         {
00091             PyObject* x = op->base; 
00092             Py_XINCREF(base); 
00093             op->base = base; 
00094             Py_XDECREF(x);
00095         }
00096         
00097         //-------------------------------------------------------------------------------------------------
00098         // constructor, deconstructor, alloc, dellaoc
00099         //------------------------------------------------------------------------------------------------- 
00100 
00101         static void PyDataObject_dealloc(PyDataObject *self);
00102         static PyObject *PyDataObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
00103         static int PyDataObject_init(PyDataObject *self, PyObject *args, PyObject *kwds);
00104 
00105         static int copyNpDataObjTags2DataObj(PyObject* npDataObject, DataObject* dataObj);
00106 #if ITOM_NPDATAOBJECT //parsePyObject2StdString is deprecated and only used in old npDataObject. Replace it by PythonQtConversion::PyObjToStdString
00107         static int parsePyObject2StdString(PyObject* pyObj, std::string &str);
00108 #endif
00109 
00110         //-------------------------------------------------------------------------------------------------
00111         // general members
00112         //------------------------------------------------------------------------------------------------- 
00113         static PyObject *PyDataObject_name(PyDataObject *self);
00114 
00115         static PyObject* PyDataObject_repr(PyDataObject *self);
00116 
00117         static PyObject* PyDataObject_data(PyDataObject *self);
00118         static PyObject* PyDataObject_conj(PyDataObject *self);
00119         static PyObject* PyDataObject_conjugate(PyDataObject *self);
00120         static PyObject* PyDataObject_adj(PyDataObject *self);
00121         static PyObject* PyDataObject_adjugate(PyDataObject *self);
00122         static PyObject* PyDataObject_trans(PyDataObject *self);
00123         static PyObject* PyDataObject_copy(PyDataObject *self, PyObject* args);
00124         static PyObject* PyDataObject_astype(PyDataObject *self, PyObject* args, PyObject* kwds);
00125         static PyObject* PyDataObject_normalize(PyDataObject *self, PyObject* args, PyObject* kwds);
00126         static PyObject* PyDataObject_size(PyDataObject *self, PyObject* args);
00127         static PyObject* PyDataObject_makeContinuous(PyDataObject *self);
00128         static PyObject* PyDataObject_locateROI(PyDataObject *self);
00129         static PyObject* PyDataObject_adjustROI(PyDataObject *self, PyObject* args);
00130         static PyObject* PyDataObject_squeeze(PyDataObject *self, PyObject* args);
00131 
00132         static PyObject* PyDataObject_mul(PyDataObject *self, PyObject *args);
00133         static PyObject* PyDataObject_div(PyDataObject *self, PyObject *args);
00134 
00135         static PyObject* PyDataObject_reshape(PyDataObject *self, PyObject *args);
00136     
00137         // Get / Set metadata / objecttags
00138         static PyObject* PyDataObj_SetAxisOffset(PyDataObject *self, PyObject *args);
00139         static PyObject* PyDataObj_SetAxisScale(PyDataObject *self, PyObject *args);
00140         static PyObject* PyDataObj_SetAxisDescription(PyDataObject *self, PyObject *args);
00141         static PyObject* PyDataObj_SetAxisUnit(PyDataObject *self, PyObject *args);
00142 
00143         static PyObject* PyDataObj_SetTag(PyDataObject *self, PyObject *args);
00144         static PyObject* PyDataObj_DeleteTag(PyDataObject *self, PyObject *args);
00145         static PyObject* PyDataObj_TagExists(PyDataObject *self, PyObject *args);
00146         static PyObject* PyDataObj_GetTagListSize(PyDataObject *self);
00147         static PyObject* PyDataObj_AddToProtocol(PyDataObject *self, PyObject *args);
00148 
00149         // end tags
00150 
00151         static PyObject* PyDataObject_RichCompare(PyDataObject *self, PyObject *other, int cmp_op);
00152 
00153         static PyGetSetDef PyDataObject_getseters[];
00154         static PyObject* PyDataObj_GetDims(PyDataObject *self, void *closure);
00155         static PyObject* PyDataObj_GetType(PyDataObject *self, void *closure);
00156         static PyObject* PyDataObj_GetShape(PyDataObject *self, void *closure);
00157         static PyObject* PyDataObj_GetContinuous(PyDataObject *self, void *closure);
00158 
00159         static PyObject* PyDataObject_getTagDict(PyDataObject *self, void *clousure);
00160 
00161         static PyObject* PyDataObject_getTags(PyDataObject *self, void *closure);
00162         static int PyDataObject_setTags(PyDataObject *self, PyObject *value, void *closure);
00163         static PyObject* PyDataObject_getAxisScales(PyDataObject *self, void *closure);
00164         static int PyDataObject_setAxisScales(PyDataObject *self, PyObject *value, void *closure);
00165         static PyObject* PyDataObject_getAxisOffsets(PyDataObject *self, void *closure);
00166         static int PyDataObject_setAxisOffsets(PyDataObject *self, PyObject *value, void *closure);
00167         static PyObject* PyDataObject_getAxisDescriptions(PyDataObject *self, void *closure);
00168         static int PyDataObject_setAxisDescriptions(PyDataObject *self, PyObject *value, void *closure);
00169         static PyObject* PyDataObject_getAxisUnits(PyDataObject *self, void *closure);
00170         static int PyDataObject_setAxisUnits(PyDataObject *self, PyObject *value, void *closure);
00171         static PyObject* PyDataObject_getValueUnit(PyDataObject *self, void *closure);
00172         static int PyDataObject_setValueUnit(PyDataObject *self, PyObject *value, void *closure);
00173         static PyObject* PyDataObject_getValueDescription(PyDataObject *self, void *closure);
00174         static int PyDataObject_setValueDescription(PyDataObject *self, PyObject *value, void *closure);
00175         static PyObject* PyDataObject_getValueScale(PyDataObject *self, void *closure);
00176         static PyObject* PyDataObject_getValueOffset(PyDataObject *self, void *closure);
00177         
00178         static int PyDataObject_setXYRotationalMatrix(PyDataObject *self, PyObject *value, void *closure);        
00179         static PyObject* PyDataObject_getXYRotationalMatrix(PyDataObject *self, void *closure);
00180 
00181         static PyObject* PyDataObject_getValue(PyDataObject *self, void *closure);
00182         static int PyDataObject_setValue(PyDataObject *self, PyObject *value, void *closure);
00183 
00184         static PyObject* PyDataObj_Array_StructGet(PyDataObject *self);
00185         static PyObject* PyDataObj_Array_Interface(PyDataObject *self);
00186         static PyObject* PyDataObj_Array_(PyDataObject *self, PyObject *args);
00187 
00188         static PyObject* PyDataObject_abs(PyDataObject *self);
00189         static PyObject* PyDataObject_arg(PyDataObject *self);
00190         static PyObject* PyDataObject_real(PyDataObject *self);
00191         static PyObject* PyDataObject_imag(PyDataObject *self);
00192 
00193         static PyObject* PyDataObj_ToGray(PyDataObject *self, PyObject *args, PyObject *kwds);
00194 
00195         static PyObject* PyDataObj_ToList(PyDataObject *self);
00196         static PyObject* PyDataObj_At(ito::DataObject *dataObj, unsigned int *idx);
00197         static PyObject* PyDataObj_At(ito::DataObject *dataObj, int continuousIdx);
00198         static PyObject* PyDataObj_ToListRecursive(ito::DataObject *dataObj, unsigned int *currentIdx, int iterationIndex);
00199 
00200 
00201         static void PyDataObj_Capsule_Destructor(PyObject* capsule); //called if capsule (dataObject exported by __array__struct_) is destroyed
00202 
00203         static PyObject* PyDataObj_Reduce(PyDataObject *self, PyObject *args);
00204         static PyObject* PyDataObj_SetState(PyDataObject *self, PyObject *args);
00205 
00206         //-------------------------------------------------------------------------------------------------
00207         // number protocol
00208         //
00209         // python note: Binary and ternary functions must check the type of all their operands, and implement 
00210         //    the necessary conversions (at least one of the operands is an instance of the defined type). 
00211         //    If the operation is not defined for the given operands, binary and ternary functions must return 
00212         //    Py_NotImplemented, if another error occurred they must return NULL and set an exception.
00213         //------------------------------------------------------------------------------------------------- 
00214         static PyObject* PyDataObj_nbAdd(PyObject* o1, PyObject* o2);
00215         static PyObject* PyDataObj_nbSubtract(PyObject* o1, PyObject* o2);
00216         static PyObject* PyDataObj_nbMultiply(PyObject* o1, PyObject* o2);
00217         static PyObject* PyDataObj_nbDivide(PyObject* o1, PyObject* o2);
00218         static PyObject* PyDataObj_nbRemainder(PyObject* o1, PyObject* o2);
00219         static PyObject* PyDataObj_nbDivmod(PyObject* o1, PyObject* o2);
00220         static PyObject* PyDataObj_nbPower(PyObject* o1, PyObject* o2, PyObject* o3);
00221         static PyObject* PyDataObj_nbNegative(PyObject* o1);
00222         static PyObject* PyDataObj_nbPositive(PyObject* o1);
00223         static PyObject* PyDataObj_nbAbsolute(PyObject* o1);
00224         static PyObject* PyDataObj_nbInvert(PyObject* o1);
00225         static PyObject* PyDataObj_nbLshift(PyObject* o1, PyObject* o2);
00226         static PyObject* PyDataObj_nbRshift(PyObject* o1, PyObject* o2);
00227         static PyObject* PyDataObj_nbAnd(PyObject* o1, PyObject* o2);
00228         static PyObject* PyDataObj_nbXor(PyObject* o1, PyObject* o2);
00229         static PyObject* PyDataObj_nbOr(PyObject* o1, PyObject* o2);
00230 
00231         static PyObject* PyDataObj_nbInplaceAdd(PyObject* o1, PyObject* o2);
00232         static PyObject* PyDataObj_nbInplaceSubtract(PyObject* o1, PyObject* o2);
00233         static PyObject* PyDataObj_nbInplaceMultiply(PyObject* o1, PyObject* o2);
00234         static PyObject* PyDataObj_nbInplaceRemainder(PyObject* o1, PyObject* o2);
00235         static PyObject* PyDataObj_nbInplacePower(PyObject* o1, PyObject* o2, PyObject* o3);
00236         static PyObject* PyDataObj_nbInplaceLshift(PyObject* o1, PyObject* o2);
00237         static PyObject* PyDataObj_nbInplaceRshift(PyObject* o1, PyObject* o2);
00238         static PyObject* PyDataObj_nbInplaceAnd(PyObject* o1, PyObject* o2);
00239         static PyObject* PyDataObj_nbInplaceXor(PyObject* o1, PyObject* o2);
00240         static PyObject* PyDataObj_nbInplaceOr(PyObject* o1, PyObject* o2);
00241         static PyObject* PyDataObj_nbInplaceTrueDivide(PyObject* o1, PyObject* o2);
00242 
00243         //-------------------------------------------------------------------------------------------------
00244         // iterator protocol
00245         //-------------------------------------------------------------------------------------------------
00246         static PyObject* PyDataObj_getiter(PyDataObject* self); //getiterfunc tp_iter;
00247 
00248         //-------------------------------------------------------------------------------------------------
00249         // mapping protocol
00250         //------------------------------------------------------------------------------------------------- 
00251         static int PyDataObj_mappingLength(PyDataObject* self);
00252         static PyObject* PyDataObj_mappingGetElem(PyDataObject* self, PyObject* key);
00253         static int PyDataObj_mappingSetElem(PyDataObject* self, PyObject* key, PyObject* value);
00254 
00255         //-------------------------------------------------------------------------------------------------
00256         // type structures
00257         //------------------------------------------------------------------------------------------------- 
00258         static PyMemberDef PyDataObject_members[];
00259         static PyMethodDef PyDataObject_methods[];
00260         static PyTypeObject PyDataObjectType;
00261         static PyModuleDef PyDataObjectModule;
00262 
00263         static PyNumberMethods PyDataObject_numberProtocol;
00264         static PyMappingMethods PyDataObject_mappingProtocol;
00265 
00266         //-------------------------------------------------------------------------------------------------
00267         // helper methods
00268         //-------------------------------------------------------------------------------------------------    
00269         static RetVal PyDataObj_ParseCreateArgs(PyObject *args, PyObject *kwds, int &typeno, std::vector<unsigned int> &dims, unsigned char &continuous);
00270 
00271         static PyDataObjectTypes PyDataObject_types[];
00272         static int typeNameToNumber(const char *name);
00273         static char* typeNumberToName(int typeno);
00274 
00275         static PyDataObject* createEmptyPyDataObject();
00276 
00277         static bool checkPyDataObject(int number, PyObject* o1 = NULL, PyObject* o2 = NULL, PyObject* o3 = NULL);
00278 
00279         static RetVal parseTypeNumber(int typeno, char &typekind, int &itemsize);
00280         static int parseTypeNumberInverse(char typekind, int itemsize);
00281         static int getTypenumOfCompatibleType(char typekind, int itemsize);
00282 
00283         //-------------------------------------------------------------------------------------------------
00284         // static type methods
00285         //-------------------------------------------------------------------------------------------------
00286         //static PyObject* PyDataObj_StaticArange(PyDataObject *self, PyObject *args);
00287         static PyObject* PyDataObj_StaticZeros(PyObject *self, PyObject *args, PyObject *kwds);
00288         static PyObject* PyDataObj_StaticOnes(PyObject *self, PyObject *args, PyObject *kwds);
00289         static PyObject* PyDataObj_StaticRand(PyObject *self, PyObject *args, PyObject *kwds);
00290         static PyObject* PyDataObj_StaticRandN(PyObject *self, PyObject *args, PyObject *kwds);
00291         static PyObject* PyDataObj_StaticEye(PyObject *self, PyObject *args /*, PyObject *kwds*/);
00292 
00293 
00294         //#################################################################################################
00295         // ITERATOR METHODS
00296         //#################################################################################################
00297 
00298         typedef struct
00299         {
00300             PyObject_HEAD
00301             ito::DObjConstIterator it;
00302             ito::DObjConstIterator itEnd;
00303             Py_ssize_t len;
00304             PyObject* base;
00305         }
00306         PyDataObjectIter;
00307 
00308         //-------------------------------------------------------------------------------------------------
00309         // constructor, deconstructor, alloc, dellaoc
00310         //------------------------------------------------------------------------------------------------- 
00311 
00312         static void PyDataObjectIter_dealloc(PyDataObjectIter *self);
00313         static PyObject *PyDataObjectIter_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
00314         static int PyDataObjectIter_init(PyDataObjectIter *self, PyObject *args, PyObject *kwds);
00315 
00316         static PyObject* PyDataObjectIter_iternext(PyDataObjectIter* self);
00317         static PyObject* PyDataObjectIter_len(PyDataObjectIter* self);
00318 
00319         //-------------------------------------------------------------------------------------------------
00320         // type structures
00321         //------------------------------------------------------------------------------------------------- 
00322         static PyMethodDef PyDataObjectIter_methods[];
00323         static PyTypeObject PyDataObjectIterType;
00324 };
00325 
00326 } //end namespace ito
00327 
00328 #endif
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends