summaryrefslogtreecommitdiff
path: root/lib/extensions/tartan.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/extensions/tartan.py')
-rw-r--r--lib/extensions/tartan.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/extensions/tartan.py b/lib/extensions/tartan.py
new file mode 100644
index 00000000..a9b34dfb
--- /dev/null
+++ b/lib/extensions/tartan.py
@@ -0,0 +1,78 @@
+# Authors: see git history
+#
+# Copyright (c) 2023 Authors
+# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
+
+import sys
+
+import wx
+import wx.adv
+from inkex import errormsg
+
+from ..gui.simulator import SplitSimulatorWindow
+from ..gui.tartan import TartanMainPanel
+from ..i18n import _
+from ..svg.tags import EMBROIDERABLE_TAGS, INKSTITCH_TARTAN, SVG_GROUP_TAG
+from .base import InkstitchExtension
+
+
+class Tartan(InkstitchExtension):
+ def __init__(self, *args, **kwargs):
+ self.elements = set()
+ self.cancelled = False
+ InkstitchExtension.__init__(self, *args, **kwargs)
+
+ def cancel(self):
+ self.cancelled = True
+
+ def get_tartan_elements(self):
+ if self.svg.selection:
+ self._get_elements()
+
+ def _get_elements(self):
+ for node in self.svg.selection:
+ node = self.get_outline(node)
+ if node.style('fill'):
+ self.elements.add(node)
+
+ def get_outline(self, node):
+ # existing tartans are marked through their outline element
+ # we have either selected the element itself or some other element within a tartan group
+ if node.get(INKSTITCH_TARTAN, None):
+ return node
+ if node.get_id().startswith('inkstitch-tartan'):
+ for element in node.iterchildren(EMBROIDERABLE_TAGS):
+ if element.get(INKSTITCH_TARTAN, None):
+ return element
+ for group in node.iterancestors(SVG_GROUP_TAG):
+ if group.get_id().startswith('inkstitch-tartan'):
+ for element in group.iterchildren(EMBROIDERABLE_TAGS):
+ if element.get(INKSTITCH_TARTAN, None):
+ return element
+ # if we don't find an existing tartan, return node
+ return node
+
+ def effect(self):
+ self.get_tartan_elements()
+ if not self.elements:
+ errormsg(_("To create a tartan pattern please select at least one element with a fill color."))
+ return
+ metadata = self.get_inkstitch_metadata()
+
+ app = wx.App()
+ frame = SplitSimulatorWindow(
+ title=_("Ink/Stitch Tartan"),
+ panel_class=TartanMainPanel,
+ elements=list(self.elements),
+ on_cancel=self.cancel,
+ metadata=metadata,
+ target_duration=1
+ )
+
+ frame.Show()
+ app.MainLoop()
+
+ if self.cancelled:
+ # This prevents the superclass from outputting the SVG, because we
+ # may have modified the DOM.
+ sys.exit(0)