-
Notifications
You must be signed in to change notification settings - Fork 37
/
Copy pathsvg2gcode.py
executable file
·61 lines (44 loc) · 1.59 KB
/
svg2gcode.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/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()