Lettering sortable trims (#3308)

* add trims as requested through user interface for each color block
* handle commands better
pull/3299/head dev-build-kaalleen-lettering_scale_group
Kaalleen 2024-11-30 17:36:12 +01:00 zatwierdzone przez GitHub
rodzic 13ddafb2ad
commit e0095ea846
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
2 zmienionych plików z 40 dodań i 13 usunięć

Wyświetl plik

@ -25,4 +25,7 @@ class LetteringSetColorSortIndex(InkstitchExtension):
if element.TAG == "path":
element.set('inkstitch:color_sort_index', self.options.color_sort_index)
elif element.TAG == "g":
self.set_index(element.getchildren())
if element.get_id().startswith('command_group'):
element.set('inkstitch:color_sort_index', self.options.color_sort_index)
else:
self.set_index(element.getchildren())

Wyświetl plik

@ -236,7 +236,7 @@ class Font(object):
self._set_style(destination_group)
# add trims
self._add_trims(destination_group, text, trim_option, use_trim_symbols, back_and_forth)
self._add_trims(destination_group, text, trim_option, use_trim_symbols, back_and_forth, color_sort)
# make sure necessary marker and command symbols are in the defs section
self._ensure_command_symbols(destination_group)
self._ensure_marker_symbols(destination_group)
@ -375,7 +375,7 @@ class Font(object):
el = node.find(f".//*[@id='{node_id}']")
el.clip = clip
def _add_trims(self, destination_group, text, trim_option, use_trim_symbols, back_and_forth):
def _add_trims(self, destination_group, text, trim_option, use_trim_symbols, back_and_forth, color_sort):
"""
trim_option == 0 --> no trims
trim_option == 1 --> trim at the end of each line
@ -404,21 +404,35 @@ class Font(object):
# letter
if trim_option == 3:
self._process_trim(group, use_trim_symbols)
self._process_trim(group, use_trim_symbols, color_sort)
# word
elif trim_option == 2 and i+1 in space_indices + line_break_indices:
self._process_trim(group, use_trim_symbols)
self._process_trim(group, use_trim_symbols, color_sort)
# line
elif trim_option == 1 and i+1 in line_break_indices:
self._process_trim(group, use_trim_symbols)
self._process_trim(group, use_trim_symbols, color_sort)
def _process_trim(self, group, use_trim_symbols):
# find the last path that does not carry a marker and add a trim there
for path_child in group.iterdescendants(EMBROIDERABLE_TAGS):
if not has_marker(path_child):
path = path_child
element = Stroke(path)
def _process_trim(self, group, use_trim_symbols, color_sort):
if color_sort and self.sortable:
elements = defaultdict(list)
for path_child in group.iterdescendants(EMBROIDERABLE_TAGS):
if not has_marker(path_child):
sort_index = path_child.get('inkstitch:color_sort_index', None)
if sort_index is not None:
elements[sort_index] = path_child
else:
elements[404] = path_child
for value in elements.values():
self._add_trim_to_element(Stroke(value), use_trim_symbols)
else:
# find the last path that does not carry a marker and add a trim there
for path_child in group.iterdescendants(EMBROIDERABLE_TAGS):
if not has_marker(path_child):
path = path_child
element = Stroke(path)
self._add_trim_to_element(element, use_trim_symbols)
def _add_trim_to_element(self, element, use_trim_symbols):
if element.shape:
element_id = "%s_%s" % (element.node.get('id'), randint(0, 9999))
element.node.set("id", element_id)
@ -500,9 +514,15 @@ class Font(object):
def _get_color_sorted_elements(self, group):
elements_by_color = defaultdict(list)
last_parent = None
for element in group.iterdescendants(SVG_PATH_TAG):
for element in group.iterdescendants(EMBROIDERABLE_TAGS, SVG_GROUP_TAG):
sort_index = element.get('inkstitch:color_sort_index', None)
# Skip command connectors, we only aim for command groups
# Skip command connectors as well, they will be included with the command group
if (element.TAG == 'g' and not element.get_id().startswith('command_group')
or element.get_id().startswith('command_connector')):
continue
# get glyph group to calculate transform
for ancestor in element.ancestors(group):
if ancestor.get_id().startswith("glyph"):
@ -516,6 +536,10 @@ class Font(object):
elements_by_color[404].append([element])
continue
if element.get_id().startswith('command_group'):
elements_by_color[int(sort_index)].append([element])
continue
parent = element.getparent()
if element.clip is None and parent.clip is not None:
element.clip = parent.clip