[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21419] branches/blender2.5/blender/source : * workaround for PySys_SetArgv() in python3 needing wchar_t

Campbell Barton ideasman42 at gmail.com
Wed Jul 8 11:23:49 CEST 2009


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);





More information about the Bf-blender-cvs mailing list