2022-06-13 14:37:46 +02:00
#!/usr/bin/python
2022-06-13 12:45:47 +02:00
from __future__ import absolute_import
from __future__ import print_function
import sys
2022-06-13 14:37:46 +02:00
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 14:37:46 +02:00
example_usage = " -i test_data/Test_H.svg -o test_data/test.gcode "
def print_help ( ) :
print ( " Usage: " )
print ( os . path . basename ( __file__ ) + " -i <svg file> -o <gcode file> " )
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 )
def generate_gcode ( svg_file_root_tree , gcode_file ) :
2022-06-13 12:45:47 +02:00
svg_shapes = set ( [ ' rect ' , ' circle ' , ' ellipse ' , ' line ' , ' polyline ' , ' polygon ' , ' path ' ] )
2022-06-13 14:37:46 +02:00
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 :
2022-06-13 14:37:46 +02:00
viewbox = svg_file_root_tree . get ( ' viewBox ' )
2022-06-13 12:45:47 +02:00
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 . split ( " mm " ) [ 0 ] )
height = float ( height . split ( " mm " ) [ 0 ] )
print ( " ;SVG: With: " + str ( width ) + " Height: " + str ( height ) )
# Must keep the ratio of the svg, so offset will be largest between x/y
offset = max ( x_offset , y_offset )
corrected_bed_max_x = bed_max_x - offset
corrected_bed_max_y = bed_max_y - offset
scale_x = 1 #corrected_bed_max_x / max(width, height)
scale_y = 1 #corrected_bed_max_y / max(width, height)
print ( preamble )
# Iterator to lower printhead at first point
num_points = 0
2022-06-13 14:37:46 +02:00
gcode_file . write ( " Line01 " )
gcode_file . write ( " Line02 " )
sys . exit ( )
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 )
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 :
print ( " ;X: " + str ( x ) + " Y: " + str ( y ) )
if x > 0 and x < bed_max_x and y > 0 and y < bed_max_y :
print ( " G1 X %0.01f Y %0.01f " % ( ( scale_x * x ) + x_offset , ( scale_y * y ) + y_offset ) )
num_points + = 1
if num_points == 1 :
print ( " M3 I S150 ;start laser " )
else :
print ( " \n ; Coordinates out of range: " , " G1 X %0.01f Y %0.01f " % ( ( scale_x * x ) + x_offset , ( scale_y * y ) + y_offset ) )
print ( " ; Raw: " , str ( x ) , str ( y ) , " \n Scaled: " , str ( scale_x * x ) , str ( scale_y * y ) , " \n Scale Factors: " , scale_x , scale_y , " \n " )
print ( " exit " )
sys . exit ( - 1 )
print ( " M5 ;stop laser " )
num_points = 0
print ( shape_postamble )
print ( postamble )
print ( " ; Generated " , num_points , " points " )
if __name__ == " __main__ " :
2022-06-13 14:37:46 +02:00
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 : ] )
print ( " SVG: " + svg_file_path + " Gcode: " + gcode_file_path )
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 ) )
sys . exit ( 1 )
2022-06-13 12:45:47 +02:00