From 25aea8e1424ea577be0624d60419b465bf313b60 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;