[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18067] branches/blender2.5/blender/source /blender: * added RNA_property_as_string to rna_access. c - can print most types except for pointers and collections.

Campbell Barton ideasman42 at gmail.com
Fri Dec 26 04:57:09 CET 2008


Revision: 18067
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18067
Author:   campbellbarton
Date:     2008-12-26 04:56:52 +0100 (Fri, 26 Dec 2008)

Log Message:
-----------
* added RNA_property_as_string to rna_access.c - can print most types except for pointers and collections.
* WM_operator_pystring to print the python func+args for an operator
* call WM_operator_print(op) in wm_operator_invoke(), simple echo mode should be moved later.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/RNA_access.h	2008-12-26 02:06:54 UTC (rev 18066)
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_access.h	2008-12-26 03:56:52 UTC (rev 18067)
@@ -331,6 +331,9 @@
 /* check if the idproperty exists, for operators */
 int RNA_property_is_set(PointerRNA *ptr, const char *name);
 
+/* python compatible string representation of this property, (must be freed!) */
+char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop);
+
 #endif /* RNA_ACCESS */
 
 

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c	2008-12-26 02:06:54 UTC (rev 18066)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c	2008-12-26 03:56:52 UTC (rev 18067)
@@ -1679,3 +1679,93 @@
 	}
 }
 
+/* string representation of a property, python compatible but
+ * cant be used for display too*/
+char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
+{
+	int type = RNA_property_type(ptr, prop);
+	int len = RNA_property_array_length(ptr, prop);
+	int i;
+
+	DynStr *dynstr= BLI_dynstr_new();
+	char *cstring;
+	
+
+	/* see if we can coorce into a python type - PropertyType */
+	switch (type) {
+	case PROP_BOOLEAN:
+		if (len==0) {
+			BLI_dynstr_append(dynstr, RNA_property_boolean_get(ptr, prop) ? "True" : "False");
+		}
+		else {
+			BLI_dynstr_append(dynstr, "(");
+			for(i=0; i<len; i++) {
+				BLI_dynstr_appendf(dynstr, i?"%s, ":"%s", RNA_property_boolean_get_array(ptr, prop, i) ? "True" : "False");
+			}
+			BLI_dynstr_append(dynstr, ")");
+		}
+		break;
+	case PROP_INT:
+		if (len==0) {
+			BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get(ptr, prop));
+		}
+		else {
+			BLI_dynstr_append(dynstr, "(");
+			for(i=0; i<len; i++) {
+				BLI_dynstr_appendf(dynstr, i?"%d, ":"%d", RNA_property_int_get_array(ptr, prop, i));
+			}
+			BLI_dynstr_append(dynstr, ")");
+		}
+		break;
+	case PROP_FLOAT:
+		if (len==0) {
+			BLI_dynstr_appendf(dynstr, "%f", RNA_property_int_get(ptr, prop));
+		}
+		else {
+			BLI_dynstr_append(dynstr, "(");
+			for(i=0; i<len; i++) {
+				BLI_dynstr_appendf(dynstr, i?"%f, ":"%f", RNA_property_float_get_array(ptr, prop, i));
+			}
+			BLI_dynstr_append(dynstr, ")");
+		}
+		break;
+	case PROP_STRING:
+	{
+		/* string arrays dont exist */
+		char *buf;
+		buf = RNA_property_string_get_alloc(ptr, prop, NULL, -1);
+		BLI_dynstr_appendf(dynstr, "\"%s\"", buf);
+		MEM_freeN(buf);
+		break;
+	}
+	case PROP_ENUM:
+	{
+		/* string arrays dont exist */
+		const char *identifier;
+		int val = RNA_property_enum_get(ptr, prop);
+
+		if (RNA_property_enum_identifier(ptr, prop, val, &identifier)) {
+			BLI_dynstr_appendf(dynstr, "'%s'", identifier);
+		}
+		else {
+			BLI_dynstr_appendf(dynstr, "'<UNKNOWN ENUM>'", identifier);
+		}
+		break;
+	}
+	case PROP_POINTER:
+	{
+		BLI_dynstr_append(dynstr, "'<POINTER>'"); /* TODO */
+		break;
+	}
+	case PROP_COLLECTION:
+		BLI_dynstr_append(dynstr, "'<COLLECTION>'"); /* TODO */
+		break;
+	default:
+		BLI_dynstr_append(dynstr, "'<UNKNOWN TYPE>'"); /* TODO */
+		break;
+	}
+
+	cstring = BLI_dynstr_get_cstring(dynstr);
+	BLI_dynstr_free(dynstr);
+	return cstring;
+}
\ No newline at end of file

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2008-12-26 02:06:54 UTC (rev 18066)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2008-12-26 03:56:52 UTC (rev 18067)
@@ -124,6 +124,9 @@
 int			WM_operator_call		(struct bContext *C, struct wmOperator *op);
 int         WM_operator_name_call	(struct bContext *C, const char *opstring, int context, struct IDProperty *properties);
 
