svg2gcode/svg2gcode.py

123 lines
4.3 KiB
Python
Raw Normal View History

#!/usr/bin/python
2022-06-13 12:45:47 +02:00
from __future__ import absolute_import
from __future__ import print_function
import sys
import os
import getopt
2022-06-13 12:45:47 +02:00
import xml.etree.ElementTree as ET
import shapes as shapes_pkg
from shapes import point_generator
from config import *
2022-06-13 15:19:01 +02:00
debug = True
example_usage = "-i test_data/Test_H.svg -o test_data/test.gcode"
2022-06-13 15:19:01 +02:00
svg_shapes = set(['rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path'])
gcode_file_path = " "
2022-06-13 15:35:59 +02:00
def gcode_write(gcode_file, gcode):
2022-06-13 15:19:01 +02:00
if (debug):
for cmd in gcode.split("\n"):
if len(cmd):
print("[GCODE] " + str(cmd))
gcode_file.write(gcode)
def close_on_failure():
os.remove(gcode_file_path)
sys.exit(1)
def print_help():
print("Usage:")
print(os.path.basename(__file__) + " -i <svg file> -o <gcode file>")
2022-06-13 15:19:01 +02:00
print("Example:")
print(os.path.basename(__file__) + " " + example_usage)
sys.exit(1)
def parse_arguments(argv):
try:
opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
except getopt.GetoptError:
print_help()
for opt, arg in opts:
if opt in ("-i", "--ifile"):
inputfile = arg
elif opt in ("-o", "--ofile"):
outputfile = arg
return (inputfile, outputfile)
def read_input_file(svg_file_path):
try:
tree = ET.parse(svg_file_path)
return tree.getroot()
except Exception as e:
print("unable to read svg file: \n" + str(e))
sys.exit(1)
2022-06-13 15:35:59 +02:00
def generate_gcode(svg_file_root_tree, gcode_file):
generated_points_count = 0
width = svg_file_root_tree.get('width')
height = svg_file_root_tree.get('height')
2022-06-13 12:45:47 +02:00
if width == None or height == None:
viewbox = svg_file_root_tree.get('viewBox')
2022-06-13 12:45:47 +02:00
if viewbox:
2022-06-13 15:19:01 +02:00
if (debug): print("Using viewbox size")
2022-06-13 12:45:47 +02:00
_, _, width, height = viewbox.split()
if width == None or height == None:
print("Unable to get width and height for the svg")
2022-06-13 15:19:01 +02:00
close_on_failure()
2022-06-13 12:45:47 +02:00
width = float(width.split("mm")[0])
height = float(height.split("mm")[0])
2022-06-13 15:19:01 +02:00
print("[SVG loaded] With:" + str(width) + "mm Height:" + str(height) + "mm")
2022-06-13 15:19:01 +02:00
#generate start cmds's
2022-06-13 15:35:59 +02:00
gcode_write(gcode_file, preamble)
2022-06-13 15:35:59 +02:00
for elem in svg_file_root_tree.iter():
2022-06-13 12:45:47 +02:00
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)
2022-06-13 15:35:59 +02:00
obj_path = shape_obj.d_path()
obj_trans_matrix = shape_obj.transformation_matrix()
if obj_path:
gcode_write(gcode_file, "; == Start of " + tag_suffix + " ==\n")
points = point_generator(obj_path, obj_trans_matrix, smoothness)
num_points = 0
for x,y in points:
if (debug): print("[Point] X: " + str(x) + " Y: " + str(y))
2022-06-13 12:45:47 +02:00
if x > 0 and x < bed_max_x and y > 0 and y < bed_max_y:
2022-06-13 15:35:59 +02:00
gcode_write(gcode_file, "G1 X%0.001f Y%0.001f\n" % (x, y))
2022-06-13 12:45:47 +02:00
num_points += 1
2022-06-13 15:35:59 +02:00
if (num_points == 1):
gcode_write(gcode_file, "M3 I S150 ;start laser\n")
elif (debug):
2022-06-13 15:19:01 +02:00
print("\n; Coordinates out of range:", "G1 X%0.01f Y%0.01f" % (x, y))
print("; Raw:", str(x), str(y), "\nScaled:", str(x), str(y), "\n")
close_on_failure()
2022-06-13 15:35:59 +02:00
gcode_write(gcode_file, "M5 ;stop laser\n")
gcode_write(gcode_file, "; == End of " + tag_suffix + " ==\n")
generated_points_count += num_points
2022-06-13 12:45:47 +02:00
2022-06-13 15:35:59 +02:00
gcode_write(gcode_file, postamble)
print("\nGenerated", generated_points_count, "points")
2022-06-13 12:45:47 +02:00
if __name__ == "__main__":
sys.setrecursionlimit(20000) #needed for svg's with more indepented paths
if(len(sys.argv) != (len(example_usage.split())+1)):
print_help()
svg_file_path, gcode_file_path = parse_arguments(sys.argv[1:])
try:
with open(gcode_file_path, 'w') as gcode_file:
generate_gcode(read_input_file(svg_file_path),gcode_file)
except Exception as e:
print("unable to create gcode file: \n" + str(e))
2022-06-13 15:19:01 +02:00
close_on_failure()
2022-06-13 12:45:47 +02:00