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