Skip to content

Commit

Permalink
Expose PropertyEnumeration values list to python.
Browse files Browse the repository at this point in the history
  • Loading branch information
mlampert committed Jan 1, 2021
1 parent 2203dce commit 8fbbfb2
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 1 deletion.
5 changes: 5 additions & 0 deletions src/App/PropertyContainerPy.xml
Expand Up @@ -97,6 +97,11 @@ text names of the status.
<UserDocu>Return the documentation string of the property of this class.</UserDocu>
</Documentation>
</Methode>
<Methode Name="getEnumerationsOfProperty">
<Documentation>
<UserDocu>Return all enumeration strings of the property of this class or None if not a PropertyEnumeration.</UserDocu>
</Documentation>
</Methode>
<Methode Name="dumpPropertyContent" Keyword="true" Const="true">
<Documentation>
<UserDocu>Dumps the content of the property, both the XML representation as well as the additional datafiles
Expand Down
29 changes: 28 additions & 1 deletion src/App/PropertyContainerPyImp.cpp
Expand Up @@ -357,7 +357,34 @@ PyObject* PropertyContainerPy::getDocumentationOfProperty(PyObject *args)
else
return Py::new_reference_to(Py::String(""));
}


PyObject* PropertyContainerPy::getEnumerationsOfProperty(PyObject *args)
{
char *pstr;
if (!PyArg_ParseTuple(args, "s", &pstr)) // convert args: Python->C
return NULL; // NULL triggers exception

Property* prop = getPropertyContainerPtr()->getPropertyByName(pstr);
if (!prop) {
PyErr_Format(PyExc_AttributeError, "Property container has no property '%s'", pstr);
return 0;
}

PropertyEnumeration *enumProp = dynamic_cast<PropertyEnumeration*>(prop);
if (!enumProp) {
Py_INCREF(Py_None);
return Py_None;
}

std::vector<std::string> enumerations = enumProp->getEnumVector();

Py::List ret;
for (std::vector<std::string>::const_iterator it = enumerations.begin(); it != enumerations.end(); ++it) {
ret.append(Py::String(*it));
}
return Py::new_reference_to(ret);
}

Py::List PropertyContainerPy::getPropertiesList(void) const
{
Py::List ret;
Expand Down
3 changes: 3 additions & 0 deletions src/Mod/TemplatePyMod/DocumentObject.py
Expand Up @@ -80,6 +80,9 @@ def getGroupOfProperty(self,attr):
def getDocumentationOfProperty(self,attr):
"returns the documentation string of a given property"
return self.__object__.getDocumentationOfProperty(attr)
def getEnumerationsOfProperty(self,attr):
"returns the documentation string of a given property"
return self.__object__.getEnumerationsOfProperty(attr)
def touch(self):
"marks this object to be recomputed"
return self.__object__.touch()
Expand Down
2 changes: 2 additions & 0 deletions src/Mod/Test/Document.py
Expand Up @@ -143,6 +143,7 @@ def testObjects(self):
self.failUnless(not L1.getDocumentationOfProperty("Source1") == "")
self.failUnless(L1.getGroupOfProperty("Source1") == "Feature Test")
self.failUnless(L1.getTypeOfProperty("Source1") == [])
self.failUnless(L1.getEnumerationsOfProperty("Source1") is None)


# test the constraint types ( both are constraint to percent range)
Expand Down Expand Up @@ -170,6 +171,7 @@ def testObjects(self):
FreeCAD.Console.PrintLog(" exception thrown, OK\n")
else:
self.fail("no exception thrown")
self.failUnless(sorted(L1.getEnumerationsOfProperty('Enum')) == sorted(['Zero', 'One', 'Two', 'Three', 'Four']))

#self.failUnless(L1.IntegerList == [4711] )
#f = L1.FloatList
Expand Down

0 comments on commit 8fbbfb2

Please sign in to comment.