From f459e7abcca14d9760237317f71a4cf178c1188a Mon Sep 17 00:00:00 2001 From: localhorst Date: Mon, 13 Jun 2022 22:48:51 +0200 Subject: [PATCH] comandline parser --- svg2gcode.py | 57 +++++++++++------- test_data/arc_compare.gcode | 45 ++++++++++++++ test_data/circle_10mm.svg | 74 +++++++++++++++++++++++ test_data/circle_10mm_gen.gcode | 36 +++++++++++ test_data/circle_10mm_man.gcode | 35 +++++++++++ test_data/circle_rect.svg | 103 ++++++++++++++++++++++++++++++++ test_data/path.svg | 47 +++++++++++++++ test_data/test.gcode | 32 +++++++--- 8 files changed, 397 insertions(+), 32 deletions(-) create mode 100644 test_data/arc_compare.gcode create mode 100644 test_data/circle_10mm.svg create mode 100644 test_data/circle_10mm_gen.gcode create mode 100644 test_data/circle_10mm_man.gcode create mode 100644 test_data/circle_rect.svg create mode 100644 test_data/path.svg diff --git a/svg2gcode.py b/svg2gcode.py index c5f8881..deece8e 100755 --- a/svg2gcode.py +++ b/svg2gcode.py @@ -4,14 +4,14 @@ from __future__ import absolute_import from __future__ import print_function import sys import os -import getopt +import argparse import xml.etree.ElementTree as ET import shapes as shapes_pkg from shapes import point_generator from config import * debug = True -example_usage = "-i test_data/Test_H.svg -o test_data/test.gcode" +example_usage = "-i test_data/Test_H.svg -o test_data/test.gcode -fr 300 -mr 1200 -p 1 -lp 20%" svg_shapes = set(['rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path']) gcode_file_path = " " @@ -26,24 +26,25 @@ def close_on_failure(): os.remove(gcode_file_path) sys.exit(1) -def print_help(): - print("Usage:") - print(os.path.basename(__file__) + " -i -o ") - print("Example:") - print(os.path.basename(__file__) + " " + example_usage) - sys.exit(1) +def parse_arguments(): + parser = argparse.ArgumentParser(description='Generate gcode from vector graphics.') -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) + parser.add_argument("-i", "--input", dest='inputfile', metavar='image.svg', help="path to vector graphic file", required=True) + parser.add_argument("-o", "--output", dest='outputfile', metavar='data.gcode', help="path to file for generated gcode", required=True) + + parser.add_argument("-fr", "--feedrate", dest='feedrate', metavar=300, default=300, help="rate while laser is on", required=False) + parser.add_argument("-mr", "--moverate", dest='moverate', metavar=1200, default=1200, help="rate while laser is off", required=False) + + parser.add_argument("-p", "--passes", dest='passes', metavar=1, default=1, help="number of passes (for deeper cutting)", required=False) + parser.add_argument("-lp", "--laserpower", dest='laserpower', metavar="0%", default="0%", help="laser power in %%", required=False) + + parser.add_argument("-bx", "--bedsizex", dest='bedsizex', default="376", help="x size of bed in mm", required=False) + parser.add_argument("-by", "--bedsizey", dest='bedsizey', default="315", help="y size of bed in mm", required=False) + + parser.add_argument("-s", "--smoothness", dest='smoothness', metavar=0.2, default=0.2, help="Used to control the smoothness/sharpness of the curves.\nSmaller the value greater the sharpness.\nMake sure the value is greater than 0.1", required=False) + + args = parser.parse_args() + return [args.inputfile, args.outputfile, int(args.feedrate), int(args.moverate), int(args.passes), ((float(args.laserpower.split("%")[0])/100.0)), int(args.bedsizex), int(args.bedsizey), float(args.smoothness) ] def read_input_file(svg_file_path): try: @@ -94,7 +95,7 @@ def generate_gcode(svg_file_root_tree, gcode_file): gcode_write(gcode_file, "G1 X%0.001f Y%0.001f\n" % (x, y)) num_points += 1 if (num_points == 1): - gcode_write(gcode_file, "M3 I S150 ;start laser\n") + gcode_write(gcode_file, "M3 I S15 ;start laser\n") elif (debug): 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") @@ -108,9 +109,19 @@ def generate_gcode(svg_file_root_tree, gcode_file): 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:]) + + svg_file_path, gcode_file_path, feedrate, moverate, passes, laserpower, bedsizex, bedsizey, smoothness = parse_arguments() + + print("inputfile: " + str(svg_file_path)) + print("outputfile: " + str(gcode_file_path)) + print("feedrate: " + str(feedrate)) + print("moverate: " + str(moverate)) + print("passes: " + str(passes)) + print("laserpower: " + str(laserpower)) + print("bedsizex: " + str(bedsizex)) + print("bedsizey: " + str(bedsizey)) + print("smoothness: " + str(smoothness)) + try: with open(gcode_file_path, 'w') as gcode_file: generate_gcode(read_input_file(svg_file_path),gcode_file) diff --git a/test_data/arc_compare.gcode b/test_data/arc_compare.gcode new file mode 100644 index 0000000..6782960 --- /dev/null +++ b/test_data/arc_compare.gcode @@ -0,0 +1,45 @@ +G90 ;Absolute programming +G21 ;Programming in millimeters (mm) +M5 ;Disable laser +; == Start of circle == +G00 X5 Y5 +M3 I S150 ;start laser +G02 X5 Y5 I5 J0 +M5 ;stop laser +; == End of circle == +G1 X0.0 Y0.0; Display printbed + +; == Start of circle == +G1 X0.4 Y5.0 +M3 I S150 ;start laser +G1 X0.4 Y5.4 +G1 X0.7 Y6.6 +G1 X1.2 Y7.6 +G1 X2.0 Y8.5 +G1 X3.1 Y9.2 +G1 X4.2 Y9.5 +G1 X5.4 Y9.6 +G1 X6.6 Y9.3 +G1 X7.6 Y8.8 +G1 X8.5 Y8.0 +G1 X9.2 Y7.0 +G1 X9.5 Y5.8 +G1 X9.6 Y4.6 +G1 X9.3 Y3.4 +G1 X8.8 Y2.4 +G1 X8.0 Y1.5 +G1 X6.9 Y0.8 +G1 X5.8 Y0.5 +G1 X4.6 Y0.4 +G1 X3.4 Y0.7 +G1 X2.4 Y1.2 +G1 X1.5 Y2.0 +G1 X0.8 Y3.0 +G1 X0.5 Y4.2 +G1 X0.4 Y5.0 +M5 ;stop laser +; == End of circle == + +M02 ;End of program + + diff --git a/test_data/circle_10mm.svg b/test_data/circle_10mm.svg new file mode 100644 index 0000000..5acefc1 --- /dev/null +++ b/test_data/circle_10mm.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + diff --git a/test_data/circle_10mm_gen.gcode b/test_data/circle_10mm_gen.gcode new file mode 100644 index 0000000..bc9551f --- /dev/null +++ b/test_data/circle_10mm_gen.gcode @@ -0,0 +1,36 @@ +G90 ;Absolute programming +G21 ;Programming in millimeters (mm) +M5 ;Disable laser +G01 F200.0 +; == Start of circle == +G1 X0.4 Y5.0 +M3 I S150 ;start laser +G1 X0.4 Y5.4 +G1 X0.7 Y6.6 +G1 X1.2 Y7.6 +G1 X2.0 Y8.5 +G1 X3.1 Y9.2 +G1 X4.2 Y9.5 +G1 X5.4 Y9.6 +G1 X6.6 Y9.3 +G1 X7.6 Y8.8 +G1 X8.5 Y8.0 +G1 X9.2 Y7.0 +G1 X9.5 Y5.8 +G1 X9.6 Y4.6 +G1 X9.3 Y3.4 +G1 X8.8 Y2.4 +G1 X8.0 Y1.5 +G1 X6.9 Y0.8 +G1 X5.8 Y0.5 +G1 X4.6 Y0.4 +G1 X3.4 Y0.7 +G1 X2.4 Y1.2 +G1 X1.5 Y2.0 +G1 X0.8 Y3.0 +G1 X0.5 Y4.2 +G1 X0.4 Y5.0 +M5 ;stop laser +; == End of circle == +G1 X0.0 Y0.0; Display printbed +M02 ;End of program diff --git a/test_data/circle_10mm_man.gcode b/test_data/circle_10mm_man.gcode new file mode 100644 index 0000000..4a7222d --- /dev/null +++ b/test_data/circle_10mm_man.gcode @@ -0,0 +1,35 @@ +G90 ;Absolute programming +G21 ;Programming in millimeters (mm) +M5 ;Disable laser +; == Start of circle == +G1 X0.4 Y5.0 +M3 I S150 ;start laser +G1 X0.4 Y5.4 +G1 X0.7 Y6.6 +G1 X1.2 Y7.6 +G1 X2.0 Y8.5 +G1 X3.1 Y9.2 +G1 X4.2 Y9.5 +G1 X5.4 Y9.6 +G1 X6.6 Y9.3 +G1 X7.6 Y8.8 +G1 X8.5 Y8.0 +G1 X9.2 Y7.0 +G1 X9.5 Y5.8 +G1 X9.6 Y4.6 +G1 X9.3 Y3.4 +G1 X8.8 Y2.4 +G1 X8.0 Y1.5 +G1 X6.9 Y0.8 +G1 X5.8 Y0.5 +G1 X4.6 Y0.4 +G1 X3.4 Y0.7 +G1 X2.4 Y1.2 +G1 X1.5 Y2.0 +G1 X0.8 Y3.0 +G1 X0.5 Y4.2 +G1 X0.4 Y5.0 +M5 ;stop laser +; == End of circle == +G1 X0.0 Y0.0; Display printbed +M02 ;End of program diff --git a/test_data/circle_rect.svg b/test_data/circle_rect.svg new file mode 100644 index 0000000..c51372c --- /dev/null +++ b/test_data/circle_rect.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test_data/path.svg b/test_data/path.svg new file mode 100644 index 0000000..03c9198 --- /dev/null +++ b/test_data/path.svg @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/test_data/test.gcode b/test_data/test.gcode index 37280d9..ebc53cf 100644 --- a/test_data/test.gcode +++ b/test_data/test.gcode @@ -1,15 +1,29 @@ G90 ;Absolute programming G21 ;Programming in millimeters (mm) M5 ;Disable laser -; == Start of rect == -G1 X0.1 Y0.1 -M3 I S150 ;start laser -G1 X0.1 Y0.1 -G1 X9.9 Y0.1 -G1 X9.9 Y9.9 -G1 X0.1 Y9.9 -G1 X0.1 Y0.1 +; == Start of path == +G1 X8.6 Y11.7 +M3 I S15 ;start laser +G1 X8.6 Y11.7 +G1 X29.4 Y9.7 +G1 X41.5 Y22.1 +G1 X35.3 Y35.3 +G1 X34.7 Y37.4 +G1 X33.9 Y38.9 +G1 X32.5 Y40.3 +G1 X30.4 Y41.0 +G1 X27.6 Y40.8 +G1 X23.7 Y39.4 +G1 X18.8 Y36.2 +G1 X14.9 Y33.0 +G1 X12.3 Y30.3 +G1 X10.6 Y27.9 +G1 X9.7 Y26.1 +G1 X9.4 Y24.6 +G1 X9.4 Y23.3 +G1 X9.6 Y23.0 +G1 X8.6 Y11.7 M5 ;stop laser -; == End of rect == +; == End of path == G1 X0.0 Y0.0; Display printbed M02 ;End of program