printrun-src/printrun/svg2gcode/svg2gcode.py

Sat, 23 Sep 2017 10:27:49 +0200

author
mdd
date
Sat, 23 Sep 2017 10:27:49 +0200
changeset 34
654a41b13258
parent 16
36d478bde840
permissions
-rw-r--r--

Added more default options
Code cleanup

#!/usr/bin/env python

import sys
import xml.etree.ElementTree as ET
import shapes as shapes_pkg
from shapes import point_generator
from config import *

def generate_gcode():
    svg_shapes = set(['rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path'])
    
    tree = ET.parse(sys.stdin)
    root = tree.getroot()
    
    width = root.get('width')
    height = root.get('height')
    if width == None or height == None:
        viewbox = root.get('viewBox')
        if viewbox:
            _, _, width, height = viewbox.split()                

    if width == None or height == None:
        print "Unable to get width and height for the svg"
        sys.exit(1)

    width = float(width)
    height = float(height)

    scale_x = bed_max_x / max(width, height)
    scale_y = bed_max_y / max(width, height)

    print preamble 
    
    for elem in root.iter():
        
        try:
            _, tag_suffix = elem.tag.split('}')
        except ValueError:
            continue

        if tag_suffix in svg_shapes:
            shape_class = getattr(shapes_pkg, tag_suffix)
            shape_obj = shape_class(elem)
            d = shape_obj.d_path()
            m = shape_obj.transformation_matrix()

            if d:
                print shape_preamble 
                p = point_generator(d, m, smoothness)
                for x,y in p:
                    if x > 0 and x < bed_max_x and y > 0 and y < bed_max_y:  
                        print "G1 X%0.1f Y%0.1f" % (scale_x*x, scale_y*y) 
                print shape_postamble

    print postamble 

if __name__ == "__main__":
    generate_gcode()


mercurial