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)