pattern markers

pull/1254/head
Kaalleen 2021-06-28 20:05:50 +02:00
rodzic 2f54ff2a43
commit ecacb9829e
11 zmienionych plików z 100 dodań i 93 usunięć

Wyświetl plik

@ -60,7 +60,6 @@ COMMANDS = {
}
OBJECT_COMMANDS = ["fill_start", "fill_end", "satin_start", "satin_end", "stop", "trim", "ignore_object", "satin_cut_point"]
GROUP_COMMANDS = ["pattern_group"]
LAYER_COMMANDS = ["ignore_layer"]
GLOBAL_COMMANDS = ["origin", "stop_position"]
@ -187,12 +186,6 @@ def find_commands(node):
return commands
def group_commands(node, command):
xpath = "./ancestor::svg:g/svg:use[@xlink:href='#inkstitch_%(command)s']" % dict(id=node.get('id'), command=command)
group_command = node.xpath(xpath, namespaces=inkex.NSS)
return group_command
def layer_commands(layer, command):
"""Find standalone (unconnected) command symbols in this layer."""

Wyświetl plik

@ -30,3 +30,7 @@ class PatternObject(EmbroideryElement):
def to_patches(self, last_patch):
return []
def is_pattern(node):
return "marker-start:url(#inkstitch-pattern-marker)" in node.get('style', '')

Wyświetl plik

@ -578,11 +578,14 @@ class SatinColumn(EmbroideryElement):
return SatinColumn(node)
def get_patterns(self):
xpath = "./ancestor::svg:g[svg:use[@xlink:href='#inkstitch_pattern_group']]//*[not(@inkstitch:satin_column='true')]"
# TODO: which one is better?!?
# All child groups of pattern
# xpath = "./ancestor::svg:g//*[contains(@style, 'marker-start:url(#inkstitch-pattern-marker)')]"
# Only direct siblings of pattern
xpath = "./parent::svg:g/*[contains(@style, 'marker-start:url(#inkstitch-pattern-marker)')]"
patterns = self.node.xpath(xpath, namespaces=NSS)
line_strings = []
for pattern in patterns:
# TODO: exclude fills in case we will want to use them with the pattern too
if pattern.tag not in EMBROIDERABLE_TAGS:
continue
d = pattern.get_path()

Wyświetl plik

@ -3,16 +3,16 @@
# Copyright (c) 2010 Authors
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
from ..commands import group_commands, is_command
from ..svg.tags import (EMBROIDERABLE_TAGS, INKSTITCH_ATTRIBS, SVG_IMAGE_TAG,
SVG_PATH_TAG, SVG_POLYLINE_TAG, SVG_TEXT_TAG)
from ..commands import is_command
from ..svg.tags import (EMBROIDERABLE_TAGS, SVG_IMAGE_TAG, SVG_PATH_TAG,
SVG_POLYLINE_TAG, SVG_TEXT_TAG)
from .auto_fill import AutoFill
from .clone import Clone, is_clone
from .element import EmbroideryElement
from .empty_d_object import EmptyDObject
from .fill import Fill
from .image import ImageObject
from .pattern import PatternObject
from .pattern import PatternObject, is_pattern
from .polyline import Polyline
from .satin_column import SatinColumn
from .stroke import Stroke
@ -29,8 +29,7 @@ def node_to_elements(node): # noqa: C901
elif node.tag == SVG_PATH_TAG and not node.get('d', ''):
return [EmptyDObject(node)]
# TODO: exclude fills
elif group_commands(node, 'pattern_group') and not node.get(INKSTITCH_ATTRIBS['satin_column']):
elif is_pattern(node):
return [PatternObject(node)]
elif node.tag in EMBROIDERABLE_TAGS:

Wyświetl plik

