add the keyboard layout to contrib/py/scripts/addons/system_keyboard_svg.py
[blender-addons-contrib.git] / system_keyboard_svg.py
1 # this script creates Keyboard layout images of the current keyboard configuration.
2 # the result will be writen to the blender default directory.
3
4 # first implementation done by jbakker
5
6 bl_addon_info = {
7     'name': 'System: Keyboard Layout (svg)',
8     'author': 'Jbakker',
9     'version': '1',
10     'blender': (2, 5, 3),
11     'location': 'View3D > Ctrl Space',
12     'description': 'save the hotkeys as a .svg file (search: Keyboard)',
13     'category': 'System'}
14
15
16 import bpy
17
18 keyboard=[
19 ['`', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'ZERO', 'MINUS', 'EQUAL', 'BACKSPACE'],
20 ['TAB', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']', '\\' ],
21 ['CAPSLOCK','A','S','D','F','G','H','J','K','L',';',"'",'ENTER'],
22 ['SHIFT', 'Z','X','C','V','B','N','M',',','.','/','SHIFT'],
23 ['CONTROL', 'OSKEY','ALT','SPACE','ALT','OSKEY','MENUKEY','CONTROL']
24 ]
25
26 # default dimension of a single key [width, heidgh]
27 DEFAULT_KEY_DIMENSION=[100,100]
28 # alternative dimensions of specufic keys [keyname,[width, height]]
29 ALTERNATIVE_KEY_DIMENSIONS={
30 'BACKSPACE':[250,100],
31 'TAB':[175,100],
32 '\\':[175,100],
33 'CAPSLOCK':[225,100],
34 'ENTER':[240,100],
35 'SHIFT':[290,100],
36 'CONTROL':[225,100],
37 'ALT':[100,100],
38 'OSKEY':[100,100],
39 'MENUKEY':[100,100],
40 'SPACE':[690,100],
41 }
42
43
44 def createKeyboard(viewtype):
45     """
46     Creates a keyboard layout (.svg) file of the current configuration for a specific viewtype.
47     example of a viewtype is "VIEW_3D".
48     """
49     for keyconfig in bpy.data.window_managers[0].keyconfigs:
50         map = {}
51         for keymap in keyconfig.keymaps:
52             if keymap.space_type in [viewtype]:
53                 for key in keymap.items:
54                     if key.map_type=='KEYBOARD':
55                         test = 0
56                         pre = []
57                         cont= ""
58                         if key.ctrl:
59                             test = test + 1
60                             cont="C"    
61                         if key.alt:
62                             test = test + 2
63                             cont=cont+"A"
64                         if key.shift:
65                             test = test + 4
66                             cont=cont+"S"
67                         if key.oskey:
68                             test = test + 8
69                             cont=cont+"O"
70                         if len(cont)>0:
71                             cont="["+cont+"] "
72                         ktype = key.type
73                         if ktype not in map.keys():
74                             map[ktype] = []
75                         map[ktype].append((test, cont+key.name))
76         
77         filename="keyboard_"+viewtype+".svg"
78         print(filename)
79         svgfile = open(filename, "w")
80         svgfile.write("""<?xml version="1.0" standalone="no"?>
81     <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
82     """)
83         svgfile.write("""<svg width="2000" height="800" version="1.1" xmlns="http://www.w3.org/2000/svg">
84     """)
85         svgfile.write("""<style>
86     rect {
87         fill:rgb(192,192,192);
88         stroke-width:1;
89         stroke:rgb(0,0,0);
90     }
91     text.header {
92         font-size:xx-large;
93     }
94     text.key {
95         stroke-width:1;
96         stroke:rgb(0,0,0);
97     }
98     text.action {
99         font-size:smaller;
100     }
101     text.add0 {
102         font-size:smaller;
103         fill:rgb(0,0,0)
104     }
105     text.add1 {
106         font-size:smaller;
107         fill:rgb(255,0,0)
108     }
109     text.add2 {
110         font-size:smaller;
111         fill:rgb(0,255,0)
112     }
113     text.add3 {
114        font-size:smaller;
115        fill:rgb(128,128,0)
116     }
117     text.add4 {
118         font-size:smaller;
119         fill:rgb(0,0,255)
120     }
121     text.add5 {
122         font-size:smaller;
123         fill:rgb(128,0,128)
124     }
125     text.add6 {
126         font-size:smaller;
127         fill:rgb(0, 128, 128)
128     }
129     text.add7 {
130         font-size:smaller;
131         fill:rgb(128,128,128)
132     }
133     text.add8 {
134         font-size:smaller;
135         fill:rgb(128,128,128)
136     }
137     text.add9 {
138         font-size:smaller;
139         fill:rgb(255,128,128)
140     }
141     text.add10 {
142         font-size:smaller;
143         fill:rgb(128,255,128)
144     }
145     text.add11 {
146         font-size:smaller;
147         fill:rgb(255,255,128)
148     }
149     text.add12 {
150         font-size:smaller;
151         fill:rgb(128,128,255)
152     }
153     text.add13 {
154         font-size:smaller;
155         fill:rgb(255,128,255)
156     }
157     text.add14 {
158         font-size:smaller;
159         fill:rgb(128,255,255)
160     }
161     text.add15 {
162         font-size:smaller;
163         fill:rgb(255,255,128)
164     }
165     </style>
166     """)
167         svgfile.write("""<text class="header" x="100" y="24">keyboard layout - """+viewtype+"""</text>
168 """)
169     
170         x=0
171         xgap=15
172         ygap=15
173         y=32
174         for row in keyboard:
175             x=0
176             for key in row:
177                 width=DEFAULT_KEY_DIMENSION[0]
178                 height=DEFAULT_KEY_DIMENSION[1]
179                 if key in ALTERNATIVE_KEY_DIMENSIONS.keys():
180                     width=ALTERNATIVE_KEY_DIMENSIONS[key][0]
181                     height=ALTERNATIVE_KEY_DIMENSIONS[key][1]
182                 tx=16
183                 ty=16
184                 svgfile.write("""<rect x=\""""+str(x)+"""\" y=\""""+str(y)+"""\" width=\""""+str(width)+"""\" height=\""""+str(height)+"""\" rx="20" ry="20" />
185     """);
186                 svgfile.write("""<text class="key" x=\""""+str(x+tx)+"""\" y=\""""+str(y+ty)+"""\" width=\""""+str(width)+"""\" height=\""""+str(height)+"""\">
187     """);
188                 svgfile.write(key)
189                 svgfile.write("</text>")
190                 ty=ty+16
191                 tx=4
192                 if key in map.keys():
193                     for a in map[key]:
194                         svgfile.write("""<text class="add"""+str(a[0])+"""" x=\""""+str(x+tx)+"""\" y=\""""+str(y+ty)+"""\" width=\""""+str(width)+"""\" height=\""""+str(height)+"""\">
195     """);
196                         svgfile.write(a[1])
197                         svgfile.write("</text>")
198                         ty=ty+16
199                 x=x+width+xgap
200             y=y+100+ygap
201         svgfile.write("""</svg>""")
202         svgfile.flush()
203         svgfile.close()
204
205 class WM_OT_Keyboardlayout(bpy.types.Operator):
206     """
207         Windows manager operator for keyboard leyout export
208     """
209     bl_idname = "wm.keyboardlayout"
210     bl_label = "Keyboard layout (SGV)"
211
212     def poll(self, context):
213         """
214         export of the keyboard layout should always be possible.
215         """
216         return True
217
218     def execute(self, context):
219         """
220         Iterate over all viewtypes to export the keyboard layout.
221         """
222         for vt in ['VIEW_3D', 'LOGIC_EDITOR', 'NODE_EDITOR', 'CONSOLE', 'GRAPH_EDITOR', 'PROPERTIES', 'SEQUENCE_EDITOR', 'OUTLINER', 'IMAGE_EDITOR', 'TEXT_EDITOR', 'DOPESHEET_EDITOR', 'Window']:
223             createKeyboard(vt)
224         return {'FINISHED'}
225
226 def register():
227     register = bpy.types.register
228     register(WM_OT_Keyboardlayout)
229
230
231 def unregister():
232     unregister = bpy.types.unregister
233     unregister(WM_OT_Keyboardlayout)
234
235 if __name__ == "__main__":
236     register()