From 5ea603977f99b89c50c91dcec0c4eea9e28849d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Sat, 3 Dec 2016 09:17:22 +0100 Subject: [PATCH] Extensions: Fix ViewProvider python interface --- src/App/Extension.cpp | 8 +++++++- src/Gui/ViewProviderExtension.h | 5 +++-- src/Gui/ViewProviderPy.xml | 4 ++-- src/Mod/Test/Document.py | 19 +++++++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/App/Extension.cpp b/src/App/Extension.cpp index 962ef781c1..94aff5ce46 100644 --- a/src/App/Extension.cpp +++ b/src/App/Extension.cpp @@ -33,6 +33,7 @@ #include "Base/Exception.h" #include #include +#include /* We do not use a standard property macro for type initiation. The reason is that we have the first * PropertyData in the extension chain, there is no parent property data. @@ -96,7 +97,12 @@ void Extension::initExtension(ExtensionContainer* obj) { PyObject* Extension::getExtensionPyObject(void) { - return nullptr; + if (ExtensionPythonObject.is(Py::_None())){ + // ref counter is set to 1 + auto grp = new ExtensionPy(this); + ExtensionPythonObject = Py::Object(grp,true); + } + return Py::new_reference_to(ExtensionPythonObject); } const char* Extension::name() { diff --git a/src/Gui/ViewProviderExtension.h b/src/Gui/ViewProviderExtension.h index 636a5d50a8..bde1f23239 100644 --- a/src/Gui/ViewProviderExtension.h +++ b/src/Gui/ViewProviderExtension.h @@ -97,13 +97,14 @@ public: ViewProviderExtensionPythonT() { ExtensionT::m_isPythonExtension = true; + ExtensionT::initExtension(ViewProviderExtensionPythonT::getExtensionClassTypeId()); - EXTENSION_ADD_PROPERTY(Proxy,(Py::Object())); + EXTENSION_ADD_PROPERTY(ExtensionProxy,(Py::Object())); } virtual ~ViewProviderExtensionPythonT() { } - App::PropertyPythonObject Proxy; + App::PropertyPythonObject ExtensionProxy; }; typedef ViewProviderExtensionPythonT ViewProviderExtensionPython; diff --git a/src/Gui/ViewProviderPy.xml b/src/Gui/ViewProviderPy.xml index 9087834a4b..732a5d43fd 100644 --- a/src/Gui/ViewProviderPy.xml +++ b/src/Gui/ViewProviderPy.xml @@ -1,13 +1,13 @@ diff --git a/src/Mod/Test/Document.py b/src/Mod/Test/Document.py index 8f1465dbc9..4c90cc77a7 100644 --- a/src/Mod/Test/Document.py +++ b/src/Mod/Test/Document.py @@ -234,7 +234,26 @@ class DocumentBasicCases(unittest.TestCase): self.Doc.removeObject(obj.Name) del obj + def testExtensionBugViewProvider(self): + class Layer(): + def __init__(self, obj): + ''' Add the properties ''' + obj.addExtension("App::GroupExtensionPython", self) + + class LayerViewProvider(): + def __init__(self, obj): + ''' Add the properties ''' + obj.addExtension("Gui::ViewProviderGroupExtensionPython", self) + obj.Proxy = self + + obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython","Layer") + Layer(obj) + LayerViewProvider(obj.ViewObject) + self.failUnless(obj.hasExtension("App::GroupExtension")) + self.failUnless(obj.ViewObject.hasExtension("Gui::ViewProviderGroupExtension")) + self.failUnless(obj.ViewObject.hasExtension("Gui::ViewProviderGroupExtensionPython")) + def tearDown(self): #closing doc FreeCAD.closeDocument("CreateTest")