* Moved the code to retrieve an object by name to a seperate function in
[blender.git] / source / blender / python / api2_2x / Blender.c
1 /* 
2  *
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * This is a new part of Blender.
26  *
27  * Contributor(s): Michel Selten
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30 */
31
32 #include <Python.h>
33 #include <stdio.h>
34
35 #include <BKE_global.h>
36 #include <BSE_headerbuttons.h>
37 #include <DNA_ID.h>
38 #include <DNA_object_types.h>
39 #include <DNA_scene_types.h>
40 /* #include <DNA_screen_types.h> */
41 #include <DNA_userdef_types.h>
42 #include <BKE_ipo.h>
43
44 #include "gen_utils.h"
45 #include "modules.h"
46
47 /*****************************************************************************/
48 /* Python API function prototypes for the Blender module.                    */
49 /*****************************************************************************/
50 PyObject *Blender_Set (PyObject *self, PyObject *args);
51 PyObject *Blender_Get (PyObject *self, PyObject *args);
52 PyObject *Blender_Redraw(PyObject *self, PyObject *args);
53
54 /*****************************************************************************/
55 /* The following string definitions are used for documentation strings.      */
56 /* In Python these will be written to the console when doing a               */
57 /* Blender.__doc__                                                           */
58 /*****************************************************************************/
59 char Blender_Set_doc[] =
60 "(request, data) - Update settings in Blender\n\
61 \n\
62 (request) A string indentifying the setting to change\n\
63         'curframe'      - Sets the current frame using the number in data";
64
65 char Blender_Get_doc[] =
66 "(request) - Retrieve settings from Blender\n\
67 \n\
68 (request) A string indentifying the data to be returned\n\
69         'curframe'      - Returns the current animation frame\n\
70         'curtime'       - Returns the current animation time\n\
71         'staframe'      - Returns the start frame of the animation\n\
72         'endframe'      - Returns the end frame of the animation\n\
73         'filename'      - Returns the name of the last file read or written\n\
74         'version'       - Returns the Blender version number";
75
76 char Blender_Redraw_doc[] = "() - Redraw all 3D windows";
77
78 /*****************************************************************************/
79 /* Python method structure definition.                                       */
80 /*****************************************************************************/
81 struct PyMethodDef Blender_methods[] = {
82         {"Set",    &Blender_Set, METH_VARARGS, Blender_Set_doc},
83         {"Get",    &Blender_Get, METH_VARARGS, Blender_Get_doc},
84         {"Redraw", &Blender_Redraw, METH_VARARGS, Blender_Redraw_doc},
85         {NULL, NULL}
86 };
87
88 /*****************************************************************************/
89 /* Function:              Blender_Set                                        */
90 /* Python equivalent:     Blender.Set                                        */
91 /*****************************************************************************/
92 PyObject *Blender_Set (PyObject *self, PyObject *args)
93 {
94         char      * name;
95         PyObject  * arg;
96         int         framenum;
97         
98         if (!PyArg_ParseTuple(args, "sO", &name, &arg))
99         {
100                 /* TODO: Do we need to generate a nice error message here? */
101                 return (NULL);
102         }
103
104         if (StringEqual (name, "curframe"))
105         {
106                 if (!PyArg_Parse(arg, "i", &framenum))
107                 {
108                         /* TODO: Do we need to generate a nice error message here? */
109                         return (NULL);
110                 }
111
112                 G.scene->r.cfra = framenum;
113
114                 update_for_newframe();
115         }
116         else
117         {
118                 return (PythonReturnErrorObject (PyExc_AttributeError,
119                                         "bad request identifier"));
120         }
121         return ( PythonIncRef (Py_None) );
122 }
123
124 /*****************************************************************************/
125 /* Function:              Blender_Get                                        */
126 /* Python equivalent:     Blender.Get                                        */
127 /*****************************************************************************/
128 PyObject *Blender_Get (PyObject *self, PyObject *args)
129 {
130         PyObject  * object;
131         PyObject  * dict;
132         char      * str;
133         
134         printf ("In Blender_Get()\n");
135
136         if (!PyArg_ParseTuple (args, "O", &object))
137         {
138                 /* TODO: Do we need to generate a nice error message here? */
139                 return (NULL);
140         }
141
142         if (PyString_Check (object))
143         {
144                 str = PyString_AsString (object);
145
146                 if (StringEqual (str, "curframe"))
147                 {
148                         return ( PyInt_FromLong (G.scene->r.cfra) );
149                 }
150                 if (StringEqual (str, "curtime"))
151                 {
152                         return ( PyFloat_FromDouble (frame_to_float (G.scene->r.cfra) ) );
153                 }
154                 if (StringEqual (str, "staframe"))
155                 {
156                         return ( PyInt_FromLong (G.scene->r.sfra) );
157                 }
158                 if (StringEqual (str, "endframe"))
159                 {
160                         return ( PyInt_FromLong (G.scene->r.efra) );
161                 }
162                 if (StringEqual (str, "filename"))
163                 {
164                         return ( PyString_FromString (G.sce) );
165                 }
166                 /* According to the old file (opy_blender.c), the following if
167                    statement is a quick hack and needs some clean up. */
168                 if (StringEqual (str, "vrmloptions"))
169                 {
170                         dict = PyDict_New ();
171
172                         PyDict_SetItemString (dict, "twoside",
173                                         PyInt_FromLong (U.vrmlflag & USERDEF_VRML_TWOSIDED));
174
175                         PyDict_SetItemString (dict, "layers",
176                                         PyInt_FromLong (U.vrmlflag & USERDEF_VRML_LAYERS));
177
178                         PyDict_SetItemString (dict, "autoscale",
179                                         PyInt_FromLong (U.vrmlflag & USERDEF_VRML_AUTOSCALE));
180
181                         return (dict);
182                 } /* End 'quick hack' part. */
183                 if (StringEqual (str, "version"))
184                 {
185                         return ( PyInt_FromLong (G.version) );
186                 }
187                 /* TODO: Do we want to display a usefull message here that the
188                    requested data is unknown?
189                 else
190                 {
191                         return (PythonReturnErrorObject (..., "message") );
192                 }
193                 */
194         }
195         else
196         {
197                 return (PythonReturnErrorObject (PyExc_AttributeError,
198                                         "expected string argument"));
199         }
200
201         return (PythonReturnErrorObject (PyExc_AttributeError,
202                                 "bad request identifier"));
203 }
204
205 /*****************************************************************************/
206 /* Function:              Blender_Redraw                                     */
207 /* Python equivalent:     Blender.Redraw                                     */
208 /*****************************************************************************/
209 PyObject *Blender_Redraw(PyObject *self, PyObject *args)
210 {
211         /*
212         int wintype = SPACE_VIEW3D;
213         
214         printf ("In Blender_Redraw()\n");
215
216         if (!PyArg_ParseTuple (args, "|i", &wintype))
217         {
218                  TODO: Do we need to generate a nice error message here?
219                 return (NULL);
220         }
221
222         return Windowmodule_Redraw(self, Py_BuildValue("(i)", wintype));
223         */
224         return (Py_None);
225 }
226
227 /*****************************************************************************/
228 /* Function:              initBlender                                        */
229 /*****************************************************************************/
230 void initBlender (void)
231 {
232         PyObject        * module;
233         PyObject        * dict;
234
235         printf ("In initBlender()\n");
236         g_blenderdict = NULL;
237
238         /* TODO: create a docstring for the Blender module */
239         module = Py_InitModule3("Blender", Blender_methods, NULL);
240
241         dict = PyModule_GetDict (module);
242         g_blenderdict = dict;
243         PyDict_SetItemString (dict, "Object", initObject());
244 }
245