Revision: 21419
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21419
Author:   campbellbarton
Date:     2009-07-08 11:23:49 +0200 (Wed, 08 Jul 2009)

Log Message:
-----------
* workaround for PySys_SetArgv() in python3 needing wchar_t
* PyRNA - id_struct.keyframe_insert("path", index, frame)

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
    branches/blender2.5/blender/source/gameengine/Ketsji/KX_PythonInit.cpp

Modified: 
branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c    
2009-07-08 07:02:59 UTC (rev 21418)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c    
2009-07-08 09:23:49 UTC (rev 21419)
@@ -187,7 +187,21 @@
 
        Py_Initialize(  );
        
-       //PySys_SetArgv( argc_copy, argv_copy );
+#if (PY_VERSION_HEX < 0x03000000)
+       PySys_SetArgv( argc, argv);
+#else
+       /* sigh, why do python guys not have a char** version anymore? :( */
+       {
+               int i;
+               PyObject *py_argv= PyList_New(argc);
+
+               for (i=0; i<argc; i++)
+                       PyList_SET_ITEM(py_argv, i, 
PyUnicode_FromString(argv[i]));
+
+               PySys_SetObject("argv", py_argv);
+               Py_DECREF(py_argv);
+       }
+#endif
        
        /* Initialize thread support (also acquires lock) */
        PyEval_InitThreads();

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c  
2009-07-08 07:02:59 UTC (rev 21418)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c  
2009-07-08 09:23:49 UTC (rev 21419)
@@ -40,6 +40,10 @@
 #include "BKE_global.h" /* evil G.* */
 #include "BKE_report.h"
 
+/* only for keyframing */
+#include "DNA_scene_types.h"
+#include "ED_keyframing.h"
+
 #define USE_MATHUTILS
 
 #ifdef USE_MATHUTILS
@@ -312,10 +316,17 @@
                        /* don't throw error here, can't trust blender 100% to 
give the
                         * right values, python code should not generate error 
for that */
                        RNA_property_enum_items(ptr, prop, &item, NULL);
-                       if(item[0].identifier)
-                               ret = PyUnicode_FromString( item[0].identifier 
);
-                       else
+                       if(item->identifier) {
+                               ret = PyUnicode_FromString( item->identifier );
+                       }
+                       else {
+                               /* prefer not fail silently incase of api 
errors, maybe disable it later */
+                               char error_str[128];
+                               sprintf(error_str, "RNA Warning: Current value 
\"%d\" matches no enum", val);
+                               PyErr_Warn(PyExc_RuntimeWarning, error_str);
+
                                ret = PyUnicode_FromString( "" );
+                       }
 
                        /*PyErr_Format(PyExc_AttributeError, "RNA Error: 
Current value \"%d\" matches no enum", val);
                        ret = NULL;*/
@@ -913,8 +924,12 @@
        if (PyUnicode_Check(key)) {
                return prop_subscript_collection_str(self, 
_PyUnicode_AsString(key));
        }
-       else if (PyLong_Check(key)) {
-               return prop_subscript_collection_int(self, 
PyLong_AsSsize_t(key));
+       else if (PyIndex_Check(key)) {
+               Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
+               if (i == -1 && PyErr_Occurred())
+                       return NULL;
+
+               return prop_subscript_collection_int(self, i);
        }
 #if PY_VERSION_HEX >= 0x03000000
        else if (PySlice_Check(key)) {
@@ -947,7 +962,10 @@
        /*if (PyUnicode_Check(key)) {
                return prop_subscript_array_str(self, _PyUnicode_AsString(key));
        } else*/
-       if (PyLong_Check(key)) {
+       if (PyIndex_Check(key)) {
+               Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
+               if (i == -1 && PyErr_Occurred())
+                       return NULL;
                return prop_subscript_array_int(self, PyLong_AsSsize_t(key));
        }
 #if PY_VERSION_HEX >= 0x03000000
@@ -1037,8 +1055,12 @@
                return -1;
        }
 
-       if (PyLong_Check(key)) {
-               return prop_subscript_ass_array_int(self, 
PyLong_AsSsize_t(key), value);
+       if (PyIndex_Check(key)) {
+               Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
+               if (i == -1 && PyErr_Occurred())
+                       return NULL;
+
+               return prop_subscript_ass_array_int(self, i, value);
        }
 #if PY_VERSION_HEX >= 0x03000000
        else if (PySlice_Check(key)) {
@@ -1106,6 +1128,25 @@
        (objobjproc)pyrna_prop_contains,        /* sq_contains */
 };
 
+
+static PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA * self, PyObject 
*args)
+{
+       char *path;
+       int index= 0;
+       float cfra = CTX_data_scene(BPy_GetContext())->r.cfra;
+
+       if(!RNA_struct_is_ID(self->ptr.type)) {
+               PyErr_SetString( PyExc_TypeError, "StructRNA - keyframe_insert 
only for ID type");
+               return NULL;
+       }
+
+       if (!PyArg_ParseTuple(args, "s|if:keyframe_insert", &path, &index, 
&cfra))
+               return NULL;
+
+       return PyBool_FromLong( insert_keyframe((ID *)self->ptr.data, NULL, 
NULL, path, index, cfra, 0));
+}
+
+
 static PyObject *pyrna_struct_dir(BPy_StructRNA * self)
 {
        PyObject *ret, *dict;
@@ -1645,6 +1686,10 @@
 }
 
 static struct PyMethodDef pyrna_struct_methods[] = {
+
+       /* maybe this become and ID function */
+       {"keyframe_insert", (PyCFunction)pyrna_struct_keyframe_insert, 
METH_VARARGS, NULL},
+
        {"__dir__", (PyCFunction)pyrna_struct_dir, METH_NOARGS, NULL},
        {NULL, NULL, 0, NULL}
 };

Modified: branches/blender2.5/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
===================================================================
--- branches/blender2.5/blender/source/gameengine/Ketsji/KX_PythonInit.cpp      
2009-07-08 07:02:59 UTC (rev 21418)
+++ branches/blender2.5/blender/source/gameengine/Ketsji/KX_PythonInit.cpp      
2009-07-08 09:23:49 UTC (rev 21419)
@@ -1622,10 +1622,20 @@
        Py_FrozenFlag=1;
        Py_Initialize();
        
+       if(argv && first_time) { /* browser plugins dont currently set this */
 #if (PY_VERSION_HEX < 0x03000000)      
-       if(argv && first_time) /* browser plugins dont currently set this */
                PySys_SetArgv(argc, argv);
+#else
+               int i;
+               PyObject *py_argv= PyList_New(argc);
+
+               for (i=0; i<argc; i++)
+                       PyList_SET_ITEM(py_argv, i, 
PyUnicode_FromString(argv[i]));
+
+               PySys_SetObject("argv", py_argv);
+               Py_DECREF(py_argv);
 #endif
+       }
        //importBlenderModules()
        
        setSandbox(level);


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

Reply via email to