diff options
author | Sebastian Parborg <darkdefende@gmail.com> | 2019-02-21 04:30:47 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-02-21 04:42:29 +0300 |
commit | 3d5585fac48ef5ccc7943b05fdb4189fe6e57f0a (patch) | |
tree | f03719292b928a9c22b7a5474d1234a3920fde92 /source | |
parent | 94f83a4ebd929e7c4f405b1c78d9db842dfe1689 (diff) |
Fix T61563: Info space prints matrices as flat tuple
Add support for printing multi-dimensional arrays.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/makesrna/intern/rna_access.c | 132 |
1 files changed, 89 insertions, 43 deletions
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 3081984a825..0bd6c5352b6 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -6316,6 +6316,92 @@ static const char *bool_as_py_string(const int var) return var ? "True" : "False"; } +static void *rna_array_as_string_alloc(int type, int len, PointerRNA *ptr, PropertyRNA *prop) +{ + void *buf_ret = NULL; + if (type == PROP_BOOLEAN) { + bool *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len, __func__); + RNA_property_boolean_get_array(ptr, prop, buf); + } + else if (type == PROP_INT) { + int *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len, __func__); + RNA_property_int_get_array(ptr, prop, buf); + } + else if (type == PROP_FLOAT) { + float *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len, __func__); + RNA_property_float_get_array(ptr, prop, buf); + } + else { + BLI_assert(0); + } + return buf_ret; +} + +static void rna_array_as_string_elem( + int type, void **buf_p, int len, DynStr *dynstr) +{ + /* This will print a comma seperated string of the array elements from + * buf start to len. We will add a comma if len == 1 to preserve tuples. */ + const int end = len - 1; + if (type == PROP_BOOLEAN) { + bool *buf = *buf_p; + for (int i = 0; i < len; i++, buf++) { + BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%s, " : "%s", bool_as_py_string(*buf)); + } + *buf_p = buf; + } + else if (type == PROP_INT) { + int *buf = *buf_p; + for (int i = 0; i < len; i++, buf++) { + BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%d, " : "%d", *buf); + } + *buf_p = buf; + } + else if (type == PROP_FLOAT) { + float *buf = *buf_p; + for (int i = 0; i < len; i++, buf++) { + BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%g, " : "%g", *buf); + } + *buf_p = buf; + } + else { + BLI_assert(0); + } +} + +static void rna_array_as_string_recursive( + int type, void **buf_p, int totdim, const int *dim_size, DynStr *dynstr) +{ + BLI_dynstr_append(dynstr, "("); + if (totdim > 1) { + totdim--; + const int end = dim_size[totdim] - 1; + for (int i = 0; i <= end; i++){ + rna_array_as_string_recursive(type, buf_p, totdim, dim_size, dynstr); + if (i < end || !end) { + BLI_dynstr_append(dynstr, ", "); + } + } + } + else { + rna_array_as_string_elem(type, buf_p, dim_size[0], dynstr); + } + BLI_dynstr_append(dynstr, ")"); +} + +static void rna_array_as_string(int type, int len, PointerRNA *ptr, PropertyRNA *prop, DynStr *dynstr) +{ + void *buf = rna_array_as_string_alloc(type, len, ptr, prop); + void *temp_buf = buf; + int totdim, dim_size[RNA_MAX_ARRAY_DIMENSION]; + + totdim = RNA_property_array_dimension(ptr, prop, dim_size); + + rna_array_as_string_recursive(type, &temp_buf, totdim, dim_size, dynstr); + BLI_assert(temp_buf == (char *)buf + MEM_allocN_len(buf)); + MEM_freeN(buf); +} + char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop, int index, int max_prop_length) { int type = RNA_property_type(prop); @@ -6324,7 +6410,6 @@ char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop, in DynStr *dynstr = BLI_dynstr_new(); char *cstring; - /* see if we can coerce into a python type - PropertyType */ switch (type) { case PROP_BOOLEAN: @@ -6336,20 +6421,7 @@ char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop, in BLI_dynstr_append(dynstr, bool_as_py_string(RNA_property_boolean_get_index(ptr, prop, index))); } else { - bool fixedbuf[RNA_MAX_ARRAY_LENGTH]; - bool *buf = ARRAY_SIZE(fixedbuf) >= len ? fixedbuf : MEM_mallocN(sizeof(*buf) * len, __func__); - - RNA_property_boolean_get_array(ptr, prop, buf); - BLI_dynstr_append(dynstr, "("); - for (int i = 0; i < len; i++) { - BLI_dynstr_appendf(dynstr, i ? ", %s" : "%s", bool_as_py_string(buf[i])); - } - if (len == 1) - BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */ - BLI_dynstr_append(dynstr, ")"); - if (buf != fixedbuf) { - MEM_freeN(buf); - } + rna_array_as_string(type, len, ptr, prop, dynstr); } } break; @@ -6362,20 +6434,7 @@ char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop, in BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get_index(ptr, prop, index)); } else { - int fixedbuf[RNA_MAX_ARRAY_LENGTH]; - int *buf = ARRAY_SIZE(fixedbuf) >= len ? fixedbuf : MEM_mallocN(sizeof(*buf) * len, __func__); - - RNA_property_int_get_array(ptr, prop, buf); - BLI_dynstr_append(dynstr, "("); - for (int i = 0; i < len; i++) { - BLI_dynstr_appendf(dynstr, i ? ", %d" : "%d", buf[i]); - } - if (len == 1) - BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */ - BLI_dynstr_append(dynstr, ")"); - if (buf != fixedbuf) { - MEM_freeN(buf); - } + rna_array_as_string(type, len, ptr, prop, dynstr); } } break; @@ -6388,20 +6447,7 @@ char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop, in BLI_dynstr_appendf(dynstr, "%g", RNA_property_float_get_index(ptr, prop, index)); } else { - float fixedbuf[RNA_MAX_ARRAY_LENGTH]; - float *buf = ARRAY_SIZE(fixedbuf) >= len ? fixedbuf : MEM_mallocN(sizeof(*buf) * len, __func__); - - RNA_property_float_get_array(ptr, prop, buf); - BLI_dynstr_append(dynstr, "("); - for (int i = 0; i < len; i++) { - BLI_dynstr_appendf(dynstr, i ? ", %g" : "%g", buf[i]); - } - if (len == 1) - BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */ - BLI_dynstr_append(dynstr, ")"); - if (buf != fixedbuf) { - MEM_freeN(buf); - } + rna_array_as_string(type, len, ptr, prop, dynstr); } } break; |