From f79ae5002cabcdc7e1154e901d41960c3d703780 Mon Sep 17 00:00:00 2001 From: Zach Fredin <zach.fredin@cba.mit.edu> Date: Fri, 17 Apr 2020 15:22:55 -0400 Subject: [PATCH] added script and line test --- oxford_swabcasting.py | 215 +++++++++++++++++++++++++++++++++++++++ swabcasting_lines_01.pgm | 182 +++++++++++++++++++++++++++++++++ 2 files changed, 397 insertions(+) create mode 100644 oxford_swabcasting.py create mode 100644 swabcasting_lines_01.pgm diff --git a/oxford_swabcasting.py b/oxford_swabcasting.py new file mode 100644 index 0000000..7c34f16 --- /dev/null +++ b/oxford_swabcasting.py @@ -0,0 +1,215 @@ +# camron blackburn 1.10.20 +# updates for swabcasting, zach fredin ~april 2020 +# gcode cheat sheet: https://www.hartwiginc.com/wp-content/uploads/2015/02/G-Code-List_Okuma.pdf +import argparse + +class GcodeMarking: + ''' class for generating gcode file ''' + def __init__(self, gfile): + self.gfile = gfile + + def writeln(self, string): + gfile.write(string + "\n") + return + + def setup_gfile(self, power, feed): + self.writeln(";---- Declar and Set Variables -----") + self.writeln("DVAR $POWER") + self.writeln("DVAR $FEED") + self.writeln("") + + self.writeln("$POWER=%s" % power) + self.writeln("$FEED=%s" % feed) + self.writeln("") + + # set absolute position + self.writeln("G90") + # roughing cycle ?? what does it mean to the oxford ? + self.writeln("G71") + # zeroing position + self.writeln("G92 X0 Y0") + self.writeln("G108") + self.writeln("") + + self.writeln(";Laser cutting") + self.writeln(";tool.diameter = 0.045") + self.writeln("") + + self.writeln('FARCALL "ATTENUATOR.PGM" s$POWER') + self.writeln('MSGCLEAR -1') + self.writeln('MSGDISPLAY 1, "program Started"') + self.writeln("") + + return + + def raster_square(self, xpos, ypos, dim, fill, speed_var): + ''' xpos, ypos (float, mm): x and y position of upper left corner for square + dim (float, mm): dimensions of square + fill (float, mm): fill interval, distance between line marking + ''' + self.writeln("") + self.writeln("G0 X%s Y%s" % (xpos, ypos)) + self.writeln("BEAMON") + + xmax = xpos + dim + num_passes = int(dim / fill) + curr_y = ypos + + # sawtooth pattern fill + for i in range(0, num_passes*2+1): + if i % 2 == 0: + self.writeln("G1 X%s F$%s" % (xmax, speed_var)) + else: + self.writeln("G1 X%s Y%s F$%s" % (xpos, round(curr_y-fill, 3), speed_var)) + curr_y = curr_y-fill + + self.writeln("BEAMOFF") + return + + def outline_circle(self, reps, xpos, ypos, radius): + ''' reps: number of times around each circle + xpos, ypos (float, mm): x and y position of center point of circle + radius (float, mm): radius of circle + ''' + self.writeln("") + self.writeln("G0 X%s Y%s" % (xpos, ypos)) + self.writeln("BEAMON") + self.writeln("REPEAT %s" % (reps)) + self.writeln("G2 I%s F$FEED" % radius) + self.writeln("ENDRPT") + self.writeln("BEAMOFF") + return + + def outline_circle_array(self, radius, spacing, reps, qty_x, qty_y): + ''' creates a rectilinear array of outline circles starting at the + current X,Y location and proceding X+/Y+. + radius (float, mm): radius of each circle + spacing (float, mm): center-to-center spacing between circles + reps: number of times around each circle + qty_x, qty_y (float, mm): number of circles in each direction + ''' + for i in range(1, qty_x): + for j in range(1, qty_y): + self.outline_circle(reps, i * spacing, j * spacing, radius) + return + + def horiz_line(self, xpos, ypos, length, dreps): + ''' creates a horizontal line starting at at a given X,Y location and + proceding X+ + xpos, ypos (float, mm): x and y position of the left endpoint + length (float, mm): length of line + dreps: number of double passes (back-and-forth) + ''' + self.writeln("") + self.writeln("G0 X%s Y%s" % (xpos, ypos)) + self.writeln("BEAMON") + self.writeln("REPEAT %s" % (dreps)) + self.writeln("G1 X%s F$FEED" % (length)) + self.writeln("G1 X0 F$FEED") + self.writeln("ENDRPT") + self.writeln("BEAMOFF") + return + + def horiz_line_array(self, length, spacing, dreps, oreps, qty): + ''' creates an array of horizontal lines starting at the current X,Y + location and proceding X+/Y+. + length (float, mm): length of each horizontal line + spacing (float, mm): vertical distance between each line + dreps: number of double passes (back-and-forth) + oreps: number of overall program repetitions + qty: number of lines + ''' + self.writeln("") + self.writeln("REPEAT %s" % (oreps)) + for i in range(0, qty): + self.horiz_line(0, i * spacing, length, dreps) + self.writeln("ENDRPT") + return + + def set_gfile_var(self, name, val): + self.writeln("$%s=%s" % (name, val)) + return + + def def_array_variables(self): + self.writeln(";---- Declare and Set Variables -----") + for i in range(ARRAY_DIM): + self.writeln("DVAR $POWER%s" % i) + self.writeln("DVAR $SPEED%s" % i) + self.writeln("") + + def square_array(self, dim, fill, min_power, max_power, min_speed, max_speed): + ''' includes setup commands/etc''' + power_step = (max_power - min_power) / ARRAY_DIM + speed_step = (max_speed - min_speed) / ARRAY_DIM + + self.def_array_variables() + + # set power values + self.writeln("") + self.set_gfile_var("POWER0", min_power) + curr_power = min_power + for i in range(1, ARRAY_DIM): + curr_power += power_step + self.set_gfile_var("POWER%s" % i, curr_power) + self.writeln("") + + # set speed values + self.writeln("") + self.set_gfile_var("SPEED0", min_speed) + curr_speed = min_speed + for i in range(1, ARRAY_DIM): + curr_speed += speed_step + self.set_gfile_var("SPEED%s" % i, curr_speed) + self.writeln("") + + # set absolute position + self.writeln("G90") + # roughing cycle ?? what does it mean to the oxford ? + self.writeln("G71") + # zeroing position + self.writeln("G92 X0 Y0") + self.writeln("G108") + self.writeln("") + + self.writeln(";Laser cutting") + self.writeln(";tool.diameter = 0.045") + self.writeln('MSGDISPLAY 1, "Program Starting"') + self.writeln("") + self.writeln("") + + curr_xpos = 0 + curr_ypos = 0 + for i in range(ARRAY_DIM): + for j in range(ARRAY_DIM): + self.writeln('FARCALL "ATTENUATOR.PGM" s$POWER%s' % j) + self.writeln("MSGCLEAR -1") + self.writeln('MSGDISPLAY 1, "starting square at x %s y %s with SPEED%s POWER%s"' % (curr_xpos, curr_ypos, i, j)) + self.raster_square(curr_xpos, curr_ypos, dim, fill, "SPEED%s" % i) + curr_xpos = curr_xpos + dim + 1 + curr_ypos = curr_ypos - dim - 1 + curr_xpos = 0 + + return + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="generate g-code for laser circles") + parser.add_argument("name", help="gcode file name") + parser.add_argument("--power", help="laser power setting") + parser.add_argument("--feed", help="laser feed") + parser.add_argument("--spacing", help="circle spacing") + parser.add_argument("--radius", help="circle radius") + parser.add_argument("--qty_x", help="number of circles in X direction") + parser.add_argument("--qty_y", help="number of circles in Y direction") + args = parser.parse_args() + + ''' various combinations tried and commented out... ''' + + gfile = open(args.name, "w") + marking = GcodeMarking(gfile) + '''marking.square_array(4, float(args.fill), 0.5, 4, 20, 60)''' + marking.setup_gfile(float(args.power), float(args.feed)) + '''marking.outline_circle_array(float(args.radius), float(args.spacing), int(args.qty_x), int(args.qty_y))''' + '''marking.outline_circle_array(float(0.05), float(0.05), int(40), int(50), int(50))''' + '''marking.outline_circle_array(float(0.025), float(0.05), int(40), int(50), int(50))''' + marking.horiz_line_array(float(2), float(0.05), int(5), int(5), int(20)) + gfile.close() diff --git a/swabcasting_lines_01.pgm b/swabcasting_lines_01.pgm new file mode 100644 index 0000000..e9f3749 --- /dev/null +++ b/swabcasting_lines_01.pgm @@ -0,0 +1,182 @@ +;---- Declar and Set Variables ----- +DVAR $POWER +DVAR $FEED + +$POWER=100.0 +$FEED=3.0 + +G90 +G71 +G92 X0 Y0 +G108 + +;Laser cutting +;tool.diameter = 0.045 + +FARCALL "ATTENUATOR.PGM" s$POWER +MSGCLEAR -1 +MSGDISPLAY 1, "program Started" + + +REPEAT 5 + +G0 X0 Y0.0 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.05 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.1 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.15000000000000002 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.2 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.25 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.30000000000000004 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.35000000000000003 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.4 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.45 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.5 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.55 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.6000000000000001 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.65 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.7000000000000001 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.75 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.8 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.8500000000000001 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.9 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF + +G0 X0 Y0.9500000000000001 +BEAMON +REPEAT 5 +G1 X2.0 F$FEED +G1 X0 F$FEED +ENDRPT +BEAMOFF +ENDRPT -- GitLab