今回は、AutoCAD API から見た図面ファイルと図面破損の状態をご紹介します。まず最初に、AutoCAD が図面を保存するために利用している DWG ファイルと DXF ファイルについてのおさらいです。
図面ファイルの種類
DWG ファイル形式は、オートデスクの AutoCAD が採用している図面を格納するためのファイル形式です。DWG ファイルは、バイナリ という形式で保存されるため、Windows のメモ帳のような テキスト エディタ では内容を把握することは出来ません。また、オートデスクは、DWG ファイル形式の仕様を公開していません。
一方、テキスト エディタで表示して内容を把握することが出来るのが、DXF ファイル形式です。他社製の CAD ソフトウェアとデータ交換することを目的に(他社が DXF ファイルを保存、読み込みできるようにするために)、DXF ファイル形式の仕様はオンランヘルプ上で公開されています。
図面ファイルとメモリ展開
DWG ファイルでも、DXF ファイルでも、AutoCAD で図面を編集するには、AutoCAD 上に図面ファイル開いて表示する必要があります。この状態では、AutoCAD は図面ファイルから読み取った情報を、論理的な構造とともにメモリ上に展開して、AutoCAD 自身が操作しやすくしています。
もちろん、この情報は設計者には見えませんし、把握する必要もありません。ただ、AutoCAD API を利用するプログラマは、メモリ上に展開された構造に注意を払う必要があります。たとえば、AutoCAD に次のような図面が表示されていると仮定します。ここでは、モデル空間に円が2つ、線分は3つ、円弧が2つ、それぞれ作図されています。
この時、AutoCAD は、メモリ上に次のような構造で図面を展開して、ユーザによる編集に備えます。 また、AutoCAD API を利用する開発者が新たな図形をモデル空間に作図する場合には、この論理構造を利用するプログラムを作成します("*Model_Space" の名前が付いた BlockTableRecord にオブジェクトを紐付ける)。
ここで注目していただきたいのは、矩形で示されるオブジェクト同士が 青い線 で結ばれている、という部分です。この つながり によって、メモリ上の図面情報が具体的に論理構造をなしています。
図面ファイルには様々な情報が格納されています。メモリにも同等の情報が つながり を持って展開されることになります。AutoCAD API では、この つながり を オーナーシップ接続 と呼んでいます。
オーナーシップ接続の原則と種類
AutoCAD オブジェクト図面ファイルに含まれる構成要素には、このように実際に図形として画面に表示される グラフィカル オブジェクト と、直接画面には表示されないものの、図形の特性を表現する上でかかせいない、目に見えない 非グラフィカル オブジェクト と呼ばれる構成要素が存在します。
グラフィカル オブジェクトは、線分、円、円弧、ポリライン、楕円などで、非グラフィカル オブジェクトは、画層、線種、寸法スタイル、文字スタイルなどが代表的です。これら 2 種類のオブジェクトは、メモリ上で密接に連携しています。当然、これらオブジェクトの間には、オーナーシップ接続 の関係が維持されています。
オーナーシップ接続を別の側面から考えると、オブジェクト間の親子関係ととらえることが出来ます。そして、AutoCAD が扱うオブジェクトには、かならず、1つの親オブジェクトが存在します。親オブジェクトが存在しないのは、メモリ上の図面情報を包括する図面データベース オブジェクト(Database)のみです。
先に紹介したモデル空間に作図されている図形の例では、円(Circle)や線分(Line)、円弧(Arc)が、子オブジェクトとして親オブジェクトであるモデル空間 (BlockTableRecord)とオーナーシップ接続を維持しています。また、図面内に含まれる各画層テーブル レコード(LayerTableRecord)は、画層テーブル(LayerTable)を親オブジェクトとしています。親オブジェクトを複数持つオブジェクトは存在しません。
それでは、"0" 画層を参照する線分は、そのような関連性を持っているのか疑問が生じます。もちろん、線分オブジェクト(Line)の親オブジェクトが "0" 画層オブジェクト(LayerTableRecord)ではありません。AutoCAD では、線分を含むグラフィカル オブジェクトの親オブジェクトは、BlockTableRecord 以外許容されていないためです。これは、AutoCAD が図面を扱う上での1つの仕様です。
そこで、オーナーシップ接続には、オブジェクト間の関係に応じて、ハードとソフト、オーナーシップ参照とポインタ参照、の組み合わせが適用されています。簡単にまとめると、それぞれの位置づけは明確です。
オーナーシップ接続の種類と用語
ハード
- 参照するオブジェクトにとって参照オブジェクトが必須
- PURGE コマンド[名前削除] コマンドでの削除からの保護される
ソフト
- 参照するオブジェクトにとって参照オブジェクトが必須ではない
- PURGE コマンド[名前削除] コマンドからの保護がない
オーナーシップ参照
- 相互参照
ポインタ参照
- 一方向参照
次に、メモリ上に展開された図面構造から、それぞれのオーナーシップ接続の例を示します。
ハード オーナーシップ参照の例
図面内に必ず存在しなければならない相互参照の関係です。
- 図面データベースとブロック テーブル
- ブロック テーブルと "モデル空間" ブロック テーブル レコードの関係
- ブロック テーブルと "モデル空間" ブロック テーブル レコードの関係
ソフト オーナーシップ参照の例
ユーザ定義によって発生する相互参照の関係です。
- ブロック テーブルとユーザ定義のブロック定義1 や ブロック定義2 の関係
- "モデル空間" ブロック テーブル レコードと線分、円弧、円などのグラフィカル オブジェクトの関係
ハード ポインタ参照の例
参照元から見て、図面内に必ず存在しなければならない一方向相互参照の関係です。
- ユーザ定義のブロック定義を参照するモデル空間に挿入されているブロック参照との関係
- STANDARD 文字スタイルを参照するモデル空間に作図されている文字との関係
ソフト ポインタ参照の例
ユーザ定義にとって発生する、参照元から見て一方向参照の関係です。
- オブジェクトに付加された拡張エンティティ データとの関係
- 文字に付加された不変リアクタとの関係
図面破損の状態
少し難しい内容になっていまいましたが、ここで紹介したオーナーシップ接続が崩れてしまった図面が、破損した図面と識別されることになります。破損した図面は、AutoCAD が持つ AUDIT[監査] コマンド や RECOVER[修復] コマンド で破損個所の削除を含む修復することが出来る可能性があります。もし、AutoCAD API でこれらの処理を自動化したい場合には、AutoCAD 2015 から API による図面の監査や修復を利用できるようになっています。
詳細は、下記の Autodesk Knowledge Network 記事を参照してみてください。
By Toshiaki Isezaki
コメント
コメントフィードを購読すればディスカッションを追いかけることができます。