読者です 読者をやめる 読者になる 読者になる

Catnap

作業の記録。「ここ変だよ」等、泣いて喜びます。

平面出し用Gコード生成ツールその2

ソースコード貼っておきます。
変なところあればコメント等で教えていただけると、とてもとても助かります。

テキストの保存にはdata URI scheme使いました。


GcodeMaker_spiral.js

function output(){
    var x_length, y_length;         //面出し範囲[mm]
    var diam, radius;               //スピンドル直径[mm], 半径[mm]
    var move_speed, descend_speed;  //水平送り速度[mm/min], 鉛直送り速度[mm/min]
    var motor_rpm;                  //スピンドル回転数[rpm]
    var depth, height;              //切削深さ[mm], 空中移動時高さ[mm]
    
    
    //入力値チェック
    var values = document.getElementsByTagName("input");
    var setting_flag = 0;           //設定値入力欄チェックフラグ 不適検知して1
    var form_numbers = " ";         //不適入力欄記録用 as 文字列
    
    for(var i=0; i<values.length; i++){
        if(!(parseFloat(values[i].value, 10) > 0)){
            form_numbers += (i+1) + " ";
            setting_flag = 1;
        }
    }
    if(setting_flag){
        alert(form_numbers + "番目の値が正しくありません");
        return;
    }
    
    //各変数へ代入
    x_length        = parseFloat(values[0].value, 10);
    y_length        = parseFloat(values[1].value, 10);
    diam            = parseFloat(values[2].value, 10);
    move_speed      = parseFloat(values[3].value, 10);
    descend_speed   = parseFloat(values[4].value, 10);
    motor_rpm       = parseFloat(values[5].value, 10);
    depth           = parseFloat(values[6].value, 10);
    height          = parseFloat(values[7].value, 10);
    
    radius = diam / 2;
    
    var overlap_width;                     //重ね幅[mm]
    var ROOT2 = 1.4;                        //約√2(作業用定数)
    overlap_width = radius / ROOT2 + 0.2;   //角が残らないように重ね幅設定 +α
    
    alert("切削対象には\n( " + (x_length + diam) + ", " + (y_length + diam) + " )[mm]\nの広さが必要です");
    
    ////////////////////////////////////////////////////////////////////////////
    //原点へ移動 -> 外周(一週目)
    var output = document.getElementById("output_textarea");
    output.value = "";
    
    output.value += "G01 Z5.000 F500\n";
    output.value += "G01 X0.000 Y0.000 F500\n";
    output.value += "M03 S" + motor_rpm + "\n";
    output.value += "G01 Z-" + depth.toFixed(3) + " F" + descend_speed + "\n";  //左下角欠き
    output.value += "G01 F" + move_speed + "\n";
    
    output.value += "G01 X" + radius.toFixed(3) + " Y" + radius.toFixed(3) + "\n";
    output.value += "G01 Y" + (y_length - radius).toFixed(3) + "\n";
    output.value += "G01 X0.000 Y" + y_length.toFixed(3) + "\n";    //左上角欠き
    output.value += "G01 X" + radius.toFixed(3) + " Y" + (y_length - radius).toFixed(3) + "\n";
    output.value += "G01 X" + (x_length - radius).toFixed(3) + "\n";
    output.value += "G01 X" + x_length.toFixed(3) + " Y" + y_length.toFixed(3) + "\n";  //右上角欠き
    output.value += "G01 X" + (x_length - radius).toFixed(3) + " Y" + (y_length - radius).toFixed(3) + "\n";
    output.value += "G01 Y" + radius.toFixed(3) + "\n";
    output.value += "G01 X" + x_length.toFixed(3) + " Y0.000\n";    //右下角欠き
    output.value += "G01 X" + (x_length - radius).toFixed(3) + " Y" + radius.toFixed(3) + "\n";
    output.value += "G01 X" + radius.toFixed(3) + " Y" + radius.toFixed(3) + "\n";  //左下角
    
    var move_width      //移動幅[mm]
    move_width = diam - overlap_width;
    
    var done_width      //外周からスピンドル中心までの距離[mm]
    done_width = radius;
    
    //ぐるぐる
    var laps;
    if(x_length < y_length){
        laps = Math.floor(((x_length / 2) - radius) / move_width);
        //下辺からループスタート
        for(var i=0; i<laps; i++){
            done_width += move_width;
            output.value += "G01 X" + done_width.toFixed(3) + "\n";
            output.value += "G01 Y" + (y_length - done_width).toFixed(3) + "\n";
            output.value += "G01 X" + (x_length - done_width).toFixed(3) + "\n";
            output.value += "G01 Y" + done_width.toFixed(3) + "\n";
        }
        output.value += "G01 X" + (x_length / 2).toFixed(3) + "\n";
        output.value += "G01 Y" + (y_length - done_width - move_width).toFixed(3) + "\n";
    }else{
        laps = Math.floor(((y_length / 2) - radius) / move_width);
        output.value += "G01 X" + (done_width + move_width).toFixed(3) + "\n";        
        //左辺からループスタート
        for(var i=0; i<laps; i++){
            done_width += move_width;
            output.value += "G01 Y" + (y_length - done_width).toFixed(3) + "\n";
            output.value += "G01 X" + (x_length - done_width).toFixed(3) + "\n";
            output.value += "G01 Y" + done_width.toFixed(3) + "\n";
            output.value += "G01 X" + done_width.toFixed(3) + "\n";
        }
        output.value += "G01 Y" + (y_length / 2).toFixed(3) + "\n";
        output.value += "G01 X" + (x_length - done_width - move_width).toFixed(3) + "\n";
    }
    
    //スピンドル上げて原点移動して終了☆
    output.value += "G01 Z5.00 F200\n";
    output.value += "M06\n";
    output.value += "G01 X0.000 Y0.000 F500\n";
    ////////////////////////////////////////////////////////////////////////////
    
    //加工所要時間予想(わりとアバウト)
    var total                           //切削総距離[mm]
    if(x_length < y_length)
        total = (x_length * 2) * (laps + 2) + (y_length * 2 - x_length) * (laps + 2);
    else
        total = (y_length * 2) * (laps + 2) + (x_length * 2 - y_length) * (laps + 2);
    
    var duration = total / move_speed;  //予想所要時間[min]
    
    document.getElementById("duration").innerHTML = Math.floor(duration);
    
    //結果全選択
    output.select();
}

