diff --git a/src/Gui/CMakeLists.txt b/src/Gui/CMakeLists.txt index f44397e7c3..344a249882 100644 --- a/src/Gui/CMakeLists.txt +++ b/src/Gui/CMakeLists.txt @@ -224,6 +224,7 @@ generate_from_xml(DocumentPy) generate_from_xml(PythonWorkbenchPy) generate_from_xml(ViewProviderPy) generate_from_xml(ViewProviderDocumentObjectPy) +generate_from_xml(ViewProviderExtensionPy) generate_from_xml(WorkbenchPy) generate_from_xml(SelectionObjectPy) generate_from_xml(LinkViewPy) @@ -237,6 +238,7 @@ generate_from_py(FreeCADGuiInit GuiInitScript.h) SET(FreeCADGui_XML_SRCS ViewProviderDocumentObjectPy.xml ViewProviderPy.xml + ViewProviderExtensionPy.xml PythonWorkbenchPy.xml WorkbenchPy.xml SelectionObjectPy.xml @@ -1004,6 +1006,7 @@ SOURCE_GROUP("Quarter" FILES ${Quarter_SRCS}) SET(Viewprovider_CPP_SRCS ViewProvider.cpp ViewProviderExtension.cpp + ViewProviderExtensionPyImp.cpp ViewProviderGroupExtension.cpp ViewProviderGeoFeatureGroupExtension.cpp ViewProviderOriginGroupExtension.cpp diff --git a/src/Gui/ViewProviderExtension.cpp b/src/Gui/ViewProviderExtension.cpp index 96e0ddf131..b68e5f2378 100644 --- a/src/Gui/ViewProviderExtension.cpp +++ b/src/Gui/ViewProviderExtension.cpp @@ -29,7 +29,7 @@ #endif #include "ViewProviderExtension.h" -//#include "ViewProviderExtensionPy.h" +#include "ViewProviderExtensionPy.h" using namespace Gui; @@ -61,6 +61,16 @@ void ViewProviderExtension::extensionUpdateData(const App::Property*) { } +PyObject* ViewProviderExtension::getExtensionPyObject(void) { + + if (ExtensionPythonObject.is(Py::_None())){ + // ref counter is set to 1 + auto ext = new ViewProviderExtensionPy(this); + ExtensionPythonObject = Py::asObject(ext); + } + return Py::new_reference_to(ExtensionPythonObject); +} + namespace Gui { EXTENSION_PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderExtensionPython, Gui::ViewProviderExtension) diff --git a/src/Gui/ViewProviderExtension.h b/src/Gui/ViewProviderExtension.h index b88221e4e6..4d195e9bae 100644 --- a/src/Gui/ViewProviderExtension.h +++ b/src/Gui/ViewProviderExtension.h @@ -93,6 +93,7 @@ public: //update data of extended opject virtual void extensionUpdateData(const App::Property*); + virtual PyObject* getExtensionPyObject(); void setIgnoreOverlayIcon(bool on) { m_ignoreOverlayIcon = on; diff --git a/src/Gui/ViewProviderExtensionPy.xml b/src/Gui/ViewProviderExtensionPy.xml new file mode 100644 index 0000000000..f5eb37fc61 --- /dev/null +++ b/src/Gui/ViewProviderExtensionPy.xml @@ -0,0 +1,28 @@ + + + + + + Base class for all view provider extensions + + + + Ignore the overlay icon of an extension + + + + + Ignore the overlay icon of an extension + + + + + diff --git a/src/Gui/ViewProviderExtensionPyImp.cpp b/src/Gui/ViewProviderExtensionPyImp.cpp new file mode 100644 index 0000000000..d5e9f30e3e --- /dev/null +++ b/src/Gui/ViewProviderExtensionPyImp.cpp @@ -0,0 +1,91 @@ +/*************************************************************************** + * Copyright (c) 2020 Werner Mayer * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#include "PreCompiled.h" + +#ifndef _PreComp_ +# include +#endif + +// inclution of the generated files (generated out of PropertyContainerPy.xml) +#include "ViewProviderExtensionPy.h" +#include "ViewProviderExtensionPy.cpp" + +using namespace Gui; + +// returns a string which represent the object e.g. when printed in python +std::string ViewProviderExtensionPy::representation(void) const +{ + return std::string(""); +} + +PyObject* ViewProviderExtensionPy::setIgnoreOverlayIcon(PyObject *args) +{ + PyObject* ignore; + const char* name = nullptr; + if (!PyArg_ParseTuple(args, "O!s", &PyBool_Type, &ignore, &name)) + return nullptr; + + ViewProviderExtension* ext = getViewProviderExtensionPtr(); + if (name) { + Base::Type type = Base::Type::fromName(name); + ext = dynamic_cast(ext->getExtendedContainer()->getExtension(type, true, true)); + if (!ext) { + PyErr_SetString(PyExc_NameError, "no such extension"); + return nullptr; + } + } + + ext->setIgnoreOverlayIcon(PyObject_IsTrue(ignore) ? true : false); + Py_Return; +} + +PyObject* ViewProviderExtensionPy::ignoreOverlayIcon(PyObject *args) +{ + const char* name = nullptr; + if (!PyArg_ParseTuple(args, "s", &name)) + return nullptr; + + ViewProviderExtension* ext = getViewProviderExtensionPtr(); + if (name) { + Base::Type type = Base::Type::fromName(name); + ext = dynamic_cast(ext->getExtendedContainer()->getExtension(type, true, true)); + if (!ext) { + PyErr_SetString(PyExc_NameError, "no such extension"); + return nullptr; + } + } + + bool ignore = ext->ignoreOverlayIcon(); + return Py_BuildValue("O", (ignore ? Py_True : Py_False)); +} + +PyObject *ViewProviderExtensionPy::getCustomAttributes(const char* /*attr*/) const +{ + return 0; +} + +int ViewProviderExtensionPy::setCustomAttributes(const char* /*attr*/, PyObject * /*obj*/) +{ + return 0; +} diff --git a/src/Mod/Part/BasicShapes/ViewProviderShapes.py b/src/Mod/Part/BasicShapes/ViewProviderShapes.py index 1e308f0a20..2933eca80a 100644 --- a/src/Mod/Part/BasicShapes/ViewProviderShapes.py +++ b/src/Mod/Part/BasicShapes/ViewProviderShapes.py @@ -37,6 +37,7 @@ class ViewProviderTube: ''' Set this object to the proxy object of the actual view provider ''' obj.Proxy = self obj.addExtension("PartGui::ViewProviderAttachExtensionPython", self) + obj.setIgnoreOverlayIcon(True, "PartGui::ViewProviderAttachExtensionPython") def attach(self, obj): ''' Setup the scene sub-graph of the view provider, this method is mandatory '''