@ -5,6 +5,7 @@
from lib.extensions.troubleshoot import Troubleshoot
from .apply_pattern import ApplyPattern
from .auto_satin import AutoSatin
from .break_apart import BreakApart
from .cleanup import Cleanup
@ -14,7 +15,6 @@ from .duplicate_params import DuplicateParams
from .embroider_settings import EmbroiderSettings
from .flip import Flip
from .global_commands import GlobalCommands
from .group_commands import GroupCommands
from .import_threadlist import ImportThreadlist
from .input import Input
from .install import Install
@ -41,8 +41,8 @@ __all__ = extensions = [StitchPlanPreview,
Output,
Zip,
Flip,
ApplyPattern,
ObjectCommands,
GroupCommands,
LayerCommands,
GlobalCommands,
ConvertToSatin,

Wyświetl plik

@ -0,0 +1,62 @@
# Authors: see git history
#
# Copyright (c) 2021 Authors
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
import inkex
from lxml import etree
from ..i18n import _
from ..svg.tags import SVG_DEFS_TAG
from .base import InkstitchExtension
class ApplyPattern(InkstitchExtension):
# This extension will mark selected
def effect(self):
if not self.get_elements():
return
if not self.svg.selected:
inkex.errormsg(_("Please select at least one object to be marked as a pattern."))
return
for pattern in self.svg.selected.values():
self.set_marker(pattern)
def set_marker(self, node):
xpath = ".//marker[@id='inkstitch-pattern-marker']"
pattern_marker = self.document.xpath(xpath)
if not pattern_marker:
# get or create def element
defs = self.document.find(SVG_DEFS_TAG)
if defs is None:
defs = etree.SubElement(self.document, SVG_DEFS_TAG)
# insert marker
marker = """<marker
refX="10"
refY="5"
orient="auto"
id="inkstitch-pattern-marker">
<g
id="inkstitch-pattern-group">
<path
style="fill:#fafafa;stroke:#ff5500;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;stroke-opacity:1;fill-opacity:0.8;"
d="M 10.12911,5.2916678 A 4.8374424,4.8374426 0 0 1 5.2916656,10.12911 4.8374424,4.8374426 0 0 1 0.45422399,5.2916678 4.8374424,4.8374426 0 0 1 5.2916656,0.45422399 4.8374424,4.8374426 0 0 1 10.12911,5.2916678 Z"
id="inkstitch-pattern-marker-circle" />
<path
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-miterlimit:4;"
id="inkstitch-pattern-marker-spiral"
d="M 4.9673651,5.7245662 C 4.7549848,5.7646159 4.6247356,5.522384 4.6430021,5.3419847 4.6765851,5.0103151 5.036231,4.835347 5.3381858,4.8987426 5.7863901,4.9928495 6.0126802,5.4853625 5.9002872,5.9065088 5.7495249,6.4714237 5.1195537,6.7504036 4.5799191,6.5874894 3.898118,6.3816539 3.5659013,5.6122905 3.7800789,4.9545192 4.0402258,4.1556558 4.9498996,3.7699484 5.7256318,4.035839 6.6416744,4.3498087 7.0810483,5.4003986 6.7631909,6.2939744 6.395633,7.3272552 5.2038143,7.8204128 4.1924535,7.4503931 3.0418762,7.0294421 2.4948761,5.6961604 2.9171752,4.567073 3.3914021,3.2991406 4.8663228,2.6982592 6.1130974,3.1729158 7.4983851,3.7003207 8.1531869,5.3169977 7.6260947,6.6814205 7.0456093,8.1841025 5.2870784,8.8928844 3.8050073,8.3132966 2.1849115,7.6797506 1.4221671,5.7793073 2.0542715,4.1796074 2.7408201,2.4420977 4.7832541,1.6253548 6.5005435,2.310012 8.3554869,3.0495434 9.2262638,5.2339874 8.4890181,7.0688861 8.4256397,7.2266036 8.3515789,7.379984 8.2675333,7.5277183" />
</g>
</marker>""" # noqa: E501
defs.append(etree.fromstring(marker))
# attach marker to node
style = node.get('style', '').split(";")
style = [i for i in style if not i.startswith('marker-start')]
style.append('marker-start:url(#inkstitch-pattern-marker)')
node.set('style', ";".join(style))

Wyświetl plik

@ -12,14 +12,14 @@ import inkex
from lxml import etree
from stringcase import snakecase
from ..commands import group_commands, is_command, layer_commands
from ..commands import is_command, layer_commands
from ..elements import EmbroideryElement, nodes_to_elements
from ..elements.clone import is_clone
from ..elements.pattern import is_pattern
from ..i18n import _
from ..svg import generate_unique_id
from ..svg.tags import (CONNECTOR_TYPE, EMBROIDERABLE_TAGS, INKSCAPE_GROUPMODE,
INKSTITCH_ATTRIBS, NOT_EMBROIDERABLE_TAGS,
SVG_DEFS_TAG, SVG_GROUP_TAG)
NOT_EMBROIDERABLE_TAGS, SVG_DEFS_TAG, SVG_GROUP_TAG)
SVG_METADATA_TAG = inkex.addNS("metadata", "svg")
@ -171,12 +171,10 @@ class InkstitchExtension(inkex.Effect):
if selected:
if node.tag == SVG_GROUP_TAG:
pass
elif ((node.tag in EMBROIDERABLE_TAGS or is_clone(node)) and not
(len(list(group_commands(node, 'pattern_group'))) and not node.get(INKSTITCH_ATTRIBS['satin_column']))):
elif (node.tag in EMBROIDERABLE_TAGS or is_clone(node)) and not is_pattern(node):
nodes.append(node)
# add images, text and patterns for the troubleshoot extension
elif (troubleshoot and (node.tag in NOT_EMBROIDERABLE_TAGS or
(len(list(group_commands(node, 'pattern_group'))) and not node.get(INKSTITCH_ATTRIBS['satin_column'])))):
elif troubleshoot and (node.tag in NOT_EMBROIDERABLE_TAGS or is_pattern(node)):
nodes.append(node)
return nodes

