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