サンプルファイルでざっくり理解するDXF

#この記事について
この記事はDXFの細かい仕様を理解する前にざっくりと概要や全体感を知りたい人向けの記事です。
DXFファイルの仕様は[公式のDXFリファレンス](http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WSfacf1429558a55de185c428100849a0ab7-5f35.htm)に正確で詳細な記載がありますのでそちらも合わせてご確認ください。

#DXFファイルとは
米Autodesk社が定義したCADファイルの形式です。いわゆる設計図を保存するデータ形式としてものづくりに関わる幅広い業界で使われています。CADの中間ファイルの一形式で実態はテキストファイル（であることが多い）です。

##中間ファイルとは
異なるソフト間でデータをやり取りするため開発された、ソフトに依存しない形式のファイルのことで、CADに限らず[電子書籍の中間ファイル](https://www.kddi.com/yogo/%E6%83%85%E5%A0%B1%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0/%E9%9B%BB%E5%AD%90%E6%9B%B8%E7%B1%8D%E4%B8%AD%E9%96%93%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88.html)なんかも一時期賑わってましたが、最近だとCAD以外でほとんど聞かなくなってきました（CAD界隈でも聞くことが少なくなってきました）ね。。。



##どんな時に中間ファイルを使うのか
標準規格のないソフトウェアでは独自のフォーマットでデータが保存されるため、ファイルを他のソフトで開きたければ何らかのデータ変換が必要です。しかしあらゆるソフトの独自フォーマット合わせたデータ変換ロジックを用意するのは非常に手間がかかります。ソフトのアップデート毎に新機能が追加されデータ形式も更新される上、特にCADの設計データは解析や製造など他部門/他社の様々な設備で使い回すことも多いため、設備に依存せずデータが読み込める中間ファイルが重宝されています。
![スクリーンショット 2019-12-10 20.35.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322248/297284ce-7318-9263-7f6d-b718c045209c.png)

中間ファイルを介することで異なるソフト間でデータのやり取りが可能となりました。ただし汎用性を重視した結果、独自形式のフォーマットのデータを全て持つことは当然できないため何らかの情報落ちは発生します。この情報落ちを是正するため、近年では主要なCADベンダー同士がマルチCAD対応を謳った機能を実装していますが、他ベンダーのCADソフトのバージョンアップに追従して完全対応とはいかず、未だに中間ファイルが使われるケースもあります。

#DXFファイルのサンプル

具体的なファイルの中身について触れていきます。例えば以下のようなDXFファイルを用意します。

```sample.dxf
  0
SECTION
  2
BLOCKS
  0
BLOCK
  2
BLOCK_NAME_AAA
 10
0.0000
 20
0.0000
  0
LINE
 10
0.0
 20
0.0
 11
10.0
 21
10.0
  0
LINE
 10
10.0
 20
10.0
 11
20.0
 21
0.0
  0
LINE
 10
20.0
 20
0.0
 11
0.0
 21
0.0
  0
ENDBLK
  0
SECTION
  2
ENTITIES
  0
INSERT
  2
BLOCK_NAME_AAA
 10
0.0
 20
0.0
  0
ENDSEC
  0
EOF
```

こちらをDXFファイルに対応したCADソフトで開くとこのような三角形が表示されます。
![スクリーンショット 2019-12-10 21.29.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322248/5ca95cc5-9064-531a-6bb1-442607c9299f.png)

#DXFファイルの基本構成
##グループコードと値
サンプルのDXFファイルがどう解釈されているのか見ていきましょう。
DXFファイルは以下のように、一貫して2行で1つの意味をもつグループの連続として記述されています。

```
  0           // グループコード
SECTION       // 値
  2           // グループコード
BLOCKS        // 値
  0           // グループコード
BLOCK         // 値
.             .
.             .
.             .
```
グループコードの一覧と、取りうる値については[DXFのリファレンス](http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WSfacf1429558a55de185c428100849a0ab7-5f35.htm)を参照ください。2行で1セットなのだと分かると少し読み解きやすくなりますね。今回のサンプルファイルを読み解く上で必要なグループコードはこの辺りです。

```
 0: タイプ
 2: 名前
10: x座標（始点）
20: y座標（始点）
11: x座標（終点）
22: y座標（終点）
```

##BlockとEntity
![スクリーンショット 2019-12-12 13.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322248/285c0df4-906c-54b6-e1f3-efbfa82f8650.png)
DXFにおける図形はBlockとして定義し、Eintityとして空間に配置します。

つまり
Block = 形状の定義
Entity = 配置の定義

です。形状と配置の定義を分けることによって、

- Blockを複数使い回す際にファイルサイズが無駄に肥大化しない
- Blockの定義を変更すると対応する全てのEntityに変更が反映される

といったメリットがあります。例えば大型の旅客機やバスの座席の図面などをイメージすると、Blockに座席を1つ設計すれば、そのBlockをEintityとして機内（車内）にいくつでも配置できますね。座席Blockの設計変更は全てのEntityにもれなく反映されます。

※Entityに直接図形を定義することも仕様上は可能ですが、上記のメリットが享受できないという理由から積極的に使ったことがないのでこの記事では扱いません。

##Blocksセクション
Blocksセクションでは図形の形状をBlockとして定義します。

```
  0
SECTION　　　　　// セクションの開始
  2
BLOCKS　　　　　 // セクションの名前＝BLOCKS
  0
BLOCK          // ブロックの開始
  2
BLOCK_NAME_AAA // ブロックの名前＝BLOCK_NAME_AAA
 10
0.0000         // ブロックBLOCK_NAME_AAAの挿入起点となるx座標
 20
0.0000         // ブロックBLOCK_NAME_AAAの挿入起点となるy座標
.              
.              // ここに図形描画に関する定義を挿入する。詳細は次章で。
.
.
.
  0
ENDBLK          // ブロックの終了。ブロックが複数あればこの後さらにブロックの定義が続く。
  0
ENDSEC　　　　　　// セクションの終了
```
##Block内の形状定義
サンプルファイルの三角形は3つのLINE（直線）で定義されます。

- LINEその1

```
  0
LINE
 10
0.0  // x座標（始点）
 20
0.0  // y座標（始点）
 11
10.0 // x座標（終点）
 21
10.0 // y座標（終点）
```
- LINEその2

```
  0
LINE
 10
10.0
 20
10.0
 11
20.0
 21
0.0
```
- LINEその3

```
  0
LINE
 10
20.0
 20
0.0
 11
0.0
 21
0.0
```
LINE（直線）以外の図形の定義については[リファレンス](http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WSfacf1429558a55de185c428100849a0ab7-5df0.htm)に記載の通りです。

##Entitiesセクション
Blocksセクションで定義したBlockをEntitiesセクションで空間内に配置します。

```
  0
SECTION
  2
ENTITIES        // セクションの名前＝ENTITIES
  0
INSERT　　　　　　// Blockの挿入
  2
BLOCK_NAME_AAA  // 挿入するBlock名
 10
0.0             // 挿入点（x座標）
 20
0.0             // 挿入点（y座標）
  0
ENDSEC
  0
```

##ファイルの終点
EOFでファイルの終点を定義します。

```
  0
EOF
```

以上！
三角形を定義したファイルの内訳でした。

#最後に
この記事では図形を描画するための構成にフォーカスして紹介しました。
今回は概要理解という名目上省略していますが、世に出ているCADソフトから出力したDXFファイルは一般的にHEADERやTABLEといった図形描画以外の様々なセクションを持っています。そのため初めてファイルをテキストとして開くと面食らうかもしれません。とはいえ重要なのはグループコードと値というペアで1つの意味を持つということで、それを頭に入れておけば他のセクションの定義でもリファレンスを辿って理解することができるはずです！この記事が何かのお役に立てれば幸いです！