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