Polymorphism

誰も教えてくれない!プログラム開発に必須の情報!

カスタマイズ専用データ領域
Development Data Area


ホーム > 技術情報 > カスタマイズ専用データ領域

カスタマイズ専用データ領域

ここではプログラムによるカスタマイズの際にしか使用しない特殊なデータについて説明します。
アプリケーションなどを設計すると、通常の図面データベース上の情報ではない特殊なデータや情報が必要になる場合があります。例えば、CADの製図機能には関係のない「重さ」や「材質」の情報や、図形同士の関連情報、図形の編集履歴や作業者の名前、作業日、またアプリケーション固有のコード番号や、特殊な付加情報など、設計するシステムにに応じていろいろなケースが考えられます。AutoCADの標準機能である「属性」の機能や「グループ」の機能などで、実現できる場合もありますが、すべてを標準機能で実現することはできません。
AutoCADでは、これらのカスタマイズ固有の情報の保管を実現するために、用途に応じていくつかの特殊なカスタマイズ用のオブジェクトやデータ構造を持っています。アプリケーションなどの設計の際にはこれらの機能を考慮し、設計することでより良いシステムが作成できます。ここでは、LT VB-COMで使用できるこのカスタマイズ専用のオブジェクトやデータ構造について説明します。

カスタマイズで利用できる特殊なオブジェクトやデータ構造には、以下の4つがあります。

    ・拡張データ
    ・
拡張ディクショナリ
    ・
拡張レコード
    ・
ディクショナリ

それぞれの特徴と利用方法について説明します。


拡張データ

拡張データは、図面データベース内のオブジェクトに対して、オブジェクトの構成データとは関係のない任意のデータを自由に付加できる機能です。例えば、通常の図形(オブジェクト)に特別な情報を付加したい場合には、通常この図形を「ブロック」化し、付加したい情報を「属性」として付ける必要があります。この場合もとの図形は登録「ブロック」内に保管され、図面上は「ブロック」図形になってしまいます。

しかし、この「拡張データ」を使用すると、図形などを「ブロック」にすることなく、図形オブジェクトに対して直接、任意のデータを任意の数だけ付加することができるのです。

この拡張データは、これを付加したプログラム(アプリケーション)によってのみ管理されます。AutoCADの標準機能でこの拡張データを使用することはありません。しかも、この拡張データは通常のオブジェクトと一緒に図面ファイル(DWG)に保存されます。アプリケーションにとって任意のデータが図面ファイル(DWG)に保存されることは、とてもありがたいことです。任意のデータを簡単に図形に付加し、図面ファイルにも保管できるので、設計の方法に大きく影響します。従来図面ファイル(DWG)とは別に保存していた、アプリケーション固有のデータを図面ファイル(DWG)内に保存することができるのです。これにより、データの一元管理が可能となります。

また、図形などのオブジェクトを変化させることなく任意のデータを付加できるので、図形そのものに特別な意味を持たせることや、「重さ」や「材質」など図面情報とは関係のない付加情報を保管することが可能です。


<拡張データのデータ形式>
拡張データのデータ形式は、リザルト バッファ型のデータを複数つないで表現する、リンクリストになります。リザルト バッファはデータの意味を明確にするために、1つのデータをそのデータの意味を表す「コード」と実際の「データ」から構成します。コードは、決められた整数の値になります。

(コード ・ データ)

このデータ表現手法は、図面の中間ファイル「DXF」ファイル内で使用されている構造と同じ考え型のものです。こうすることで、「データ」の値が何を表すものなのかが、明確になります。この「コード」と「データ」を組み合わせたリザルト バッファ型のデータを複数集めたものがリンクリストになります。

(コード ・ データ)
(コード ・ データ)
(コード ・ データ)

「拡張データ」には、このリザルト バッファ型のデータを任意の数だけ保存することができます。「拡張データ」に値をセットする場合や、データを受け取る際にも、このリザルト バッファのリンクリスト形式が使用されます。「拡張データ」のリザルト バッファの「コード」部分で使用できる整数の値は、以下のようになります。


「拡張データ」で使用できるコード一覧

[コード]

[データ型]

1000

一般文字列

1001

アプリケーション名(文字列)

1002

"{"または "}"

1003

画層(文字列)

1004

バイナリ(未サポート)

1005

ハンドル番号(文字列)

1010

一般3D座標値

1011

ワールド座標上での位置

1012

ワールド座標上での変異

1013

ワールド座標上の方向

1040

一般実数

1041

距離(実数)

1042

尺度(実数)

1070

16ビット一般整数

1071

32ビット一般整数



拡張ディクショナリ

