This repository has been archived on 2023-03-25. You can view files and clone it, but cannot push or open issues or pull requests.
mightyscape-1.1-deprecated/extensions/fablabchemnitz_purge_short_lines.py
2020-07-30 01:16:18 +02:00

70 lines
3.0 KiB
Python

#!/usr/bin/env python3
# Purge short lines
# This script is designed to be used to clean up/simplify 2D vector exports from
# SketchUp. It ignores everything but paths between exactly 2 points.
import inkex
import math
debug = False
class EnerothPurgeShortEdges(inkex.Effect):
def __init__(self):
inkex.Effect.__init__(self)
self.arg_parser.add_argument('-w', '--length', action = 'store',
type = float, dest = 'length', default = 10.0)
def effect(self):
length = self.options.length
svg = self.document.getroot()
if len(self.svg.selected)==0:
self.iterate_node(self.document.getroot())
else:
for id, node in self.svg.selected.items():
self.iterate_node(node)
def iterate_node(self, node):
self.do_node(node)
for child in node:
self.iterate_node(child)
def do_node(self, node):
if node.attrib.has_key('d'):
points = []
instruction = None
prev_coords = [0,0]
words = node.get('d').split(' ')
for i, word in enumerate(words):
if len(word) == 1:
instruction = word
# inkex.utils.debug(word)
else:
# Sometimes there is the case that "coords" returns only an array like [-1.29] (only one coordinate) instead of XY coordinates. Reason is the type "map"
coords = list(map(lambda c: float(c), word.split(',')))
# inkex.utils.debug(coords)
if instruction.lower() == instruction:
# inkex.utils.debug("coords len=" + str(len(coords)) + "prev_coords len=" + str(len(prev_coords)))
try:
coords[0] += prev_coords[0]
coords[1] += prev_coords[1]
# if len(coords) == 2:
# coords[1] += prev_coords[1]
prev_coords = coords
# Assume all coordinates are points of straight lines (instructor being M, m, L or l)
# inkex.utils.debug("X=" + str(coords[0]) + "Y=" + str(coords[1]))
points.append(coords)
# inkex.utils.debug("pointsCount=" + str(len(points)))
if len(points) == 2:
length = math.sqrt((points[0][0]-points[1][0])**2 + (points[0][1]-points[1][1])**2)
# inkex.utils.debug("length=" + str(length))
if debug:
inkex.utils.debug(length)
if length < self.options.length:
# inkex.utils.debug("delete")
node.getparent().remove(node)
except:
pass #ignore errors in case of vertical lines or horizonal lines
EnerothPurgeShortEdges().run()