Skip to content
Snippets Groups Projects
oxford_swabcasting.py 7.91 KiB
Newer Older
  • Learn to ignore specific revisions
  • Zach Fredin's avatar
    Zach Fredin committed
    # 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()