Add System Info function to the Help menu.
authorNathan Letwory <nathan@letworyinteractive.com>
Sat, 16 Oct 2010 17:26:40 +0000 (17:26 +0000)
committerNathan Letwory <nathan@letworyinteractive.com>
Sat, 16 Oct 2010 17:26:40 +0000 (17:26 +0000)
Users can use this to quickly get info about their system for bug reports.

release/scripts/modules/sys_info.py [new file with mode: 0644]
release/scripts/op/wm.py
release/scripts/ui/space_info.py

diff --git a/release/scripts/modules/sys_info.py b/release/scripts/modules/sys_info.py
new file mode 100644 (file)
index 0000000..b6f4291
--- /dev/null
@@ -0,0 +1,103 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# classes for extracting info from blenders internal classes
+
+import bpy
+import bgl
+
+import sys
+
+def cutPoint(text, length):
+       "Returns position of the last space found before 'length' chars"
+       l = length
+       c = text[l]
+       while c != ' ':
+               l -= 1
+               if l == 0: return length # no space found
+               c = text[l]
+       return l
+
+def textWrap(text, length = 70):
+       lines = []
+       while len(text) > 70:
+               cpt = cutPoint(text, length)
+               line, text = text[:cpt], text[cpt + 1:]
+               lines.append(line)
+       lines.append(text)
+       return lines
+
+def write_sysinfo(op):
+       output_filename = "system-info.txt"
+       warnings = 0
+       notices = 0
+
+       if output_filename in bpy.data.texts.keys():
+           output = bpy.data.texts[output_filename]
+           output.clear()
+       else:
+           output = bpy.data.texts.new(name=output_filename)
+
+       header = '= Blender {} System Information =\n'.format(bpy.app.version_string)
+       lilies = '{}\n\n'.format(len(header)*'=')
+       firstlilies = '{}\n'.format(len(header)*'=')
+       output.write(firstlilies)
+       output.write(header)
+       output.write(lilies)
+
+       # build info
+       output.write('\nBlender:\n')
+       output.write(lilies)
+       output.write('version {}, revision {}. {}\n'.format(bpy.app.version_string, bpy.app.build_revision, bpy.app.build_type))
+       output.write('build date: {}, {}\n'.format(bpy.app.build_date, bpy.app.build_time))
+       output.write('platform: {}\n'.format(bpy.app.build_platform))
+       output.write('binary path: {}\n\n'.format(bpy.app.binary_path))
+
+       # python info
+       output.write('\nPython:\n')
+       output.write(lilies)
+       output.write('version: {}\n'.format(sys.version))
+       output.write('paths:\n')
+       for p in sys.path:
+           output.write('\t{}\n'.format(p))
+
+       output.write('\nDirectories:\n')
+       output.write(lilies)
+       output.write('scripts: {}\n'.format(bpy.utils.script_paths()))
+       output.write('user scripts: {}\n'.format(bpy.utils.user_script_path()))
+       output.write('datafiles: {}\n'.format(bpy.utils.user_resource('DATAFILES')))
+       output.write('config: {}\n'.format(bpy.utils.user_resource('CONFIG')))
+       output.write('scripts : {}\n'.format(bpy.utils.user_resource('SCRIPTS')))
+       output.write('autosave: {}\n'.format(bpy.utils.user_resource('AUTOSAVE')))
+       output.write('tempdir: {}\n'.format(bpy.app.tempdir))
+
+       output.write('\nOpenGL\n')
+       output.write(lilies)
+       output.write('renderer:\t{}\n'.format(bgl.glGetString(bgl.GL_RENDERER)))
+       output.write('vendor:\t\t{}\n'.format(bgl.glGetString(bgl.GL_VENDOR)))
+       output.write('version:\t{}\n'.format(bgl.glGetString(bgl.GL_VERSION)))
+       output.write('extensions:\n')
+
+       glext = bgl.glGetString(bgl.GL_EXTENSIONS)
+       glext = textWrap(glext, 70)
+       for l in glext:
+           output.write('\t\t{}\n'.format(l))
+       
+       op.report({'INFO'}, "System information generated in 'system-info.txt'")
index 60a963804a681a86d3aa9824cdd3201c824a534e..4ce10233a9b2f7280a0569fa9566f0d155904e93 100644 (file)
@@ -779,6 +779,15 @@ class WM_OT_keyconfig_activate(bpy.types.Operator):
         bpy.utils.keyconfig_set(self.filepath)
         return {'FINISHED'}
 
+class WM_OT_sysinfo(bpy.types.Operator):
+    '''Generate System Info'''
+    bl_idname = "wm.sysinfo"
+    bl_label = "System Info"
+
+    def execute(self, context):
+        import sys_info
+        sys_info.write_sysinfo(self)
+        return {'FINISHED'}
 
 def register():
     pass
index 7b3ea18fcf9ba581e0e2e3660d3e6fdc6e962b1a..b0e8dbab0b34fa1d9b9b83bc7001ff85e95af31b 100644 (file)
@@ -345,6 +345,7 @@ class INFO_MT_help(bpy.types.Menu):
         layout.separator()
         layout.operator("wm.url_open", text="Python API Reference", icon='URL').url = "http://www.blender.org/documentation/blender_python_api_%s/contents.html" % "_".join(str(v) for v in bpy.app.version)
         layout.operator("help.operator_cheat_sheet", icon='TEXT')
+        layout.operator("wm.sysinfo", icon='TEXT')
         layout.separator()
         layout.operator("anim.update_data_paths", text="FCurve/Driver 2.54 fix", icon='HELP')
         layout.separator()