Wyświetl plik

@ -1,41 +0,0 @@
# 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 inkex
from lxml import etree
from ..commands import GROUP_COMMANDS, ensure_symbol, get_command_description
from ..i18n import _
from ..svg import get_correction_transform
from ..svg.tags import INKSCAPE_LABEL, SVG_USE_TAG, XLINK_HREF
from .commands import CommandsExtension
class GroupCommands(CommandsExtension):
COMMANDS = GROUP_COMMANDS
def effect(self):
commands = [command for command in self.COMMANDS if getattr(self.options, command)]
if not commands:
inkex.errormsg(_("Please choose one or more commands to add."))
return
correction_transform = get_correction_transform(self.svg.get_current_layer(), child=True)
for i, command in enumerate(commands):
ensure_symbol(self.document, command)
etree.SubElement(self.svg.get_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%",
"x": str(i * 20),
"y": "-10",
"transform": correction_transform
})

Wyświetl plik

@ -5,8 +5,8 @@
import pyembroidery
from ..commands import (COMMANDS, GLOBAL_COMMANDS, GROUP_COMMANDS,
LAYER_COMMANDS, OBJECT_COMMANDS)
from ..commands import (COMMANDS, GLOBAL_COMMANDS, LAYER_COMMANDS,
OBJECT_COMMANDS)
from ..extensions import Input, Output, extensions
from ..threads import ThreadCatalog
from .outputs import pyembroidery_output_formats
@ -24,10 +24,6 @@ def global_commands():
return [(command, COMMANDS[command]) for command in GLOBAL_COMMANDS]
def group_commands():
return [(command, COMMANDS[command]) for command in GROUP_COMMANDS]
def object_commands():
return [(command, COMMANDS[command]) for command in OBJECT_COMMANDS]
@ -55,7 +51,6 @@ def generate_extension_inx_files():
write_inx_file(name, template.render(formats=pyembroidery_output_formats(),
debug_formats=pyembroidery_debug_formats(),
threadcatalog=threadcatalog(),
group_commands=group_commands(),
layer_commands=layer_commands(),
object_commands=object_commands(),
global_commands=global_commands()))

Wyświetl plik

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
<name>{% trans %}Apply Pattern{% endtrans %}</name>
<id>org.inkstitch.apply_pattern.{{ locale }}</id>
<param name="extension" type="string" gui-hidden="true">apply_pattern</param>
<effect>
<object-type>all</object-type>
<effects-menu>
<submenu name="Ink/Stitch" />
</effects-menu>
</effect>
<script>
{{ command_tag | safe }}
</script>
</inkscape-extension>

Wyświetl plik

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
<name>{% trans %}Add Group Commands{% endtrans %}</name>
<id>org.inkstitch.group_commands.{{ locale }}</id>
<param name="description" type="description">{% trans %}Commands will be added to the currently-selected group.{% endtrans %}</param>
{% for command, description in group_commands %}
<param name="{{ command }}" type="boolean" _gui-text="{{ _(description) }}">false</param>
{% endfor %}
<param name="extension" type="string" gui-hidden="true">group_commands</param>
<effect>
<object-type>all</object-type>
<effects-menu>
<submenu name="Ink/Stitch">
<submenu name="{% trans %}Commands{% endtrans %}" />
</submenu>
</effects-menu>
</effect>
<script>
{{ command_tag | safe }}
</script>
</inkscape-extension>