summaryrefslogtreecommitdiff
path: root/lib/extensions/png_simple.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/extensions/png_simple.py')
-rw-r--r--lib/extensions/png_simple.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/extensions/png_simple.py b/lib/extensions/png_simple.py
new file mode 100644
index 00000000..7902b43b
--- /dev/null
+++ b/lib/extensions/png_simple.py
@@ -0,0 +1,72 @@
+# Authors: see git history
+#
+# Copyright (c) 2024 Authors
+# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
+
+import sys
+from tempfile import TemporaryDirectory
+
+from inkex.units import convert_unit
+
+from ..stitch_plan import stitch_groups_to_stitch_plan
+from ..svg import render_stitch_plan
+from ..threads import ThreadCatalog
+from ..utils.svg_data import get_pagecolor
+from .base import InkstitchExtension
+from .utils.inkex_command import inkscape
+
+
+class PngSimple(InkstitchExtension):
+ def __init__(self, *args, **kwargs):
+ InkstitchExtension.__init__(self)
+
+ self.arg_parser.add_argument('--notebook', type=str, default='')
+ self.arg_parser.add_argument('--line_width', type=str, default='', dest='line_width')
+
+ def effect(self):
+ if not self.get_elements():
+ return
+
+ self.metadata = self.get_inkstitch_metadata()
+ collapse_len = self.metadata['collapse_len_mm']
+ min_stitch_len = self.metadata['min_stitch_len_mm']
+ stitch_groups = self.elements_to_stitch_groups(self.elements)
+ stitch_plan = stitch_groups_to_stitch_plan(stitch_groups, collapse_len=collapse_len, min_stitch_len=min_stitch_len)
+ ThreadCatalog().match_and_apply_palette(stitch_plan, self.get_inkstitch_metadata()['thread-palette'])
+
+ line_width = convert_unit(f"{self.options.line_width}mm", self.svg.document_unit)
+ layer = render_stitch_plan(self.svg, stitch_plan, False, visual_commands=False,
+ render_jumps=False, line_width=line_width)
+
+ write_png_output(self.svg, layer)
+
+ # don't let inkex output the SVG!
+ sys.exit(0)
+
+
+def write_png_output(svg, layer):
+ with TemporaryDirectory() as tempdir:
+ # Inkex's command functionality also writes files to temp directories like this.
+ temp_svg_path = f"{tempdir}/temp.svg"
+ temp_png_path = f"{tempdir}/temp.png"
+ with open(temp_svg_path, "wb") as f:
+ f.write(svg.tostring())
+
+ generate_png(svg, layer, temp_svg_path, temp_png_path)
+
+ # inkscape will read the file contents from stdout and copy
+ # to the destination file that the user chose
+ with open(temp_png_path, 'rb') as output_file:
+ sys.stdout.buffer.write(output_file.read())
+
+
+def generate_png(svg, layer, input_path, output_path):
+ inkscape(input_path, actions="; ".join([
+ f"export-id:{layer.get_id()}",
+ "export-id-only",
+ "export-type:png",
+ f"export-dpi:{96*8}",
+ f"export-filename:{output_path}",
+ f"export-background:{get_pagecolor(svg.namedview)}",
+ "export-do" # Inkscape docs say this should be implicit at the end, but it doesn't seem to be.
+ ]))