[Bf-blender-cvs] [3d5585fac48] master: Fix T61563: Info space prints matrices as flat tuple

Sebastian Parborg noreply at git.blender.org
Thu Feb 21 02:42:58 CET 2019


Commit: 3d5585fac48ef5ccc7943b05fdb4189fe6e57f0a
Author: Sebastian Parborg
Date:   Thu Feb 21 12:30:47 2019 +1100
Branches: master
https://developer.blender.org/rB3d5585fac48ef5ccc7943b05fdb4189fe6e57f0a

Fix T61563: Info space prints matrices as flat tuple

Add support for printing multi-dimensional arrays.

===================================================================

M	source/blender/makesrna/intern/rna_access.c

===================================================================

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;



More information about the Bf-blender-cvs mailing list