Implemented enough functionality to actually execute Python from within
[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_space_types.h>
40 #include <DNA_text_types.h>
41
42 #include <BPY_extern.h>
43
44 #include "api2_2x/interface.h"
45
46 /*
47  * Structure definitions
48  */
49 #define FILENAME_LENGTH 24
50 typedef struct _ScriptError {
51         char filename[FILENAME_LENGTH];
52         int lineno;
53 } ScriptError;
54
55 /*
56  * Global variables
57  */
58 ScriptError g_script_error;
59
60 /*
61  * Function prototypes
62  */
63 PyObject * RunPython(Text *text, PyObject *globaldict);
64 char *     GetName(Text *text);
65
66 /*
67  * Description: This function will initialise Python and all the implemented
68  *              api variations.
69  * Notes:       Currently only the api for 2.2x will be initialised.
70  */   
71 void BPY_start_python(void)
72 {
73         printf ("In BPY_start_python\n");
74 /* TODO: Shouldn't "blender" be replaced by PACKAGE ?? (config.h) */
75         Py_SetProgramName("blender");
76
77         Py_Initialize ();
78
79         initBlenderApi2_2x ();
80
81         return;
82 }
83
84 /*
85  * Description:
86  * Notes:       Not implemented yet
87  */   
88 void BPY_end_python(void)
89 {
90         printf ("In BPY_end_python\n");
91         return;
92 }
93
94 /*
95  * Description: This function will return the linenumber on which an error
96  *              has occurred in the Python script.
97  */   
98 int BPY_Err_getLinenumber(void)
99 {
100         printf ("In BPY_Err_getLinenumber\n");
101         return g_script_error.lineno;
102 }
103
104 /*
105  * Description: This function will return the filename of the python script.
106  */   
107 const char *BPY_Err_getFilename(void)
108 {
109         printf ("In BPY_Err_getFilename\n");
110         return g_script_error.filename;
111 }
112
113 /*
114  * Description: This function executes the script passed by st.
115  * Notes:       Currently, the script is compiled each time it is executed,
116  *              This should be optimized to store the compiled bytecode as has
117  *              been done by the previous implementation.
118  */   
119 struct _object *BPY_txt_do_python(struct SpaceText* st)
120 {
121         PyObject *      dict;
122         PyObject *      ret;
123         printf ("In BPY_txt_do_python\n");
124
125         if (!st->text)
126         {
127                 return NULL;
128         }
129
130         dict = PyModule_GetDict(PyImport_AddModule("__main__"));
131         /* dict = newGlobalDictionary(); */
132         ret = RunPython (st->text, dict);
133
134         return dict;
135 }
136
137 /*
138  * Description:
139  * Notes:       Not implemented yet
140  */   
141 void BPY_free_compiled_text(struct Text* text)
142 {
143         printf ("In BPY_free_compiled_text\n");
144         return;
145 }
146
147 /*
148  * Description:
149  * Notes:       Not implemented yet
150  */   
151 void BPY_clear_bad_scriptlinks(struct Text *byebye)
152 {
153         printf ("In BPY_clear_bad_scriptlinks\n");
154         return;
155 }
156
157 /*
158  * Description:
159  * Notes:       Not implemented yet
160  */   
161 void BPY_do_all_scripts(short event)
162 {
163         printf ("In BPY_do_all_scripts(event=%d)\n",event);
164         return;
165 }
166
167 /*
168  * Description:
169  * Notes:       Not implemented yet
170  */   
171 void BPY_do_pyscript(struct ID *id, short event)
172 {
173         printf ("In BPY_do_pyscript(id=?, event=%d)\n",event);
174         return;
175 }
176
177 /*
178  * Description:
179  * Notes:       Not implemented yet
180  */   
181 void BPY_free_scriptlink(struct ScriptLink *slink)
182 {
183         printf ("In BPY_free_scriptlink\n");
184         return;
185 }
186
187 /*
188  * Description:
189  * Notes:       Not implemented yet
190  */   
191 void BPY_copy_scriptlink(struct ScriptLink *scriptlink)
192 {
193         printf ("In BPY_copy_scriptlink\n");
194         return;
195 }
196
197 /*
198  * Description:
199  * Notes:       Not implemented yet
200  */   
201 int BPY_call_importloader(char *name)
202 {
203         printf ("In BPY_call_importloader(name=%s)\n",name);
204         return (0);
205 }
206
207 /*
208  * Description:
209  * Notes:       Not implemented yet
210  */   
211 int BPY_spacetext_is_pywin(struct SpaceText *st)
212 {
213         /* No printf is done here because it is called with every mouse move */
214         return (0);
215 }
216
217 /*
218  * Description:
219  * Notes:       Not implemented yet
220  */   
221 void BPY_spacetext_do_pywin_draw(struct SpaceText *st)
222 {
223         printf ("In BPY_spacetext_do_pywin_draw\n");
224         return;
225 }
226
227 /*
228  * Description:
229  * Notes:       Not implemented yet
230  */   
231 void BPY_spacetext_do_pywin_event(struct SpaceText *st,
232                                   unsigned short event,
233                                   short val)
234 {
235         printf ("In BPY_spacetext_do_pywin_event(st=?, event=%d, val=%d)\n",
236                 event, val);
237         return;
238 }
239
240 /*
241  * Private functions
242  */
243
244 /*
245  * Description: This function executes the python script passed by text.
246  *              The Python dictionary containing global variables needs to
247  *              be passed in globaldict.
248  */   
249 PyObject * RunPython(Text *text, PyObject *globaldict)
250 {
251         PyObject * ret;
252         char     * buf;
253
254         printf("Run Python script \"%s\" ...\n", GetName(text));
255         buf = txt_to_buf(text);
256         ret = PyRun_String (buf, Py_file_input, globaldict, globaldict);
257
258         MEM_freeN (buf);
259         return ret;
260 }
261
262 /*
263  * Description: This function returns the value of the name field of the
264  *              given Text struct.
265  */   
266 char * GetName(Text *text)
267 {
268         return (text->id.name+2);
269 }
270