AutoCAD が作図した 2D 図面やモデリングした 3D モデルを保存する際、利用されるのは DWG ファイルです。DWG ファイル形式の仕様は非公開となっているので、外部のソフトウェアが TrustedDWG を保存するには、オートデスク製の RealDWG SDK を利用した開発が必要になっています。
一方、その仕様を公開しているファイル形式も存在します。データ交換用に用意された Data eXchange Format、DXF™ ファイル形式です。DXF はオンラインヘルプで詳細な情報が公開されていて、その仕様に沿ってファイルにエクポート(書き出し)して AutoCAD に読み込ませたり、AutoCAD が保存した DXF ファイルを独自に作成したソフトウェアにインポート(読み込み)させて、内容を把握することが出来るようになります。
AutoCAD からエクスポートされた DXF ファイルは、ASCII コードを使って書き込まれるので、メモ帳などのテキスト エディタで開くと、その内容を直接確認することも出来ます。DXF ファイルには図面全体の情報が書き出されているので、すべてを理解しようとすると少し大変ですが、図形の情報だけに特化すると、比較的把握は容易です。
例えば、中心点が 100,100,0 の半径 50 の円を DXF ファイルに書き出してテキストエディタで開いてみると、図形情報が書き込まれている ENTITIES セクションと呼ばれる部分に、次のような情報が見つかるはずです。
:
0
CIRCLE
5
2A2
330
1F
100
AcDbEntity
8
0
100
AcDbCircle
10
100.0
20
100.0
30
0.0
40
50.0:
このように、DXF ファイルは、情報の種類を示す番号である DXFグループコード(改行) と、実際の情報となる DXF データ(改行) がペアになって情報を維持しています。円の DXF 仕様をオンラインヘルプで見てみると、下記のようになっていることがわかります。
※ DXF には DXF ファイル上の表記(DXF)とアプリ上の表記(APP)の 2 通りの表記規約があります。
図形には、色や画層、線種、といった共通する情報も持つので、こちらのオンラインヘルプの内容も併せると、次のようになります。
<中略>
<以下省略>
先の DXF ファイルの抜粋を見てみると、図形タイプ(DXF グループコード 0)が CIRCLE、中心点座標(DXF グループコード 10、20、30)が座標の X 値:100.0、Y 値:100.0、Z 値:0.0、半径(DXF グループコード 40)が 50.0 になっていることが読み取れます。
DXF ファイルを直接参照して内容を確認することはあまりないと思います。ただ、AutoCAD API を利用する開発者なら、もっと身近に DXF を感じる場面があります。もっとも分かり易いのは、AutoLISP でエンティティ リストを取得したり、操作したりする際です。
例えば、先の円を (entsel) で選択して、(car) でエンティティ名を抽出、(entget) でエンティティリストを取得すると、下記のようになります。(APP 情報のため、DXF グループコード 10 で座標の XYZ 値すべてを保持)
コマンド: (entget (car (entsel)))
オブジェクトを選択: ((-1 . <図形名: 1dd1c0f84a0>) (0 . "CIRCLE") (330 . <図形名: 1dd1c0fa1f0>) (5 . "2A2") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbCircle") (10 100.0 100.0 0.0) (40 . 50.0) (210 0.0 0.0 1.0))
AutoLISP では、DXF グループコードと対応する情報が、ドットペアと呼ばれる組み合わせで ( ) カッコ内に保持されていることがわかります。
他の AutoCAD API でも、DXF を強く意識する場面があります。ObjrctARX を使ってカスタム オブジェクトを定義する場合です。
カスタム オブジェクトとは、ObjectARX が使用する C++ 言語のクラス継承を用いて、ObjectARX アプリ独自に用意するオブジェクトです。カスタム オブジェクトは、グラフィカル オブジェクトと非グラフィカル オブジェクトの 2 種類に分けることができます が、いずれの場合も図面と一緒に保存することになるので、どの DXF グループコードを使って情報を書き込むか、開発者として決定、オブジェクトを定義する必要があります。
次のエンティティ リストは、ObjectARX で 3 頂点で構成される ASDKMYENTITY カスタム オブジェクトを定義、モデル空間に任意に作図した ASDKMYENTITY 図形のエンティティ リストを AutoLISP で取得した例です。ここでは、DXF グループコード 10、11、12 のドットペアで 3 つの頂点座標が保持されていることがわかります。
コマンド: (entget (car (entsel)))
オブジェクトを選択: ((-1 . <図形名: 1dd1c0f8590>) (0 . "ASDKMYENTITY") (330 . <図形名: 1dd1c0fa1f0>) (5 . "2B1") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "ASDKMyEntity") (90 . 1) (10 87.9545 117.169 0.0) (11 75.4586 90.7618 0.0) (12 115.419 94.6643 0.0))
ちなみに、ObjectARX で ASDKMYENTITY カスタム オブジェクトを定義する際、DXF ファイルに書き込む情報はこんな感じで定義がおこなわれています。
//- Dxf Filing protocol
Acad::ErrorStatus ASDKMyEntity::dxfOutFields (AcDbDxfFiler *pFiler) const {
assertReadEnabled () ;
//----- Save parent class information first.
Acad::ErrorStatus es =AcDbEntity::dxfOutFields (pFiler) ;
if ( es != Acad::eOk )
return (es) ;
es =pFiler->writeItem (AcDb::kDxfSubclass, _RXST("ASDKMyEntity")) ;
if ( es != Acad::eOk )
return (es) ;
//----- Object version number needs to be saved first
if ( (es =pFiler->writeUInt32 (kDxfInt32, ASDKMyEntity::kCurrentVersionNumber)) != Acad::eOk )
return (es) ;
//----- Output params
//.....
pFiler->writeItem(10, m_Vertex1);
pFiler->writeItem(11, m_Vertex2);
pFiler->writeItem(12, m_Vertex3);return (pFiler->filerStatus ()) ;
}
もちろん、カスタム オブジェクトを定義した ObjrctARX アプリは、DXF ファイルに書き出された情報を DXF グループコード毎に正しく読み込んで AutoCAD 上にカスタム オブジェクトを再現するのが一般的です。
ただし、カスタム オブジェクトの機能向上によって扱う情報が増減してしまうと、DXF グループコードも含めたバージョン管理がかなり煩雑になりがちです。こういった煩雑さに起因する問題を低減するために、一部の製品では、DXF ファイルの出力時にカスタム オブジェクトを分解して、AutoCAD の標準オブジェクトにしてからファイルを保存する仕様になっているものも存在します。
AutoCAD Architecture はその一例です。次のオンラインヘルプ記事を参照してみてください。
DXF はファイル単位のみで考えるものではなく、AutoCAD API と密接に連携したデータ表現であることがわかります。ただ、AutoCAD .NET API や ActiveX オートメーションでは、API の登場時期や機能もあり、オブジェクト情報が隠ぺいされているので、DXF グループコードを意識することはないはずです。
By Toshiaki Isezaki
コメント