diff --git a/cMake/FreeCAD_Helpers/SetupShibokenAndPyside.cmake b/cMake/FreeCAD_Helpers/SetupShibokenAndPyside.cmake index 7556a25a89..aca36bc439 100644 --- a/cMake/FreeCAD_Helpers/SetupShibokenAndPyside.cmake +++ b/cMake/FreeCAD_Helpers/SetupShibokenAndPyside.cmake @@ -45,9 +45,9 @@ macro(SetupShibokenAndPyside) if(NOT SHIBOKEN_INCLUDE_DIR) find_pip_package(Shiboken${SHIBOKEN_MAJOR_VERSION}) if (Shiboken${SHIBOKEN_MAJOR_VERSION}_FOUND) - set(Shiboken_INCLUDE_DIR ${Shiboken${SHIBOKEN_MAJOR_VERSION}_INCLUDE_DIRS}) - set(Shiboken_LIBRARY ${Shiboken${SHIBOKEN_MAJOR_VERSION}_LIBRARIES}) - set(Shiboken_FOUND TRUE) + set(SHIBOKEN_INCLUDE_DIR ${Shiboken${SHIBOKEN_MAJOR_VERSION}_INCLUDE_DIRS}) + set(SHIBOKEN_LIBRARY ${Shiboken${SHIBOKEN_MAJOR_VERSION}_LIBRARIES}) + set(SHIBOKEN_FOUND TRUE) endif() endif() @@ -60,9 +60,9 @@ macro(SetupShibokenAndPyside) if(NOT PYSIDE_INCLUDE_DIR) find_pip_package(PySide${PYSIDE_MAJOR_VERSION}) if (PySide${PYSIDE_MAJOR_VERSION}_FOUND) - set(PySide_INCLUDE_DIR ${PySide${PYSIDE_MAJOR_VERSION}_INCLUDE_DIRS}) - set(PySide_LIBRARY ${PySide${PYSIDE_MAJOR_VERSION}_LIBRARIES}) - set(PySide_FOUND TRUE) + set(PYSIDE_INCLUDE_DIR ${PySide${PYSIDE_MAJOR_VERSION}_INCLUDE_DIRS}) + set(PYSIDE_LIBRARY ${PySide${PYSIDE_MAJOR_VERSION}_LIBRARIES}) + set(PYSIDE_FOUND TRUE) endif() endif() @@ -192,9 +192,9 @@ macro(find_pip_package PACKAGE) endforeach() file(TO_NATIVE_PATH "${PIP_PACKAGE_LOCATION}/${PIP_PACKAGE_NAME}/include" INCLUDE_DIR) file(TO_NATIVE_PATH "${PIP_PACKAGE_LOCATION}/${PIP_PACKAGE_NAME}/lib" LIBRARY) - set(${PACKAGE}_INCLUDE_DIRS ${INCLUDE_DIR} PARENT_SCOPE) - set(${PACKAGE}_LIBRARIES ${LIBRARY} PARENT_SCOPE) - set(${PACKAGE}_FOUND ${LIBRARY} TRUE) + set(${PACKAGE}_INCLUDE_DIRS ${INCLUDE_DIR}) + set(${PACKAGE}_LIBRARIES ${LIBRARY}) + set(${PACKAGE}_FOUND TRUE) message(STATUS "Found pip-installed ${PACKAGE} in ${PIP_PACKAGE_LOCATION}/${PIP_PACKAGE_NAME}") endif() endmacro() diff --git a/src/Gui/PythonWrapper.cpp b/src/Gui/PythonWrapper.cpp index 412b56c47f..490932505a 100644 --- a/src/Gui/PythonWrapper.cpp +++ b/src/Gui/PythonWrapper.cpp @@ -354,6 +354,13 @@ private: ~WrapperManager() override = default; }; +static std::string formatModuleError(std::string name) +{ + std::string error = "Cannot load " + name + " module"; + PyErr_Print(); + return error; +} + template Py::Object qt_wrapInstance(qttype object, const std::string& className, @@ -363,10 +370,7 @@ Py::Object qt_wrapInstance(qttype object, { PyObject* module = PyImport_ImportModule(shiboken.c_str()); if (!module) { - std::string error = "Cannot load "; - error += shiboken; - error += " module"; - throw Py::Exception(PyExc_ImportError, error); + throw Py::Exception(PyExc_ImportError, formatModuleError(shiboken)); } Py::Module mainmod(module, true); @@ -377,10 +381,7 @@ Py::Object qt_wrapInstance(qttype object, module = PyImport_ImportModule(pyside.c_str()); if (!module) { - std::string error = "Cannot load "; - error += pyside; - error += " module"; - throw Py::Exception(PyExc_ImportError, error); + throw Py::Exception(PyExc_ImportError, formatModuleError(pyside)); } Py::Module qtmod(module); @@ -392,10 +393,7 @@ const char* qt_identifyType(QObject* ptr, const std::string& pyside) { PyObject* module = PyImport_ImportModule(pyside.c_str()); if (!module) { - std::string error = "Cannot load "; - error += pyside; - error += " module"; - throw Py::Exception(PyExc_ImportError, error); + throw Py::Exception(PyExc_ImportError, formatModuleError(pyside)); } Py::Module qtmod(module); @@ -415,10 +413,7 @@ void* qt_getCppPointer(const Py::Object& pyobject, const std::string& shiboken, // https://github.com/PySide/Shiboken/blob/master/shibokenmodule/typesystem_shiboken.xml PyObject* module = PyImport_ImportModule(shiboken.c_str()); if (!module) { - std::string error = "Cannot load "; - error += shiboken; - error += " module"; - throw Py::Exception(PyExc_ImportError, error); + throw Py::Exception(PyExc_ImportError, formatModuleError(shiboken)); } Py::Module mainmod(module, true); @@ -452,9 +447,10 @@ PyTypeObject *getPyTypeObjectForTypeName() } template -qttype* qt_getCppType(PyObject* pyobj) +qttype* qt_getCppType(PyObject* pyobj, const std::string& shiboken) { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) + Q_UNUSED(shiboken) PyTypeObject * type = getPyTypeObjectForTypeName(); if (type) { if (Shiboken::Object::checkType(pyobj)) { @@ -464,7 +460,9 @@ qttype* qt_getCppType(PyObject* pyobj) } } #else - Q_UNUSED(pyobj) + void* ptr = qt_getCppPointer(Py::asObject(pyobj), shiboken, "getCppPointer"); + if (ptr) + return reinterpret_cast(ptr); #endif return nullptr; @@ -536,30 +534,12 @@ bool PythonWrapper::toCString(const Py::Object& pyobject, std::string& str) QObject* PythonWrapper::toQObject(const Py::Object& pyobject) { - // http://pastebin.com/JByDAF5Z -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - return qt_getCppType(pyobject.ptr()); -#else - // Access shiboken/PySide via Python - // - void* ptr = qt_getCppPointer(pyobject, shiboken, "getCppPointer"); - return static_cast(ptr); -#endif - - return nullptr; + return qt_getCppType(pyobject.ptr(), shiboken); } QGraphicsItem* PythonWrapper::toQGraphicsItem(PyObject* pyPtr) { -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - return qt_getCppType(pyPtr); -#else - // Access shiboken/PySide via Python - // - void* ptr = qt_getCppPointer(Py::asObject(pyPtr), shiboken, "getCppPointer"); - return static_cast(ptr); -#endif - return nullptr; + return qt_getCppType(pyPtr, shiboken); } QGraphicsItem* PythonWrapper::toQGraphicsItem(const Py::Object& pyobject) @@ -569,15 +549,7 @@ QGraphicsItem* PythonWrapper::toQGraphicsItem(const Py::Object& pyobject) QGraphicsObject* PythonWrapper::toQGraphicsObject(PyObject* pyPtr) { -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - return qt_getCppType(pyPtr); -#else - // Access shiboken/PySide via Python - // - void* ptr = qt_getCppPointer(Py::asObject(pyPtr), shiboken, "getCppPointer"); - return reinterpret_cast(ptr); -#endif - return nullptr; + return qt_getCppType(pyPtr, shiboken); } QGraphicsObject* PythonWrapper::toQGraphicsObject(const Py::Object& pyobject) @@ -608,12 +580,7 @@ Py::Object PythonWrapper::fromQImage(const QImage& img) QImage *PythonWrapper::toQImage(PyObject *pyobj) { -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - return qt_getCppType(pyobj); -#else - Q_UNUSED(pyobj); -#endif - return nullptr; + return qt_getCppType(pyobj, shiboken); } Py::Object PythonWrapper::fromQIcon(const QIcon* icon) @@ -639,12 +606,7 @@ Py::Object PythonWrapper::fromQIcon(const QIcon* icon) QIcon *PythonWrapper::toQIcon(PyObject *pyobj) { -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - return qt_getCppType(pyobj); -#else - Q_UNUSED(pyobj); -#endif - return nullptr; + return qt_getCppType(pyobj, shiboken); } Py::Object PythonWrapper::fromQDir(const QDir& dir) @@ -668,12 +630,7 @@ Py::Object PythonWrapper::fromQDir(const QDir& dir) QDir* PythonWrapper::toQDir(PyObject* pyobj) { -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - return qt_getCppType(pyobj); -#else - Q_UNUSED(pyobj); -#endif - return nullptr; + return qt_getCppType(pyobj, shiboken); } Py::Object PythonWrapper::fromQPrinter(QPrinter* printer)