itom 1.0.14
D:/git-itom/sources/itom/Qitom/python/pythonQtConversion.h
00001 /* ********************************************************************
00002     itom software
00003     URL: http://www.uni-stuttgart.de/ito
00004     Copyright (C) 2013, Institut für Technische Optik (ITO),
00005     Universität 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 PYTHONQTCONVERSION_H
00024 #define PYTHONQTCONVERSION_H
00025 
00026 //python
00027 // see http://vtk.org/gitweb?p=VTK.git;a=commitdiff;h=7f3f750596a105d48ea84ebfe1b1c4ca03e0bab3
00028 #ifdef _DEBUG
00029     #undef _DEBUG
00030     #if (defined linux) | (defined CMAKE)
00031         #include "Python.h"
00032     #else
00033         #include "Python.h"
00034     #endif
00035     #define _DEBUG
00036 #else
00037 #ifdef linux
00038     #include "Python.h"
00039 #else
00040     #include "Python.h"
00041 #endif
00042 #endif
00043 
00044 #include "pythonDataObject.h"
00045 #include "pythonPlugins.h"
00046 #include "pythonRegion.h"
00047 
00048 #include "pythonPCL.h"
00049 
00050 #include "../global.h"
00051 
00052 #include "opencv/cv.h"
00053 #include <qvariant.h>
00054 #include <qmetaobject.h>
00055 #include <qlist.h>
00056 #include <qbytearray.h>
00057 #include <qpointer.h>
00058 
00059 #if ITOM_POINTCLOUDLIBRARY > 0
00060 Q_DECLARE_METATYPE(ito::PCLPointCloud)
00061 Q_DECLARE_METATYPE(ito::PCLPoint)
00062 Q_DECLARE_METATYPE(ito::PCLPolygonMesh)
00063 #endif
00064 
00065 Q_DECLARE_METATYPE(QSharedPointer<ito::DataObject>)
00066 Q_DECLARE_METATYPE(QPointer<ito::AddInDataIO>)
00067 Q_DECLARE_METATYPE(QPointer<ito::AddInActuator>)
00068 
00069 class PythonQtConversion
00070 {
00071 public:
00072     enum unicodeEncodings { utf_8, latin_1, iso_8859_1, mbcs, ascii, utf_16, utf_16_LE, utf_16_BE, utf_32, utf_32_BE, utf_32_LE, other };
00073 
00075     static PyObject* QStringToPyObject(const QString& str);
00076 
00078     static PyObject* QStringListToPyObject(const QStringList& list);
00079 
00081     static PyObject* QStringListToPyList(const QStringList& list);
00082 
00084     static QString PyObjGetRepresentation(PyObject* val);
00085 
00087     static QString PyObjGetString(PyObject* val) { bool ok; QString s = PyObjGetString(val, false, ok); return s; }
00089     static QString PyObjGetString(PyObject* val, bool strict, bool &ok);
00091     static QByteArray PyObjGetBytes(PyObject* val, bool strict, bool &ok);
00093     static int     PyObjGetInt(PyObject* val, bool strict, bool &ok);
00095     static qint64  PyObjGetLongLong(PyObject* val, bool strict, bool &ok);
00097     static quint64  PyObjGetULongLong(PyObject* val, bool strict, bool &ok);
00099     static double  PyObjGetDouble(PyObject* val, bool strict, bool &ok);
00101     static QVector<double>  PyObjGetDoubleArray(PyObject* val, bool strict, bool &ok);
00103     static QVector<int>  PyObjGetIntArray(PyObject* val, bool strict, bool &ok);
00105     static bool    PyObjGetBool(PyObject* val, bool strict, bool &ok);
00106 
00107 #if ITOM_POINTCLOUDLIBRARY > 0
00108     static ito::PCLPointCloud PyObjGetPointCloud(PyObject *val, bool strict, bool &ok);
00109     static ito::PCLPoint PyObjGetPoint(PyObject *val, bool strict, bool &ok);
00110     static ito::PCLPolygonMesh PyObjGetPolygonMesh(PyObject *val, bool strict, bool &ok);
00111 
00112     
00113     static ito::PCLPointCloud* PyObjGetPointCloudNewPtr(PyObject *val, bool strict, bool &ok);
00114     static ito::PCLPolygonMesh* PyObjGetPolygonMeshNewPtr(PyObject *val, bool strict, bool &ok);
00115 #endif
00116 
00117         static ito::DataObject* PyObjGetDataObjectNewPtr(PyObject *val, bool strict, bool &ok);
00118 
00119     static QSharedPointer<ito::DataObject> PyObjGetSharedDataObject(PyObject *val, bool &ok); //is always strict, only dataobjects are allowed
00120 
00122     static QStringList PyObjToStringList(PyObject* val, bool strict, bool& ok);
00123 
00124 
00127     static QVariant PyObjToQVariant(PyObject* val, int type = -1);
00128 
00129         static QVariant QVariantCast(const QVariant &item, QVariant::Type destType, bool &ok);
00130 
00133     static bool PyObjToVoidPtr(PyObject* val, void **retPtr, int *retType, int type = -1);
00134 
00136     static PyObject* GetPyBool(bool val);
00137     static PyObject* QVariantToPyObject(const QVariant& v);
00138 
00139     static PyObject* QVariantMapToPyObject(const QVariantMap& m);
00140     static PyObject* QVariantListToPyObject(const QVariantList& l);
00141 
00142 #if ITOM_POINTCLOUDLIBRARY > 0
00143     static PyObject* PCLPointCloudToPyObject(const ito::PCLPointCloud& c);
00144     static PyObject* PCLPointToPyObject(const ito::PCLPoint& c);
00145     static PyObject* PCLPolygonMeshToPyObject(const ito::PCLPolygonMesh& c);
00146 #endif
00147 
00148     static PyObject* DataObjectToPyObject(const ito::DataObject& dObj);
00149 
00150     static PyObject* ConvertQtValueToPythonInternal(int type, const void* data); 
00151     static PyObject* convertPyObjectToQVariant(PyObject *argument, QVariant &qVarArg);
00152 
00153     static PyObject* QByteArrayToPyUnicode(const QByteArray &ba, const char *errors = "replace");
00154     static PyObject* QByteArrayToPyUnicodeSecure(const QByteArray &ba, const char *errors = "replace");
00155     static PyObject* ByteArrayToPyUnicode(const char* byteArray, Py_ssize_t len = 0, const char *errors = "replace");
00156 
00157     static PyObject* PyUnicodeToPyByteObject(PyObject *unicode, const char *errors = "replace");
00158 
00159     friend class PythonEngine; //such that the pythonEngine can set the encoding values below
00160 
00161 private:
00162     static unicodeEncodings textEncoding;
00163     static QByteArray textEncodingName;
00164 
00169     static QHash<void*,PyObject*> m_pyBaseObjectStorage; 
00170     static void baseObjectDeleterDataObject(ito::DataObject *sharedObject)
00171     {
00172         QHash<void*,PyObject*>::iterator i = m_pyBaseObjectStorage.find((void*)sharedObject);
00173         if(i != m_pyBaseObjectStorage.end())
00174         {
00175             Py_XDECREF(i.value());
00176             m_pyBaseObjectStorage.erase(i);
00177         }
00178 
00179         delete sharedObject;
00180     }
00181 };
00182 
00183 #endif
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends