Revision: 20648
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20648
Author:   campbellbarton
Date:     2009-06-05 14:48:58 +0200 (Fri, 05 Jun 2009)

Log Message:
-----------
PyRNA
- Support for python to convert a PyObject into a collection (uses a list of 
dicts - quite verbose :/)
- Operators can now take collection args when called from python.
- Support for printing operators that use collections (macro recording).
- Added RNA_pointer_as_string which prints all pointer prop values as a python 
dict.

Example that can run in the in test.py (F7 key)
bpy.ops.VIEW3D_OT_select_lasso(path=[{"loc":(0, 0), "time":0}, {"loc":(1000, 
0), "time":0}, {"loc":(1000, 1000), "time":0}], type='SELECT')

for some reason lasso locations always print as 0,0. Need to look into why this 
is.

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/python/intern/bpy_operator.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_operator.h
    branches/blender2.5/blender/source/blender/python/intern/bpy_operator_wrap.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.h
    branches/blender2.5/blender/source/blender/python/intern/bpy_ui.c

Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/RNA_access.h    
2009-06-05 11:51:27 UTC (rev 20647)
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_access.h    
2009-06-05 12:48:58 UTC (rev 20648)
@@ -536,6 +536,7 @@
 
 /* python compatible string representation of this property, (must be freed!) 
*/
 char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop);
+char *RNA_pointer_as_string(PointerRNA *ptr);
 
 /* Function */
 

Modified: 
branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c     
2009-06-05 11:51:27 UTC (rev 20647)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c     
2009-06-05 12:48:58 UTC (rev 20648)
@@ -2185,6 +2185,47 @@
 
 /* string representation of a property, python
  * compatible but can be used for display too*/
+char *RNA_pointer_as_string(PointerRNA *ptr)
+{
+       DynStr *dynstr= BLI_dynstr_new();
+       char *cstring;
+       
+       PropertyRNA *prop, *iterprop;
+       CollectionPropertyIterator iter;
+       const char *propname;
+       int first_time = 1;
+       
+       BLI_dynstr_append(dynstr, "{");
+       
+       iterprop= RNA_struct_iterator_property(ptr->type);
+       RNA_property_collection_begin(ptr, iterprop, &iter);
+
+       for(; iter.valid; RNA_property_collection_next(&iter)) {
+               prop= iter.ptr.data;
+               propname = RNA_property_identifier(prop);
+               
+               if(strcmp(propname, "rna_type")==0)
+                       continue;
+               
+               if(first_time==0)
+                       BLI_dynstr_append(dynstr, ", ");
+               first_time= 0;
+               
+               cstring = RNA_property_as_string(&iter.ptr, prop);
+               BLI_dynstr_appendf(dynstr, "\"%s\":%s", propname, cstring);
+               MEM_freeN(cstring);
+               first_time= 0;
+       }
+
+       RNA_property_collection_end(&iter);
+       BLI_dynstr_append(dynstr, "}"); 
+       
+       
+       cstring = BLI_dynstr_get_cstring(dynstr);
+       BLI_dynstr_free(dynstr);
+       return cstring;
+}
+
 char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
 {
        int type = RNA_property_type(prop);
@@ -2262,8 +2303,28 @@
                break;
        }
        case PROP_COLLECTION:
-               BLI_dynstr_append(dynstr, "'<COLLECTION>'"); /* TODO */
+       {
+               int first_time = 1;
+               CollectionPropertyIterator collect_iter;
+               BLI_dynstr_append(dynstr, "[");
+               
+               for(RNA_property_collection_begin(ptr, prop, &collect_iter); 
collect_iter.valid; RNA_property_collection_next(&collect_iter)) {
+                       PointerRNA itemptr= collect_iter.ptr;
+                       
+                       if(first_time==0)
+                               BLI_dynstr_append(dynstr, ", ");
+                       first_time= 0;
+                       
+                       /* now get every prop of the collection */
+                       cstring= RNA_pointer_as_string(&itemptr);
+                       BLI_dynstr_append(dynstr, cstring);
+                       MEM_freeN(cstring);
+               }
+               
+               RNA_property_collection_end(&collect_iter);
+               BLI_dynstr_append(dynstr, "]");
                break;
+       }
        default:
                BLI_dynstr_append(dynstr, "'<UNKNOWN TYPE>'"); /* TODO */
                break;

Modified: 
branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c     
2009-06-05 11:51:27 UTC (rev 20647)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c     
2009-06-05 12:48:58 UTC (rev 20648)
@@ -41,73 +41,6 @@
 
 extern ListBase global_ops; /* evil, temp use */
 
-
-
-/* This function is only used by operators right now
- * Its used for taking keyword args and filling in property values */
-int PYOP_props_from_dict(PointerRNA *ptr, PyObject *kw)
-{
-       int error_val = 0;
-       int totkw;
-       const char *arg_name= NULL;
-       PyObject *item;
-
-       PropertyRNA *prop, *iterprop;
-       CollectionPropertyIterator iter;
-
-       iterprop= RNA_struct_iterator_property(ptr->type);
-       RNA_property_collection_begin(ptr, iterprop, &iter);
-
-       totkw = kw ? PyDict_Size(kw):0;
-
-       for(; iter.valid; RNA_property_collection_next(&iter)) {
-               prop= iter.ptr.data;
-
-               arg_name= RNA_property_identifier(prop);
-
-               if (strcmp(arg_name, "rna_type")==0) continue;
-
-               if (kw==NULL) {
-                       PyErr_Format( PyExc_AttributeError, "no args, expected 
\"%s\"", arg_name ? arg_name : "<UNKNOWN>");
-                       error_val= -1;
-                       break;
-               }
-
-               item= PyDict_GetItemString(kw, arg_name);
-
-               if (item == NULL) {
-                       PyErr_Format( PyExc_AttributeError, "argument \"%s\" 
missing", arg_name ? arg_name : "<UNKNOWN>");
-                       error_val = -1; /* pyrna_py_to_prop sets the error */
-                       break;
-               }
-
-               if (pyrna_py_to_prop(ptr, prop, NULL, item)) {
-                       error_val= -1;
-                       break;
-               }
-
-               totkw--;
-       }
-
-       RNA_property_collection_end(&iter);
-
-       if (error_val==0 && totkw > 0) { /* some keywords were given that were 
not used :/ */
-               PyObject *key, *value;
-               Py_ssize_t pos = 0;
-
-               while (PyDict_Next(kw, &pos, &key, &value)) {
-                       arg_name= _PyUnicode_AsString(key);
-                       if (RNA_struct_find_property(ptr, arg_name) == NULL) 
break;
-                       arg_name= NULL;
-               }
-
-               PyErr_Format( PyExc_AttributeError, "argument \"%s\" 
unrecognized", arg_name ? arg_name : "<UNKNOWN>");
-               error_val = -1;
-       }
-
-       return error_val;
-}
-
 static PyObject *pyop_base_dir(PyObject *self);
 static PyObject *pyop_base_rna(PyObject *self, PyObject *pyname);
 static struct PyMethodDef pyop_base_methods[] = {
@@ -148,7 +81,7 @@
        
        WM_operator_properties_create(&ptr, opname);
        
-       error_val= PYOP_props_from_dict(&ptr, kw);
+       error_val= pyrna_pydict_to_props(&ptr, kw, "Converting py args to 
operator properties: ");
        
        if (error_val==0) {
                ReportList reports;

Modified: 
branches/blender2.5/blender/source/blender/python/intern/bpy_operator.h
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_operator.h     
2009-06-05 11:51:27 UTC (rev 20647)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_operator.h     
2009-06-05 12:48:58 UTC (rev 20648)
@@ -42,7 +42,4 @@
 
 PyObject *BPY_operator_module(void);
 
-/* fill in properties from a python dict */
-int PYOP_props_from_dict(PointerRNA *ptr, PyObject *kw);
-
 #endif

Modified: 
branches/blender2.5/blender/source/blender/python/intern/bpy_operator_wrap.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/python/intern/bpy_operator_wrap.c    
    2009-06-05 11:51:27 UTC (rev 20647)
+++ 
branches/blender2.5/blender/source/blender/python/intern/bpy_operator_wrap.c    
    2009-06-05 12:48:58 UTC (rev 20648)
@@ -272,7 +272,7 @@
                 * thrown away anyway
                 *
                 * If we ever want to do this and use the props again,
-                * it can be done with - PYOP_props_from_dict(op->ptr, kw)
+                * it can be done with - pyrna_pydict_to_props(op->ptr, kw, "")
                 */
                
                Py_DECREF(ret);

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c  
2009-06-05 11:51:27 UTC (rev 20647)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c  
2009-06-05 12:48:58 UTC (rev 20648)
@@ -204,6 +204,71 @@
        return ret;
 }
 
+/* This function is only used by operators right now
+ * Its used for taking keyword args and filling in property values */
+int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, const char 
*error_prefix)
+{
+       int error_val = 0;
+       int totkw;
+       const char *arg_name= NULL;
+       PyObject *item;
+
+       PropertyRNA *prop, *iterprop;
+       CollectionPropertyIterator iter;
+
+       iterprop= RNA_struct_iterator_property(ptr->type);
+       RNA_property_collection_begin(ptr, iterprop, &iter);
+
+       totkw = kw ? PyDict_Size(kw):0;
+
+       for(; iter.valid; RNA_property_collection_next(&iter)) {
+               prop= iter.ptr.data;
+
+               arg_name= RNA_property_identifier(prop);
+
+               if (strcmp(arg_name, "rna_type")==0) continue;
+
+               if (kw==NULL) {
+                       PyErr_Format( PyExc_AttributeError, "%s: no keywords, 
expected \"%s\"", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
+                       error_val= -1;
+                       break;
+               }
+
+               item= PyDict_GetItemString(kw, arg_name);
+
+               if (item == NULL) {
+                       PyErr_Format( PyExc_AttributeError, "%s: keyword \"%s\" 
missing", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
+                       error_val = -1; /* pyrna_py_to_prop sets the error */
+                       break;
+               }
+
+               if (pyrna_py_to_prop(ptr, prop, NULL, item)) {
+                       error_val= -1;
+                       break;
+               }
+
+               totkw--;
+       }
+
+       RNA_property_collection_end(&iter);
+
+       if (error_val==0 && totkw > 0) { /* some keywords were given that were 
not used :/ */
+               PyObject *key, *value;
+               Py_ssize_t pos = 0;
+
+               while (PyDict_Next(kw, &pos, &key, &value)) {
+                       arg_name= _PyUnicode_AsString(key);
+                       if (RNA_struct_find_property(ptr, arg_name) == NULL) 
break;
+                       arg_name= NULL;
+               }
+
+               PyErr_Format( PyExc_AttributeError, "%s: keyword \"%s\" 
unrecognized", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
+               error_val = -1;
+       }
+
+       return error_val;
+}
+
 static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject 
*kw);
 
 PyObject *pyrna_func_to_py(PointerRNA *ptr, FunctionRNA *func)
@@ -447,9 +512,36 @@
                        break;
                }
                case PROP_COLLECTION:
-                       PyErr_SetString(PyExc_AttributeError, "cant convert 
collections yet");
-                       return -1;
+               {
+                       int seq_len, i;
+                       PyObject *item;
+                       PointerRNA itemptr;
+                       
+                       /* convert a sequence of dict's into a collection */
+                       if(!PySequence_Check(value)) {
+                               PyErr_SetString(PyExc_TypeError, "expected a 
sequence of dicts for an RNA collection");
+                               return -1;
+                       }
+                       
+                       seq_len = PySequence_Length(value);
+                       for(i=0; i<seq_len; i++) {
+                               item= PySequence_GetItem(value, i);
+                               if(item==NULL || PyDict_Check(item)==0) {
+                                       PyErr_SetString(PyExc_TypeError, 
"expected a sequence of dicts for an RNA collection");
+                                       Py_XDECREF(item);
+                                       return -1;
+                               }
+                               
+                               RNA_property_collection_add(ptr, prop, 
&itemptr);
+                               if(pyrna_pydict_to_props(&itemptr, item, 
"Converting a python list to an RNA collection")==-1) {
+                                       Py_DECREF(item);
+                                       return -1;
+                               }
+                               Py_DECREF(item);
+                       }
+                       
                        break;
+               }
                default:
                        PyErr_SetString(PyExc_AttributeError, "unknown property 
type (pyrna_py_to_prop)");
                        return -1;

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.h
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.h  
2009-06-05 11:51:27 UTC (rev 20647)

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to