Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2004-05-04 18:27:41 +0400
committerDaniel Dunbar <daniel@zuster.org>2004-05-04 18:27:41 +0400
commitc80ec7b808f41e7d1aa307333d77cfc088313706 (patch)
tree44d78bc75b7e369a1780ebaac43489699ea6a711 /source/blender
parent648c21947c6c115209e5529de6e747e474fd64e2 (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).
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/python/BPY_interface.c101
-rw-r--r--source/blender/python/api2_2x/Blender.c7
-rw-r--r--source/blender/python/api2_2x/EXPP_interface.c142
-rw-r--r--source/blender/python/api2_2x/EXPP_interface.h2
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 */