diff --git a/src/App/DynamicProperty.cpp b/src/App/DynamicProperty.cpp index ca2522d26..a7dc4edea 100644 --- a/src/App/DynamicProperty.cpp +++ b/src/App/DynamicProperty.cpp @@ -245,6 +245,18 @@ Property* DynamicProperty::addDynamicProperty(const char* type, const char* name return pcProperty; } +bool DynamicProperty::removeDynamicProperty(const char* name) +{ + std::map::iterator it = props.find(name); + if (it != props.end()) { + delete it->second.property; + props.erase(it); + return true; + } + + return false; +} + std::string DynamicProperty::getUniquePropertyName(const char *Name) const { std::string CleanName = Base::Tools::getIdentifier(Name); diff --git a/src/App/DynamicProperty.h b/src/App/DynamicProperty.h index 12d8f91f6..5ebfc4195 100644 --- a/src/App/DynamicProperty.h +++ b/src/App/DynamicProperty.h @@ -70,6 +70,7 @@ public: Property *getDynamicPropertyByName(const char* name) const; Property* addDynamicProperty(const char* type, const char* name=0, const char* group=0, const char* doc=0, short attr=0, bool ro=false, bool hidden=false); + bool removeDynamicProperty(const char* name); std::vector getDynamicPropertyNames() const; void addDynamicProperties(const PropertyContainer*); /// get the name of a property diff --git a/src/App/FeaturePython.h b/src/App/FeaturePython.h index b5ead2bcd..b45fa3436 100644 --- a/src/App/FeaturePython.h +++ b/src/App/FeaturePython.h @@ -100,6 +100,9 @@ public: short attr=0, bool ro=false, bool hidden=false) { return props->addDynamicProperty(type, name, group, doc, attr, ro, hidden); } + virtual bool removeDynamicProperty(const char* name) { + return props->removeDynamicProperty(name); + } std::vector getDynamicPropertyNames() const { return props->getDynamicPropertyNames(); } diff --git a/src/App/FeaturePythonPy.xml b/src/App/FeaturePythonPy.xml index 63b2d8136..0b58cb5a7 100644 --- a/src/App/FeaturePythonPy.xml +++ b/src/App/FeaturePythonPy.xml @@ -20,6 +20,13 @@ The first argument specifies the type, the second the name of the property. + + + + removeProperty(string) -- Remove a generic property. +Note, you can only remove user-defined properties but not built-in ones. + + diff --git a/src/App/FeaturePythonPyImp.cpp b/src/App/FeaturePythonPyImp.cpp index 7fac94fd8..42d90cdd4 100644 --- a/src/App/FeaturePythonPyImp.cpp +++ b/src/App/FeaturePythonPyImp.cpp @@ -62,6 +62,16 @@ PyObject* FeaturePythonPy::addProperty(PyObject *args) return Py::new_reference_to(this); } +PyObject* FeaturePythonPy::removeProperty(PyObject *args) +{ + char *sName; + if (!PyArg_ParseTuple(args, "s", &sName)) + return NULL; + + bool ok = getFeaturePythonPtr()->removeDynamicProperty(sName); + return Py_BuildValue("O", (ok ? Py_True : Py_False)); +} + PyObject* FeaturePythonPy::supportedProperties(PyObject *args) { if (!PyArg_ParseTuple(args, "")) // convert args: Python->C diff --git a/src/App/PropertyContainer.h b/src/App/PropertyContainer.h index 0690fe1b4..82d73c190 100644 --- a/src/App/PropertyContainer.h +++ b/src/App/PropertyContainer.h @@ -138,6 +138,9 @@ public: short attr=0, bool ro=false, bool hidden=false){ return 0; } + virtual bool removeDynamicProperty(const char* name) { + return false; + } virtual std::vector getDynamicPropertyNames() const { return std::vector(); } diff --git a/src/Gui/ViewProviderPythonFeature.h b/src/Gui/ViewProviderPythonFeature.h index 693a6c448..220ada2fe 100644 --- a/src/Gui/ViewProviderPythonFeature.h +++ b/src/Gui/ViewProviderPythonFeature.h @@ -188,6 +188,9 @@ public: short attr=0, bool ro=false, bool hidden=false) { return props->addDynamicProperty(type, name, group, doc, attr, ro, hidden); } + virtual bool removeDynamicProperty(const char* name) { + return props->removeDynamicProperty(name); + } std::vector getDynamicPropertyNames() const { return props->getDynamicPropertyNames(); } diff --git a/src/Gui/ViewProviderPythonFeaturePy.xml b/src/Gui/ViewProviderPythonFeaturePy.xml index c5457663a..02413d2ee 100644 --- a/src/Gui/ViewProviderPythonFeaturePy.xml +++ b/src/Gui/ViewProviderPythonFeaturePy.xml @@ -27,6 +27,14 @@ + + + + removeProperty(string) -- Remove a generic property. + Note, you can only remove user-defined properties but not built-in ones. + + + A list of supported property types diff --git a/src/Gui/ViewProviderPythonFeaturePyImp.cpp b/src/Gui/ViewProviderPythonFeaturePyImp.cpp index 234c468f4..badd7a56f 100644 --- a/src/Gui/ViewProviderPythonFeaturePyImp.cpp +++ b/src/Gui/ViewProviderPythonFeaturePyImp.cpp @@ -84,6 +84,16 @@ PyObject* ViewProviderPythonFeaturePy::addProperty(PyObject *args) return Py::new_reference_to(this); } +PyObject* ViewProviderPythonFeaturePy::removeProperty(PyObject *args) +{ + char *sName; + if (!PyArg_ParseTuple(args, "s", &sName)) + return NULL; + + bool ok = getViewProviderPythonFeaturePtr()->removeDynamicProperty(sName); + return Py_BuildValue("O", (ok ? Py_True : Py_False)); +} + PyObject* ViewProviderPythonFeaturePy::supportedProperties(PyObject *args) { if (!PyArg_ParseTuple(args, "")) // convert args: Python->C