forked from bartvdbraak/blender
merged pyrna_py_to_param and pyrna_py_to_prop since they are almost the same
This commit is contained in:
parent
f47ab4f0ae
commit
82f710fb33
@ -40,7 +40,7 @@ class RENDER_PT_image(bpy.types.Panel):
|
||||
|
||||
layout.column_flow()
|
||||
layout.itemR(rd, "resolution_x", text="SizeX")
|
||||
layout.itemR(rd, "resolution_x", text="SizeY")
|
||||
layout.itemR(rd, "resolution_y", text="SizeY")
|
||||
layout.itemR(rd, "pixel_aspect_x", text="AspX")
|
||||
layout.itemR(rd, "pixel_aspect_y", text="AspY")
|
||||
|
||||
|
@ -80,7 +80,7 @@ int PYOP_props_from_dict(PointerRNA *ptr, PyObject *kw)
|
||||
break;
|
||||
}
|
||||
|
||||
if (pyrna_py_to_prop(ptr, prop, item)) {
|
||||
if (pyrna_py_to_prop(ptr, prop, NULL, item)) {
|
||||
error_val= -1;
|
||||
break;
|
||||
}
|
||||
|
@ -217,8 +217,10 @@ PyObject *pyrna_func_to_py(PointerRNA *ptr, FunctionRNA *func)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
|
||||
int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value)
|
||||
{
|
||||
/* XXX hard limits should be checked here */
|
||||
int type = RNA_property_type(ptr, prop);
|
||||
int len = RNA_property_array_length(ptr, prop);
|
||||
|
||||
@ -240,7 +242,10 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
switch (type) {
|
||||
case PROP_BOOLEAN:
|
||||
{
|
||||
int *param_arr = MEM_mallocN(sizeof(char) * len, "pyrna bool array");
|
||||
int *param_arr;
|
||||
if(data) param_arr= (int*)data;
|
||||
else param_arr= MEM_mallocN(sizeof(char) * len, "pyrna bool array");
|
||||
|
||||
|
||||
/* collect the variables before assigning, incase one of them is incorrect */
|
||||
for (i=0; i<len; i++) {
|
||||
@ -249,22 +254,27 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
Py_DECREF(item);
|
||||
|
||||
if (param_arr[i] < 0) {
|
||||
MEM_freeN(param_arr);
|
||||
if(data==NULL)
|
||||
MEM_freeN(param_arr);
|
||||
PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence is not a boolean");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
RNA_property_boolean_set_array(ptr, prop, param_arr);
|
||||
|
||||
MEM_freeN(param_arr);
|
||||
if(data==NULL) {
|
||||
RNA_property_boolean_set_array(ptr, prop, param_arr);
|
||||
MEM_freeN(param_arr);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case PROP_INT:
|
||||
{
|
||||
int *param_arr = MEM_mallocN(sizeof(int) * len, "pyrna int array");
|
||||
int *param_arr;
|
||||
if(data) param_arr= (int*)data;
|
||||
else param_arr= MEM_mallocN(sizeof(int) * len, "pyrna int array");
|
||||
|
||||
|
||||
/* collect the variables before assigning, incase one of them is incorrect */
|
||||
/* collect the variables */
|
||||
for (i=0; i<len; i++) {
|
||||
item = PySequence_GetItem(value, i);
|
||||
param_arr[i] = (int)PyLong_AsSsize_t(item); /* deal with any errors later */
|
||||
@ -272,21 +282,26 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
}
|
||||
|
||||
if (PyErr_Occurred()) {
|
||||
MEM_freeN(param_arr);
|
||||
if(data==NULL)
|
||||
MEM_freeN(param_arr);
|
||||
PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence could not be used as an int");
|
||||
return -1;
|
||||
}
|
||||
|
||||
RNA_property_int_set_array(ptr, prop, param_arr);
|
||||
|
||||
MEM_freeN(param_arr);
|
||||
if(data==NULL) {
|
||||
RNA_property_int_set_array(ptr, prop, param_arr);
|
||||
MEM_freeN(param_arr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PROP_FLOAT:
|
||||
{
|
||||
float *param_arr = MEM_mallocN(sizeof(float) * len, "pyrna float array");
|
||||
float *param_arr;
|
||||
if(data) param_arr = (float*)data;
|
||||
else param_arr = MEM_mallocN(sizeof(float) * len, "pyrna float array");
|
||||
|
||||
|
||||
|
||||
/* collect the variables before assigning, incase one of them is incorrect */
|
||||
/* collect the variables */
|
||||
for (i=0; i<len; i++) {
|
||||
item = PySequence_GetItem(value, i);
|
||||
param_arr[i] = (float)PyFloat_AsDouble(item); /* deal with any errors later */
|
||||
@ -294,14 +309,15 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
}
|
||||
|
||||
if (PyErr_Occurred()) {
|
||||
MEM_freeN(param_arr);
|
||||
if(data==NULL)
|
||||
MEM_freeN(param_arr);
|
||||
PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence could not be used as a float");
|
||||
return -1;
|
||||
}
|
||||
|
||||
RNA_property_float_set_array(ptr, prop, param_arr);
|
||||
|
||||
MEM_freeN(param_arr);
|
||||
if(data==NULL) {
|
||||
RNA_property_float_set_array(ptr, prop, param_arr);
|
||||
MEM_freeN(param_arr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -318,7 +334,8 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
PyErr_SetString(PyExc_TypeError, "expected True/False or 0/1");
|
||||
return -1;
|
||||
} else {
|
||||
RNA_property_boolean_set(ptr, prop, param);
|
||||
if(data) *((int*)data)= param;
|
||||
else RNA_property_boolean_set(ptr, prop, param);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -329,7 +346,8 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
PyErr_SetString(PyExc_TypeError, "expected an int type");
|
||||
return -1;
|
||||
} else {
|
||||
RNA_property_int_set(ptr, prop, param);
|
||||
if(data) *((int*)data)= param;
|
||||
else RNA_property_int_set(ptr, prop, param);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -340,7 +358,8 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
PyErr_SetString(PyExc_TypeError, "expected a float type");
|
||||
return -1;
|
||||
} else {
|
||||
RNA_property_float_set(ptr, prop, param);
|
||||
if(data) *((float*)data)= param;
|
||||
else RNA_property_float_set(ptr, prop, param);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -352,7 +371,8 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
PyErr_SetString(PyExc_TypeError, "expected a string type");
|
||||
return -1;
|
||||
} else {
|
||||
RNA_property_string_set(ptr, prop, param);
|
||||
if(data) *((char**)data)= param;
|
||||
else RNA_property_string_set(ptr, prop, param);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -368,7 +388,8 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
} else {
|
||||
int val;
|
||||
if (RNA_property_enum_value(ptr, prop, param, &val)) {
|
||||
RNA_property_enum_set(ptr, prop, val);
|
||||
if(data) *((int*)data)= val;
|
||||
else RNA_property_enum_set(ptr, prop, val);
|
||||
} else {
|
||||
char *enum_str= pyrna_enum_as_string(ptr, prop);
|
||||
PyErr_Format(PyExc_AttributeError, "enum \"%s\" not found in (%s)", param, enum_str);
|
||||
@ -390,10 +411,30 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
return -1;
|
||||
} else {
|
||||
BPy_StructRNA *param= (BPy_StructRNA*)value;
|
||||
|
||||
if(RNA_struct_is_a(¶m->ptr, ptype)) {
|
||||
RNA_property_pointer_set(ptr, prop, param->ptr);
|
||||
} else {
|
||||
int raise_error= 0;
|
||||
if(data) {
|
||||
if(ptype == &RNA_AnyType) {
|
||||
*((PointerRNA*)data)= param->ptr;
|
||||
}
|
||||
else if(RNA_struct_is_a(¶m->ptr, ptype)) {
|
||||
*((void**)data)= param->ptr.data;
|
||||
} else {
|
||||
raise_error= 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* data==NULL, assign to RNA */
|
||||
if(RNA_struct_is_a(¶m->ptr, ptype)) {
|
||||
RNA_property_pointer_set(ptr, prop, param->ptr);
|
||||
} else {
|
||||
PointerRNA tmp;
|
||||
RNA_pointer_create(NULL, ptype, NULL, &tmp);
|
||||
PyErr_Format(PyExc_TypeError, "expected a %s type", RNA_struct_identifier(&tmp));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if(raise_error) {
|
||||
PointerRNA tmp;
|
||||
RNA_pointer_create(NULL, ptype, NULL, &tmp);
|
||||
PyErr_Format(PyExc_TypeError, "expected a %s type", RNA_struct_identifier(&tmp));
|
||||
@ -403,7 +444,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
|
||||
break;
|
||||
}
|
||||
case PROP_COLLECTION:
|
||||
PyErr_SetString(PyExc_AttributeError, "cant assign to collections");
|
||||
PyErr_SetString(PyExc_AttributeError, "cant convert collections yet");
|
||||
return -1;
|
||||
break;
|
||||
default:
|
||||
@ -778,7 +819,7 @@ static int pyrna_struct_setattro( BPy_StructRNA * self, PyObject *pyname, PyObje
|
||||
}
|
||||
|
||||
/* pyrna_py_to_prop sets its own exceptions */
|
||||
return pyrna_py_to_prop(&self->ptr, prop, value);
|
||||
return pyrna_py_to_prop(&self->ptr, prop, NULL, value);
|
||||
}
|
||||
|
||||
PyObject *pyrna_prop_keys(BPy_PropertyRNA *self)
|
||||
@ -961,197 +1002,6 @@ static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *k
|
||||
}
|
||||
}
|
||||
|
||||
int pyrna_py_to_param(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value)
|
||||
{
|
||||
/* XXX hard limits should be checked here */
|
||||
int type = RNA_property_type(ptr, prop);
|
||||
int len = RNA_property_array_length(ptr, prop);
|
||||
|
||||
if (len > 0) {
|
||||
PyObject *item;
|
||||
int i;
|
||||
|
||||
if (!PySequence_Check(value)) {
|
||||
PyErr_SetString(PyExc_TypeError, "expected a python sequence type assigned to an RNA array.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((int)PySequence_Length(value) != len) {
|
||||
PyErr_SetString(PyExc_AttributeError, "python sequence length did not match the RNA array.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* for arrays we have a limited number of types */
|
||||
switch (type) {
|
||||
case PROP_BOOLEAN:
|
||||
{
|
||||
int *param_arr = (int*)data;
|
||||
|
||||
/* collect the variables before assigning, incase one of them is incorrect */
|
||||
for (i=0; i<len; i++) {
|
||||
item = PySequence_GetItem(value, i);
|
||||
param_arr[i] = PyObject_IsTrue( item );
|
||||
Py_DECREF(item);
|
||||
|
||||
if (param_arr[i] < 0) {
|
||||
PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence is not a boolean");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case PROP_INT:
|
||||
{
|
||||
int *param_arr = (int*)data;
|
||||
|
||||
/* collect the variables */
|
||||
for (i=0; i<len; i++) {
|
||||
item = PySequence_GetItem(value, i);
|
||||
param_arr[i] = (int)PyLong_AsSsize_t(item); /* deal with any errors later */
|
||||
Py_DECREF(item);
|
||||
}
|
||||
|
||||
if (PyErr_Occurred()) {
|
||||
PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence could not be used as an int");
|
||||
return -1;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case PROP_FLOAT:
|
||||
{
|
||||
float *param_arr = (float*)data;
|
||||
|
||||
/* collect the variables */
|
||||
for (i=0; i<len; i++) {
|
||||
item = PySequence_GetItem(value, i);
|
||||
param_arr[i] = (float)PyFloat_AsDouble(item); /* deal with any errors later */
|
||||
Py_DECREF(item);
|
||||
}
|
||||
|
||||
if (PyErr_Occurred()) {
|
||||
PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence could not be used as a float");
|
||||
return -1;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Normal Property (not an array) */
|
||||
|
||||
/* see if we can coorce into a python type - PropertyType */
|
||||
switch (type) {
|
||||
case PROP_BOOLEAN:
|
||||
{
|
||||
int param = PyObject_IsTrue( value );
|
||||
|
||||
if( param < 0 ) {
|
||||
PyErr_SetString(PyExc_TypeError, "expected True/False or 0/1");
|
||||
return -1;
|
||||
} else {
|
||||
*((int*)data)= param;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PROP_INT:
|
||||
{
|
||||
int param = PyLong_AsSsize_t(value);
|
||||
if (PyErr_Occurred()) {
|
||||
PyErr_SetString(PyExc_TypeError, "expected an int type");
|
||||
return -1;
|
||||
} else {
|
||||
*((int*)data)= param;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PROP_FLOAT:
|
||||
{
|
||||
float param = PyFloat_AsDouble(value);
|
||||
if (PyErr_Occurred()) {
|
||||
PyErr_SetString(PyExc_TypeError, "expected a float type");
|
||||
return -1;
|
||||
} else {
|
||||
*((float*)data)= param;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PROP_STRING:
|
||||
{
|
||||
char *param = _PyUnicode_AsString(value);
|
||||
|
||||
if (param==NULL) {
|
||||
PyErr_SetString(PyExc_TypeError, "expected a string type");
|
||||
return -1;
|
||||
} else {
|
||||
*((char**)data)= param;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PROP_ENUM:
|
||||
{
|
||||
char *param = _PyUnicode_AsString(value);
|
||||
|
||||
if (param==NULL) {
|
||||
char *enum_str= pyrna_enum_as_string(ptr, prop);
|
||||
PyErr_Format(PyExc_TypeError, "expected a string enum type in (%s)", enum_str);
|
||||
MEM_freeN(enum_str);
|
||||
return -1;
|
||||
} else {
|
||||
int val;
|
||||
if (RNA_property_enum_value(ptr, prop, param, &val)) {
|
||||
*((int*)data)= val;
|
||||
} else {
|
||||
char *enum_str= pyrna_enum_as_string(ptr, prop);
|
||||
PyErr_Format(PyExc_AttributeError, "enum \"%s\" not found in (%s)", param, enum_str);
|
||||
MEM_freeN(enum_str);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case PROP_POINTER:
|
||||
{
|
||||
StructRNA *ptype= RNA_property_pointer_type(ptr, prop);
|
||||
|
||||
if(!BPy_StructRNA_Check(value)) {
|
||||
PointerRNA tmp;
|
||||
RNA_pointer_create(NULL, ptype, NULL, &tmp);
|
||||
PyErr_Format(PyExc_TypeError, "expected a %s type", RNA_struct_identifier(&tmp));
|
||||
return -1;
|
||||
} else {
|
||||
BPy_StructRNA *param= (BPy_StructRNA*)value;
|
||||
|
||||
if(ptype == &RNA_AnyType) {
|
||||
*((PointerRNA*)data)= param->ptr;
|
||||
}
|
||||
else if(RNA_struct_is_a(¶m->ptr, ptype)) {
|
||||
*((void**)data)= param->ptr.data;
|
||||
} else {
|
||||
PointerRNA tmp;
|
||||
RNA_pointer_create(NULL, ptype, NULL, &tmp);
|
||||
PyErr_Format(PyExc_TypeError, "expected a %s type", RNA_struct_identifier(&tmp));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PROP_COLLECTION:
|
||||
PyErr_SetString(PyExc_AttributeError, "cant pass collections yet");
|
||||
return -1;
|
||||
break;
|
||||
default:
|
||||
PyErr_SetString(PyExc_AttributeError, "unknown property type (pyrna_py_to_param)");
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data)
|
||||
{
|
||||
PyObject *ret;
|
||||
@ -1305,7 +1155,7 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw)
|
||||
continue;
|
||||
}
|
||||
|
||||
err= pyrna_py_to_param(&funcptr, parm, iter.data, item);
|
||||
err= pyrna_py_to_prop(&funcptr, parm, iter.data, item);
|
||||
|
||||
if(err!=0)
|
||||
break;
|
||||
|
@ -68,7 +68,7 @@ PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr );
|
||||
PyObject *pyrna_prop_CreatePyObject( PointerRNA *ptr, PropertyRNA *prop );
|
||||
|
||||
/* operators also need this to set args */
|
||||
int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, PyObject *value);
|
||||
int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value);
|
||||
PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop);
|
||||
|
||||
/* functions for setting up new props - experemental */
|
||||
|
Loading…
Reference in New Issue
Block a user