From 303335e8af6243963ee70257a68e0f0b204cc89b Mon Sep 17 00:00:00 2001 From: wandererfan Date: Wed, 11 Mar 2020 16:25:51 -0400 Subject: [PATCH] [TD]accept QGraphicsItem from Python --- src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp | 52 ++++++++++++++++++++++- src/Mod/TechDraw/Gui/QGIView.cpp | 9 ++++ src/Mod/TechDraw/Gui/QGIView.h | 4 +- 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp b/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp index 2662e9f0e4..c15f0ec13c 100644 --- a/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp +++ b/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp @@ -45,14 +45,17 @@ #include #include #include - +#include //for PythonWrappers #include #include +#include #include +#include // generated from DrawViewPy.xml #include "MDIViewPage.h" #include "ViewProviderPage.h" +#include "ViewProviderDrawingView.h" #include "Grabber3d.h" namespace TechDrawGui { @@ -74,6 +77,9 @@ public: add_varargs_method("copyActiveViewToSvgFile",&Module::copyActiveViewToSvgFile, "copyActiveViewToSvgFile(DrawPageObject,FilePath) -- copy ActiveView to Svg file." ); + add_varargs_method("addQGIToView",&Module::addQGIToView, + "addQGIToView(View, QGraphicsItem) -- insert graphics item into view's graphic." + ); initialize("This is a module for displaying drawings"); // register with Python } virtual ~Module() {} @@ -303,6 +309,50 @@ private: pyResult = PyFloat_FromDouble(result); return Py::asObject(pyResult); } + + Py::Object addQGIToView(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 = 0; + Gui::ViewProvider* vp = 0; + 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(); + } + QGraphicsItem* item = wrap.toQGraphicsItem(qgiPy); + if (item != nullptr) { + qgiv->addArbitraryItem(item); + } + } + } + } + } + } + catch (Base::Exception &e) { + throw Py::Exception(Base::BaseExceptionFreeCADError, e.what()); + } + + return Py::None(); + } }; PyObject* initModule() diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index 78bb7d54dc..4576e36c2d 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -656,6 +656,15 @@ bool QGIView::getFrameState(void) return result; } +void QGIView::addArbitraryItem(QGraphicsItem* qgi) +{ + if (qgi != nullptr) { +// m_randomItems.push_back(qgi); + addToGroup(qgi); + qgi->show(); + } +} + //TODO: change name to prefNormalColor() QColor QGIView::getNormalColor() { diff --git a/src/Mod/TechDraw/Gui/QGIView.h b/src/Mod/TechDraw/Gui/QGIView.h index 9d7ba264d7..ac8faff4ef 100644 --- a/src/Mod/TechDraw/Gui/QGIView.h +++ b/src/Mod/TechDraw/Gui/QGIView.h @@ -124,6 +124,8 @@ public: MDIViewPage* getMDIViewPage(void) const; virtual void removeChild(QGIView* child); + virtual void addArbitraryItem(QGraphicsItem* qgi); + // Mouse handling virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override; boost::signals2::signal signalSelectPoint; @@ -174,7 +176,7 @@ protected: double m_lockWidth; double m_lockHeight; -/* int m_selectState;*/ +// std::vector m_randomItems; }; } // namespace