Spaces:
Sleeping
Sleeping
| # -*- coding: utf-8 -*- | |
| # Author: ximing | |
| # Description: process | |
| # Copyright (c) 2023, XiMing Xing. | |
| # License: MIT License | |
| import xml.etree.ElementTree as ET | |
| from typing import Tuple | |
| import omegaconf | |
| from .shape import circle_tag, rect_tag | |
| from .type import is_valid_svg | |
| def delete_empty_path(input_svg: str, output_svg: str): | |
| is_valid_svg(input_svg) | |
| # read svg | |
| tree = ET.parse(input_svg) | |
| root = tree.getroot() | |
| group = ET.Element('g') | |
| for i, element in enumerate(root.iter()): | |
| element.tag = element.tag.split('}')[-1] | |
| if element.tag == 'path': | |
| if element.get('d') == 'C NaN NaN' or element.get('d') == '': | |
| continue | |
| group.append(element) | |
| # new svg | |
| svg = ET.Element('svg', | |
| xmlns="http://www.w3.org/2000/svg", | |
| version='1.1', | |
| width=root.get('width'), | |
| height=root.get('height'), | |
| viewBox=root.get('viewBox')) | |
| svg.append(group) | |
| tree = ET.ElementTree(svg) | |
| tree.write(output_svg, encoding='utf-8', xml_declaration=True) | |
| def add_clipPath2def(mounted_node: ET.Element, tag_name: str, attrs: omegaconf.DictConfig): | |
| # add defs node | |
| defs = ET.SubElement(mounted_node, 'defs') # parent=mounted_node, tag='defs' | |
| if tag_name == 'none': | |
| return None | |
| # add clipPath node | |
| id = 'def_clip' | |
| _circleClip = ET.SubElement(defs, 'clipPath', id='def_clip') # parent=defs, tag='clipPath' | |
| # add ops | |
| if tag_name == 'circle_clip': | |
| _circleClip.append( | |
| circle_tag(cx=attrs.cx, cy=attrs.cy, r=attrs.r) | |
| ) | |
| elif tag_name == 'rect_clip': | |
| _circleClip.append( | |
| rect_tag(x=attrs.x, y=attrs.y, rx=attrs.rx, ry=attrs.ry, width=attrs.width, height=attrs.height) | |
| ) | |
| else: | |
| raise NotImplementedError(f'{tag_name} is not exist!') | |
| return id | |
| def add_def_tag( | |
| svg_path: str, | |
| def_tag_plan: str, | |
| out_size: Tuple[int, int], # e.g.: (600, 600) | |
| ): | |
| is_valid_svg(svg_path) | |
| width, height = out_size[0], out_size[1] | |
| # set def tag | |
| if def_tag_plan == 'circle_clip': | |
| def_cfg = omegaconf.DictConfig({ | |
| 'name': 'circle_clip', | |
| 'attrs': {'cx': width // 2, 'cy': height // 2, 'r': int(height * 0.5)} | |
| }) | |
| elif def_tag_plan == 'rect_clip': | |
| def_cfg = omegaconf.DictConfig({ | |
| 'name': 'rect_clip', | |
| 'attrs': {'x': 0, 'y': 0, 'rx': 70, 'ry': 70, 'width': width, 'height': height} | |
| }) | |
| else: | |
| def_cfg = None | |
| # load SVG | |
| tree = ET.parse(svg_path) | |
| root = tree.getroot() | |
| # new group, and add paths form svg_path_1 | |
| group = ET.Element('g') | |
| for i, element in enumerate(root.iter()): | |
| element.tag = element.tag.split('}')[-1] | |
| if element.tag in ['path', 'polygon']: | |
| group.append(element) | |
| # new svg | |
| svg = ET.Element('svg', | |
| xmlns="http://www.w3.org/2000/svg", | |
| version='1.1', | |
| width=str(out_size[0]), | |
| height=str(out_size[1])) | |
| # add def tag to the SVG | |
| clip_id = add_clipPath2def(mounted_node=svg, | |
| tag_name=def_cfg.name, | |
| attrs=def_cfg.attrs) | |
| group.set('clip-path', f'url(#{clip_id})') | |
| svg.append(group) | |
| # write svg | |
| tree = ET.ElementTree(svg) | |
| tree.write(svg_path, encoding='utf-8', xml_declaration=True) | |