kopia lustrzana https://github.com/inkstitch/inkstitch
122 wiersze
4.9 KiB
Python
122 wiersze
4.9 KiB
Python
# Authors: see git history
|
|
#
|
|
# Copyright (c) 2010 Authors
|
|
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
|
|
|
|
from inkex import NSS, Boolean, ShapeElement
|
|
|
|
from ..commands import OBJECT_COMMANDS, find_commands, is_command_symbol
|
|
from ..svg.svg import find_elements
|
|
from .base import InkstitchExtension
|
|
|
|
|
|
class RemoveEmbroiderySettings(InkstitchExtension):
|
|
def __init__(self, *args, **kwargs):
|
|
InkstitchExtension.__init__(self, *args, **kwargs)
|
|
self.arg_parser.add_argument("--tabs")
|
|
self.arg_parser.add_argument("-p", "--del_params", dest="del_params", type=str, default=True)
|
|
self.arg_parser.add_argument("-c", "--del_commands", dest="del_commands", type=str, default="none")
|
|
self.arg_parser.add_argument("-d", "--del_print", dest="del_print", type=Boolean, default=False)
|
|
|
|
def effect(self):
|
|
self.svg = self.document.getroot()
|
|
|
|
if self.options.del_params != 'none':
|
|
self.remove_params()
|
|
if self.options.del_commands != 'none':
|
|
self.remove_commands()
|
|
if self.options.del_print:
|
|
self.remove_print_settings()
|
|
|
|
def remove_print_settings(self):
|
|
print_settings = "svg:metadata//*"
|
|
print_settings = find_elements(self.svg, print_settings)
|
|
for print_setting in print_settings:
|
|
if print_setting.prefix == "inkstitch":
|
|
self.remove_element(print_setting)
|
|
|
|
def remove_params(self):
|
|
if not self.svg.selection:
|
|
xpath = ".//svg:path|.//svg:circle|.//svg:rect|.//svg:ellipse"
|
|
elements = find_elements(self.svg, xpath)
|
|
self.remove_inkstitch_attributes(elements)
|
|
else:
|
|
elements = self.get_selected_elements()
|
|
self.remove_inkstitch_attributes(elements)
|
|
|
|
def remove_all_commands(self):
|
|
xpath = ".//svg:g[starts-with(@id,'command_group')]"
|
|
groups = find_elements(self.svg, xpath)
|
|
for group in groups:
|
|
group.delete()
|
|
|
|
# remove standalone commands and ungrouped object commands
|
|
standalone_commands = ".//svg:use[starts-with(@xlink:href, '#inkstitch_')]|.//svg:path[starts-with(@id, 'command_connector')]"
|
|
self.remove_elements(standalone_commands)
|
|
|
|
# let's remove the symbols (defs), we won't need them in the document
|
|
symbols = ".//*[starts-with(@id, 'inkstitch_')]"
|
|
self.remove_elements(symbols)
|
|
|
|
def remove_specific_commands(self, command):
|
|
# remove object commands
|
|
if command in OBJECT_COMMANDS:
|
|
xlink = f"#inkstitch_{command}"
|
|
xpath = f".//svg:use[starts-with(@xlink:href, '{xlink}')]"
|
|
connectors = find_elements(self.svg, xpath)
|
|
for connector in connectors:
|
|
group = connector.getparent()
|
|
group.delete()
|
|
|
|
# remove standalone commands and ungrouped object commands
|
|
standalone_commands = ".//svg:use[starts-with(@xlink:href, '#inkstitch_{command}')]"
|
|
self.remove_elements(standalone_commands)
|
|
|
|
# let's remove the symbols (defs), we won't need them in the document
|
|
symbols = f".//*[starts-with(@id, 'inkstitch_{command}')]"
|
|
self.remove_elements(symbols)
|
|
|
|
def remove_selected_commands(self):
|
|
del_option = self.options.del_commands
|
|
elements = self.get_selected_elements()
|
|
for element in elements:
|
|
if is_command_symbol(element) and (del_option in element.get('xlink:href') or del_option == 'all'):
|
|
group = element.getparent()
|
|
if group.getparent() is not None:
|
|
if group.get_id().startswith("command_group"):
|
|
group.delete()
|
|
else:
|
|
element.delete()
|
|
continue
|
|
for command in find_commands(element):
|
|
if del_option in ('all', command.command):
|
|
group = command.connector.getparent()
|
|
group.delete()
|
|
|
|
def remove_commands(self):
|
|
if self.svg.selection:
|
|
self.remove_selected_commands()
|
|
elif self.options.del_commands == "all":
|
|
self.remove_all_commands()
|
|
else:
|
|
self.remove_specific_commands(self.options.del_commands)
|
|
|
|
def get_selected_elements(self):
|
|
return self.svg.selection.get(ShapeElement)
|
|
|
|
def remove_elements(self, xpath):
|
|
elements = find_elements(self.svg, xpath)
|
|
for element in elements:
|
|
self.remove_element(element)
|
|
|
|
def remove_element(self, element):
|
|
element.delete()
|
|
|
|
def remove_inkstitch_attributes(self, elements):
|
|
param_to_remove = self.options.del_params
|
|
for element in elements:
|
|
for attrib in element.attrib:
|
|
if attrib.startswith(NSS['inkstitch'], 1):
|
|
if param_to_remove == 'all' or attrib.endswith(param_to_remove):
|
|
del element.attrib[attrib]
|