scripts/generate_shields.py

Mon, 14 Sep 2020 22:55:45 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Mon, 14 Sep 2020 22:55:45 +0300
changeset 0
b0eb3af2f9ee
permissions
-rwxr-xr-x

restore .hg...

0
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 #!/usr/bin/env python3
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
2
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
3 # Generate highway shields as SVG files in symbols/shields.
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
4
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
5 from __future__ import print_function
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
6 import copy, lxml.etree, math, os
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
7
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
8
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
9 def main():
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
10 namespace = 'http://www.w3.org/2000/svg'
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11 svgns = '{' + namespace + '}'
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
12 svgnsmap = {None: namespace}
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
13
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
14 config = {}
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
15 config['base'] = {}
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
16
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
17 # font_height and font_width are determined by trial and error
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
18 config['base']['rounded_corners'] = 2
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
19 config['base']['font_height'] = 11
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
20 config['base']['font_width'] = 0.85
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
21 config['base']['padding_x'] = 8
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
22 config['base']['padding_y'] = 2
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
23 config['base']['stroke_width'] = 1
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
24
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
25 # Fall back colours used if no colours are defined in road-colours.yaml for a road type.
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
26 config['base']['fill'] = '#f1f1f1'
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
27 config['base']['stroke_fill'] = '#c6c6c6'
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
28
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
29 config['global'] = {}
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
30
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
31 config['global']['types'] = ['valtatie', 'kantatie', 'seututie', 'yhdystie', 'eurooppatie']
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
32 config['global']['max_width'] = 48
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
33 config['global']['output_dir'] = '../symbols/shields/' # specified relative to the script location
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
34
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
35 config['valtatie'] = {'fill': '#ff163c', 'stroke_fill': 'white'}
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
36 config['kantatie'] = {'fill': '#ffd90f', 'stroke_fill': 'black', 'stroke_width': 0.5}
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
37 config['seututie'] = {'fill': 'white', 'stroke_fill': 'black', 'stroke_width': 0.5}
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
38 config['yhdystie'] = {'fill': '#005eb7', 'stroke_fill': 'white'}
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
39 config['eurooppatie'] = {'fill': '#00997c', 'stroke_fill': 'white'}
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
40
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
41 if not os.path.exists(os.path.dirname(config['global']['output_dir'])):
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
42 os.makedirs(os.path.dirname(config['global']['output_dir']))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
43
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
44 height = 1
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
45 shield_size = 'base'
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
46
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
47 dirpath = os.path.join(os.path.dirname(__file__), config['global']['output_dir'])
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
48 try:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
49 os.makedirs(dirpath)
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
50 except FileExistsError:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
51 pass
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
52
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
53 for width in range(1, config['global']['max_width'] + 1):
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
54 for shield_type in config['global']['types']:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
55
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
56 # merge base config and specific styles
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
57 vars = copy.deepcopy(config['base'])
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
58 if shield_type in config:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
59 for option in config[shield_type]:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
60 vars[option] = config[shield_type][option]
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
61
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
62 shield_width = 2 * vars['padding_x'] + math.ceil(vars['font_width'] * width)
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
63 shield_height = 2 * vars['padding_y'] + math.ceil(vars['font_height'] * height)
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
64
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
65 svg = lxml.etree.Element('svg', nsmap=svgnsmap)
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
66 svg.set('width', '100%')
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
67 svg.set('height', '100%')
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
68 svg.set('viewBox', '0 0 ' + str(shield_width + vars['stroke_width']) + ' ' + str(shield_height + vars['stroke_width']))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
69
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
70 if vars['stroke_width'] > 0:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
71 offset_x = vars['stroke_width'] / 2.0
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
72 offset_y = vars['stroke_width'] / 2.0
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
73 else:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
74 offset_x = 0
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
75 offset_y = 0
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
76
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
77 background = lxml.etree.Element(svgns + 'rect')
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
78 background.set('x', str(offset_x))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
79 background.set('y', str(offset_y))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
80 background.set('width', str(shield_width))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
81 background.set('height', str(shield_height))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
82 background.set('id', 'shield-background')
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
83 background.set('style', 'fill:' + vars['fill'])
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
84 svg.append(background)
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
85
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
86 shield = lxml.etree.Element(svgns + 'rect')
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
87 shield.set('x', str(offset_x + 0.5))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
88 shield.set('y', str(offset_y + 0.5))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
89 shield.set('width', str(shield_width - 1))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
90 shield.set('height', str(shield_height - 1))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
91 if vars['rounded_corners'] > 0:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
92 shield.set('rx', str(vars['rounded_corners']))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
93 shield.set('ry', str(vars['rounded_corners']))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
94 shield.set('id', 'shield')
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
95
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
96 stroke = ''
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
97 if vars['stroke_width'] > 0:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
98 stroke = 'stroke:' + vars['stroke_fill'] + ';stroke-width:' + str(vars['stroke_width']) + ';'
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
99
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
100 shield.set('style', 'fill:' + vars['fill'] + ';' + stroke)
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
101
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
102 svg.append(shield)
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
103
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
104 filename = shield_type + '_' + str(width) + 'x' + str(height)
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
105 if shield_size != 'base':
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
106 filename = filename + '_' + shield_size
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
107
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
108 filename = filename + '.svg'
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
109
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
110 # save file
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
111 try:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
112 shieldpath = os.path.join(os.path.dirname(__file__), config['global']['output_dir'] + filename)
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
113 print('Writing', os.path.realpath(shieldpath))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
114 shieldfile = open(shieldpath, 'wb')
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
115 shieldfile.write(lxml.etree.tostring(svg, encoding='utf-8', xml_declaration=True, pretty_print=True))
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
116 shieldfile.close()
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
117 except IOError:
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
118 print('Could not save file ' + filename + '.')
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
119 continue
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
120
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
121 if __name__ == "__main__":
b0eb3af2f9ee restore .hg...
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
122 main()

mercurial