kopia lustrzana https://github.com/inkstitch/inkstitch
remove some pattern and marker mixups and some style issues
rodzic
95a9331616
commit
82216b184c
|
|
@ -3,27 +3,26 @@
|
|||
# Copyright (c) 2010 Authors
|
||||
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
|
||||
|
||||
import logging
|
||||
import math
|
||||
import re
|
||||
import sys
|
||||
import traceback
|
||||
import re
|
||||
import logging
|
||||
import inkex
|
||||
|
||||
import inkex
|
||||
from shapely import geometry as shgeo
|
||||
from shapely.validation import explain_validity
|
||||
|
||||
from ..i18n import _
|
||||
from ..marker import get_marker_elements
|
||||
from ..stitch_plan import StitchGroup
|
||||
from ..stitches import auto_fill, fill
|
||||
from ..stitches import StitchPattern
|
||||
from ..utils import cache, version
|
||||
from .element import param
|
||||
from .element import EmbroideryElement
|
||||
from ..patterns import get_patterns
|
||||
from .validation import ValidationWarning
|
||||
from ..utils import Point as InkstitchPoint
|
||||
from ..stitches import StitchPattern, auto_fill, fill
|
||||
from ..svg import PIXELS_PER_MM
|
||||
from ..svg.tags import INKSCAPE_LABEL
|
||||
from ..utils import Point as InkstitchPoint
|
||||
from ..utils import cache, version
|
||||
from .element import EmbroideryElement, param
|
||||
from .validation import ValidationWarning
|
||||
|
||||
|
||||
class SmallShapeWarning(ValidationWarning):
|
||||
|
|
@ -393,7 +392,8 @@ class AutoFill(EmbroideryElement):
|
|||
else:
|
||||
return None
|
||||
|
||||
def to_stitch_groups(self, last_patch):
|
||||
def to_stitch_groups(self, last_patch): # noqa: C901
|
||||
# TODO: split this up do_legacy_fill() etc.
|
||||
stitch_groups = []
|
||||
|
||||
starting_point = self.get_starting_point(last_patch)
|
||||
|
|
@ -458,9 +458,8 @@ class AutoFill(EmbroideryElement):
|
|||
stitches=path)
|
||||
stitch_groups.append(stitch_group)
|
||||
elif self.fill_method == 2: # Guided Auto Fill
|
||||
lines = get_patterns(
|
||||
self.node, "#inkstitch-guide-line-marker", False, True)
|
||||
lines = lines['stroke_patterns']
|
||||
lines = get_marker_elements(self.node, "guide-line", False, True)
|
||||
lines = lines['stroke']
|
||||
if not lines or lines[0].is_empty:
|
||||
inkex.errormsg(
|
||||
_("No line marked as guide line found within the same group as patch"))
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
|
||||
|
||||
from ..commands import is_command
|
||||
from ..patterns import is_pattern
|
||||
from ..marker import has_marker
|
||||
from ..svg.tags import (EMBROIDERABLE_TAGS, SVG_IMAGE_TAG, SVG_PATH_TAG,
|
||||
SVG_POLYLINE_TAG, SVG_TEXT_TAG)
|
||||
from .auto_fill import AutoFill
|
||||
|
|
@ -29,7 +29,7 @@ def node_to_elements(node): # noqa: C901
|
|||
elif node.tag == SVG_PATH_TAG and not node.get('d', ''):
|
||||
return [EmptyDObject(node)]
|
||||
|
||||
elif is_pattern(node):
|
||||
elif has_marker(node, 'pattern'):
|
||||
return [PatternObject(node)]
|
||||
|
||||
elif node.tag in EMBROIDERABLE_TAGS:
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ from ..commands import is_command, layer_commands
|
|||
from ..elements import EmbroideryElement, nodes_to_elements
|
||||
from ..elements.clone import is_clone
|
||||
from ..i18n import _
|
||||
from ..patterns import is_pattern
|
||||
from ..marker import has_marker
|
||||
from ..svg import generate_unique_id
|
||||
from ..svg.tags import (CONNECTOR_TYPE, EMBROIDERABLE_TAGS, INKSCAPE_GROUPMODE,
|
||||
NOT_EMBROIDERABLE_TAGS, SVG_DEFS_TAG, SVG_GROUP_TAG)
|
||||
|
|
@ -161,10 +161,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 is_pattern(node):
|
||||
elif (node.tag in EMBROIDERABLE_TAGS or is_clone(node)) and not has_marker(node, 'pattern'):
|
||||
nodes.append(node)
|
||||
# add images, text and patterns for the troubleshoot extension
|
||||
elif troubleshoot and (node.tag in NOT_EMBROIDERABLE_TAGS or is_pattern(node)):
|
||||
elif troubleshoot and (node.tag in NOT_EMBROIDERABLE_TAGS or has_marker(node, 'pattern')):
|
||||
nodes.append(node)
|
||||
|
||||
return nodes
|
||||
|
|
|
|||
|
|
@ -296,7 +296,7 @@ class ParamsTab(ScrolledPanel):
|
|||
widgets[3].Show(True)
|
||||
choice["last_initialized_choice"] = current_selection
|
||||
|
||||
def __do_layout(self, only_settings_grid=False):
|
||||
def __do_layout(self, only_settings_grid=False): # noqa: C901
|
||||
|
||||
# just to add space around the settings
|
||||
box = wx.BoxSizer(wx.VERTICAL)
|
||||
|
|
|
|||
|
|
@ -7,10 +7,12 @@ from copy import deepcopy
|
|||
from os import path
|
||||
|
||||
import inkex
|
||||
from shapely import geometry as shgeo
|
||||
|
||||
from .svg.tags import EMBROIDERABLE_TAGS
|
||||
from .utils import cache, get_bundled_dir
|
||||
|
||||
MARKER = ['pattern']
|
||||
MARKER = ['pattern', 'guide-line']
|
||||
|
||||
|
||||
def ensure_marker(svg, marker):
|
||||
|
|
@ -35,3 +37,40 @@ def set_marker(node, position, marker):
|
|||
style = [i for i in style if not i.startswith('marker-%s' % position)]
|
||||
style.append('marker-%s:url(#inkstitch-%s-marker)' % (position, marker))
|
||||
node.set('style', ";".join(style))
|
||||
|
||||
|
||||
def get_marker_elements(node, marker, get_fills=True, get_strokes=True):
|
||||
from .elements import EmbroideryElement
|
||||
from .elements.stroke import Stroke
|
||||
|
||||
fills = []
|
||||
strokes = []
|
||||
xpath = "./parent::svg:g/*[contains(@style, 'marker-start:url(#inkstitch-%s-marker)')]" % marker
|
||||
markers = node.xpath(xpath, namespaces=inkex.NSS)
|
||||
for marker in markers:
|
||||
if marker.tag not in EMBROIDERABLE_TAGS:
|
||||
continue
|
||||
|
||||
element = EmbroideryElement(marker)
|
||||
fill = element.get_style('fill')
|
||||
stroke = element.get_style('stroke')
|
||||
|
||||
if get_fills and fill is not None:
|
||||
fill = Stroke(marker).paths
|
||||
linear_rings = [shgeo.LinearRing(path) for path in fill]
|
||||
for ring in linear_rings:
|
||||
fills.append(shgeo.Polygon(ring))
|
||||
|
||||
if get_strokes and stroke is not None:
|
||||
stroke = Stroke(marker).paths
|
||||
line_strings = [shgeo.LineString(path) for path in stroke]
|
||||
strokes.append(shgeo.MultiLineString(line_strings))
|
||||
|
||||
return {'fill': fills, 'stroke': strokes}
|
||||
|
||||
|
||||
def has_marker(node, marker):
|
||||
if node.tag not in EMBROIDERABLE_TAGS:
|
||||
return False
|
||||
style = node.get('style') or ''
|
||||
return "marker-start:url(#inkstitch-%s-marker)" % marker in style
|
||||
|
|
|
|||
|
|
@ -3,25 +3,17 @@
|
|||
# Copyright (c) 2010 Authors
|
||||
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
|
||||
|
||||
import inkex
|
||||
from shapely import geometry as shgeo
|
||||
|
||||
from .marker import get_marker_elements
|
||||
from .stitch_plan import Stitch
|
||||
from .svg.tags import EMBROIDERABLE_TAGS
|
||||
from .utils import Point
|
||||
|
||||
|
||||
def is_pattern(node):
|
||||
if node.tag not in EMBROIDERABLE_TAGS:
|
||||
return False
|
||||
style = node.get('style') or ''
|
||||
return "marker-start:url(#inkstitch-pattern-marker)" in style
|
||||
|
||||
|
||||
def apply_patterns(patches, node):
|
||||
patterns = get_patterns(node, "#inkstitch-pattern-marker")
|
||||
_apply_fill_patterns(patterns['fill_patterns'], patches)
|
||||
_apply_stroke_patterns(patterns['stroke_patterns'], patches)
|
||||
patterns = get_marker_elements(node, "pattern")
|
||||
_apply_fill_patterns(patterns['fill'], patches)
|
||||
_apply_stroke_patterns(patterns['stroke'], patches)
|
||||
|
||||
|
||||
def _apply_stroke_patterns(patterns, patches):
|
||||
|
|
@ -32,8 +24,7 @@ def _apply_stroke_patterns(patterns, patches):
|
|||
patch_points.append(stitch)
|
||||
if i == len(patch.stitches) - 1:
|
||||
continue
|
||||
intersection_points = _get_pattern_points(
|
||||
stitch, patch.stitches[i+1], pattern)
|
||||
intersection_points = _get_pattern_points(stitch, patch.stitches[i+1], pattern)
|
||||
for point in intersection_points:
|
||||
patch_points.append(Stitch(point, tags=('pattern_point',)))
|
||||
patch.stitches = patch_points
|
||||
|
|
@ -65,37 +56,6 @@ def _apply_fill_patterns(patterns, patches):
|
|||
patch.stitches = patch_points
|
||||
|
||||
|
||||
def get_patterns(node, marker_id, get_fills=True, get_strokes=True):
|
||||
from .elements import EmbroideryElement
|
||||
from .elements.auto_fill import auto_fill
|
||||
from .elements.stroke import Stroke
|
||||
|
||||
fills = []
|
||||
strokes = []
|
||||
xpath = "./parent::svg:g/*[contains(@style, 'marker-start:url("+marker_id+")')]"
|
||||
patterns = node.xpath(xpath, namespaces=inkex.NSS)
|
||||
for pattern in patterns:
|
||||
if pattern.tag not in EMBROIDERABLE_TAGS:
|
||||
continue
|
||||
|
||||
element = EmbroideryElement(pattern)
|
||||
fill = element.get_style('fill')
|
||||
stroke = element.get_style('stroke')
|
||||
|
||||
if fill is not None:
|
||||
fill_pattern = Stroke(pattern).paths
|
||||
linear_rings = [shgeo.LinearRing(path) for path in fill_pattern]
|
||||
for ring in linear_rings:
|
||||
fills.append(shgeo.Polygon(ring))
|
||||
|
||||
if get_strokes and stroke is not None:
|
||||
stroke_pattern = Stroke(pattern).paths
|
||||
line_strings = [shgeo.LineString(path) for path in stroke_pattern]
|
||||
strokes.append(shgeo.MultiLineString(line_strings))
|
||||
|
||||
return {'fill_patterns': fills, 'stroke_patterns': strokes}
|
||||
|
||||
|
||||
def _get_pattern_points(first, second, pattern):
|
||||
points = []
|
||||
intersection = shgeo.LineString([first, second]).intersection(pattern)
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ import trimesh
|
|||
import numpy as np
|
||||
from scipy import spatial
|
||||
import math
|
||||
from shapely.geometry import asLineString
|
||||
from anytree import PreOrderIter
|
||||
from ..stitches import LineStringSampling
|
||||
from ..stitches import PointTransfer
|
||||
|
|
@ -52,7 +51,7 @@ def cut(line, distance):
|
|||
return LineString([(cp.x, cp.y)] + coords[i:] + coords[:i])
|
||||
|
||||
|
||||
def connect_raster_tree_nearest_neighbor(
|
||||
def connect_raster_tree_nearest_neighbor( # noqa: C901
|
||||
tree, used_offset, stitch_distance, close_point, offset_by_half):
|
||||
"""
|
||||
Takes the offsetted curves organized as tree, connects and samples them.
|
||||
|
|
@ -458,8 +457,7 @@ def calculate_replacing_middle_point(line_segment, abs_offset, max_stitch_distan
|
|||
return line_segment.coords[1]
|
||||
|
||||
|
||||
def connect_raster_tree_from_inner_to_outer(
|
||||
tree, used_offset, stitch_distance, close_point, offset_by_half):
|
||||
def connect_raster_tree_from_inner_to_outer(tree, used_offset, stitch_distance, close_point, offset_by_half): # noqa: C901
|
||||
"""
|
||||
Takes the offsetted curves organized as tree, connects and samples them.
|
||||
Strategy: A connection from parent to child is made as fast as possible to
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ def calculate_line_angles(line):
|
|||
return Angles
|
||||
|
||||
|
||||
def raster_line_string_with_priority_points(line, start_distance, end_distance, maxstitch_distance,
|
||||
def raster_line_string_with_priority_points(line, start_distance, end_distance, maxstitch_distance, # noqa: C901
|
||||
must_use_points_deque, abs_offset, offset_by_half, replace_forbidden_points):
|
||||
"""
|
||||
Rasters a line between start_distance and end_distance.
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ def calc_transferred_point(bisectorline, child):
|
|||
return point, priority
|
||||
|
||||
|
||||
def transfer_points_to_surrounding(treenode, used_offset, offset_by_half, to_transfer_points, to_transfer_points_origin=[],
|
||||
def transfer_points_to_surrounding(treenode, used_offset, offset_by_half, to_transfer_points, to_transfer_points_origin=[], # noqa: C901
|
||||
overnext_neighbor=False, transfer_forbidden_points=False,
|
||||
transfer_to_parent=True, transfer_to_sibling=True, transfer_to_child=True):
|
||||
"""
|
||||
|
|
@ -305,7 +305,7 @@ def calc_transferred_point_graph(bisectorline, edge_geometry):
|
|||
return point, priority
|
||||
|
||||
|
||||
def transfer_points_to_surrounding_graph(fill_stitch_graph, current_edge, used_offset, offset_by_half, to_transfer_points,
|
||||
def transfer_points_to_surrounding_graph(fill_stitch_graph, current_edge, used_offset, offset_by_half, to_transfer_points, # noqa: C901
|
||||
overnext_neighbor=False, transfer_forbidden_points=False, transfer_to_previous=True, transfer_to_next=True):
|
||||
"""
|
||||
Takes the current graph edge and its rastered points (to_transfer_points) and transfers these points to its previous and next edges (if selected)
|
||||
|
|
|
|||
|
|
@ -159,8 +159,7 @@ def check_and_prepare_tree_for_valid_spiral(root):
|
|||
return True
|
||||
|
||||
|
||||
def offset_poly(
|
||||
poly, offset, join_style, stitch_distance, offset_by_half, strategy, starting_point):
|
||||
def offset_poly(poly, offset, join_style, stitch_distance, offset_by_half, strategy, starting_point): # noqa: C901
|
||||
"""
|
||||
Takes a polygon (which can have holes) as input and creates offsetted
|
||||
versions until the polygon is filled with these smaller offsets.
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ def repair_non_simple_lines(line):
|
|||
return repaired
|
||||
|
||||
|
||||
def intersect_region_with_grating_line(shape, line, row_spacing, end_row_spacing=None, flip=False):
|
||||
def intersect_region_with_grating_line(shape, line, row_spacing, end_row_spacing=None, flip=False): # noqa: C901
|
||||
|
||||
row_spacing = abs(row_spacing)
|
||||
(minx, miny, maxx, maxy) = shape.bounds
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue