From 49dfaaefa0d2007d9377b201be436ded246ee347 Mon Sep 17 00:00:00 2001 From: Ajinkya Dahale Date: Mon, 21 Aug 2023 22:45:45 +0530 Subject: [PATCH] [Core] Use keyword arguments in DocumentObjectPy `addProperty` --- src/App/DocumentObjectPy.xml | 6 ++---- src/App/DocumentObjectPyImp.cpp | 26 +++++++++++++++++++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/App/DocumentObjectPy.xml b/src/App/DocumentObjectPy.xml index ead1d5573c..8792376ad9 100644 --- a/src/App/DocumentObjectPy.xml +++ b/src/App/DocumentObjectPy.xml @@ -13,12 +13,10 @@ This is the father of all classes handled by the document - + - addProperty(string, string) -- Add a generic property. - The first argument specifies the type, the second the - name of the property. + addProperty(type: string, name: string, group="", doc="", attr=0, read_only=False, hidden=False, enum_vals=[]) -- Add a generic property. diff --git a/src/App/DocumentObjectPyImp.cpp b/src/App/DocumentObjectPyImp.cpp index 8c5d6d5628..4b3282a946 100644 --- a/src/App/DocumentObjectPyImp.cpp +++ b/src/App/DocumentObjectPyImp.cpp @@ -76,14 +76,17 @@ Py::Object DocumentObjectPy::getDocument() const } } -PyObject* DocumentObjectPy::addProperty(PyObject *args) +PyObject* DocumentObjectPy::addProperty(PyObject *args, PyObject *kwd) { char *sType,*sName=nullptr,*sGroup=nullptr,*sDoc=nullptr; short attr=0; std::string sDocStr; PyObject *ro = Py_False, *hd = Py_False; - if (!PyArg_ParseTuple(args, "s|ssethO!O!", &sType,&sName,&sGroup,"utf-8",&sDoc,&attr, - &PyBool_Type, &ro, &PyBool_Type, &hd)) + PyObject* enumVals = nullptr; + const std::array kwlist {"type","name","group","doc","attr","read_only","hidden","enum_vals",nullptr}; + if (!Base::Wrapped_ParseTupleAndKeywords( + args, kwd, "ss|sethO!O!O", kwlist, &sType, &sName, &sGroup, "utf-8", + &sDoc, &attr, &PyBool_Type, &ro, &PyBool_Type, &hd, &enumVals)) return nullptr; if (sDoc) { @@ -91,8 +94,21 @@ PyObject* DocumentObjectPy::addProperty(PyObject *args) PyMem_Free(sDoc); } - getDocumentObjectPtr()->addDynamicProperty(sType,sName,sGroup,sDocStr.c_str(),attr, - Base::asBoolean(ro), Base::asBoolean(hd)); + Property *prop = getDocumentObjectPtr()-> + addDynamicProperty(sType,sName,sGroup,sDocStr.c_str(),attr, + Base::asBoolean(ro), Base::asBoolean(hd)); + + // enum support + auto* propEnum = dynamic_cast(prop); + if (propEnum) { + if (enumVals && PySequence_Check(enumVals)) { + std::vector enumValsAsVector; + for (Py_ssize_t i = 0; i < PySequence_Length(enumVals); ++i) { + enumValsAsVector.emplace_back(PyUnicode_AsUTF8(PySequence_GetItem(enumVals,i))); + } + propEnum->setEnums(enumValsAsVector); + } + } return Py::new_reference_to(this); }