summaryrefslogtreecommitdiff
path: root/lib/extensions/import_threadlist.py
diff options
context:
space:
mode:
authorKaalleen <36401965+kaalleen@users.noreply.github.com>2020-04-25 14:24:01 +0200
committerGitHub <noreply@github.com>2020-04-25 14:24:01 +0200
commit1d3b89111e627b3662a7ec2749bb3dcfe694be66 (patch)
tree1103390c4b57490d4e35dc17b450b98bfc4878d4 /lib/extensions/import_threadlist.py
parent3b2c7ba1a9caa87e2a7b09af2e0af2c9221063d9 (diff)
import threadlist (#666)
Diffstat (limited to 'lib/extensions/import_threadlist.py')
-rw-r--r--lib/extensions/import_threadlist.py102
1 files changed, 102 insertions, 0 deletions
diff --git a/lib/extensions/import_threadlist.py b/lib/extensions/import_threadlist.py
new file mode 100644
index 00000000..d31c0d69
--- /dev/null
+++ b/lib/extensions/import_threadlist.py
@@ -0,0 +1,102 @@
+import os
+import re
+import sys
+
+import inkex
+
+from ..i18n import _
+from ..threads import ThreadCatalog
+from .base import InkstitchExtension
+
+
+class ImportThreadlist(InkstitchExtension):
+ def __init__(self, *args, **kwargs):
+ InkstitchExtension.__init__(self, *args, **kwargs)
+ self.OptionParser.add_option("-f", "--filepath", type="str", default="", dest="filepath")
+ self.OptionParser.add_option("-m", "--method", type="int", default=1, dest="method")
+ self.OptionParser.add_option("-t", "--palette", type="str", default=None, dest="palette")
+
+ def effect(self):
+ # Remove selection, we want all the elements in the document
+ self.selected = {}
+
+ if not self.get_elements():
+ return
+
+ path = self.options.filepath
+ if not os.path.exists(path):
+ print >> sys.stderr, _("File not found.")
+ sys.exit(1)
+
+ method = self.options.method
+ if method == 1:
+ colors = self.parse_inkstitch_threadlist(path)
+ else:
+ colors = self.parse_threadlist_by_catalog_number(path)
+
+ if all(c is None for c in colors):
+ print >>sys.stderr, _("Couldn't find any matching colors in the file.")
+ if method == 1:
+ print >>sys.stderr, _('Please try to import as "other threadlist" and specify a color palette below.')
+ else:
+ print >>sys.stderr, _("Please chose an other color palette for your design.")
+ sys.exit(1)
+
+ # Iterate through the color blocks to apply colors
+ element_color = ""
+ i = -1
+ for element in self.elements:
+ if element.color != element_color:
+ element_color = element.color
+ i += 1
+
+ # No more colors in the list, stop here
+ if i == len(colors):
+ break
+
+ style = element.node.get('style').replace("%s" % element_color, "%s" % colors[i])
+ element.node.set('style', style)
+
+ def parse_inkstitch_threadlist(self, path):
+ colors = []
+ with open(path) as threadlist:
+ for line in threadlist:
+ if line[0].isdigit():
+ m = re.search(r"\((#[0-9A-Fa-f]{6})\)", line)
+ if m:
+ colors.append(m.group(1))
+ else:
+ # Color not found
+ colors.append(None)
+ return colors
+
+ def parse_threadlist_by_catalog_number(self, path):
+ palette_name = self.options.palette
+ palette = ThreadCatalog().get_palette_by_name(palette_name)
+
+ colors = []
+ palette_numbers = []
+ palette_colors = []
+
+ for color in palette:
+ palette_numbers.append(color.number)
+ palette_colors.append('#%s' % color.hex_digits.lower())
+ with open(path) as threadlist:
+ for line in threadlist:
+ if line[0].isdigit():
+ # some threadlists may add a # in front of the catalof number
+ # let's remove it from the entire string before splitting it up
+ thread = line.replace('#', '').split()
+ catalog_number = set(thread[1:]).intersection(palette_numbers)
+ if catalog_number:
+ color_index = palette_numbers.index(next(iter(catalog_number)))
+ colors.append(palette_colors[color_index])
+ else:
+ # No color found
+ colors.append(None)
+ return colors
+
+ def find_elements(self, xpath):
+ svg = self.document.getroot()
+ elements = svg.xpath(xpath, namespaces=inkex.NSS)
+ return elements