summaryrefslogtreecommitdiff
path: root/lib/stitch_plan
diff options
context:
space:
mode:
authorKaalleen <36401965+kaalleen@users.noreply.github.com>2021-10-09 18:25:29 +0200
committerGitHub <noreply@github.com>2021-10-09 18:25:29 +0200
commit5a1ad7e4e8bebb31a679674ed8b4ca526138695c (patch)
tree254f906a6524abd3cb9a685975e563f09790bbaa /lib/stitch_plan
parent0224794a0815f22a719d2880e175077b77214513 (diff)
Letters to font extension (#1312)
Diffstat (limited to 'lib/stitch_plan')
-rw-r--r--lib/stitch_plan/__init__.py7
-rw-r--r--lib/stitch_plan/generate_stitch_plan.py74
2 files changed, 78 insertions, 3 deletions
diff --git a/lib/stitch_plan/__init__.py b/lib/stitch_plan/__init__.py
index d4b43ace..9764e66a 100644
--- a/lib/stitch_plan/__init__.py
+++ b/lib/stitch_plan/__init__.py
@@ -3,8 +3,9 @@
# Copyright (c) 2010 Authors
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
-from .stitch_plan import stitch_groups_to_stitch_plan, StitchPlan
from .color_block import ColorBlock
-from .stitch_group import StitchGroup
-from .stitch import Stitch
+from .generate_stitch_plan import generate_stitch_plan
from .read_file import stitch_plan_from_file
+from .stitch import Stitch
+from .stitch_group import StitchGroup
+from .stitch_plan import StitchPlan, stitch_groups_to_stitch_plan
diff --git a/lib/stitch_plan/generate_stitch_plan.py b/lib/stitch_plan/generate_stitch_plan.py
new file mode 100644
index 00000000..2d8ceeff
--- /dev/null
+++ b/lib/stitch_plan/generate_stitch_plan.py
@@ -0,0 +1,74 @@
+# Authors: see git history
+#
+# Copyright (c) 2010 Authors
+# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
+
+import os
+import sys
+
+import inkex
+
+import pyembroidery
+
+from ..i18n import _
+from ..svg import PIXELS_PER_MM, render_stitch_plan
+from ..svg.tags import INKSCAPE_LABEL
+from .stitch import Stitch
+from .stitch_plan import StitchPlan
+
+
+def generate_stitch_plan(embroidery_file, import_commands=True): # noqa: C901
+ validate_file_path(embroidery_file)
+ pattern = pyembroidery.read(embroidery_file)
+ stitch_plan = StitchPlan()
+ color_block = None
+
+ for raw_stitches, thread in pattern.get_as_colorblocks():
+ color_block = stitch_plan.new_color_block(thread)
+ for x, y, command in raw_stitches:
+ if command == pyembroidery.STITCH:
+ color_block.add_stitch(Stitch(x * PIXELS_PER_MM / 10.0, y * PIXELS_PER_MM / 10.0))
+ if len(color_block) > 0:
+ if not import_commands and command in [pyembroidery.TRIM, pyembroidery.STOP]:
+ # Importing commands is not wanted:
+ # start a new color block without inserting the command
+ color_block = stitch_plan.new_color_block(thread)
+ elif command == pyembroidery.TRIM:
+ color_block.add_stitch(trim=True)
+ elif command == pyembroidery.STOP:
+ color_block.add_stitch(stop=True)
+ color_block = stitch_plan.new_color_block(thread)
+
+ stitch_plan.delete_empty_color_blocks()
+
+ if stitch_plan.last_color_block:
+ if stitch_plan.last_color_block.last_stitch:
+ if stitch_plan.last_color_block.last_stitch.stop:
+ # ending with a STOP command is redundant, so remove it
+ del stitch_plan.last_color_block[-1]
+
+ extents = stitch_plan.extents
+ svg = inkex.SvgDocumentElement("svg", nsmap=inkex.NSS, attrib={
+ "width": str(extents[0] * 2),
+ "height": str(extents[1] * 2),
+ "viewBox": "0 0 %s %s" % (extents[0] * 2, extents[1] * 2),
+ })
+ render_stitch_plan(svg, stitch_plan)
+
+ # rename the Stitch Plan layer so that it doesn't get overwritten by Embroider
+ layer = svg.find(".//*[@id='__inkstitch_stitch_plan__']")
+ layer.set(INKSCAPE_LABEL, os.path.basename(embroidery_file))
+ layer.attrib.pop('id')
+
+ # Shift the design so that its origin is at the center of the canvas
+ # Note: this is NOT the same as centering the design in the canvas!
+ layer.set('transform', 'translate(%s,%s)' % (extents[0], extents[1]))
+
+ return svg
+
+
+def validate_file_path(path):
+ # Check if the file exists
+ if not os.path.isfile(path):
+ inkex.errormsg(_('File does not exist and cannot be opened. Please correct the file path and try again.\r%s') % path)
+ sys.exit(1)