rlm@11: #!/usr/bin/env ruby -rubygems
rlm@11: # Tokyo cache cow command line interface script.
rlm@11: # Run tokyo_cache_cow -h to get more usage.
rlm@11: require File.dirname(__FILE__) + '/../lib/graster'
rlm@11:
rlm@11: unless ARGV.size == 5
rlm@11: puts "usage: ruby tile.rb "
rlm@11: exit(1)
rlm@11: end
rlm@11:
rlm@11: def parse_line line
rlm@11: nc = {}
rlm@11: line.gsub(/\([^)]*\)/,'').upcase.scan(/([A-Z])\s*([0-9\.]+)?/).each {|code| nc[code[0].intern] = (code[1] && code[1].to_f) }
rlm@11: nc
rlm@11: end
rlm@11:
rlm@11: def gcode ncs
rlm@11: ncs = [ncs] unless ncs.is_a? Array
rlm@11: ncs.reduce('') {|a,nc| a << (nc.map {|k,v| "#{k}#{v}" }.join(' ') + "\n") }
rlm@11: end
rlm@11:
rlm@11: tile_width = ARGV[1].to_f
rlm@11: tile_height = ARGV[2].to_f
rlm@11: horiz_count = ARGV[3].to_i
rlm@11: vert_count = ARGV[4].to_i
rlm@11:
rlm@11: header = []
rlm@11: body = []
rlm@11: footer = []
rlm@11: state = :header
rlm@11:
rlm@11:
rlm@11: File.open ARGV[0] do |io|
rlm@11: io.each_line do |line|
rlm@11: if (nc = parse_line(line)) != {}
rlm@11: case state
rlm@11: when :header
rlm@11: if nc[:G] == 0 || nc[:G] == 1
rlm@11: state = :body
rlm@11: body << nc
rlm@11: else
rlm@11: header << nc
rlm@11: end
rlm@11:
rlm@11: when :body
rlm@11: if nc[:G] == 0 || nc[:G] == 1
rlm@11: body << nc
rlm@11: else
rlm@11: state = :footer
rlm@11: footer << nc
rlm@11: end
rlm@11:
rlm@11: when :footer
rlm@11: footer << nc
rlm@11: end
rlm@11: end # case
rlm@11:
rlm@11: end # io.each_line
rlm@11: end # File.open
rlm@11:
rlm@11: print gcode(header)
rlm@11:
rlm@11: vert_count.times do |yc|
rlm@11: horiz_count.times do |xc|
rlm@11: body.each do |nc|
rlm@11: nc = nc.dup
rlm@11: nc[:X] += xc*tile_width if nc[:X]
rlm@11: nc[:Y] += yc*tile_height if nc[:Y]
rlm@11: print gcode(nc)
rlm@11: end
rlm@11: end
rlm@11: end
rlm@11:
rlm@11: print gcode(footer)