* Moved the code to retrieve an object by name to a seperate function in
[blender.git] / source / blender / python / BPY_interface.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 #ifdef HAVE_CONFIG_H
32 #include <config.h>
33 #endif
34 #include <Python.h>
35 #include <stdio.h>
36
37 #include <MEM_guardedalloc.h>
38
39 #include <BKE_text.h>
40 #include <DNA_ID.h>
41 #include <DNA_scriptlink_types.h>
42 #include <DNA_space_types.h>
43 #include <DNA_text_types.h>
44
45 #include <BPY_extern.h>
46
47 #include "api2_2x/interface.h"
48 /* unfortunately the following #include is needed because of some missing */
49 /* functionality in BKE/DNA */
50 /* #include "api2_2x/gen_utils.h" */
51
52 /*****************************************************************************/
53 /* Structure definitions                                                     */
54 /*****************************************************************************/
55 #define FILENAME_LENGTH 24
56 typedef struct _ScriptError {
57         char filename[FILENAME_LENGTH];
58         int lineno;
59 } ScriptError;
60
61 /*****************************************************************************/
62 /* Global variables                                                          */
63 /*****************************************************************************/
64 ScriptError g_script_error;
65
66 /*****************************************************************************/
67 /* Function prototypes                                                       */
68 /*****************************************************************************/
69 PyObject * RunPython(Text *text, PyObject *globaldict);
70 char *     GetName(Text *text);
71 PyObject * CreateGlobalDictionary (void);
72 void       ReleaseGlobalDictionary (PyObject * dict);
73
74 /*****************************************************************************/
75 /* Description: This function will initialise Python and all the implemented */
76 /*              api variations.                                              */
77 /* Notes:       Currently only the api for 2.2x will be initialised.         */
78 /*****************************************************************************/
79 void BPY_start_python(void)
80 {
81         printf ("In BPY_start_python\n");
82 /* TODO: Shouldn't "blender" be replaced by PACKAGE ?? (config.h) */
83         Py_SetProgramName("blender");
84
85         Py_Initialize ();
86
87         initBlenderApi2_2x ();
88
89         return;
90 }
91
92 /*****************************************************************************/
93 /* Description:                                                              */
94 /* Notes:       Not implemented yet                                          */
95 /*****************************************************************************/
96 void BPY_end_python(void)
97 {
98         printf ("In BPY_end_python\n");
99         return;
100 }
101
102 /*****************************************************************************/
103 /* Description: This function will return the linenumber on which an error   */
104 /*              has occurred in the Python script.                           */
105 /*****************************************************************************/
106 int BPY_Err_getLinenumber(void)
107 {
108         printf ("In BPY_Err_getLinenumber\n");
109         return g_script_error.lineno;
110 }
111
112 /*****************************************************************************/
113 /* Description: This function will return the filename of the python script. */
114 /*****************************************************************************/
115 const char *BPY_Err_getFilename(void)
116 {
117         printf ("In BPY_Err_getFilename\n");
118         return g_script_error.filename;
119 }
120
121 /*****************************************************************************/
122 /* Description: This function executes the script passed by st.              */
123 /* Notes:       Currently, the script is compiled each time it is executed,  */
124 /*              This should be optimized to store the compiled bytecode as   */
125 /*              has been done by the previous implementation.                */
126 /*****************************************************************************/
127 struct _object *BPY_txt_do_python(struct SpaceText* st)
128 {
129         PyObject *      dict;
130         PyObject *      ret;
131         printf ("In BPY_txt_do_python\n");
132
133         if (!st->text)
134         {
135                 return NULL;
136         }
137
138         dict = PyModule_GetDict(PyImport_AddModule("__main__"));
139         /* dict = newGlobalDictionary(); */
140         ret = RunPython (st->text, dict);
141
142         return dict;
143 }
144
145 /*****************************************************************************/
146 /* Description:                                                              */
147 /* Notes:       Not implemented yet                                          */
148 /*****************************************************************************/
149 void BPY_free_compiled_text(struct Text* text)
150 {
151         printf ("In BPY_free_compiled_text\n");
152         return;
153 }
154
155 /*****************************************************************************/
156 /* Description:                                                              */
157 /* Notes:       Not implemented yet                                          */
158 /*****************************************************************************/
159 void BPY_clear_bad_scriptlinks(struct Text *byebye)
160 {
161         printf ("In BPY_clear_bad_scriptlinks\n");
162         return;
163 }
164
165 /*****************************************************************************/
166 /* Description:                                                              */
167 /* Notes:       Not implemented yet                                          */
168 /*****************************************************************************/
169 void BPY_do_all_scripts(short event)
170 {
171         printf ("In BPY_do_all_scripts(event=%d)\n",event);
172         return;
173 }
174
175 /*****************************************************************************/
176 /* Description: Execute a Python script when an event occurs. The following  */
177 /*              events are possible: frame changed, load script and redraw.  */
178 /*              Only events happening to one of the following object types   */
179 /*              are handled: Object, Lamp, Camera, Material, World and       */
180 /*              Scene.                                                       */
181 /*****************************************************************************/
182 void BPY_do_pyscript(struct ID *id, short event)
183 {
184         ScriptLink     * scriptlink;
185         int              index;
186         PyObject       * dict;
187
188         printf ("In BPY_do_pyscript(id=%s, event=%d)\n",id->name, event);
189
190         scriptlink = setScriptLinks (id, event);
191
192         if (scriptlink == NULL)
193         {
194                 return;
195         }
196
197         for (index=0 ; index<scriptlink->totscript ; index++)
198         {
199                 printf ("scriptnr: %d\tevent=%d, flag[index]=%d\n", index,
200                                 event, scriptlink->flag[index]);
201                 if ((scriptlink->flag[index] == event) &&
202                     (scriptlink->scripts[index]!=NULL))
203                 {
204                         dict = CreateGlobalDictionary();
205                         RunPython ((Text*) scriptlink->scripts[index], dict);
206                         ReleaseGlobalDictionary (dict);
207                 }
208         }
209
210         return;
211 }
212
213 /*****************************************************************************/
214 /* Description:                                                              */
215 /* Notes:       Not implemented yet                                          */
216 /*****************************************************************************/
217 void BPY_free_scriptlink(struct ScriptLink *slink)
218 {
219         printf ("In BPY_free_scriptlink\n");
220         return;
221 }
222
223 /*****************************************************************************/
224 /* Description:                                                              */
225 /* Notes:       Not implemented yet                                          */
226 /*****************************************************************************/
227 void BPY_copy_scriptlink(struct ScriptLink *scriptlink)
228 {
229         printf ("In BPY_copy_scriptlink\n");
230         return;
231 }
232
233 /*****************************************************************************/
234 /* Description:                                                              */
235 /* Notes:       Not implemented yet                                          */
236 /*****************************************************************************/
237 int BPY_call_importloader(char *name)
238 {
239         printf ("In BPY_call_importloader(name=%s)\n",name);
240         return (0);
241 }
242
243 /*****************************************************************************/
244 /* Description:                                                              */
245 /* Notes:       Not implemented yet                                          */
246 /*****************************************************************************/
247 int BPY_spacetext_is_pywin(struct SpaceText *st)
248 {
249         /* No printf is done here because it is called with every mouse move */
250         return (0);
251 }
252
253 /*****************************************************************************/
254 /* Description:                                                              */
255 /* Notes:       Not implemented yet                                          */
256 /*****************************************************************************/
257 void BPY_spacetext_do_pywin_draw(struct SpaceText *st)
258 {
259         printf ("In BPY_spacetext_do_pywin_draw\n");
260         return;
261 }
262
263 /*****************************************************************************/
264 /* Description:                                                              */
265 /* Notes:       Not implemented yet                                          */
266 /*****************************************************************************/
267 void BPY_spacetext_do_pywin_event(struct SpaceText *st,
268                                   unsigned short event,
269                                   short val)
270 {
271         printf ("In BPY_spacetext_do_pywin_event(st=?, event=%d, val=%d)\n",
272                 event, val);
273         return;
274 }
275
276 /*****************************************************************************/
277 /* Private functions                                                         */
278 /*****************************************************************************/
279
280 /*****************************************************************************/
281 /* Description: This function executes the python script passed by text.     */
282 /*              The Python dictionary containing global variables needs to   */
283 /*              be passed in globaldict.                                     */
284 /*****************************************************************************/
285 PyObject * RunPython(Text *text, PyObject *globaldict)
286 {
287         PyObject * ret;
288         char     * buf;
289
290         printf("Run Python script \"%s\" ...\n", GetName(text));
291         buf = txt_to_buf(text);
292         ret = PyRun_String (buf, Py_file_input, globaldict, globaldict);
293
294         MEM_freeN (buf);
295         return ret;
296 }
297
298 /*****************************************************************************/
299 /* Description: This function returns the value of the name field of the     */
300 /*              given Text struct.                                           */
301 /*****************************************************************************/
302 char * GetName(Text *text)
303 {
304         return (text->id.name+2);
305 }
306
307 /*****************************************************************************/
308 /* Description: This function creates a new Python dictionary object.        */
309 /*****************************************************************************/
310 PyObject * CreateGlobalDictionary (void)
311 {
312         PyObject *dict = PyDict_New();
313         PyDict_SetItemString (dict, "__builtins__", PyEval_GetBuiltins());
314         PyDict_SetItemString (dict, "__name__", PyString_FromString("__main__"));
315
316         return (dict);
317 }
318
319 /*****************************************************************************/
320 /* Description: This function deletes a given Python dictionary object.      */
321 /*****************************************************************************/
322 void ReleaseGlobalDictionary (PyObject * dict)
323 {
324         PyDict_Clear (dict);
325         Py_DECREF (dict);               /* Release dictionary. */
326 }
327