NCデータをDXF変換するためのDXFフォーマットを解説します

NC

前回公開した、NCデータ確認ソフトに、少し名前を変更しDXF変換機能を追加しました。


「NcCheck2Dxf Ver3.41」こちらからダウンロードできます。


機能追加にあたり、DXFファイルの情報を集めなおしたので、今回はDXFについての記事を書いてみます。

以前の記事で、DXFには少し触れていますので、興味ある方は下記もご覧ください。

こちらは、DXFファイルから、円要素のみを穴情報として取り出し、簡易的な穴加工用NCデータを作成するソフトでした。
今回は、逆にNCデータからDXFファイルを作成しようと思います。
DXFフォーマット仕様は、私はあまり理解していませんが、手元にある古~い資料と他CADから吐き出したDXFファイル、さらにネット上の情報などを参考に書いていこうと思います。

DXFファイルフォーマット

DXFはAutodesk社のAutoCADの図面情報が記述されているテキストファイルで、他CADとの互換性を重視して規定しているフォーマットです。
そのため多くのCADがサポートしているので、事実上の標準フォーマットと言えるデータ構造です。

DXFを構成するグループ

DXFはグループの集まりです。
2行で1グループの構成で、最初がグループコード、次がグループ値です。
グループコードは、右寄せで3文字になるように左をスペースで埋めた正の整数です。
グループ値は、グループコードによりその変数の型が異なります。
古い情報ですが、下記のように決められています。

グループ・コード  グループ値
++++++++++++++++++++++++++++++++++++++++++++++++
0 ~ 9       文字列
    0    ファイルの分離符号、データの開始
    1    一つのデータに対する最初の文字の値
    2    名前(属性名称、複合図形名など)
   3-5    その他の文字の値あるいは名前の値
    6    線種名
    7    字体名
    8    画層名
    9    変数名を特定(HEADERセクションのみ)
--------------------------------------------------
10~59      浮動小数点
    10   最初のX座標(線分、円中心、文字始点など)
  11-18   その他のX座標
    20   最初のY座標
  21-28   その他のX座標
    30   最初のZ座標
  31-36   その他のX座標
    38   0でなければ、この図形の高度
    39   0でなければ、この図形の厚さ
  40~48   浮動小数点値(文字高さ、尺度など)
    49   反復される値(LTYPE ダッシュの長さなど)
  50~58   角度
-----------------------------------------------------
60~79       整数 
    62   色番号 
    66   後続図面ありフラグ
  70~78   反復数、フラグ、ビット、モードなど整数値 
-------------------------------------------------------  

AutoCAD 2011の情報は、こちらに公開されています。
各データテーブルの記入項目、ファイル分離符号は、常にグループコード「 0」で始まり、次の行に項目を説明する名前が続きます。

DXFの構成

一般的なDXFファイルの構成は、以下のようなイメージです。
DXFバージョンによっては、他にもいくつかのセクションがあるようですが変換ソフトでは、下記から「BLOCKS」を除いた、3つのセクションで構成しようと思います。

----------------------------------------
HEADER セクション
  図面の情報データ、空間など
----------------------------------------
TABLES セクション
  線種、色、レイヤー、スタイルなど
----------------------------------------
BLOCKS セクション
  ブロック図形のデータ
----------------------------------------
ENTITIES セクション
  線・円弧など、図面データ
----------------------------------------
END OF FILE
  ファイルの終わり
----------------------------------------

一つのセクションは、
 0
SECTION
で始まり。
 0
ENDSEC
で終わります。

HEADER(ヘッダ) セクション

HEADERセクションは、図面に関する変数設定が記述されます。
AutoCAD 2011 の情報がこちらにありますが、別のCADで吐き出したDXFファイルのヘッダー部分をそのまま使用しても問題ないと思いますが、
公開の変換ソフトでは、図形要素が主な目的なので、このセクションは省略しても手持ちのCADでの読み込みは問題ありませんでした。
私は、「$ACADVER」のAutoCAD のバージョン番号のみ定義する事にします。
なるべく古いDXF形式のほうが互換性はありそうなので、新しい機能は使用せず「AC1006」バージョン程度の指令とします。

  0
SECTION
  2
HEADER
  9
