From 657da35e6bed967e5a0ac4418039b9238ab057bf Mon Sep 17 00:00:00 2001 From: David Carter <38090157+davesrocketshop@users.noreply.github.com> Date: Wed, 4 Jun 2025 16:27:37 +0000 Subject: [PATCH] Materials: Set array quantity format (#21647) * Materials: Set array quantity format When setting quantity formats, the default format is not actually the default. Instead fixed format is, which causes issues for very small and very large values. This was fixed for C++ but arrays created in Python were not setting the format correctly. * Apply suggestions from code review Co-authored-by: Benjamin Nauck --- src/Mod/Material/App/Array2DPyImp.cpp | 4 +++- src/Mod/Material/App/Array3DPyImp.cpp | 24 ++++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/Mod/Material/App/Array2DPyImp.cpp b/src/Mod/Material/App/Array2DPyImp.cpp index ee90abc23a..549dc673aa 100644 --- a/src/Mod/Material/App/Array2DPyImp.cpp +++ b/src/Mod/Material/App/Array2DPyImp.cpp @@ -159,7 +159,9 @@ PyObject* Array2DPy::setValue(PyObject* args) if (PyArg_ParseTuple(args, "iiO!", &row, &column, &PyUnicode_Type, &valueObj)) { Py::String item(valueObj); try { - QVariant variant = QVariant::fromValue(Base::Quantity::parse(item.as_string())); + auto quantity = Base::Quantity::parse(item.as_string()); + quantity.setFormat(MaterialValue::getQuantityFormat()); + QVariant variant = QVariant::fromValue(quantity); getArray2DPtr()->setValue(row, column, variant); } catch (const InvalidIndex&) { diff --git a/src/Mod/Material/App/Array3DPyImp.cpp b/src/Mod/Material/App/Array3DPyImp.cpp index 794e9eacad..c6ee68510a 100644 --- a/src/Mod/Material/App/Array3DPyImp.cpp +++ b/src/Mod/Material/App/Array3DPyImp.cpp @@ -163,10 +163,16 @@ PyObject* Array3DPy::setDepthValue(PyObject* args) if (PyArg_ParseTuple(args, "iO!", &depth, &PyUnicode_Type, &valueObj)) { Py::String item(valueObj); try { - getArray3DPtr()->setDepthValue(depth, Base::Quantity::parse(item.as_string())); + auto quantity = Base::Quantity::parse(item.as_string()); + quantity.setFormat(MaterialValue::getQuantityFormat()); + getArray3DPtr()->setDepthValue(depth, quantity); } - catch (const InvalidIndex&) { - PyErr_SetString(PyExc_IndexError, "Invalid array index"); + catch (const Base::ParserError& e) { + PyErr_SetString(PyExc_ValueError, e.what()); + return nullptr; + } + catch (const InvalidIndex& e) { + PyErr_SetString(PyExc_IndexError, e.what()); return nullptr; } Py_Return; @@ -185,10 +191,16 @@ PyObject* Array3DPy::setValue(PyObject* args) if (PyArg_ParseTuple(args, "iiiO!", &depth, &row, &column, &PyUnicode_Type, &valueObj)) { Py::String item(valueObj); try { - getArray3DPtr()->setValue(depth, row, column, Base::Quantity::parse(item.as_string())); + auto quantity = Base::Quantity::parse(item.as_string()); + quantity.setFormat(MaterialValue::getQuantityFormat()); + getArray3DPtr()->setValue(depth, row, column, quantity); } - catch (const InvalidIndex&) { - PyErr_SetString(PyExc_IndexError, "Invalid array index"); + catch (const Base::ParserError& e) { + PyErr_SetString(PyExc_ValueError, e.what()); + return nullptr; + } + catch (const InvalidIndex& e) { + PyErr_SetString(PyExc_IndexError, e.what()); return nullptr; } Py_Return;