Esempio n. 1
0
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 */
		case IDP_ID:       return idprop_py_from_idp_id(prop);
		default: Py_RETURN_NONE;
	}
}
Esempio n. 2
0
/* for simple, non nested types this is the same as BPy_IDGroup_WrapData */
static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
{
    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_ARRAY:
    {
        PyObject *seq = PyList_New(prop->len);
        int i;

        if (!seq) {
            PyErr_Format(PyExc_RuntimeError,
                         "%s: IDP_ARRAY: PyList_New(%d) failed",
                         __func__, prop->len);
            return NULL;
        }

        switch (prop->subtype) {
        case IDP_FLOAT:
        {
            float *array = (float *)IDP_Array(prop);
            for (i = 0; i < prop->len; i++) {
                PyList_SET_ITEM(seq, i, PyFloat_FromDouble(array[i]));
            }
            break;
        }
        case IDP_DOUBLE:
        {
            double *array = (double *)IDP_Array(prop);
            for (i = 0; i < prop->len; i++) {
                PyList_SET_ITEM(seq, i, PyFloat_FromDouble(array[i]));
            }
            break;
        }
        case IDP_INT:
        {
            int *array = (int *)IDP_Array(prop);
            for (i = 0; i < prop->len; i++) {
                PyList_SET_ITEM(seq, i, PyLong_FromLong(array[i]));
            }
            break;
        }
        default:
            PyErr_Format(PyExc_RuntimeError,
                         "%s: invalid/corrupt array type '%d'!",
                         __func__, prop->subtype);
            Py_DECREF(seq);
            return NULL;
        }

        return seq;
    }
    case IDP_IDPARRAY:
    {
        PyObject *seq = PyList_New(prop->len), *wrap;
        IDProperty *array = IDP_IDPArray(prop);
        int i;

        if (!seq) {
            PyErr_Format(PyExc_RuntimeError,
                         "%s: IDP_IDPARRAY: PyList_New(%d) failed",
                         __func__, prop->len);
            return NULL;
        }

        for (i = 0; i < prop->len; i++) {
            wrap = BPy_IDGroup_MapDataToPy(array++);

            if (!wrap) /* BPy_IDGroup_MapDataToPy sets the error */
                return NULL;

            PyList_SET_ITEM(seq, i, wrap);
        }
        return seq;
    }
    case IDP_GROUP:
    {
        PyObject *dict = PyDict_New(), *wrap;
        IDProperty *loop;

        for (loop = prop->data.group.first; loop; loop = loop->next) {
            wrap = BPy_IDGroup_MapDataToPy(loop);

            if (!wrap) /* BPy_IDGroup_MapDataToPy sets the error */
                return NULL;

            PyDict_SetItemString(dict, loop->name, wrap);
            Py_DECREF(wrap);
        }
        return dict;
    }
    }

    PyErr_Format(PyExc_RuntimeError,
                 "%s ERROR: '%s' property exists with a bad type code '%d'!",
                 __func__, prop->name, prop->type);
    return NULL;
}