Polymorphism











AutoCAD LTを利用できる新発想システム開発ツール!  安全と信頼の完全自社開発製品!

図面データベース構造
LT VB-COM HELP Samples


ホーム > 製品 > LT VB-COM > 充実のヘルプ > LT VB-COMの基本 > 図面データベース構造

図面データベースの基本


図面データベースの基本構造について説明します

図面データベースとは?:

図面データベースとは、AutoCAD LTが起動中にだけメモリー内に作成される図面情報のデータベースです。図面情報の保管という意味では、図面ファイル(DWGファイルやDXFファイル)と似ているところもありますが、AutoCAD LTを実行中に作図、編集される情報を逐一図面ファイルに書き出していては、図面ファイルが膨大な大きさになってしまいますし、アクセス速度も低下します。これではAutoCAD LT自体のスピードあ低下してしまいます。そこでAutoCAD LTが起動している間は、この作図、編集情報を簡単にかつ高速に操作できるように、メモリーの中に図面情報を蓄えるための「図面データベース」を構築します。そのため、図面データベースはAutoCAD LTが実行している間にしか存在しません。

図面データベースは、AutoCAD LTが実行されるとAutoCAD LTのシステムによって自動的にメモリー内に作成されます。そして、図面ファイルを開くとその図面ファイルの情報を読み込み、メモリー上の図面データベースへと展開します。

以降、図面ファイルへ情報を保存するまでAutoCAD LTが図面ファイルをさわることはありません。

図面データベースの基本構造:

LT VB-COMは、基本的にAutoCAD LTの図面データベースを操作するためのツールです。プログラムを利用して自分が操作したいオブジェクトをこの図面データベースの中から見つけ出し、そのオブジェクトに対して様々な命令を実行します。そのためは、自分の操作したいオブジェクトが、図面データベース中のどの場所に存在しているかをある程度把握しておく必要があります。図面データベース内のオブジェクトの場所を把握するためには、この図面データベースの構造を理解しておく必要があります。

「AutoCAD LTの図面データベースの構造」と言っても、難しいものではありません。この図面データベースの構造を、図にあらわすと以下のように表現できます。

図面データベースの基本構造は、図面データベース全体を管理している「図面データベース オブジェクト」を筆頭に、画層や線種、ブロックなどの「シンボルテーブルオブジェクト」、そしてその要素である「シンボルテーブルレコード オブジェクト」から構成されています。

この構造は、通常のAutoCAD LTの操作をご存知の方であれば、難しい構造ではないことがわかると思います。

「つながり」:

図面データベースは、図のようにオブジェクトが「つながる」ことで構成されています。「つながり」は下図のようにオブジェクトの「親(オーナー)」「子」関係で構成されています。「親(オーナー)」となるオブジェクトは、各シンボルテーブル オブジェクトのように、複数のオブジェクトを「つなげる」ことができます。

このように、図面データベース内のオブジェクトは、必ず関連する別のオブジェクトと「つながる」ことで、図面データベースの一部のオブジェクトとなっているのです。この「つながり」をたどることで、必ず目的のオブジェクトへとたどり着きます。

例えば、「画層0」の情報が取得したい場合、基本的には以下の手順で図面データベース内の「つながり」を検索します。

その中において、図形関連のオブジェクトは、「ブロックテーブルオブジェクト」内の「ブロックテーブルレコード オブジェクト」につながっています。このしくみは、AutoCAD LTが「ブロック登録」するしくみと同様です、登録するブロックの形状をあらわすために、その登録されたブロック(これがブロックレコードオブジェクト)に図形をつなげておきます。これが、ブロック図形となっているわけです。同じしくみを利用して、「モデル空間」や「ペーパー空間」なども定義しています。

つまり、通常の「モデル空間」で作図することは、「モデル空間」というブロックに図形を追加しているのと同じことになるのです。

この構造さえ知っていれば、図面データベース内のどのオブジェクトも見つけて操作することが可能です。








シンボルテーブルの基本構造


図面データベースにおけるシンボルテーブルの基本構造について説明します

シンボルテーブルの基本構造:

図面データベース構造の基本は、図のようにシンボルテーブル オブジェクトと、その要素であるレコード オブジェクトの組み合わせで構成されています。

