def main(gfile, args=None): start = datetime.now() name = gfile if isinstance(gfile, str) else gfile.name puts( colored.blue('Visualizing the file: %s\n Started: %s' % (name, datetime.now()))) # Read in the gcode gcode = GCode(gfile, limit=None) gcode.parse() # parse the code into an array of tool moves tool = Tool(gcode) tool.uniq() box = tool.boundBox() # proces and save image ext = args.ext if args is not None else '.pdf' outfile = os.path.splitext(gfile.name)[0] + FILEENDING + ext print box print box[0:2] image = Image(outfile, gridsize=box[0:2]) image.process(tool) image.save() # how long did this take? puts(colored.green('Time to completion: %s' % (deltaTime(start)))) print
def mod(gfile): '''For each of the files to process either rotate, move, copy, or replicate the code. General idea: read in ascii Process into a toolpath list. modify. Write out toolpath.''' start = datetime.now() puts( colored.blue('Modifying file: %s\n Started: %s' % (gfile.name, datetime.now()))) # Parse the gcode. gcode = GCode(gfile) gcode.parseAll() # Create a toolpath from the gcode # add in the index so that we can match it to the gcode out = [] if args.move: loc = parse(args.move, getUnits=True) # only one move at a time. puts( colored.blue('Moving!\n (0,0) -> (%.3f,%.3f)' % (loc[0], loc[1]))) tool = Tool() # is the addIndex atribut even used any longer? tool.build(gcode, addIndex=True) tool.move(loc) # ok well this should work gcode.update(tool) out.append([loc, gcode]) if args.copy: locs = parse(args.copy, getUnits=True) puts(colored.blue('Copying!')) for loc in locs: puts(colored.blue(' (0,0) -> (%.3f,%.3f)' % (loc[0], loc[1]))) gc = gcode.copy() tool = Tool() # is the addIndex atribut even used any longer? tool.build(gc, addIndex=True) tool.move(loc) gc.update(tool) out.append([loc, gc]) # if args.replicate: # nxy = map(int,parse(args.replicate)[0]) # ensure int, and only one # puts(colored.blue('Replicating!\n nx=%i, ny=%i)'%(nxy[0],nxy[1]))) output = ''.join([o.getGcode(tag=args.name, start=l) for l, o in out]) outfile = FILEENDING.join(os.path.splitext(gfile.name)) puts(colored.green('Writing: %s' % outfile)) with open(outfile, 'w') as f: f.write(output) # how long did this take? puts(colored.green('Time to completion: %s' % (deltaTime(start)))) print
def main(etch_file, args=None): start = datetime.now() name = etch_file if isinstance(etch_file, str) else etch_file.name puts( colored.blue('Visualizing the file: %s\n Started: %s' % (name, datetime.now()))) # Read in the gcode gcode = GCode(etch_file, limit=None) gcode.parse() # parse the code into an array of tool moves tool = Tool(gcode) box = tool.boundBox() # proces and save image outfile = os.path.splitext(etch_file.name)[0] + '.eps' print box print box[0:2] image = Drawing(outfile) #, bbox=box) image.process(tool) image.save() # how long did this take? puts(colored.green('Time to completion: %s' % (deltaTime(start)))) print
def main(gfile, args=None): start = datetime.now() name = gfile if isinstance(gfile,str) else gfile.name puts(colored.blue('Visualizing the file: %s\n Started: %s'%(name,datetime.now()))) # Read in the gcode gcode = GCode(gfile, limit=None) gcode.parse() # parse the code into an array of tool moves tool = Tool(gcode) tool.uniq() box = tool.boundBox() # proces and save image ext = args.ext if args is not None else '.pdf' outfile = os.path.splitext(gfile.name)[0] + FILEENDING + ext print box print box[0:2] image = Image(outfile, gridsize=box[0:2]) image.process(tool) image.save() # how long did this take? puts(colored.green('Time to completion: %s'%(deltaTime(start)))) print
def mod(gfile): '''For each of the files to process either rotate, move, copy, or replicate the code. General idea: read in ascii Process into a toolpath list. modify. Write out toolpath.''' start = datetime.now() puts(colored.blue('Modifying file: %s\n Started: %s'%(gfile.name,datetime.now()))) # Parse the gcode. gcode = GCode(gfile) gcode.parseAll() # Create a toolpath from the gcode # add in the index so that we can match it to the gcode out = [] if args.move: loc = parse(args.move, getUnits=True) # only one move at a time. puts(colored.blue('Moving!\n (0,0) -> (%.3f,%.3f)'%(loc[0],loc[1]))) tool = Tool() # is the addIndex atribut even used any longer? tool.build(gcode, addIndex=True) tool.move(loc) # ok well this should work gcode.update(tool) out.append([loc,gcode]) if args.copy: locs = parse(args.copy, getUnits=True) puts(colored.blue('Copying!')) for loc in locs: puts(colored.blue(' (0,0) -> (%.3f,%.3f)'%(loc[0],loc[1]))) gc = gcode.copy() tool = Tool() # is the addIndex atribut even used any longer? tool.build(gc, addIndex=True) tool.move(loc) gc.update(tool) out.append([loc,gc]) # if args.replicate: # nxy = map(int,parse(args.replicate)[0]) # ensure int, and only one # puts(colored.blue('Replicating!\n nx=%i, ny=%i)'%(nxy[0],nxy[1]))) output = ''.join([o.getGcode(tag=args.name,start=l) for l,o in out]) outfile = FILEENDING.join(os.path.splitext(gfile.name)) puts(colored.green('Writing: %s'%outfile)) with open(outfile,'w') as f: f.write(output) # how long did this take? puts(colored.green('Time to completion: %s'%(deltaTime(start)))) print
def main(etch_file, args=None): start = datetime.now() name = etch_file if isinstance(etch_file,str) else etch_file.name puts(colored.blue('Visualizing the file: %s\n Started: %s'%(name,datetime.now()))) # Read in the gcode gcode = GCode(etch_file, limit=None) gcode.parse() # parse the code into an array of tool moves tool = Tool(gcode) box = tool.boundBox() # proces and save image outfile = os.path.splitext(etch_file.name)[0] + '.eps' print box print box[0:2] image = Drawing(outfile)#, bbox=box) image.process(tool) image.save() # how long did this take? puts(colored.green('Time to completion: %s'%(deltaTime(start)))) print
if __name__ == '__main__': print parse('0.2,0.3in', getUnits=True) print parse('0.2,0.3in', getUnits=True) print parse('.2,0.3in', getUnits=True) print parse('2,.03mm', getUnits=True) print parse('2,3mm', getUnits=True) print parse('2222,322mm', getUnits=True) print parse('2222.023,322.2', getUnits=True) ## I should wrap this in a __main__ section if __name__ == '__main__' and False: # Initialize the args start = datetime.now() args = argv.arg( description='Python GCode modifications', getFile=True, # get gcode to process getMultiFiles=True, # accept any number of files otherOptions=OPTIONS, # Install some nice things getDevice=False) # We dont need a device # optimize each file in the list for gfile in args.gcode: # only process things not processed before. # c = re.match(r'(?P<drill>\.drill\.tap)|(?P<etch>\.etch\.tap)', gfile.name) c = re.match(r'(.+)(\.tap)', gfile.name) if c: # either a drill.tap or etch.tap file mod(gfile) print '%s finished in %s' % (args.name, deltaTime(start))
def opt(gfile, offset=(0.0,0.0,0.0), rotate=False): '''Optimization core function: Reads in gCode ascii file. Processes gcode into toolpath list figures out milling. Reorders milling to get optimal Writes out to new file.''' start = datetime.now() puts(colored.blue('Optimizing file: %s\n Started: %s'%(gfile.name,datetime.now()))) # Parse the gcode from the ascii to a list of command numbers and location gcode = GCode(gfile) gcode.parse() # Take the list and make a toolpath out of it. A toolpath is a list of locations # where the bit needs to be moved / milled : [ [x,y,z,t], ...] tool = Tool(gcode) tool.offset(offset) tool.rotate(rotate) tool.groupMills() puts(colored.blue('Toolpath length: %.2f inches, (mill only: %.2f)'%(tool.length(),tool.millLength()))) if args.setMillHeight: tool.setMillHeight(Z_MILL,Z_SPOT) tool.uniqMills() # This starts the optimization process: # start at here, and go to the next path which is closest is the overall plan puts(colored.blue('Starting Optimization:')) here = [0.0]*3 # start at the origin newMills = [] # accumulate mills here k = 0 while len(tool.mills) > 0: # No Optimization # mill = tool.mills.pop(0) # Basic optimization, find the next closest one and use it. # mill = tool.getNextMill(here) # Advanced Optimization: Assumes that each mill path closed, so finds # the mill path which is close to the point and reorders it to be so mill = tool.getClosestMill(here) # you were here, now you are there # move mills and update location newMills.append(mill) here = newMills[-1][-1] k += 1 if (k%10) == 0: sys.stdout.write('.') sys.stdout.flush() tool.mills.extend(newMills) tool.reTool(Z_MOVE) tool.uniq() puts(colored.blue('Toolpath length: %.2f inches, (mill only: %.2f)'%(tool.length(),tool.millLength()))) # Save this with the _opt file ending. output = tool.buildGcode() outfile = FILEENDING.join(os.path.splitext(gfile.name)) puts(colored.green('Writing: %s'%outfile)) with open(outfile,'w') as f: f.write(output) # how long did this take? puts(colored.green('Time to completion: %s'%(deltaTime(start)))) print
Z_MOVE = args.zmove if args.zdrill != 0: Z_DRILL = args.zdrill if args.zmill != 0: Z_MILL = args.zmill # print vars(args) # import sys # sys.exit() # optimize each file in the list for gfile in args.gcode: # only process things not processed before. # c = re.match(r'(?P<drill>\.drill\.tap)|(?P<etch>\.etch\.tap)', gfile.name) c = re.match(r'(.+)((?P<drill>\.drill\.tap)|(?P<etch>\.etch\.tap))', gfile.name) if c: # either a drill.tap or etch.tap file opt(gfile, offset=(args.offsetx, args.offsety, args.offsetz), rotate=args.rotate) print '%s finished in %s'%(args.name,deltaTime(start))
x = raw_input('GRBL> ').strip() serial.run(x) if '~' in x: break # send the command serial.write(l) inBuf.append(len(l)) if not args.quiet: puts(colored.blue('[%04d][Sent: %s][Buf:%3d]'%(i,l.strip().rjust(30),sum(inBuf))) + colored.green(' Rec: %s'%(out))+' '*12) # It seems everything is ok, but dont reset everything untill buffer completes puts( colored.green(''' gCode finished streaming! Finished at: %s RunTime: %s'''%(datetime.now(), deltaTime(start))) + colored.red(''' !!! WARNING: Please make sure that the buffer clears before finishing...''') ) try: raw_input('<Press any key to finish>') raw_input(' Are you sure? Any key to REALLY exit.') except KeyboardInterrupt as e: serial.run('!\n?') puts(colored.red('Emergency Stop! Enter "~" to continue. You can enter gCode to run here as well.')) while True: x = raw_input('GRBL> ').strip() serial.run(x) if '~' in x: break
def zcorrect_file(gfile,surface_file_name = 'probe_test.out'): # Load the correction surface correction_surface = CorrectionSurface(surface_file_name) # keep track of time start = datetime.now() name = gfile if isinstance(gfile,str) else gfile.name puts(colored.blue('Z correcting the file: %s\n Started: %s'%(name,datetime.now()))) # Load the gcode. gcode = GCode(gfile) #parse the Gcode gcode.parseAll() # start an empty list #out = [] # need to get rid of use of 'loc' # loc = parse(args.move, getUnits=True) # only one move at a time. # puts(colored.blue('Moving!\n (0,0) -> (%.3f,%.3f)'%(loc[0],loc[1]))) # create a tool object (toolpath object) tool = Tool() # load the gcode into the tool object tool.build(gcode) # adjust the z position at each point by the given amount tool.zcorrect(correction_surface) ''' the follwing doe not work. is gcode.update(tool) broken?''' # load the changes back into the gcode object # append the modified g code to the empty list called out # out.append([gcode]) # gcode.update(tool) # out = gcode # convert gcode to text format # output = ''.join([o.getGcode(tag=args.name) for o in out]) # output = ''.join([out.getGcode()]) '''instead the following simgle lin suffices''' '''is any info lost by doing it this way? E F M''' # generate a gcode file from the tool object output = tool.buildGcode() # get an output file name outfile = FILEENDING.join(os.path.splitext(gfile)) print "outfile is:" print outfile # tell the user puts(colored.green('Writing: %s'%outfile)) # write to file f = open(outfile,'w') f.write(output) ''' with open(outfile,'w') as f: f.write(output) ''' # how long did this take? puts(colored.green('Time to completion: %s'%(deltaTime(start)))) print