Integrated Freestyle to rendering pipeline
[blender.git] / release / scripts / sysinfo.py
1 #!BPY
2
3 """
4 Name: 'System Information...'
5 Blender: 236
6 Group: 'HelpSystem'
7 Tooltip: 'Information about your Blender environment, useful to diagnose problems.'
8 """
9
10 __author__ = "Willian P. Germano"
11 __url__ = ("blenderartists.org", "blenderartists.org")
12 __version__ = "1.1"
13 __bpydoc__ = """\
14 This script creates a text in Blender's Text Editor with information
15 about your OS, video card, OpenGL driver, Blender and Python versions,
16 script related paths and more.
17
18 If you are experiencing trouble running Blender itself or any Blender Python
19 script, this information can be useful to fix any problems or at least for
20 online searches (like checking if there are known issues related to your
21 video card) or to get help from other users or the program's developers.
22 """
23
24 # $Id$
25 #
26 # --------------------------------------------------------------------------
27 # sysinfo.py version 1.1 Mar 20, 2005
28 # --------------------------------------------------------------------------
29 # ***** BEGIN GPL LICENSE BLOCK *****
30 #
31 # Copyright (C) 2004: Willian P. Germano, wgermano _at_ ig.com.br
32 #
33 # This program is free software; you can redistribute it and/or
34 # modify it under the terms of the GNU General Public License
35 # as published by the Free Software Foundation; either version 2
36 # of the License, or (at your option) any later version.
37 #
38 # This program is distributed in the hope that it will be useful,
39 # but WITHOUT ANY WARRANTY; without even the implied warranty of
40 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
41 # GNU General Public License for more details.
42 #
43 # You should have received a copy of the GNU General Public License
44 # along with this program; if not, write to the Free Software Foundation,
45 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
46 #
47 # ***** END GPL LICENCE BLOCK *****
48 # --------------------------------------------------------------------------
49
50 import Blender
51 import Blender.sys as bsys
52 from Blender.BGL import *
53 import sys
54
55 Blender.Window.WaitCursor(1)
56 # has_textwrap = 1 # see commented code below
57 output_filename = "system-info.txt"
58 warnings = 0
59 notices = 0 # non critical warnings
60
61 def cutPoint(text, length):
62         "Returns position of the last space found before 'length' chars"
63         l = length
64         c = text[l]
65         while c != ' ':
66                 l -= 1
67                 if l == 0: return length # no space found
68                 c = text[l]
69         return l
70
71 def textWrap(text, length = 70):
72         lines = []
73         while len(text) > 70:
74                 cpt = cutPoint(text, length)
75                 line, text = text[:cpt], text[cpt + 1:]
76                 lines.append(line)
77         lines.append(text)
78         return lines
79
80 ## Better use our own text wrap functions here
81 #try:
82 #  import textwrap
83 #except:
84 #  has_textwrap = 0
85 #  msg = sys.exc_info()[1].__str__().split()[3]
86 #  Blender.Draw.PupMenu("Python error:|This script requires the %s module" %msg)
87
88 version = Blender.Get('version') / 100.0
89 header = "=  Blender %s System Information  =" % version
90 lilies = len(header)*"="+"\n"
91 header = lilies + header + "\n" + lilies
92
93 output = Blender.Text.New(output_filename)
94
95 output.write(header + "\n\n")
96
97 output.write("%s\n\n" % Blender.Get('buildinfo'))
98
99 output.write("Platform: %s\n========\n\n" % sys.platform)
100
101 output.write("Python:\n======\n\n")
102 output.write("- Version: %s\n\n" % sys.version)
103 output.write("- Paths:\n\n")
104 for p in sys.path:
105         output.write(p + '\n')
106
107 output.write("\n- Directories:")
108
109 dirlist = [
110         ['homedir', 'Blender home dir', 1],
111         ['scriptsdir', 'Default dir for scripts', 1],
112         ['datadir', 'Default "bpydata/" data dir for scripts', 1],
113         ['uscriptsdir', 'User defined dir for scripts', 0],
114         ['udatadir', 'Data dir "bpydata/" inside user defined dir', 0]
115 ]
116
117 has_dir = {}
118
119 for dir in dirlist:
120         dirname, dirstr, is_critical = dir
121         dirpath = Blender.Get(dirname)
122         output.write("\n\n %s:\n" % dirstr)
123         if not dirpath:
124                 has_dir[dirname] = False
125                 if is_critical:
126                         warnings += 1
127                         output.write("  <WARNING> -- not found")
128                 else:
129                         notices += 1
130                         output.write("  <NOTICE> -- not found")
131         else:
132                 output.write("  %s" % dirpath)
133                 has_dir[dirname] = True
134
135 if not has_dir['homedir']:
136         outmsg = """
137
138 <WARNING> - Blender home dir not found!
139   This should probably be "<path>/.blender/"
140   where <path> is usually the user's home dir.
141
142   Blender's home dir is where entries like:
143     folders scripts/, plugins/ and locale/ and
144     files .Blanguages and .bfont.ttf
145   are located.
146
147   It's also where Blender stores the Bpymenus file
148   with information about registered scripts, so it
149   only needs to scan scripts dir(s) when they are
150   modified.
151 """
152         output.write(outmsg)
153
154 has_uconfdir = False
155 if has_dir['udatadir']:
156         uconfigdir = bsys.join(Blender.Get('udatadir'), 'config')
157         output.write("\n\n User defined config data dir:")
158         if bsys.exists(uconfigdir):
159                 has_uconfdir = True
160                 output.write("  %s" % uconfigdir)
161         else:
162                 notices += 1
163                 output.write("""
164   <NOTICE> -- not found.
165   bpydata/config/ should be inside the user defined scripts dir.
166   It's used by Blender to store scripts configuration data.
167   (Since it is on the user defined dir, a new Blender installation
168   won't overwrite the data.)
169 """)
170
171 configdir = bsys.join(Blender.Get('datadir'), 'config')
172 output.write('\n\n Default config data "bpydata/config/" dir:\n')
173 if bsys.exists(configdir):
174         output.write("  %s" % configdir)
175 else:
176         warnings += 1
177         output.write("""<WARNING> -- not found.
178   config/ should be inside the default scripts *data dir*.
179   It's used by Blender to store scripts configuration data
180   when <user defined scripts dir>/bpydata/config/ dir is
181   not available.
182 """)
183
184 if has_uconfdir:
185         output.write("""
186
187 The user defined config dir will be used.
188 """)
189
190 cvsdir = 'release/scripts'
191 if bsys.dirsep == '\\': cvsdir = cvsdir.replace('/','\\')
192 sdir = Blender.Get('scriptsdir')
193 if sdir and sdir.find(cvsdir) >= 0:
194         if has_uconfdir:
195                 notices += 1
196                 output.write("\n\n<NOTICE>:\n")
197         else:
198                 warnings += 1
199                 output.write("\n\n<WARNING>:\n")
200         output.write("""
201 It seems this Blender binary is located in its cvs source tree.
202
203 It's recommended that the release/scripts/ dir tree is copied
204 to your blender home dir.
205 """)
206         if not has_uconfdir:
207                 output.write("""
208 Since you also don't have a user defined scripts dir with the
209 bpydata/config dir inside it, it will not be possible to save
210 and restore scripts configuration data files, since writing
211 to a dir inside a cvs tree is not a good idea and is avoided. 
212 """)
213
214 missing_mods = [] # missing basic modules
215
216 try:
217         from BPyBlender import basic_modules
218         for m in basic_modules:
219                 try: exec ("import %s" % m)
220                 except: missing_mods.append(m)
221
222         if missing_mods:
223                 outmsg = """
224
225 <WARNING>:
226
227 Some expected modules were not found.
228 Because of that some scripts bundled with Blender may not work.
229 Please read the FAQ in the Readme.html file shipped with Blender
230 for information about how to fix the problem.
231 Missing modules:
232 """
233                 output.write(outmsg)
234                 warnings += 1
235                 for m in missing_mods:
236                         output.write('-> ' + m + '\n')
237                 if 'BPyRegistry' in missing_mods:
238                         output.write("""
239 Module BPyRegistry.py is missing!
240 Without this module it's not possible to save and restore
241 scripts configuration data files.
242 """)
243
244         else:
245                 output.write("\n\n- Modules: all basic ones were found.\n")
246
247 except ImportError:
248         output.write("\n\n<WARNING>:\n  Couldn't find BPyBlender.py in scripts/bpymodules/ dir.")
249         output.write("\n  Basic modules availability won't be tested.\n")
250         warnings += 1
251
252 output.write("\nOpenGL:\n======\n\n")
253 output.write("- Renderer:   %s\n" % glGetString(GL_RENDERER))
254 output.write("- Vendor:     %s\n" % glGetString(GL_VENDOR))
255 output.write("- Version:    %s\n\n" % glGetString(GL_VERSION))
256 output.write("- Extensions:\n\n")
257
258 glext = glGetString(GL_EXTENSIONS)
259 glext = textWrap(glext, 70)
260
261 for l in glext:
262         output.write(l + "\n")
263
264 output.write("\n\n- Simplistic almost useless benchmark:\n\n")
265 t = Blender.sys.time()
266 nredraws = 10
267 for i in range(nredraws):
268         Blender.Redraw(-1) # redraw all windows
269 result = Blender.sys.time() - t
270 output.write("Redrawing all areas %s times took %.4f seconds.\n" % (nredraws, result))
271
272 if warnings or notices:
273         output.write("\n%s%s\n" % (warnings*"#", notices*"."))
274         if warnings:
275                 output.write("\n(*) Found %d warning" % warnings)
276                 if (warnings > 1): output.write("s") # (blush)
277                 output.write(", documented in the text above.\n")
278         if notices:
279                 output.write("\n(*) Found %d notice" % notices)
280                 if (notices > 1): output.write("s") # (blush)
281                 output.write(", documented in the text above.\n")
282
283 else: output.write("\n==\nNo problems were found (scroll up for details).")
284
285 Blender.Window.WaitCursor(0)
286 exitmsg = "Done!|Please check the text %s in the Text Editor window" % output.name
287 Blender.Draw.PupMenu(exitmsg)