各シンボルテーブル オブジェクトは、それぞれ図面データベース オブジェクトから「つながって」います。(つまり、各シンボルテーブル オブジェクトから見ると、図面データベース オブジェクトは「親(オーナー)」オブジェクトとなります。)

シンボルテーブル オブジェクトには、その要素として複数のシンボルテーブルレコード オブジェクトを「つなげる」ことができます。(シンボルテーブルオブジェクトも「親(オーナー)」オブジェクトということです。)つまり、シンボルテーブル オブジェクトはそのシンボルテーブル全体をとりまとめて管理するオブジェクトであり、実際の各要素に設定される情報は各シンボルテーブルレコード オブジェクトに設定されます。

例えば、「AutoCAD LT上で『画層』を作成する」という作業は、図面データベース上では画層テーブル オブジェクトに、新しい画層テーブルレコード オブジェクトを追加する作業になります。つまり、「画層」を追加すると画層テーブルレコード オブジェクトが追加されることになるのです。

シンボルテーブルの種類:

このシンボルテーブルには、以下のような種類があります。

AcDbViewportTable(ビューポートテーブル)
AcDbViewTable(ビューテーブル)
AcDbBlockTable(ブロックテーブル)
AcDbDimStyleTable(寸法スタイルテーブル)
AcDbLayerTable(画層テーブル)
AcDbLinetypeTable(線種テーブル)
AcDbRegAppTable(アプリケーションテーブル)
AcDbTextStyleTable(文字スタイルテーブル)
AcDbUCSTable(UCSテーブル)

シンボルテーブルの操作:

どのシンボルテーブルも、シンボルテーブル オブジェクトにシンボルテーブルレコード オブジェクトが複数「つながる」という構造はまったく同じです。そのため、このシンボルテーブルに関する操作の方法は1つ理解しておけば、すべてのシンボルテーブルに使用できます。

例えば、「画層0」の情報が取得したい場合、基本的には以下の手順で図面データベース内の「つながり」を検索します。

 '図面データベースから画層テーブルを取得

 es = obj.db ( "画層テーブル取得" , Null , tableId)

 '画層テーブルから画層テーブルレコードを取得

 es = obj.cad ( "画層テーブル" , tableId , "名前から取得" , "0" , recId)

この手法を利用して図面データベース オブジェクトから目的とするシンボルテーブルレコード オブジェクトを検索することが可能です。

-------------------------------------------------------------------------

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim tableId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim recId As Variant   '(「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   '「図面データベース」から指定の「シンボルテーブル」を取得
   es = obj.db ( "画層テーブル取得" , Null , tableId)
   '「画層テーブル」から名前が「"0"」の「画層テーブルレコード」を取得
   es = obj.cad ( "画層テーブル" , tableId , "名前から取得" , "0" , recId)
   '「画層テーブルレコード」の「色」を変更
   es = obj.cad ( "画層テーブルレコード" , recId , "色設定" , 1 , Null)
End Sub

-------------------------------------------------------------------------

上の例では、図面データベース オブジェクトから順に目的のオブジェクト、シンボルテーブルレコード オブジェクトを検索しています。しかし、各シンボルテーブルオブジェクトは、図面データベース内に1つづつしか存在しません。そのため、これらのシンボルテーブルオブジェクトを特定する作業を省くことが可能です。そために、LT VB-COMでは各シンボルテーブル オブジェクトを直接操作することのできる関数を用意しています。この関数を利用すれば、図面データベース オブジェクトからではなく操作したいシンボルテーブル オブジェクトから直接操作することが可能です。

この手法を使用すると、先に紹介したシンボルテーブルの操作よりも少し簡単にプログラムが作成できます。以下に上の例と同様に、「画層0」のオブジェクトを検索し、その「色」を「赤」に変更する例を紹介します。

-------------------------------------------------------------------------

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim recId As Variant   '(「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   '「画層テーブル」から名前が「"0"」の「画層テーブルレコード」を取得
   es = obj.table ( "画層テーブル" , "名前から取得" , "0" , recId)
   '「画層テーブルレコード」の「色」を変更
   es = obj.cad ( "画層テーブルレコード" , recId , "色設定" , 1 , Null)
End Sub

-------------------------------------------------------------------------

