kopia lustrzana https://github.com/inkstitch/inkstitch
pattern markers
rodzic
2f54ff2a43
commit
ecacb9829e
|
@ -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."""
|
||||
|
||||
|
|
|
@ -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', '')
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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))
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
})
|
|
@ -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()))
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
Ładowanie…
Reference in New Issue