Merged changes in the trunk up to revision 35203.
[blender.git] / source / blender / freestyle / intern / system / PythonInterpreter.h
1 //
2 //  Filename         : PythonInterpreter.h
3 //  Author(s)        : Emmanuel Turquin
4 //  Purpose          : Python Interpreter
5 //  Date of creation : 17/04/2003
6 //
7 ///////////////////////////////////////////////////////////////////////////////
8
9
10 //
11 //  Copyright (C) : Please refer to the COPYRIGHT file distributed 
12 //   with this source distribution. 
13 //
14 //  This program is free software; you can redistribute it and/or
15 //  modify it under the terms of the GNU General Public License
16 //  as published by the Free Software Foundation; either version 2
17 //  of the License, or (at your option) any later version.
18 //
19 //  This program is distributed in the hope that it will be useful,
20 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
21 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 //  GNU General Public License for more details.
23 //
24 //  You should have received a copy of the GNU General Public License
25 //  along with this program; if not, write to the Free Software
26 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
27 //
28 ///////////////////////////////////////////////////////////////////////////////
29
30 #ifndef  PYTHON_INTERPRETER_H
31 # define PYTHON_INTERPRETER_H
32
33 # include <Python.h>
34 # include <iostream>
35 # include "StringUtils.h"
36 # include "Interpreter.h"
37
38 //soc
39 extern "C" {
40 #include "MEM_guardedalloc.h"
41 #include "DNA_text_types.h"
42 #include "BKE_main.h"
43 #include "BKE_context.h"
44 #include "BKE_global.h"
45 #include "BKE_report.h"
46 #include "BKE_text.h"
47 #include "BKE_library.h"
48 #include "BPY_extern.h"
49 }
50
51 class LIB_SYSTEM_EXPORT PythonInterpreter : public Interpreter
52 {
53  public:
54
55   PythonInterpreter() {
56     _language = "Python";
57         _context = 0;
58     //Py_Initialize();
59   }
60
61   virtual ~PythonInterpreter() {
62     //Py_Finalize();
63   }
64
65   void setContext(bContext *C) {
66         _context = C;
67   }
68
69   int interpretFile(const string& filename) {
70
71         initPath();
72         
73         ReportList* reports = CTX_wm_reports(_context);
74         BKE_reports_clear(reports);
75         char *fn = const_cast<char*>(filename.c_str());
76 #if 0
77         int status = BPY_filepath_exec(_context, fn, reports);
78 #else
79         int status;
80         Text *text = add_text(fn, G.main->name);
81         if (text) {
82                 status = BPY_text_exec(_context, text, reports, false);
83                 unlink_text(G.main, text);
84                 free_libblock(&G.main->text, text);
85         } else {
86                 BKE_reportf(reports, RPT_ERROR, "Cannot open file: %s", fn);
87                 status = 0;
88         }
89 #endif
90
91         if (status != 1) {
92                 cout << "\nError executing Python script from PythonInterpreter::interpretFile" << endl;
93                 cout << "File: " << fn << endl;
94                 cout << "Errors: " << endl;
95                 BKE_reports_print(reports, RPT_ERROR);
96                 return 1;
97         }
98
99         // cleaning up
100         BKE_reports_clear(reports);
101         
102         return 0;
103   }
104
105   int interpretText(struct Text *text, const string& name) {
106
107         initPath();
108
109         ReportList* reports = CTX_wm_reports(_context);
110
111         BKE_reports_clear(reports);
112
113         if (!BPY_text_exec(_context, text, reports, false)) {
114                 cout << "\nError executing Python script from PythonInterpreter::interpretText" << endl;
115                 cout << "Name: " << name << endl;
116                 cout << "Errors: " << endl;
117                 BKE_reports_print(reports, RPT_ERROR);
118                 return 1;
119         }
120
121         BKE_reports_clear(reports);
122
123         return 0;
124   }
125
126   struct Options
127   {
128     static void setPythonPath(const string& path) {
129       _path = path;
130     }
131
132     static string getPythonPath() {
133       return _path;
134     }
135   };
136
137   void reset() {
138     Py_Finalize();
139     Py_Initialize();
140     _initialized = false;
141   }
142
143 private:
144
145   bContext* _context;
146
147   void initPath() {
148         if (_initialized)
149                 return;
150
151         vector<string> pathnames;
152         StringUtils::getPathName(_path, "", pathnames);
153         
154         struct Text *text = add_empty_text("tmp_freestyle_initpath.txt");
155         string cmd = "import sys\n";
156         txt_insert_buf(text, const_cast<char*>(cmd.c_str()));
157         
158         for (vector<string>::const_iterator it = pathnames.begin(); it != pathnames.end();++it) {
159                 if ( !it->empty() ) {
160                         cout << "Adding Python path: " << *it << endl;
161                         cmd = "sys.path.append(r\"" + *it + "\")\n";
162                         txt_insert_buf(text, const_cast<char*>(cmd.c_str()));
163                 }
164         }
165         
166         BPY_text_exec(_context, text, NULL, false);
167         
168         // cleaning up
169         unlink_text(G.main, text);
170         free_libblock(&G.main->text, text);
171         
172         //PyRun_SimpleString("from Freestyle import *");
173     _initialized = true;
174   }
175
176   static bool   _initialized;
177   static string _path;
178 };
179
180 #endif // PYTHON_INTERPRETER_H