このシンボルテーブルの操作方法は、すべてのシンボルテーブルに共通で使用できます。上の例の赤い文字で書かれたシンボルテーブルの名前を、操作したいシンボルテーブルの名前に変更するだけで使用できます。

プログラムでは、以下の「XXXテーブル」の部分を操作したいシンボルテーブルの名前に変更するだけです。

-------------------------------------------------------------------------

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim recId As Variant   '(「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   '「XXXテーブル」から名前が「"名前1"」の「XXXテーブルレコード」を取得
   es = obj.table ( "XXXテーブル" , "名前から取得" , "名前1" , recId)
   '「XXXテーブルレコード」に「命令」を実行
   es = obj.cad ( "XXXテーブルレコード" , recId , "命令" , setData , getData)
End Sub

-------------------------------------------------------------------------

(上記の"名前1"や"命令"はシンボルテーブル毎の任意の文字列になります)





図形の基本構造


図面データベースにおける図形オブジェクトの扱いについて説明します

図面データベースの構造は、基本的に図面データベース オブジェクトにつながる各シンボルテーブル オブジェクト、そのシンボルテーブル オブジェクトに「つながる」シンボルテーブルレコード オブジェクトから構成されています。

この図面データベースの基本構造の中には、シンボルテーブル オブジェクトとシンボルテーブルレコード オブジェクトしか登場しません。AutoCAD LTにおいてもっとも重要なオブジェクト、「図形オブジェクト」に関する内容が見当たりません。図面データベースの構造に含まれるオブジェクトは、必ず何らかのオブジェクトと「つながって」いるはずです。それでは、いったい図形オブジェクトはどのオブジェクトに「つながって」いるのでしょうか?

「ブロック登録」と図形オブジェクト:

以下に図形オブジェクトを含めた図面データベースの構造を表示します。

図のように図形オブジェクトはすべて、「ブロックテーブルレコード オブジェクト」に「つながって」います。つまり、この「ブロックテーブルレコード オブジェクト」は図形オブジェクトの「親(オーナー)」オブジェクトとなっているのです。

このしくみは、基本的にAutoCAD LTの「BLOCK(ブロック登録)」コマンドの機能を図面データベース上で管理するための機能です。そこで、この「BLOCK(ブロック登録)」が図面データベース上でどのように管理されているのかを説明します。

例として、AutoCAD LT上で以下の図のような「線分」と「円」を「BLOCK(ブロック登録)」コマンドで、ブロック登録をすると仮定します。このとき登録する「ブロック」に名前を付ける必要があるのですが、ここではこの名前を「"ABC"」としておきます。

この「BLOCK(ブロック登録)」コマンドによって登録されるブロックの情報は、図面データベースにおいてはブロックテーブルレコード オブジェクトとして保管されます。登録されたブロックの状態を、図面データベースのオブジェクトとして表現すると以下のようになります。

登録されたブロックは、ブロックテーブルレコード オブジェクトとして、ブロックテーブル オブジェクトに「つながり」ます。このブロックテーブルレコード オブジェクトの名前が「"ABC"」と付けられます。

さらに、この登録ブロックの構成要素となる図形の情報が、図形オブジェクトとしてブロックテーブルレコード オブジェクトに「つながり」ます。図面データベースにおいては、このブロックテーブルレコード オブジェクトと、それに「つながる」図形オブジェクトによって登録されているブロックを表現しています。この構造を理解しておけば、登録されたブロックの構造を取得することも可能です。図面データベース内のオブジェクトの「つながり」をたどり、登録されたブロック(ブロックテーブルレコード オブジェクト)やその構成要素である図形オブジェクトを取得できます。

この作業を実際のプログラムにしてみると、以下のように記述することができます。

-------------------------------------------------------------------------

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim recId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim ids As Variant   '(複数の「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   '「ブロックテーブル」から名前が「"ABC"」の「ブロックテーブルレコード」を取得
   es = obj.table ( "ブロックテーブル" , "名前から取得" , "ABC" , recId)
   If es Then
       '「ブロックテーブルレコード」の構成要素の図形をすべて取得
       es = obj.cad ( "ブロックテーブルレコード" , recId , "全図形取得" , Null , ids)
       For i = LBound ( ids ) To UBound ( ids )
           MsgBox  obj.NameJ( ids ( i ) ), vbOKOnly , "構成要素図形"
       Next
   End If
