diff options
author | Willian Padovani Germano <wpgermano@gmail.com> | 2007-03-30 04:57:07 +0400 |
---|---|---|
committer | Willian Padovani Germano <wpgermano@gmail.com> | 2007-03-30 04:57:07 +0400 |
commit | c86e95c84a4f0ed6021a0f5f2d7dc879faaa6a4b (patch) | |
tree | 1e587198b2093374e75036fc0fa9e50746ad024c /source/blender/python/BPY_interface.c | |
parent | f40d6754375d1cb786999e947d29b21cd5095415 (diff) |
BPython: pydrivers
-Adding name "self" to the pydriver's dictionary, so that objects can be easily referenced in their own expressions. For example, the expression:
self.LocY
for the LocX channel of an object would force this object's location in X to be equal to its location in Y. As always, feedback welcomed.
Diffstat (limited to 'source/blender/python/BPY_interface.c')
-rw-r--r-- | source/blender/python/BPY_interface.c | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c index dd5efb9296f..479a1fb5d26 100644 --- a/source/blender/python/BPY_interface.c +++ b/source/blender/python/BPY_interface.c @@ -64,6 +64,7 @@ #include "api2_2x/Blender.h" #include "api2_2x/Camera.h" #include "api2_2x/Draw.h" +#include "api2_2x/Object.h" #include "api2_2x/Registry.h" #include "api2_2x/BPyModule.h" /* for the "bpy" default module */ @@ -1070,8 +1071,10 @@ static int bpy_pydriver_create_dict(void) if (mod) { PyObject *fcn = PyObject_GetAttrString(mod, "Get"); Py_DECREF(mod); - if (fcn) + if (fcn) { PyDict_SetItemString(d, "ob", fcn); + Py_DECREF(fcn); + } } /* me(meshname) == Blender.Mesh.Get(meshname) */ @@ -1079,8 +1082,10 @@ static int bpy_pydriver_create_dict(void) if (mod) { PyObject *fcn = PyObject_GetAttrString(mod, "Get"); Py_DECREF(mod); - if (fcn) + if (fcn) { PyDict_SetItemString(d, "me", fcn); + Py_DECREF(fcn); + } } /* ma(matname) == Blender.Material.Get(matname) */ @@ -1088,8 +1093,10 @@ static int bpy_pydriver_create_dict(void) if (mod) { PyObject *fcn = PyObject_GetAttrString(mod, "Get"); Py_DECREF(mod); - if (fcn) + if (fcn) { PyDict_SetItemString(d, "ma", fcn); + Py_DECREF(fcn); + } } return 0; @@ -1170,8 +1177,9 @@ struct Object **BPY_pydriver_get_objects(IpoDriver *driver) float BPY_pydriver_eval(IpoDriver *driver) { char *expr = NULL; - PyObject *retval, *floatval; + PyObject *retval, *floatval, *bpy_ob = NULL; float result = 0.0f; /* default return */ + int setitem_retval; if (!driver) return result; @@ -1185,6 +1193,18 @@ float BPY_pydriver_eval(IpoDriver *driver) } } + if (driver->ob) + bpy_ob = Object_CreatePyObject(driver->ob); + + if (!bpy_ob) { + Py_INCREF(Py_None); + bpy_ob = Py_None; + } + + setitem_retval = EXPP_dict_set_item_str(bpy_pydriver_Dict, "self", bpy_ob); + +/* sds*/ + if( !setup_armature_weakrefs()){ fprintf( stderr, "Oops - weakref dict setup\n"); return result; @@ -1196,17 +1216,18 @@ float BPY_pydriver_eval(IpoDriver *driver) if (retval == NULL) { return pydriver_error(driver); } - else { - floatval = PyNumber_Float(retval); - Py_DECREF(retval); - } + + floatval = PyNumber_Float(retval); + Py_DECREF(retval); if (floatval == NULL) return pydriver_error(driver); - else { - result = (float)PyFloat_AsDouble(floatval); - Py_DECREF(floatval); - } + + result = (float)PyFloat_AsDouble(floatval); + Py_DECREF(floatval); + + /* remove 'self', since this dict is also used by py buttons */ + if (setitem_retval == 0) PyDict_DelItemString(bpy_pydriver_Dict, "self"); /* all fine, make sure the "invalid expression" flag is cleared */ driver->flag &= ~IPO_DRIVER_FLAG_INVALID; |