+/* operator as a python command (resultuing string must be free'd) */
+char *WM_operator_pystring(struct wmOperator *op);
+
 			/* default operator callbacks for border/circle/lasso */
 int			WM_border_select_invoke	(struct bContext *C, wmOperator *op, struct wmEvent *event);
 int			WM_border_select_modal	(struct bContext *C, wmOperator *op, struct wmEvent *event);

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2008-12-26 02:06:54 UTC (rev 18066)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2008-12-26 03:56:52 UTC (rev 18067)
@@ -277,6 +277,13 @@
 
 /* ********************* operators ******************* */
 
+static void WM_operator_print(wmOperator *op)
+{
+	char *buf = WM_operator_pystring(op);
+	printf("%s\n", buf);
+	MEM_freeN(buf);
+}
+
 /* for running operators with frozen context (modal handlers, menus) */
 int WM_operator_call(bContext *C, wmOperator *op)
 {
@@ -289,8 +296,8 @@
 		wm_operator_register(CTX_wm_manager(C), op);
 	}
 	else
-		WM_operator_free(op);	
-	
+		WM_operator_free(op);
+
 	return retval;
 }
 
@@ -317,6 +324,9 @@
 		else if(op->type->exec)
 			retval= op->type->exec(C, op);
 
+		/* only for testing, can remove any time */
+		WM_operator_print(op);
+
 		if((retval & OPERATOR_FINISHED) && (ot->flag & OPTYPE_REGISTER)) {
 			wm_operator_register(wm, op);
 		}

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c	2008-12-26 02:06:54 UTC (rev 18066)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c	2008-12-26 03:56:52 UTC (rev 18067)
@@ -36,6 +36,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_dynstr.h" /*for WM_operator_pystring */
 
 #include "BKE_blender.h"
 #include "BKE_context.h"
@@ -95,6 +96,48 @@
 	BLI_addtail(&global_ops, ot);
 }
 
+/* print a string representation of the operator, with the args that it runs 
+ * so python can run it again */
+char *WM_operator_pystring(wmOperator *op)
+{
+	const char *arg_name= NULL;
+
+	PropertyRNA *prop, *iterprop;
+	CollectionPropertyIterator iter;
+
+	/* for building the string */
+	DynStr *dynstr= BLI_dynstr_new();
+	char *cstring, *buf;
+	int first_iter=1;
+
+	BLI_dynstr_appendf(dynstr, "%s(", op->idname);
+
+	iterprop= RNA_struct_iterator_property(op->ptr);
+	RNA_property_collection_begin(op->ptr, iterprop, &iter);
+
+	for(; iter.valid; RNA_property_collection_next(&iter)) {
+		prop= iter.ptr.data;
+		arg_name= RNA_property_identifier(&iter.ptr, prop);
+
+		if (strcmp(arg_name, "rna_type")==0) continue;
+
+		buf= RNA_property_as_string(op->ptr, prop);
+		
+		BLI_dynstr_appendf(dynstr, first_iter?"%s=%s":", %s=%s", arg_name, buf);
+
+		MEM_freeN(buf);
+		first_iter = 0;
+	}
+
+	RNA_property_collection_end(&iter);
+
+	BLI_dynstr_append(dynstr, ")");
+
+	cstring = BLI_dynstr_get_cstring(dynstr);
+	BLI_dynstr_free(dynstr);
+	return cstring;
+}
+
 /* ************ default op callbacks, exported *********** */
 
 /* invoke callback, uses enum property named "type" */





More information about the Bf-blender-cvs mailing list