Skip to content

Commit

Permalink
[TD]add Python QGraphicsObject to Page
Browse files Browse the repository at this point in the history
  • Loading branch information
WandererFan committed May 8, 2022
1 parent ad64c57 commit ccad0fa
Showing 1 changed file with 52 additions and 1 deletion.
53 changes: 52 additions & 1 deletion src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp
Expand Up @@ -77,6 +77,9 @@ class Module : public Py::ExtensionModule<Module>
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() {}
Expand Down Expand Up @@ -362,7 +365,55 @@ class Module : public Py::ExtensionModule<Module>

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))) {

This comment has been minimized.

Copy link
@marioalexis84

marioalexis84 May 9, 2022

Member

Why not check the type directly in PyArg_ParseTuple?

This comment has been minimized.

Copy link
@WandererFan

WandererFan via email May 10, 2022

Author Contributor
obj = static_cast<App::DocumentObjectPy*>(viewPy)->getDocumentObjectPtr();
vp = Gui::Application::Instance->getViewProvider(obj);
if (vp) {
TechDrawGui::ViewProviderDrawingView* vpdv =
dynamic_cast<TechDrawGui::ViewProviderDrawingView*>(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");

This comment has been minimized.

Copy link
@marioalexis84

marioalexis84 May 9, 2022

Member

The error set by PyErr_SetString (apart from not currently throwing any exceptions) might not be properly handled by propagation when executing Py::None(), so throwing with Py::RuntimeError should be preferable.

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()
{
Expand Down

0 comments on commit ccad0fa

Please sign in to comment.