summaryrefslogtreecommitdiff
path: root/renderer/support/inkscape_exporter.py
blob: db820f3e0566135f4e7674aa2660631db4aeff0d (plain)
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
#!/usr/bin/env python3

import os
import shutil
import tempfile

from pogojig.inkscape import effect, inkscape

from xvfbwrapper import Xvfb


def _unfuck_svg_document(temp_svg_path):
    """
    Unfucks an SVG document so is can be processed by the better_dxf_export
    plugin (or what's left of it).
    """
    command_line = inkscape.InkscapeCommandLine(temp_svg_path)
    layers = command_line.layers
    
    command_line.apply_to_document('LayerUnlockAll', 'LayerShowAll')
    
    layer_copies = []
    
    for i in layers:
        layer_copy = command_line.duplicate_layer(i)
        layer_copies.append(layer_copy)
        
        command_line.apply_to_layer_content(layer_copy, 'ObjectToPath')
        command_line.apply_to_layer_content(layer_copy, 'SelectionUnGroup')
        command_line.apply_to_layer_content(layer_copy, 'EditUnlinkClone')
        
        if not i.use_paths:
            command_line.apply_to_layer_content(layer_copy, 'StrokeToPath')
            command_line.apply_to_layer_content(layer_copy, 'SelectionUnion')
    
    for original, copy in zip(layers, layer_copies):
        command_line.clear_layer(original)
        command_line.move_content(copy, original)
        command_line.delete_layer(copy)
    
    command_line.apply_to_document('FileSave', 'FileClose', 'FileQuit')
    command_line.run()


if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('infile', metavar='input.svg', help='Inkscape SVG input file')
    parser.add_argument('outfile', metavar='output.dxf', help='DXF output file')
    args = parser.parse_args()

    with Xvfb():
        effect.ExportEffect.check_document_units(args.infile)

        with tempfile.TemporaryDirectory() as tmpdir:
            temp_svg_path = os.path.join(tmpdir, os.path.basename(args.infile))
            shutil.copyfile(args.infile, temp_svg_path)

            _unfuck_svg_document(temp_svg_path)

            export_effect = effect.ExportEffect()
            export_effect.affect(args=[temp_svg_path], output=False)

        with open(args.outfile, 'w') as f:
            export_effect.write_dxf(f)