35#define MAX_ARRAY_DIMENSION 10
83 const bool is_dynamic,
85 const char *item_type_str,
86 const char *error_prefix)
91 if (dim + 1 < totdim) {
93 const int seq_size = PySequence_Size(seq);
95 PyErr_Format(PyExc_ValueError,
96 "%s sequence expected at dimension %d, not '%s'",
99 Py_TYPE(seq)->tp_name);
102 for (
i = 0;
i < seq_size;
i++) {
103 Py_ssize_t item_seq_size;
106 item = PySequence_GetItem(seq,
i);
108 if (item ==
nullptr) {
109 PyErr_Format(PyExc_TypeError,
110 "%s sequence type '%s' failed to retrieve index %d",
112 Py_TYPE(seq)->tp_name,
116 else if ((item_seq_size = PySequence_Size(item)) == -1) {
117 PyErr_Format(PyExc_TypeError,
118 "%s expected a sequence of %s, not %s",
121 Py_TYPE(item)->tp_name);
129 else if (item_seq_size != dimsize[dim + 1]) {
130 PyErr_Format(PyExc_ValueError,
131 "%s sequences of dimension %d should contain %d items, not %d",
159 const int seq_size = PySequence_Size(seq);
160 if (seq_size == -1) {
161 PyErr_Format(PyExc_ValueError,
162 "%s sequence expected at dimension %d, not '%s'",
165 Py_TYPE(seq)->tp_name);
168 if ((seq_size != dimsize[dim]) && (is_dynamic ==
false)) {
169 PyErr_Format(PyExc_ValueError,
170 "%s sequences of dimension %d should contain %d items, not %d",
178 for (
i = 0;
i < seq_size;
i++) {
179 PyObject *item = PySequence_GetItem(seq,
i);
181 if (item ==
nullptr) {
182 PyErr_Format(PyExc_TypeError,
183 "%s sequence type '%s' failed to retrieve index %d",
185 Py_TYPE(seq)->tp_name,
189 if (!check_item_type(item)) {
191 PyErr_Format(PyExc_TypeError,
192 "%s expected sequence items of type %s, not %s",
195 Py_TYPE(item)->tp_name);
212 const Py_ssize_t seq_size = PySequence_Size(seq);
214 for (
i = 0;
i < seq_size;
i++) {
215 PyObject *item = PySequence_GetItem(seq,
i);
234 totitem = PySequence_Size(seq);
244 const bool prop_is_param_dyn_alloc,
247 const char *error_prefix)
250 int tot, totdim,
len;
256 PyErr_Format(PyExc_ValueError,
257 "%s %.200s.%.200s, error validating the sequence length",
265 if (tot_expected != tot) {
267 if (!prop_is_param_dyn_alloc) {
268 PyErr_Format(PyExc_ValueError,
269 "%s %s.%s: array length cannot be changed to %d (expected %d)",
306 for (
i = lvalue_dim;
i < totdim;
i++) {
312 PyErr_Format(PyExc_ValueError,
313 "%s %.200s.%.200s, sequence must have %d items total, not %d",
331 const bool prop_is_param_dyn_alloc,
334 const char *item_type_str,
336 const char *error_prefix)
344 if (lvalue_dim == 0) {
353 PyErr_Format(PyExc_ValueError,
354 "%s %.200s.%.200s, matrix assign to non float array",
361 PyErr_Format(PyExc_ValueError,
362 "%s %.200s.%.200s, matrix assign array with %d dimensions",
369 if (pymat->
col_num != dimsize[0] || pymat->
row_num != dimsize[1]) {
370 PyErr_Format(PyExc_ValueError,
371 "%s %.200s.%.200s, matrix assign dimension size mismatch, "
372 "is %dx%d, expected be %dx%d",
383 *r_totitem = dimsize[0] * dimsize[1];
404 rvalue,
ptr, prop, prop_is_param_dyn_alloc, lvalue_dim, r_totitem, error_prefix);
422 char *value =
static_cast<char *
>((
void *)&value_buf);
424 convert_item->
func(&convert_item->
arg, item, value);
425 rna_set_index(
ptr, prop, *index, value);
429 convert_item->
func(&convert_item->
arg, item,
data);
450 const Py_ssize_t seq_size = PySequence_Size(seq);
460 if (seq_size == -1) {
472 memcpy(
data, pymat->matrix, allocsize);
482 for (
i = 0;
i < seq_size;
i++) {
483 PyObject *item = PySequence_GetItem(seq,
i);
485 if (dim + 1 < totdim) {
487 item,
ptr, prop, dim + 1,
data, item_size, index, convert_item, rna_set_index);
491 item,
ptr, prop,
data, item_size, index, convert_item, rna_set_index);
511 const char *item_type_str,
515 const char *error_prefix)
519 char *
data =
nullptr;
530 prop_is_param_dyn_alloc,
542 if (prop_is_param_dyn_alloc) {
550 data =
static_cast<char *
>(param_alloc->
array);
552 else if (param_data) {
556 data =
static_cast<char *
>(PyMem_MALLOC(item_size * totitem));
561 if (
copy_values(seq,
ptr, prop, 0,
data, item_size,
nullptr, convert_item,
nullptr) !=
nullptr)
563 if (param_data ==
nullptr) {
565 rna_set_array(
ptr, prop,
data);
570 if (param_data ==
nullptr) {
574 PyErr_Format(PyExc_TypeError,
575 "%s internal error parsing sequence of type '%s' after successful validation",
577 Py_TYPE(seq)->tp_name);
592 const char *item_type_str,
595 const char *error_prefix)
614 for (
i = lvalue_dim;
i < totdim;
i++) {
618 index += arrayoffset;
620 if (lvalue_dim == totdim) {
621 if (!check_item_type(py)) {
622 PyErr_Format(PyExc_TypeError,
623 "%s %.200s.%.200s, expected a %s type, not %s",
628 Py_TYPE(py)->tp_name);
634 const bool prop_is_param_dyn_alloc =
false;
638 prop_is_param_dyn_alloc,
649 copy_values(py,
ptr, prop, lvalue_dim,
nullptr, 0, &index, convert_item, rna_set_index);
658 float value =
float(PyFloat_AsDouble(py));
659 CLAMP(value, range[0], range[1]);
660 *(
float *)
data = value;
666 int value = PyC_Long_AsI32(py);
667 CLAMP(value, range[0], range[1]);
668 *(
int *)
data = value;
673 *(
bool *)
data =
bool(PyObject_IsTrue(py));
679 return PyNumber_Check(py);
685 return PyLong_Check(py);
690 return PyBool_Check(py);
787 PyErr_SetString(PyExc_TypeError,
"not an array type");
802 const char *error_prefix)
858 PyErr_SetString(PyExc_TypeError,
"not an array type");
882 PyErr_SetString(PyExc_TypeError,
"not an array type");
893static PyObject *pyrna_py_from_array_internal(
PointerRNA *
ptr,
904 tuple = PyTuple_New(
len);
906 for (
i = 0;
i <
len;
i++) {
909 if (dim + 1 < totdim) {
910 item = pyrna_py_from_array_internal(
ptr, prop, dim + 1, index);
922 PyTuple_SET_ITEM(tuple,
i, item);
937 arraydim =
self ?
self->arraydim : 0;
938 arrayoffset =
self ?
self->arrayoffset : 0;
942 if (index >=
len || index < 0) {
946 PyErr_SetString(PyExc_IndexError,
"out of range");
952 if (arraydim + 1 < totdim) {
954 ret->arraydim = arraydim + 1;
964 for (
i = arraydim + 1;
i < totdim;
i++) {
968 ret->arrayoffset = arrayoffset + index;
971 index = arrayoffset + index;
975 return (PyObject *)
ret;
1006 PyErr_SetString(PyExc_TypeError,
"PropertyRNA - multi dimensional arrays not supported yet");
1014 const float value_f = PyFloat_AsDouble(value);
1015 if (value_f == -1 && PyErr_Occurred()) {
1023 if (
len *
sizeof(
float) >
sizeof(tmp)) {
1024 tmp_arr =
static_cast<float *
>(PyMem_MALLOC(
len *
sizeof(
float)));
1032 for (
i = 0;
i <
len;
i++) {
1033 if (tmp_arr[
i] == value_f) {
1038 if (tmp_arr != tmp) {
1039 PyMem_FREE(tmp_arr);
1042 return i <
len ? 1 : 0;
1045 const int value_i = PyC_Long_AsI32(value);
1046 if (value_i == -1 && PyErr_Occurred()) {
1054 if (
len *
sizeof(
int) >
sizeof(tmp)) {
1055 tmp_arr =
static_cast<int *
>(PyMem_MALLOC(
len *
sizeof(
int)));
1063 for (
i = 0;
i <
len;
i++) {
1064 if (tmp_arr[
i] == value_i) {
1069 if (tmp_arr != tmp) {
1070 PyMem_FREE(tmp_arr);
1073 return i <
len ? 1 : 0;
1077 if (value_i == -1 && PyErr_Occurred()) {
1085 if (
len *
sizeof(
bool) >
sizeof(tmp)) {
1086 tmp_arr =
static_cast<bool *
>(PyMem_MALLOC(
len *
sizeof(
bool)));
1094 for (
i = 0;
i <
len;
i++) {
1095 if (tmp_arr[
i] ==
bool(value_i)) {
1100 if (tmp_arr != tmp) {
1101 PyMem_FREE(tmp_arr);
1104 return i <
len ? 1 : 0;
1109 PyErr_SetString(PyExc_TypeError,
"PropertyRNA - type not in float/bool/int");
struct CLG_LogRef * BPY_LOG_RNA
#define CLOG_WARN(clg_ref,...)
Read Guarded memory(de)allocation.
BMesh const char void * data
PyObject * pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
PyObject * pyrna_prop_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop)
static void py_to_float(const ItemConvertArgData *arg, PyObject *py, char *data)
int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, char *param_data, PyObject *py, const char *error_prefix)
static void convert_item_init_bool(PointerRNA *, PropertyRNA *, ItemConvert_FuncArg *convert_item)
static void int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
#define MAX_ARRAY_DIMENSION
static void py_to_bool(const ItemConvertArgData *, PyObject *py, char *data)
static void convert_item_init_int(PointerRNA *ptr, PropertyRNA *prop, ItemConvert_FuncArg *convert_item)
PyObject * pyrna_array_index(PointerRNA *ptr, PropertyRNA *prop, int index)
void(*)(PointerRNA *ptr, PropertyRNA *prop, const char *data) RNA_SetArrayFunc
static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[], const bool is_dynamic, ItemTypeCheckFunc check_item_type, const char *item_type_str, const char *error_prefix)
static int py_float_check(PyObject *py)
static int py_int_check(PyObject *py)
int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
static int validate_array(PyObject *rvalue, PointerRNA *ptr, PropertyRNA *prop, const bool prop_is_param_dyn_alloc, int lvalue_dim, ItemTypeCheckFunc check_item_type, const char *item_type_str, int *r_totitem, const char *error_prefix)
static void bool_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
int pyrna_py_to_array_index(PointerRNA *ptr, PropertyRNA *prop, int arraydim, int arrayoffset, int index, PyObject *py, const char *error_prefix)
int(*)(PyObject *py_data) ItemTypeCheckFunc
static void float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
static int count_items(PyObject *seq, int dim)
static char * copy_values(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop, int dim, char *data, uint item_size, int *index, const ItemConvert_FuncArg *convert_item, RNA_SetIndexFunc rna_set_index)
static void convert_item_init_float(PointerRNA *ptr, PropertyRNA *prop, ItemConvert_FuncArg *convert_item)
static void py_to_int(const ItemConvertArgData *arg, PyObject *py, char *data)
static int py_to_array(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop, char *param_data, ItemTypeCheckFunc check_item_type, const char *item_type_str, int item_size, const ItemConvert_FuncArg *convert_item, RNA_SetArrayFunc rna_set_array, const char *error_prefix)
static int py_to_array_index(PyObject *py, PointerRNA *ptr, PropertyRNA *prop, int lvalue_dim, int arrayoffset, int index, ItemTypeCheckFunc check_item_type, const char *item_type_str, const ItemConvert_FuncArg *convert_item, RNA_SetIndexFunc rna_set_index, const char *error_prefix)
void(*)(const ItemConvertArgData *arg, PyObject *py_data, char *data) ItemConvertFunc
static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA *prop, const bool prop_is_param_dyn_alloc, int lvalue_dim, int *r_totitem, const char *error_prefix)
static int py_bool_check(PyObject *py)
PyObject * pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, int index)
void(*)(PointerRNA *ptr, PropertyRNA *prop, int index, void *data_item) RNA_SetIndexFunc
static char * copy_value_single(PyObject *item, PointerRNA *ptr, PropertyRNA *prop, char *data, uint item_size, int *index, const ItemConvert_FuncArg *convert_item, RNA_SetIndexFunc rna_set_index)
PyObject * pyrna_py_from_array(PointerRNA *ptr, PropertyRNA *prop)
void * MEM_callocN(size_t len, const char *str)
#define BaseMath_ReadCallback(_self)
#define MatrixObject_Check(v)
int PyC_Long_AsBool(PyObject *value)
void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, bool value)
void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
int RNA_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int dimension)
void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax)
void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, bool *values)
PropertyType RNA_property_type(PropertyRNA *prop)
const char * RNA_struct_identifier(const StructRNA *type)
void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
int RNA_property_array_dimension(const PointerRNA *ptr, PropertyRNA *prop, int length[])
int RNA_property_flag(PropertyRNA *prop)
int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax)
bool RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
const char * RNA_property_identifier(const PropertyRNA *prop)
void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const bool *values)
struct ItemConvertArgData::@316277031275127263372054374375144332075330175013::@213047110356052136111304134164253307351055121222 int_data
struct ItemConvertArgData::@316277031275127263372054374375144332075330175013::@317046063310311204040345346052142055330051031367 float_data