Polymorphism











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

カスタマイズ専用データ
LT VB-COM HELP Samples


ホーム > 製品 > LT VB-COM > 充実のヘルプ > LT VB-COMの基本 > カスタマイズ専用データ

カスタマイズ専用データ


カスタマイズの際にしか使用しない特殊なデータについて説明します

アプリケーションなどを設計すると、通常の図面データベース上の情報ではない特殊なデータや情報が必要になる場合があります。例えば、CADの製図機能には関係のない「重さ」や「材質」の情報や、図形同士の関連情報、図形の編集履歴や作業者の名前、作業日、またアプリケーション固有のコード番号や、特殊な付加情報など、設計するシステムにに応じていろいろなケースが考えられます。AutoCAD LTの標準機能である「属性」の機能や「グループ」の機能などで、実現できる場合もありますが、すべてを標準機能で実現することはできません。

AutoCADやAutoCAD LTでは、これらのカスタマイズ固有の情報の保管を実現するために、用途に応じていくつかの特殊なカスタマイズ用のオブジェクトやデータ構造を持っています。アプリケーションなどの設計の際にはこれらの機能を考慮し、設計することでより良いシステムが作成できます。ここでは、LT VB-COMで使用できるこのカスタマイズ専用のオブジェクトやデータ構造について説明します。

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

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

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



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

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

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

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


<拡張データのデータ形式>

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

(コード ・ データ)

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

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

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

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

[コード]

[データ型]

1000

一般文字列

1001

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

1002

"{"または "}"

1003

画層(文字列)

1004

バイナリ(未サポート)

1005

ハンドル番号(文字列)

1010

一般3D座標値

1011

ワールド座標上での位置

1012

ワールド座標上での変異

1013

ワールド座標上の方向

1040

一般実数

1041

距離(実数)

1042

尺度(実数)

1070

16ビット一般整数

1071

32ビット一般整数

基本的に「拡張データ」の「コード」の値は、1000番以降になります。上記の「コード」を利用して、リザルト バッファのリンクリストをLT VB-COMで使用する場合には、以下のように「コード」と「データ」を「配列(Variant)」型の変数に順番に格納することで表現します。

Dim setData ( 0 To n ) As Variant
setData ( 0 ) =コード
setData ( 1 ) =データ
setData ( 2 ) =コード
setData ( 3 ) =データ
  ・・・・・・
setData ( n-1 ) =コード
setData ( n ) =データ

「拡張データ」とのデータの受け渡しは、この形式で行います。以下に「拡張データ」のデータを受け取る例を示します。


  例)変数「getData」に「拡張データ」を取得した場合                                                                                       


[値] [意味] [内容]
getData ( 0 ) 1070 コード (1070・123)
getData ( 1 ) 123 データ
getData ( 2 ) 1040 コード (1040・1.23)
getData ( 3 ) 1.23 データ
getData ( 4 ) 1000 コード (1000・"ABC")
getData ( 5 ) "ABC" データ
getData ( 6 ) 1010 コード (1010・(5.0,5.0,0.0))
getData ( 7 ) (5.0,5.0,0.0) データ


<アプリケーションの登録>

拡張データを使用するためには、使用中の図面データベースに「アプリケーション名」を登録する必要があります。上で説明したように、拡張データは、AutoCADやAutoCAD LTからはまったく使用されないデータです。
}そのため管理は、その拡張データを付加したプログラムつまり、アプリケーションによって完全に管理しなければなりません。そのために、拡張データを利用するためには、その拡張データを管理しているアプリケーション名を事前に登録しておく必要があります。アプリケーション名の登録は、シンボルテーブル「アプリケーション テーブル」に登録することになります。新しいアプリケーション名を付けた「アプリケーション テーブルレコード」オブジェクトを作成し、「アプリケーション テーブル」オブジェクトに「つなぐ」ことで新しいアプリケーションの登録が可能です。この操作は以下の「命令」で実現できます。

      es = obj.table ("アプリケーションテーブル","追加" , "アプリケーション名", recId)

この登録したアプリケーション名を使用して、拡張データの操作を行ないます。これは、1つのオブジェクトに対して、複数のアプリケーションが異なる拡張データを付加する可能性があるからです。どのアプリケーションがどのような拡張データを付加しているかを分けておくことで、拡張データをより簡単に使用できるようになるのです。


<拡張データの追加>

アプリケーション名の登録さえできれば、いつでも、どのオブジェクトに対しても拡張データを付加することができます。拡張データは、付加したいオブジェクトに対して直接「命令」を使用して指定することができます。事前に拡張データ用のリザルト バッファ型のリンクリストを用意します。このリストの構造は上で説明しましたが、実際に拡張データの認識をさせるためには、このリザルト バッファ型のリンクリストの最初のデータを使用するアプリケーション名にする必要があります。

      Dim setData ( 0 to 7 ) As Variant '(命令の実行に必要な「設定データ」用変数宣言)
      setData ( 0 ) = 1001 : setData ( 1 ) = "アプリケーション名" ' ( 1001 . "アプリケーション名")
      setData ( 2 ) = 1070 : setData ( 3 ) = 123 ' ( 1070 . 123 )「整数」保管
      setData ( 4 ) = 1040 : setData ( 5 ) = 1.23 ' ( 1040 . 1.23 )「実数」保管
      setData ( 6 ) = 1000 : setData ( 7 ) = "文字保管" ' ( 1000 . "文字保管")「文字列」保管

