diff --git a/src/App/PropertyStandard.cpp b/src/App/PropertyStandard.cpp index 7c18f4bad3..96b69440b0 100644 --- a/src/App/PropertyStandard.cpp +++ b/src/App/PropertyStandard.cpp @@ -2201,52 +2201,58 @@ PyObject *PropertyColor::getPyObject() void PropertyColor::setPyObject(PyObject *value) { App::Color cCol; - if (PyTuple_Check(value) && PyTuple_Size(value) == 3) { + if (PyTuple_Check(value) && (PyTuple_Size(value) == 3 || PyTuple_Size(value) == 4) ) { PyObject* item; item = PyTuple_GetItem(value,0); - if (PyFloat_Check(item)) + if (PyFloat_Check(item)) { cCol.r = (float)PyFloat_AsDouble(item); - else - throw Base::TypeError("Type in tuple must be float"); - item = PyTuple_GetItem(value,1); - if (PyFloat_Check(item)) - cCol.g = (float)PyFloat_AsDouble(item); - else - throw Base::TypeError("Type in tuple must be float"); - item = PyTuple_GetItem(value,2); - if (PyFloat_Check(item)) - cCol.b = (float)PyFloat_AsDouble(item); - else - throw Base::TypeError("Type in tuple must be float"); - } - else if (PyTuple_Check(value) && PyTuple_Size(value) == 4) { - PyObject* item; - item = PyTuple_GetItem(value,0); - if (PyFloat_Check(item)) - cCol.r = (float)PyFloat_AsDouble(item); - else - throw Base::TypeError("Type in tuple must be float"); - item = PyTuple_GetItem(value,1); - if (PyFloat_Check(item)) - cCol.g = (float)PyFloat_AsDouble(item); - else - throw Base::TypeError("Type in tuple must be float"); - item = PyTuple_GetItem(value,2); - if (PyFloat_Check(item)) - cCol.b = (float)PyFloat_AsDouble(item); - else - throw Base::TypeError("Type in tuple must be float"); - item = PyTuple_GetItem(value,3); - if (PyFloat_Check(item)) - cCol.a = (float)PyFloat_AsDouble(item); - else - throw Base::TypeError("Type in tuple must be float"); + item = PyTuple_GetItem(value,1); + if (PyFloat_Check(item)) + cCol.g = (float)PyFloat_AsDouble(item); + else + throw Base::TypeError("Type in tuple must be consistent (float)"); + item = PyTuple_GetItem(value,2); + if (PyFloat_Check(item)) + cCol.b = (float)PyFloat_AsDouble(item); + else + throw Base::TypeError("Type in tuple must be consistent (float)"); + if (PyTuple_Size(value) == 4) { + item = PyTuple_GetItem(value,3); + if (PyFloat_Check(item)) + cCol.a = (float)PyFloat_AsDouble(item); + else + throw Base::TypeError("Type in tuple must be consistent (float)"); + } + } + else if (PyLong_Check(item)) { + cCol.r = PyLong_AsLong(item)/255.0; + item = PyTuple_GetItem(value,1); + if (PyLong_Check(item)) + cCol.g = PyLong_AsLong(item)/255.0; + else + throw Base::TypeError("Type in tuple must be consistent (integer)"); + item = PyTuple_GetItem(value,2); + if (PyLong_Check(item)) + cCol.b = PyLong_AsLong(item)/255.0; + else + throw Base::TypeError("Type in tuple must be consistent (integer)"); + if (PyTuple_Size(value) == 4) { + item = PyTuple_GetItem(value,3); + if (PyLong_Check(item)) + cCol.a = PyLong_AsLong(item)/255.0; + else + throw Base::TypeError("Type in tuple must be consistent (integer)"); + } + } + else { + throw Base::TypeError("Type in tuple must be float or integer"); + } } else if (PyLong_Check(value)) { cCol.setPackedValue(PyLong_AsUnsignedLong(value)); } else { - std::string error = std::string("type must be int or tuple of float, not "); + std::string error = std::string("type must be integer or tuple of float or tuple integer, not "); error += value->ob_type->tp_name; throw Base::TypeError(error); } diff --git a/src/Gui/propertyeditor/PropertyItem.cpp b/src/Gui/propertyeditor/PropertyItem.cpp index a320830084..3db2830c99 100644 --- a/src/Gui/propertyeditor/PropertyItem.cpp +++ b/src/Gui/propertyeditor/PropertyItem.cpp @@ -3270,11 +3270,10 @@ void PropertyColorItem::setValue(const QVariant& value) if (hasExpression() || !value.canConvert()) return; auto col = value.value(); - App::Color val; val.setValue(col); QString data = QString::fromLatin1("(%1,%2,%3)") - .arg(val.r, 0, 'f', decimals()) - .arg(val.g, 0, 'f', decimals()) - .arg(val.b, 0, 'f', decimals()); + .arg(col.red()) + .arg(col.green()) + .arg(col.blue()); setPropertyValue(data); }