$ACADVER
  1
AC1006
  0
ENDSEC

TABLES(テーブル)セクション

TABLESセクションには、いくつかのTABLEが含まれます。
AutoCAD 2011 のTABLEセクション
ここでは、「LTYPE(線種)」「LAYER(画層)」のみを設定します。
各TABLE の順番は変化するかもしれませんが、「LTYPE」は常に「LAYER」より先に定義します。

LTYPE(線種)テーブル

LTYPEテーブルは、グループ「 2」に続いて「LTYPE」が指示され、続いて「 70」の後に、「LTYPE(線種)」の最大数を指定します。

  0
SECTION
  2
TABLES
  0
TABLE
  2
LTYPE
 70
     6

次に「 0」に続いて具体的な「線種」を定義していきます。
他CADが吐き出したDXFファイルを参考にしました。
種類は一般的な「CONTINUOS:実線」「DOT:点線」「HIDDEN:隠れ線」「DASHED:破線」「CENTER:一点鎖線」「PHANTOM:二点鎖線」の6種類とします。
種類は「 2」に続いて、線種名「CONTINUOS」などを設定し
次に「 70」に続いては標準フラグ値の設定ですが、AutoCADコマンド用みたいで無視してよいとの事なので「0」にしました。
次に「 3」に続いて、線種の説明「Solid line」などを定義します。
次に「 72」に続いては、位置合わせコードとなっていますが、常に「65」のようです。
次は「 73」に続いて、線種パターンの要素数です。
要素数は、プロッタで描く場合を想像し「ペンダウン」の場合と「ペンアップ」の場合をそれぞれ1と数えます。
ただし、「実線」の場合は少し特殊で「0」となるようです。
続いて、「 40」でパターンの全長、「 49」で「ペンアップ・ダウン」の長さを指定します。
ペンダウンはプラス符号、ペンアップはマイナス符号になります。
ここも、「実線」の場合は、「0.0」になるようです。

実線の定義

  0
LTYPE
  2
CONTINUOUS
 70
      0
  3
Solid line __________
 72
     65
 73
      0
 40
0.0

点線の定義

点線は、「ペンダウン:0.1」「ペンアップ:1.0」としてみます。

  0
LTYPE
  2
DOT
 70
0
  3
Dot line ..........
 72
     65
 73
      2
 40
1.1
 49
0.1
 49
-1.0

一点鎖線(センターライン)の定義

一点鎖線は、「ペンダウン:5.0」「ペンアップ:1.0」「ペンダウン:1.0」「ペンアップ:1.0」とします。

  0
LTYPE
  2
CENTER
 70
     64
  3
Center line ___ _ ___
 72
     65
 73
      4
 40
8.0
 49
5.0
 49
-1.0
 49
1.0
 49
-1.0

LTYPEテーブルの終了

各テーブルの終了は「 0」に続き「ENDTAB」を定義します。

  0
ENDTAB

LAYER(画層)テーブル

LAYERテーブルも、まずはグループ「 2」に続いて「LAYER」が指示され、続いて「 70」の後に、「LAYER(画層)」の最大数を指定します。

  0
TABLE
  2
LAYER
 70
     20

続いて、レイヤーの名前や色、事前に設定されている線種を定義します。
「 2」に続いて適当なレイヤー名、次に「 70」に続いては「LTYPE」と同様に「 0」でよさそうです。
次に「 62」に続いて色番号を定義します。
基本的な色番号は

1:赤
2:黄
3:緑
4:水
5:青
6:紫
7:白

となります。
次は「 6」に続いて、「LTYPE」で定義された線種名を指定します。
テーブル終了は同様に「 0」「ENDTAB」で終了します。

  0
LAYER
  2
Move
 70
      0
 62
      1
  6
DOT
  0
LAYER
  2
Center
 70
      0
 62
      7
  6
CENTER
  0
ENDTAB

STYLE(文字スタイル)テーブル

ここも最初のSTYLEテーブルの宣言は同様で、「 2」に続いてスタイル名を定義するのも同じです。
作成するDXFデータに「文字」を使用しない場合には、このテーブルは不要かもしれませんが、とりあえず1つだけ「STANDARD」の名前で定義しておこうと思います。

  0