この拡張データ用のリザルト バッファ型のリンクリストが作成できれば、これを拡張データ指定用の「命令」に使用します。

    es = obj.cad ("全オブジェクト共通", objId ,"拡張データ設定", setData , Null)

これで、図面情報とは関係のないアプリケーション固有の任意のデータを拡張データとして、どのオブジェクトにも付加することができます。


<拡張データの取り出し>

付加した拡張データは、付加したプログラム(アプリケーション)でこれを利用します。そのため、オブジェクトから拡張データを取り出す作業も必ず発生します。オブジェクトから拡張データを取得するためには、そのアプリケーション名(文字列)が必要です。これは複数のアプリケーションが同じオブジェクトに対して拡張データを付加している可能性があるからです。この拡張データ取得の際にアプリケーション名を指定することで、そのアプリケーションが付加した拡張データのみを抽出できるのです。拡張データは以下のように取得します。

      es = obj.cad ("全オブジェクト共通", objId ,"拡張データ取得", "アプリケーション名" , getData)

これで、指定のアプリケーションが付加した拡張データを取得することができます。「拡張データ」の取得や設定に関する「命令」の詳細は、以下を参照してください。

・AcDbObject(全オブジェクト共通)の操作
 □ xData 日本語名:「拡張データ取得」
 □ setXData 日本語名:「拡張データ設定」

以下に図形に拡張データを付加するサンプルと取得するサンプルを紹介します。

-------------------------------------------------------------------------
'「拡張データ」を図形に追加
Sub Sample1()
   Dim es As Boolean    '(この命令を実行した動作状況を格納する「エラー状況」)
   Dim objId As Variant   '(オブジェクトを特定するための「オブジェクトID」を格納)
   Dim recId As Variant   '(レコード用「オブジェクトID」を格納)
   Dim setData ( 0 to 9 ) As Variant '(命令の実行に必要な「設定データ」用変数宣言)
   Dim chk As Variant '(チェック用変数)
   Dim appName As String '(アプリケーション名)
   Dim pt ( 0 to 2 ) As Double '(座標値)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   es = obj.util ("最後の図形" ,Null , objId) '(最後に作図した図形のオブジェクトIDを取得)
   If es Then
       appName = "SampleApp"
       es = obj.table ("アプリケーションテーブル" ,"所有?" , appName , chk)
       If chk = 0 Then
           es = obj.table ("アプリケーションテーブル" ,"追加" , appName , recId)
       End If
       '拡張レコード保存用データ作成
       pt ( 0 ) = 5.0: pt ( 1 ) = 5.0: pt ( 2 ) = 0.0 
       setData ( 0 ) = 1001 : setData ( 1 ) = appName ' ( 1001 . appName )「アプリケーション名」保管
       setData ( 2 ) = 1070 : setData ( 3 ) = 123 ' ( 1070 . 123 )「整数」保管
       setData ( 4 ) = 1040 : setData ( 5 ) = 1.23 ' ( 1040 . 1.23 )「実数」保管
       setData ( 6 ) = 1000 : setData ( 7 ) = "文字保管" ' ( 1000 . "文字保管"&amp;amp;quot;「文字列」保管
       setData ( 8 ) = 1010 : setData ( 9 ) = pt ' ( 1010 . ( 5.0 , 5.0 , 0.0 ) )「座標値」保管
       'ディクショナリ内に「拡張データ」オブジェクト生成
       es = obj.cad ("全オブジェクト共通" , objId ,"拡張データ設定" , setData , Null)
   End If
End Sub

'上で作成した「拡張データ」を取得

Sub Sample2()
   Dim es As Boolean    '(この命令を実行した動作状況を格納する「エラー状況」)
   Dim objId As Variant   '(オブジェクトを特定するための「オブジェクトID」を格納)
   Dim getData As Variant '(この命令を実行した動作状況を格納する「取得データ」)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   es = obj.util ("最後の図形" ,Null , objId) '(最後に作図した図形のオブジェクトIDを取得)
   If es Then
       es = obj.cad("全オブジェクト共通" , objId ,"拡張データ取得")"SampleApp" , getData)
       If TypeName ( getData ) = "Variant()" Then '(「getData」がリストの場合次を実行)
           rbLen = ( UBound ( getData ) - 1 ) / 2 '(データリストの数を取得)
           For i = 0 To rbLen  '(データリストの数だけ次の実行を繰り返す)
               code = getData ( i * 2 )
               data = getData ( ( i * 2 ) + 1 )
               '(実行結果をメッセージボックスに表示)
               If 1010 &amp;lt;= code And code &amp;lt;= 1013 Then
                   MsgBox "(" & code & ". (" & data ( 0 ) & "," & data ( 1 ) & "," & data ( 2 ) & ") )", vbOkOnly ,"拡張データ"
               Else
                   MsgBox "(" & code & "." & data & ")", vbOkOnly ,"拡張データ"
               End If
           Next
       End If
   End If
