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
This commit is contained in:
@@ -67,10 +67,10 @@ void BPY_do_pyscript (struct ID *id, short int event);
|
||||
void BPY_clear_script (struct Script *script);
|
||||
void BPY_free_compiled_text (struct Text *text);
|
||||
void BPY_free_screen_spacehandlers (struct bScreen *sc);
|
||||
/* ipo.c: */
|
||||
float BPY_pydriver_eval(struct IpoDriver *driver);
|
||||
/* depsgraph.c: */
|
||||
/* pydrivers */
|
||||
struct Object **BPY_pydriver_get_objects(struct IpoDriver *driver);
|
||||
float BPY_pydriver_eval(struct IpoDriver *driver);
|
||||
void BPY_pydriver_update(void);
|
||||
|
||||
/* writefile.c */
|
||||
struct Oops;
|
||||
|
||||
@@ -109,6 +109,7 @@ void BPY_do_pyscript(ID *id, short int event){}
|
||||
void BPY_clear_script(Script *script){}
|
||||
void BPY_free_compiled_text(struct Text *text){}
|
||||
void BPY_free_screen_spacehandlers (struct bScreen *sc){}
|
||||
void BPY_pydriver_update(void){}
|
||||
float BPY_pydriver_eval(struct IpoDriver *driver)
|
||||
{
|
||||
return 0;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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). */
|
||||
|
||||
@@ -1759,7 +1759,10 @@ void do_ipobuts(unsigned short event)
|
||||
if(ei) {
|
||||
if(ei->icu->driver) {
|
||||
if (ei->icu->driver->type == IPO_DRIVER_TYPE_PYTHON) {
|
||||
/* eval user's expression once for validity */
|
||||
/* first del pydriver's global dict, just in case
|
||||
* an available pydrivers.py module needs to be reloaded */
|
||||
BPY_pydriver_update();
|
||||
/* eval user's expression once for validity; update DAG */
|
||||
BPY_pydriver_eval(ei->icu->driver);
|
||||
DAG_scene_sort(G.scene);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user