End Sub

-------------------------------------------------------------------------

「モデル空間」に作図される図形オブジェクト:

ここまでは「ブロック登録」されたブロックを構成する、図形オブジェクトについて説明しました。ここでは、AutoCAD LTの作図画面上で作図する図形が、図面データベース内でどのような形式で図形オブジェクトとして保存されているのかを説明します。図形の操作の中心は、この「モデル空間」上に作図された図形になるでしょう。

図面データベースの構造において、図形オブジェクトは通常「ブロックテーブルレコード オブジェクト」に「つながって」保存される形式が一般的です。しかし、「モデル空間」はユーザによって登録された「ブロック」ではありません。しかし、「モデル空間」だけ特別な図形オブジェクトの管理方法をすると、プログラムの作成が複雑になってしまいます。そこで、このAutoCAD LTの図面データベースでは、効率良く「モデル空間」の図形を管理するために、以下のような決まりを作りました。

 「モデル空間」はAutoCAD LTシステムが作成した「登録ブロック」

つまり、「モデル空間」も1つの「登録されたブロック」して扱うということです。この「モデル空間」という「登録されたブロック」は特殊なブロックで、AutoCAD LTの起動時にAutoCAD LTシステムによって作成されます。そして、AutoCAD LTの「モデル空間」上で作図される図形は、「モデル空間」という「登録されたブロック」上にその情報が、図形オブジェクトとして「つなげられ」て行きます。

その結果、「モデル空間」の図形の管理も、「登録されたブロック」における図形の管理も、まったく同じ「ブロックテーブルレコード オブジェクト」によって管理するという方法で図面データベース上に保存されることになるのです。通常の「登録ブロック」と「モデル空間」の違いは、管理している図形オブジェクトが「モデル空間」の場合は作図画面上で見えることだけです。

図面データベース上の構造が同じであれば、当然操作の方法も同じになります。つまり、「モデル空間」上の図形オブジェクトを図面データベースから探す手順は、図面データベースの中から「登録ブロック」を構成する図形オブジェクト探す手順とまったく同じになります。唯一の違いは、ブロックテーブルレコード オブジェクトの「名前」だけになります。以前に紹介した、「登録ブロック」を構成するすべての図形オブジェクトを図面データベースから検索する例をもとに比較してみます。

-------------------------------------------------------------------------

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim recId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim ids As Variant   '(複数の「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   '「ブロックテーブル」から名前が「"ABC"」の「ブロックテーブルレコード」を取得
   es = obj.table ( "ブロックテーブル" , "名前から取得" , "ABC" , recId)
   If es Then
       '「ブロックテーブルレコード」の構成要素の図形をすべて取得
       es = obj.cad ( "ブロックテーブルレコード" , recId , "全図形取得" , Null , ids)
       For i = LBound ( ids ) To UBound ( ids )
           MsgBox obj.NameJ( ids ( i ) ), vbOKOnly , "構成要素図形"
       Next
   End If
End Sub

-------------------------------------------------------------------------

この例題では、「"ABC"」という名前の「登録ブロック」(ブロックテーブルレコード オブジェクト)を図面データベースの中から探しています。

同様に、図面データベースの中から「モデル空間」上の図形オブジェクトを検索する場合には、上のプログラムのブロックテーブルレコード オブジェクトの名前の部分(「"ABC"」)を「モデル空間」を指定する名前「"*Model_Space"」に変更するだけです。

-------------------------------------------------------------------------

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim recId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim ids As Variant   '(複数の「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   '「ブロックテーブル」から名前が「"*Model_Space"」の「ブロックテーブルレコード」を取得
   es = obj.table ( "ブロックテーブル" , "名前から取得" , "*Model_Space" , recId)
   If es Then
       '「ブロックテーブルレコード」の構成要素の図形をすべて取得
       es = obj.cad ( "ブロックテーブルレコード" , recId , "全図形取得" , Null , ids)
       For i = LBound ( ids ) To UBound ( ids )
           MsgBox obj.NameJ( ids ( i ) ), vbOKOnly , "構成要素図形"
       Next
>    End If
End Sub

-------------------------------------------------------------------------

