hjc-owo
init repo
966ae59
# -*- 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)