From 13016f50ecace38a93f7d8e55bdad8b21fb0d2c7 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Fri, 17 Aug 2018 20:55:43 -0400 Subject: group symbol+connector and label with command description --- inx/inkstitch_attach_commands.inx | 4 ++-- lib/commands.py | 32 +++++++++++++++++++++++++ lib/extensions/object_commands.py | 25 +++++++++++++++----- messages.po | 50 ++++++++++++++++++++++++++++++++++++--- 4 files changed, 100 insertions(+), 11 deletions(-) diff --git a/inx/inkstitch_attach_commands.inx b/inx/inkstitch_attach_commands.inx index 61cf7213..bba8602b 100644 --- a/inx/inkstitch_attach_commands.inx +++ b/inx/inkstitch_attach_commands.inx @@ -4,8 +4,8 @@ org.inkstitch.commands inkstitch.py inkex.py - false - false + false + false false false false diff --git a/lib/commands.py b/lib/commands.py index cadfa080..5a471c2e 100644 --- a/lib/commands.py +++ b/lib/commands.py @@ -3,13 +3,42 @@ import cubicsuperpath from .svg import apply_transforms from .svg.tags import SVG_USE_TAG, SVG_SYMBOL_TAG, CONNECTION_START, CONNECTION_END, XLINK_HREF +from .utils import cache +from .i18n import _ +COMMANDS = { + # l10n: command attached to an object + "fill_start": _("Fill stitch starting position"), + + # l10n: command attached to an object + "fill_end": _("Fill stitch ending position"), + + # l10n: command attached to an object + "stop": _("Stop (pause machine) after sewing this object"), + + # l10n: command attached to an object + "trim": _("Trim thread after sewing this object"), + + # l10n: command attached to an object + "ignore_object": _("Ignore this object (do not stitch)"), + + # l10n: command that affects entire layer + "ignore_layer": _("Ignore layer (do not stitch any objects in this layer)") +} + +OBJECT_COMMANDS = [ "fill_start", "fill_end", "stop", "trim", "ignore_object" ] +LAYER_COMMANDS = [ "ignore_layer" ] class CommandParseError(Exception): pass class BaseCommand(object): + @property + @cache + def description(self): + return get_command_description(self.command) + def parse_symbol(self): if self.symbol.tag != SVG_SYMBOL_TAG: raise CommandParseError("use points to non-symbol") @@ -87,6 +116,9 @@ class StandaloneCommand(BaseCommand): self.parse_symbol() +def get_command_description(command): + return COMMANDS[command] + def find_commands(node): """Find the symbols this node is connected to and return them as Commands""" diff --git a/lib/extensions/object_commands.py b/lib/extensions/object_commands.py index 27a07969..e9ee6063 100644 --- a/lib/extensions/object_commands.py +++ b/lib/extensions/object_commands.py @@ -7,14 +7,15 @@ from random import random from shapely import geometry as shgeo from .commands import CommandsExtension +from ..commands import OBJECT_COMMANDS, get_command_description from ..i18n import _ from ..elements import SatinColumn -from ..svg.tags import SVG_GROUP_TAG, SVG_USE_TAG, SVG_PATH_TAG, INKSCAPE_GROUPMODE, XLINK_HREF, CONNECTION_START, CONNECTION_END, CONNECTOR_TYPE +from ..svg.tags import * from ..svg import get_correction_transform class ObjectCommands(CommandsExtension): - COMMANDS = ["fill_start", "fill_end", "stop", "trim", "ignore_object"] + COMMANDS = OBJECT_COMMANDS def add_connector(self, symbol, element): # I'd like it if I could position the connector endpoint nicely but inkscape just @@ -27,14 +28,16 @@ class ObjectCommands(CommandsExtension): "id": self.uniqueId("connector"), "d": "M %s,%s %s,%s" % (start_pos[0], start_pos[1], end_pos.x, end_pos.y), "style": "stroke:#000000;stroke-width:1px;stroke-opacity:0.5;fill:none;", - "transform": get_correction_transform(symbol), CONNECTION_START: "#%s" % symbol.get('id'), CONNECTION_END: "#%s" % element.node.get('id'), CONNECTOR_TYPE: "polyline", + + # l10n: the name of the line that connects a command to the object it applies to + INKSCAPE_LABEL: _("connector") } ) - symbol.getparent().insert(symbol.getparent().index(symbol), path) + symbol.getparent().insert(0, path) def get_command_pos(self, element, index, total): # Put command symbols 30 pixels out from the shape, spaced evenly around it. @@ -71,7 +74,15 @@ class ObjectCommands(CommandsExtension): pos = self.get_command_pos(element, i, len(commands)) - symbol = inkex.etree.SubElement(element.node.getparent(), SVG_USE_TAG, + group = inkex.etree.SubElement(element.node.getparent(), SVG_GROUP_TAG, + { + "id": self.uniqueId("group"), + INKSCAPE_LABEL: _("Ink/Stitch Command") + ": %s" % get_command_description(command), + "transform": get_correction_transform(element.node) + } + ) + + symbol = inkex.etree.SubElement(group, SVG_USE_TAG, { "id": self.uniqueId("use"), XLINK_HREF: "#inkstitch_%s" % command, @@ -79,7 +90,9 @@ class ObjectCommands(CommandsExtension): "width": "100%", "x": str(pos.x), "y": str(pos.y), - "transform": get_correction_transform(element.node) + + # l10n: the name of a command symbol (example: scissors icon for trim command) + INKSCAPE_LABEL: _("command marker"), } ) diff --git a/messages.po b/messages.po index 465954c9..7350d2a2 100644 --- a/messages.po +++ b/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-08-17 16:19-0400\n" +"POT-Creation-Date: 2018-08-17 22:45-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,36 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.3\n" +#. : command attached to an object +#: lib/commands.py:11 +msgid "Fill stitch starting position" +msgstr "" + +#. : command attached to an object +#: lib/commands.py:14 +msgid "Fill stitch ending position" +msgstr "" + +#. : command attached to an object +#: lib/commands.py:17 +msgid "Stop (pause machine) after sewing this object" +msgstr "" + +#. : command attached to an object +#: lib/commands.py:20 +msgid "Trim thread after sewing this object" +msgstr "" + +#. : command attached to an object +#: lib/commands.py:23 +msgid "Ignore this object (do not stitch)" +msgstr "" + +#. : command that affects entire layer +#: lib/commands.py:26 +msgid "Ignore layer (do not stitch any objects in this layer)" +msgstr "" + #: lib/elements/auto_fill.py:11 msgid "Auto-Fill" msgstr "" @@ -432,11 +462,25 @@ msgstr "" msgid "Please choose one or more commands to add." msgstr "" -#: lib/extensions/object_commands.py:93 +#. : the name of the line that connects a command to the object it applies to +#: lib/extensions/object_commands.py:36 +msgid "connector" +msgstr "" + +#: lib/extensions/object_commands.py:80 +msgid "Ink/Stitch Command" +msgstr "" + +#. : the name of a command symbol (example: scissors icon for trim command) +#: lib/extensions/object_commands.py:95 +msgid "command marker" +msgstr "" + +#: lib/extensions/object_commands.py:106 msgid "Please select one or more objects to which to attach commands." msgstr "" -#: lib/extensions/object_commands.py:101 +#: lib/extensions/object_commands.py:114 msgid "Please choose one or more commands to attach." msgstr "" -- cgit v1.2.3 From 8a0ed9b9658306341d19e3ca32ee01c641063937 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Fri, 17 Aug 2018 23:02:27 -0400 Subject: add description for layer commands too --- lib/extensions/layer_commands.py | 6 ++++-- messages.po | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/extensions/layer_commands.py b/lib/extensions/layer_commands.py index 88170f66..576af044 100644 --- a/lib/extensions/layer_commands.py +++ b/lib/extensions/layer_commands.py @@ -3,13 +3,14 @@ import sys import inkex from .commands import CommandsExtension +from ..commands import LAYER_COMMANDS, get_command_description from ..i18n import _ -from ..svg.tags import SVG_USE_TAG, XLINK_HREF +from ..svg.tags import * from ..svg import get_correction_transform class LayerCommands(CommandsExtension): - COMMANDS = ["ignore_layer"] + COMMANDS = LAYER_COMMANDS def ensure_current_layer(self): # if no layer is selected, inkex defaults to the root, which isn't @@ -37,6 +38,7 @@ class LayerCommands(CommandsExtension): node = inkex.etree.SubElement(self.current_layer, SVG_USE_TAG, { "id": self.uniqueId("use"), + INKSCAPE_LABEL: _("Ink/Stitch Command") + ": %s" % get_command_description(command), XLINK_HREF: "#inkstitch_%s" % command, "height": "100%", "width": "100%", diff --git a/messages.po b/messages.po index 7350d2a2..30ceee9e 100644 --- a/messages.po +++ b/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-08-17 22:45-0400\n" +"POT-Creation-Date: 2018-08-17 23:02-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -458,19 +458,19 @@ msgstr "" msgid "Ink/Stitch Add-ons Installer" msgstr "" -#: lib/extensions/layer_commands.py:28 +#: lib/extensions/layer_commands.py:29 msgid "Please choose one or more commands to add." msgstr "" +#: lib/extensions/layer_commands.py:41 lib/extensions/object_commands.py:80 +msgid "Ink/Stitch Command" +msgstr "" + #. : the name of the line that connects a command to the object it applies to #: lib/extensions/object_commands.py:36 msgid "connector" msgstr "" -#: lib/extensions/object_commands.py:80 -msgid "Ink/Stitch Command" -msgstr "" - #. : the name of a command symbol (example: scissors icon for trim command) #: lib/extensions/object_commands.py:95 msgid "command marker" -- cgit v1.2.3 From a4d588e392c734c9e32bf4c06b2403ca32e7f1e2 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Sat, 18 Aug 2018 20:58:31 -0400 Subject: prep crowdin.yml for using crowdin CLI --- crowdin.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crowdin.yml b/crowdin.yml index be40a011..d806d82e 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,3 +1,5 @@ +project_identifier: inkstitch +api_key_env: CROWDIN_API_KEY files: - source: messages.po translation: /translations/messages_%locale_with_underscore%.po -- cgit v1.2.3 From 512c3411648b24505165d555a04e82ba689f8aed Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Sun, 19 Aug 2018 22:14:10 -0400 Subject: integrate inx generation into ink/stitch proper --- bin/gen-input-inx | 36 ------------------------------------ bin/gen-output-format-option-list | 14 -------------- bin/gen-output-inx | 36 ------------------------------------ bin/gen-zip-inx | 35 ----------------------------------- bin/generate-inx-files | 10 ++++++++++ inx/inkstitch_attach_commands.inx | 22 ---------------------- inx/inkstitch_convert_to_satin.inx | 17 ----------------- inx/inkstitch_embroider.inx | 30 ------------------------------ inx/inkstitch_flip.inx | 17 ----------------- inx/inkstitch_input_100.inx | 17 ----------------- inx/inkstitch_input_10O.inx | 17 ----------------- inx/inkstitch_input_BRO.inx | 17 ----------------- inx/inkstitch_input_DSB.inx | 17 ----------------- inx/inkstitch_input_DST.inx | 17 ----------------- inx/inkstitch_input_DSZ.inx | 17 ----------------- inx/inkstitch_input_EMD.inx | 17 ----------------- inx/inkstitch_input_EXP.inx | 17 ----------------- inx/inkstitch_input_INB.inx | 17 ----------------- inx/inkstitch_input_JEF.inx | 17 ----------------- inx/inkstitch_input_KSM.inx | 17 ----------------- inx/inkstitch_input_PEC.inx | 17 ----------------- inx/inkstitch_input_PES.inx | 17 ----------------- inx/inkstitch_input_SEW.inx | 17 ----------------- inx/inkstitch_input_SHV.inx | 17 ----------------- inx/inkstitch_input_STX.inx | 17 ----------------- inx/inkstitch_input_TAP.inx | 17 ----------------- inx/inkstitch_input_TBF.inx | 17 ----------------- inx/inkstitch_input_U01.inx | 17 ----------------- inx/inkstitch_input_VP3.inx | 17 ----------------- inx/inkstitch_input_XXX.inx | 17 ----------------- inx/inkstitch_install.inx | 17 ----------------- inx/inkstitch_layer_commands.inx | 19 ------------------- inx/inkstitch_output_DST.inx | 19 ------------------- inx/inkstitch_output_EXP.inx | 19 ------------------- inx/inkstitch_output_JEF.inx | 19 ------------------- inx/inkstitch_output_PEC.inx | 19 ------------------- inx/inkstitch_output_PES.inx | 19 ------------------- inx/inkstitch_output_VP3.inx | 19 ------------------- inx/inkstitch_output_ZIP.inx | 31 ------------------------------- inx/inkstitch_params.inx | 17 ----------------- inx/inkstitch_print.inx | 17 ----------------- inx/inkstitch_simulate.inx | 17 ----------------- lib/extensions/__init__.py | 10 ++++++++++ lib/extensions/base.py | 5 +++++ lib/inx/__init__.py | 1 + lib/inx/extensions.py | 21 +++++++++++++++++++++ lib/inx/generate.py | 8 ++++++++ lib/inx/inputs.py | 18 ++++++++++++++++++ lib/inx/outputs.py | 18 ++++++++++++++++++ lib/inx/utils.py | 26 ++++++++++++++++++++++++++ messages.po | 8 ++++---- requirements.txt | 1 + templates/convert_to_satin.inx | 17 +++++++++++++++++ templates/embroider.inx | 28 ++++++++++++++++++++++++++++ templates/embroider_input.inx | 17 ----------------- templates/embroider_output.inx | 19 ------------------- templates/embroider_zip_output.inx | 21 --------------------- templates/flip.inx | 17 +++++++++++++++++ templates/input.inx | 17 +++++++++++++++++ templates/install.inx | 17 +++++++++++++++++ templates/layer_commands.inx | 19 +++++++++++++++++++ templates/object_commands.inx | 22 ++++++++++++++++++++++ templates/output.inx | 19 +++++++++++++++++++ templates/params.inx | 17 +++++++++++++++++ templates/print.inx | 17 +++++++++++++++++ templates/simulate.inx | 17 +++++++++++++++++ templates/zip.inx | 21 +++++++++++++++++++++ 67 files changed, 350 insertions(+), 857 deletions(-) delete mode 100755 bin/gen-input-inx delete mode 100755 bin/gen-output-format-option-list delete mode 100755 bin/gen-output-inx delete mode 100755 bin/gen-zip-inx create mode 100755 bin/generate-inx-files delete mode 100644 inx/inkstitch_attach_commands.inx delete mode 100644 inx/inkstitch_convert_to_satin.inx delete mode 100644 inx/inkstitch_embroider.inx delete mode 100644 inx/inkstitch_flip.inx delete mode 100644 inx/inkstitch_input_100.inx delete mode 100644 inx/inkstitch_input_10O.inx delete mode 100644 inx/inkstitch_input_BRO.inx delete mode 100644 inx/inkstitch_input_DSB.inx delete mode 100644 inx/inkstitch_input_DST.inx delete mode 100644 inx/inkstitch_input_DSZ.inx delete mode 100644 inx/inkstitch_input_EMD.inx delete mode 100644 inx/inkstitch_input_EXP.inx delete mode 100644 inx/inkstitch_input_INB.inx delete mode 100644 inx/inkstitch_input_JEF.inx delete mode 100644 inx/inkstitch_input_KSM.inx delete mode 100644 inx/inkstitch_input_PEC.inx delete mode 100644 inx/inkstitch_input_PES.inx delete mode 100644 inx/inkstitch_input_SEW.inx delete mode 100644 inx/inkstitch_input_SHV.inx delete mode 100644 inx/inkstitch_input_STX.inx delete mode 100644 inx/inkstitch_input_TAP.inx delete mode 100644 inx/inkstitch_input_TBF.inx delete mode 100644 inx/inkstitch_input_U01.inx delete mode 100644 inx/inkstitch_input_VP3.inx delete mode 100644 inx/inkstitch_input_XXX.inx delete mode 100644 inx/inkstitch_install.inx delete mode 100644 inx/inkstitch_layer_commands.inx delete mode 100644 inx/inkstitch_output_DST.inx delete mode 100644 inx/inkstitch_output_EXP.inx delete mode 100644 inx/inkstitch_output_JEF.inx delete mode 100644 inx/inkstitch_output_PEC.inx delete mode 100644 inx/inkstitch_output_PES.inx delete mode 100644 inx/inkstitch_output_VP3.inx delete mode 100644 inx/inkstitch_output_ZIP.inx delete mode 100644 inx/inkstitch_params.inx delete mode 100644 inx/inkstitch_print.inx delete mode 100644 inx/inkstitch_simulate.inx create mode 100644 lib/inx/__init__.py create mode 100755 lib/inx/extensions.py create mode 100644 lib/inx/generate.py create mode 100755 lib/inx/inputs.py create mode 100644 lib/inx/outputs.py create mode 100644 lib/inx/utils.py create mode 100644 templates/convert_to_satin.inx create mode 100644 templates/embroider.inx delete mode 100644 templates/embroider_input.inx delete mode 100644 templates/embroider_output.inx delete mode 100644 templates/embroider_zip_output.inx create mode 100644 templates/flip.inx create mode 100644 templates/input.inx create mode 100644 templates/install.inx create mode 100644 templates/layer_commands.inx create mode 100644 templates/object_commands.inx create mode 100644 templates/output.inx create mode 100644 templates/params.inx create mode 100644 templates/print.inx create mode 100644 templates/simulate.inx create mode 100644 templates/zip.inx diff --git a/bin/gen-input-inx b/bin/gen-input-inx deleted file mode 100755 index ae32b43f..00000000 --- a/bin/gen-input-inx +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python - -import sys, os -from os.path import dirname -import pyembroidery -from jinja2 import Environment, FileSystemLoader, select_autoescape - - -def build_environment(): - template_dir = os.path.join(dirname(dirname(os.path.realpath(__file__))), "templates") - - return Environment( - loader = FileSystemLoader(template_dir), - autoescape = True - ) - - -def pyembroidery_input_formats(): - for format in pyembroidery.supported_formats(): - if 'reader' in format and format['category'] == 'embroidery': - yield format['extension'], format['description'] - - -def main(): - env = build_environment() - template = env.get_template('embroider_input.inx') - - for format, description in pyembroidery_input_formats(): - inx = template.render(format=format, description=description) - - with open("inx/inkstitch_input_%s.inx" % format.upper(), 'w') as inx_file: - print >> inx_file, inx - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/bin/gen-output-format-option-list b/bin/gen-output-format-option-list deleted file mode 100755 index 28a83976..00000000 --- a/bin/gen-output-format-option-list +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python - -import sys -import pyembroidery - -formats = [format for format in pyembroidery.supported_formats() if 'writer' in format] -formats.sort(key=lambda format: (format['category'] != 'embroidery', format['extension'])) - -for format in formats: - tag = "" - if format['category'] != 'embroidery': - tag = " [DEBUG]" - - print '<_option value="%s">%s(%s)%s' % (format['extension'], format['description'], format['extension'].upper(), tag) diff --git a/bin/gen-output-inx b/bin/gen-output-inx deleted file mode 100755 index fbe2ad55..00000000 --- a/bin/gen-output-inx +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python - -import sys, os -from os.path import dirname -import pyembroidery -from jinja2 import Environment, FileSystemLoader, select_autoescape - - -def build_environment(): - template_dir = os.path.join(dirname(dirname(os.path.realpath(__file__))), "templates") - - return Environment( - loader = FileSystemLoader(template_dir), - autoescape = True - ) - - -def pyembroidery_output_formats(): - for format in pyembroidery.supported_formats(): - if 'writer' in format and format['category'] == 'embroidery': - yield format['extension'], format['description'] - - -def main(): - env = build_environment() - template = env.get_template('embroider_output.inx') - - for format, description in pyembroidery_output_formats(): - inx = template.render(format=format, description=description) - - with open("inx/inkstitch_output_%s.inx" % format.upper(), 'w') as inx_file: - print >> inx_file, inx - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/bin/gen-zip-inx b/bin/gen-zip-inx deleted file mode 100755 index 40948786..00000000 --- a/bin/gen-zip-inx +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python - -import sys, os -from os.path import dirname -import pyembroidery -from jinja2 import Environment, FileSystemLoader, select_autoescape - - -def build_environment(): - template_dir = os.path.join(dirname(dirname(os.path.realpath(__file__))), "templates") - - return Environment( - loader = FileSystemLoader(template_dir), - autoescape = True - ) - - -def pyembroidery_output_formats(): - for format in pyembroidery.supported_formats(): - if 'writer' in format and format['category'] == 'embroidery': - yield format['extension'], format['description'] - - -def main(): - env = build_environment() - template = env.get_template('embroider_zip_output.inx') - - inx = template.render(formats=pyembroidery_output_formats()) - - with open("inx/inkstitch_output_ZIP.inx", 'w') as inx_file: - inx_file.write(inx) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/bin/generate-inx-files b/bin/generate-inx-files new file mode 100755 index 00000000..f7b7a801 --- /dev/null +++ b/bin/generate-inx-files @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +import sys +import os +from os.path import dirname + +sys.path.append(os.path.join(dirname(dirname(__file__)))) +from lib.inx import generate_inx_files + +generate_inx_files() diff --git a/inx/inkstitch_attach_commands.inx b/inx/inkstitch_attach_commands.inx deleted file mode 100644 index bba8602b..00000000 --- a/inx/inkstitch_attach_commands.inx +++ /dev/null @@ -1,22 +0,0 @@ - - - <_name>Attach Commands - org.inkstitch.commands - inkstitch.py - inkex.py - false - false - false - false - false - object_commands - - all - - - - - - diff --git a/inx/inkstitch_convert_to_satin.inx b/inx/inkstitch_convert_to_satin.inx deleted file mode 100644 index d71b2081..00000000 --- a/inx/inkstitch_convert_to_satin.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>Convert Line to Satin - org.inkstitch.convert_to_satin - inkstitch.py - inkex.py - convert_to_satin - - all - - - - - - diff --git a/inx/inkstitch_embroider.inx b/inx/inkstitch_embroider.inx deleted file mode 100644 index 70bc10b0..00000000 --- a/inx/inkstitch_embroider.inx +++ /dev/null @@ -1,30 +0,0 @@ - - - <_name>Embroider - jonh.embroider - inkstitch.py - inkex.py - 3.0 - true - - <_option value="dst">Tajima Embroidery Format (DST) - <_option value="exp">Melco Embroidery Format (EXP) - <_option value="jef">Janome Embroidery Format (JEF) - <_option value="pec">Brother Embroidery Format (PEC) - <_option value="pes">Brother Embroidery Format (PES) - <_option value="vp3">Pfaff Embroidery Format (VP3) - <_option value="csv">Comma-separated values (CSV) [DEBUG] - <_option value="svg">Scalable Vector Graphics (SVG) [DEBUG] - - - embroider - - all - - - - - - diff --git a/inx/inkstitch_flip.inx b/inx/inkstitch_flip.inx deleted file mode 100644 index f129b8d9..00000000 --- a/inx/inkstitch_flip.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>Flip Satin Columns - org.inkstitch.flip_satins - inkstitch.py - inkex.py - flip - - all - - - - - - diff --git a/inx/inkstitch_input_100.inx b/inx/inkstitch_input_100.inx deleted file mode 100644 index def2011d..00000000 --- a/inx/inkstitch_input_100.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>100 file input - org.inkstitch.input.100 - inkstitch.py - inkex.py - - .100 - application/x-embroidery-100 - <_filetypename>Ink/Stitch: Toyota Embroidery Format (.100) - <_filetypetooltip>convert 100 file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_10O.inx b/inx/inkstitch_input_10O.inx deleted file mode 100644 index 29b14397..00000000 --- a/inx/inkstitch_input_10O.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>10O file input - org.inkstitch.input.10o - inkstitch.py - inkex.py - - .10o - application/x-embroidery-10o - <_filetypename>Ink/Stitch: Toyota Embroidery Format (.10o) - <_filetypetooltip>convert 10O file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_BRO.inx b/inx/inkstitch_input_BRO.inx deleted file mode 100644 index 928195a6..00000000 --- a/inx/inkstitch_input_BRO.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>BRO file input - org.inkstitch.input.bro - inkstitch.py - inkex.py - - .bro - application/x-embroidery-bro - <_filetypename>Ink/Stitch: Bits & Volts Embroidery Format (.bro) - <_filetypetooltip>convert BRO file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_DSB.inx b/inx/inkstitch_input_DSB.inx deleted file mode 100644 index c78e1c2d..00000000 --- a/inx/inkstitch_input_DSB.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>DSB file input - org.inkstitch.input.dsb - inkstitch.py - inkex.py - - .dsb - application/x-embroidery-dsb - <_filetypename>Ink/Stitch: Tajima(Barudan) Embroidery Format (.dsb) - <_filetypetooltip>convert DSB file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_DST.inx b/inx/inkstitch_input_DST.inx deleted file mode 100644 index b3eee601..00000000 --- a/inx/inkstitch_input_DST.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>DST file input - org.inkstitch.input.dst - inkstitch.py - inkex.py - - .dst - application/x-embroidery-dst - <_filetypename>Ink/Stitch: Tajima Embroidery Format (.dst) - <_filetypetooltip>convert DST file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_DSZ.inx b/inx/inkstitch_input_DSZ.inx deleted file mode 100644 index 388aeda0..00000000 --- a/inx/inkstitch_input_DSZ.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>DSZ file input - org.inkstitch.input.dsz - inkstitch.py - inkex.py - - .dsz - application/x-embroidery-dsz - <_filetypename>Ink/Stitch: ZSK USA Embroidery Format (.dsz) - <_filetypetooltip>convert DSZ file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_EMD.inx b/inx/inkstitch_input_EMD.inx deleted file mode 100644 index c05da24f..00000000 --- a/inx/inkstitch_input_EMD.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>EMD file input - org.inkstitch.input.emd - inkstitch.py - inkex.py - - .emd - application/x-embroidery-emd - <_filetypename>Ink/Stitch: Elna Embroidery Format (.emd) - <_filetypetooltip>convert EMD file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_EXP.inx b/inx/inkstitch_input_EXP.inx deleted file mode 100644 index 2c5997d5..00000000 --- a/inx/inkstitch_input_EXP.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>EXP file input - org.inkstitch.input.exp - inkstitch.py - inkex.py - - .exp - application/x-embroidery-exp - <_filetypename>Ink/Stitch: Melco Embroidery Format (.exp) - <_filetypetooltip>convert EXP file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_INB.inx b/inx/inkstitch_input_INB.inx deleted file mode 100644 index 7409a853..00000000 --- a/inx/inkstitch_input_INB.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>INB file input - org.inkstitch.input.inb - inkstitch.py - inkex.py - - .inb - application/x-embroidery-inb - <_filetypename>Ink/Stitch: Inbro Embroidery Format (.inb) - <_filetypetooltip>convert INB file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_JEF.inx b/inx/inkstitch_input_JEF.inx deleted file mode 100644 index 364e969f..00000000 --- a/inx/inkstitch_input_JEF.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>JEF file input - org.inkstitch.input.jef - inkstitch.py - inkex.py - - .jef - application/x-embroidery-jef - <_filetypename>Ink/Stitch: Janome Embroidery Format (.jef) - <_filetypetooltip>convert JEF file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_KSM.inx b/inx/inkstitch_input_KSM.inx deleted file mode 100644 index b01eb195..00000000 --- a/inx/inkstitch_input_KSM.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>KSM file input - org.inkstitch.input.ksm - inkstitch.py - inkex.py - - .ksm - application/x-embroidery-ksm - <_filetypename>Ink/Stitch: Pfaff Embroidery Format (.ksm) - <_filetypetooltip>convert KSM file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_PEC.inx b/inx/inkstitch_input_PEC.inx deleted file mode 100644 index 885c0125..00000000 --- a/inx/inkstitch_input_PEC.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>PEC file input - org.inkstitch.input.pec - inkstitch.py - inkex.py - - .pec - application/x-embroidery-pec - <_filetypename>Ink/Stitch: Brother Embroidery Format (.pec) - <_filetypetooltip>convert PEC file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_PES.inx b/inx/inkstitch_input_PES.inx deleted file mode 100644 index 6faa06be..00000000 --- a/inx/inkstitch_input_PES.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>PES file input - org.inkstitch.input.pes - inkstitch.py - inkex.py - - .pes - application/x-embroidery-pes - <_filetypename>Ink/Stitch: Brother Embroidery Format (.pes) - <_filetypetooltip>convert PES file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_SEW.inx b/inx/inkstitch_input_SEW.inx deleted file mode 100644 index a7661c97..00000000 --- a/inx/inkstitch_input_SEW.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>SEW file input - org.inkstitch.input.sew - inkstitch.py - inkex.py - - .sew - application/x-embroidery-sew - <_filetypename>Ink/Stitch: Janome Embroidery Format (.sew) - <_filetypetooltip>convert SEW file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_SHV.inx b/inx/inkstitch_input_SHV.inx deleted file mode 100644 index 7aad470c..00000000 --- a/inx/inkstitch_input_SHV.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>SHV file input - org.inkstitch.input.shv - inkstitch.py - inkex.py - - .shv - application/x-embroidery-shv - <_filetypename>Ink/Stitch: Husqvarna Viking Embroidery Format (.shv) - <_filetypetooltip>convert SHV file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_STX.inx b/inx/inkstitch_input_STX.inx deleted file mode 100644 index 3f1a3065..00000000 --- a/inx/inkstitch_input_STX.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>STX file input - org.inkstitch.input.stx - inkstitch.py - inkex.py - - .stx - application/x-embroidery-stx - <_filetypename>Ink/Stitch: Data Stitch Embroidery Format (.stx) - <_filetypetooltip>convert STX file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_TAP.inx b/inx/inkstitch_input_TAP.inx deleted file mode 100644 index bf299130..00000000 --- a/inx/inkstitch_input_TAP.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>TAP file input - org.inkstitch.input.tap - inkstitch.py - inkex.py - - .tap - application/x-embroidery-tap - <_filetypename>Ink/Stitch: Happy Embroidery Format (.tap) - <_filetypetooltip>convert TAP file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_TBF.inx b/inx/inkstitch_input_TBF.inx deleted file mode 100644 index e2b72ec9..00000000 --- a/inx/inkstitch_input_TBF.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>TBF file input - org.inkstitch.input.tbf - inkstitch.py - inkex.py - - .tbf - application/x-embroidery-tbf - <_filetypename>Ink/Stitch: Tajima Embroidery Format (.tbf) - <_filetypetooltip>convert TBF file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_U01.inx b/inx/inkstitch_input_U01.inx deleted file mode 100644 index befadd5b..00000000 --- a/inx/inkstitch_input_U01.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>U01 file input - org.inkstitch.input.u01 - inkstitch.py - inkex.py - - .u01 - application/x-embroidery-u01 - <_filetypename>Ink/Stitch: Barudan Embroidery Format (.u01) - <_filetypetooltip>convert U01 file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_VP3.inx b/inx/inkstitch_input_VP3.inx deleted file mode 100644 index b39f630a..00000000 --- a/inx/inkstitch_input_VP3.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>VP3 file input - org.inkstitch.input.vp3 - inkstitch.py - inkex.py - - .vp3 - application/x-embroidery-vp3 - <_filetypename>Ink/Stitch: Pfaff Embroidery Format (.vp3) - <_filetypetooltip>convert VP3 file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_input_XXX.inx b/inx/inkstitch_input_XXX.inx deleted file mode 100644 index 6e8e501e..00000000 --- a/inx/inkstitch_input_XXX.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>XXX file input - org.inkstitch.input.xxx - inkstitch.py - inkex.py - - .xxx - application/x-embroidery-xxx - <_filetypename>Ink/Stitch: Singer Embroidery Format (.xxx) - <_filetypetooltip>convert XXX file to Ink/Stitch manual-stitch paths - - input - - diff --git a/inx/inkstitch_install.inx b/inx/inkstitch_install.inx deleted file mode 100644 index 7275e13a..00000000 --- a/inx/inkstitch_install.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>Install add-ons for Inkscape - org.inkstitch.install - inkstitch.py - inkex.py - install - - all - - - - - - diff --git a/inx/inkstitch_layer_commands.inx b/inx/inkstitch_layer_commands.inx deleted file mode 100644 index 7eadd094..00000000 --- a/inx/inkstitch_layer_commands.inx +++ /dev/null @@ -1,19 +0,0 @@ - - - <_name>Add Layer Commands - org.inkstitch.layer_commands - inkstitch.py - inkex.py - Commands will be added to the currently-selected layer. - false - layer_commands - - all - - - - - - diff --git a/inx/inkstitch_output_DST.inx b/inx/inkstitch_output_DST.inx deleted file mode 100644 index fa034f40..00000000 --- a/inx/inkstitch_output_DST.inx +++ /dev/null @@ -1,19 +0,0 @@ - - - <_name>DST file output - org.inkstitch.output.dst - inkstitch.py - inkex.py - - .dst - application/x-embroidery-dst - <_filetypename>Ink/Stitch: Tajima Embroidery Format (.dst) - <_filetypetooltip>Save design in DST format using Ink/Stitch - true - - output - dst - - diff --git a/inx/inkstitch_output_EXP.inx b/inx/inkstitch_output_EXP.inx deleted file mode 100644 index 853bab9f..00000000 --- a/inx/inkstitch_output_EXP.inx +++ /dev/null @@ -1,19 +0,0 @@ - - - <_name>EXP file output - org.inkstitch.output.exp - inkstitch.py - inkex.py - - .exp - application/x-embroidery-exp - <_filetypename>Ink/Stitch: Melco Embroidery Format (.exp) - <_filetypetooltip>Save design in EXP format using Ink/Stitch - true - - output - exp - - diff --git a/inx/inkstitch_output_JEF.inx b/inx/inkstitch_output_JEF.inx deleted file mode 100644 index 74b752fc..00000000 --- a/inx/inkstitch_output_JEF.inx +++ /dev/null @@ -1,19 +0,0 @@ - - - <_name>JEF file output - org.inkstitch.output.jef - inkstitch.py - inkex.py - - .jef - application/x-embroidery-jef - <_filetypename>Ink/Stitch: Janome Embroidery Format (.jef) - <_filetypetooltip>Save design in JEF format using Ink/Stitch - true - - output - jef - - diff --git a/inx/inkstitch_output_PEC.inx b/inx/inkstitch_output_PEC.inx deleted file mode 100644 index 6d76b165..00000000 --- a/inx/inkstitch_output_PEC.inx +++ /dev/null @@ -1,19 +0,0 @@ - - - <_name>PEC file output - org.inkstitch.output.pec - inkstitch.py - inkex.py - - .pec - application/x-embroidery-pec - <_filetypename>Ink/Stitch: Brother Embroidery Format (.pec) - <_filetypetooltip>Save design in PEC format using Ink/Stitch - true - - output - pec - - diff --git a/inx/inkstitch_output_PES.inx b/inx/inkstitch_output_PES.inx deleted file mode 100644 index b821225a..00000000 --- a/inx/inkstitch_output_PES.inx +++ /dev/null @@ -1,19 +0,0 @@ - - - <_name>PES file output - org.inkstitch.output.pes - inkstitch.py - inkex.py - - .pes - application/x-embroidery-pes - <_filetypename>Ink/Stitch: Brother Embroidery Format (.pes) - <_filetypetooltip>Save design in PES format using Ink/Stitch - true - - output - pes - - diff --git a/inx/inkstitch_output_VP3.inx b/inx/inkstitch_output_VP3.inx deleted file mode 100644 index 11843420..00000000 --- a/inx/inkstitch_output_VP3.inx +++ /dev/null @@ -1,19 +0,0 @@ - - - <_name>VP3 file output - org.inkstitch.output.vp3 - inkstitch.py - inkex.py - - .vp3 - application/x-embroidery-vp3 - <_filetypename>Ink/Stitch: Pfaff Embroidery Format (.vp3) - <_filetypetooltip>Save design in VP3 format using Ink/Stitch - true - - output - vp3 - - diff --git a/inx/inkstitch_output_ZIP.inx b/inx/inkstitch_output_ZIP.inx deleted file mode 100644 index 81f17b23..00000000 --- a/inx/inkstitch_output_ZIP.inx +++ /dev/null @@ -1,31 +0,0 @@ - - - <_name>embroidery ZIP file output - org.inkstitch.output.zip - inkstitch.py - inkex.py - - .zip - application/zip - <_filetypename>Ink/Stitch: ZIP export multiple formats (.zip) - <_filetypetooltip>Create a ZIP with multiple embroidery file formats using Ink/Stitch - true - - - false - - false - - false - - false - - false - - false - - zip - - \ No newline at end of file diff --git a/inx/inkstitch_params.inx b/inx/inkstitch_params.inx deleted file mode 100644 index 7b3b4e63..00000000 --- a/inx/inkstitch_params.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>Params - jonh.embroider.params - inkstitch.py - inkex.py - params - - all - - - - - - diff --git a/inx/inkstitch_print.inx b/inx/inkstitch_print.inx deleted file mode 100644 index edc96a4c..00000000 --- a/inx/inkstitch_print.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>Print - jonh.embroider.print - inkstitch.py - inkex.py - print - - all - - - - - - diff --git a/inx/inkstitch_simulate.inx b/inx/inkstitch_simulate.inx deleted file mode 100644 index 66f892d8..00000000 --- a/inx/inkstitch_simulate.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>Simulate - jonh.embroider.simulate - inkstitch.py - inkex.py - simulate - - all - - - - - - diff --git a/lib/extensions/__init__.py b/lib/extensions/__init__.py index 6c8db318..1606795c 100644 --- a/lib/extensions/__init__.py +++ b/lib/extensions/__init__.py @@ -10,3 +10,13 @@ from flip import Flip from object_commands import ObjectCommands from layer_commands import LayerCommands from convert_to_satin import ConvertToSatin + +from base import InkstitchExtension +import inspect + +extensions = [] +for item in locals().values(): + if inspect.isclass(item) and \ + issubclass(item, InkstitchExtension) and \ + item is not InkstitchExtension: + extensions.append(item) diff --git a/lib/extensions/base.py b/lib/extensions/base.py index 571e3c2d..1794b68c 100644 --- a/lib/extensions/base.py +++ b/lib/extensions/base.py @@ -3,6 +3,7 @@ import re import json from copy import deepcopy from collections import MutableMapping +from stringcase import snakecase from ..svg.tags import * from ..elements import AutoFill, Fill, Stroke, SatinColumn, Polyline, EmbroideryElement @@ -98,6 +99,10 @@ class InkStitchMetadata(MutableMapping): class InkstitchExtension(inkex.Effect): """Base class for Inkstitch extensions. Not intended for direct use.""" + @classmethod + def name(cls): + return snakecase(cls.__name__) + def hide_all_layers(self): for g in self.document.getroot().findall(SVG_GROUP_TAG): if g.get(INKSCAPE_GROUPMODE) == "layer": diff --git a/lib/inx/__init__.py b/lib/inx/__init__.py new file mode 100644 index 00000000..32b8bfae --- /dev/null +++ b/lib/inx/__init__.py @@ -0,0 +1 @@ +from generate import generate_inx_files diff --git a/lib/inx/extensions.py b/lib/inx/extensions.py new file mode 100755 index 00000000..ba206d8f --- /dev/null +++ b/lib/inx/extensions.py @@ -0,0 +1,21 @@ +import pyembroidery + +from .utils import build_environment, write_inx_file +from .outputs import pyembroidery_output_formats +from ..extensions import extensions + + +def pyembroidery_debug_formats(): + for format in pyembroidery.supported_formats(): + if 'writer' in format and format['category'] != 'embroidery': + yield format['extension'], format['description'] + + +def generate_extension_inx_files(): + env = build_environment() + + for extension in extensions: + name = extension.name() + template = env.get_template('%s.inx' % name) + write_inx_file(name, template.render(formats=pyembroidery_output_formats(), + debug_formats=pyembroidery_debug_formats())) diff --git a/lib/inx/generate.py b/lib/inx/generate.py new file mode 100644 index 00000000..4773a92d --- /dev/null +++ b/lib/inx/generate.py @@ -0,0 +1,8 @@ +from .inputs import generate_input_inx_files +from .outputs import generate_output_inx_files +from .extensions import generate_extension_inx_files + +def generate_inx_files(): + generate_input_inx_files() + generate_output_inx_files() + generate_extension_inx_files() diff --git a/lib/inx/inputs.py b/lib/inx/inputs.py new file mode 100755 index 00000000..d40ffeaf --- /dev/null +++ b/lib/inx/inputs.py @@ -0,0 +1,18 @@ +import pyembroidery + +from .utils import build_environment, write_inx_file + + +def pyembroidery_input_formats(): + for format in pyembroidery.supported_formats(): + if 'reader' in format and format['category'] == 'embroidery': + yield format['extension'], format['description'] + + +def generate_input_inx_files(): + env = build_environment() + template = env.get_template('input.inx') + + for format, description in pyembroidery_input_formats(): + name = "input_%s" % format.upper() + write_inx_file(name, template.render(format=format, description=description)) diff --git a/lib/inx/outputs.py b/lib/inx/outputs.py new file mode 100644 index 00000000..aef0c8b5 --- /dev/null +++ b/lib/inx/outputs.py @@ -0,0 +1,18 @@ +import pyembroidery + +from .utils import build_environment, write_inx_file + + +def pyembroidery_output_formats(): + for format in pyembroidery.supported_formats(): + if 'writer' in format and format['category'] == 'embroidery': + yield format['extension'], format['description'] + + +def generate_output_inx_files(): + env = build_environment() + template = env.get_template('output.inx') + + for format, description in pyembroidery_output_formats(): + name = "output_%s" % format.upper() + write_inx_file(name, template.render(format=format, description=description)) diff --git a/lib/inx/utils.py b/lib/inx/utils.py new file mode 100644 index 00000000..da0a4614 --- /dev/null +++ b/lib/inx/utils.py @@ -0,0 +1,26 @@ +import os +from os.path import dirname +from jinja2 import Environment, FileSystemLoader + +from ..i18n import translation as inkstitch_translation + + +_top_path = dirname(dirname(dirname(os.path.realpath(__file__)))) +inx_path = os.path.join(_top_path, "inx") +template_path = os.path.join(_top_path, "templates") + +def build_environment(): + env = Environment( + loader = FileSystemLoader(template_path), + autoescape = True, + extensions=['jinja2.ext.i18n'] + ) + + env.install_gettext_translations(inkstitch_translation) + + return env + +def write_inx_file(name, contents): + inx_file_name = "inkstitch_%s.inx" % name + with open(os.path.join(inx_path, inx_file_name), 'w') as inx_file: + print >> inx_file, contents diff --git a/messages.po b/messages.po index 30ceee9e..5de56d8f 100644 --- a/messages.po +++ b/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-08-17 23:02-0400\n" +"POT-Creation-Date: 2018-08-19 22:14-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -369,15 +369,15 @@ msgid "" "be dashed to indicate running stitch. Any kind of dash will work." msgstr "" -#: lib/extensions/base.py:108 +#: lib/extensions/base.py:113 msgid "No embroiderable paths selected." msgstr "" -#: lib/extensions/base.py:110 +#: lib/extensions/base.py:115 msgid "No embroiderable paths found in document." msgstr "" -#: lib/extensions/base.py:111 +#: lib/extensions/base.py:116 msgid "Tip: use Path -> Object to Path to convert non-paths." msgstr "" diff --git a/requirements.txt b/requirements.txt index 8fbea7cd..84bb1d51 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,6 +9,7 @@ numpy jinja2 requests colormath +stringcase # We're not ready for flask 1.0 yet. Logging changed, among othe things. flask==0.* diff --git a/templates/convert_to_satin.inx b/templates/convert_to_satin.inx new file mode 100644 index 00000000..d71b2081 --- /dev/null +++ b/templates/convert_to_satin.inx @@ -0,0 +1,17 @@ + + + <_name>Convert Line to Satin + org.inkstitch.convert_to_satin + inkstitch.py + inkex.py + convert_to_satin + + all + + + + + + diff --git a/templates/embroider.inx b/templates/embroider.inx new file mode 100644 index 00000000..7c6544db --- /dev/null +++ b/templates/embroider.inx @@ -0,0 +1,28 @@ + + + <_name>Embroider + jonh.embroider + inkstitch.py + inkex.py + 3.0 + true + + {% for format, description in formats %} + <_option value="{{ format }}">{{ description }} ({{ format | upper }}) + {% endfor %} + {% for format, description in debug_formats %} + <_option value="{{ format }}">{{ description }} ({{ format | upper }}) [DEBUG] + {% endfor %} + + + embroider + + all + + + + + + diff --git a/templates/embroider_input.inx b/templates/embroider_input.inx deleted file mode 100644 index 15ccdef8..00000000 --- a/templates/embroider_input.inx +++ /dev/null @@ -1,17 +0,0 @@ - - - <_name>{{ format | upper }} file input - org.inkstitch.input.{{ format }} - inkstitch.py - inkex.py - - .{{ format }} - application/x-embroidery-{{ format }} - <_filetypename>Ink/Stitch: {{ description }} (.{{ format }}) - <_filetypetooltip>convert {{ format | upper }} file to Ink/Stitch manual-stitch paths - - input - - diff --git a/templates/embroider_output.inx b/templates/embroider_output.inx deleted file mode 100644 index 4f971fb3..00000000 --- a/templates/embroider_output.inx +++ /dev/null @@ -1,19 +0,0 @@ - - - <_name>{{ format | upper }} file output - org.inkstitch.output.{{ format }} - inkstitch.py - inkex.py - - .{{ format }} - application/x-embroidery-{{ format }} - <_filetypename>Ink/Stitch: {{ description }} (.{{ format }}) - <_filetypetooltip>Save design in {{ format | upper }} format using Ink/Stitch - true - - output - {{ format }} - - diff --git a/templates/embroider_zip_output.inx b/templates/embroider_zip_output.inx deleted file mode 100644 index 5d162357..00000000 --- a/templates/embroider_zip_output.inx +++ /dev/null @@ -1,21 +0,0 @@ - - - <_name>embroidery ZIP file output - org.inkstitch.output.zip - inkstitch.py - inkex.py - - .zip - application/zip - <_filetypename>Ink/Stitch: ZIP export multiple formats (.zip) - <_filetypetooltip>Create a ZIP with multiple embroidery file formats using Ink/Stitch - true - -{% for format, description in formats %} - false -{% endfor %} - zip - - diff --git a/templates/flip.inx b/templates/flip.inx new file mode 100644 index 00000000..f129b8d9 --- /dev/null +++ b/templates/flip.inx @@ -0,0 +1,17 @@ + + + <_name>Flip Satin Columns + org.inkstitch.flip_satins + inkstitch.py + inkex.py + flip + + all + + + + + + diff --git a/templates/input.inx b/templates/input.inx new file mode 100644 index 00000000..15ccdef8 --- /dev/null +++ b/templates/input.inx @@ -0,0 +1,17 @@ + + + <_name>{{ format | upper }} file input + org.inkstitch.input.{{ format }} + inkstitch.py + inkex.py + + .{{ format }} + application/x-embroidery-{{ format }} + <_filetypename>Ink/Stitch: {{ description }} (.{{ format }}) + <_filetypetooltip>convert {{ format | upper }} file to Ink/Stitch manual-stitch paths + + input + + diff --git a/templates/install.inx b/templates/install.inx new file mode 100644 index 00000000..7275e13a --- /dev/null +++ b/templates/install.inx @@ -0,0 +1,17 @@ + + + <_name>Install add-ons for Inkscape + org.inkstitch.install + inkstitch.py + inkex.py + install + + all + + + + + + diff --git a/templates/layer_commands.inx b/templates/layer_commands.inx new file mode 100644 index 00000000..7eadd094 --- /dev/null +++ b/templates/layer_commands.inx @@ -0,0 +1,19 @@ + + + <_name>Add Layer Commands + org.inkstitch.layer_commands + inkstitch.py + inkex.py + Commands will be added to the currently-selected layer. + false + layer_commands + + all + + + + + + diff --git a/templates/object_commands.inx b/templates/object_commands.inx new file mode 100644 index 00000000..bba8602b --- /dev/null +++ b/templates/object_commands.inx @@ -0,0 +1,22 @@ + + + <_name>Attach Commands + org.inkstitch.commands + inkstitch.py + inkex.py + false + false + false + false + false + object_commands + + all + + + + + + diff --git a/templates/output.inx b/templates/output.inx new file mode 100644 index 00000000..4f971fb3 --- /dev/null +++ b/templates/output.inx @@ -0,0 +1,19 @@ + + + <_name>{{ format | upper }} file output + org.inkstitch.output.{{ format }} + inkstitch.py + inkex.py + + .{{ format }} + application/x-embroidery-{{ format }} + <_filetypename>Ink/Stitch: {{ description }} (.{{ format }}) + <_filetypetooltip>Save design in {{ format | upper }} format using Ink/Stitch + true + + output + {{ format }} + + diff --git a/templates/params.inx b/templates/params.inx new file mode 100644 index 00000000..7b3b4e63 --- /dev/null +++ b/templates/params.inx @@ -0,0 +1,17 @@ + + + <_name>Params + jonh.embroider.params + inkstitch.py + inkex.py + params + + all + + + + + + diff --git a/templates/print.inx b/templates/print.inx new file mode 100644 index 00000000..edc96a4c --- /dev/null +++ b/templates/print.inx @@ -0,0 +1,17 @@ + + + <_name>Print + jonh.embroider.print + inkstitch.py + inkex.py + print + + all + + + + + + diff --git a/templates/simulate.inx b/templates/simulate.inx new file mode 100644 index 00000000..66f892d8 --- /dev/null +++ b/templates/simulate.inx @@ -0,0 +1,17 @@ + + + <_name>Simulate + jonh.embroider.simulate + inkstitch.py + inkex.py + simulate + + all + + + + + + diff --git a/templates/zip.inx b/templates/zip.inx new file mode 100644 index 00000000..c85e849f --- /dev/null +++ b/templates/zip.inx @@ -0,0 +1,21 @@ + + + <_name>embroidery ZIP file output + org.inkstitch.output.zip + inkstitch.py + inkex.py + + .zip + application/zip + <_filetypename>Ink/Stitch: ZIP export multiple formats (.zip) + <_filetypetooltip>Create a ZIP with multiple embroidery file formats using Ink/Stitch + true + + {% for format, description in formats %} + false + {% endfor %} + zip + + -- cgit v1.2.3 From 5a889dbfdaa470392d39354c44e7685c055fd33d Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Sun, 19 Aug 2018 22:21:28 -0400 Subject: make it easier to find inkex.py --- .travis.yml | 3 ++- bin/build-dist | 2 +- bin/generate-inx-files | 9 ++++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index a3f6360b..d999f238 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,7 +38,8 @@ install: if [ -n "$BUILD" ]; then # Need this for inkex.py and friends wget -q https://inkscape.org/en/gallery/item/12187/inkscape-0.92.3.tar.bz2 - tar jxf inkscape-0.92.3.tar.bz2 + mkdir inkscape + (cd inkscape; tar jxf --strip-components=1 inkscape-0.92.3.tar.bz2) rm inkscape-0.92.3.tar.bz2 fi if [ "$BUILD" = "linux" ]; then diff --git a/bin/build-dist b/bin/build-dist index a96b7506..c740c782 100755 --- a/bin/build-dist +++ b/bin/build-dist @@ -29,7 +29,7 @@ if [ "$TRAVIS_OS_NAME" = "osx" ]; then fi # This lets pyinstaller see inkex.py, etc. -pyinstaller_args+="-p inkscape-0.92.3/share/extensions " +pyinstaller_args+="-p inkscape/share/extensions " # output useful debugging info that helps us trace library dependency issues pyinstaller_args+="--log-level DEBUG " diff --git a/bin/generate-inx-files b/bin/generate-inx-files index f7b7a801..a16fb32e 100755 --- a/bin/generate-inx-files +++ b/bin/generate-inx-files @@ -4,7 +4,14 @@ import sys import os from os.path import dirname -sys.path.append(os.path.join(dirname(dirname(__file__)))) +# add inkstitch libs to python path +parent_dir = os.path.join(dirname(dirname(__file__))) +sys.path.append(parent_dir) + +# try find add inkex.py et al. as well +sys.path.append(os.path.join(parent_dir, "inkscape", "share", "extensions")) +sys.path.append(os.path.join("/usr/share/inkscape/extensions")) + from lib.inx import generate_inx_files generate_inx_files() -- cgit v1.2.3 From f99e553d989945e44f81bd56307cb9c9a049b3a2 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Mon, 20 Aug 2018 15:07:12 -0400 Subject: add mkdir -p inx bin/generate-inx-files target and gitignore entry --- .gitignore | 1 + Makefile | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3986ba50..321f4996 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ dist/ build/ locales/ +/inx/ diff --git a/Makefile b/Makefile index 4c31f17e..1cc223e4 100644 --- a/Makefile +++ b/Makefile @@ -23,11 +23,16 @@ dist: distclean locales distclean: rm -rf build dist *.spec *.tar.gz +.PHONY: inx +inx: + mkdir -p inx + bin/generate-inx-files + +.PHONY: messages.po messages.po: rm -f messages.po pybabel extract -o messages.po -F babel.conf --add-location=full --add-comments=l10n,L10n,L10N --sort-by-file --strip-comments . -.PHONY: messages.po .PHONY: locales locales: # message files will look like this: -- cgit v1.2.3 From f7f59efd7d5117c6b9b43b100df5fe646ea46bc3 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Mon, 20 Aug 2018 15:17:55 -0400 Subject: gettextify pyembroidery format descriptions --- Makefile | 2 + bin/pyembroidery-gettext | 10 +++ messages.po | 161 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 172 insertions(+), 1 deletion(-) create mode 100755 bin/pyembroidery-gettext diff --git a/Makefile b/Makefile index 1cc223e4..a91eabe1 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,9 @@ inx: .PHONY: messages.po messages.po: rm -f messages.po + bin/pyembroidery-gettext > pyembroidery-format-descriptions.py pybabel extract -o messages.po -F babel.conf --add-location=full --add-comments=l10n,L10n,L10N --sort-by-file --strip-comments . + rm pyembroidery-format-descriptions.py .PHONY: locales locales: diff --git a/bin/pyembroidery-gettext b/bin/pyembroidery-gettext new file mode 100755 index 00000000..ac9bd1ab --- /dev/null +++ b/bin/pyembroidery-gettext @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +import pyembroidery + + +# generate fake python code containing the descriptions of pyembroidery formats +# as gettext calls so that pybabel will extract them into messages.po +for format in pyembroidery.supported_formats(): + print "# L10N description for pyembroidery file format: %s" % format['extension'] + print "_(%s)" % repr(format['description']) diff --git a/messages.po b/messages.po index 5de56d8f..cfe111bc 100644 --- a/messages.po +++ b/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-08-19 22:14-0400\n" +"POT-Creation-Date: 2018-08-20 15:17-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -943,3 +943,162 @@ msgstr "" msgid "Realistic" msgstr "" +#. description for pyembroidery file format: pec +#. description for pyembroidery file format: pes +#. description for pyembroidery file format: phb +#. description for pyembroidery file format: phc +#: pyembroidery-format-descriptions.py:2 pyembroidery-format-descriptions.py:4 +#: pyembroidery-format-descriptions.py:56 +#: pyembroidery-format-descriptions.py:58 +msgid "Brother Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: exp +#: pyembroidery-format-descriptions.py:6 +msgid "Melco Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: dst +#. description for pyembroidery file format: tbf +#: pyembroidery-format-descriptions.py:8 pyembroidery-format-descriptions.py:48 +msgid "Tajima Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: jef +#. description for pyembroidery file format: sew +#. description for pyembroidery file format: jpx +#: pyembroidery-format-descriptions.py:10 +#: pyembroidery-format-descriptions.py:20 +#: pyembroidery-format-descriptions.py:74 +msgid "Janome Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: vp3 +#. description for pyembroidery file format: ksm +#. description for pyembroidery file format: max +#. description for pyembroidery file format: pcd +#. description for pyembroidery file format: pcq +#. description for pyembroidery file format: pcm +#. description for pyembroidery file format: pcs +#: pyembroidery-format-descriptions.py:12 +#: pyembroidery-format-descriptions.py:50 +#: pyembroidery-format-descriptions.py:62 +#: pyembroidery-format-descriptions.py:66 +#: pyembroidery-format-descriptions.py:68 +#: pyembroidery-format-descriptions.py:70 +#: pyembroidery-format-descriptions.py:72 +msgid "Pfaff Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: svg +#: pyembroidery-format-descriptions.py:14 +msgid "Scalable Vector Graphics" +msgstr "" + +#. description for pyembroidery file format: csv +#: pyembroidery-format-descriptions.py:16 +msgid "Comma-separated values" +msgstr "" + +#. description for pyembroidery file format: xxx +#: pyembroidery-format-descriptions.py:18 +msgid "Singer Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: u01 +#: pyembroidery-format-descriptions.py:22 +msgid "Barudan Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: shv +#: pyembroidery-format-descriptions.py:24 +msgid "Husqvarna Viking Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: 10o +#. description for pyembroidery file format: 100 +#: pyembroidery-format-descriptions.py:26 +#: pyembroidery-format-descriptions.py:28 +msgid "Toyota Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: bro +#: pyembroidery-format-descriptions.py:30 +msgid "Bits & Volts Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: dat +#: pyembroidery-format-descriptions.py:32 +msgid "Sunstar or Barudan Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: dsb +#: pyembroidery-format-descriptions.py:34 +msgid "Tajima(Barudan) Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: dsz +#: pyembroidery-format-descriptions.py:36 +msgid "ZSK USA Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: emd +#: pyembroidery-format-descriptions.py:38 +msgid "Elna Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: exy +#: pyembroidery-format-descriptions.py:40 +msgid "Eltac Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: fxy +#: pyembroidery-format-descriptions.py:42 +msgid "Fortron Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: gt +#: pyembroidery-format-descriptions.py:44 +msgid "Gold Thread Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: inb +#: pyembroidery-format-descriptions.py:46 +msgid "Inbro Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: tap +#: pyembroidery-format-descriptions.py:52 +msgid "Happy Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: stx +#: pyembroidery-format-descriptions.py:54 +msgid "Data Stitch Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: new +#: pyembroidery-format-descriptions.py:60 +msgid "Ameco Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: mit +#: pyembroidery-format-descriptions.py:64 +msgid "Mitsubishi Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: stc +#: pyembroidery-format-descriptions.py:76 +msgid "Gunold Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: zxy +#: pyembroidery-format-descriptions.py:78 +msgid "ZSK TC Embroidery Format" +msgstr "" + +#. description for pyembroidery file format: pmv +#: pyembroidery-format-descriptions.py:80 +msgid "Brother Stitch Format" +msgstr "" + -- cgit v1.2.3 From 871358d990d4a06b2eaaf0e405f2d18e26753d52 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Mon, 20 Aug 2018 15:49:19 -0400 Subject: gettextify INX templates --- Makefile | 2 +- lib/commands.py | 28 ++++++++++++++-------------- lib/i18n.py | 5 +++++ lib/inx/extensions.py | 5 ++++- messages.po | 14 +++++++------- templates/convert_to_satin.inx | 4 ++-- templates/embroider.inx | 18 +++++++++--------- templates/flip.inx | 4 ++-- templates/input.inx | 6 +++--- templates/install.inx | 4 ++-- templates/layer_commands.inx | 10 ++++++---- templates/object_commands.inx | 13 +++++-------- templates/output.inx | 6 +++--- templates/params.inx | 6 +++--- templates/print.inx | 6 +++--- templates/simulate.inx | 6 +++--- templates/zip.inx | 8 ++++---- 17 files changed, 76 insertions(+), 69 deletions(-) diff --git a/Makefile b/Makefile index a91eabe1..a7fd0e83 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ inx: messages.po: rm -f messages.po bin/pyembroidery-gettext > pyembroidery-format-descriptions.py - pybabel extract -o messages.po -F babel.conf --add-location=full --add-comments=l10n,L10n,L10N --sort-by-file --strip-comments . + pybabel extract -o messages.po -F babel.conf --add-location=full --add-comments=l10n,L10n,L10N --sort-by-file --strip-comments -k N_ . rm pyembroidery-format-descriptions.py .PHONY: locales diff --git a/lib/commands.py b/lib/commands.py index 5a471c2e..214b5f40 100644 --- a/lib/commands.py +++ b/lib/commands.py @@ -4,26 +4,26 @@ import cubicsuperpath from .svg import apply_transforms from .svg.tags import SVG_USE_TAG, SVG_SYMBOL_TAG, CONNECTION_START, CONNECTION_END, XLINK_HREF from .utils import cache -from .i18n import _ +from .i18n import _, N_ COMMANDS = { - # l10n: command attached to an object - "fill_start": _("Fill stitch starting position"), + # L10N command attached to an object + "fill_start": N_("Fill stitch starting position"), - # l10n: command attached to an object - "fill_end": _("Fill stitch ending position"), + # L10N command attached to an object + "fill_end": N_("Fill stitch ending position"), - # l10n: command attached to an object - "stop": _("Stop (pause machine) after sewing this object"), + # L10N command attached to an object + "stop": N_("Stop (pause machine) after sewing this object"), - # l10n: command attached to an object - "trim": _("Trim thread after sewing this object"), + # L10N command attached to an object + "trim": N_("Trim thread after sewing this object"), - # l10n: command attached to an object - "ignore_object": _("Ignore this object (do not stitch)"), + # L10N command attached to an object + "ignore_object": N_("Ignore this object (do not stitch)"), - # l10n: command that affects entire layer - "ignore_layer": _("Ignore layer (do not stitch any objects in this layer)") + # L10N command that affects entire layer + "ignore_layer": N_("Ignore layer (do not stitch any objects in this layer)") } OBJECT_COMMANDS = [ "fill_start", "fill_end", "stop", "trim", "ignore_object" ] @@ -117,7 +117,7 @@ class StandaloneCommand(BaseCommand): self.parse_symbol() def get_command_description(command): - return COMMANDS[command] + return _(COMMANDS[command]) def find_commands(node): diff --git a/lib/i18n.py b/lib/i18n.py index d20f5d2f..06e0dd49 100644 --- a/lib/i18n.py +++ b/lib/i18n.py @@ -4,6 +4,11 @@ import gettext _ = translation = None +# Use N_ to mark a string for translation but _not_ immediately translate it. +# reference: https://docs.python.org/3/library/gettext.html#deferred-translations +# Makefile configures pybabel to treat N_() the same as _() +def N_(message): return message + def localize(): if getattr(sys, 'frozen', False): # we are in a pyinstaller installation diff --git a/lib/inx/extensions.py b/lib/inx/extensions.py index ba206d8f..2b097440 100755 --- a/lib/inx/extensions.py +++ b/lib/inx/extensions.py @@ -2,7 +2,7 @@ import pyembroidery from .utils import build_environment, write_inx_file from .outputs import pyembroidery_output_formats -from ..extensions import extensions +from ..extensions import extensions, Input, Output def pyembroidery_debug_formats(): @@ -15,6 +15,9 @@ def generate_extension_inx_files(): env = build_environment() for extension in extensions: + if extension is Input or extension is Output: + continue + name = extension.name() template = env.get_template('%s.inx' % name) write_inx_file(name, template.render(formats=pyembroidery_output_formats(), diff --git a/messages.po b/messages.po index cfe111bc..0dcd185a 100644 --- a/messages.po +++ b/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-08-20 15:17-0400\n" +"POT-Creation-Date: 2018-08-20 15:49-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,32 +17,32 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.3\n" -#. : command attached to an object +#. command attached to an object #: lib/commands.py:11 msgid "Fill stitch starting position" msgstr "" -#. : command attached to an object +#. command attached to an object #: lib/commands.py:14 msgid "Fill stitch ending position" msgstr "" -#. : command attached to an object +#. command attached to an object #: lib/commands.py:17 msgid "Stop (pause machine) after sewing this object" msgstr "" -#. : command attached to an object +#. command attached to an object #: lib/commands.py:20 msgid "Trim thread after sewing this object" msgstr "" -#. : command attached to an object +#. command attached to an object #: lib/commands.py:23 msgid "Ignore this object (do not stitch)" msgstr "" -#. : command that affects entire layer +#. command that affects entire layer #: lib/commands.py:26 msgid "Ignore layer (do not stitch any objects in this layer)" msgstr "" diff --git a/templates/convert_to_satin.inx b/templates/convert_to_satin.inx index d71b2081..446e4b5c 100644 --- a/templates/convert_to_satin.inx +++ b/templates/convert_to_satin.inx @@ -1,6 +1,6 @@ - <_name>Convert Line to Satin + {% trans %}Convert Line to Satin{% endtrans %} org.inkstitch.convert_to_satin inkstitch.py inkex.py @@ -8,7 +8,7 @@ all - +