52 lines
1.8 KiB
Python
52 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
|
|
"""
|
|
Extension for InkScape 1.0
|
|
|
|
Converts curves to polylines - a quick and dirty helper for a lot of elements. Basically the same functionality can be done with default UI featureset but with a lot more mouse clicks
|
|
|
|
Author: Mario Voigt / FabLab Chemnitz
|
|
Mail: mario.voigt@stadtfabrikanten.org
|
|
Date: 05.09.2020
|
|
Last patch: 05.09.2020
|
|
License: GNU GPL v3
|
|
"""
|
|
|
|
import inkex
|
|
from inkex.paths import Path
|
|
|
|
class ConvertToPolylines(inkex.Effect):
|
|
|
|
def __init__(self):
|
|
inkex.Effect.__init__(self)
|
|
|
|
#convert a path (curve) to a polyline and remove dangling/duplicate/useless overlapping handles (points)
|
|
def convertPath(self, node):
|
|
if node.tag == inkex.addNS('path','svg'):
|
|
polypath = []
|
|
i = 0
|
|
for x, y in node.path.end_points:
|
|
if i == 0:
|
|
polypath.append(['M', [x,y]])
|
|
else:
|
|
polypath.append(['L', [x,y]])
|
|
if i == 1 and polypath[len(polypath)-2][1] == polypath[len(polypath)-1][1]:
|
|
polypath.pop(len(polypath)-1) #special handling for the seconds point after M command
|
|
elif polypath[len(polypath)-2] == polypath[len(polypath)-1]: #get the previous point
|
|
polypath.pop(len(polypath)-1)
|
|
i += 1
|
|
node.set('d', str(Path(polypath)))
|
|
children = node.getchildren()
|
|
if children is not None:
|
|
for child in children:
|
|
self.convertPath(child)
|
|
|
|
def effect(self):
|
|
if len(self.svg.selected) == 0:
|
|
self.convertPath(self.document.getroot())
|
|
else:
|
|
for id, item in self.svg.selected.items():
|
|
self.convertPath(item)
|
|
|
|
if __name__ == '__main__':
|
|
ConvertToPolylines().run() |