forked from jespino/inkscape-export-layers
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexport_layers.py
129 lines (103 loc) · 4.55 KB
/
export_layers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#! /usr/bin/env python
import sys
sys.path.append('/usr/share/inkscape/extensions')
import contextlib
import inkex
import os
import subprocess
import tempfile
import shutil
import copy
class PNGExport(inkex.Effect):
def __init__(self):
"""init the effetc library and get options from gui"""
inkex.Effect.__init__(self)
self.OptionParser.add_option("--path", action="store", type="string", dest="path", default="~/", help="")
self.OptionParser.add_option('-f', '--filetype', action='store', type='string', dest='filetype', default='jpeg', help='Exported file type')
self.OptionParser.add_option("--crop", action="store", type="inkbool", dest="crop", default=False)
self.OptionParser.add_option("--dpi", action="store", type="float", dest="dpi", default=90.0)
def effect(self):
output_path = os.path.expanduser(self.options.path)
curfile = self.args[-1]
layers = self.get_layers(curfile)
counter = 1
for (layer_id, layer_label, layer_type) in layers:
if layer_type == "fixed":
continue
show_layer_ids = [layer[0] for layer in layers if layer[2] == "fixed" or layer[0] == layer_id]
if not os.path.exists(os.path.join(output_path)):
os.makedirs(os.path.join(output_path))
with _make_temp_directory() as tmp_dir:
layer_dest_svg_path = os.path.join(tmp_dir, "export.svg")
self.export_layers(layer_dest_svg_path, show_layer_ids)
if self.options.filetype == "jpeg":
tmp_dest_png_path = os.path.join(tmp_dir, "export.png")
self.exportToPng(layer_dest_svg_path, tmp_dest_png_path)
layer_dest_jpg_path = os.path.join(output_path, "%s_%s.jpg" % (str(counter).zfill(3), layer_label))
self.convertPngToJpg(tmp_dest_png_path, layer_dest_jpg_path)
else:
layer_dest_png_path = os.path.join(output_path, "%s_%s.png" % (str(counter).zfill(3), layer_label))
self.exportToPng(layer_dest_svg_path, layer_dest_png_path)
counter += 1
def export_layers(self, dest, show):
"""
Export selected layers of SVG to the file `dest`.
:arg str dest: path to export SVG file.
:arg list hide: layers to hide. each element is a string.
:arg list show: layers to show. each element is a string.
"""
doc = copy.deepcopy(self.document)
for layer in doc.xpath('//svg:g[@inkscape:groupmode="layer"]', namespaces=inkex.NSS):
layer.attrib['style'] = 'display:none'
id = layer.attrib["id"]
if id in show:
layer.attrib['style'] = 'display:inline'
doc.write(dest)
def get_layers(self, src):
svg_layers = self.document.xpath('//svg:g[@inkscape:groupmode="layer"]', namespaces=inkex.NSS)
layers = []
for layer in svg_layers:
label_attrib_name = "{%s}label" % layer.nsmap['inkscape']
if label_attrib_name not in layer.attrib:
continue
layer_id = layer.attrib["id"]
layer_label = layer.attrib[label_attrib_name]
if layer_label.lower().startswith("[fixed] "):
layer_type = "fixed"
layer_label = layer_label[8:]
elif layer_label.lower().startswith("[export] "):
layer_type = "export"
layer_label = layer_label[9:]
else:
continue
layers.append([layer_id, layer_label, layer_type])
return layers
def exportToPng(self, svg_path, output_path):
command = [
"inkscape",
"-D" if self.options.crop else "-C",
"-d", str(self.options.dpi),
"-e", output_path.encode("utf-8"),
svg_path.encode("utf-8")
]
p = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
p.wait()
def convertPngToJpg(self, png_path, output_path):
command = "convert \"%s\" \"%s\"" % (png_path, output_path)
p = subprocess.Popen(command.encode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.wait()
@contextlib.contextmanager
def _make_temp_directory():
temp_dir = tempfile.mkdtemp(prefix="tmp-inkscape")
try:
yield temp_dir
finally:
shutil.rmtree(temp_dir)
def _main():
e = PNGExport()
e.affect(output=False)
if __name__ == "__main__":
_main()