#!/usr/bin/env python

import sys
sys.path.append('/usr/share/inkscape/extensions')

# 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
from simplestyle import *

debug = False

class EnerothPurgeShortEdges(inkex.Effect):
  def __init__(self):
    inkex.Effect.__init__(self)
    self.OptionParser.add_option('-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.selected)==0:
      self.iterate_node(self.document.getroot())
    else:
      for id, node in self.selected.iteritems():
        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.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 = map(lambda c: float(c), word.split(','))
          # inkex.debug(coords)
          if instruction.lower() == instruction:
            # inkex.debug("coords len=" + str(len(coords)) + "prev_coords len=" + str(len(prev_coords)))
            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.debug("X=" + str(coords[0]) + "Y=" + str(coords[1]))  
          points.append(coords)
          # inkex.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.debug("length=" + str(length))
        if debug:
          inkex.debug(length)
        if length < self.options.length:
          # inkex.debug("delete")
          node.getparent().remove(node)

EnerothPurgeShortEdges().affect()