DXF2NCの作成ドキュメント                             2006.02.12(日)〜 /

著作者名 :中野 良知 作成開始 :2006.01.12(日) 「CNCの実験」から転記。加筆。 更新 :2006.02.14(火) 図形の連結を追加。 更新 :2006.02.20(月) ワークXY原点の項目を追加。 : 最短ツールパス決定アルゴリズムを追加。 更新 :2006.02.21(火) 切削用図面の作成の項目を追加。 更新 :2006.03.03(金) サブプログラムの生成の項目を追加。 : NCコード生成の項目を追加。
概要 CADで作図したベアリングホルダーのDXFファイルをNCコードに変換するソフトウェア ーの作成資料です。 目次 1. ベアリングホルダーの図面 2. DXFデータ 2.1. ベアリングホルダーのDXFデータ 2.2. DXFファイルのセクション 2.3. エンティティセクション 2.4. 図形のエンティティ記述例 3. マニュアル変換 3.1. エンティティの取り出し 3.2. NCコードに変換 3.3. ボールペンテスト 3.4. Mach2でツールパス確認 4. 自動変換 4.1. プログラム 4.2. 図形データの取り出し 4.3. 構造体配列 4.3.1. 構造体配列の要素 4.4. 図形検出アルゴリズム 4.4.1. 単独図形検出 4.4.2. 複合図形検出 4.4.3. 検出の結果 4.5. 図形リンクテーブル 4.6. 図形の連結 4.7. 最短ツールパス決定アルゴリズム 4.8. NCコード生成 5. サブプログラムの生成 5.1. 単独図形のサブプログラム化 5.1.1. サブプログラムの呼び出し回数 5.1.2. サブプログラム名 5.1.3. 増分値指令 5.2. 複合図形のサブプログラム化 5.3. NCコード行数比較 6. ワークXY原点 6.1. 原点の設定 6.2. 処理プログラムの概略 7. 切削用図面の作成 7.1. 原点図面作成 7.2. 穴開け図面作成 7.3. 外形切削図面作成 7.4. DXFファイル保存 7.5. 図面とツールパス 1. ベアリングホルダーの図面 鍋CADで作図しました。 2. DXFデータ 2.1. ベアリングホルダーのDXFデータ ベアリングホルダー.DXF CADのメニューで「互換」「DXF」「書き出し」をクリックし、DXFファイルに保存し ました。 2.2. DXFファイルのセクション DXFファイルは下記の5つのセクションで構成されます。 1) ヘッダーセクション ファイルの始まり。 2) クラスセクション 未調査(無くても可?) 3) テーブルセクション 線種やレイヤーなどを定義します。 4) ブロックセクション 未調査(無くても可?) 5) エンティティセクション 図形データを記述します。 主に 5) エンティティセクション をNCコードへの変換時に使用します。 2.3. エンティティセクション エンティティセクションに1つ以上の図形が記述されています。 0 エンティティセクションの始まり SECTION 0 ENTITIES ↑ この間に図形のエンティティを1つづづ記述します。 ↓ 0 エンティティセクションの終わり ENDSEC 2.4. 図形のエンティティ記述例 1) 直線 長さ10mmの水平な直線。始点の座標がX=100、Y=100の場合。 DXF中の記述 内容 --------------------+------------------------------------------ 0 エンティティの始まり LINE 図形の種類(直線グループ) 8 レイヤー名をテーブル参照 NT4WORP000 レイヤー名(テーブルセクションに定義) 6 テーブル参照 CONTINUOUS 連続線 (テーブルセクションにLTYPEで定義) 10 Xスタートポイント 100.000000000000 値 20 Y(Z)スタートポイント 100.000000000000 値 11 Xエンドポイント 110.000000000000 値 21 Y(Z)エンドポイント 100.000000000000 値 --------------------+------------------------------------------ 2) 円 半径10mmの円。中心の座標がX=100、Y=100の場合。 DXF中の記述 内容 --------------------+---------------- CIRCLE 円 8 レイヤー名をテーブル参照 NT4WORP000 レイヤー名(テーブルセクションに定義) 6 線種をテーブル参照 CONTINUOUS 連続線 (テーブルセクションにLTYPEで定義) 10 X中心座標 100.000000000000 値 20 Y中心座標 100.000000000000 値 40 半径 10.000000000000 値 --------------------+---------------- 3) 円弧 半径10mmの円弧(上半分)。中心の座標がX=100、Y=100の場合。 DXF中の記述 内容 --------------------+---------------- ARC 円弧 8 レイヤー名をテーブル参照 NT4WORP000 レイヤー名(テーブルセクションに定義) 6 線種をテーブル参照 CONTINUOUS 連続線 (テーブルセクションにLTYPEで定義) 10 X中心座標 100.000000000000 値 20 Y中心座標 100.000000000000 値 40 半径 10.000000000000 値 50 始点中心角 0.000000000000 値(度) 51 終点中心角 180.000000000000 値(度) --------------------+----------------+------------------------------------ 3. マニュアル変換 マニュアルでDXFデータをNCデータに変換します。 3.1. エンティティの取り出し DXFファイルからエンティティセクションを取り出します。 取り出したエンティティセクション。 3.2. NCコードに変換 1) エンティティセクションを図形毎に分離します。 2) 実線("CONTINUOS")の図形をNCコードに変換します。 3) 図形の種類が円("CIRCLE")なら、単独の図形としてNCコードG02又はG03に変換しま す。 4) 図形の種類が直線("LINE")や円弧("ARC")なら、複合図形中の部品図形とします。 直線ならNCコードG01に、また円弧ならNCコードG02又はG03に変換します。 変換したNCコード。 そのツールパスです。 複合図形(外周)のリンク順を整合していない為に、ツールパスが右往左往してい ます。 4) 複合図形のリンク順を整合します。 パスのつながりを考慮して、部品図形のNCコードの順序と、始点と終点を入れ換え ます。 整合したNCコード。 使えそうなツールパスになりました。 3.3. ボールペンテスト Z軸移動のNCコードを追加し、ボールペンで切削ルートを描きました。 NCコード 3.4. Mach2でツールパス確認 2006.02.12(日) ロックヒルさんから、Mach2によるツールパス確認の連絡を頂きました。 旋盤で作る天体機材 4. 自動変換 自動でNCコードに変換し、ツールパスを決定するプログラムを作成します。 4.1. プログラム プロジェクト名:DXF2NC 開発環境 :Microsoft Visual C# 2005 Express Edition Beta2 4.2. 図形データの取り出し 1) DXFファイルの先頭からエンティティセクションまでを空読みします。 2) 各エンティティ毎に図形の種類と線種を判定します。 3) 線種が実線ならばエンティティからデータを取り出します。 4) 円のエンティティなら、終点座標X、Yと中心点I、Jを求めます。 5) 円弧のエンティティなら、始点と終点の座標を求めます。 6) 直線はエンティティそのままの値です。 以上の結果をリストに表示したところです。 4.3. 構造体配列 DXFファイルから取り出した個々の図形データ(エンティティ)を構造体配列に格納し 、図形No.と構造体メンバーを指定することで、図形データを参照できるようにしま す。 4.3.1. 構造体配列の要素 図形データを格納した構造体配列のイメージです。 数字(配列の添え字)は図形No.です。 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│10│11│12│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ↓ 各配列の要素は下記の構造になります。 // 図形データ格納用構造体の定義 public struct entity { public string figure; // 図形の種別 public int attribute; // 属性(リンク元の図形No.) public double start_point_x; // 始点X public double start_point_y; // 始点Y public double end_point_x; // 終点X public double end_point_y; // 終点Y public double start_angle; // 始点角 public double end_angle; // 終点角 public double radius; // 半径 public double center_x; // 中心点X public double center_y; // 中心点Y public double center_i; // 中心点I public double center_j; // 中心点J }; // entity型配列 Fig[]を宣言 public entity[] Fig = new entity[10000]; /* 構造体メンバーへの代入例 */ // 図形の種別を代入します。 Fig[fig_no].figure = "LINE"; /* 構造体メンバーの参照例 */ // 図形の種別を取り出し、リストへ表示します。 listBox1.Items.Add("図形 =" + Fig[fig_no].figure); DXFファイルから構造体配列に格納したデータを、図形No.で順次参照し、リストに出 力しました。 4.4. 図形検出アルゴリズム 4.4.1. 単独図形検出 DXF2NC Appの単独図形検出のアルゴリズムです。 図形データを格納した構造体配列のイメージです。数字(添え字)は図形No.です。 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│10│11│12│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │→ 構造体メンバーのfigureが"CIRCLE"と一致する図形を検索します。 ↓ ↓ ↓ 一致したら単独図形とします。 4.4.2. 複合図形検出 複合図形のリンク順検出のアルゴリズムです。 1) ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│10│11│12│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │→ 構造体メンバーのfigureが"CIRCLE"以外の図形を検索します。 ↓ 図形No.4 "ARC"を検出しました。 2) ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│10│11│12│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │→ 図形No.4と始点又は終点が一致する図形を検索します。 ↓ 一致したら構造体メンバーのattributeに4を代入し ます。(図形No.4からリンク) 3) ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│10│11│12│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │→ 図形No.7と始点又は終点が一致する図形を検索します。 ↓ 一致したら構造体メンバーのattributeに7を代入し ます。(図形No.7からリンク) 3)と同様な処理を配列最後のデータまで繰返すか、初めの図形No.4にリンクが戻るま で繰返します。 結果:4→7→10→5→11→6→9→8→12→(4) がリンク順になります。 *1: 複合図形として最初に検出した図形No.4のattributeには、自身の図形No.4を代 入します。 リンク順検出の最後で、図形No.12から4にリンクする場合は、12 に書き換えます。 *2: 始点又は終点の一致検索では、figureが"CIRCLE"又はattributeが0以外の図形は 検索の対象外です。 *3: 図形No.0にはワークの原点座標データを格納し、NCコード生成時にワーク原点 からの座標を求めるときに使用する予定です。 4.4.3. 検出の結果 プログラムで単独図形と複合図形をそれぞれ検出した結果をリストに表示しました。 リストした単独図形は上から、左ビス穴、ベアリング取付穴、右ビス穴です。 複合図形は、右端下の円弧(○印)から右回りで外周を回り、右端上の円弧に戻る順に なります。 外周右端の円弧は、CADで円を円弧に分割した時に中心線で2分された結果、上下に 分かれました。 4.5. 図形リンクテーブル ツールパスを決定する時に使用する図形リンクテーブルを作成します。 単独図形と複合図形の図形Noを、検出順に図形リンクテーブルへ格納します。 リンクテーブルです。 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ 1│ 0│ 2│ 0│ 3│ 0│ 4│ 7│10│ 5│11│ 6│ 9│ 8│12│ 0│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ↑ ↑ │←───────────────→│ │ └─図形の区切り 複合図形リンク 図形No 図形リンクテーブルのデータをリストに表示しました。 4.6. 図形の連結 ツールパスを決定するために、図形同士の連結ポイントを求めます。 図形リンクテーブルです。 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ 1│ 0│ 2│ 0│ 3│ 0│ 4│ 7│10│ 5│11│ 6│ 9│ 8│12│ 0│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │ ↑│ ↑│ ↑│↑│↑│↑│↑│↑│↑│↑│↑ └──┘└──┘└──┘└┘└┘└┘└┘└┘└┘└┘└┘ 1) はじめに現在座標をx_cur、y_curとします。x_cur = y_cur = 0 です。 2) 図形No.1を指定し、x_cur、y_cur(現在座標)から図形No.1の始点又は終点の座標 までで、より距離の近い方の始点又は終点の座標を選択し、x_start、y_startに それぞれの値を代入します。 3) 図形No.1の始点又は終点で、現在座標よりも遠い距離にある方を、x_end、y_end に代入します。 4) 現在座標からの移動は、x_cur,y_cur → x_start,y_startです。 NCコードでは、G00 Xx_start Yy_start になります。 5) 図形のx_startからx_endまで、工具が移動することになります。 6) x_end、y_endまで移動したことにして、x_curとy_curにx_endとy_endの値をそれ ぞれに代入します。 7) 図形No.1のリンク先図形No.2を指定します。 8) 2)から7)と同様の処理を繰返します。 9) 複合図形(No.4からNo.12)では、4)の処理をスキップします。 図形間の連結ポイントを検出し、リストに表示しました。 座標値は見やすくするために、少数点第一位で四捨五入しています。 4.7. 最短ツールパス決定アルゴリズム 図形検出アルゴリズムを改造した、最短のツールパスを決定するアルゴリズムです。 元になる図形のツールパスの終点に最も近い始点又は終点を持つ図形を、図形データ 構造体配列から抽出しリンクします。 新たにリンクした図形を元にして順次図形を 抽出しリンクテーブルを作成します。 1) ワークの原点から最も近いツールパスを持つ図形を検索します。 図形データを格納した構造体配列のイメージです。数字(添え字)は図形No.です。 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│10│11│12│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │→ 構造体メンバーの始点又は終点の座標が原点から一番近い図形を検索し │ ます。 ↓ リンクテーブルへ図形No.を代入します。 ┌─────────────────────┘ ↓ リンクテーブルです。 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │11│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ↑ ↑ │ └─図形の区切り 図形No 2) 抽出した図形のツールパスを決定します。 図形データの始点と終点のうち、原点に近い方の座標をツールパスの先頭とし、 遠いほうを終点とします。 3) 図形のツールパスの終点に最も近い始点又は終点の座標を持つ図形を検索します。 図形のツールパスの終点と新たに抽出した図形が直に接続する場合は、リンクテ ーブルの隣の要素へ抽出した図形Noを格納します。 離れている場合は図形の区切りコード(0)の隣へ格納します。 図形データを格納した構造体配列 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│10│11│12│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │→ 構造体メンバーの始点又は終点の座標が原点から一番近い図形を検索し │ ます。 ↓ リンクテーブルへ図形No.を代入します。 ┌───────┘ ↓ リンクテーブル ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │11│ 5│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ 0│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ↑ └─ 接続する図形は隣へ格納 4) 3)を繰り返し実行しリンクテーブルを完成します。 リンクテーブル ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │11│ 5│10│ 7│ 4│12│ 8│ 9│ 6│ 0│ 2│ 0│ 1│ 0│ 3│ 0│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │←───────────────→│↑ ↑ ↑ ↑ 複合図形リンク │ └───┴───┘ │ 単独図形 図形の区切り リンクテーブルと生成したNCコードをリストに表示しました。 4.8. NCコード生成 図形の種類を選別し、図形データを元にNCコードを生成します。 ○の部分は図形データから数値を引用し文字列に変換します。 1) 直線なら "G01 X○ Y○" 2) 円なら "G02 X○ Y○ I○ J○" 3) 円弧なら 1. 移動方向を図形データの終点とパスの終点との関係で決定します。 "G02" か "G03" 2. 大小の円弧を、中心角により決定します。 中心角 <= 180度 なら "R"。 中心角 > 180度 なら "-R"。 "G02 X○ Y○ R○" プログラム例: //======================================================== // NCコード生成 // 引数: f = 図形No // : xend = 図形のパスの終点X座標 // : yend = 図形のパスの終点Y座標 //======================================================== private string nc_code(int f, double x_end, double y_end) { string radius; string nc = null; // G01 if (Fig[f].figure == "LINE") { // 直線なら nc = ("G01 X" + (x_end - Fig[0].start_point_x).ToString() + " Y" + (y_end - Fig[0].start_point_y).ToString()); } // 円 G02/G03 if (Fig[f].figure == "CIRCLE") { // 円なら // 移動方向は右回りでNCコード組み立て nc = "G02 X" + (x_end - Fig[0].start_point_x).ToString() + " Y" + (y_end - Fig[0].start_point_y).ToString() + " I" + Fig[f].center_i.ToString() + " J" + Fig[f].center_j.ToString(); } // 円弧 G02/03 if (Fig[f].figure == "ARC") { // 円なら // 移動方向を決定 if (Fig[f].end_point_x == x_end && Fig[f].end_point_y == y_end) { // 図形データの終点とパスの終点が等しければ、左周り nc = "G03 X"; } else { // 図形データの始点とパスの終点が等しければ、右回り nc = "G02 X"; } // 大小の円を決定 if (Math.Abs((Fig[f].end_angle - Fig[f].start_angle)) > 180) { radius = " -R" + Fig[f].radius; } else { radius = " R" + Fig[f].radius; } // NCコード組み立て nc = nc + (x_end - Fig[0].start_point_x).ToString() + " Y" + (y_end - Fig[0].start_point_y).ToString() + radius; } return nc; } 5. サブプログラムの生成 深さ方向の切削量が多い場合は、分割して切削します。 分割した回数分のNCコードを作成し順次実行する方法と、サブプログラム化したNCコ ード作成し分割回数分繰り返し実行する方法があります。 DXF2NC Appでは、サブプログラムの自動生成をするようにしました。 5.1. 単独図形のサブプログラム化 図形リンクテーブルが下図のような場合、図形No.2、1、3は単独の図形です。 ┌─┬─┬─┬─┬─┬─┐ │ 2│ 0│ 1│ 0│ 3│ 0│ └─┴─┴─┴─┴─┴─┘ NCコード格納用の文字列型配列を2種類用意します。 1) メインNCコード格納用 struct [] nc_main = new struct[10000]; 2) サブNCコード格納用 struct [] nc_sub = new struct[10000]; 原点が初めの図形で、パスの終点がX=0、Y=0、Y=0にあるとします。 配列添え字を格納する変数をm、sとします。初期値はともに0です。 ●原点からリンクテーブルの先頭図形にリンクします。 ↓ ┌─┬─┬─┬─┬─┬─┐ │ 2│ 0│ 1│ 0│ 3│ 0│ └─┴─┴─┴─┴─┴─┘ メインNCコード 1) パスの終点からツールを上昇させます。 nc_main[m++] = "G00 Z2"; 2) 図形No.2(No.1、No.3の順)の始点までツールを運びます。 nc_main[m++] = "G00 X10 Y10"; 3) ワーク面までツールを下げます。 nc_main[m++] = "G01 Z0" 4) サブプログラムをコールします。 nc_main[m++] = "M98 P10 L10"; ← *後述 サブNCコード 5)サブプログラム名を格納します。 nc_sub[s++] = "O10"; ← *後述 6)増分値指令でツールを下げます。 nc_sub[s++] = "G91 G01 Z-0.2"; ← *後述 7)絶対値指令にします。 nc_sub[s++] = "G90" 8)図形のNCコードを格納します。 nc_sub[s++] = "G02 X5 Y5 I0 J5"; ← *1 9)サブプログラム終了コードを格納します。 nc_sub[s++] = "M99"; *1 図形により変わります。 10) リンクテーブルの全ての図形を処理していなければ、 パスの終点をリンク先の図形(No2.、No.1の順)の終点と入れ換えます。 ┌─┬─┬─┬─┬─┬─┐ │ 2│ 0│ 1│ 0│ 3│ 0│ └─┴─┴─┴─┴─┴─┘ ↓ 図形の終点 ↓ パスの終点とします。 11) 次の図形No.を指定し1)へ戻します。 ┌─┬─┬─┬─┬─┬─┐ │ 2│ 0│ 1│ 0│ 3│ 0│ └─┴─┴─┴─┴─┴─┘ │ ↑次の図形にリンクします。 └───┘ 12) リンクテーブルの全ての図形を処理したら、ワーク面よりツールを上げます。 nc_main[m++] = "G00 Z2"; 13) X、Yの原点に戻します。 nc_main[m++] = "G00 X0 Y0"; 14) メインコードの後半部にサブコードを付け加えます。 for( i = 0; i < s; i++){ nc_main[m++] = nc_sub[i]; } 5.1.1. サブプログラムの呼び出し回数 "M98 P10 L10"の"L10"がサブプログラムの呼び出し回数になります。 サブプログラム中で、深さ方向に増分値0.2mmで、仕上り深さ2mmまで切削する場合 呼び出し回数 = 仕上り深さ ÷ 増分値 になります。 Appプログラムの記述: // 呼び出し回数を計算 z_loop = z_result / z_step; // NCコード生成 nc_main[m++] = "M98 P" + sub_prog_no.ToString() + " L" + z_loop.ToString(); ↓ sub_prog_noには、各サブプログラムに割り当てるサブプ ログラム名(数値)が入っています。 ToString()で文字列に変換し、"M98 P"に結合します。 z_loopも文字列に変換し、" L○"に結合します。 nc_main配列要素に代入された文字列は、"M98 P○ L○"です。 5.1.2. サブプログラム名 "O10"の"O"(オー)に続く数字が、個別のサブプログラム名を表します。 Appプログラムの記述: // NCコード生成 nc_sub[s++] = "O" + sub_prog_no.ToString(); // 次の為にサブプログラムNoを更新。 sub_prog_no += 10; 5.1.3. 増分値指令 "G91 G01 Z-0.2"の"Z"に続く数字が増分値になります。 Appプログラムの記述: // NCコード生成 nc_sub[s++] = "G91 G01 Z" + z_step.ToString(); 5.2. 複合図形のサブプログラム化 基本は単独図形の場合と同じです。 サブNCコード配列に、リンクする図形の個数分の図形のNCコードを順次代入します。 Appプログラムの記述: nc_sub[s++] = "G02 X5 Y5 I0 J5"; // 半径5の円 nc_sub[s++] = "G01 X20"; // 直線 nc_sub[s++] = "G02 X20 Y5 I0 J5"; // 半径5の円 . . . 5.3. NCコード行数比較 NCサブプログラム生成のONとOFFで、それぞれ生成したNCコードの行数です。 深さ3mmまで、0.2mmステップで切込みます。(2006.03.02(木)バージョン) 図形 ON OFF ----------------------------+---------+--------- ベアリングホルダー取付穴 20 53 〃 穴切抜 59 247 〃 ビス穴 33 99 〃 外形 25 160 〃 外形切抜 83 427 〃 一括 65 298 ioio 119 490 半円加工 19 67 コーナー(┐)加工 23 97 作成したNCコードを手直しする場合は、行数の少ないONの方が有利です。 またONは往復切削を行う為、切削時間がOFFより短くなります。 6. ワークXY原点 図面の基点は左下隅にあり、図形は通常図面の中央付近にあります。 基点から図形 までの距離が大きいため、図面の基点をワークの原点にすると、小型のフライス盤で は、ツールパスがワークテーブルをはみ出す恐れがあります。 図形の近くにワーク原点を設定することで上記の問題点を回避します。 6.1. 原点の設定 直交する水平線と垂直線の交点を原点とします。 原点を作図したDXFデータを読み込み、2本の直線の交点座標を求め、図形データ構造 体配列に格納します。 6.2. 処理プログラムの概略 1) 「原点ファイルを開く」メニューイベントで、NCコードと関連する変数を一時退 避します。 // 図形ファイル処理情報を保存 src_end_m = src_end; nc_end_m = nc_end; // ファイル名を保存 file_name_m = file_name; // NCコードを退避 for (i = 0; i < 100; i++) { temp[i] = src_code[i]; } 2) 図形のDXF-NC変換メニューのクリックイベントをコールし、2本の直交する直線の みを作図した図面のDXFデータファイルを読み込み、DXF-NC変換処理で2本に直交 する直線のNCデータを作成します。 3) 「原点ファイルを開く」イベントに戻ったら、2本の直線の図形データから直線の 交点の座標を検出し、構造体配列の添え字番号0の要素に代入します。 // 図形1から原点の一方を求める if (Fig[1].start_point_x == Fig[1].end_point_x) { // 水平線なら Fig[0].start_point_x = Fig[1].start_point_x; } if (Fig[1].start_point_y == Fig[1].end_point_y) { // 垂線なら Fig[0].start_point_y = Fig[1].start_point_y; } // 図形2から原点のもう一方を求める if (Fig[2].start_point_x == Fig[2].end_point_x) { // 水平線なら Fig[0].start_point_x = Fig[2].start_point_x; } if (Fig[2].start_point_y == Fig[2].end_point_y) { // 垂線なら Fig[0].start_point_y = Fig[2].start_point_y; } 4) 一時退避していた、NCコードと関連のデータを復旧します。 7. 切削用図面の作成 工具径Φ2mmを考慮した切削用の図面を鍋CADで作成しました。 1) ページ0に完成時のベアリングホルダーの図面(作図済み) 2) ページ1にワーク原点の図面 3) ページ2に穴開け図面 4) ページ3に外形切削の図面 です。 7.1. 原点図面作成 1) 線種は実線を選択します。(以下全て実線です) 2) ページ0を背景にし、ページ1を前面にします。 3)「Dim]でベアリングホルダーの中心から、左端と下端までの寸法を測ります。 4)「Move」「オフセット」でオフセット量を中心から左端までの寸法にします。 5) 縦の中心線の少し左側をクリックします。 図形の左端に接する垂線が引かれます。 6) 同様にして、図形の下側に接する水平線を引きます。 7)「Edit」「線分調整」で2本の直線が交わるようにします。(必要なら) 7.2. 穴開け図面作成 1) ページ0を背景にし、ページ2を前面にします。 2)「Move」「オフセット」でオフセット量を1mmにします。 3) 円の少し内側をクリックします。 内側に円が描かれます。 4) スペースキーを押します。 オフセット量1mmが再セットされます。 5) 全ての円について3)から4)を繰返します。 7.3. 外形切削図面作成 操作は穴開け図面作成と同様です。 1) ページ0を背景にし、ページ3を前面にします。 2) スペースキーを押します。 オフセット量1mmが再セットされます。(穴明け図面作成で使用した値です) 3) 外形を構成する直線や円弧の少し外側をクリックします。 外側に直線や円弧が引かれます。 4) 全ての外形線について2)から3)を繰返します。 7.4. DXFファイル保存 1)「互換」「DXF」「書き出し」を順にクリックします。 2) 保存するファイル名を指定します。 3) DXF出力オプションで、「□図形要素を出力する」にチェックをし、他の項目のチ ェックを外します。 4) 「OK」釦をクリックします。 7.5. 図面とツールパス 操作方法を書くと長いですが、あっと言う間に切削用図面が完成します。 外形切削図面で直線と円弧のつながりは、倍率をいくら上げても段差なく接続されて います。 鍋CADの交点処理は優れていてとても便利です。 CNC Appに、工具径補正コードG40、G41、G42の機能追加の緊急度がなくなりました。 4つのページを重ねた図面です。 DXF2NC Appで、完成、切削用外形、切削用穴開けのツールパスを描きました。
次回の更新に続きます。
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
ページのTopへ:2006.02.12〜 CNCの実験へ:2005.09.04〜2005.12.31
サイトのTopへ
inserted by FC2 system