10分で分かるDXFファイル

この記事は[Catallaxy Advent Calender](https://qiita.com/advent-calendar/2021/catallaxy)14日目の記事です。

14日目担当のエンジニア711号です。

最近図面（DXFファイル）を見ることが多いのですが、DXFファイルの仕様について調べたので、DXFファイル関連のことがらについて共有したいと思います。

図面を見る場合、基本的に図面自体が興味の対象なので、図面を描画しているファイルの中身については知る必要がないと思いますが、DXFがどのように構成されているかを知っておくと後々何かの役に立ったり立たなかったりするかもしれません。

時間が無い人のために、この記事の概要を箇条書きでまとておきます。

- DXF = Drawing Exchange Format、図面交換用のファイル形式
- DXFは2行で1つ
- DXFは全部で7つのセクションから構成
- DXF見るならeDrawings
- DXF書くならezdxf
- DXF = Dorayaki Transformation Fということで、私はどらやきが大好きなのですが、手軽に手に入るおすすめどらやきのランキングを作るとしたら、一番はあんクリームパイです。サクサクしたパイでホイップクリームとつぶあんを包んでいて、ずっしりと重く見た目は小さいですが食べごたえがあります！（どらやきとは）

## DXF = Drawing Exchange Format

DXFはDrawing Exchange Formatの略語で、AutoCADの異なるバージョン間（特に下位互換）のデータ交換用に作られたファイル形式です。DXFはオートデスク社が提供している独自のフォーマットですが、Wikiにも記載のある通り、内部仕様が公開されています。したがって、様々な3rd party製のCADエディタやCADビューワでも扱われていて、必ずしもDXFファイルには互換性があるわけではないです。

> DXF (英: Drawing Exchange Format) は、コンピュータ支援設計で使われる図面用のフォーマットの1種であり、2次元および3次元の形状をベクター形式で表現する。
DXFはオートデスクの"AutoCAD"における異なるバージョン間のデータ互換を目的として策定された。
内部仕様が公開されているため、多くのCADエディターで扱われるようになり、クロスプラットフォームで動作するビューアーも存在する。
参考：https://ja.wikipedia.org/wiki/DXF
> 

## DXFファイルは2行で一つ

DXFファイルはテキストファイルなので、普段使っているエディタとかメモ帳で開くと中身を簡単に確認できます。

```
0
SECTION
 2
HEADER
 9
$LIMMIN
 10
 0
 20
 0
 9
$LIMMAX
 10
 75.6
 20
-61.425
 0
ENDSEC
 0
SECTION
...

```

DXFは2行で1つのデータになっているので、エディタの機能やスクリプトなどを使って2行を1行にまとめると格段に見やすくなります

おすすめなのはvimのコマンドで、以下の通りに実行すると一瞬で2行が1行にまとまります。

```
1. terminalからvimでdxfを開く　例）vim test.dxf
2. vimのノーマルモードで :%normal J を入力してEnter
3. vimで保存してdxfを閉じる
```

この記事はvimの記事ではないのですが、2で記載のコマンドの意味は下記の通りです

- `:`でコマンドラインモードに移行（ファイル保存`:w`とか、vim終了`:q`時に使うあれ）
- `normal`でノーマルモード（移動時のモード）のコマンド実行
- `J`で当該行とその次の行を連結
- `%`で上記のコマンドをファイル全体に適用

上のDXFファイルを2行ごとにまとめると下記の通りで

```
0 SECTION
2 HEADER
9 $LIMMIN
10 0
20 0
9 $LIMMAX
10 75.6
20 -61.425
0 ENDSEC
0 SECTION
...

```

2行にまとめると、左側は数値で、右側は数値や文字列になっていることが分かります。
左側の数値を「グループコード」と呼び、DXFファイルで仕様が決まっています。右側は、そのグループコードが持つ具体的な値です。

以下の記事で非常に詳しく解説されているのですが、実はDXFファイルはAutoCADの内部データをダンプしたもので、その内部データはAutoLispのデータのようです。DXFの理解を深めるにはAutoLispの理解を深めるのが早道かもしれません。

参考: DXFことはじめ
[https://qiita.com/kazhida/items/8a5fa68e8fa135614d5d](https://qiita.com/kazhida/items/8a5fa68e8fa135614d5d)

## DXFを構成するのは全部で7つ（6つ）のセクション

上で2行にまとめたDXFの一部を抜粋すると、以下のような構造になっています。

```
0 SECTION
2 HEADER
...

0 ENDSEC
...

```

`SECTION ... ENDSEC`で囲まれた部分が一つのセクションとなっており、`2 HEADER`の部分で上記のセクションが`HEADER`セクションであることを定義しています。
グループコードの0番は図形タイプを表す文字列の定義、2番は名前（属性名称、ブロック名など）を定義しています。

DXFファイルの中身を見るという狂人ではなくて好奇心旺盛な方は分かると思いますが、
DXFファイルは以下の7つのセクションで構成されています

- HEADER: 図面の各種設定
- CLASSES: BLOCKS、ENTITIES、OBJECTSで使われるクラスの定義
- TABLES: 寸法スタイル、画層、文字スタイル等の特定の設定
- BLOCKS: ブロック定義
- ENTITIES: 図形などのグラフィカルオブジェクト
- OBJECTS: 非グラフィカルオブジェクト
- THUMBNAILIMAGE: 図面のプレビューイメージデータ

THUMBNAILIMAGEセクションはオプショナルなので、必須なのはHEADERからOBJETSまでの6つのセクションです。

各セクション毎の詳細についてはここでは割愛しますが、例えば一番わかり易いENTITIESの図形を見ると

```
  0 LINE
  5 30
330 17
100 AcDbEntity
  8 frame
100 AcDbLine
 10 0.0
 20 -200.0
 30 0.0
 11 50.0
 21 -200.0
 31 0.0
```

このようになっていて、図形はLINE（直線）だと分かります。
グループ番号5番から100番までは無視して、10番以降の数値を見るとピンと来た人もいるかもしれませんが、グループコード10、20、30はそれぞれx軸、y軸、z軸方向の座標定義になっています。

Autodesk公式の仕様ページだと若干分かりにくいですが、

- 10, 20, 30でx, y, z軸の始点
- 11, 21, 31でx, y, z軸の終点

を定義しています。今、上記のLINEは2次元上の線分を定義しているので、z軸の30番と31番の値は両方0.0になっています。

参考
グループ コード(番号順)
[http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a62.htm](http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a62.htm)
DXFファイルの一般的な構造
[http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-796b.htm](http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-796b.htm)

## DXF見るならeDrawings

CADを扱うソフトウェアはWindows限定のものも多く、Macでは使えないCADアプリもあります。例えば、autodeskの提供しているDWG TrueView。無料で手軽にDXFを見たい場合、個人的に一番のオススメはeDrawingsというsolidworksが提供しているビューワです。

特徴は以下の通りで、DXFを見たいだけなら軽量で非常に使いやすいです。
DXFは色んなCADソフトで作成されるため、余り厳密にDXFのフォーマットに従っていないものも多いですが、eDrawingsではほとんど問題なく開けます

- 無料
- 3rd party製のDXFが問題なく開ける
- Mac App Storeからも配布されていて、M1 macにも対応
- ネットワーク環境のないローカルでも使える

一方、Autodesk Viewerというブラウザで動作する便利なビューワもあります
[https://www.autodesk.co.jp/viewers](https://www.autodesk.co.jp/viewers)

ブラウザで動くのでアプリをインストールする必要もなく非常に使いやすいです。
ただし、autodesk純正のアプリなので、DXFファイルのフォーマットに厳格なのか開けないDXFファイルが結構あります。

## DXF書くならezdxf

図形を描画してDXFに出力したい場合、python製のezdxfがおすすめです。
[https://ezdxf.readthedocs.io/en/stable/index.html](https://ezdxf.readthedocs.io/en/stable/index.html)

ドキュメントは英語ですが非常に充実していて、ezdxf自体の使い方だけでなく、DXFファイルの仕様についても詳細な解説が掲載されているので非常に参考になります。

JavaScript製のjs-dxf
[https://github.com/ognjen-petrovic/js-dxf](https://github.com/ognjen-petrovic/js-dxf)
も非常に使いやすいのですが、生成されたDXFファイルの中身を見てみると、図形の描画にのみ特化していてDXFファイルのフォーマットはほとんど気にしていないようです。

したがって、CADソフトによってはDXFが開けません。少なくとも、Autodesk Viewerでは開けなかったです。また、js-dxfから出力したDXFでは日本語も文字化けしていたので、図面に日本語を入れたい用途ですと使えないかもしれません。

## まとめ

- DXF = Drawing Exchange Format、図面交換用のファイル形式
- DXFは2行で1つ
- DXFは全部で7つのセクションから構成
- DXF見るならeDrawings
- DXF書くならezdxf

未来の製造業をつくるCatallaxyに興味がある方は是非採用情報をご覧ください
[https://open.talentio.com/r/1/c/catallaxy/homes/2947](https://open.talentio.com/r/1/c/catallaxy/homes/2947)

明日はエンジニア7号による「エンジニア必見！知っておくと便利なデザインツール」です。お楽しみに！