TABLE
  2
STYLE
 70
      1
  0
STYLE
  2
STANDARD
 70
      0
 40
0.0
 41
1.0
 50
0.0
 71
      0
 42
1.0
  3
TXT
  4
BIGFONT
  0
ENDTAB

ENTITIES(図形)セクション

ここからようやく図形要素を定義していきます。
前述の線種やレイヤーなどの属性が必要なければ、「ENTITIES」セクションだけでもいいということになります。
「ENTITIES」は、かなり多数の図形要素を定義できますが、2Dレベルの図形をDXFに変換する目的であれば、
直線(LINE)、円(CIRCLE)、円弧(ARC)、点(POINT)、程度でいいと思いますが、図形の最大最小や加工時間など、コメントなどもDXF内に含めたい場合には、文字列(TEXT)もあると便利ですね。
また、AC1012(R13)のバージョンあたりから、サブクラスマーカーと呼ばれるグループコードが標準化されたようですが、ここではそれ以前の単純な方法を使っていきたいと思います。

共通のグループコード

まずは、上述のセクションと同様に、
「 0」「SECTION」「 2」「ENTITIES」として図形セクションの定義が始まる事を宣言します。
その後、「 0」に続いて「図形タイプ」(LINE など)、
「 8」に続いて「レイヤー名」
その次から、図形の座標値が定義されていきます。
座標は、「10」「20」「30」それぞれに続いて始点や中心の「X,Y,Z」座標。
「11」「21」「31」は終点の「X,Y,Z」座標。
「40」は円弧半径。「50」「51」は円弧の「開始・終点角度」となります。

LINE(線分)

「ENTITIES」セクション宣言後、「 0」に続いて、図形タイプ「LINE」を指示します。
次に「 8」の次で「LAYER」で定義済みのレイヤー名を指定する事で、この線分を任意のレイヤーに含める事ができます。
「 62」や「 6」のグループコードを使用して、この線分のみの「色番号」や「線種」を指定する事もできます。
設定しなくても、問題はありません。
次の「 10」「 20」「 30」で線分の開始点の「X , Y , Z」座標を設定します。
Z軸が必要ない場合は、省略できます。
続けて、「 11」「 21」「 31」で線分の終点を指示します。

  0
ENDSEC
  0
SECTION
  2
ENTITIES
  0
LINE
  8
Center
 10
-20.1230
 20
0.0000
 11
20.7890
 21
0.0000
  0
LINE
  8
Center
 10
0.0000
 20
-20.5670
 11
0.0000
 21
20.8960
  0
ENDSEC

ARC(円弧)

円弧も線分と基本的には定義の方法は同様ですが、
図形タイプが「ARC」になり、「 10」「 20」「 30」のグループコードは円弧の中心座標となります。
次に「 40」で円弧半径を定義し、「 50」「 51」で円弧の開始角度、終了角度を指示します。
真円の場合には、次に説明する「CIRCLE」を使用するのが基本ですが、「ARC」でも「50」「51」を「0.0 , 0.0」や「0.0 , 360.0」とする事で真円と認識してくれるCADもありましたが、図形を描いてくれないCADもありました。
やはり、円と円弧は別に定義したほうがよさそうですね。

  0
ARC
  8
Nomal
 10
0.0000
 20
0.0000
 40
50.0000
 50
15.1230
51
260.5670

CIRCLE(円)

円は、円弧に比べると図形タイプを「CIRCLE」とし、「 50」「 51」のグループコードが省略された形になっています。

  0
CIRCLE
  8
Nomal
 10
0.0000
 20
0.0000
 40
50.0000

EOF(ファイルの終了)

最後に、「End Of File」ファイル終了コードを挿入して終了となります。

  0
EOF

NCデータからDXFファイルを作成するには、この程度の仕様でいいと思います。

NcCheck に DXF変換機能追加しました。

前回公開した、「NcCheck.exe Ver2.6」にDXF変換機能を追加し
「NcCheck2Dxf.exe Ver3.2」として公開します。
ウィンドウサイズとフォント状態を記憶する仕様としました。
「NcCheck2Dxf.exe Ver3.4」として公開します。
「NcCheck2Dxf.exe Ver3.41」として公開します。