function save(){
    var data = document.getElementById("output_textarea").value;
    var href = "data:application/octet-stream," + encodeURIComponent(data);
    location.href = href;
}


GcodeMaker_spiral.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Generate G-code</title>
        <script src="GcodeMaker_spiral.js"></script>
        <style type="text/css">
            input {
                display: block;
                width: 50px;
                float: left;
                margin-bottom: 5px;
            }
            label {
                display: block;
                width: 160px;
                float: left;
                text-align: right;
                padding-right: 5px;
            }
            br {
                clear: left;
            }
        </style>
    </head>
    <body>
        予想所要時間: 約 <span id="duration"></span>min.<br>
        <textarea id="output_textarea" wrap="off" style="width:250px; height:200px" readonly></textarea><br>
        <button type="button" tabindex="2" onclick="output()" style="width:150px;">OK</button>
        <button type="button" tabindex="0" onclick="save()" style="width:100px;margin-bottom:10px;">保存[chrome]</button><br>
            <label for="x_length">面出し範囲 X:</label>
            <input type="text" id="x_length" tabindex="1" onfocus="this.select()">[mm]<br>
            <label for="y_length">Y:</label>
            <input type="text" id="y_length" tabindex="1" onfocus="this.select()">[mm]<br>
            <label for="diam">スピンドル直径:</label>
            <input type="text" id="diam" tabindex="1" onfocus="this.select()">[mm]<br>   
            <label for="move_speed">水平送り速度:</label>
            <input type="text" id="move_speed" tabindex="1" onfocus="this.select()">[mm/min]<br>
            <label for="descend_speed">鉛直送り速度:</label>
            <input type="text" id="descend_speed" tabindex="1" onfocus="this.select()">[mm/min]<br>
            <label for="motor_rpm">スピンドル回転数:</label>
            <input type="text" id="motor_rpm" step="100" tabindex="1" onfocus="this.select()">[rpm]<br>
            <label for="depth">切削深さ:</label>
            <input type="text" id="depth" step="0.1" tabindex="1" onfocus="this.select()">[mm]<br>
            <label for="height">空中移動時高さ:</label>
            <input type="text" id="height" tabindex="1" onfocus="this.select()">[mm]<br>
    </body>
</html>

CNCフライスの面出し用Gコード生成ツールつくった

学校で使ってる基板加工機もとい卓上CNCフライスの平面出し用に。

以前こっそり公開したのよりもちょっと進化しました。前のは半ば黒歴史化してるのでURLは貼らないことにしますね

 

 

予想所要時間: 約 min.


[mm]
[mm]
[mm]
[mm/min]
[mm/min]
[rpm]
[mm]
[mm]

 

左下(原点)から内側に向かって時計回りにぐるぐる彫り進んでいきます。四隅が少し飛び出るようになっているので、実際の加工範囲は指定したxyの範囲よりも少しだけ大きくなります。

詳しくは出来上がったGコードと後で貼るソースコードを見てもらうのが早いかと。と言っても後者については早いかどうかわかりませんが……

あと、一応テキストエリアのGコードを保存できるようにしてみました。が、新しめのChromeでないと名前をつけて保存できない仕様になってます。FireFoxだとファイル名がランダムな文字列になるもよう。全選択からのコピペが一番早いような気もします。

 

不具合はコメントかTwitterにおねがいしますー

 

ソースコード(別記事)