static float get_property(Bone *bone, const char *key, float def) { float result = def; if (bone->prop) { IDProperty *property = IDP_GetPropertyFromGroup(bone->prop, key); if (property) { switch (property->type) { case IDP_INT: result = (float)(IDP_Int(property)); break; case IDP_FLOAT: result = (float)(IDP_Float(property)); break; case IDP_DOUBLE: result = (float)(IDP_Double(property)); break; default: result = def; } } } return result; }
static PyObject *idprop_py_from_idp_double(const IDProperty *prop) { return PyFloat_FromDouble(IDP_Double(prop)); }
/* use for both array and group */ static Py_hash_t BPy_IDGroup_hash(BPy_IDProperty *self) { return _Py_HashPointer(self->prop); } static PyObject *BPy_IDGroup_repr(BPy_IDProperty *self) { return PyUnicode_FromFormat("<bpy id prop: owner=\"%s\", name=\"%s\", address=%p>", self->id ? self->id->name : "<NONE>", self->prop->name, self->prop); } PyObject *BPy_IDGroup_WrapData(ID *id, IDProperty *prop, IDProperty *parent) { switch (prop->type) { case IDP_STRING: return idprop_py_from_idp_string(prop); case IDP_INT: return idprop_py_from_idp_int(prop); case IDP_FLOAT: return idprop_py_from_idp_float(prop); case IDP_DOUBLE: return idprop_py_from_idp_double(prop); case IDP_GROUP: return idprop_py_from_idp_group(id, prop, parent); case IDP_ARRAY: return idprop_py_from_idp_array(id, prop); case IDP_IDPARRAY: return idprop_py_from_idp_idparray(id, prop); /* this could be better a internal type */ default: Py_RETURN_NONE; } } #if 0 /* UNUSED, currently assignment overwrites into new properties, rather than setting in-place */ static int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject *value) { switch (prop->type) { case IDP_STRING: { char *st; if (!PyUnicode_Check(value)) { PyErr_SetString(PyExc_TypeError, "expected a string!"); return -1; } /* NOTE: if this code is enabled, bytes support needs to be added */ #ifdef USE_STRING_COERCE { int alloc_len; PyObject *value_coerce = NULL; st = (char *)PyC_UnicodeAsByte(value, &value_coerce); alloc_len = strlen(st) + 1; st = _PyUnicode_AsString(value); IDP_ResizeArray(prop, alloc_len); memcpy(IDP_Array(prop), st, alloc_len); Py_XDECREF(value_coerce); } #else st = _PyUnicode_AsString(value); IDP_ResizeArray(prop, strlen(st) + 1); strcpy(IDP_Array(prop), st); #endif return 0; } case IDP_INT: { int ivalue = PyLong_AsSsize_t(value); if (ivalue == -1 && PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "expected an int type"); return -1; } IDP_Int(prop) = ivalue; break; } case IDP_FLOAT: { float fvalue = (float)PyFloat_AsDouble(value); if (fvalue == -1 && PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "expected a float"); return -1; } IDP_Float(self->prop) = fvalue; break; } case IDP_DOUBLE: { double dvalue = PyFloat_AsDouble(value); if (dvalue == -1 && PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "expected a float"); return -1; } IDP_Double(self->prop) = dvalue; break; } default: PyErr_SetString(PyExc_AttributeError, "attempt to set read-only attribute!"); return -1; } return 0; }