diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c index a1b89cb36ad..b489dd4cf33 100644 --- a/source/blender/python/api2_2x/Blender.c +++ b/source/blender/python/api2_2x/Blender.c @@ -29,10 +29,91 @@ * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ -//#include "BKE_utildefines.h" -#include "BIF_usiblender.h" +#include +#include -#include "Blender.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for SPACE_VIEW3D */ +#include +#include + +#include "gen_utils.h" +#include "modules.h" + +/* From Window.h, used here by Blender_Redraw */ +PyObject *M_Window_Redraw(PyObject *self, PyObject *args); + +/**********************************************************/ +/* Python API function prototypes for the Blender module. */ +/**********************************************************/ +static PyObject *Blender_Set (PyObject *self, PyObject *args); +static PyObject *Blender_Get (PyObject *self, PyObject *args); +static PyObject *Blender_Redraw(PyObject *self, PyObject *args); +static PyObject *Blender_ReleaseGlobalDict(PyObject *self, PyObject *args); +static PyObject *Blender_Quit(PyObject *self); +static PyObject *Blender_Load(PyObject *self, PyObject *args); + +/*****************************************************************************/ +/* The following string definitions are used for documentation strings. */ +/* In Python these will be written to the console when doing a */ +/* Blender.__doc__ */ +/*****************************************************************************/ +static char Blender_Set_doc[] = +"(request, data) - Update settings in Blender\n\ +\n\ +(request) A string identifying the setting to change\n\ + 'curframe' - Sets the current frame using the number in data"; + +static char Blender_Get_doc[] = +"(request) - Retrieve settings from Blender\n\ +\n\ +(request) A string indentifying the data to be returned\n\ + 'curframe' - Returns the current animation frame\n\ + 'curtime' - Returns the current animation time\n\ + 'staframe' - Returns the start frame of the animation\n\ + 'endframe' - Returns the end frame of the animation\n\ + 'filename' - Returns the name of the last file read or written\n\ + 'version' - Returns the Blender version number"; + +static char Blender_Redraw_doc[] = "() - Redraw all 3D windows"; + +static char Blender_ReleaseGlobalDict_doc[] = +"Deprecated, please use the Blender.Registry module solution instead."; + +static char Blender_Quit_doc[] = +"() - Quit Blender. The current data is saved as 'quit.blend' before leaving."; + +static char Blender_Load_doc[] = +"(filename) - Load the given .blend file. If succesful, the script is ended\n\ +immediately.\n\ +Notes:\n\ +1 - () - an empty argument loads the default .B.blend file;\n\ +2 - if the substring '.B.blend' occurs inside 'filename', the default\n\ +.B.blend file is loaded;\n\ +3 - The current data is always preserved as an autosave file, for safety;\n\ +4 - This function only works if the script where it's executed is the\n\ +only one running."; + +/*****************************************************************************/ +/* Python method structure definition. */ +/*****************************************************************************/ +static struct PyMethodDef Blender_methods[] = { + {"Set", Blender_Set, METH_VARARGS, Blender_Set_doc}, + {"Get", Blender_Get, METH_VARARGS, Blender_Get_doc}, + {"Redraw", Blender_Redraw, METH_VARARGS, Blender_Redraw_doc}, + {"Quit", (PyCFunction)Blender_Quit, METH_NOARGS, Blender_Quit_doc}, + {"Load", Blender_Load, METH_VARARGS, Blender_Load_doc}, + {"ReleaseGlobalDict", &Blender_ReleaseGlobalDict, + METH_VARARGS, Blender_ReleaseGlobalDict_doc}, + {NULL, NULL} +}; /*****************************************************************************/ /* Global variables */ @@ -43,7 +124,7 @@ PyObject *g_blenderdict; /* Function: Blender_Set */ /* Python equivalent: Blender.Set */ /*****************************************************************************/ -PyObject *Blender_Set (PyObject *self, PyObject *args) +static PyObject *Blender_Set (PyObject *self, PyObject *args) { char * name; PyObject * arg; @@ -79,7 +160,7 @@ PyObject *Blender_Set (PyObject *self, PyObject *args) /* Function: Blender_Get */ /* Python equivalent: Blender.Get */ /*****************************************************************************/ -PyObject *Blender_Get (PyObject *self, PyObject *args) +static PyObject *Blender_Get (PyObject *self, PyObject *args) { PyObject * object; PyObject * dict; @@ -158,7 +239,7 @@ PyObject *Blender_Get (PyObject *self, PyObject *args) /* Function: Blender_Redraw */ /* Python equivalent: Blender.Redraw */ /*****************************************************************************/ -PyObject *Blender_Redraw(PyObject *self, PyObject *args) +static PyObject *Blender_Redraw(PyObject *self, PyObject *args) { int wintype = SPACE_VIEW3D; @@ -176,7 +257,7 @@ PyObject *Blender_Redraw(PyObject *self, PyObject *args) /* Python equivalent: Blender.ReleaseGlobalDict */ /* Description: Deprecated function. */ /*****************************************************************************/ -PyObject *Blender_ReleaseGlobalDict(PyObject *self, PyObject *args) +static PyObject *Blender_ReleaseGlobalDict(PyObject *self, PyObject *args) { Py_INCREF(Py_None); return Py_None; @@ -186,9 +267,54 @@ PyObject *Blender_ReleaseGlobalDict(PyObject *self, PyObject *args) /* Function: Blender_Quit */ /* Python equivalent: Blender.Quit */ /*****************************************************************************/ -PyObject *Blender_Quit(PyObject *self) +static PyObject *Blender_Quit(PyObject *self) { - exit_usiblender(); + BIF_write_autosave(); /* save the current data first */ + + exit_usiblender(); /* renames last autosave to quit.blend */ + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject *Blender_Load(PyObject *self, PyObject *args) +{ + char *fname = NULL; + Script *script = NULL; + + if (!PyArg_ParseTuple(args, "|s", &fname)) + return EXPP_ReturnPyObjError(PyExc_TypeError, + "expected filename string or nothing (for default file) as argument"); + + if (fname && !BLI_exists(fname)) + return EXPP_ReturnPyObjError(PyExc_AttributeError, + "requested file doesn't exist!"); + + /* We won't let a new .blend file be loaded if there are still other + * scripts running, since loading a new file will close and remove them. */ + + if (G.main->script.first != G.main->script.last) + return EXPP_ReturnPyObjError(PyExc_RuntimeError, + "there are other scripts running at the Scripts win, close them first!"); + + /* trick: mark the script so that its script struct won't be freed after + * the script is executed (to avoid a double free warning on exit): */ + script = G.main->script.first; + script->flags |= SCRIPT_GUI; + + BIF_write_autosave(); /* for safety let's preserve the current data */ + + /* for safety, any filename with .B.blend is considered the default one. + * It doesn't seem necessary to compare file attributes (like st_ino and + * st_dev, according to the glibc info pages) to find out if the given + * filename, that may have been given with a twisted misgiving path, is the + * default one for sure. Taking any .B.blend file as the default is good + * enough here. Note: the default file requires extra clean-up done by + * BIF_read_homefile: freeing the user theme data. */ + if (!fname || strstr(fname, ".B.blend")) + BIF_read_homefile(); + else + BIF_read_file(fname); Py_INCREF(Py_None); return Py_None; diff --git a/source/blender/python/api2_2x/Blender.h b/source/blender/python/api2_2x/Blender.h index ebbae7ff63a..40585fffd3a 100644 --- a/source/blender/python/api2_2x/Blender.h +++ b/source/blender/python/api2_2x/Blender.h @@ -31,75 +31,4 @@ #ifndef EXPP_BLENDER_H #define EXPP_BLENDER_H - -#include -#include - -#include -#include -#include -#include -#include -#include /* for SPACE_VIEW3D */ -#include -#include - -#include "gen_utils.h" -#include "modules.h" - -/* From Window.h, used here by Blender_Redraw */ -PyObject *M_Window_Redraw(PyObject *self, PyObject *args); - -/*****************************************************************************/ -/* Python API function prototypes for the Blender module. */ -/*****************************************************************************/ -PyObject *Blender_Set (PyObject *self, PyObject *args); -PyObject *Blender_Get (PyObject *self, PyObject *args); -PyObject *Blender_Redraw(PyObject *self, PyObject *args); -PyObject *Blender_ReleaseGlobalDict(PyObject *self, PyObject *args); -PyObject *Blender_Quit(PyObject *self); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.__doc__ */ -/*****************************************************************************/ -char Blender_Set_doc[] = -"(request, data) - Update settings in Blender\n\ -\n\ -(request) A string identifying the setting to change\n\ - 'curframe' - Sets the current frame using the number in data"; - -char Blender_Get_doc[] = -"(request) - Retrieve settings from Blender\n\ -\n\ -(request) A string indentifying the data to be returned\n\ - 'curframe' - Returns the current animation frame\n\ - 'curtime' - Returns the current animation time\n\ - 'staframe' - Returns the start frame of the animation\n\ - 'endframe' - Returns the end frame of the animation\n\ - 'filename' - Returns the name of the last file read or written\n\ - 'version' - Returns the Blender version number"; - -char Blender_Redraw_doc[] = "() - Redraw all 3D windows"; - -char Blender_ReleaseGlobalDict_doc[] = -"Deprecated, please use the Blender.Registry module solution instead."; - -char Blender_Quit_doc[] = -"() - Quit Blender. Experimental, please use with caution."; - -/*****************************************************************************/ -/* Python method structure definition. */ -/*****************************************************************************/ -struct PyMethodDef Blender_methods[] = { - {"Set", Blender_Set, METH_VARARGS, Blender_Set_doc}, - {"Get", Blender_Get, METH_VARARGS, Blender_Get_doc}, - {"Redraw", Blender_Redraw, METH_VARARGS, Blender_Redraw_doc}, - {"Quit", (PyCFunction)Blender_Quit, METH_NOARGS, Blender_Quit_doc}, - {"ReleaseGlobalDict", &Blender_ReleaseGlobalDict, - METH_VARARGS, Blender_ReleaseGlobalDict_doc}, - {NULL, NULL} -}; - #endif /* EXPP_BLENDER_H */