- 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).
This commit is contained in:
2004-05-04 14:27:41 +00:00
parent 648c21947c
commit c80ec7b808
4 changed files with 79 additions and 167 deletions

View File

@@ -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;
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;
}
}
scriptlink = setScriptLinks (id, event);
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;
}
}
if (scriptlink == NULL) return;
void BPY_do_pyscript(ID *id, short event)
{
ScriptLink *scriptlink = ID_getScriptlink(id);
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)
{
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);
}
}
/*****************************************************************************/

View File

@@ -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());

View File

@@ -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 ();
}

View File

@@ -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 */