From ccad0fac9058b4e9a38649535fa0fb468c705b01 Mon Sep 17 00:00:00 2001 From: Wanderer Fan Date: Sat, 7 May 2022 15:25:17 -0400 Subject: [PATCH] [TD]add Python QGraphicsObject to Page --- src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp | 53 ++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp b/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp index 722d9154b9e9..85dd5f9acb14 100644 --- a/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp +++ b/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp @@ -77,6 +77,9 @@ class Module : public Py::ExtensionModule add_varargs_method("addQGIToView",&Module::addQGIToView, "addQGIToView(View, QGraphicsItem) -- insert graphics item into view's graphic." ); + add_varargs_method("addQGObjToView", &Module::addQGObjToView, + "addQGObjToView(View, QGraphicsObject) -- insert graphics object into view's graphic. Use for QGraphicsItems that have QGraphicsObject as base class." + ); initialize("This is a module for displaying drawings"); // register with Python } virtual ~Module() {} @@ -362,7 +365,55 @@ class Module : public Py::ExtensionModule return Py::None(); } - }; + + +//!use addQGObjToView for QGraphics items like QGraphicsSvgItem or QGraphicsTextItem that are +//! derived from QGraphicsObject + Py::Object addQGObjToView(const Py::Tuple& args) + { + PyObject *viewPy = nullptr; + PyObject *qgiPy = nullptr; + if (!PyArg_ParseTuple(args.ptr(), "OO", &viewPy, &qgiPy)) { + throw Py::TypeError("expected (view, item)"); + } + + try { + App::DocumentObject* obj = nullptr; + Gui::ViewProvider* vp = nullptr; + QGIView* qgiv = nullptr; + if (PyObject_TypeCheck(viewPy, &(TechDraw::DrawViewPy::Type))) { + obj = static_cast(viewPy)->getDocumentObjectPtr(); + vp = Gui::Application::Instance->getViewProvider(obj); + if (vp) { + TechDrawGui::ViewProviderDrawingView* vpdv = + dynamic_cast(vp); + if (vpdv) { + qgiv = vpdv->getQView(); + if (qgiv != nullptr) { + Gui::PythonWrapper wrap; + if (!wrap.loadCoreModule() || + !wrap.loadGuiModule() || + !wrap.loadWidgetsModule()) { + PyErr_SetString(PyExc_RuntimeError, "Failed to load Python wrapper for Qt"); + return Py::None(); + } + QGraphicsObject* item = wrap.toQGraphicsObject(qgiPy); + if (item != nullptr) { + qgiv->addArbitraryItem(item); + } + } + } + } + } + } + catch (Base::Exception &e) { + e.setPyException(); + throw Py::Exception(); + } + + return Py::None(); + } +}; PyObject* initModule() {