[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