End Sub
-------------------------------------------------------------------------




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


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


<拡張ディクショナリのデータ形式>

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

(コード ・ データ)

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

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

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

    &amp;lt;「拡張レコード」で使用できるコード一覧&amp;gt;

[コード]

[データ型]

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

文字列


上記の「コード」を利用して、リザルト バッファのリンクリストをLT VB-COMで使用する場合には、以下のように「コード」と「データ」を「配列(Variant)」型の変数に順番に格納することで表現します。

Dim setData ( 0 To n ) As Variant
setData ( 0 ) =コード
setData ( 1 ) =データ
setData ( 2 ) =コード
setData ( 3 ) =データ
  ・・・・・・
setData ( n-1 ) =コードsetData ( n ) =データ

「拡張レコード」とのデータの受け渡しは、この形式で行います。以下に「拡張レコード」にデータをセットするためのデータの構造の例を示します。


  例)変数「setData」を利用して「拡張レコード」をセットする場合


[値] [意味] [内容]
setData ( 0 ) 60 コード (60・123)
setData ( 1 ) 123 データ
setData ( 2 ) 38 コード (38・1.23)
setData ( 3 ) 1.23 データ
setData ( 4 ) 1 コード (1・"ABC")
setData ( 5 ) "ABC" データ
setData ( 6 ) 10 コード (10・(5.0,5.0,0.0))
setData ( 7 ) (5.0,5.0,0.0) データ


<拡張ディクショナリの作成>

拡張ディクショナリを使用するためには、データを付加したいオブジェクトに対して、拡張ディクショナリ領域を定義する必要があります。そのためには、拡張ディクショナリを作成する「命令」を直接目的のオブジェクトに対して使用します。

       es = obj.cad ("全オブジェクト共通", objId ,"拡張ディクショナリ作成", Null , Null)


<拡張ディクショナリの使用>

作成されたオブジェクト専用のデータ付加領域を使用するためには、用意されたディクショナリ オブジェクトのオブジェクトIDを取得する必要があります。このディクショナリ オブジェクトのオブジェクトIDを取得するためには、以下の「命令」を使用します。

       es = obj.cad ("全オブジェクト共通", objId ,"拡張ディクショナリ取得", Null , ownerId)

このディクショナリ オブジェクトのオブジェクトIDさえ保管しておけば、いつでもオブジェクト専用のデータ付加領域を使用することができます。この領域に実際にデータを付加したい場合には、拡張レコードを使用します。拡張レコードを生成し、その拡張レコードに実際に保存したい付加情報を保存します。事前に拡張レコード用のリザルト バッファ型のリンクリストを用意します。

      Dim setData ( 0 to 5 ) As Variant '(命令の実行に必要な「設定データ」用変数宣言)
      setData ( 0 ) = 60 : setData ( 1 ) = 123 ' ( 60 . 123 )「整数」保管
      setData ( 2 ) = 38 : setData ( 3 ) = 1.23 ' ( 38 . 1.23 )「実数」保管
      setData ( 4 ) = 1 : setData ( 5 ) = "文字保管" ' ( 1 . "文字保管"&amp;amp;quot;「文字列」保管

この拡張レコード用のリザルト バッファ型のリンクリストが作成できれば、これを利用して拡張レコードを作成します。拡張レコードを作成する際には、その拡張レコードを管理するための「名前」と、拡張レコードを「つなげる」親(オーナー)オブジェクトを指定します。「名前」は、この拡張レコードを取得する際に、他の拡張レコードと区別するために使用します。そのため任意の名前で構いませんが、親(オーナー)オブジェクトを指定する場所には、上で取得したオブジェクト専用のデータ付加領域用のディクショナリ オブジェクトのオブジェクトIDを指定します。

      es = obj.make ("拡張レコード", "Sample" , setData , ownerId&amp;amp;quot;getData)

これで、任意のデータを保管した拡張レコードが作成され、オブジェクト専用のデータ付加領域を管理するディクショナリ オブジェクトに「つながり」ます。


<拡張ディクショナリの取り出し>

付加した拡張ディクショナリの内容は、必要に応じて取り出す必要もあります。オブジェクトから拡張ディクショナリを取得するためには、付加データを追加する際にも使用した以下の「命令」を使用します。

       es = obj.cad ("全オブジェクト共通", objId ,"拡張ディクショナリ取得", Null , ownerId)

これで、オブジェクト専用のデータ付加領域用のディクショナリ オブジェクトを取得することができます。実際に付加した情報は、このディクショナリ オブジェクト「つながって」いる拡張レコード内に保管されています。ディクショナリ オブジェクトから指定の拡張レコードを取得するには、拡張レコードを追加する際に指定しておいた「名前」を使用します。

      es = obj.cad ("ディクショナリ", ownerId ,"名前から取得" , "Sample" , xrecId)

