49 lines
1.7 KiB
Python
49 lines
1.7 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.EffectExtension):
|
||
|
|
||
|
#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()
|