view svg2qd.py @ 251:98483680ea0f

Improve converter and adjust parser accordingly.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 09 Oct 2012 20:59:30 +0300
parents 3520489320bc
children 9c33e11c3d39
line wrap: on
line source

#!/usr/bin/python
import sys
import re
import xml.etree.ElementTree as ET


def bf(x) :
   return int(round(float(x)))


def printVertex(v) :
   if type(v) is list :
      return "{:.2f},{:.2f},{:.2f}".format(v[0], v[1], v[2])
   else :
      return v

def getTransform(elem) :
   if "transform" in elem.attrib :
      ntrans = elem.attrib["transform"]
      tmatch = re.compile(r"translate\((.*?)\)", re.IGNORECASE)
      for trns in tmatch.finditer(ntrans) :
         coord = trns.group(1).split(",")
         return [float(coord[0]), float(coord[1]), 0]
   return None


def getStyle(elem) :
   style = {}
   if "style" in elem.attrib :
      for elem in elem.attrib["style"].split(";") :
         kv = elem.split(":")
         style[kv[0]] = kv[1]
   return style


def printVertices(type, vertices, width) :
   if len(vertices) > 0 :
      list = map(lambda v:printVertex(v), vertices)
      str = "# "
      if type == "m" :
         str = "R"
      elif type == "M" :
         str = "L"
      return str + "{} {} {}".format(len(vertices)-1, " ".join(list), width)
   else :
      return ""


def printPath(path, level) :
   style = getStyle(path)
   width = bf(style["stroke-width"])

   trans = getTransform(path)
   if trans :
      print "{}G{}".format("  "*level, printVertex(trans))

   out = ""
   vertices = []
   type = ""
   for elem in path.attrib["d"].split(" ") :
      if elem == "m" or elem == "M":
         out += printVertices(type, vertices, width)
         type = elem
      elif elem == "z" :
         vertices.append("Z")
      else :
         tmp = elem.split(",")
         px = float(tmp[0])
         py = float(tmp[1])
         vertices.append([px, py, 0])

   out += printVertices(type, vertices, width)
   print "{}{}".format("  "*level, out)
   if trans :
      print "{}E\n".format("  "*level)


def iterateDocument(elems, level) :
   for elem in elems:
      if elem.tag == "{http://www.w3.org/2000/svg}g" :
         print "\n{}# GROUP".format("  "*level)
         tmp = getTransform(elem)
         if tmp :
            print "{}G{}".format("  "*level, printVertex(getTransform(elem)))
            iterateDocument(elem, level + 1)
            print "{}E\n".format("  "*level)
         else :
            iterateDocument(elem, level)
      elif elem.tag == "{http://www.w3.org/2000/svg}path" :
         printPath(elem, level)


# Ns. paaohjelma
if len(sys.argv) != 2 :
   print "Usage: "+sys.argv[0]+" <input.svg>"
   sys.exit(1)
   
tree = ET.parse(sys.argv[1])
iterateDocument(tree.getroot(), 0)