- Added function Blender.Save(filename) to save .blend files.
- Added scriptlink-related methods (get, clear, add) to Scene and Materials.  Will still add method remove and add these methods to World, Object, Camera and Lamp.
- Updates and small fixes in docs.
This commit is contained in:
Willian Padovani Germano 2004-06-24 09:43:13 +00:00
parent 5b57d007a4
commit 61efb63b0c
13 changed files with 575 additions and 254 deletions

@ -419,4 +419,4 @@ class AC3DImport:
def filesel_callback(filename):
test = AC3DImport(filename)
Blender.Window.FileSelector(filesel_callback, "Import AC3D")
Blender.Window.FileSelector(filesel_callback, "Import AC3D", "*.ac")

@ -34,7 +34,9 @@
#include <BIF_usiblender.h>
#include <BLI_blenlib.h>
#include <BLO_writefile.h>
#include <BKE_global.h>
#include <BKE_packedFile.h>
#include <BPI_script.h>
#include <BSE_headerbuttons.h>
#include <DNA_ID.h>
@ -61,6 +63,7 @@ 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);
static PyObject *Blender_Save(PyObject *self, PyObject *args);
/*****************************************************************************/
/* The following string definitions are used for documentation strings. */
@ -94,7 +97,7 @@ 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\
"(filename) - Load the given .blend file. If successful, the script is ended\n\
immediately.\n\
Notes:\n\
1 - () - an empty argument loads the default .B.blend file;\n\
@ -104,6 +107,10 @@ Notes:\n\
4 - This function only works if the script where it's executed is the\n\
only one running.";
static char Blender_Save_doc[] =
"(filename) - Save a .blend file with the given filename.\n\
(filename) - A file pathname that should not contain \".B.blend\" in it.";
/*****************************************************************************/
/* Python method structure definition. */
/*****************************************************************************/
@ -113,6 +120,7 @@ static struct PyMethodDef Blender_methods[] = {
{"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},
{"Save", Blender_Save, METH_VARARGS, Blender_Save_doc},
{"ReleaseGlobalDict", &Blender_ReleaseGlobalDict,
METH_VARARGS, Blender_ReleaseGlobalDict_doc},
{NULL, NULL, 0, NULL}
@ -330,6 +338,55 @@ static PyObject *Blender_Load(PyObject *self, PyObject *args)
return Py_None;
}
static PyObject *Blender_Save(PyObject *self, PyObject *args)
{
char *fname = NULL;
char savefname[FILE_MAXFILE];
int overwrite = 0, len = 0;
char *error = NULL;
Library *li;
if (!PyArg_ParseTuple(args, "s|i", &fname, &overwrite))
return EXPP_ReturnPyObjError(PyExc_TypeError,
"expected filename and optional int (overwrite flag) as arguments");
for (li = G.main->library.first; li; li = li->id.next) {
if (BLI_streq(li->name, fname)) {
return EXPP_ReturnPyObjError(PyExc_AttributeError,
"cannot overwrite used library");
}
}
/* for safety, any filename with .B.blend is considered the default one
* and not accepted here. */
if (strstr(fname, ".B.blend"))
return EXPP_ReturnPyObjError(PyExc_AttributeError,
"filename can't contain the substring \".B.blend\" in it.");
len = strlen(fname);
if (len > FILE_MAXFILE - 7) /* 6+1 for eventual .blend added below */
return EXPP_ReturnPyObjError(PyExc_AttributeError,
"filename is too long!");
else
BLI_strncpy(savefname, fname, len + 1);
if (!strstr(fname, ".blend"))
BLI_strncpy(savefname + len, ".blend", 7); /* 7: BLI_strncpy adds '\0'*/
if (BLI_exists(savefname) && !overwrite)
return EXPP_ReturnPyObjError(PyExc_AttributeError,
"file already exists and overwrite flag was not given.");
if (G.fileflags & G_AUTOPACK) packAll();
if (!BLO_write_file(savefname, G.fileflags, &error))
return EXPP_ReturnPyObjError(PyExc_SystemError, error);
Py_INCREF(Py_None);
return Py_None;
}
/*****************************************************************************/
/* Function: initBlender */
/*****************************************************************************/

@ -36,12 +36,13 @@
#include <Python.h>
#include <stdio.h>
#include <DNA_ID.h>
#include <BKE_library.h> /* for all_local */
#include "BKE_displist.h" /* for set_displist_onlyzero */
#include "BKE_font.h" /* for text_to_curve */
#include "BKE_library.h" /* for all_local */
#include "BLO_readfile.h"
#include "BLI_linklist.h"
#include "MEM_guardedalloc.h"
#include <BLO_readfile.h>
#include <BLI_linklist.h>
#include <MEM_guardedalloc.h>
#include "gen_utils.h"
#include "modules.h"

@ -383,6 +383,10 @@ static PyObject *Material_clearTexture(BPy_Material *self, PyObject *args);
static PyObject *Material_setColorComponent(BPy_Material *self, char *key,
PyObject *args);
static PyObject *Material_getScriptLinks(BPy_Material *self, PyObject *args);
static PyObject *Material_addScriptLink(BPy_Material *self, PyObject *args);
static PyObject *Material_clearScriptLinks(BPy_Material *self);
/*****************************************************************************/
/* Python BPy_Material methods table: */
/*****************************************************************************/
@ -500,9 +504,19 @@ static PyMethodDef BPy_Material_methods[] = {
{"setNRings", (PyCFunction)Material_setNRings, METH_VARARGS,
"(i) - Set Material's number of rings in halo - [0, 24]"},
{"setTexture", (PyCFunction)Material_setTexture, METH_VARARGS,
"(n,tex,texco=0,mapto=0) - Set numbered texture to tex"},
"(n,tex,texco=0,mapto=0) - Set numbered texture to tex"},
{"clearTexture", (PyCFunction)Material_clearTexture, METH_VARARGS,
"(n) - Remove texture from numbered slot"},
{"getScriptLinks", (PyCFunction)Material_getScriptLinks, METH_VARARGS,
"(eventname) - Get a list of this material's scriptlinks (Text names) "
"of the given type\n"
"(eventname) - string: FrameChanged or Redraw."},
{"addScriptLink", (PyCFunction)Material_addScriptLink, METH_VARARGS,
"(text, evt) - Add a new material scriptlink.\n"
"(text) - string: an existing Blender Text name;\n"
"(evt) string: FrameChanged or Redraw."},
{"clearScriptLinks", (PyCFunction)Material_clearScriptLinks, METH_NOARGS,
"() - Delete all scriptlinks from this material."},
{NULL, NULL, 0, NULL}
};
@ -892,32 +906,32 @@ static PyObject *Material_getNRings(BPy_Material *self)
static PyObject *Material_getTextures(BPy_Material *self)
{
int i;
struct MTex *mtex;
PyObject *t[8];
PyObject *tuple;
int i;
struct MTex *mtex;
PyObject *t[8];
PyObject *tuple;
/* build a texture list */
for (i=0; i<8; ++i) {
mtex = self->material->mtex[i];
/* build a texture list */
for (i=0; i<8; ++i) {
mtex = self->material->mtex[i];
if (mtex) {
t[i] = MTex_CreatePyObject (mtex);
}
else {
Py_INCREF (Py_None);
t[i] = Py_None;
}
}
if (mtex) {
t[i] = MTex_CreatePyObject (mtex);
}
else {
Py_INCREF (Py_None);
t[i] = Py_None;
}
}
/* turn the array into a tuple */
tuple = Py_BuildValue ("NNNNNNNN", t[0], t[1], t[2], t[3],
t[4], t[5], t[6], t[7]);
/* turn the array into a tuple */
tuple = Py_BuildValue ("NNNNNNNN", t[0], t[1], t[2], t[3],
t[4], t[5], t[6], t[7]);
if (!tuple)
return EXPP_ReturnPyObjError(PyExc_MemoryError,
"Material_getTextures: couldn't create PyTuple");
return tuple;
return tuple;
}
static PyObject *Material_setIpo(BPy_Material *self, PyObject *args)
@ -1396,61 +1410,100 @@ static PyObject *Material_setNRings(BPy_Material *self, PyObject *args)
static PyObject *Material_setTexture(BPy_Material *self, PyObject *args)
{
int texnum;
PyObject *pytex;
Tex *bltex;
int texco=TEXCO_ORCO, mapto=MAP_COL;
int texnum;
PyObject *pytex;
Tex *bltex;
int texco=TEXCO_ORCO, mapto=MAP_COL;
if (!PyArg_ParseTuple(args, "iO!|ii", &texnum, &Texture_Type, &pytex,
&texco, &mapto))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected int in [0,7] and Texture");
if ((texnum<0) || (texnum>=8))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected int in [0,7] and Texture");
if (!PyArg_ParseTuple(args, "iO!|ii", &texnum, &Texture_Type, &pytex,
&texco, &mapto))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected int in [0,7] and Texture");
if ((texnum<0) || (texnum>=8))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected int in [0,7] and Texture");
bltex = Texture_FromPyObject (pytex);
bltex = Texture_FromPyObject (pytex);
if (!self->material->mtex[texnum]) {
/* there isn't an mtex for this slot so we need to make one */
self->material->mtex[texnum] = add_mtex ();
}
else {
/* we already had a texture here so deal with the old one first */
self->material->mtex[texnum]->tex->id.us--;
}
if (!self->material->mtex[texnum]) {
/* there isn't an mtex for this slot so we need to make one */
self->material->mtex[texnum] = add_mtex ();
}
else {
/* we already had a texture here so deal with the old one first */
self->material->mtex[texnum]->tex->id.us--;
}
self->material->mtex[texnum]->tex = bltex;
id_us_plus (&bltex->id);
self->material->mtex[texnum]->texco = texco;
self->material->mtex[texnum]->mapto = mapto;
self->material->mtex[texnum]->tex = bltex;
id_us_plus (&bltex->id);
self->material->mtex[texnum]->texco = texco;
self->material->mtex[texnum]->mapto = mapto;
Py_INCREF(Py_None);
return Py_None;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Material_clearTexture(BPy_Material *self, PyObject *args)
{
int texnum;
struct MTex *mtex;
int texnum;
struct MTex *mtex;
if (!PyArg_ParseTuple(args, "i", &texnum))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected int in [0,7]");
if ((texnum<0) || (texnum>=8))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected int in [0,7]");
if (!PyArg_ParseTuple(args, "i", &texnum))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected int in [0,7]");
if ((texnum<0) || (texnum>=8))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected int in [0,7]");
mtex = self->material->mtex[texnum];
if (mtex) {
if (mtex->tex)
mtex->tex->id.us--;
MEM_freeN (mtex);
self->material->mtex[texnum] = NULL;
}
mtex = self->material->mtex[texnum];
if (mtex) {
if (mtex->tex)
mtex->tex->id.us--;
MEM_freeN (mtex);
self->material->mtex[texnum] = NULL;
}
Py_INCREF(Py_None);
return Py_None;
Py_INCREF(Py_None);
return Py_None;
}
/* mat.addScriptLink */
static PyObject *Material_addScriptLink (BPy_Material *self, PyObject *args)
{
Material *mat = self->material;
ScriptLink *slink = NULL;
slink = &(mat)->scriptlink;
if (!EXPP_addScriptLink(slink, args, 0))
return EXPP_incr_ret (Py_None);
else return NULL;
}
/* mat.clearScriptLinks */
static PyObject *Material_clearScriptLinks (BPy_Material *self)
{
Material *mat = self->material;
ScriptLink *slink = NULL;
slink = &(mat)->scriptlink;
return EXPP_incr_ret(Py_BuildValue("i", EXPP_clearScriptLinks (slink)));
}
/* mat.getScriptLinks */
static PyObject *Material_getScriptLinks (BPy_Material *self, PyObject *args)
{
Material *mat = self->material;
ScriptLink *slink = NULL;
PyObject *ret = NULL;
slink = &(mat)->scriptlink;
ret = EXPP_getScriptLinks(slink, args, 0);
if (ret) return ret;
else return NULL;
}
/*****************************************************************************/

@ -98,7 +98,9 @@ static PyObject *Scene_getChildren(BPy_Scene *self);
static PyObject *Scene_getCurrentCamera(BPy_Scene *self);
static PyObject *Scene_setCurrentCamera(BPy_Scene *self, PyObject *args);
static PyObject *Scene_getRenderingContext(BPy_Scene *self);
static PyObject *Scene_getScriptlinks(BPy_Scene *self, PyObject *args);
static PyObject *Scene_getScriptLinks(BPy_Scene *self, PyObject *args);
static PyObject *Scene_addScriptLink(BPy_Scene *self, PyObject *args);
static PyObject *Scene_clearScriptLinks(BPy_Scene *self);
//deprecated methods
static PyObject *Scene_currentFrame(BPy_Scene *self, PyObject *args);
@ -122,55 +124,62 @@ static PyMethodDef BPy_Scene_methods[] = {
{"getName", (PyCFunction)Scene_getName, METH_NOARGS,
"() - Return Scene name"},
{"setName", (PyCFunction)Scene_setName, METH_VARARGS,
"(str) - Change Scene name"},
"(str) - Change Scene name"},
{"copy", (PyCFunction)Scene_copy, METH_VARARGS,
"(duplicate_objects = 1) - Return a copy of this scene\n"
"(duplicate_objects = 1) - Return a copy of this scene\n"
"The optional argument duplicate_objects defines how the scene\n"
"children are duplicated:\n\t0: Link Objects\n\t1: Link Object Data"
"\n\t2: Full copy\n"},
{"makeCurrent", (PyCFunction)Scene_makeCurrent, METH_NOARGS,
"() - Make self the current scene"},
"() - Make self the current scene"},
{"update", (PyCFunction)Scene_update, METH_VARARGS,
"(full = 0) - Update scene self.\n"
"full = 0: sort the base list of objects."
"full = 1: full update -- also regroups, does ipos, ikas, keys"},
"(full = 0) - Update scene self.\n"
"full = 0: sort the base list of objects."
"full = 1: full update -- also regroups, does ipos, ikas, keys"},
{"link", (PyCFunction)Scene_link, METH_VARARGS,
"(obj) - Link Object obj to this scene"},
"(obj) - Link Object obj to this scene"},
{"unlink", (PyCFunction)Scene_unlink, METH_VARARGS,
"(obj) - Unlink Object obj from this scene"},
"(obj) - Unlink Object obj from this scene"},
{"getChildren", (PyCFunction)Scene_getChildren, METH_NOARGS,
"() - Return list of all objects linked to scene self"},
"() - Return list of all objects linked to scene self"},
{"getCurrentCamera", (PyCFunction)Scene_getCurrentCamera, METH_NOARGS,
"() - Return current active Camera"},
{"getScriptlinks", (PyCFunction)Scene_getScriptlinks, METH_VARARGS,
"(eventname) - Get a list of this scene's scriptlinks (Text names) of the given type\n"
"() - Return current active Camera"},
{"getScriptLinks", (PyCFunction)Scene_getScriptLinks, METH_VARARGS,
"(eventname) - Get a list of this scene's scriptlinks (Text names) "
"of the given type\n"
"(eventname) - string: FrameChanged, OnLoad or Redraw."},
{"addScriptLink", (PyCFunction)Scene_addScriptLink, METH_VARARGS,
"(text, evt) - Add a new scene scriptlink.\n"
"(text) - string: an existing Blender Text name;\n"
"(evt) string: FrameChanged, OnLoad or Redraw."},
{"clearScriptLinks", (PyCFunction)Scene_clearScriptLinks, METH_NOARGS,
"() - Delete all scriptlinks from this scene."},
{"setCurrentCamera", (PyCFunction)Scene_setCurrentCamera, METH_VARARGS,
"() - Set the currently active Camera"},
"() - Set the currently active Camera"},
//DEPRECATED
{"getWinSize", (PyCFunction)Scene_getWinSize, METH_NOARGS,
"() - Return Render window [x,y] dimensions"},
{"setWinSize", (PyCFunction)Scene_setWinSize, METH_VARARGS,
"(str) - Change Render window [x,y] dimensions"},
"(str) - Change Render window [x,y] dimensions"},
{"startFrame", (PyCFunction)Scene_startFrame, METH_VARARGS,
"(frame) - If frame is given, the start frame is set and"
"\nreturned in any case"},
"(frame) - If frame is given, the start frame is set and"
"\nreturned in any case"},
{"endFrame", (PyCFunction)Scene_endFrame, METH_VARARGS,
"(frame) - If frame is given, the end frame is set and"
"\nreturned in any case"},
"(frame) - If frame is given, the end frame is set and"
"\nreturned in any case"},
{"frameSettings", (PyCFunction)Scene_frameSettings, METH_VARARGS,
"(start, end, current) - Sets or retrieves the Scene's frame"
" settings.\nIf the frame arguments are specified, they are set. "
"A tuple (start, end, current) is returned in any case."},
"(start, end, current) - Sets or retrieves the Scene's frame"
" settings.\nIf the frame arguments are specified, they are set. "
"A tuple (start, end, current) is returned in any case."},
{"getRenderdir", (PyCFunction)Scene_getRenderdir, METH_NOARGS,
"() - Return directory where rendered images are saved to"},
"() - Return directory where rendered images are saved to"},
{"getBackbufdir", (PyCFunction)Scene_getBackbufdir, METH_NOARGS,
"() - Return location of the backbuffer image"},
"() - Return location of the backbuffer image"},
{"getRenderingContext", (PyCFunction)Scene_getRenderingContext, METH_NOARGS,
"() - Get the rendering context for the scene and return it as a BPy_RenderData"},
"() - Get the rendering context for the scene and return it as a BPy_RenderData"},
{"currentFrame", (PyCFunction)Scene_currentFrame, METH_VARARGS,
"(frame) - If frame is given, the current frame is set and"
"\nreturned in any case"},
"(frame) - If frame is given, the current frame is set and"
"\nreturned in any case"},
{NULL, NULL, 0, NULL}
};
//-----------------------BPy_Scene method def-------------------------------------------------------------------------
@ -726,57 +735,60 @@ static PyObject *Scene_getRenderingContext (BPy_Scene *self)
{
if (!self->scene)
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Blender Scene was deleted!");
"Blender Scene was deleted!");
return RenderData_CreatePyObject(self->scene);
}
/* Scene.getScriptlinks */
static PyObject *Scene_getScriptlinks (BPy_Scene *self, PyObject *args)
/* scene.addScriptLink */
static PyObject *Scene_addScriptLink (BPy_Scene *self, PyObject *args)
{
Scene *scene = self->scene;
char *eventname = NULL;
int event = 0;
ScriptLink *slink = &(scene)->scriptlink;
ScriptLink *slink = NULL;
if (!scene)
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Blender Scene was deleted!");
"Blender Scene was deleted!");
if (!PyArg_ParseTuple(args, "s", &eventname))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected event name (string) as argument");
slink = &(scene)->scriptlink;
if (!strcmp(eventname, "FrameChanged"))
event = SCRIPT_FRAMECHANGED;
else if (!strcmp(eventname, "OnLoad"))
event = SCRIPT_ONLOAD;
else if (!strcmp(eventname, "Redraw"))
event = SCRIPT_REDRAW;
else
return EXPP_ReturnPyObjError (PyExc_AttributeError,
"unknown event");
if (!EXPP_addScriptLink(slink, args, 1))
return EXPP_incr_ret (Py_None);
else return NULL;
}
/* actually !scriptlink shouldn't happen ... */
if (!slink || !slink->totscript) {
Py_INCREF(Py_None);
return Py_None;
}
else {
PyObject *list = PyList_New(0);
int i;
/* scene.clearScriptLinks */
static PyObject *Scene_clearScriptLinks (BPy_Scene *self)
{
Scene *scene = self->scene;
ScriptLink *slink = NULL;
if (!list)
return EXPP_ReturnPyObjError (PyExc_MemoryError,
"couldn't create PyList!");
if (!scene)
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Blender Scene was deleted!");
for (i = 0; i < slink->totscript; i++) {
if ((slink->flag[i] == event) && slink->scripts[i])
PyList_Append(list, PyString_FromString(slink->scripts[i]->name+2));
}
slink = &(scene)->scriptlink;
return list;
}
return EXPP_incr_ret(Py_BuildValue("i", EXPP_clearScriptLinks (slink)));
}
/* scene.getScriptLinks */
static PyObject *Scene_getScriptLinks (BPy_Scene *self, PyObject *args)
{
Scene *scene = self->scene;
ScriptLink *slink = NULL;
PyObject *ret = NULL;
if (!scene)
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Blender Scene was deleted!");
slink = &(scene)->scriptlink;
ret = EXPP_getScriptLinks(slink, args, 1);
if (ret) return ret;
else return NULL;
}
/*****************************************************************************/
@ -786,47 +798,47 @@ static PyObject *Scene_getScriptlinks (BPy_Scene *self, PyObject *args)
static PyObject *Scene_getRenderdir (BPy_Scene *self)
{
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Depricated:use RenderData.getRenderPath()");
"Deprecated:use RenderData.getRenderPath()");
}
//-----------------------Scene.getBackbufdir ()----------------------------------------------------------------------
static PyObject *Scene_getBackbufdir (BPy_Scene *self)
{
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Depricated:use RenderData.getBackbufPath()");
"Deprecated:use RenderData.getBackbufPath()");
}
//-----------------------Scene.startFrame ()----------------------------------------------------------------------
static PyObject *Scene_startFrame (BPy_Scene *self, PyObject *args)
{
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Depricated:use RenderData.startFrame()");
"Deprecated:use RenderData.startFrame()");
}
//-----------------------Scene.endFrame ()----------------------------------------------------------------------
static PyObject *Scene_endFrame (BPy_Scene *self, PyObject *args)
{
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Depricated:use RenderData.endFrame()");
"Deprecated:use RenderData.endFrame()");
}
//-----------------------Scene.getWinSize ()----------------------------------------------------------------------
static PyObject *Scene_getWinSize(BPy_Scene *self)
{
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Depricated:use RenderData.imageSizeX() and RenderData.imageSizeY");
"Deprecated:use RenderData.imageSizeX() and RenderData.imageSizeY");
}
//-----------------------Scene.setWinSize()----------------------------------------------------------------------
static PyObject *Scene_setWinSize(BPy_Scene *self, PyObject *args)
{
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Depricated:use RenderData.imageSizeX() and RenderData.imageSizeY");
"Deprecated:use RenderData.imageSizeX() and RenderData.imageSizeY");
}
//-----------------------Scene.frameSettings()----------------------------------------------------------------------
static PyObject *Scene_frameSettings (BPy_Scene *self, PyObject *args)
{
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Depricated:use RenderData.startFrame(), RenderData.endFrame, RenderData.currentFrame");
"Deprecated:use RenderData.startFrame(), RenderData.endFrame, RenderData.currentFrame");
}
//-----------------------Scene.currentFrame()-----------------------------------------------------------------------------------------
static PyObject *Scene_currentFrame (BPy_Scene *self, PyObject *args)
{
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
"Depricated:use RenderData.currentFrame");
"Deprecated:use RenderData.currentFrame");
}