ここで取得できる拡張レコード オブジェクトから、初めて付加情報が取得できます。拡張レコード内の付加情報を取得するためには、以下の命令を使用します。

      es = obj.cad ("拡張レコード", xrecId , "一連のリザルトバッファ取得", Null ,getData)

これで、付加した拡張レコード内のデータを取得することができます。


<拡張ディクショナリの開放>

オブジェクト専用のデータ付加領域用である拡張ディクショナリは、基本的に各オブジェクトに対して1つしか作成できません。(この領域内に複数の拡張レコードは保管できますが、領域であるディクショナリ オブジェクトは1つだけです。)そのため、この領域が不要になった場合には、この領域を開放する方が良いでしょう。そのために、このオブジェクト専用のデータ付加領域用である拡張ディクショナリを開放(解除)する「命令」も用意されています。

      es = obj.cad ("全オブジェクト共通", objId ,"拡張ディクショナリ解除", Null , Null)

必要に応じて、このオブジェクト専用のデータ付加領域用は開放しておくことをお勧めします。「拡張ディクショナリ」や「拡張レコード」の取得や設定に関する「命令」の詳細は、以下を参照してください。

・AcDbObject(全オブジェクト共通)の操作
 □ createExtensionDictionary 日本語名:「拡張ディクショナリ作成」
 □ extensionDictionary(または getExtensionDictionary) 日本語名:「拡張ディクショナリ取得」
 □ releaseExtensionDictionary 日本語名:「拡張ディクショナリ解除」

・AcDbXrecord(拡張レコード)オブジェクトの操作
 □ rbChain(または getRbChain) 日本語名:「一連のリザルトバッファ取得」
 □ setFromRbChain 日本語名:「一連のリザルトバッファ設定」

以下に図形の拡張ディクショナリ領域を利用したサンプルを紹介します。

-------------------------------------------------------------------------
'拡張ディクショナリに拡張レコードを追加

Sub Sample1()
   Dim es As Boolean    '(この命令を実行した動作状況を格納する「エラー状況」)
   Dim objId As Variant   '(オブジェクトを特定するための「オブジェクトID」を格納)
   Dim ownerId As Variant   '(オーナーの「オブジェクトID」を格納)
   Dim setData ( 0 to 7 ) As Variant    '(命令の実行に必要な「設定データ」宣言)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim pt ( 0 to 2 ) As Double '(座標値)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   es = obj.util ("最後の図形" ,Null , objId) '(最後に作図した図形のオブジェクトIDを取得)
   If es Then
       es = obj.cad ("全オブジェクト共通" , objId ,"拡張ディクショナリ作成" , Null , Null)
       es = obj.cad ("全オブジェクト共通" , objId ,"拡張ディクショナリ取得" , Null , ownerId)
       If es Then
           '拡張レコード保存用データ作成
           pt ( 0 ) = 5.0: pt ( 1 ) = 5.0: pt ( 2 ) = 0.0 
           setData ( 0 ) = 60 : setData ( 1 ) = 123 ' ( 60 . 123 )「整数」保管
           setData ( 2 ) = 38 : setData ( 3 ) = 1.23 ' ( 38 . 1.23 )「実数」保管
           setData ( 4 ) = 1 : setData ( 5 ) = "文字保管" ' ( 1 . "文字保管"&amp;amp;quot;「文字列」保管
           setData ( 6 ) = 10 : setData ( 7 ) = pt ' ( 10 . ( 5.0 , 5.0 , 0.0 ) )「座標値」保管
           es = obj.make ("拡張レコード" , "Sample" , setData , ownerId ,getData)
       End If
   End If
End Sub

'拡張ディクショナリに設定されている拡張レコードを取得

Sub Sample2()
   Dim es As Boolean    '(この命令を実行した動作状況を格納する「エラー状況」)
   Dim objId As Variant   '(オブジェクトを特定するための「オブジェクトID」を格納)
   Dim ownerId As Variant   '(オーナーの「オブジェクトID」を格納)
   Dim xrecId As Variant   '(拡張レコードの「オブジェクトID」を格納)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim rbLen As Integer   '(拡張レコードの数を格納)
   Dim code As Integer   '(コードを格納)
   Dim data As Variant   '(データを格納)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   es = obj.util ("最後の図形" ,Null , objId) '(最後に作図した図形のオブジェクトIDを取得)
   If es  Then
       es = obj.cad ("全オブジェクト共通" , objId ,"拡張ディクショナリ取得" , Null , ownerId)
       If es Then
           '拡張レコード保存用データ取得
           es = obj.cad ("ディクショナリ" , ownerId ,"名前から取得" , "Sample" , xrecId)
           If es Then
               es = obj.cad ("拡張レコード" , xrecId , "一連のリザルトバッファ取得" , Null ,getData)
               rbLen = ( UBound ( getData ) - 1 ) / 2 '(データリストの数を取得)
               For i = 0 To rbLen
                   code = getData ( i * 2 )
                   data = getData ( ( i * 2 ) + 1 )
                   '(実行結果をメッセージボックスに表示)
                   If 10 &amp;lt;= code And code &amp;lt;= 17 Then
                       MsgBox "(" & code & ". (" & data ( 0 ) & "," & data ( 1 ) & "," & data ( 2 ) & ") )", vbOkOnly ,"拡張レコードデータ"
                   Else
                       MsgBox "(" & code & "." & data & ")", vbOkOnly ,"拡張レコードデータ"
                   End If
               Next
           End If
       Else
           MsgBox "この図形には拡張ディクショナリはありません。" , vbOkOnly ,"エラー表示"
       End If
   End If