拡張ディクショナリは、オブジェクトに任意の付加情報を簡単に追加できるようにするために用意されている概念です。拡張データの場合には、アプリケーション名などの登録が必要ですが、この拡張ディクショナリでは面倒な手続きなしに特定のオブジェクト専用の付加データ領域をユーザに提供してくれます。


このオブジェクト専用の付加データ領域はディクショナリ オブジェクトとして提供されます。オブジェクト専用の付加データ領域とは、そのオブジェクト用に用意されたディクショナリ オブジェクトのことなのです。そのため、このオブジェクト専用の付加データ領域にデータを保管したい場合、基本的には「拡張レコード」を自分で作成しこのディクショナリ オブジェクトに「つなげる」必要があります。拡張ディクショナリは「ディクショナリ」オブジェクトと「拡張レコード」オブジェクトを組み合わせて構成されます。そのため、ディクショナリ内には、図のように複数の「拡張レコード」オブジェクトを付加することも可能です。


<拡張ディクショナリのデータ形式>
拡張ディクショナリを利用する場合、ディクショナリ オブジェクトに直接データを保存するわけではありません。ディクショナリ オブジェクトに、拡張レコード オブジェクトを追加して利用します。そのため、実際に保存したい付加データは、この拡張レコード オブジェクト内に保存することになります。拡張レコードのデータ形式は、リザルト バッファ型のデータを複数つないで表現する、リンクリストになります。リザルト バッファはデータの意味を明確にするために、1つのデータをそのデータの意味を表す「コード」と実際の「データ」から構成します。コードは、決められた整数の値になります。

(コード ・ データ)

このデータ表現手法は、図面の中間ファイル「DXF」ファイル内で使用されている構造と同じ考え型のものです。こうすることで、「データ」の値が何を表すものなのかが、明確になります。この「コード」と「データ」を組み合わせたリザルト バッファ型のデータを複数集めたものがリンクリストになります。

(コード ・ データ)
(コード ・ データ)
(コード ・ データ)

「拡張レコード」には、このリザルト バッファ型のデータを任意の数だけ保存することができます。「拡張レコード」に値をセットする場合や、データを受け取る際にも、このリザルト バッファのリンクリスト形式が使用されます。「拡張レコード」のリザルト バッファの「コード」部分で使用できる整数の値は、以下のようになります。

「拡張レコード」で使用できるコード一覧

[コード]

[データ型]

1

4

文字列

6

9

文字列

10

17

3D座標値

38

59

実数

60

79

16ビット整数

90

99

32ビット整数

102



"{"または "}"

140

149

実数

170

179

16ビット整数

210

219

実数

270

279

16ビット整数

280

289

8ビット整数

300

309

文字列




拡張レコード

拡張レコードは、上の「拡張ディクショナリ」の中でも紹介しましたが、任意のデータを複数保存できる「オブジェクト」です。同じような機能に「拡張データ」が存在しますが、「拡張データ」の場合、「拡張データ」自体に実体あありません。「拡張データ」用に作成したデータを、あるオブジェクトの付加情報として保存します。そのため「拡張データ」の保存先は、拡張情報を持たせたい「あるオブジェクト」になるのです。

それに対して拡張レコードは、「拡張レコード(AcDbXrecord)」型のオブジェクトが存在し、このオブジェクトに任意の付加情報を持たせるのです。この拡張レコード オブジェクトももちろん図面データベース上のオブジェクトなので、図面データベース内のどこかのオブジェクトに「つながる」ことになります。

「拡張ディクショナリ」の中でも紹介したように、拡張レコード オブジェクトは基本的にディクショナリ オブジェクトに「つながる」ことになります。しかし、「拡張レコード」のディクショナリ オブジェクトの場合、このディクショナリ オブジェクトはどこかのオブジェクトのf付加情報領域として定義されています。そのため「拡張ディクショナリ」のディクショナリ オブジェクトは、「あるオブジェクト」の付加情報と同じ意味になります。これでは、「拡張データ」とあまり変わりない概念になってしまいます。

「拡張レコード」は、せっかくオブジェクトの形をしているので、もっと柔軟な使用方法が考えられるのです。そこで、ここでは「拡張ディクショナリ」を使用せずに、図面データベース内の「基本」ディクショナリ上に、任意の拡張レコードを保管する方法について説明します。この手法を利用すると、オブジェクトとも関係のない独自の付加情報を、さらに柔軟に保存することができるのです。例えば、図面全体に関連する情報(製作者や、製作時間の情報など)や図面の設定に関する情報(アプリケーション固有のシステム変数など)を保管する場所として使用できます。
拡張レコードを「基本ディクショナリ」オブジェクトに、任意に追加する場合以下のような構造が考えられます。



