今まで SketchUp + SketchUCam で雑にポケット加工の機能を使って生成してたりしていたのですが、思うような G-Code になかなかならなくてダルくなったので自力で書くことにしました。
加工範囲ぎりぎりを動かすので、いつもリミットにあたらないか心配しながらやってたのですが、そのへんを考慮するようにしました。
今いちスタンダードなやりかたがわからないのですが、中央から削っていくようにしてみました。このほうがゴミが残りにくいかな?
あと面出しって英語でなんて言うかわからなくて検索できませんでした。
#!/usr/bin/env ruby -v
io = $stdout
=begin
使いかた:
1. 面出し範囲のX軸幅・Y軸幅を測ってパラメータを変えておく
2. 面出し範囲の左下に原点をあわせる
3. G-code を生成して流す
=end
# 加工面のX軸の幅
x_size = 201
# 加工面のY軸の幅
y_size = 151
# 削る厚さ
cut_thikness = 0.1
# 使用するエンドミルの直径
tool_diameter = 6.0
# 削りのオーバーラップ割合
overwrap = 0.9
# 加工フィードレート
feed = 500
# セーフレベル
z_safe = 1
###
io.puts "G94 ( mm/min feed rate. )"
io.puts "G21 ( Use mm )"
io.puts "G90 ( Absolute distance )"
io.puts "M3 S10000 (Start Spindle)"
io.puts
# 原点が面出し表面の左下にあること前提
# 念のためリミットにひっかからないことを確認するため、最初に外形を一周する
# この生成プログラムでは座標が加工原点からマイナスにいったり、
# 設定した x_size/y_size を超えることはない
# 一方で、加工原点や x_size/y_size からはエンドミル半径分はみだして切削する
# これは削り残しがないようにするためで意図的
io.puts "G0 Z%.5f" % [z_safe]
io.puts "G0 X%.5f Y%.5f" % [0, 0]
io.puts "F%.5f" % [feed]
io.puts "G1 Z%.5f" % [-cut_thikness]
io.puts "G1 X%.5f Y%.5f" % [0, y_size]
io.puts "G1 X%.5f Y%.5f" % [x_size, y_size]
io.puts "G1 X%.5f Y%.5f" % [x_size, 0]
io.puts "G1 X%.5f Y%.5f" % [0, 0]
io.puts "G0 Z%.5f" % [z_safe]
# 中央から外形に向かって削る
begin
x_steps = ( x_size / (tool_diameter * overwrap) ).ceil
y_steps = ( y_size / (tool_diameter * overwrap) ).ceil
steps = [x_steps, y_steps].min
# 切削中のrectサイズ
x_center = x_size / 2.0
y_center = y_size / 2.0
x_current_size = 0
y_current_size = 0
# 削りはじめ、XとYで差があるので、まずはそれを埋める
case
when x_size > y_size
x_current_size = (x_steps - y_steps - 1) * (tool_diameter * overwrap)
x_offset = (x_size - x_current_size) / 2.0
io.puts ""
io.puts "(initial line)"
io.puts "G0 Z%.5f" % [z_safe]
io.puts "G0 X%.5f Y%.5f" % [x_offset, y_center]
io.puts "G1 Z%.5f" % [-cut_thikness]
io.puts "G1 X%.5f Y%.5f" % [x_offset + x_current_size, y_center]
when y_size > x_size
y_current_size = (y_steps - x_steps - 1) * (tool_diameter * overwrap)
y_offset = (y_size - y_current_size) / 2.0
io.puts ""
io.puts "(initial line)"
io.puts "G0 Z%.5f" % [z_safe]
io.puts "G0 X%.5f Y%.5f" % [x_center, y_offset]
io.puts "G1 Z%.5f" % [-cut_thikness]
io.puts "G1 X%.5f Y%.5f" % [x_center, y_offset + y_current_size]
else
# nothing to do
end
# 少しずつ広げながら削る
# 外形は最初に一度削っているが、内側の削りカスを除去するためにも再度削る
steps.times do |step|
x_current_size += (tool_diameter * overwrap)
y_current_size += (tool_diameter * overwrap)
xx = x_current_size / 2.0
yy = y_current_size / 2.0
io.puts ""
io.puts "(step %d)" % step
io.puts "G1 X%.5f Y%.5f" % [x_center + xx, y_center + yy]
io.puts "G1 X%.5f Y%.5f" % [x_center - xx, y_center + yy]
io.puts "G1 X%.5f Y%.5f" % [x_center - xx, y_center - yy]
io.puts "G1 X%.5f Y%.5f" % [x_center + xx, y_center - yy]
io.puts "G1 X%.5f Y%.5f" % [x_center + xx, y_center + yy]
end
end
io.puts "G0 Z%.5f" % [z_safe]
io.puts "M5 (Stop Spindle)"
io.puts "M2 (Program End)"
% 演算子とか、もろもろが便利なので Ruby で書きましたが、再代入禁止の変数が欲しいですね。定数だとおおげさなので……