図面データベースにおけるこの構造は、「モデル空間」の構造に限りません。「モデル空間」と同じように、AutoCAD LT上で作図可能な作業空間として、「ペーパー空間」も存在します。この「ペーパー空間」も「モデル空間」と同様にブロックテーブルレコード オブジェクトによって管理されています。





ディクショナリの基本構造


図面データベースにおけるディクショナリの基本構造について説明します

ディクショナリ オブジェクトの特性:

ディクショナリ オブジェクトとは、図面データベース内において、やや特殊なオブジェクトです。ディクショナリ オブジェクトには他の複数のオブジェクトを追加できる「オーナー」オブジェクトの機能を持っています。

図のように、複数の異なる任意のオブジェクトを「つなぐ」こともできますし、ディクショナリ オブジェクトにさらに別のディクショナリ オブジェクトを「つなぐ」ことも可能です。その結果、このディクショナリ オブジェクトを組み合わせることでシンボルテーブルのような階層化された構造を任意に構築することも可能です。

このように、ディクショナリ オブジェクトは任意のオブジェクトを複数「つなぐ」ことができるため、特殊なオブジェクトの管理方法を使用しています。シンボルテーブル オブジェクトとシンボルテーブルレコード オブジェクトの関係は、シンボルテーブル オブジェクトに複数のシンボルテーブルレコード オブジェクトが「つながり」ます。このとき各シンボルテーブルレコード オブジェクトにそれぞれ名前が付けられます。これは、各シンボルテーブルレコード オブジェクトに「名前」を保管する機能があるので実現できるのです。

それに対して、ディクショナリ オブジェクトの場合は、「名前」を保管できないオブジェクトを「つなげて」管理する必要もあります。そのため、「名前」は管理しているディクショナリ オブジェクト内にすべて保存し、「つながる」オブジェクトと「名前」をディクショナリ オブジェクト内部で構築しています。

このように、名前とオブジェクトの管理方法が、ディクショナリとシンボルテーブルでは異なるので注意してください。

図面データベースにおけるディクショナリ:

図面データベース構造の基本は、図のようにシンボルテーブル オブジェクトと、その要素であるレコード オブジェクトの組み合わせで構成されています。

この基本構造にディクショナリ オブジェクトは紹介しておりません。それは、ディクショナリ オブジェクトの扱いが、通常のシンボルテーブル オブジェクトや図形オブジェクトと異なり、やや特殊だからです。

とはいえ、ディクショナリ オブジェクトも図面データベース上のオブジェクトである以上、この基本構造のどこかのオブジェクトに「つながり」を持つ必要があります。以下に図面データベース内におけるディクショナリ オブジェクトの構造を表します。

図のように、基本的なディクショナリ オブジェクトは、シンボルテーブル オブジェクトと同じように、図面データベース オブジェクトから直接「つながって」います。この図面データベース オブジェクトから「つながっている」ディクショナリ オブジェクトをここでは「基本ディクショナリ オブジェクト」と呼ぶことにします。それは、ディクショナリ オブジェクトが他のシンボルテーブルの構造と異なり、同じディクショナリ オブジェクトが複数存在することができるからです。

上の図の図面データベースの構造の中において、基本ディクショナリ オブジェクトの下にいくつかのオブジェクトが「つながって」いることがわかると思います。実際には、これらはAutoCAD LTの機能である「マルチライン スタイル」や「グループ」などを管理している場所になります。「マルチライン スタイル」や「グループ」などは仕様上、シンボルテーブルの構造と同じ概念になります。例えば、「グループ」に名前を付けて複数の図形をグループ化し、この「グループ」を名前を付けることで、いくつでも定義することが可能です。ころはちょうど、シンボルテーブルに、名前を付けたシンボルテーブル オブジェクトを複数定義できることと同じ考え方です。

先の例で紹介した「グループ」は、AutoCAD LTの概念上間違いなく「シンボルテーブル」の構造です。そのため本来「グループ テーブル」なるシンボル テーブルが存在しても良いのです。しかし、AutoCAD LTでは今後の拡張性を考慮し、この構造を「シンボルテーブル」を使用することなく、ディクショナリを使用して実現しています。このようにディクショナリ オブジェクトを「シンボル テーブル」オブジェクトのように使用することができるのです。