ここでは簡単な、「基本ディクショナリ オブジェクト」に直接拡張レコードを追加する例を紹介します。
ディクショナリの詳細は「ディクショナリの基本構造」を参照してください。


<拡張レコードのデータ形式>
拡張レコードのデータ形式は、リザルト バッファ型のデータを複数つないで表現する、リンクリストになります。リザルト バッファはデータの意味を明確にするために、1つのデータをそのデータの意味を表す「コード」と実際の「データ」から構成します。コードは、決められた整数の値になります。

(コード ・ データ)

このデータ表現手法は、図面の中間ファイル「DXF」ファイル内で使用されている構造と同じ考え型のものです。こうすることで、「データ」の値が何を表すものなのかが、明確になります。この「コード」と「データ」を組み合わせたリザルト バッファ型のデータを複数集めたものがリンクリストになります。

(コード ・ データ)
(コード ・ データ)
(コード ・ データ)

「拡張レコード」には、このリザルト バッファ型のデータを任意の数だけ保存することができます。「拡張レコード」に値をセットする場合や、データを受け取る際にも、このリザルト バッファのリンクリスト形式が使用されます。「拡張レコード」のリザルト バッファの「コード」部分で使用できる整数の値は、以下のようになります。

「拡張レコード」で使用できるコード一覧

[コード]

[データ型]

1

4

文字列

6

9

文字列

10

17

3D座標値

38

59

実数

60

79

16ビット整数

90

99

32ビット整数

102



"{"または "}"

140

149

実数

170

179

16ビット整数

210

219

実数

270

279

16ビット整数

280

289

8ビット整数

300

309

文字列




ディクショナリ

図面データベースにおけるディクショナリ オブジェクトは、少し特殊なオブジェクトですが、カスタマイズ専用のオブジェクトというわけではありません。
ディクショナリ オブジェクトは任意の複数のオブジェクトを「つなぐ」「オーナー」オブジェクトの機能を持っています。しかも、ディクショナリ オブジェクトに「つなぐ」オブジェクトは、種類の異なるオブジェクトも「つなぐ」ことができます。



シンボルテーブルなどでは、異なるレコード オブジェクトを「つなぐ」ことはできませんが、ディクショナリにおいては、上の図のようにディクショナリ オブジェクトと拡張レコードなど、異なるオブジェクトを「つなぐ」こともできるのです。これは、ディクショナリの「つながる」オブジェクトを管理する方法に秘密があります。ディクショナリ オブジェクトは、それに「つながる」オブジェクトに、「名前」を付けて管理することができますが、この「名前」は「つながる」オブジェクトの中に付けられるのではありません。シンボルテーブルレコード オブジェクトのように、オブジェクト自身に「名前」を付ける場合には、オブジェクトの中に「名前」を保管できる構造になっていなければなりません。これでは、「つなぐ」ことができるオブジェクトが大きく制限されてしまいます。

ところがディクショナリ オブジェクトは、「つながる」オブジェクト自身に「名前」を保管できないオブジェクト(ディクショナリ オブジェクトや拡張コードもオブジェクト自身に「名前」は保存できません)でも、「名前」を付けて複数の「つながる」オブジェクトを管理できるのです。それはオブジェクトの管理に使用される「名前」が、ディクショナリ オブジェクトの中に付けられるからです。



この構造によるオブジェクト管理では、「つながる」オブジェクトに「名前」を保管する構造がなくても、「名前」による管理が可能となるのです。

この特性を生かしてカスタマイズの際に必要な情報をオブジェクトとして、このディクショナリに保管することがあります。このディクショナリは、もちろん図面データベースの一部なので、ここにさえ情報を保存しておけば自動的に図面ファイル(DWG)にもその情報は保存されます。

カスタマイズでディクショナリを利用する多くの場合、ディクショナリには「拡張レコード(AcDbXrecord)」を保存します。「拡張レコード」の中には任意のデータを任意の数だけ保管することが可能です。



しかも、このディクショナリ オブジェクトは、ディクショナリ オブジェクト自体を自分で新しく作成することも可能です。この特性を利用すると図のように、シンボルテーブルのような階層構造を自分で設計することも可能です。ディクショナリ オブジェクトを利用すれば、どんな深い階層構造も実現することができるのです。

ここではディクショナリを階層化し、シンボルテーブルのように使用する例を紹介します。この構造は、ディクショナリ オブジェクトに、ディクショナリ オブジェクトを「つなげる」だけで簡単に実現することができます。


ご注意:
(1) 本項目の全部または一部を無断で転載することは禁止されています。
(2) 製品、会社名は、各社の商標または登録商標です。
(3) 本項目内容の著作権は有限会社ポリモフィズムに帰属します。