New Extension: Break Apart and Retain Holes (#653)

pull/664/head
Kaalleen 2020-04-19 18:38:28 +02:00 zatwierdzone przez GitHub
rodzic d640c928d4
commit 2f4ca0cf10
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
3 zmienionych plików z 88 dodań i 1 usunięć

Wyświetl plik

@ -1,4 +1,5 @@
from auto_satin import AutoSatin from auto_satin import AutoSatin
from break_apart import BreakApart
from convert_to_satin import ConvertToSatin from convert_to_satin import ConvertToSatin
from cut_satin import CutSatin from cut_satin import CutSatin
from embroider import Embroider from embroider import Embroider
@ -36,4 +37,5 @@ __all__ = extensions = [Embroider,
AutoSatin, AutoSatin,
Lettering, Lettering,
Troubleshoot, Troubleshoot,
RemoveEmbroiderySettings] RemoveEmbroiderySettings,
BreakApart]

Wyświetl plik

@ -0,0 +1,68 @@
from copy import deepcopy
from shapely.geometry import Polygon
import inkex
from ..elements import AutoFill, Fill
from ..i18n import _
from ..svg import get_correction_transform
from .base import InkstitchExtension
class BreakApart(InkstitchExtension):
def effect(self): # noqa: C901
if not self.get_elements():
return
if not self.selected:
inkex.errormsg(_("Please select one or more fill areas to break apart."))
return
for element in self.elements:
if not isinstance(element, AutoFill) and not isinstance(element, Fill):
continue
if len(element.paths) <= 1:
continue
polygons = []
multipolygons = []
holes = []
for path in element.paths:
polygons.append(Polygon(path))
# sort paths by size and convert to polygons
polygons.sort(key=lambda polygon: polygon.area, reverse=True)
for shape in polygons:
if shape in holes:
continue
polygon_list = [shape]
for other in polygons:
if shape != other and shape.contains(other) and other not in holes:
# check if "other" is inside a hole, before we add it to the list
if any(p.contains(other) for p in polygon_list[1:]):
continue
polygon_list.append(other)
holes.append(other)
multipolygons.append(polygon_list)
self.element_to_nodes(multipolygons, element)
def element_to_nodes(self, multipolygons, element):
for polygons in multipolygons:
el = deepcopy(element)
d = ""
for polygon in polygons:
# copy element and replace path
el.node.set('id', self.uniqueId(element.node.get('id') + "_"))
d += "M"
for x, y in polygon.exterior.coords:
d += "%s,%s " % (x, y)
d += " "
d += "Z"
el.node.set('d', d)
el.node.set('transform', get_correction_transform(element.node))
element.node.getparent().insert(0, el.node)
element.node.getparent().remove(element.node)

Wyświetl plik

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
<name>{% trans %}Break Apart and Retain Holes{% endtrans %}</name>
<id>org.inkstitch.break_apart.{{ locale }}</id>
<param name="extension" type="string" gui-hidden="true">break_apart</param>
<effect>
<object-type>all</object-type>
<effects-menu>
<submenu name="Ink/Stitch">
<submenu name="{% trans %}Fill Tools{% endtrans %}" />
</submenu>
</effects-menu>
</effect>
<script>
{{ command_tag | safe }}
</script>
</inkscape-extension>