DXFをプログラムで読み始めると、最初はLINEやCIRCLEの座標を取り出すだけで図面全体を扱えそうに見えます。しかし、実際の図面にはレイヤー、ブロック、寸法、文字、画像参照、拡張データ、レイアウトなどが相互に結び付いています。個々のエンティティを読めても、その情報がファイル全体のどこにあり、何を参照しているのか分からなければ、再現性のある解析にはなりません。
この記事は「DXFを読む」連載の完結回です。DXFファイルの全体構造と読む順序を示し、これまで扱った29本を目的別に案内します。個別コードの詳細は各記事へ委ね、ここではDXF解析の全体地図を作ります。
DXFはコードと値の組で構成される
ASCII DXFの基本単位は、グループコードと値の組です。グループコードは後続値の意味と型を示します。たとえばコード0はレコードやエンティティの種類、コード5はハンドル、コード8はレイヤー名を表します。
最初に押さえたいのは、同じ番号が常に同じ業務上の意味を持つとは限らないことです。コード10は多くの図形で主要点のX座標ですが、それが始点、中心点、挿入点のどれなのかはエンティティ種別によって変わります。また、値が既定値と同じ場合はコード自体が省略されることがあります。
DXFを初めて読む場合は、まずDXFファイルの基本構造でコードと値、セクション、レコードの関係を確認してください。色や線種まで再現する場合は、DXFのレイヤー・線種・色を続けて読むと、エンティティ側の値とTABLES側の定義を分けて扱う理由が分かります。
6つの主要セクションを読む順序
AutodeskのDXFリファレンスでは、図面データを複数のセクションに分けています。実用上の中心はHEADER、CLASSES、TABLES、BLOCKS、ENTITIES、OBJECTSです。
| セクション | 主な役割 | 解析での位置付け |
|---|---|---|
| HEADER | バージョン、単位、図面範囲など | 読み取り条件の初期化 |
| CLASSES | アプリケーション定義クラス | 未知データの背景情報 |
| TABLES | レイヤー、線種、文字・寸法スタイルなど | 名前付き定義の索引 |
| BLOCKS | ブロック定義内の図形 | INSERT展開の参照先 |
| ENTITIES | モデル・ペーパー空間の図形 | 主な幾何・注記データ |
| OBJECTS | 辞書、グループ、レイアウトなど | 非図形データと所有関係 |
推奨する読み順は、ファイル順をそのまま逐次描画する方法ではありません。まずHEADERでバージョンと単位を確認し、TABLES、BLOCKS、OBJECTSを索引化します。その後にENTITIESを正規化し、最後にハンドルや名前による参照を解決します。CLASSESは未知のカスタムオブジェクトを評価するときに参照します。
DXFのHEADER変数は`$ACADVER`や図面範囲、ハンドル管理を扱います。DXFの単位では`$INSUNITS`を使った単位判定と変換を整理しています。DXFのTABLESセクションはシンボルテーブルを索引化する入口です。DXFのCLASSESセクションは標準外クラスやプロキシを扱うときの判断材料になります。
基本図形と曲線を取り出す
幾何形状の抽出では、エンティティごとに正規化した内部モデルを作る方法が扱いやすくなります。DXFのコード列を業務ロジックへ直接渡すのではなく、点、線、曲線、面などの共通表現へ変換します。
- DXFのPOLYLINEとVERTEX:旧形式ポリラインの親子構造、VERTEX、SEQENDを読む記事です。
- DXFのSPLINE:次数、ノット、制御点、重みからB-splineやNURBSを再構成します。
- DXFのELLIPSE:中心、長軸ベクトル、軸比、開始・終了パラメータを扱います。
- DXFのMLINE:参照線とMLINESTYLE、頂点パラメータの関係を解説します。
- DXFのXLINEとRAY:無限直線と半直線を有限の表示範囲へ切り出します。
曲線は「表示用の線分列」へ早い段階で変換しすぎないことが重要です。SPLINEの制御点やELLIPSEのパラメータを失うと、再出力や高精度な交差計算が難しくなります。原形を保持するモデルと、画面表示用に離散化したモデルを分けます。
座標系と3D形状を扱う
DXFの座標はすべてWCSとは限りません。平面的なエンティティではOCSが使われ、押し出し方向からローカルなXY軸を復元する必要があります。UCSは作業座標系の定義であり、ファイル内の各点がそのままUCS値で保存されるとは限りません。
DXFのOCSとWCSは、押し出し方向と任意軸アルゴリズムを使った座標変換の基礎です。DXFのUCSは、UCSテーブルの原点と軸方向を扱います。この2つを混同せず、エンティティ座標、図面座標、表示座標を別レイヤーにします。
3D系の記事は、データの複雑さに応じて次の順に読むと整理しやすくなります。
- DXFの3DFACE:4頂点と不可視エッジを持つ最小構成の面です。
- DXFのMESH:頂点、面、稜線、crease、subdivisionを分離して読みます。
- DXFの3DSOLID・BODY・REGION:ACISのSAT・SABデータを含む形状で、独自再実装の範囲を判断する入口です。
文字・寸法・注記を扱う
文字や寸法は、表示された文字列だけを抜き出しても意味を再現できません。配置点、基準点、スタイル、ブロック参照、尺度、回転などを組み合わせて解釈します。
- DXFのTEXTとMTEXT:単一行・複数行文字、位置合わせ、文字高、回転を扱います。
- DXFのDIMENSION:寸法種類、定義点、DIMSTYLE、表示用ブロックの関係を整理します。
- DXFのLEADERとMULTILEADER:引出線、注記参照、MULTILEADERのコンテキストデータを読みます。
寸法値を検索するだけなら文字列抽出でも足りますが、図面検査では「どの点を測った寸法か」が必要です。表示文字、幾何学的定義点、スタイルを別々に保存し、後から結び付けられる形にします。
ブロック・属性・グループを扱う
BLOCKSにはブロック定義を構成する図形が入り、ENTITIESのINSERTから参照されます。ブロック定義そのものを複製するのではなく、定義IDと挿入変換を保持すると、同じ部品を多数配置した図面でも効率よく扱えます。
DXFのATTDEFとATTRIBは、ブロック属性の定義と実際の値を結び付けます。DXFのGROUPオブジェクトは、複数エンティティをハンドル参照でまとめる非図形オブジェクトです。
ブロック、属性、グループは似た「まとまり」に見えますが役割が異なります。ブロックは再利用可能な図形定義、属性はブロックへ付随するデータ、グループは既存エンティティの集合です。内部モデルでも同じクラスへ押し込まず、参照関係として表します。
参照・拡張データ・OBJECTSを扱う
DXFはハンドルでデータベースオブジェクトを識別します。コード330番台から360番台には、ポインターや所有関係を表すハンドルが入ります。単にリンク先を見つけるだけでなく、参照先が消えた場合の寿命や所有関係まで考える必要があります。
- DXFのハンドルと参照関係:コード5、330、340、350、360番台の役割を整理します。
- DXFのDICTIONARYとXRECORD:OBJECTS内に任意データを保存する基本構造です。
- DXFのXDATA:APPIDと1000番台コードによる拡張データを扱います。
未知のオブジェクトやコードに遭遇しても、パーサー全体を停止させない設計が重要です。既知の共通属性とハンドルを保存し、未知部分は元のコード列を保持して警告対象にします。将来のDXFバージョンやCAD固有拡張に対して、読み飛ばしとラウンドトリップの余地を残せます。
レイアウト・表示・外部参照を扱う
モデル空間の図形だけを扱う処理と、印刷状態を再現する処理では必要なデータが異なります。レイアウト、ビューポート、画像、アンダーレイ、マスクを扱うときは、ENTITIESだけでなくOBJECTSや参照先も確認します。
- DXFのLAYOUTとPLOTSETTINGS:モデル空間、ペーパー空間、用紙・印刷設定を結び付けます。
- DXFのVIEWPORT:ペーパー空間からモデル空間を表示する中心、尺度、クリッピングを扱います。
- DXFのIMAGEとIMAGEDEF:画像配置と外部画像定義、配置ベクトルを解説します。
- DXFのUNDERLAY:PDF、DWF、DGN参照とクリッピングを扱います。
- DXFのWIPEOUT:背景を隠す境界、U・Vベクトル、表示フラグを読みます。
外部ファイルが見つからない場合でも、配置情報やパスを消さずに欠落状態として保持します。WIPEOUTは外部画像と見た目が異なりますが、IMAGEに近い配置・クリッピング構造を持つため、共通の座標変換処理を再利用できます。
目的別に読む記事を選ぶ
DXFの全項目を最初から実装する必要はありません。目的から必要な範囲を絞ります。
図形を取り出したい
基本構造、TABLES、OCS/WCSを先に読み、対象エンティティの記事へ進みます。出力先がSVGやCanvasなら、曲線の原形を保持したまま表示時に離散化します。レイヤー属性も後段で解決できるように残します。
寸法・注記を扱いたい
TEXT・MTEXT、DIMENSION、LEADER・MULTILEADERに加え、文字スタイル、寸法スタイル、ブロック参照を読みます。検索用途でも、元のハンドルと配置点を保持すると図面上の位置へ戻れます。
3Dを扱いたい
3DFACEから始め、MESH、3DSOLIDへ進みます。OCS/WCSと単位を先に確定し、ACISデータを独自処理するのか、対応ライブラリやCADへ委ねるのかを早い段階で決めます。
独自データを保存したい
軽量な付加情報ならXDATA、階層的な任意データならDICTIONARYとXRECORDを候補にします。APPID、ハンドル、所有関係、削除時の寿命を設計し、標準CADで開いたときの保持状況も検証します。
DXFパーサー共通の注意点
実装では、次の原則を共通ルールにすると破損や誤解釈を減らせます。
- グループコードの番号だけでなく、対象レコードと型を組み合わせて読む
- コードの出現順を固定と仮定せず、同じコードの繰り返しを保持する
- 省略された値には仕様上の既定値を適用する
- ハンドルの参照と所有を分け、未解決参照を記録する
- OCS、WCS、UCS、表示座標を明確に分離する
$INSUNITSと出力先の単位を照合し、暗黙の倍率を入れない- 未知エンティティや未知コードを警告付きで保持し、既知データの解析を続ける
- 読み取り、意味解決、検証、描画、再出力を別の処理段階にする
Autodeskの資料も、将来のバージョンへ対応しやすくするため、未定義コードを無視し、コードの順序を仮定しない表駆動型の処理を勧めています。未知データを即座に破損扱いするより、既知部分を安全に取り出し、元データを失わない設計が現実的です。
まとめ
DXF解析は、個別エンティティのグループコードを覚える作業だけではありません。HEADERで前提を確認し、TABLES・BLOCKS・OBJECTSを索引化し、ENTITIESを正規化してから参照と座標系を解決することで、図面全体を一貫したデータとして扱えます。
この完結回までの30記事で、ファイル構造、2D・3D図形、文字・寸法、座標系、参照関係、拡張データ、レイアウト、外部参照までを一巡しました。必要な記事を入口にしながら、最終的には「DXF Reader → 正規化モデル → 検証・設計ロジック → 表示・出力」という責務分離へつなげると、CADビューア、図面監査、変換ツール、設計自動化へ発展させやすくなります。
