Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
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
Beispiel #7
0
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))
Beispiel #8
0
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
Beispiel #9
0
      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))












Beispiel #10
0
            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
      
Beispiel #11
0
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