Initial import
[experiments/svgwrite_inkscape_drawing.git] / svgwrite_inkscape_drawing.py
1 #!/usr/bin/env python
2 #coding:utf-8
3 # Author:  ao2
4 # Purpose: create Inkscape layers with svgwrite
5 # Created: 26.01.2018
6 # License: MIT License
7 # Copyright (C) 2018  Antonio Ospite <ao2@ao2.it>
8
9 import svgwrite
10 from svgwrite.data.types import SVGAttribute
11
12
13 class InkscapeDrawing(svgwrite.Drawing):
14     """An svgwrite.Drawing subclass which supports Inkscape layers"""
15     def __init__(self, *args, **kwargs):
16         super(InkscapeDrawing, self).__init__(*args, **kwargs)
17
18         inkscape_attributes = {
19             'xmlns:inkscape': SVGAttribute('xmlns:inkscape',
20                                            anim=False,
21                                            types=[],
22                                            const=frozenset(['http://www.inkscape.org/namespaces/inkscape'])),
23             'inkscape:groupmode': SVGAttribute('inkscape:groupmode',
24                                                anim=False,
25                                                types=[],
26                                                const=frozenset(['layer'])),
27             'inkscape:label': SVGAttribute('inkscape:label',
28                                            anim=False,
29                                            types=frozenset(['string']),
30                                            const=[])
31         }
32
33         self.validator.attributes.update(inkscape_attributes)
34
35         elements = self.validator.elements
36
37         svg_attributes = set(elements['svg'].valid_attributes)
38         svg_attributes.add('xmlns:inkscape')
39         elements['svg'].valid_attributes = frozenset(svg_attributes)
40
41         g_attributes = set(elements['g'].valid_attributes)
42         g_attributes.add('inkscape:groupmode')
43         g_attributes.add('inkscape:label')
44         elements['g'].valid_attributes = frozenset(g_attributes)
45
46         self['xmlns:inkscape'] = 'http://www.inkscape.org/namespaces/inkscape'
47
48     def layer(self, **kwargs):
49         """Create an inkscape layer.
50
51         An optional 'label' keyword argument can be passed to set a user
52         friendly name for the layer."""
53         label = kwargs.pop('label', None)
54
55         new_layer = self.g(**kwargs)
56         new_layer['inkscape:groupmode'] = 'layer'
57
58         if label:
59             new_layer['inkscape:label'] = label
60
61         return new_layer
62
63
64 def main():
65     svg = InkscapeDrawing('inkscape-test.svg', profile='full', size=(640, 480))
66
67     layer = svg.layer(label="Layer one")
68     svg.add(layer)
69
70     line = svg.line((100, 100), (300, 100),
71                     stroke=svgwrite.rgb(10, 10, 16, '%'),
72                     stroke_width='10')
73     layer.add(line)
74
75     text = svg.text('Test', insert=(100, 100), font_size='100', fill='red')
76     layer.add(text)
77
78     svg.save()
79
80
81 if __name__ == "__main__":
82     main()