From 066a2b2ed2194ea72ae90f006f2f2be76014c7ca Mon Sep 17 00:00:00 2001 From: Willian Padovani Germano Date: Sun, 30 Apr 2006 22:10:39 +0000 Subject: Small update for pydrivers: force reloading the pydrivers.py Blender text module when user edits the input text box of any pydriver (Transform Properties panel, Ipo window). It's enough to click in and out of a single pydriver's text input box for the module reloading and also re-evaluation of all pydrivers available. Maybe this "refreshing" should also be available from a menu, let's see. Note for Python fans: Definitions and redefinitions in a reloaded module are properly handled in Python, but previously defined data in the module doesn't disappear. So if you define a function "f" inside a module, import it, then change the function's name to "g" and reload the module, both "f" and "g" will be available. This is considered a feature, check reload's documentation: http://docs.python.org/lib/built-in-funcs.html#l2h-59 --- source/blender/python/BPY_extern.h | 1 + source/blender/python/BPY_interface.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) (limited to 'source/blender/python') diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h index cc187ea3a0d..b2c6287f9b3 100644 --- a/source/blender/python/BPY_extern.h +++ b/source/blender/python/BPY_extern.h @@ -81,6 +81,7 @@ extern "C" { int BPY_do_spacehandlers(struct ScrArea *sa, unsigned short event, unsigned short space_event); + void BPY_pydriver_update(void); float BPY_pydriver_eval(struct IpoDriver *driver); struct Object **BPY_pydriver_get_objects(struct IpoDriver *driver); diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c index 6a79e673345..80c4df81bd4 100644 --- a/source/blender/python/BPY_interface.c +++ b/source/blender/python/BPY_interface.c @@ -1021,6 +1021,7 @@ static float pydriver_error(IpoDriver *driver) { bpy_pydriver_freeList(); if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */ + PyDict_Clear(bpy_pydriver_Dict); Py_DECREF(bpy_pydriver_Dict); bpy_pydriver_Dict = NULL; } @@ -1034,6 +1035,21 @@ static float pydriver_error(IpoDriver *driver) { return 0.0f; } +/* Update function, it gets rid of pydrivers global dictionary, forcing + * BPY_pydriver_eval to recreate it. This function is used to force + * reloading the Blender text module "pydrivers.py", if available, so + * updates in it reach pydriver evaluation. */ +void BPY_pydriver_update(void) +{ + if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */ + PyDict_Clear(bpy_pydriver_Dict); + Py_DECREF(bpy_pydriver_Dict); + bpy_pydriver_Dict = NULL; + } + + return; +} + /* for depsgraph.c, runs py expr once to collect all refs. made * to objects (self refs. to the object that owns the py driver * are not allowed). */ -- cgit v1.2.3