ダウンロード

Vector には登録申請中です。
登録終了しましたら、こちらにアドレスをリンクします

コメント

  1. ZENKYU より:

    かずばんさん、おつかれさまです。

    記事の中で下記の部分が NcCheck3 になってますね。

    >「NcCheck3Dxf.exe Ver3.1」として公開します。
    >———————————————
    >ダウンロード
    >———————————————

    さっそく使ってみました。
    フォントの変更もできるようになって見やすくなってありがたいです。

    既にフォントを変更してしまって初期のフォントがなにになっていたのか
    忘れてしまいましたが、変更したフォントでも Edit 状態でデータを変更すると
    やはり違ったサイズで入力されますね。今回はアルファベットだけでなく数字もでした。

    でも更新してCheck モードに戻ると設定フォントに揃う(戻る)ようなので
    編集中は変更した箇所が分かり易くていいかもです。

    ファイル先頭、末尾の矢印ボタンも付いて操作性がアップです。
    CTRL+Home、CTRL+End も使えますね。ウレシイ。

    「DXF作成」は同名ファイル上書き仕様のようですね。

    DXFファイルの内容はなんとなく分かってはいるんですが
    かずばんさんの解説をじっくり読み返してみてヘッダーファイルを
    自分の環境に合わせて書き換えてみようと思います。

    • kazuban kazuban より:

      ZENKYUさん、いつもありがとうございます
      フォントの異常はよくわかりませんが、どうにか使ってください。
      私自身、ノートとかでやってると、小さくて見えにくいので、フォント変更機能を追加しました。
      >「DXF作成」は同名ファイル上書き仕様のようですね。
      これは、公開前には、上書きしないようバックアップファイル仕様にしようと思って
      忘れてました。
      NcCheck3Dxf.exe Ver3.2 で変更しました。

  2. ZENKYU より:

    かずばんさん、動作報告です。

    次のプログラムで全体を描画した後、上矢印で N17 まで上にカーソルを戻すと
    X軸の描画が消えますよね。
    ここで Redraw を押すとX軸の描画が戻ってきますが
    N17 の線が消えます。

    下矢印を押そうとしますがNCデータの表示部のフォーカスが失われていて
    マウスでフォーカスを戻さないといけないようですね。

    そして Redraw ボタンが無効化して押せなくなります。
    「NcCheckToDxf」全体の「ウィンドウサイズ」の大きさを変えたり
    他のソフトにフォーカスを移したりすると Redraw ボタンが有効になります。

    %
    O0001
    N01 G54G90G00G40
    N02 T10
    N03 M06
    N04 G10P01R5.0
    N05 G00X0Y0
    N06 G43Z50.H10
    N07 S1200
    N08 M03
    N09 G00X-70.0
    N10 Z5.0
    N11 G01Z1.0F500
    N12 G01Z-15.0F200
    N13 G41D01G01X-50.0F300
    N14 G02X0Y50.0Y50.0I50.0
    N15 G01X40.0
    N16 G02X50.0Y40.0J-10.0
    N17 G01Y0
    N18 G01X70.0
    N19 G40G01X70.0Y20.0
    N20 G00Z50.0
    N21 G00X0Y0
    N22 M09
    N23 M05
    N24 M30
    %

    あとフォントの変更が次回起動時に反映されるようにできるとうれしいな。

    • kazuban kazuban より:

      ZENKYUさん、動作報告ありがとうございます
      助かります。
      矢印UPでX軸の一部が消えるのは、切削移動指令とX軸が重なっているため
      矢印UPで、その移動描画を消しているので、その部分のX軸部分が
      消えていると思います。
      ここは認識していたのですが、ちょっと手抜きな部分です。(^^ゞ
      Redraw ボタンに関しては、「ResetScale」を設置した時に、使用しない方針で作成していたのですが、どうもどこかの編集時に動作がおかしくなっているようです。
      さらに、「SetScale」「ResetScale」が使えなくなっていますね・・?
      週末時間があったら、見直してみます。

      • ZENKYU より:

        >さらに、「SetScale」「ResetScale」が使えなくなっていますね・・?

        こちらではこれは動作していますよ。

タイトルとURLをコピーしました