AutoCAD LTを利用できる新発想システム開発ツール! 安全と信頼の完全自社開発製品! |
カスタマイズ専用データ
|
カスタマイズ専用データ |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
カスタマイズの際にしか使用しない特殊なデータについて説明します アプリケーションなどを設計すると、通常の図面データベース上の情報ではない特殊なデータや情報が必要になる場合があります。例えば、CADの製図機能には関係のない「重さ」や「材質」の情報や、図形同士の関連情報、図形の編集履歴や作業者の名前、作業日、またアプリケーション固有のコード番号や、特殊な付加情報など、設計するシステムにに応じていろいろなケースが考えられます。AutoCAD LTの標準機能である「属性」の機能や「グループ」の機能などで、実現できる場合もありますが、すべてを標準機能で実現することはできません。 AutoCADやAutoCAD LTでは、これらのカスタマイズ固有の情報の保管を実現するために、用途に応じていくつかの特殊なカスタマイズ用のオブジェクトやデータ構造を持っています。アプリケーションなどの設計の際にはこれらの機能を考慮し、設計することでより良いシステムが作成できます。ここでは、LT VB-COMで使用できるこのカスタマイズ専用のオブジェクトやデータ構造について説明します。 カスタマイズで利用できる特殊なオブジェクトやデータ構造には、以下の4つがあります。 ・拡張データ ・拡張ディクショナリ ・拡張レコード ・ディクショナリ それぞれの特徴と利用方法について説明します。 拡張データ: 拡張データは、図面データベース内のオブジェクトに対して、オブジェクトの構成データとは関係のない任意のデータを自由に付加できる機能です。例えば、通常の図形(オブジェクト)に特別な情報を付加したい場合には、通常この図形を「ブロック」化し、付加したい情報を「属性」として付ける必要があります。この場合もとの図形は登録「ブロック」内に保管され、図面上は「ブロック」図形になってしまいます。 しかし、この「拡張データ」を使用すると、図形などを「ブロック」にすることなく、図形オブジェクトに対して直接、任意のデータを任意の数だけ付加することができるのです。 この拡張データは、これを付加したプログラム(アプリケーション)によってのみ管理されます。AutoCADやAutoCAD LTの標準機能でこの拡張データを使用することはありません。しかも、この拡張データは通常のオブジェクトと一緒に図面ファイル(DWG)に保存されます。アプリケーションにとって任意のデータが図面ファイル(DWG)に保存されることは、とてもありがたいことです。任意のデータを簡単に図形に付加し、図面ファイルにも保管できるので、設計の方法に大きく影響します。従来図面ファイル(DWG)とは別に保存していた、アプリケーション固有のデータを図面ファイル(DWG)内に保存することができるのです。これにより、データの一元管理が可能となります。 また、図形などのオブジェクトを変化させることなく任意のデータを付加できるので、図形そのものに特別な意味を持たせることや、「重さ」や「材質」など図面情報とは関係のない付加情報を保管することが可能です。 <拡張データのデータ形式>
<「拡張データ」で使用できるコード一覧>
例)変数「getData」に「拡張データ」を取得した場合
<アプリケーションの登録>
es = obj.table ("アプリケーションテーブル","追加" , "アプリケーション名", recId)
<拡張データの追加>
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;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 &lt;= code And code &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 ------------------------------------------------------------------------- 拡張ディクショナリ: 拡張ディクショナリは、オブジェクトに任意の付加情報を簡単に追加できるようにするために用意されている概念です。拡張データの場合には、アプリケーション名などの登録が必要ですが、この拡張ディクショナリでは面倒な手続きなしに特定のオブジェクト専用の付加データ領域をユーザに提供してくれます。 このオブジェクト専用の付加データ領域はディクショナリ オブジェクトとして提供されます。オブジェクト専用の付加データ領域とは、そのオブジェクト用に用意されたディクショナリ オブジェクトのことなのです。そのため、このオブジェクト専用の付加データ領域にデータを保管したい場合、基本的には「拡張レコード」を自分で作成しこのディクショナリ オブジェクトに「つなげる」必要があります。拡張ディクショナリは「ディクショナリ」オブジェクトと「拡張レコード」オブジェクトを組み合わせて構成されます。そのため、ディクショナリ内には、図のように複数の「拡張レコード」オブジェクトを付加することも可能です。 <拡張ディクショナリのデータ形式>
&lt;「拡張レコード」で使用できるコード一覧&gt;
例)変数「setData」を利用して「拡張レコード」をセットする場合
<拡張ディクショナリの作成>
es = obj.cad ("全オブジェクト共通", objId ,"拡張ディクショナリ作成", Null , Null) <拡張ディクショナリの使用>
es = obj.cad ("全オブジェクト共通", objId ,"拡張ディクショナリ取得", Null , ownerId)
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;quot;「文字列」保管
es = obj.make ("拡張レコード", "Sample" , setData , ownerId&amp;quot;getData)
<拡張ディクショナリの取り出し>
es = obj.cad ("全オブジェクト共通", objId ,"拡張ディクショナリ取得", Null , ownerId)
es = obj.cad ("ディクショナリ", ownerId ,"名前から取得" , "Sample" , xrecId)
es = obj.cad ("拡張レコード", xrecId , "一連のリザルトバッファ取得", Null ,getData)
<拡張ディクショナリの開放>
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;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 &lt;= code And code &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付加情報領域として定義されています。そのため「拡張ディクショナリ」のディクショナリ オブジェクトは、「あるオブジェクト」の付加情報と同じ意味になります。これでは、「拡張データ」とあまり変わりない概念になってしまいます。 「拡張レコード」は、せっかくオブジェクトの形をしているので、もっと柔軟な使用方法が考えられるのです。そこで、ここでは「拡張ディクショナリ」を使用せずに、図面データベース内の「基本」ディクショナリ上に、任意の拡張レコードを保管する方法について説明します。この手法を利用すると、オブジェクトとも関係のない独自の付加情報を、さらに柔軟に保存することができるのです。例えば、図面全体に関連する情報(製作者や、製作時間の情報など)や図面の設定に関する情報(アプリケーション固有のシステム変数など)を保管する場所として使用できます。 拡張レコードを「基本ディクショナリ」オブジェクトに、任意に追加する場合以下のような構造が考えられます。 ここでは簡単な、「基本ディクショナリ オブジェクト」に直接拡張レコードを追加する例を紹介します。 ディクショナリの詳細は「ディクショナリの基本構造」を参照してください。 <拡張レコードのデータ形式>
&lt;「拡張レコード」で使用できるコード一覧&gt;
例)変数「setData」を利用して「拡張レコード」をセットする場合
<基本ディクショナリ オブジェクトの取得>
es = obj.db ("ディクショナリ取得", Null , dictId&amp;quot; <拡張レコードの使用>
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;quot;「文字列」保管
es = obj.make ("拡張レコード", "Sample" , setData , dictId&amp;quot;getData)
<拡張レコードの取り出し>
es = obj.db ("ディクショナリ取得", Null , dictId&amp;quot;
es = obj.cad ("ディクショナリ", dictId&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;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 &lt;= code And code &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)」を保存します。「拡張レコード」の中には任意のデータを任意の数だけ保管することが可能です。 しかも、このディクショナリ オブジェクトは、ディクショナリ オブジェクト自体を自分で新しく作成することも可能です。この特性を利用すると図のように、シンボルテーブルのような階層構造を自分で設計することも可能です。ディクショナリ オブジェクトを利用すれば、どんな深い階層構造も実現することができるのです。 ここではディクショナリを階層化し、シンボルテーブルのように使用する例を紹介します。この構造は、ディクショナリ オブジェクトに、ディクショナリ オブジェクトを「つなげる」だけで簡単に実現することができます。 <基本ディクショナリ オブジェクトの取得>
es = obj.db ("ディクショナリ取得", Null , dictId&amp;quot; <新しいディクショナリの追加>
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;quot;「文字列」保管 es = obj.make ("拡張レコード", "Record1" , setData , dictId2 ,getData)
<階層化されたディクショナリから拡張レコードの取り出し>
es = obj.db ("ディクショナリ取得", Null , dictId&amp;quot;
es = obj.cad ("ディクショナリ", dictId&amp;quot;"名前から取得" , "Sample_Table" , dict2)
es = obj.cad ("ディクショナリ",dict2,"名前から取得"&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;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;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 &lt;= code And code &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 ------------------------------------------------------------------------- |