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