End Sub

'拡張ディクショナリを解除

Sub Sample3()
   Dim es As Boolean    '(この命令を実行した動作状況を格納する「エラー状況」)
   Dim objId As Variant   '(オブジェクトを特定するための「オブジェクトID」を格納)
   Dim ownerId As Variant   '(オーナーの「オブジェクトID」を格納)
   Dim xrecId As Variant   '(拡張レコードの「オブジェクトID」を格納)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   es = obj.util ("最後の図形" ,Null , objId) '(最後に作図した図形のオブジェクトIDを取得)
   If es Then
       es = obj.cad ("全オブジェクト共通" , objId ,"拡張ディクショナリ取得" , Null , ownerId)
       If es Then
           '拡張レコード保存用データ取得
           es = obj.cad ("ディクショナリ" , ownerId ,"名前から取得" , "Sample" , xrecId)
           If es Then
               es = obj.cad ("拡張レコード" ,xrecId ,"削除" , Null , Null)
               es = obj.cad ("全オブジェクト共通" , objId ,"拡張ディクショナリ解除" , Null , Null)
               If es Then
                   MsgBox "拡張ディクショナリを解除しました。" , vbOkOnly ,"エラー表示"
               End If
           Else
               MsgBox "指定の拡張レコードはありません。" , vbOkOnly ,"エラー表示"
           End If
       Else
           MsgBox "この図形には拡張ディクショナリはありません。" , vbOkOnly ,"エラー表示"
       End If
   End If
End Sub

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


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

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

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

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



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


<拡張レコードのデータ形式>

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

(コード ・ データ)

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

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

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

    &amp;lt;「拡張レコード」で使用できるコード一覧&amp;gt;

[コード]

[データ型]

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

文字列


上記の「コード」を利用して、リザルト バッファのリンクリストをLT VB-COMで使用する場合には、以下のように「コード」と「データ」を「配列(Variant)」型の変数に順番に格納することで表現します。
Dim setData ( 0 To n ) As Variant
setData ( 0 ) =コード
setData ( 1 ) =データ
setData ( 2 ) =コード
setData ( 3 ) =データ
  ・・・・・・
setData ( n-1 ) =コード
setData ( n ) =データ

「拡張レコード」とのデータの受け渡しは、この形式で行います。以下に「拡張レコード」にデータをセットするためのデータの構造の例を示します。


  例)変数「setData」を利用して「拡張レコード」をセットする場合


[値] [意味] [内容]
setData ( 0 ) 60 コード (60・123)
setData ( 1 ) 123 データ
setData ( 2 ) 38 コード (38・1.23)
setData ( 3 ) 1.23 データ
setData ( 4 ) 1 コード (1・"ABC")
setData ( 5 ) "ABC" データ
setData ( 6 ) 10 コード (10・(5.0,5.0,0.0))
setData ( 7 ) (5.0,5.0,0.0) データ


<基本ディクショナリ オブジェクトの取得>

