diff --git a/system_keyboard_svg.py b/system_keyboard_svg.py new file mode 100644 index 0000000000000000000000000000000000000000..2c5e25c368e15be45f1ad3459b5f17322d93e13b --- /dev/null +++ b/system_keyboard_svg.py @@ -0,0 +1,236 @@ +# this script creates Keyboard layout images of the current keyboard configuration. +# the result will be writen to the blender default directory. + +# first implementation done by jbakker + +bl_addon_info = { + 'name': 'System: Keyboard Layout (svg)', + 'author': 'Jbakker', + 'version': '1', + 'blender': (2, 5, 3), + 'location': 'View3D > Ctrl Space', + 'description': 'save the hotkeys as a .svg file (search: Keyboard)', + 'category': 'System'} + + +import bpy + +keyboard=[ +['`', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'ZERO', 'MINUS', 'EQUAL', 'BACKSPACE'], +['TAB', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']', '\\' ], +['CAPSLOCK','A','S','D','F','G','H','J','K','L',';',"'",'ENTER'], +['SHIFT', 'Z','X','C','V','B','N','M',',','.','/','SHIFT'], +['CONTROL', 'OSKEY','ALT','SPACE','ALT','OSKEY','MENUKEY','CONTROL'] +] + +# default dimension of a single key [width, heidgh] +DEFAULT_KEY_DIMENSION=[100,100] +# alternative dimensions of specufic keys [keyname,[width, height]] +ALTERNATIVE_KEY_DIMENSIONS={ +'BACKSPACE':[250,100], +'TAB':[175,100], +'\\':[175,100], +'CAPSLOCK':[225,100], +'ENTER':[240,100], +'SHIFT':[290,100], +'CONTROL':[225,100], +'ALT':[100,100], +'OSKEY':[100,100], +'MENUKEY':[100,100], +'SPACE':[690,100], +} + + +def createKeyboard(viewtype): + """ + Creates a keyboard layout (.svg) file of the current configuration for a specific viewtype. + example of a viewtype is "VIEW_3D". + """ + for keyconfig in bpy.data.window_managers[0].keyconfigs: + map = {} + for keymap in keyconfig.keymaps: + if keymap.space_type in [viewtype]: + for key in keymap.items: + if key.map_type=='KEYBOARD': + test = 0 + pre = [] + cont= "" + if key.ctrl: + test = test + 1 + cont="C" + if key.alt: + test = test + 2 + cont=cont+"A" + if key.shift: + test = test + 4 + cont=cont+"S" + if key.oskey: + test = test + 8 + cont=cont+"O" + if len(cont)>0: + cont="["+cont+"] " + ktype = key.type + if ktype not in map.keys(): + map[ktype] = [] + map[ktype].append((test, cont+key.name)) + + filename="keyboard_"+viewtype+".svg" + print(filename) + svgfile = open(filename, "w") + svgfile.write("""<?xml version="1.0" standalone="no"?> + <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> + """) + svgfile.write("""<svg width="2000" height="800" version="1.1" xmlns="http://www.w3.org/2000/svg"> + """) + svgfile.write("""<style> + rect { + fill:rgb(192,192,192); + stroke-width:1; + stroke:rgb(0,0,0); + } + text.header { + font-size:xx-large; + } + text.key { + stroke-width:1; + stroke:rgb(0,0,0); + } + text.action { + font-size:smaller; + } + text.add0 { + font-size:smaller; + fill:rgb(0,0,0) + } + text.add1 { + font-size:smaller; + fill:rgb(255,0,0) + } + text.add2 { + font-size:smaller; + fill:rgb(0,255,0) + } + text.add3 { + font-size:smaller; + fill:rgb(128,128,0) + } + text.add4 { + font-size:smaller; + fill:rgb(0,0,255) + } + text.add5 { + font-size:smaller; + fill:rgb(128,0,128) + } + text.add6 { + font-size:smaller; + fill:rgb(0, 128, 128) + } + text.add7 { + font-size:smaller; + fill:rgb(128,128,128) + } + text.add8 { + font-size:smaller; + fill:rgb(128,128,128) + } + text.add9 { + font-size:smaller; + fill:rgb(255,128,128) + } + text.add10 { + font-size:smaller; + fill:rgb(128,255,128) + } + text.add11 { + font-size:smaller; + fill:rgb(255,255,128) + } + text.add12 { + font-size:smaller; + fill:rgb(128,128,255) + } + text.add13 { + font-size:smaller; + fill:rgb(255,128,255) + } + text.add14 { + font-size:smaller; + fill:rgb(128,255,255) + } + text.add15 { + font-size:smaller; + fill:rgb(255,255,128) + } + </style> + """) + svgfile.write("""<text class="header" x="100" y="24">keyboard layout - """+viewtype+"""</text> +""") + + x=0 + xgap=15 + ygap=15 + y=32 + for row in keyboard: + x=0 + for key in row: + width=DEFAULT_KEY_DIMENSION[0] + height=DEFAULT_KEY_DIMENSION[1] + if key in ALTERNATIVE_KEY_DIMENSIONS.keys(): + width=ALTERNATIVE_KEY_DIMENSIONS[key][0] + height=ALTERNATIVE_KEY_DIMENSIONS[key][1] + tx=16 + ty=16 + svgfile.write("""<rect x=\""""+str(x)+"""\" y=\""""+str(y)+"""\" width=\""""+str(width)+"""\" height=\""""+str(height)+"""\" rx="20" ry="20" /> + """); + svgfile.write("""<text class="key" x=\""""+str(x+tx)+"""\" y=\""""+str(y+ty)+"""\" width=\""""+str(width)+"""\" height=\""""+str(height)+"""\"> + """); + svgfile.write(key) + svgfile.write("</text>") + ty=ty+16 + tx=4 + if key in map.keys(): + for a in map[key]: + svgfile.write("""<text class="add"""+str(a[0])+"""" x=\""""+str(x+tx)+"""\" y=\""""+str(y+ty)+"""\" width=\""""+str(width)+"""\" height=\""""+str(height)+"""\"> + """); + svgfile.write(a[1]) + svgfile.write("</text>") + ty=ty+16 + x=x+width+xgap + y=y+100+ygap + svgfile.write("""</svg>""") + svgfile.flush() + svgfile.close() + +class WM_OT_Keyboardlayout(bpy.types.Operator): + """ + Windows manager operator for keyboard leyout export + """ + bl_idname = "wm.keyboardlayout" + bl_label = "Keyboard layout (SGV)" + + def poll(self, context): + """ + export of the keyboard layout should always be possible. + """ + return True + + def execute(self, context): + """ + Iterate over all viewtypes to export the keyboard layout. + """ + for vt in ['VIEW_3D', 'LOGIC_EDITOR', 'NODE_EDITOR', 'CONSOLE', 'GRAPH_EDITOR', 'PROPERTIES', 'SEQUENCE_EDITOR', 'OUTLINER', 'IMAGE_EDITOR', 'TEXT_EDITOR', 'DOPESHEET_EDITOR', 'Window']: + createKeyboard(vt) + return {'FINISHED'} + +def register(): + register = bpy.types.register + register(WM_OT_Keyboardlayout) + + +def unregister(): + unregister = bpy.types.unregister + unregister(WM_OT_Keyboardlayout) + +if __name__ == "__main__": + register()