From c705bcb0f15fe4ecbcfd11c6b827c70ab4cb1434 Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Wed, 13 Sep 2017 11:43:42 -0700 Subject: [PATCH] Creation of Tool from a templateAttrs dictionary. --- src/Mod/Path/App/TooltablePyImp.cpp | 27 +++++++++++++++----------- src/Mod/Path/PathTests/TestPathTool.py | 16 +++++++++++++++ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/Mod/Path/App/TooltablePyImp.cpp b/src/Mod/Path/App/TooltablePyImp.cpp index cd6ff64ece..5e8f098625 100644 --- a/src/Mod/Path/App/TooltablePyImp.cpp +++ b/src/Mod/Path/App/TooltablePyImp.cpp @@ -70,9 +70,18 @@ int ToolPy::PyInit(PyObject* args, PyObject* kwd) static char *kwlist[] = {"name", "tooltype", "material", "diameter", "lengthOffset", "flatRadius", "cornerRadius", "cuttingEdgeAngle", "cuttingEdgeHeight" ,NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwd, "|sssOOOOOO", kwlist, - &name, &type, &mat, &dia, &len, &fla, &cor, &ang, &hei )) - return -1; + PyObject *dict = 0; + if (!kwd && PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict)) { + PyObject *arg = PyTuple_New(0); + if (!PyArg_ParseTupleAndKeywords(arg, dict, "|sssOOOOOO", kwlist, &name, &type, &mat, &dia, &len, &fla, &cor, &ang, &hei)) { + return -1; + } + } else { + PyErr_Clear(); + if (!PyArg_ParseTupleAndKeywords(args, kwd, "|sssOOOOOO", kwlist, &name, &type, &mat, &dia, &len, &fla, &cor, &ang, &hei)) { + return -1; + } + } getToolPtr()->Name = name; std::string typeStr(type); @@ -291,7 +300,6 @@ PyObject* ToolPy::copy(PyObject * args) PyObject* ToolPy::setFromTemplate(PyObject * args) { char *pstr = 0; - PyObject *dict = 0; if (PyArg_ParseTuple(args, "s", &pstr)) { // embed actual string in dummy tag so XMLReader can consume that on construction std::ostringstream os; @@ -301,13 +309,10 @@ PyObject* ToolPy::setFromTemplate(PyObject * args) getToolPtr()->Restore(reader); Py_Return ; } - - if (PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict)) { - PyErr_Clear(); // it's not a string, need to clear that exception - PyObject *arg = PyTuple_New(0); - if (!PyInit(arg, dict)) { - Py_Return ; - } + + PyErr_Clear(); + if (!PyInit(args, 0)) { + Py_Return ; } PyErr_SetString(PyExc_TypeError, "argument must be a string or dictionary"); diff --git a/src/Mod/Path/PathTests/TestPathTool.py b/src/Mod/Path/PathTests/TestPathTool.py index eca405877c..a3aa459fd0 100644 --- a/src/Mod/Path/PathTests/TestPathTool.py +++ b/src/Mod/Path/PathTests/TestPathTool.py @@ -83,3 +83,19 @@ class TestPathTool(PathTestBase): self.assertEqual(t0.CuttingEdgeAngle, t1.CuttingEdgeAngle) self.assertEqual(t0.CuttingEdgeHeight, t1.CuttingEdgeHeight) + def test02(self): + '''Verify template dictionary construction''' + + t0 = self.test00() + t1 = Path.Tool(t0.templateAttrs()) + + self.assertEqual(t0.Name, t1.Name) + self.assertEqual(t0.ToolType, t1.ToolType) + self.assertEqual(t0.Material, t1.Material) + self.assertEqual(t0.Diameter, t1.Diameter) + self.assertEqual(t0.LengthOffset, t1.LengthOffset) + self.assertEqual(t0.FlatRadius, t1.FlatRadius) + self.assertEqual(t0.CornerRadius, t1.CornerRadius) + self.assertEqual(t0.CuttingEdgeAngle, t1.CuttingEdgeAngle) + self.assertEqual(t0.CuttingEdgeHeight, t1.CuttingEdgeHeight) +