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" */


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to