inkstitch/lib/extensions/apply_palette.py

50 wiersze
1.9 KiB
Python

# Authors: see git history
#
# Copyright (c) 2024 Authors
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
from ..elements import Clone, FillStitch
from ..threads import ThreadCatalog, ThreadColor
from .base import InkstitchExtension
class ApplyPalette(InkstitchExtension):
'''
Applies colors of a color palette to elements
'''
def __init__(self, *args, **kwargs):
InkstitchExtension.__init__(self, *args, **kwargs)
self.arg_parser.add_argument("-o", "--tabs")
self.arg_parser.add_argument("-t", "--palette", type=str, default=None, dest="palette")
def effect(self):
# Remove selection, we want all the elements in the document
self.svg.selection.clear()
if not self.get_elements():
return
palette_name = self.options.palette
palette = ThreadCatalog().get_palette_by_name(palette_name)
# Iterate through the color blocks to apply colors
for element in self.elements:
if isinstance(element, Clone):
# clones use the color of their source element
continue
elif hasattr(element, 'gradient') and element.gradient is not None:
# apply colors to each gradient stop
for i, gradient_style in enumerate(element.gradient.stop_styles):
color = gradient_style['stop-color']
gradient_style['stop-color'] = palette.nearest_color(ThreadColor(color)).to_hex_str()
continue
nearest_color = palette.nearest_color(ThreadColor(element.color))
if isinstance(element, FillStitch):
element.node.style['fill'] = nearest_color.to_hex_str()
else:
element.node.style['stroke'] = nearest_color.to_hex_str()
metadata = self.get_inkstitch_metadata()
metadata['thread-palette'] = palette_name