diff options
author | Daniel Dunbar <daniel@zuster.org> | 2004-05-04 18:27:41 +0400 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2004-05-04 18:27:41 +0400 |
commit | c80ec7b808f41e7d1aa307333d77cfc088313706 (patch) | |
tree | 44d78bc75b7e369a1780ebaac43489699ea6a711 | |
parent | 648c21947c6c115209e5529de6e747e474fd64e2 (diff) |
- fix silly scriptlink running code, pulled out convenient
ID_asPyObject and ID_getScriptlinks functions,
moved code into BPY_interface.c (where it fit better)
- EXPP_interface.c is essentially obselete now
- I didn't test this, I'm sure I broke something, if a Pythonista
could comment that would be nice (oh and the maintainer too).
-rw-r--r-- | source/blender/python/BPY_interface.c | 101 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Blender.c | 7 | ||||
-rw-r--r-- | source/blender/python/api2_2x/EXPP_interface.c | 142 | ||||
-rw-r--r-- | source/blender/python/api2_2x/EXPP_interface.h | 2 |
4 files changed, 82 insertions, 170 deletions
diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c index 433e7c750fa..8d7d8bd91fb 100644 --- a/source/blender/python/BPY_interface.c +++ b/source/blender/python/BPY_interface.c @@ -70,6 +70,7 @@ #include "BPY_menus.h" #include "api2_2x/EXPP_interface.h" #include "api2_2x/constant.h" +#include "api2_2x/modules.h" /* bpy_registryDict is declared in api2_2x/Registry.h and defined * here. This Python dictionary will be used to store data that scripts @@ -438,8 +439,6 @@ int BPY_txt_do_python_Text(struct Text* text) PyDict_SetItemString(py_dict, "__script__", (PyObject *)info); } - clearScriptLinks (); - py_result = RunPython (text, py_dict); /* Run the script */ if (!py_result) { /* Failed execution of the script */ @@ -599,8 +598,6 @@ int BPY_menu_do_python(short menutype, int event) PyDict_SetItemString(py_dict, "__script__", (PyObject *)info); } - clearScriptLinks (); - /* Previously we used PyRun_File to run directly the code on a FILE object, * but as written in the Python/C API Ref Manual, chapter 2, * 'FILE structs for different C libraries can be different and incompatible' @@ -803,40 +800,86 @@ void BPY_do_all_scripts(short event) /* are handled: Object, Lamp, Camera, Material, World and */ /* Scene. */ /*****************************************************************************/ -void BPY_do_pyscript(struct ID *id, short event) + +static ScriptLink *ID_getScriptlink(ID *id) { - ScriptLink * scriptlink; - int index; - PyObject * dict; - PyObject * ret; - - scriptlink = setScriptLinks (id, event); - - if (scriptlink == NULL) return; - - for (index = 0; index < scriptlink->totscript; index++) - { - if ((scriptlink->flag[index] == event) && - (scriptlink->scripts[index] != NULL)) - { - dict = CreateGlobalDictionary(); - ret = RunPython ((Text*) scriptlink->scripts[index], dict); - ReleaseGlobalDictionary (dict); - if (!ret) - { + switch (MAKE_ID2 (id->name[0], id->name[1])) { + case ID_OB: + return &((Object*)id)->scriptlink; + case ID_LA: + return &((Lamp*)id)->scriptlink; + case ID_CA: + return &((Camera*)id)->scriptlink; + case ID_MA: + return &((Material*)id)->scriptlink; + case ID_WO: + return &((World*)id)->scriptlink; + case ID_SCE: + return &((Scene*)id)->scriptlink; + default: + return NULL; + } +} + +static PyObject *ID_asPyObject(ID *id) +{ + switch (MAKE_ID2 (id->name[0], id->name[1])) { + case ID_OB: + return Object_CreatePyObject((Object*) id); + case ID_LA: + return Lamp_CreatePyObject((Lamp*) id); + case ID_CA: + return Camera_CreatePyObject((Camera*) id); + case ID_MA: + return Material_CreatePyObject((Material*) id); + case ID_WO: + return World_CreatePyObject((World*) id); + case ID_SCE: + return Scene_CreatePyObject((Scene*) id); + default: + return NULL; + } +} + +void BPY_do_pyscript(ID *id, short event) +{ + ScriptLink *scriptlink = ID_getScriptlink(id); + + if (scriptlink && scriptlink->totscript) { + PyObject *dict; + PyObject *ret; + int index; + + // set globals in Blender module to identify scriptlink + Py_INCREF(Py_True); + PyDict_SetItemString(g_blenderdict, "bylink", Py_True); + PyDict_SetItemString(g_blenderdict, "link", ID_asPyObject(id)); + PyDict_SetItemString(g_blenderdict, "event", + PyString_FromString(event_to_name(event))); + + for (index = 0; index < scriptlink->totscript; index++) { + if ((scriptlink->flag[index] == event) && + (scriptlink->scripts[index] != NULL)) { + dict = CreateGlobalDictionary(); + ret = RunPython ((Text*) scriptlink->scripts[index], dict); + ReleaseGlobalDictionary (dict); + if (!ret) { /* Failed execution of the script */ BPY_Err_Handle (scriptlink->scripts[index]->name+2); BPY_end_python (); BPY_start_python (); - } - else - { + } else { Py_DECREF (ret); + } } } - } - return; + // cleanup bylink flag and clear link so PyObject can be released + Py_INCREF(Py_False); + PyDict_SetItemString(g_blenderdict, "bylink", Py_False); + Py_INCREF(Py_None); + PyDict_SetItemString(g_blenderdict, "link", Py_None); + } } /*****************************************************************************/ diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c index 09ec4764fbe..a1b89cb36ad 100644 --- a/source/blender/python/api2_2x/Blender.c +++ b/source/blender/python/api2_2x/Blender.c @@ -211,6 +211,13 @@ void M_Blender_Init (void) dict = PyModule_GetDict (module); g_blenderdict = dict; + + Py_INCREF(Py_False); + PyDict_SetItemString(dict, "bylink", Py_False); + Py_INCREF(Py_None); + PyDict_SetItemString(dict, "link", Py_None); + PyDict_SetItemString(dict, "event", PyString_FromString("")); + PyDict_SetItemString (dict, "Types", Types_Init()); PyDict_SetItemString (dict, "sys", sys_Init()); PyDict_SetItemString (dict, "Registry", Registry_Init()); diff --git a/source/blender/python/api2_2x/EXPP_interface.c b/source/blender/python/api2_2x/EXPP_interface.c index 472ded82688..ccd7811c761 100644 --- a/source/blender/python/api2_2x/EXPP_interface.c +++ b/source/blender/python/api2_2x/EXPP_interface.c @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. @@ -36,18 +36,6 @@ #include <BKE_global.h> #include <BKE_library.h> #include <BKE_main.h> -#include <BPI_script.h> - -#include <DNA_ID.h> -#include <DNA_camera_types.h> -#include <DNA_lamp_types.h> -#include <DNA_material_types.h> -#include <DNA_object_types.h> -#include <DNA_scene_types.h> -#include <DNA_screen_types.h> -#include <DNA_scriptlink_types.h> -#include <DNA_space_types.h> -#include <DNA_world_types.h> #include "EXPP_interface.h" #include "gen_utils.h" @@ -55,130 +43,6 @@ void initBlenderApi2_2x (void) { - //printf ("initBlenderApi2_2x\n"); - g_blenderdict = NULL; - M_Blender_Init (); -} - -void discardFromBDict (char *key) -{ - PyObject *oldval = PyDict_GetItemString(g_blenderdict, key); - if (oldval) { Py_DECREF(oldval); } -} - -void clearScriptLinks (void) -{ - discardFromBDict ("bylink"); - Py_INCREF (Py_False); - PyDict_SetItemString (g_blenderdict, "bylink", Py_False); - /* Old API meant link could be unset. Or even valid when bylink is false. - * This way, you can import it and check its value afterwards, ignoring - * bylink. */ - discardFromBDict ("link"); - Py_INCREF (Py_None); - PyDict_SetItemString (g_blenderdict, "link", Py_None); -} - -ScriptLink * setScriptLinks(ID *id, short event) -{ - ScriptLink * scriptlink; - PyObject * link; - Object * object; - Lamp * lamp; - Camera * camera; - Material * material; - Scene * scene; - World * world; - int obj_id; - - obj_id = MAKE_ID2 (id->name[0], id->name[1]); - - switch (obj_id) - { - case ID_OB: - object = GetObjectByName (GetIdName (id)); - if (object == NULL) - { - return NULL; - } - link = Object_CreatePyObject (object); - scriptlink = &(object->scriptlink); - break; - case ID_LA: - lamp = GetLampByName (GetIdName (id)); - if (lamp == NULL) - { - return NULL; - } - link = Lamp_CreatePyObject (lamp); - scriptlink = &(lamp->scriptlink); - break; - case ID_CA: - camera = GetCameraByName (GetIdName (id)); - if (camera == NULL) - { - return NULL; - } - link = Camera_CreatePyObject (camera); - scriptlink = &(camera->scriptlink); - break; - case ID_MA: - material = GetMaterialByName (GetIdName (id)); - if (material == NULL) - { - return NULL; - } - link = Material_CreatePyObject (material); - scriptlink = &(material->scriptlink); - break; - case ID_WO: - world = GetWorldByName (GetIdName (id)); - if (world == NULL) - { - return NULL; - } - link = World_CreatePyObject (world); - scriptlink = &(world->scriptlink); - break; - case ID_SCE: - scene = GetSceneByName (GetIdName (id)); - if (scene == NULL) - { - return NULL; - } - link = Scene_CreatePyObject (scene); - scriptlink = &(scene->scriptlink); - break; - default: - //Py_INCREF(Py_None); - //link = Py_None; - return NULL; - } - - discardFromBDict ("bylink"); - - if (scriptlink == NULL) - { - /* This is probably not an internal error anymore :) -TODO: Check this */ - printf ("Internal error, unable to create PyBlock for script link\n"); - - Py_INCREF(Py_False); - PyDict_SetItemString(g_blenderdict, "bylink", Py_False); - return NULL; - } - else - { - Py_INCREF(Py_True); - PyDict_SetItemString(g_blenderdict, "bylink", Py_True); - } - - discardFromBDict ("link"); - PyDict_SetItemString(g_blenderdict, "link", link); - - discardFromBDict ("event"); - PyDict_SetItemString(g_blenderdict, "event", - Py_BuildValue("s", event_to_name(event))); - - return (scriptlink); + g_blenderdict = NULL; + M_Blender_Init (); } diff --git a/source/blender/python/api2_2x/EXPP_interface.h b/source/blender/python/api2_2x/EXPP_interface.h index df319510c37..c50e419aa7c 100644 --- a/source/blender/python/api2_2x/EXPP_interface.h +++ b/source/blender/python/api2_2x/EXPP_interface.h @@ -34,7 +34,5 @@ struct Script; void initBlenderApi2_2x (void); -void clearScriptLinks (void); -ScriptLink * setScriptLinks(ID *id, short event); void discardFromBDict (char *key); void EXPP_Library_Close (void); /* in Library.c, used by BPY_end_python */ |