@ -62,8 +62,8 @@ The Blender Python API Reference
open-source language.
@author: The Blender Python Team
@requires: Blender 2.33+ or newer.
@version: 2.33a-cvs
@requires: Blender 2.34 or newer.
@version: 2.34
@see: U{www.blender.org<http://www.blender.org>}
@see: U{projects.blender.org<http://projects.blender.org>}
@see: U{www.python.org<http://www.python.org>}
@ -115,6 +115,20 @@ def Load (filename = None):
the temporary dir used by Blender before loading the new file.
"""
def Save (filename, overwrite = 0):
"""
Save a Blender .blend file with the current program data.
@type filename: string
@param filename: the pathname for the desired .blend file. If it doesn't
contain ".blend", this extension is automatically appended.
@type overwrite: int (bool)
@param overwrite: if non-zero, file 'filename' will be overwritten if it
already exists. By default existing files are not overwritten (an error
is returned).
@note: the substring ".B.blend" is not accepted inside 'filename'.
"""
def Quit ():
"""
Exit from Blender immediately.

@ -48,7 +48,7 @@ def Open (filename):
@type filename: string
@param filename: The filename of a Blender file.
@rtype: bool
@return: 1 if succesful, 0 otherwise.
@return: 1 if successful, 0 otherwise.
"""
def Close ():

@ -3,6 +3,8 @@
"""
The Blender.Material submodule.
B{New}: scriptLink methods: L{Material.getScriptLinks}, ...
Material
========
@ -496,5 +498,32 @@ class Material:
"""
Get this Material's Texture list.
@rtype: list of MTex
@return: a list of Blender MTex objects. None is returned for each empty texture slot.
@return: a list of Blender MTex objects. None is returned for each empty
texture slot.
"""
def getScriptLinks (event):
"""
Get a list with this Material's script links of type 'event'.
@type event: string
@param event: "FrameChanged" or "Redraw".
@rtype: list
@return: a list with Blender L{Text} names (the script links of the given
'event' type) or None if there are no script links at all.
"""
def clearScriptLinks ():
"""
Delete all this Material's script links.
@rtype: bool
@return: 0 if some internal problem occurred or 1 if successful.
"""
def addScriptLink (text, event):
"""
Add a new script link to this Material.
@type text: string
@param text: the name of an existing Blender L{Text}.
@type event: string
@param event: "FrameChanged" or "Redraw".
"""

@ -349,7 +349,7 @@ class NMesh:
"""
Remove all mesh keys stored in this mesh.
@rtype: bool
@return: True if succesful or False if this NMesh wasn't linked to a real
@return: True if successful or False if this NMesh wasn't linked to a real
Blender Mesh yet (or was, but the Mesh had no keys).
@warn: Currently the mesh keys from meshs that are grabbed with
NMesh.GetRaw() or .GetRawFromObject() are preserved, so if you want to

@ -88,37 +88,6 @@ class RenderData:
This object gives access to Scene rendering contexts in Blender.
"""
def getRenderdir():
"""
@warn: B{Depricated}: use RenderData.getRenderPath()
"""
def getBackbufdir():
"""
@warn: B{Depricated}: use RenderData.getBackbufPath()
"""
def getChildren():
"""
Get all objects linked to this Scene.
@rtype: list of Blender Objects
@return: A list with all Blender Objects linked to this Scene.
"""
def getCurrentCamera():
"""
Get the currently active Camera for this Scene.
@rtype: Blender Camera
@return: The currently active Camera.
"""
def setCurrentCamera(camera):
"""
Set the currently active Camera in this Scene.
@type camera: Blender Camera
@param camera: The new active Camera.
"""
def render():
"""
Render the scene.

@ -3,6 +3,8 @@
"""
The Blender.Scene submodule.
B{New}: scriptLink methods: L{Scene.getScriptLinks}, ...
Scene
=====
@ -91,12 +93,12 @@ class Scene:
def getWinSize():
"""
@warn: B{Depricated}: use RenderData.imageSizeX() and RenderData.imageSizeY()
@warn: B{Deprecated}: use RenderData.imageSizeX() and RenderData.imageSizeY()
"""
def setWinSize(dimensions):
"""
@warn: B{Depricated}: use RenderData.imageSizeX() and RenderData.imageSizeY
@warn: B{Deprecated}: use RenderData.imageSizeX() and RenderData.imageSizeY
"""
def copy(duplicate_objects = 1):
@ -113,22 +115,22 @@ class Scene:
def startFrame(frame = None):
"""
@warn: B{Depricated}: use RenderData.startFrame()
@warn: B{Deprecated}: use RenderData.startFrame()
"""
def endFrame(frame = None):
"""
@warn: B{Depricated}: use RenderData.endFrame()
@warn: B{Deprecated}: use RenderData.endFrame()
"""
def currentFrame(frame = None):
"""
@warn: B{Depricated}: use RenderData.currentFrame
@warn: B{Deprecated}: use RenderData.currentFrame
"""
def frameSettings(start = None, end = None, current = None):
"""
@warn: B{Depricated}: use RenderData.startFrame(), RenderData.endFrame, RenderData.currentFrame
@warn: B{Deprecated}: use RenderData.startFrame(), RenderData.endFrame, RenderData.currentFrame
"""
def makeCurrent():
@ -147,6 +149,37 @@ class Scene:
The "full" update is a recent addition to this method.
"""
def getRenderdir():
"""
@warn: B{Deprecated}: use RenderData.getRenderPath()
"""
def getBackbufdir():
"""
@warn: B{Deprecated}: use RenderData.getBackbufPath()
"""
def getChildren():
"""
Get all objects linked to this Scene.
@rtype: list of Blender Objects
@return: A list with all Blender Objects linked to this Scene.
"""
def getCurrentCamera():
"""
Get the currently active Camera for this Scene.
@rtype: Blender Camera
@return: The currently active Camera.
"""
def setCurrentCamera(camera):
"""
Set the currently active Camera in this Scene.
@type camera: Blender Camera
@param camera: The new active Camera.
"""
def link(object):
"""
Link an Object to this Scene.
@ -160,3 +193,29 @@ class Scene:
@type object: Blender Object
@param object: A Blender Object.
"""
def getScriptLinks (event):
"""
Get a list with this Scene's script links of type 'event'.
@type event: string
@param event: "FrameChanged", "OnLoad" or "Redraw".
@rtype: list
@return: a list with Blender L{Text} names (the script links of the given
'event' type) or None if there are no script links at all.
"""
def clearScriptLinks ():
"""
Delete all this Scene's script links.
@rtype: bool
@return: 0 if some internal problem occurred or 1 if successful.
"""
def addScriptLink (text, event):
"""
Add a new script link to this Scene.
@type text: string
@param text: the name of an existing Blender L{Text}.
@type event: string
@param event: "FrameChanged", "OnLoad" or "Redraw".
"""

@ -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.
@ -32,9 +32,12 @@
#include "gen_utils.h"
#include "constant.h"
#include <DNA_text_types.h>
#include <MEM_guardedalloc.h>
/*****************************************************************************/
/* Description: This function clamps an int to the given interval */
/* [min, max]. */
/* Description: This function clamps an int to the given interval */
/* [min, max]. */
/*****************************************************************************/
int EXPP_ClampInt (int value, int min, int max)
{
@ -44,8 +47,8 @@ int EXPP_ClampInt (int value, int min, int max)
}
/*****************************************************************************/
/* Description: This function clamps a float to the given interval */
/* [min, max]. */
/* Description: This function clamps a float to the given interval */
/* [min, max]. */
/*****************************************************************************/
float EXPP_ClampFloat (float value, float min, float max)
{
@ -56,7 +59,7 @@ float EXPP_ClampFloat (float value, float min, float max)
/*****************************************************************************/
/* Description: This function returns true if both given strings are equal, */
/* otherwise it returns false. */
/* otherwise it returns false. */
/*****************************************************************************/
int StringEqual (const char * string1, const char * string2)
{
@ -64,8 +67,8 @@ int StringEqual (const char * string1, const char * string2)
}
/*****************************************************************************/
/* Description: This function returns the name of the given ID struct */
/* without the Object type identifying characters prepended. */
/* Description: This function returns the name of the given ID struct */
/* without the Object type identifying characters prepended. */
/*****************************************************************************/
char * GetIdName (ID *id)
{
@ -73,8 +76,8 @@ char * GetIdName (ID *id)
}
/*****************************************************************************/
/* Description: This function returns the ID of the object with given name */
/* from a given list. */
/* Description: This function returns the ID of the object with given name */
/* from a given list. */
/*****************************************************************************/
ID *GetIdFromList(ListBase *list, char *name)
{
@ -89,8 +92,8 @@ ID *GetIdFromList(ListBase *list, char *name)
}
/*****************************************************************************/
/* Description: These functions set an internal string with the given type */
/* and error_msg arguments. */
/* Description: These functions set an internal string with the given type */
/* and error_msg arguments. */
/*****************************************************************************/
PyObject *EXPP_ReturnPyObjError (PyObject * type, char * error_msg)
@ -106,8 +109,8 @@ int EXPP_ReturnIntError (PyObject *type, char *error_msg)
}
/*****************************************************************************/
/* Description: This function increments the reference count of the given */
/* Python object (usually Py_None) and returns it. */
/* Description: This function increments the reference count of the given */
/* Python object (usually Py_None) and returns it. */
/*****************************************************************************/
PyObject *EXPP_incr_ret (PyObject *object)
@ -117,7 +120,7 @@ PyObject *EXPP_incr_ret (PyObject *object)
}
/*****************************************************************************/
/* Description: This function maps the event identifier to a string. */
/* Description: This function maps the event identifier to a string. */
/*****************************************************************************/
char * event_to_name(short event)
{
@ -135,8 +138,8 @@ char * event_to_name(short event)
}
/*****************************************************************************/
/* Description: Checks whether all objects in a PySequence are of a same */
/* given type. Returns 0 if not, 1 on success. */
/* Description: Checks whether all objects in a PySequence are of a same */
/* given type. Returns 0 if not, 1 on success. */
/*****************************************************************************/
int EXPP_check_sequence_consistency(PyObject *seq, PyTypeObject *against)
{
@ -181,61 +184,180 @@ PyObject *EXPP_tuple_repr(PyObject *self, int size)
/****************************************************************************/
/* Description: searches through a map for a pair with a given name. If the */
/* pair is present, its ival is stored in *ival and nonzero is */
/* returned. If the pair is absent, zero is returned. */
/* pair is present, its ival is stored in *ival and nonzero is */
/* returned. If the pair is absent, zero is returned. */
/****************************************************************************/
int EXPP_map_getIntVal (const EXPP_map_pair *map, const char *sval, int *ival)
{
while (map->sval)
{
if (StringEqual(sval, map->sval))
{
*ival = map->ival;
return 1;
}
++map;
}
return 0;
while (map->sval)
{
if (StringEqual(sval, map->sval))
{
*ival = map->ival;
return 1;
}
++map;
}
return 0;
}
/****************************************************************************/
/* Description: searches through a map for a pair with a given name. If the */
/* pair is present, its ival is stored in *ival and nonzero is */
/* returned. If the pair is absent, zero is returned. */
/* note: this function is identical to EXPP_map_getIntVal except that the */
/* output is stored in a short value. */
/* pair is present, its ival is stored in *ival and nonzero is */
/* returned. If the pair is absent, zero is returned. */
/* note: this function is identical to EXPP_map_getIntVal except that the */
/* output is stored in a short value. */
/****************************************************************************/
int EXPP_map_getShortVal (const EXPP_map_pair *map,
const char *sval, short *ival)
const char *sval, short *ival)
{
while (map->sval)
{
if (StringEqual(sval, map->sval))
{
*ival = map->ival;
return 1;
}
++map;
}
return 0;
while (map->sval)
{
if (StringEqual(sval, map->sval))
{
*ival = map->ival;
return 1;
}
++map;
}
return 0;
}
/****************************************************************************/
/* Description: searches through a map for a pair with a given ival. If the */
/* pair is present, a pointer to its name is stored in *sval */
/* and nonzero is returned. If the pair is absent, zero is */
/* returned. */
/* pair is present, a pointer to its name is stored in *sval */
/* and nonzero is returned. If the pair is absent, zero is */
/* returned. */
/****************************************************************************/
int EXPP_map_getStrVal (const EXPP_map_pair *map, int ival, const char **sval)
{
while (map->sval)
{
if (ival == map->ival)
{
*sval = map->sval;
return 1;
}
++map;
}
return 0;
while (map->sval)
{
if (ival == map->ival)
{
*sval = map->sval;
return 1;
}
++map;
}
return 0;
}
/************************************************************************/
/* Scriptlink-related functions, used by scene, object, etc. bpyobjects */
/************************************************************************/
PyObject *EXPP_getScriptLinks (ScriptLink *slink, PyObject *args, int is_scene)
{
PyObject *list = NULL;
char *eventname = NULL;
int i, event = 0;
/* actually !scriptlink shouldn't happen ... */
if (!slink || !slink->totscript)
return EXPP_incr_ret (Py_None);
if (!PyArg_ParseTuple(args, "s", &eventname))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected event name (string) as argument");
list = PyList_New(0);
if (!list)
return EXPP_ReturnPyObjError (PyExc_MemoryError,
"couldn't create PyList!");
if (!strcmp(eventname, "FrameChanged"))
event = SCRIPT_FRAMECHANGED;
else if (!strcmp(eventname, "Redraw"))
event = SCRIPT_REDRAW;
else if (is_scene && !strcmp(eventname, "OnLoad"))
event = SCRIPT_ONLOAD;
else
return EXPP_ReturnPyObjError (PyExc_AttributeError,
"invalid event name.");
for (i = 0; i < slink->totscript; i++) {
if ((slink->flag[i] == event) && slink->scripts[i])
PyList_Append(list, PyString_FromString(slink->scripts[i]->name+2));
}
return list;
}
int EXPP_clearScriptLinks (ScriptLink *slink)
{
/* actually !scriptlink shouldn't happen ... */
if (!slink || !slink->totscript) return -1;
if (slink->scripts) MEM_freeN(slink->scripts);
if (slink->flag) MEM_freeN(slink->flag);
slink->scripts = NULL;
slink->flag = NULL;
slink->totscript = slink->actscript = 0;
return 0; /* normal return */
}
int EXPP_addScriptLink (ScriptLink *slink, PyObject *args, int is_scene)
{
int event = 0, found_txt = 0;
void *stmp = NULL, *ftmp = NULL;
Text *bltxt = G.main->text.first;
char *textname = NULL;
char *eventname = NULL;
/* !scriptlink shouldn't happen ... */
if (!slink) {
return EXPP_ReturnIntError (PyExc_RuntimeError,
"internal error: no scriptlink!");
}
if (!PyArg_ParseTuple(args, "ss", &textname, &eventname))
return EXPP_ReturnIntError (PyExc_TypeError,
"expected two strings as arguments");
while (bltxt) {
if (!strcmp(bltxt->id.name+2, textname)) {
found_txt = 1;
break;
}
bltxt = bltxt->id.next;
}
if (!found_txt)
return EXPP_ReturnIntError (PyExc_AttributeError,
"no such Blender Text.");
if (!strcmp(eventname, "FrameChanged"))
event = SCRIPT_FRAMECHANGED;
else if (!strcmp(eventname, "Redraw"))
event = SCRIPT_REDRAW;
else if (is_scene && !strcmp(eventname, "OnLoad"))
event = SCRIPT_ONLOAD;
else
return EXPP_ReturnIntError (PyExc_AttributeError,
"invalid event name.");
stmp= slink->scripts;
slink->scripts= MEM_mallocN(sizeof(ID*)*(slink->totscript+1), "bpySlinkL");
ftmp= slink->flag;
slink->flag= MEM_mallocN(sizeof(short*)*(slink->totscript+1), "bpySlinkF");
if (slink->totscript) {
memcpy(slink->scripts, stmp, sizeof(ID*)*(slink->totscript));
MEM_freeN(stmp);
memcpy(slink->flag, ftmp, sizeof(short)*(slink->totscript));
MEM_freeN(ftmp);
}
slink->scripts[slink->totscript] = (ID*)bltxt;
slink->flag[slink->totscript]= event;
slink->totscript++;
if (slink->actscript < 1) slink->actscript = 1;
return 0; /* normal exit */
}

@ -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.
@ -60,7 +60,7 @@ PyObject *PythonIncRef (PyObject *object);
char * event_to_name (short event);
float EXPP_ClampFloat (float value, float min, float max);
int EXPP_ClampInt (int value, int min, int max);
int EXPP_ClampInt (int value, int min, int max);
PyObject *EXPP_incr_ret (PyObject *object);
PyObject *EXPP_ReturnPyObjError (PyObject * type, char * error_msg);
@ -71,16 +71,21 @@ PyObject *EXPP_tuple_repr(PyObject *self, int size);
/* mapping utilities - see Texture.c for an example of how to use these */
typedef struct {
const char *sval;
int ival;
const char *sval;
int ival;
} EXPP_map_pair;
/* maps must end with a pair that has NULL as sval */
int EXPP_map_getIntVal (const EXPP_map_pair *map,
const char *sval, int *ival);
const char *sval, int *ival);
int EXPP_map_getShortVal (const EXPP_map_pair *map,
const char *sval, short *ival);
const char *sval, short *ival);
int EXPP_map_getStrVal (const EXPP_map_pair *map,
int ival, const char **sval);
int ival, const char **sval);
/* scriplinks-related: */
PyObject *EXPP_getScriptLinks (ScriptLink *slink, PyObject *args, int is_scene);
int EXPP_clearScriptLinks (ScriptLink *slink);
int EXPP_addScriptLink (ScriptLink *slink, PyObject *args, int is_scene);
#endif /* EXPP_gen_utils_h */