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;
}
예제 #2
0
static PyObject *idprop_py_from_idp_double(const IDProperty *prop)
{
    return PyFloat_FromDouble(IDP_Double(prop));
}
예제 #3
0
/* 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;
}