AutoCAD LTにおいて、このディクショナリ オブジェクトを利用して設計されている「シンボルテーブル」と同じような構造のものには、以下のものがあります。

AcDbGroup(グループ)
AcDbMlineStyle(マルチラインスタイル)
AcDbPlaceHolder(プレイスホルダー)
AcDbPlotSettings(印刷設定)
AcDbLayout(レイアウト)
AcDbRasterImageDef(イメージ定義)

これらの構造につきましては、基本的にディクショナリ オブジェクトを組み合わせて実現されています。上記の各オブジェクトは、それぞれ「グループ」や「マルチラインスタイル」などの情報を保管するオブジェクトですが、これらの各オブジェクトを複数つなげてを管理しているオブジェクトは、それぞれディクショナリ オブジェクトなのです。

「グループ」、「マルチラインスタイル」、「プレイスホルダー」、「印刷設定」、「レイアウト」、「イメージ定義」は、それぞれ専用のディクショナリで管理されています。この専用のディクショナリは、通常のディクショナリとまったく同じディクショナリです。管理しているそれぞれのオブジェクトがわかり易いように、それぞれのオブジェクトの名前を付けて「グループ ディクショナリ」や「マルチライン ディクショナリ」などと呼ぶこともあります。

「グループ」、「マルチラインスタイル」、「プレイスホルダー」、「印刷設定」、「レイアウト」、「イメージ定義」の基本的なオブジェクトの作業は、この構造を踏まえて実行する必要があります。

以下の例では、登録されているすべての「グループ」を取り出し、各「グループ」に含まれるすべての図形オブジェクトをそれぞれ表示するサンプルです。

-------------------------------------------------------------------------

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim idArray As Variant   '(「オブジェクトID」のリストを格納する変数宣言)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim chk As Boolean    '(チェックの結果を格納する変数宣言)
   Dim groupName As Variant    '(名前を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   '「グループ」はシンボルテーブルではなく「ディクショナリ」上に存在
   'そのため、「グループ用ディクショナリ」オブジェクトのオブジェクトIDを取得
   es = obj.db ( "グループディクショナリ取得" , Null , objId ) 
   chk = obj.typeCheck ( "ディクショナリ" , objId ) '(命令が使用できるかクラス名をチェック)
   If chk Then '(命令が使用できる場合は次を実行)
       '「グループ用ディクショナリ」オブジェクトからすべての「グループ」を取得
       es = obj.cad ( "ディクショナリ" , objId , "全レコード取得" , Null , idArray )
       If es Then   '(上記の命令が正しく動作した場合次を実行)
           'ここではじめて「グループ」オブジェクトが取得できる
           '「グループディクショナリ内」内のすべての「グループ」を取得
           For i = LBound ( idArray ) To UBound ( idArray )  '(リストの数だけ次の実行を繰り返す)
               groupName = Empty
               getData = Empty
               objId = idArray ( i )
               es = obj.cad ( "グループ" , objId , "名前取得" , Null , groupName )
               es = obj.cad ( "グループ" , objId , "全図形のID取得" , Null , getData )
               If es Then   '(上記の命令が正しく動作した場合次を実行)
                   If TypeName ( getData ) = "Long()" Then '(「getData」がオブジェクトIDのリストの場合次を実行)
                       For j = LBound (getData ) + 1 To UBound ( getData ) '先頭は図形の総数
                           '(実行結果をメッセージボックスに表示)
                           MsgBox obj.nameJ ( getData ( j ) ) & ":" & getData( j ) , vbOKOnly,  "グループ図形 " & getData ( 0 ) & "個"
                       Next
                       Erase getData '(リストの内容を削除)
                   End If
               End If
           Next
           Erase idArray '(リストの内容を削除)
       End If
   Else
>        MsgBox "オブジェクトは「ディクショナリ」ではありません", vbOKOnly , "エラー表示"
   End If
End Sub

-------------------------------------------------------------------------

カスタマイズおけるディクショナリ:

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

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

しかも、このディクショナリ オブジェクトは、ディクショナリ オブジェクト自体を自分で新しく作成することも可能です。この特性を利用すると図のように、シンボルテーブルのような階層構造を自分で設計することも可能です。カスタマイズの設計に応じて、柔軟に情報の保管方法を設計できるのもディクショナリの優れている点です。