From 14f078c8217450317b4824cb450b336ba6590011 Mon Sep 17 00:00:00 2001 From: Michael Schwarz Date: Wed, 5 Aug 2015 13:57:53 +0200 Subject: Inkscape export: Renamed module to inkscape. This module will later be used for other export types than just DXF. --- support/inkscape/__main__.py | 122 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 support/inkscape/__main__.py (limited to 'support/inkscape/__main__.py') diff --git a/support/inkscape/__main__.py b/support/inkscape/__main__.py new file mode 100644 index 0000000..3052e6f --- /dev/null +++ b/support/inkscape/__main__.py @@ -0,0 +1,122 @@ +import sys, os, xml.etree.ElementTree, shutil +from lib import util +from . import effect + + +def _export_dxf(in_path, out_path, layers): + dxf_effect = effect.ExportEffect(layers) + dxf_effect.affect(args = [in_path], output = False) + + with open(out_path, 'w') as file: + dxf_effect.write_dxf(file) + + +def _get_inkscape_layers(svg_path): + document = xml.etree.ElementTree.parse(svg_path) + + def iter_layers(): + nodes = document.findall( + '{http://www.w3.org/2000/svg}g[@{http://www.inkscape.org/namespaces/inkscape}groupmode="layer"]') + + for i in nodes: + inkscape_name = i.get('{http://www.inkscape.org/namespaces/inkscape}label').strip() + + if inkscape_name.endswith(']'): + dxf_name, args = inkscape_name[:-1].rsplit('[', 1) + + dxf_name = dxf_name.strip() + args = args.strip() + + use_paths = 'p' in args + else: + use_paths = False + dxf_name = inkscape_name + + yield effect.Layer(inkscape_name, dxf_name, use_paths = use_paths) + + return list(iter_layers()) + + +def _inkscape(svg_path, verbs): + def iter_args(): + yield os.environ['INKSCAPE'] + + for i in verbs: + yield '--verb' + yield i + + yield svg_path + + util.command(list(iter_args())) + + +def _unfuck_svg_document(temp_svg_path, layers): + """ + Unfucks an SVG document so is can be processed by the better_dxf_export plugin (or what's left of it). + """ + + def iter_inkscape_verbs(): + yield 'LayerUnlockAll' + yield 'LayerShowAll' + + # Go to the first layer. + for _ in layers: + yield 'LayerPrev' + + # Copy each layer and flatten it to a single path object. + for i in layers: + yield 'LayerDuplicate' + yield 'EditSelectAll' + yield 'ObjectToPath' + yield 'EditSelectAll' + yield 'SelectionUnGroup' + + if not i.use_paths: + yield 'EditSelectAll' + yield 'StrokeToPath' + yield 'EditSelectAll' + yield 'SelectionUnion' + + yield 'LayerNext' + + # Go to the first layer again. + for _ in range(2 * len(layers)): + yield 'LayerPrev' + + # Move the flattened shapes to the original layers. + for _ in layers: + yield 'EditSelectAll' + yield 'EditDelete' + yield 'LayerNext' + + yield 'EditSelectAll' + yield 'LayerMoveToPrev' + yield 'LayerNext' + yield 'LayerDelete' + + yield 'FileSave' + yield 'FileClose' + yield 'FileQuit' + + _inkscape(temp_svg_path, list(iter_inkscape_verbs())) + + +def main(in_path, out_path): + with util.TemporaryDirectory() as temp_dir: + temp_svg_path = os.path.join(temp_dir, 'temp.svg') + + shutil.copyfile(in_path, temp_svg_path) + + layers = _get_inkscape_layers(temp_svg_path) + _unfuck_svg_document(temp_svg_path, layers) + + _export_dxf(temp_svg_path, out_path, layers) + + +try: + main(*sys.argv[1:]) +except util.UserError as e: + print 'Error:', e + sys.exit(1) +except KeyboardInterrupt: + sys.exit(2) -- cgit