diff options
-rw-r--r-- | source/blender/python/api2_2x/Blender.c | 55 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Blender.h | 90 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Object.c | 923 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Object.h | 138 | ||||
-rw-r--r-- | source/blender/python/api2_2x/modules.h | 2 |
5 files changed, 734 insertions, 474 deletions
diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c index 2af50256de7..22dc43771ae 100644 --- a/source/blender/python/api2_2x/Blender.c +++ b/source/blender/python/api2_2x/Blender.c @@ -29,61 +29,12 @@ * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ -#include <Python.h> -#include <stdio.h> - -#include <BKE_global.h> -#include <BSE_headerbuttons.h> -#include <DNA_ID.h> -#include <DNA_object_types.h> -#include <DNA_scene_types.h> -/* #include <DNA_screen_types.h> */ -#include <DNA_userdef_types.h> -#include <BKE_ipo.h> - -#include "gen_utils.h" -#include "modules.h" - -/*****************************************************************************/ -/* 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); - -/*****************************************************************************/ -/* 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 indentifying 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"; +#include "Blender.h" /*****************************************************************************/ -/* Python method structure definition. */ +/* Global variables */ /*****************************************************************************/ -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}, - {NULL, NULL} -}; +PyObject *g_blenderdict; /*****************************************************************************/ /* Function: Blender_Set */ diff --git a/source/blender/python/api2_2x/Blender.h b/source/blender/python/api2_2x/Blender.h new file mode 100644 index 00000000000..44aa75ea6dc --- /dev/null +++ b/source/blender/python/api2_2x/Blender.h @@ -0,0 +1,90 @@ +/* + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * This is a new part of Blender. + * + * Contributor(s): Michel Selten + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** +*/ + +#ifndef EXPP_BLENDER_H +#define EXPP_BLENDER_H + +#include <Python.h> +#include <stdio.h> + +#include <BKE_global.h> +#include <BSE_headerbuttons.h> +#include <DNA_ID.h> +#include <DNA_object_types.h> +#include <DNA_scene_types.h> +#include <DNA_userdef_types.h> +#include <BKE_ipo.h> + +#include "gen_utils.h" +#include "modules.h" + +/*****************************************************************************/ +/* 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); + +/*****************************************************************************/ +/* 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 indentifying 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"; + +/*****************************************************************************/ +/* 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}, + {NULL, NULL} +}; + +#endif /* EXPP_BLENDER_H */ diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c index cc30827f235..50a65f05f0c 100644 --- a/source/blender/python/api2_2x/Object.c +++ b/source/blender/python/api2_2x/Object.c @@ -29,150 +29,268 @@ * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ -#include <Python.h> -#include <stdio.h> +#include "Object.h" -#include <BKE_global.h> -#include <BKE_main.h> -#include <DNA_ika_types.h> -#include <DNA_object_types.h> - -#include "gen_utils.h" - -/*****************************************************************************/ -/* Python API function prototypes for the Blender module. */ -/*****************************************************************************/ -PyObject *Object_New(PyObject *self, PyObject *args); -PyObject *Object_Get(PyObject *self, PyObject *args); -PyObject *Object_GetSelected (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__ */ -/*****************************************************************************/ -char Object_New_doc[] = -"(type) - Add a new object of type 'type' in the current scene"; - -char Object_Get_doc[] = -"(name) - return the object with the name 'name', returns None if not\ - found.\n\ - If 'name' is not specified, it returns a list of all objects in the\n\ - current scene."; - -char Object_GetSelected_doc[] = -"() - Returns a list of selected Objects in the active layer(s)\n\ -The active object is the first in the list, if visible"; - -/*****************************************************************************/ -/* Python BlenderObject structure definition. */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD - struct Object *object; -} BlenObject; - -/*****************************************************************************/ -/* PythonTypeObject callback function prototypes */ -/*****************************************************************************/ -void ObjectDeAlloc (BlenObject *obj); -PyObject* ObjectGetAttr (BlenObject *obj, char *name); -int ObjectSetAttr (BlenObject *obj, char *name, PyObject *v); - -/*****************************************************************************/ -/* Python TypeObject structure definition. */ -/*****************************************************************************/ -static PyTypeObject object_type = -{ - PyObject_HEAD_INIT(&PyType_Type) - 0, /* ob_size */ - "Object", /* tp_name */ - sizeof (BlenObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)ObjectDeAlloc, /* tp_dealloc */ - 0, /* tp_print */ - (getattrfunc)ObjectGetAttr, /* tp_getattr */ - (setattrfunc)ObjectSetAttr, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_as_hash */ -}; - -/*****************************************************************************/ -/* Python method structure definition. */ /*****************************************************************************/ -struct PyMethodDef Object_methods[] = { - {"New", Object_New, METH_VARARGS, Object_New_doc}, - {"Get", Object_Get, METH_VARARGS, Object_Get_doc}, - {"get", Object_Get, METH_VARARGS, Object_Get_doc}, - {"getSelected", Object_GetSelected, METH_VARARGS, Object_GetSelected_doc}, - {NULL, NULL} -}; - -/*****************************************************************************/ -/* Function: Object_New */ +/* Function: M_Object_New */ /* Python equivalent: Blender.Object.New */ /*****************************************************************************/ -PyObject *Object_New(PyObject *self, PyObject *args) +PyObject *M_Object_New(PyObject *self, PyObject *args) { - printf ("In Object_New()\n"); - return (Py_None); + struct Object * object; + C_BlenObject * blen_object; + int type; + char name[32]; + + printf ("In Object_New()\n"); + + if (!PyArg_ParseTuple(args, "i", &type)) + { + PythonReturnErrorObject (PyExc_TypeError, + "type expected"); + return (NULL); + } + + /* Create a new object. */ + switch (type) + { + case OB_MESH: strcpy (name, "Mesh"); break; + case OB_CURVE: strcpy (name, "Curve"); break; + case OB_SURF: strcpy (name, "Surf"); break; + case OB_FONT: strcpy (name, "Text"); break; + case OB_MBALL: strcpy (name, "Mball"); break; + case OB_CAMERA: strcpy (name, "Camera"); break; + case OB_LAMP: strcpy (name, "Lamp"); break; + case OB_IKA: strcpy (name, "Ika"); break; + case OB_LATTICE: strcpy (name, "Lattice"); break; + case OB_WAVE: strcpy (name, "Wave"); break; + case OB_ARMATURE: strcpy (name, "Armature"); break; + default: strcpy (name, "Empty"); + } + + object = alloc_libblock (&(G.main->object), ID_OB, name); + + object->flag = 0; + object->type = type; + + /* transforms */ + QuatOne(object->quat); + QuatOne(object->dquat); + + object->col[3]= 1.0; // alpha + + object->size[0] = object->size[1] = object->size[2] = 1.0; + object->loc[0] = object->loc[1] = object->loc[2] = 0.0; + Mat4One(object->parentinv); + Mat4One(object->obmat); + object->dt = OB_SHADED; // drawtype + + if (U.flag & MAT_ON_OB) + { + object->colbits = -1; + } + switch (object->type) + { + case OB_CAMERA: /* fall through. */ + case OB_LAMP: + object->trackflag = OB_NEGZ; + object->upflag = OB_POSY; + break; + default: + object->trackflag = OB_POSY; + object->upflag = OB_POSZ; + } + object->ipoflag = OB_OFFS_OB + OB_OFFS_PARENT; + + /* duplivert settings */ + object->dupon = 1; + object->dupoff = 0; + object->dupsta = 1; + object->dupend = 100; + + /* Gameengine defaults*/ + object->mass = 1.0; + object->inertia = 1.0; + object->formfactor = 0.4; + object->damping = 0.04; + object->rdamping = 0.1; + object->anisotropicFriction[0] = 1.0; + object->anisotropicFriction[1] = 1.0; + object->anisotropicFriction[2] = 1.0; + object->gameflag = OB_PROP; + + object->lay = 1; // Layer, by default visible + + switch(type) + { + case OB_MESH: + object->data = add_mesh(); + G.totmesh++; + break; + case OB_CAMERA: + object->data = add_camera(); + break; + case OB_LAMP: + object->data = add_lamp(); + G.totlamp++; + break; + + /* TODO the following types will be supported later + case OB_CURVE: + object->data = add_curve(OB_CURVE); + G.totcurve++; + break; + case OB_SURF: + object->data = add_curve(OB_SURF); + G.totcurve++; + break; + case OB_FONT: + object->data = add_curve(OB_FONT); + break; + case OB_MBALL: + object->data = add_mball(); + break; + case OB_IKA: + object->data = add_ika(); + object->dt = OB_WIRE; + break; + case OB_LATTICE: + object->data = (void *)add_lattice(); + object->dt = OB_WIRE; + break; + case OB_WAVE: + object->data = add_wave(); + break; + case OB_ARMATURE: + object->data = add_armature(); + break; + */ + } + + G.totobj++; + + /* Create a Python object from it. */ + blen_object = (C_BlenObject*)PyObject_NEW (C_BlenObject, &object_type); + blen_object->object = object; + + return ((PyObject*)blen_object); } /*****************************************************************************/ -/* Function: Object_Get */ +/* Function: M_Object_Get */ /* Python equivalent: Blender.Object.Get */ /*****************************************************************************/ -PyObject *Object_Get(PyObject *self, PyObject *args) +PyObject *M_Object_Get(PyObject *self, PyObject *args) { - char * name; - PyObject * arg; - struct Object * object; - BlenObject * blen_object; - - printf ("In Object_Get()\n"); - - if (!PyArg_ParseTuple(args, "O", &arg)) - { - /* We expected a string as an argument, but we didn't get one. */ - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected string argument")); - } - - if (!PyString_Check (arg)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected string argument")); - } - - name = PyString_AsString (arg); - object = GetObjectByName (name); - - if (object == NULL) - { - /* No object exists with the name specified in the argument name. */ - return (PythonReturnErrorObject (PyExc_AttributeError, - "Unknown object specified.")); - } - blen_object = (BlenObject*)PyObject_NEW (BlenObject, &object_type); - blen_object->object = object; - - return ((PyObject*)blen_object); + struct Object * object; + char * name; + + printf ("In Object_Get()\n"); + + PyArg_ParseTuple(args, "|s", &name); + + if (name != NULL) + { + C_BlenObject * blen_object; + + object = GetObjectByName (name); + + if (object == NULL) + { + /* No object exists with the name specified in the argument name. */ + return (PythonReturnErrorObject (PyExc_AttributeError, + "Unknown object specified.")); + } + blen_object = (C_BlenObject*)PyObject_NEW (C_BlenObject, &object_type); + blen_object->object = object; + + return ((PyObject*)blen_object); + } + else + { + /* No argument has been given. Return a list of all objects by name. */ + PyObject * obj_list; + ID * id_iter; + int index = 0; + + obj_list = PyList_New (BLI_countlist (&(G.main->object))); + + if (obj_list == NULL) + { + return (PythonReturnErrorObject (PyExc_SystemError, + "List creation failed.")); + } + + object = G.main->object.first; + id_iter = &(object->id); + while (id_iter) + { + PyObject * object; + + object = PyString_FromString (GetIdName (id_iter)); + if (object == NULL) + { + return (PythonReturnErrorObject (PyExc_SystemError, + "Python string creation failed.")); + } + PyList_SetItem (obj_list, index, object); + id_iter = id_iter->next; + index++; + } + return (obj_list); + } } /*****************************************************************************/ -/* Function: Object_GetSelected */ +/* Function: M_Object_GetSelected */ /* Python equivalent: Blender.Object.getSelected */ /*****************************************************************************/ -PyObject *Object_GetSelected (PyObject *self, PyObject *args) +PyObject *M_Object_GetSelected (PyObject *self, PyObject *args) { - printf ("In Object_GetSelected()\n"); - - return (Py_None); + C_BlenObject * blen_object; + PyObject * list; + Base * base_iter; + + printf ("In Object_GetSelected()\n"); + + list = PyList_New (0); + if ((G.scene->basact) && + ((G.scene->basact->flag & SELECT) && + (G.scene->basact->lay & G.vd->lay))) + { + /* Active object is first in the list. */ + blen_object = (C_BlenObject*)PyObject_NEW (C_BlenObject, &object_type); + if (blen_object == NULL) + { + Py_DECREF (list); + Py_INCREF (Py_None); + return (Py_None); + } + blen_object->object = G.scene->basact->object; + PyList_Append (list, (PyObject*)blen_object); + } + + base_iter = G.scene->base.first; + while (base_iter) + { + if (((G.scene->basact->flag & SELECT) && + (G.scene->basact->lay & G.vd->lay)) && + (base_iter != G.scene->basact)) + { + blen_object = (C_BlenObject*)PyObject_NEW (C_BlenObject, + &object_type); + if (blen_object == NULL) + { + Py_DECREF (list); + Py_INCREF (Py_None); + return (Py_None); + } + blen_object->object = base_iter->object; + PyList_Append (list, (PyObject*)blen_object); + } + base_iter = base_iter->next; + } + return (list); } /*****************************************************************************/ @@ -180,13 +298,13 @@ PyObject *Object_GetSelected (PyObject *self, PyObject *args) /*****************************************************************************/ PyObject *initObject (void) { - PyObject * module; + PyObject * module; - printf ("In initObject()\n"); + printf ("In initObject()\n"); - module = Py_InitModule("Object", Object_methods); + module = Py_InitModule3("Object", M_Object_methods, M_Object_doc); - return (module); + return (module); } /*****************************************************************************/ @@ -196,16 +314,18 @@ PyObject *initObject (void) /*****************************************************************************/ PyObject* ObjectCreatePyObject (struct Object *obj) { - BlenObject * blen_object; + C_BlenObject * blen_object; - printf ("In ObjectCreatePyObject\n"); + printf ("In ObjectCreatePyObject\n"); - blen_object = (BlenObject*)PyObject_NEW - (BlenObject, - &object_type); + blen_object = (C_BlenObject*)PyObject_NEW (C_BlenObject, &object_type); - blen_object->object = obj; - return ((PyObject*)blen_object); + if (blen_object == NULL) + { + return (NULL); + } + blen_object->object = obj; + return ((PyObject*)blen_object); } /*****************************************************************************/ @@ -213,9 +333,9 @@ PyObject* ObjectCreatePyObject (struct Object *obj) /* Description: This is a callback function for the BlenObject type. It is */ /* the destructor function. */ /*****************************************************************************/ -void ObjectDeAlloc (BlenObject *obj) +void ObjectDeAlloc (C_BlenObject *obj) { - PyObject_DEL (obj); + PyObject_DEL (obj); } /*****************************************************************************/ @@ -224,147 +344,121 @@ void ObjectDeAlloc (BlenObject *obj) /* the function that retrieves any value from Blender and */ /* passes it to Python. */ /*****************************************************************************/ -PyObject* ObjectGetAttr (BlenObject *obj, char *name) +PyObject* ObjectGetAttr (C_BlenObject *obj, char *name) { - struct Object * object; - struct Ika * ika; - - object = obj->object; - if (StringEqual (name, "LocX")) - return (PyFloat_FromDouble(object->loc[0])); - if (StringEqual (name, "LocY")) - return (PyFloat_FromDouble(object->loc[1])); - if (StringEqual (name, "LocZ")) - return (PyFloat_FromDouble(object->loc[2])); - if (StringEqual (name, "loc")) - { - printf ("This is not implemented yet. (vector)\n"); - return (Py_None); - } - if (StringEqual (name, "dLocX")) - return (PyFloat_FromDouble(object->dloc[0])); - if (StringEqual (name, "dLocY")) - return (PyFloat_FromDouble(object->dloc[1])); - if (StringEqual (name, "dLocZ")) - return (PyFloat_FromDouble(object->dloc[2])); - if (StringEqual (name, "dloc")) - { - printf ("This is not implemented yet. (vector)\n"); - return (Py_None); - } - if (StringEqual (name, "RotX")) - return (PyFloat_FromDouble(object->rot[0])); - if (StringEqual (name, "RotY")) - return (PyFloat_FromDouble(object->rot[1])); - if (StringEqual (name, "RotZ")) - return (PyFloat_FromDouble(object->rot[2])); - if (StringEqual (name, "rot")) - { - printf ("This is not implemented yet. (vector)\n"); - return (Py_None); - } - if (StringEqual (name, "dRotX")) - return (PyFloat_FromDouble(object->drot[0])); - if (StringEqual (name, "dRotY")) - return (PyFloat_FromDouble(object->drot[1])); - if (StringEqual (name, "dRotZ")) - return (PyFloat_FromDouble(object->drot[2])); - if (StringEqual (name, "drot")) - { - printf ("This is not implemented yet. (vector)\n"); - return (Py_None); - } - if (StringEqual (name, "SizeX")) - return (PyFloat_FromDouble(object->size[0])); - if (StringEqual (name, "SizeY")) - return (PyFloat_FromDouble(object->size[1])); - if (StringEqual (name, "SizeZ")) - return (PyFloat_FromDouble(object->size[2])); - if (StringEqual (name, "size")) - { - printf ("This is not implemented yet. (vector)\n"); - return (Py_None); - } - if (StringEqual (name, "dSizeX")) - return (PyFloat_FromDouble(object->dsize[0])); - if (StringEqual (name, "dSizeY")) - return (PyFloat_FromDouble(object->dsize[1])); - if (StringEqual (name, "dSizeZ")) - return (PyFloat_FromDouble(object->dsize[2])); - if (StringEqual (name, "dsize")) - { - printf ("This is not implemented yet. (vector)\n"); - return (Py_None); - } - if (strncmp (name,"Eff", 3) == 0) - { - if ( (object->type == OB_IKA) && (object->data != NULL) ) - { - ika = object->data; - switch (name[3]) - { - case 'X': - return (PyFloat_FromDouble (ika->effg[0])); - case 'Y': - return (PyFloat_FromDouble (ika->effg[1])); - case 'Z': - return (PyFloat_FromDouble (ika->effg[2])); - default: - /* Do we need to display a sensible error message here? */ - return (NULL); - } - } - return (NULL); - } - if (StringEqual (name, "Layer")) - return (PyInt_FromLong(object->lay)); - if (StringEqual (name, "parent")) - { - printf ("This is not implemented yet.\n"); - return (Py_None); - } - if (StringEqual (name, "track")) - { - printf ("This is not implemented yet.\n"); - return (Py_None); - } - if (StringEqual (name, "data")) - { - printf ("This is not implemented yet.\n"); - return (Py_None); - } - if (StringEqual (name, "ipo")) - { - printf ("This is not implemented yet.\n"); - return (Py_None); - } - if (StringEqual (name, "mat")) - { - printf ("This is not implemented yet. (matrix)\n"); - return (Py_None); - } - if (StringEqual (name, "matrix")) - { - printf ("This is not implemented yet. (matrix)\n"); - return (Py_None); - } - if (StringEqual (name, "colbits")) - { - printf ("This is not implemented yet.\n"); - return (Py_None); - } - if (StringEqual (name, "drawType")) - { - printf ("This is not implemented yet.\n"); - return (Py_None); - } - if (StringEqual (name, "drawMode")) - { - printf ("This is not implemented yet.\n"); - return (Py_None); - } - printf ("Unknown variable.\n"); - return (Py_None); + struct Object * object; + struct Ika * ika; + + object = obj->object; + if (StringEqual (name, "LocX")) + return (PyFloat_FromDouble(object->loc[0])); + if (StringEqual (name, "LocY")) + return (PyFloat_FromDouble(object->loc[1])); + if (StringEqual (name, "LocZ")) + return (PyFloat_FromDouble(object->loc[2])); + if (StringEqual (name, "loc")) + return (Py_BuildValue ("fff", object->loc[0], object->loc[1], + object->loc[2])); + if (StringEqual (name, "dLocX")) + return (PyFloat_FromDouble(object->dloc[0])); + if (StringEqual (name, "dLocY")) + return (PyFloat_FromDouble(object->dloc[1])); + if (StringEqual (name, "dLocZ")) + return (PyFloat_FromDouble(object->dloc[2])); + if (StringEqual (name, "dloc")) + return (Py_BuildValue ("fff", object->dloc[0], object->dloc[1], + object->dloc[2])); + if (StringEqual (name, "RotX")) + return (PyFloat_FromDouble(object->rot[0])); + if (StringEqual (name, "RotY")) + return (PyFloat_FromDouble(object->rot[1])); + if (StringEqual (name, "RotZ")) + return (PyFloat_FromDouble(object->rot[2])); + if (StringEqual (name, "rot")) + return (Py_BuildValue ("fff", object->rot[0], object->rot[1], + object->rot[2])); + if (StringEqual (name, "dRotX")) + return (PyFloat_FromDouble(object->drot[0])); + if (StringEqual (name, "dRotY")) + return (PyFloat_FromDouble(object->drot[1])); + if (StringEqual (name, "dRotZ")) + return (PyFloat_FromDouble(object->drot[2])); + if (StringEqual (name, "drot")) + return (Py_BuildValue ("fff", object->drot[0], object->drot[1], + object->drot[2])); + if (StringEqual (name, "SizeX")) + return (PyFloat_FromDouble(object->size[0])); + if (StringEqual (name, "SizeY")) + return (PyFloat_FromDouble(object->size[1])); + if (StringEqual (name, "SizeZ")) + return (PyFloat_FromDouble(object->size[2])); + if (StringEqual (name, "size")) + return (Py_BuildValue ("fff", object->size[0], object->size[1], + object->size[2])); + if (StringEqual (name, "dSizeX")) + return (PyFloat_FromDouble(object->dsize[0])); + if (StringEqual (name, "dSizeY")) + return (PyFloat_FromDouble(object->dsize[1])); + if (StringEqual (name, "dSizeZ")) + return (PyFloat_FromDouble(object->dsize[2])); + if (StringEqual (name, "dsize")) + return (Py_BuildValue ("fff", object->dsize[0], object->dsize[1], + object->dsize[2])); + if (strncmp (name,"Eff", 3) == 0) + { + if ( (object->type == OB_IKA) && (object->data != NULL) ) + { + ika = object->data; + switch (name[3]) + { + case 'X': + return (PyFloat_FromDouble (ika->effg[0])); + case 'Y': + return (PyFloat_FromDouble (ika->effg[1])); + case 'Z': + return (PyFloat_FromDouble (ika->effg[2])); + default: + /* Do we need to display a sensible error message here? */ + return (NULL); + } + } + return (NULL); + } + if (StringEqual (name, "Layer")) + return (PyInt_FromLong(object->lay)); + if (StringEqual (name, "parent")) + return (ObjectCreatePyObject (object->parent)); + if (StringEqual (name, "track")) + return (ObjectCreatePyObject (object->track)); + if (StringEqual (name, "data")) + { + printf ("This is not implemented yet.\n"); + return (Py_None); + } + if (StringEqual (name, "ipo")) + { + printf ("This is not implemented yet.\n"); + return (Py_None); + } + if (StringEqual (name, "mat")) + { + printf ("This is not implemented yet. (matrix)\n"); + return (Py_None); + } + if (StringEqual (name, "matrix")) + { + printf ("This is not implemented yet. (matrix)\n"); + return (Py_None); + } + if (StringEqual (name, "colbits")) + return (Py_BuildValue ("h", object->colbits)); + if (StringEqual (name, "drawType")) + return (Py_BuildValue ("b", object->dt)); + if (StringEqual (name, "drawMode")) + return (Py_BuildValue ("b", object->dtx)); + + printf ("Unknown variable.\n"); + return (Py_None); } /*****************************************************************************/ @@ -373,147 +467,134 @@ PyObject* ObjectGetAttr (BlenObject *obj, char *name) /* the function that retrieves any value from Python and sets */ /* it accordingly in Blender. */ /*****************************************************************************/ -int ObjectSetAttr (BlenObject *obj, char *name, PyObject *value) +int ObjectSetAttr (C_BlenObject *obj, char *name, PyObject *value) { - struct Object * object; - struct Ika * ika; - - object = obj->object; - if (StringEqual (name, "LocX")) - return (!PyArg_Parse (value, "f", &(object->loc[0]))); - if (StringEqual (name, "LocY")) - return (!PyArg_Parse (value, "f", &(object->loc[1]))); - if (StringEqual (name, "LocZ")) - return (!PyArg_Parse (value, "f", &(object->loc[2]))); - if (StringEqual (name, "loc")) - { - printf ("This is not implemented yet. (vector)\n"); - return (0); - } - if (StringEqual (name, "dLocX")) - return (!PyArg_Parse (value, "f", &(object->dloc[0]))); - if (StringEqual (name, "dLocY")) - return (!PyArg_Parse (value, "f", &(object->dloc[1]))); - if (StringEqual (name, "dLocZ")) - return (!PyArg_Parse (value, "f", &(object->dloc[2]))); - if (StringEqual (name, "dloc")) - { - printf ("This is not implemented yet. (vector)\n"); - return (0); - } - if (StringEqual (name, "RotX")) - return (!PyArg_Parse (value, "f", &(object->rot[0]))); - if (StringEqual (name, "RotY")) - return (!PyArg_Parse (value, "f", &(object->rot[1]))); - if (StringEqual (name, "RotZ")) - return (!PyArg_Parse (value, "f", &(object->rot[2]))); - if (StringEqual (name, "rot")) - { - printf ("This is not implemented yet. (vector)\n"); - return (0); - } - if (StringEqual (name, "dRotX")) - return (!PyArg_Parse (value, "f", &(object->drot[0]))); - if (StringEqual (name, "dRotY")) - return (!PyArg_Parse (value, "f", &(object->drot[1]))); - if (StringEqual (name, "dRotZ")) - return (!PyArg_Parse (value, "f", &(object->drot[2]))); - if (StringEqual (name, "drot")) - { - printf ("This is not implemented yet. (vector)\n"); - return (0); - } - if (StringEqual (name, "SizeX")) - return (!PyArg_Parse (value, "f", &(object->size[0]))); - if (StringEqual (name, "SizeY")) - return (!PyArg_Parse (value, "f", &(object->size[1]))); - if (StringEqual (name, "SizeZ")) - return (!PyArg_Parse (value, "f", &(object->size[2]))); - if (StringEqual (name, "size")) - { - printf ("This is not implemented yet. (vector)\n"); - return (0); - } - if (StringEqual (name, "dSizeX")) - return (!PyArg_Parse (value, "f", &(object->dsize[0]))); - if (StringEqual (name, "dSizeY")) - return (!PyArg_Parse (value, "f", &(object->dsize[1]))); - if (StringEqual (name, "dSizeZ")) - return (!PyArg_Parse (value, "f", &(object->dsize[2]))); - if (StringEqual (name, "dsize")) - { - printf ("This is not implemented yet. (vector)\n"); - return (0); - } - if (strncmp (name,"Eff", 3) == 0) - { - if ( (object->type == OB_IKA) && (object->data != NULL) ) - { - ika = object->data; - switch (name[3]) - { - case 'X': - return (!PyArg_Parse (value, "f", &(ika->effg[0]))); - case 'Y': - return (!PyArg_Parse (value, "f", &(ika->effg[1]))); - case 'Z': - return (!PyArg_Parse (value, "f", &(ika->effg[2]))); - default: - /* Do we need to display a sensible error message here? */ - return (0); - } - } - return (0); - } - if (StringEqual (name, "Layer")) - return (!PyArg_Parse (value, "i", &(object->lay))); - if (StringEqual (name, "parent")) - { - printf ("This is not implemented yet.\n"); - return (1); - } - if (StringEqual (name, "track")) - { - printf ("This is not implemented yet.\n"); - return (1); - } - if (StringEqual (name, "data")) - { - printf ("This is not implemented yet.\n"); - return (1); - } - if (StringEqual (name, "ipo")) - { - printf ("This is not implemented yet.\n"); - return (1); - } - if (StringEqual (name, "mat")) - { - printf ("This is not implemented yet. (matrix)\n"); - return (1); - } - if (StringEqual (name, "matrix")) - { - printf ("This is not implemented yet. (matrix)\n"); - return (1); - } - if (StringEqual (name, "colbits")) - { - printf ("This is not implemented yet.\n"); - return (1); - } - if (StringEqual (name, "drawType")) - { - printf ("This is not implemented yet.\n"); - return (1); - } - if (StringEqual (name, "drawMode")) - { - printf ("This is not implemented yet.\n"); - return (1); - } - - printf ("Unknown variable.\n"); - return (0); + struct Object * object; + struct Ika * ika; + + object = obj->object; + if (StringEqual (name, "LocX")) + return (!PyArg_Parse (value, "f", &(object->loc[0]))); + if (StringEqual (name, "LocY")) + return (!PyArg_Parse (value, "f", &(object->loc[1]))); + if (StringEqual (name, "LocZ")) + return (!PyArg_Parse (value, "f", &(object->loc[2]))); + if (StringEqual (name, "loc")) + return (!PyArg_Parse (value, "fff", &(object->loc[0]), + &(object->loc[1]), &(object->loc[2]))); + if (StringEqual (name, "dLocX")) + return (!PyArg_Parse (value, "f", &(object->dloc[0]))); + if (StringEqual (name, "dLocY")) + return (!PyArg_Parse (value, "f", &(object->dloc[1]))); + if (StringEqual (name, "dLocZ")) + return (!PyArg_Parse (value, "f", &(object->dloc[2]))); + if (StringEqual (name, "dloc")) + return (!PyArg_Parse (value, "fff", &(object->dloc[0]), + &(object->dloc[1]), &(object->dloc[2]))); + if (StringEqual (name, "RotX")) + return (!PyArg_Parse (value, "f", &(object->rot[0]))); + if (StringEqual (name, "RotY")) + return (!PyArg_Parse (value, "f", &(object->rot[1]))); + if (StringEqual (name, "RotZ")) + return (!PyArg_Parse (value, "f", &(object->rot[2]))); + if (StringEqual (name, "rot")) + return (!PyArg_Parse (value, "fff", &(object->rot[0]), + &(object->rot[1]), &(object->rot[2]))); + if (StringEqual (name, "dRotX")) + return (!PyArg_Parse (value, "f", &(object->drot[0]))); + if (StringEqual (name, "dRotY")) + return (!PyArg_Parse (value, "f", &(object->drot[1]))); + if (StringEqual (name, "dRotZ")) + return (!PyArg_Parse (value, "f", &(object->drot[2]))); + if (StringEqual (name, "drot")) + return (!PyArg_Parse (value, "fff", &(object->drot[0]), + &(object->drot[1]), &(object->drot[2]))); + if (StringEqual (name, "SizeX")) + return (!PyArg_Parse (value, "f", &(object->size[0]))); + if (StringEqual (name, "SizeY")) + return (!PyArg_Parse (value, "f", &(object->size[1]))); + if (StringEqual (name, "SizeZ")) + return (!PyArg_Parse (value, "f", &(object->size[2]))); + if (StringEqual (name, "size")) + return (!PyArg_Parse (value, "fff", &(object->size[0]), + &(object->size[1]), &(object->size[2]))); + if (StringEqual (name, "dSizeX")) + return (!PyArg_Parse (value, "f", &(object->dsize[0]))); + if (StringEqual (name, "dSizeY")) + return (!PyArg_Parse (value, "f", &(object->dsize[1]))); + if (StringEqual (name, "dSizeZ")) + return (!PyArg_Parse (value, "f", &(object->dsize[2]))); + if (StringEqual (name, "dsize")) + return (!PyArg_Parse (value, "fff", &(object->dsize[0]), + &(object->dsize[1]), &(object->dsize[2]))); + if (strncmp (name,"Eff", 3) == 0) + { + if ( (object->type == OB_IKA) && (object->data != NULL) ) + { + ika = object->data; + switch (name[3]) + { + case 'X': + return (!PyArg_Parse (value, "f", &(ika->effg[0]))); + case 'Y': + return (!PyArg_Parse (value, "f", &(ika->effg[1]))); + case 'Z': + return (!PyArg_Parse (value, "f", &(ika->effg[2]))); + default: + /* Do we need to display a sensible error message here? */ + return (0); + } + } + return (0); + } + if (StringEqual (name, "Layer")) + return (!PyArg_Parse (value, "i", &(object->lay))); + if (StringEqual (name, "parent")) + { + /* This is not allowed. */ + PythonReturnErrorObject (PyExc_AttributeError, + "Setting the parent is not allowed."); + return (0); + } + if (StringEqual (name, "track")) + { + /* This is not allowed. */ + PythonReturnErrorObject (PyExc_AttributeError, + "Setting the track is not allowed."); + return (0); + } + if (StringEqual (name, "data")) + { + /* This is not allowed. */ + PythonReturnErrorObject (PyExc_AttributeError, + "Setting the data is not allowed."); + return (0); + } + if (StringEqual (name, "ipo")) + { + /* This is not allowed. */ + PythonReturnErrorObject (PyExc_AttributeError, + "Setting the ipo is not allowed."); + return (0); + } + if (StringEqual (name, "mat")) + { + printf ("This is not implemented yet. (matrix)\n"); + return (1); + } + if (StringEqual (name, "matrix")) + { + printf ("This is not implemented yet. (matrix)\n"); + return (1); + } + if (StringEqual (name, "colbits")) + return (!PyArg_Parse (value, "h", &(object->colbits))); + if (StringEqual (name, "drawType")) + return (!PyArg_Parse (value, "b", &(object->dt))); + if (StringEqual (name, "drawMode")) + return (!PyArg_Parse (value, "b", &(object->dtx))); + + printf ("Unknown variable.\n"); + return (0); } diff --git a/source/blender/python/api2_2x/Object.h b/source/blender/python/api2_2x/Object.h new file mode 100644 index 00000000000..54efda31c10 --- /dev/null +++ b/source/blender/python/api2_2x/Object.h @@ -0,0 +1,138 @@ +/* + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * This is a new part of Blender. + * + * Contributor(s): Michel Selten + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** +*/ + +#ifndef EXPP_OBJECT_H +#define EXPP_OBJECT_H + +#include <Python.h> +#include <stdio.h> + +#include <BKE_global.h> +#include <BKE_library.h> +#include <BKE_main.h> +#include <BKE_mesh.h> +#include <BKE_object.h> +#include <BLI_arithb.h> +#include <BLI_blenlib.h> +#include <DNA_ID.h> +#include <DNA_ika_types.h> +#include <DNA_listBase.h> +#include <DNA_object_types.h> +#include <DNA_scene_types.h> +#include <DNA_userdef_types.h> +#include <DNA_view3d_types.h> + +#include "gen_utils.h" + +/*****************************************************************************/ +/* Python API function prototypes for the Blender module. */ +/*****************************************************************************/ +PyObject *M_Object_New(PyObject *self, PyObject *args); +PyObject *M_Object_Get(PyObject *self, PyObject *args); +PyObject *M_Object_GetSelected (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.Object.__doc__ */ +/*****************************************************************************/ +char M_Object_doc[] = +"The Blender Object module\n\n\ +This module provides access to **Object Data** in Blender.\n"; + +char M_Object_New_doc[] = +"(type) - Add a new object of type 'type' in the current scene"; + +char M_Object_Get_doc[] = +"(name) - return the object with the name 'name', returns None if not\ + found.\n\ + If 'name' is not specified, it returns a list of all objects in the\n\ + current scene."; + +char M_Object_GetSelected_doc[] = +"() - Returns a list of selected Objects in the active layer(s)\n\ +The active object is the first in the list, if visible"; + +/*****************************************************************************/ +/* Python BlenderObject structure definition. */ +/*****************************************************************************/ +typedef struct { + PyObject_HEAD + PyObject *dict; + struct Object *object; +} C_BlenObject; + +/*****************************************************************************/ +/* PythonTypeObject callback function prototypes */ +/*****************************************************************************/ +void ObjectDeAlloc (C_BlenObject *obj); +PyObject* ObjectGetAttr (C_BlenObject *obj, char *name); +int ObjectSetAttr (C_BlenObject *obj, char *name, PyObject *v); + +/*****************************************************************************/ +/* Python method structure definition. */ +/*****************************************************************************/ +struct PyMethodDef M_Object_methods[] = { + {"New", (PyCFunction)M_Object_New, METH_VARARGS, + M_Object_New_doc}, + {"Get", (PyCFunction)M_Object_Get, METH_VARARGS, + M_Object_Get_doc}, + {"get", (PyCFunction)M_Object_Get, METH_VARARGS, + M_Object_Get_doc}, + {"getSelected", (PyCFunction)M_Object_GetSelected, METH_VARARGS, + M_Object_GetSelected_doc}, + {NULL, NULL, 0, NULL} +}; + +/*****************************************************************************/ +/* Python TypeObject structure definition. */ +/*****************************************************************************/ +static PyTypeObject object_type = +{ + PyObject_HEAD_INIT(&PyType_Type) + 0, /* ob_size */ + "Object", /* tp_name */ + sizeof (C_BlenObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* methods */ + (destructor)ObjectDeAlloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc)ObjectGetAttr, /* tp_getattr */ + (setattrfunc)ObjectSetAttr, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_as_hash */ +}; + +#endif /* EXPP_OBJECT_H */ diff --git a/source/blender/python/api2_2x/modules.h b/source/blender/python/api2_2x/modules.h index 6d1fa51c993..639021ce5b2 100644 --- a/source/blender/python/api2_2x/modules.h +++ b/source/blender/python/api2_2x/modules.h @@ -38,7 +38,7 @@ /*****************************************************************************/ /* Global variables */ /*****************************************************************************/ -PyObject *g_blenderdict; +extern PyObject *g_blenderdict; void initBlender (void); PyObject* initObject (void); |