ここの例では、基本ディクショナリ オブジェクトに直接拡張レコードを追加するようにしています。そのため、基本ディクショナリ オブジェクトのオブジェクトIDを取得する必要があります。「基本ディクショナリ オブジェクト」は、図面データベース オブジェクトから直接「つながって」いるため、図面データベース オブジェクトの「命令」を使用して取得します。

      es = obj.db ("ディクショナリ取得", Null , dictId&amp;amp;quot; 


<拡張レコードの使用>

この基本ディクショナリ オブジェクトのオブジェクトIDさえ保管しておけば、いつでも基本ディクショナリ オブジェクトに拡張データを付加することができます。拡張レコードを生成し、その拡張レコードに実際に保存したい付加情報を保存します。事前に拡張レコード用のリザルト バッファ型のリンクリストを用意します。

      Dim setData ( 0 to 5 ) As Variant '(命令の実行に必要な「設定データ」用変数宣言)
      setData ( 0 ) = 60 : setData ( 1 ) = 123 ' ( 60 . 123 )「整数」保管
      setData ( 2 ) = 38 : setData ( 3 ) = 1.23 ' ( 38 . 1.23 )「実数」保管
      setData ( 4 ) = 1 : setData ( 5 ) = "文字保管" ' ( 1 . "文字保管"&amp;amp;quot;「文字列」保管

この拡張レコード用のリザルト バッファ型のリンクリストが作成できれば、これを利用して拡張レコードを作成します。拡張レコードを作成する際には、その拡張レコードを管理するための「名前」と、拡張レコードを「つなげる」親(オーナー)オブジェクトを指定します。「名前」は、この拡張レコードを取得する際に、基本ディクショナリ オブジェクトに「つながる」他のオブジェクトと区別するために使用します。そのため「名前」は任意の「名前」で構いませんが、親(オーナー)オブジェクトを指定する場所には、上で取得した基本ディクショナリ オブジェクトのオブジェクトIDを指定します。

      es = obj.make ("拡張レコード", "Sample" , setData , dictId&amp;amp;quot;getData)

これで、任意のデータを保管した拡張レコードが作成され、基本ディクショナリ オブジェクトに「つながり」ます。


<拡張レコードの取り出し>

付加した拡張ディクショナリの内容は、必要に応じて取り出す必要もあります。オブジェクトから拡張ディクショナリを取得するためには、基本ディクショナリ オブジェクトのオブジェクトIDを取得します。

      es = obj.db ("ディクショナリ取得", Null , dictId&amp;amp;quot; 

拡張レコード オブジェクトは、このディクショナリ オブジェクト「つながって」います。ディクショナリ オブジェクトから指定の拡張レコードを取得するには、拡張レコードを追加する際に指定しておいた「名前」を使用します。

      es = obj.cad ("ディクショナリ", dictId&amp;amp;quot;"名前から取得" , "Sample" , xrecId)

この拡張レコード オブジェクトから、付加情報が取得できます。拡張レコード内の付加情報を取得するためには、以下の命令を使用します。

      es = obj.cad ("拡張レコード", xrecId , "一連のリザルトバッファ取得", Null ,getData)

これで、付加した拡張レコード内のデータを取得することができます。「拡張レコード」の取得や設定に関する「命令」の詳細は、以下を参照してください。

・AcDbXrecord(拡張レコード)オブジェクトの操作
 □ rbChain(または getRbChain) 日本語名:「一連のリザルトバッファ取得」
 □ setFromRbChain 日本語名:「一連のリザルトバッファ設定」

以下に図形の拡張レコードを利用したサンプルを紹介します。

-------------------------------------------------------------------------
'「拡張レコード」オブジェクトをディクショナリ上に作成

Sub Sample1()
   Dim setData ( 0 to 7 ) As Variant '(命令の実行に必要な「設定データ」用変数宣言)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim dictId As Variant   '(「ディクショナリ」用「オブジェクトID」を格納する変数宣言)
   Dim pt ( 0 to 2 ) As Double '(座標値)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   '「ディクショナリ」上の「拡張レコード」オブジェクトを検索
   es = obj.db ("ディクショナリ取得" , Null , dictId ) 
   '拡張レコード保存用データ作成
   pt ( 0 ) = 5.0: pt ( 1 ) = 5.0: pt ( 2 ) = 0.0 
   setData ( 0 ) = 60 : setData ( 1 ) = 123 ' ( 60 . 123 )「整数」保管
   setData ( 2 ) = 38 : setData ( 3 ) = 1.23 ' ( 38 . 1.23 )「実数」保管
   setData ( 4 ) = 1 : setData ( 5 ) = "文字保管" ' ( 1 . "文字保管"&amp;amp;quot;「文字列」保管
   setData ( 6 ) = 10 : setData ( 7 ) = pt ' ( 10 . ( 5.0 , 5.0 , 0.0 ) )「座標値」保管
   'ディクショナリ内に「拡張レコード」オブジェクト生成
   es = obj.make ("拡張レコード")"MY_XREC_TEST" , setData , dictId , getData ) 
End Sub

'上で作成した「拡張レコード」オブジェクトを取得

Sub Sample2()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim dictId As Variant   '(「ディクショナリ」用「オブジェクトID」を格納する変数宣言)
   Dim idArray As Variant   '(「オブジェクトID」のリストを格納する変数宣言)
   Dim setData As Variant '(命令の実行に必要な「設定データ」用変数宣言)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim chk As Boolean    '(チェックの結果を格納する変数宣言)
   Dim rbLen As Integer   '(拡張レコードの数を格納)
   Dim code As Integer   '(コードを格納)
   Dim data As Variant   '(データを格納)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   '「ディクショナリ」上の「拡張レコード」オブジェクトを検索
   es = obj.db ("ディクショナリ取得" , Null , dictId ) 
   chk = obj.typeCheck ("ディクショナリ", dictId ) '(命令が使用できるかクラス名をチェック)
   If chk Then '(命令が使用できる場合は次を実行)
       es = obj.cad ("ディクショナリ" , dictId ,"名前から取得" , "MY_XREC_TEST" , objId )
       If es Then   '(上記の命令が正しく動作した場合次を実行)
           chk = obj.typeCheck ("拡張レコード", objId ) '(「拡張レコード」かチェック)
           If chk Then '(命令が使用できる場合は次を実行)
               es = obj.cad ("拡張レコード" , objId ,"一連のリザルトバッファ取得" , Null , getData )
               If TypeName ( getData ) = "Variant()" Then '(「getData」がリストの場合次を実行)
                   rbLen = ( UBound ( getData ) - 1 ) / 2 '(データリストの数を取得)
                   For i = 0 To rbLen  '(データリストの数だけ次の実行を繰り返す)
                       code = getData ( i * 2 )
                       data = getData ( ( i * 2 ) + 1 )
                       '(実行結果をメッセージボックスに表示)
                       If 10 &amp;lt;= code And code &amp;lt;= 17 Then
                           MsgBox "(" & code & ". (" & data ( 0 ) & "," & data ( 1 ) & "," & data ( 2 ) & ") )", vbOkOnly ,"拡張レコードデータ"
                       Else
                           MsgBox "(" & code & "." & data & ")", vbOkOnly ,"拡張レコードデータ"
                       End If
                   Next
               End If
           Else
               MsgBox "オブジェクトは「拡張レコード」ではありません",vbOKOnly , "エラー表示"
           End If
       End If
   Else
       MsgBox "オブジェクトは「ディクショナリ」ではありません",vbOKOnly , "エラー表示"
   End If
End Sub

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



ディクショナリ:

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



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

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



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

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

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



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

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


<基本ディクショナリ オブジェクトの取得>

この例では、基本ディクショナリ オブジェクトに新しいディクショナリ オブジェクトを追加します。そのため、基本ディクショナリ オブジェクトのオブジェクトIDを取得する必要があります。「基本ディクショナリ オブジェクト」は、図面データベース オブジェクトから直接「つながって」いるため、図面データベース オブジェクトの「命令」を使用して取得します。

      es = obj.db ("ディクショナリ取得", Null , dictId&amp;amp;quot; 


<新しいディクショナリの追加>

この基本ディクショナリ オブジェクトのオブジェクトIDさえ保管しておけば、いつでも基本ディクショナリ オブジェクトに新しいディクショナリ オブジェクトを追加することができます。新しいディクショナリ オブジェクトを作成する際には、そのディクショナリ オブジェクトを管理するための「名前」と、そのディクショナリ オブジェクトを「つなげる」親(オーナー)オブジェクトを指定します。親(オーナー)オブジェクトを指定する場所には、上で取得した基本ディクショナリ オブジェクトのオブジェクトIDを指定します。

      es = obj.make ("ディクショナリ", "Sample_Table" , setData , dictId , dictId2)

これで、新しいディクショナリ オブジェクトが作成され、基本ディクショナリ オブジェクトに「つながり」ます。この新しく追加されたディクショナリ オブジェクトに、シンボルテーブルレコード オブジェクトのように、オブジェクトを追加します。ここでは、上の例と同じ「拡張レコード」を追加してみます。

      Dim setData ( 0 to 5 ) As Variant '(命令の実行に必要な「設定データ」用変数宣言)
      setData ( 0 ) = 60 : setData ( 1 ) = 123 ' ( 60 . 123 )「整数」保管
      setData ( 2 ) = 38 : setData ( 3 ) = 1.23 ' ( 38 . 1.23 )「実数」保管
      setData ( 4 ) = 1 : setData ( 5 ) = "文字保管" ' ( 1 . "文字保管"&amp;amp;quot;「文字列」保管
      es = obj.make ("拡張レコード", "Record1" , setData , dictId2 ,getData)

これで、階層化されたディクショナリ オブジェクトの中に、拡張レコードを付加することができました。


<階層化されたディクショナリから拡張レコードの取り出し>

階層化されたディクショナリ オブジェクトに付加されている拡張レコードを取り出すには、図面データベースの「つながり」をたどるように、ディクショナリ オブジェクト内の階層構造をたどる必要があります。最初は図面データベース オブジェクトより、基本ディクショナリ オブジェクトのオブジェクトIDを取得します。

      es = obj.db ("ディクショナリ取得", Null , dictId&amp;amp;quot; 

階層化されたディクショナリ オブジェクトの構造のため、さらにこの基本ディクショナリ オブジェクトに「つながる」ディクショナリ オブジェクトを検索します。ディクショナリ追加時に、「名前」を付けて管理できるようにしてあるので、この「名前」を指定して、「つながって」いるディクショナリ オブジェクトのオブジェクトIDを取得します。

      es = obj.cad ("ディクショナリ", dictId&amp;amp;quot;"名前から取得" , "Sample_Table" , dict2)

基本ディクショナリ オブジェクトに、さらにディクショナリ オブジェクトが「つながって」いるため、ここではディクショナリ オブジェクトが取得できます。実際の付加データを保存した拡張レコードを取得するには、さらにここで名前を指定して、拡張レコードオブジェクトのオブジェクトIDを取得します。

      es = obj.cad ("ディクショナリ",dict2,"名前から取得"&amp;amp;quot;"Record1", xrecId)

この拡張レコード オブジェクトから、付加情報が取得できます。拡張レコード内の付加情報を取得するためには、以下の命令を使用します。

      es = obj.cad ("拡張レコード", xrecId , "一連のリザルトバッファ取得", Null ,getData)

これで、付加した拡張レコード内のデータを取得することができます。以下に階層化されたディクショナリと拡張レコードを利用したサンプルを紹介します。

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

'「拡張レコード」オブジェクトを階層化したディクショナリ上に作成
Sub Sample1()
   Dim setData ( 0 to 7 ) As Variant '(命令の実行に必要な「設定データ」用変数宣言)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim dictId As Variant   '(「ディクショナリ」用「オブジェクトID」を格納する変数宣言)
   Dim dictId2 As Variant   '(「ディクショナリ」用「オブジェクトID」を格納する変数宣言)
   Dim pt ( 0 to 2 ) As Double '(座標値)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   '「ディクショナリ」上の「拡張レコード」オブジェクトを検索
   es = obj.db ("ディクショナリ取得" , Null , dictId ) 
   'ディクショナリを作成し階層化
   es = obj.make ("ディクショナリ")"Sample_Table" , Null , dictId , dictId2 ) 
   '拡張レコード保存用データ作成
   pt ( 0 ) = 5.0: pt ( 1 ) = 5.0: pt ( 2 ) = 0.0 
   setData ( 0 ) = 60 : setData ( 1 ) = 123 ' ( 60 . 123 )「整数」保管
   setData ( 2 ) = 38 : setData ( 3 ) = 1.23 ' ( 38 . 1.23 )「実数」保管
   setData ( 4 ) = 1 : setData ( 5 ) = "文字保管" ' ( 1 . "文字保管"&amp;amp;quot;「文字列」保管
   setData ( 6 ) = 10 : setData ( 7 ) = pt ' ( 10 . ( 5.0 , 5.0 , 0.0 ) )「座標値」保管
   'ディクショナリ内に「拡張レコード」オブジェクト生成
   es = obj.make ("拡張レコード")"Record1" , setData , dictId2 , getData ) 
End Sub

'上で作成した「拡張レコード」オブジェクトを取得

Sub Sample2()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim dictId As Variant   '(「ディクショナリ」用「オブジェクトID」を格納する変数宣言)
   Dim dictId2 As Variant   '(「ディクショナリ」用「オブジェクトID」を格納する変数宣言)
   Dim idArray As Variant   '(「オブジェクトID」のリストを格納する変数宣言)
   Dim setData As Variant '(命令の実行に必要な「設定データ」用変数宣言)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim chk As Boolean    '(チェックの結果を格納する変数宣言)
   Dim rbLen As Integer   '(拡張レコードの数を格納)
   Dim code As Integer   '(コードを格納)
   Dim data As Variant   '(データを格納)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   '「ディクショナリ」上の「拡張レコード」オブジェクトを検索
   es = obj.db ("ディクショナリ取得" , Null , dictId ) 
   chk = obj.typeCheck ("ディクショナリ", dictId ) '(命令が使用できるかクラス名をチェック)
   If chk Then '(命令が使用できる場合は次を実行)
       es = obj.cad ("ディクショナリ" , dictId ,"名前から取得" , "Sample_Table" , dictId2&amp;amp;quot;
       chk = obj.typeCheck ("ディクショナリ",dictId2) '(命令が使用できるかクラス名をチェック)
       If chk Then '(命令が使用できる場合は次を実行)
           es = obj.cad ("ディクショナリ")dictId2)"名前から取得" , "Record1" , objId )
           If es Then   '(上記の命令が正しく動作した場合次を実行)
               chk = obj.typeCheck ("拡張レコード", objId ) '(「拡張レコード」かチェック)
               If chk Then '(命令が使用できる場合は次を実行)
                   es = obj.cad ("拡張レコード" , objId ,"一連のリザルトバッファ取得" , Null , getData )
                   If TypeName ( getData ) = "Variant()" Then '(「getData」がリストの場合次を実行)
                       rbLen = ( UBound ( getData ) - 1 ) / 2 '(データリストの数を取得)
                       For i = 0 To rbLen  '(データリストの数だけ次の実行を繰り返す)
                           code = getData ( i * 2 )
                           data = getData ( ( i * 2 ) + 1 )
                           '(実行結果をメッセージボックスに表示)
                           If 10 &amp;lt;= code And code &amp;lt;= 17 Then
                               MsgBox "(" & code & ". (" & data ( 0 ) & "," & data ( 1 ) & "," & data ( 2 ) & ") )", vbOkOnly ,"拡張レコードデータ"
                           Else
                               MsgBox "(" & code & "." & data & ")", vbOkOnly ,"拡張レコードデータ"
                           End If
                       Next
                   End If
               Else
                   MsgBox "オブジェクトは「拡張レコード」ではありません",vbOKOnly , "エラー表示"
               End If
           End If
       Else
           MsgBox "オブジェクトは「ディクショナリ」ではありません",vbOKOnly , "エラー表示"
       End If
   Else
       MsgBox "オブジェクトは「ディクショナリ」ではありません",vbOKOnly , "エラー表示"
   End If
End Sub
-------------------------------------------------------------------------