Polymorphism














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

オブジェクトの基本操作
LT VB-COM HELP Samples


ホーム > 製品 > LT VB-COM > 充実のヘルプ > LT VB-COMの基本 > オブジェクトの基本操作

オブジェクトの操作


各種オブジェクトの操作方法について説明します

LT VB-COMでは、AutoCAD LTのコマンドを使用せずに図面データベース内部のオブジェクトを直接操作することができます。

AutoCAD LTの図面データベース内には、以下の図のように、「図面データベース オブジェクト」、「シンボルテーブル オブジェクト」、「シンボルテーブルレコード オブジェクト」、「図形オブジェクト」などの種類が存在します。

LT VB-COMではこれらのオブジェクトをすべて操作することが可能です。これらのオブジェクトを操作するためには、操作用の関数が用意されています。そのもっとも基本となる関数が以下の「cad」関数です。

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

es=obj.cad("オブジェクト名",オブジェクトID ,"命令",設定データ,取得データ)

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

(詳細は「cad(オブジェクト基本操作)」を参照してください)

オブジェクトIDを持つ図面データベース内のすべてのオブジェクトは、この「cad」関数で操作が可能です。(図面データベース内で、この「cad」関数が使用できないのは、「図面データベース オブジェクト」だけです。)

また、オブジェクト操作によっては引数の「オブジェクトID」や「オブジェクト名」などが不要な操作もあります。そのため、各オブジェクトの操作に適したより便利な関数を提供しています。以下にオブジェクトの種類ごとに使用できる関数を紹介します。

オブジェクト: 図面データベース オブジェクト
関数: db("命令")設定データ ,取得データ

 

db」関数は図面データベース オブジェクトを操作する専用の関数です。図面データベース オブジェクトには「cad」関数が使用できないので、この「db」関数を使用しなければなりません。

 


オブジェクト: シンボルテーブル オブジェクト
関数: table("オブジェクト名", "命令",設定データ,取得データ )cad("オブジェクト名",オブジェクトID, "命令",設定データ,取得データ

 

table」関数はシンボルテーブル オブジェクトを操作する専用の関数です。シンボルテーブル オブジェクトは、AutoCAD LTのシステムによって作成される図面データベース固有のオブジェクトです。つまり、各シンボルテーブル オブジェクトは図面データベース内において、必ず1つしか存在しません。そのため、これらのシンボルテーブル オブジェクトを指定する際、その名前を指定すれば、オブジェクトIDを指定する必要がありません。

 


オブジェクト: シンボルテーブルレコード オブジェクト
関数: cad("オブジェクト名",オブジェクトID, "命令",設定データ,取得データ

 

シンボルテーブルレコード オブジェクトは、図形オブジェクトと同様に、ユーザによって任意に作成されます。そのため、オブジェクトIDを使用してオブジェクトを識別する必要があるので、通常のオブジェクト操作関数「cad」関数を使用します。

 


オブジェクト: 図形オブジェクト
関数: cad("オブジェクト名",オブジェクトID, "命令",設定データ,取得データ

 

図形オブジェクトは、ユーザによって任意に作成されるオブジェクトです。そのため、オブジェクトIDを使用してオブジェクトを識別する必要があるので、通常のオブジェクト操作関数「cad」関数を使用します。

 

図面データベース オブジェクトの操作:

図面データベース オブジェクトは、図面データベース全体を管理している、図面データベース内に1つしか存在しない特別なオブジェクトです。そのため操作は通常のオブジェクト操作で使用する「cad」関数を使用するのではなく、図面データベース オブジェクトを操作する専用の「db」関数を使用します。

図面データベース オブジェクトを操作したい場合には、この「db」関数を利用することで、何の準備もなく図面データベース オブジェクトを直接操作することができます。

例)図面データベース中のオブジェクトの数を取得

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

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim getData As Variant   '(取得したデータを格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   '図面データベース中のオブジェクトの数を取得
   es = obj.db ( "オブジェクト数取得" , Null , getData)
   MsgBox getData & "個" , vbOKOnly , "オブジェクトの数"
End Sub

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

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

シンボルテーブル関連の操作は、シンボルテーブル オブジェクトとその要素であるシンボルテーブルレコードオブジェクトの操作になります。多くの場合、各シンボルテーブルレコード オブジェクトの操作をするために、シンボルテーブル オブジェクトを利用します。

シンボルテーブルには、図の画層を含め以下のような種類があります。

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

各シンボルテーブルには、それぞれその要素となるシンボルテーブルレコード オブジェクトが存在しています。シンボルテーブルレコード オブジェクトの種類はシンボルテーブル オブジェクトの種類とまったく同じです。

AcDbViewportTableRecord(ビューポートテーブルレコード)
AcDbViewTableRecord(ビューテーブルレコード)
AcDbBlockTableRecord(ブロックテーブルレコード)
AcDbDimStyleTableRecord(寸法スタイルテーブルレコード)
AcDbLayerTablev(画層テーブルレコード)
AcDbLinetypeTableRecord(線種テーブルレコード)
AcDbRegAppTableRecord(アプリケーションテーブルレコード)
AcDbTextStyleTableRecord(文字スタイルテーブルレコード)
AcDbUCSTableRecord(UCSテーブルレコード)

図面データベースの情報を抽出する場合には、このシンボルテーブルレコード オブジェクトから、各シンボルテーブルレコードの情報を抽出します。

シンボルテーブルレコード オブジェクトの検索には図面データベースを検索し、シンボルテーブル オブジェクトから検索する方法と、図形の特性として保管されている情報(例えば、「画層」や「線種」など)からシンボルテーブルレコード オブジェクトを検索する方法があります。以下にそれぞれの方法について説明します。

テーブルからレコード検索:

検索したいシンボルテーブル オブジェクトから直接操作を開始する手法です。LT VB-COMには指定のシンボルテーブル オブジェクトを直接操作するための「table」関数が用意されているので、これを利用します。例えば、「画層0」(名前が「"0"」の画層テーブルレコード オブジェクト)を検索したい場合には、以下のように画層テーブル オブジェクトに命令を使用します。

このように、「table」関数を利用することで、1行で目的のシンボルテーブルレコード オブジェクトを見つけることができます。以下に見つけた「画層0」の「色」を「赤(色番号=1)」に変更するプログラムを紹介します。

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

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

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

図形からレコード検索:

シンボルテーブルレコードの情報は、基本的に各図形に影響を与えています。例えば、「画層」や「線種」は図形の属する画層の情報や図形を構成する線種に反映されますし、「文字スタイル」は文字図形の文字の種類や大きさなどに反映されます。そのため各図形オブジェクトには、さまざまな特性の情報としてシンボルテーブルレコード オブジェクトが関連しています。例えば、図形オブジェクトが属する「画層」の情報は、図形オブジェクト内に画層テーブルレコード オブジェクトの情報(オブジェクトID)として保管されています。

この特性を生かし、図形オブジェクトから各種シンボルテーブルレコードの情報を取得することが可能です。図形オブジェクト内の取得したいシンボルテーブルレコード情報(オブジェクトID)を取得し、直接シンボルテーブルレコード オブジェクトを特定し、操作することが可能です。

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

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

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

図形オブジェクトの操作:

図形オブジェクトの操作は主にモデル空間上にて行なわれます。モデル空間上の図形オブジェクトは、「モデル空間("*Model_Space")」という名前のブロックテーブルレコード オブジェクトに「つながって」いる図形オブジェクトです。そのため、図面データベース内の操作として、この図形オブジェクトを操作する場合は、ブロックテーブルレコード オブジェクトから図形オブジェクトを検索する手法になりますが、LT VB-COMではユーティリティを使用することでAutoCAD LTの作図画面上の図形の図形オブジェクトを直接指定することも可能です。そこでここでは、図形オブジェクトを操作するための基本として、図面データベース内のブロックテーブルレコード オブジェクトから図形オブジェクトを取得する方法と、AutoCAD LTの作図画面上からユーティリティによって、直接図形オブジェクトを取得する方法について説明します。

ブロックテーブルレコードから図形を検索:

図面データベース内で、図形オブジェクトを検索する場合、基本的にはブロックテーブルレコード オブジェクトに「つながる」図形オブジェクトを検索することになります。そのためには、シンボルテーブル関連の基本操作と同様に、シンボルテーブル オブジェクトから、シンボル テーブルレコード オブジェクトを検索するところから開始します。例えば、「モデル空間」上の図形オブジェクトをプログラムで操作したい場合、「モデル空間」を表すブロックテーブルレコード オブジェクトを見つけ出す必要があります。「モデル空間」を表すブロックテーブルレコード オブジェクトは、「"*Model_Space"」という名前のブロックテーブルレコード オブジェクトになります。指定のブロックテーブルレコード オブジェクトを取得するためには、ブロックテーブル オブジェクトを直接操作することができる「table」関数を利用します。

「"*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

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

作図画面上から図形を指定:

LT VB-COMでは、図形オブジェクトの操作をより便利にするために、AutoCAD LTの作図画面上における図形から、図形オブジェクトを特定するための様々なユーティリティを用意しています。LT VB-COMは、基本的に図面データベース内のオブジェクトを操作するためのツールのため、その標準機能ではAutoCAD LTの作図画面上における図形の操作はできません。しかし、アプリケーションを作成する上で、この作図画面上での図形の操作はどうしても必要な機能です。そのために、ユーティリティとしてその機能を用意しています。図面データベースからではなく、作図画面上における図形の状態から、その図形の実際のデータである図面データベース内の図形オブジェクトの情報を直接取得できます。

ユーティリティを使用するためには、「util」関数を使用します。このユーティリティ中で、もっとも簡単に作図画面上から図形を特定する方法として、「最後の図形(acdbEntLast)」という命令があります。この命令は、文字通り作図画面上で最後に描画された図形のオブジェクトIDを取得します。こうすることで、作図画面上の図形の状態から、直接図面データベース内のオブジェクトIDを取得できます。このユーティリティを使用すれば、図面データベース内を検索する必要が不要となります。以下に、作図画面上に最後に描画された図形の「色」を「赤(色番号)」にするプログラムを紹介します。

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

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   '(最後に作図した図形のオブジェクトIDを取得)
   es = obj.util)"最後の図形" ,Null , objId) 
   es = obj.cad ("全図形共通" , objId ,"色番号設定" , 1 ,Null )
   '実行が成功すると図形の色が変化します
End Sub

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

また、「util」関数の他に、LT VB-COMの機能とVB(Visual Basic)の標準関数を組み合わせて作成したサンプルユーティリティとして、AutoCAD LTの作図画面上から任意の図形を選択できるようにした機能も用意しています。このサンプルユーティリティにつきましては「参考ユーザインターフェースツール」を参照してください。





オブジェクトの作成


各種オブジェクトを生成する方法について説明します

LT VB-COMでは、AutoCAD LTのコマンドを使用せずに図面データベース内部に直接オブジェクトを生成することができます。LT VB-COMで作成できるオブジェクトは、図面データベース内でも「シンボルテーブルレコード オブジェクト」と「図形オブジェクト」になります。

LT VB-COMの機能でオブジェクトを生成する場合、オブジェクトを生成するための専用の関数を使用します。そのもっとも基本となる関数が以下の「make」関数です。

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

es=obj.make("オブジェクト名", "名前")設定データ,親データ,オブジェクトID )

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

(詳細は「make(各種オブジェクト作成)」を参照してください)

図面データベース内の図形オブジェクトとシンボルテーブルレコード オブジェクトは、基本的にこの「make」関数で直接図面データベース内に作成することが可能です。図面データベース オブジェクトや各シンボルテーブル オブジェクトは、AutoCAD LTのシステムによって用意される図面データベース内に1つしか存在しないオブジェクトです。そのため、ユーザがそれらのオブジェクトを生成することはできません。

また、作成するオブジェクト種類によっては、引数の「名前」や「設定データ」などが不要な操作もあります。そのため、様々なオブジェクトを作成するのに適したより便利な関数を提供しています。以下にオブジェクトの種類ごとに使用できる関数を紹介します。

オブジェクト: シンボルテーブルレコード オブジェクト
関数: makeRec("オブジェクト名", "名前",オブジェクトID)make("オブジェクト名", "名前",設定データ,親データ,オブジェクトID

 

makeRec」関数はシンボルテーブルレコード オブジェクトを作成する専用の関数です。この関数はより簡単にシンボルテーブルレコード オブジェクトを作成できるように、シンボルテーブルレコードの「オブジェクト名」とそのレコードに付けられる任意の「名前」を指定するだけでオブジェクトが作成できるようになっています。この関数によって図面データベース内に作成されるシンボルテーブルレコード オブジェクトは、基本的にすべての情報が規定値で作成されます。シンボルテーブルレコード オブジェクトの内部情報を設定したい場合には「cad」関数を使用し、オブジェクトの操作という形でデータを設定します。

 


オブジェクト: 図形オブジェクト
関数: makeEnt("オブジェクト名",設定データ,オブジェクトID)make("オブジェクト名", Null,設定データ,親データ,オブジェクトID

 

makeEnt」関数は図形オブジェクトを作成する専用の関数です。この関数はより簡単に図形オブジェクトを作成できるように、図形の作成には不要な「名前」を指定することなく図形の「オブジェクト名」とそのオブジェクトに設定する初期化のデータを設定することで図形オブジェクトが作成できるようになっています。この関数では、「親データ」も指定しませんが、この関数を使用すると現在の作業空間に自動的に作成されます。また、初期値が決まっていない場合は、「設定データ」を「Null(空)」にすることで、各図形の既定の初期値を利用して作成することができます。また、「make」関数を使用する場合、図形オブジェクトには名前を付ける必要がないため、引数「"名前"」の部分に「Null」を指定してお使いください。

 






シンボルテーブルレコード オブジェクトの作成


AutoCAD LTにおいてユーザが作成できるシンボルテーブル関連のオブジェクトは、シンボルテーブルレコード オブジェクトだけです。AutoCAD LTの操作で、画層や文字スタイル、線種や寸法スタイルなどを設定する作業と同じ作業を図面データベース内で直接実行できます。これらの作業は、いずれもシンボルテーブル オブジェクトに、新しい要素=シンボルテーブルレコード オブジェクトが追加されることになります。例えば、新しい「画層」に「"画層1"」と名前を付けて作成する場合、図面データベース内は以下の図のように、画層テーブル オブジェクトに画層テーブルレコード オブジェクトが新しく作成され、画層テーブル オブジェクトに「つなげられ」ます。

この一連の作業を実行するのが、「make」や「makeRec」関数になります。

ユーザが作成できるシンボルテーブルレコード オブジェクトには以下のものがあります。

AcDbViewportTableRecord(ビューポートテーブルレコード)

AcDbViewTableRecord(ビューテーブルレコード)

AcDbBlockTableRecord(ブロックテーブルレコード)

AcDbDimStyleTableRecord(寸法スタイルテーブルレコード)
AcDbLayerTablev(画層テーブルレコード)
AcDbLinetypeTableRecord(線種テーブルレコード)
AcDbRegAppTableRecord(アプリケーションテーブルレコード)
AcDbTextStyleTableRecord(文字スタイルテーブルレコード)
AcDbUCSTableRecord(UCSテーブルレコード)

これらのシンボルテーブルレコード オブジェクトは、上で説明している「make」や「makeRec」関数で作成できることはもちろんですが、それ以外にもシンボルテーブル オブジェクトへの「命令」として、新しいシンボルテーブルレコード オブジェクトを追加、作成させる機能もあります。設計の流れやプログラムの状況に応じて、便利な方を使用してください。以下にそれぞれの方法について説明します。

「make」や「makeRec」関数による作成:

作成したいシンボルテーブルレコード オブジェクトを直接図面データベース内に作成するための関数「make」や「makeRec」を使用する方法です。この手法を利用すると、図面データベース内を検索することなく、必要なシンボルテーブルレコード オブジェクトがすぐに作成できます。「make」や「makeRec」関数を利用してシンボルテーブルレコード オブジェクトを作成する場合、基本的には「既定」(初期値にデフォルトの値がセットされている)のシンボルテーブルレコード オブジェクトを作成することになります。規定値以外のデータを設定したい場合には、一度シンボルテーブルレコード オブジェクトを作成した後に、通常のオブジェクト操作という形で必要な情報を設定します。例えば、画層に新しく「"画層1"」という名前の画層を作成し、その画層の「色」を「赤(色番号=1)」に設定したいには、「makeRec」関数を使用した後に通常のオブジェクト操作関数「cad」関数を使用します。

シンボルテーブルレコード オブジェクトを作成する「make」や「makeRec」関数は、どちらも同じ機能です。引数(使用するパラメータ)の数が少なく、記述の簡単な「makeRec」関数を利用すると便利です。上記の内容をプログラムにすると、以下のようになります。

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

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

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

シンボルテーブルの「命令」よる作成:

プログラムの設計上すでにシンボルテーブル オブジェクトが見つかっている場合に使用できます。オブジェクトを作成する関数ではなく、シンボルテーブル オブジェクトを操作する「命令」のひとつとして、シンボルテーブルレコード オブジェクトを作成する「命令」があります。この「命令」が「追加(add)」です。シンボルテーブル オブジェクトに対して、この「追加(add)」を使用し、名前を指定すると、そのシンボルテーブル オブジェクトに「つなぐ」ことが可能な同じ種類のシンボルテーブルレコード オブジェクトを、指定した名前で図面データベースに作成、追加してくれます。このとき作成されるシンボルテーブルレコード オブジェクトは、「make」や「makeRec」関数でシンボルテーブルレコード オブジェクトを作成するときと同様に「既定」(初期値にデフォルトの値がセットされている)の状態で作成されることになります。シンボルテーブル オブジェクトに「命令」を発行するためには「table」関数を利用すると便利です。上の例と同様に、画層に新しく「"画層1"」という名前の画層を作成し、その画層の「色」を「赤(色番号=1)」に設定する例をもとに説明します。

この内容をプログラムにすると、以下のようになります。

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

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 ( "画層テーブル" , "追加" , "画層1" , recId)
   If es Then
       '「画層テーブルレコード」の「色」を変更
       es = obj.cad ( "画層テーブルレコード" , recId , "色設定" , 1 , Null)
   End If
End Sub

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






図形オブジェクトの作成


LT VB-COMではAutoCAD LTのコマンドを使用せずに、図面データベース内に直接図形オブジェクトを作成することができます。図面データベースの構造上、図形オブジェクトは基本的にブロックテーブルレコードに「つながる」ことになります。「make」や「makeEnt」関数によって、図面データベースに図形オブジェクトが追加される際も、必ずブロックテーブルレコード オブジェクトに新しい図形オブジェクトが「つなげられ」ます。

しかし、図形オブジェクトの追加は、シンボルテーブルレコード オブジェクトの追加と異なり、追加する図形オブジェクトを「つなげる」先を指定する必要があります。それは、図面データベース内で図形オブジェクトを「つなげる」ことができるのが、ブロックテーブルレコード オブジェクトだからです。ブロックテーブルレコード オブジェクトは、要素(レコード)のため、ユーザが任意に作成できるものです。つまり、図面データベースのブロックテーブル上には、複数のブロックテーブルレコード オブジェクトが存在しているのです。

ブロックテーブルレコード オブジェクトは、AutoCAD LTの「ブロック登録」機能により、ブロック登録を実行すると登録されたブロックの情報が、ブロックテーブルレコード オブジェクトとして作成されます。そのブロックの構成要素である図形が、図形オブジェクトとして、ブロックテーブルレコード オブジェクトに「つながる」のです。(「図形の基本構造」を参照してください。)そのため、図面データベースに図形オブジェクトを追加したい場合には、どのブロックテーブルレコード オブジェクトに「つなげる」のかを明確にしておく必要があるのです。

make」関数を使用して図形オブジェクトを作成する際には、どのブロックテーブルレコード オブジェクトに「つなげる」のかを、基本的には指定しないといけません。この指定が、「make」関数内の引数「親データ」の部分になります。

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

es=obj.make("図形名", Null ,設定データ,親データ,オブジェクトID )

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

この「親データ」の部分には、「つなげる」ブロックテーブルレコード オブジェクトの「オブジェクトID」か「名前」を指定することができます。プログラムの中で取得しやすい方か、すでに取得されているデータを使用すれば良いでしょう。

また、「make」関数を使用する際に必要な2番目の引数である「"名前"」は、図形オブジェクトには不要のため使用しません。そのため「Null」を設定して使用します。

例えば、「登録ブロック」(ブロックテーブルレコード オブジェクト)に「"ABC"」という名前のブロックが存在すると仮定します。このとき、この「"ABC"」という「登録ブロック」の構成要素である図形として、新しく「円」の図形オブジェクトを追加することを考えてみます。図形オブジェクトの作成には「make」関数を使用しますが、このとき「親データ」の部分に指定する、ブロックテーブルレコード オブジェクトの情報として、「オブジェクトID」か「名前」が必要です。ここでは、「名前」がわかっていることを前提としているので「名前」で指定することにします。

新しく追加する図形を「円」としているので、その「設定データ」(「円」の場合、「中心」と「半径」)を初期値として設定することも可能です。これらの作業をプログラムにすると、以下のように記述できます。

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

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim setData ( 0 To 1 ) As Variant   '(「設定データ」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim cen ( 0 To 2 ) As Double   '(中心座標値を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   '「円」の設定データ作成
   cen ( 0 ) = 5.0 :  cen ( 1 ) = 5.0 :  cen ( 2 ) = 0.0
   setData ( 0 ) = cen '中心
   setData ( 1 ) = 1.5 '半径
   '名前が「"ABC"」の「ブロックテーブルレコード」に「円」を追加
   es = obj.make ( "円" , Null , setData , "ABC" , objId)
End Sub

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

この例では、「登録ブロック」「"ABC"」が存在することを仮定にして説明してきました。図面データベースの構造上、まったく同じプログラムを利用して、「モデル空間」に「円」を作成するプログラムに変更することが簡単にできます。それは、「モデル空間」がブロックテーブルレコード オブジェクトの1つだからです。

図のように作成する図形オブジェクトを「つなげる」先(「親データ」の部分)を、ブロックテーブルレコード「"ABC"」から、「モデル空間」を表す「"*Model_Space"」に変更するだけで、上のプログラムは「モデル空間」に図形を追加するプログラムに変更されます。

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

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim setData ( 0 To 1 ) As Variant   '(「設定データ」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim cen ( 0 To 2 ) As Double   '(中心座標値を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   '「円」の設定データ作成
   cen ( 0 ) = 5.0 :  cen ( 1 ) = 5.0 :  cen ( 2 ) = 0.0
   setData ( 0 ) = cen '中心
   setData ( 1 ) = 1.5 '半径
   '名前が「"ABC"」の「ブロックテーブルレコード」に「円」を追加
   es = obj.make ( "円" , Null , setData , "*Model_Space" , objId)
End Sub

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

AutoCAD LTの図形の操作においては、恐らくこの「モデル空間」上での作業が一番多くなるでしょう。そのため、この使用頻度の高い「モデル空間」への図形オブジェクトをより簡単に実行するために用意したのが、「makeEnt」関数です。

makeEnt」関数は、作成する図形オブジェクトを「つなげる」先(「親データ」の部分)を指定しなくても、自動的に現在の作業空間を識別し、その作業空間に相等するブロックテーブルレコード オブジェクトを指定するようになっています。現在の作業空間が「モデル空間」であれば、「モデル空間」用のブロックテーブルレコード オブジェクトに、「ペーパー空間」であれば、「ペーパー空間」用のブロックテーブルレコード オブジェクトに図形オブジェクトを追加します。

そのため、「makeEnt」関数の指定には、「親データ」の指定部分も、「"名前"」を指定する部分もありません。

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

es=obj.makeEnt("図形名",設定データ,オブジェクトID )

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

上のプログラムを、「makeEnt」関数を使用した方法に書き直してみます。

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

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim setData ( 0 To 1 ) As Variant   '(「設定データ」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim cen ( 0 To 2 ) As Double   '(中心座標値を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   '「円」の設定データ作成
   cen ( 0 ) = 5.0 :  cen ( 1 ) = 5.0 :  cen ( 2 ) = 0.0
   setData ( 0 ) = cen '中心
   setData ( 1 ) = 1.5 '半径
   '名前が「"ABC"」の「ブロックテーブルレコード」に「円」を追加
   es = obj.makeEnt ( "円" , Null , setData , objId)
End Sub

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





「共通」機能の使用


  オブジェクトに共通で使用できる機能の利用方法を説明します

LT VB-COMでオブジェクトを操作する場合、各オブジェクトに固有の機能と、いくつかのオブジェクトに共通の機能があります。AutoCAD LTの図面データベース内のオブジェクトは機能別に分類されているため、同じ種類のオブジェクトに関しては、その種類で共通の機能が使えるのです。このことは、このヘルプの記述からもわかるようになっています。例えば、「円」オブジェクトを操作したい場合にこのヘルプを見ると、以下のように機能(命令)が紹介されています。

AcDbObject(全オブジェクト共通)
 
AcDbEntity(全図形共通)
  
AcDbCurve(線形図形共通)
   AcDbCircle(円)
AutoCADおよびLTの「CIRCLE(円)」コマンドによって作成された「円」図形オブジェクトを操作するための命令群です。

AcDbCircle(円)図形オブジェクトの作成
・AcDbCircle(円)図形オブジェクトの操作

 □ center(または getCenter) 日本語名:「中心取得」
 □ setCenter 日本語名:「中心設定」
 □ radius(または getRadius) 日本語名:「半径取得」
 □ setRadius 日本語名:「半径設定」
 □ normal(または getNormal) 日本語名:「法線取得」
 □ setNormal 日本語名:「法線設定」
 □ thickness(または getThickness) 日本語名:「厚さ取得」
 □ setThickness 日本語名:「厚さ設定」


この部分には、もちろん「円」オブジェクトを操作するための機能(命令)が記述されまています。しかし、その命令の数は8つしかありません。これでは「円」オブジェクトを操作するのに十分とは言えません。「円」の「中心」や「半径」に関する命令はありますが、例えば「色」に関する内容や「画層」や「線種」に関する内容などは、見当たりません。しかし、実際には「円」オブジェクトの「色」を変更したり、「線種」を変更することは可能です。

これは「色」に関する内容や「画層」や「線種」に関する内容が、「円」固有の機能(命令)ではないからです。上の「円」オブジェクトのヘルプに表示されている内容は、「円」オブジェクトにだけ利用が可能な命令だけが、表示されているのです。そのため、「円」オブジェクト固有の機能(命令)でないものは、ここに表示されていません。ここで注目すべき場所は、ヘルプの上の方に表示される以下の部分です。

AcDbObject(全オブジェクト共通)
 
AcDbEntity(全図形共通)
  
AcDbCurve(線形図形共通)
   AcDbCircle(円)

この部分は、別のヘルプの内容にジャンプするようになっています。この部分の日本語名を見ると、「全オブジェクト共通」や、「全図形共通」、「線形図形共通」と、最後に「共通」がついているものばかりです。実は、ここが「共通」で使用できる機能(命令)になります。

この「共通」の機能(命令)は、もちろん「円」オブジェクトにも使用できる機能(命令)です。つまり、実際に「円」オブジェクトで操作できる機能(命令)の種類は、以下のように「円」固有の機能に各「共通」の機能を加えた数になります。

 AcDbCircle + AcDbCurve + AcDbEntity + AcDbObject

各「共通」機能の中には、多くの機能(命令)が含まれているので、これらを含めると「円」オブジェクトを操作できる機能(命令)には、非常に多くの機能(命令)があると言えるでしょう。

このとき各「共通」の機能が、どのようなオブジェクトに対して共通に使用できるかにつきましては、すべてのオブジェクトのツリー構造を見ていただくとわかります。このツリー構造の中で各「共通」の機能は、その下につながっているオブジェクトの種類に対して有効になります。例えば、「AcDbCurve(線形図形共通)」に含まれる機能(命令)は、その下につながっている各図形オブジェクトの種類に対して、すべて共通で使用できる機能(命令)になります。

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

           |
           |- AcDbCurve(線形図形共通)
           |     |- AcDb2dPolyline(2Dポリライン)
           |     |- AcDb3dPolyline(3Dポリライン)
           |     |- AcDbArc(円弧)
           |     |- AcDbCircle(円)
           |     |- AcDbEllipse(楕円)
           |     |- AcDbLeader(引出線)
           |     |- AcDbLine(線分)
           |     |- AcDbPolyline(ポリライン)
           |     |- AcDbRay(放射線)
           |     |- AcDbSpline(スプライン)
           |     |- AcDbXline(構築線)
           |

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

このことから、この「共通」の機能(命令)は以下のように分類することができます。

AcDbObject(全オブジェクト共通)
図面データベース内のすべてのオブジェクトに共通で使用できる機能(命令)を含んでいます。

AcDbEntity(全図形共通)
すべての図形に共通で使用できる機能(命令)を含んでいます。

AcDbCurve(線形図形共通)
線で構成されるすべての図形に共通で使用できる機能(命令)を含んでいます。

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

「共通」機能による「曖昧」なオブジェクト操作:

各オブジェクトの操作には、「共通」機能(命令)も利用できることは上で説明した通りです。

ここでは、この「共通」機能を利用した設計の方法について説明します。

例えば、AutoCAD LTの作図画面上の最後に描画された図形の「色」を「赤(色番号=1)」に変更するプログラムを考えてみます。

この場合、AutoCAD LTの作図画面の最後に描画された図形オブジェクトを取得するために、ユーティリティを使用することはわかります。

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

   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   es = obj.util ("最後の図形" ,Null , objId) '(最後に作図した図形のオブジェクトIDを取得)

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

しかし、このとき「オブジェクトID」として取得できる図形オブジェクトが、何の図形オブジェクトなのかはまったくわかりません。それは、直前の作業によって描画される図形が異なるからです。

ここで、この例題の内容を確認します。この例題では、「最後に描画した図形に色を設定する」というものです。つまり、この例題の設計においても「図形」の特定はされていません。例題の内容を言い換えると、「最後に描画した図形は何の図形であれ色を設定する」と考えることができるのです。このことから、この例題の中で操作の対象となる図形オブジェクトの種類が特定されないまま、作業(この例題では「色」を設定する作業)をしなければならないことがわかります。

このように、操作の対象となるオブジェクトが特定されない作業を実行しなければならない場合、「共通」の機能が有効になります。この例においてわかっていることは、取得できるオブジェクトが「図形オブジェクト」であることだけです。つまり、取得できる図形オブジェクトの種類が何であれ、最低限「図形オブジェクトに『共通』の機能(命令)」は、使用できるはずなのです。

このような場合には、「図形オブジェクトに『共通』の機能(命令)」を使用すれば、オブジェクトの種類を特定することなく命令を実行することができるのです。「図形オブジェクトに『共通』の機能(命令)」とはつまり、「AcDbEntity(全図形共通)」に記述されている機能(命令)のことなのです。

例題では、図形の「色」を設定することにしています。この図形に「色」を設定する機能(命令)は、「図形オブジェクトに『共通』の機能(命令)」である「AcDbEntity(全図形共通)」の中に記述されています。この機能は、「色番号設定(setColorIndex)」です。この命令を使用して、図形オブジェクトを特定しないままの設計にする場合、プログラムは以下のようになります。

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

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   es = obj.util ("最後の図形" ,Null , objId) '(最後に作図した図形のオブジェクトIDを取得)
   es = obj.cad ("全図形共通", objId ,"色番号設定" , 1 ,Null )
   '実行が成功すると図形の色が変化します
End Sub

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

このようにLT VB-COMでは、操作するオブジェクトを特定せずに、その最低限のオブジェクトの種類を含む「共通」の機能を利用することができるのです。ただしこの場合、「共通」の機能に含まれる命令を使用することが、前提となります。





オブジェクトの識別


各種オブジェクトを識別する方法について説明します

LT VB-COMによるプログラム設計において、様々な形でオブジェクトを取得することになります。多くの場合取得したオブジェクトに対して命令を使用することになります。いくつかのオブジェクトに「共通」の命令を使用している場合は、問題ありませんが、特定のオブジェクト固有の命令を使用したい場合には、オブジェクトを識別する必要があります。

オブジェクトの識別には、以下の機能を使用します。

 obj.typeCheck("オブジェクト名",チェックしたいオブジェクトID

 (詳細は、「typeCheck(オブジェクトの種類識別)」を参照してください。)

指定するオブジェクトIDのオブジェクトが、指定する「オブジェクト名」と一致する場合に「1(真)」、一致しない場合に「0(偽)」を返します。

  例)取得したオブジェクトIDが「objId」の場合

    obj.typeCheck ( "円", objId )
    obj.typeCheck ( "文字", objId )
    obj.typeCheck ( "画層テーブル", objId )
    obj.typeCheck ( "ブロックテーブルレコード", objId )

    など

オブジェクト固有の特定はもちろん、「共通」の「オブジェクト名」を指定することで、オブジェクトのだいたいの種類を識別することもできます。そのため、「オブジェクト名」は完全に一致する名前でなくても構いません。「共通」で使用している「オブジェクト名」でもチェック可能です。「共通」の「オブジェクト名」の場合、指定したオブジェクトIDのオブジェクトが、その「共通」機能を含んでいれば「1(真)」を返します。

  例)取得したオブジェクトIDが「objId」の場合

    obj.typeCheck ( "全図形共通", objId )
    obj.typeCheck ( "寸法共通", objId )
    obj.typeCheck ( "シンボルテーブルレコード", objId )

    など

例えば、「オブジェクト名」の場所に「"全図形共通"」を指定した場合、取得したオブジェクトIDのオブジェクトが、「図形オブジェクト」であるかどうかを識別できます。

以下にこのオブジェクトの識別が不要な例と、必要な例を挙げて説明します。

オブジェクトの特定が不要な例:

「AutoCAD LTの作図画面上で最後に描かれた図形の『色』を『赤(色番号=1)』にする。」

この例の場合、取得するオブジェクトはAutoCAD LTの作図画面上の図形に限定されています。そのため、必ず「図形オブジェクト」が取得されることを前提にプログラムを設計します。しかも取得される図形オブジェクトの詳細な形は限定されていません。取得する図形オブジェクトであれば、「線分」であろうが「円」であろうが、どのような図形オブジェクトでも構わずに「色」に「赤」を設定します。つまり、このプログラムで操作するオブジェクトは、オブジェクトの種類を特定しない「図形オブジェクト」という「曖昧」な状態でのオブジェクト操作になります。この場合、「図形オブジェクト」に共通の機能(命令)であれば、「共通」機能を利用することで、プログラムを作成することができます。以下にそのプログラムを紹介します。

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

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   es = obj.util ("最後の図形" ,Null , objId) '(最後に作図した図形のオブジェクトIDを取得)
   es = obj.cad ("全図形共通", objId ,"色番号設定" , 1 ,Null )
   '実行が成功すると図形の色が変化します
End Sub

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

オブジェクトに対する操作の部分で、オブジェクト名に対して「全図形共通」という名前を付け、特定のオブジェクト名を指定していません。

オブジェクトの特定が必要な例:

「AutoCAD LTの作図画面上で最後に描かれた図形が『円』の場合、『半径』を『1.5』にする。」

この例の場合も、取得するオブジェクトはAutoCAD LTの作図画面上の図形に限定されています。しかし、オブジェクトの操作が「『円』の場合」と限定されているために、オブジェクトの識別をする必要があります。(「半径」の設定は、一部の図形オブジェクトにしか有効ではありません。そのため、この作業を図形オブジェクトの「共通」機能として利用することはできません。そのために、図形の特定をする必要があります。)取得するオブジェクトが、何のオブジェクトかを識別し、「円」オブジェクトの場合にのみ「半径」の設定作業を行ないます。

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

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application" ) '(外部プログラムとの接続手続き)
   es = obj.util ("最後の図形" ,Null , objId) '(最後に作図した図形を取得)
   If obj.typeCheck ( "" , objId ) Then
       'オブジェクトが「円」の場合のみ実行
       es = obj.cad ("" , objId ,"半径設定" , 1.5 ,Null )
   End If
End Sub

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





ディクショナリの基本操作


  ディクショナリを操作するための基本的な内容について説明します

図面データベースにおけるディクショナリ オブジェクトは少し特殊なオブジェクトです。そのため、図面データベースにおいてもディクショナリ オブジェクトの管理は、ディクショナリ専用の場所で行なわれています。(詳しくは、「ディクショナリの基本構造」を参照してください。)

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

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

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

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

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

「グループ」、「マルチラインスタイル」、「プレイスホルダー」、「印刷設定」、「レイアウト」、「イメージ定義」の基本的なオブジェクトの作業は、この構造を踏まえて実行する必要があります。図のように、基本的にこれらの管理方法の構造は同じ形になっているので、その操作方法を1つ知っていれば、他のディクショナリの操作の際にも応用できます。

ここでは、「グループ(AcDbGroup)」を例に、その操作方法を説明します。

「グループ」オブジェクトの操作:

上の図からもわかるように、図面データベースにおいて「グループ」オブジェクトは、専用ディクショナリ「グループ ディクショナリ」(とは言っても通常のディクショナリです)によって管理されています。「グループ ディクショナリ」は通常の「ディクショナリ オブジェクト」です。ただ、「グループ」を管理しているので、わかりやすくするために「グループ ディクショナリ」と呼びます。「グループ ディクショナリ」オブジェクトは、「基本ディクショナリ」オブジェクトから「つながって」います。この「グループ ディクショナリ」オブジェクトに、複数の「グループ」オブジェクトが名前を付けて「つながる」ことになります。実際の「グループ」の情報は、この「グループ」オブジェクトに保管されているのです。「グループ」の操作とは、この「グループ」オブジェクトを見つけ出して操作する作業になります。

作業@:「グループ ディクショナリ」オブジェクトの検索

「グループ」を操作するにはまず、図面データベースの中から「グループ ディクショナリ」オブジェクトを見つけ出さなければいけません。これは、図面データベース内のオブジェクトの「つながり」をたどることで可能となります。

基本的には「手法@」の方法で、ディクショナリ オブジェクトを順に検索する必要があります。以下の例は「手法@」に従って「グループ ディクショナリ」オブジェクトを検索する方法です。「基本ディクショナリ」オブジェクトから、「グループ ディクショナリ」オブジェクトを検索する際には、目的とするオブジェクトの「名前」を指定する必要があるのですが、「グループ ディクショナリ」オブジェクトには、「"ACAD_GROUP"」という名前が付けられています。この名前で検索することで、「グループ」管理用の「グループ ディクショナリ」オブジェクトが見つかります。

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

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim getData As Variant  '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim chk As Boolean    '(チェックの結果を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   es = obj.db ("ディクショナリ取得" , Null , objId ) '(ディクショナリのオブジェクトIDを取得)
   chk = obj.typeCheck ("ディクショナリ", objId ) '(命令が使用できるかクラス名をチェック)
   If chk Then '(命令が使用できる場合、次の命令を実行)
       es = obj.cad ("ディクショナリ" , objId ,"名前から取得" , "ACAD_GROUP" , getData )
       If es Then   '(上記の命令が正しく動作した場合次を実行)
           MsgBox "グループディクショナリのオブジェクトID:" & getData , vbOKOnly, "ディクショナリ情報"
       End If
   Else
       MsgBox "オブジェクトは「ディクショナリ」ではありません",vbOKOnly , "エラー表示"
   End If
End Sub

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

上記の「手法@」では、図面データベース オブジェクトから「基本ディクショナリ」オブジェクト、「グループ ディクショナリ」オブジェクトの順に検索しています。LT VB-COMでは、このステップを軽減するために、図の「手法A」のように、図面データベース オブジェクトから直接「グループ ディクショナリ」オブジェクトを見つけることができる「命令」を用意しています。この手法を使用すると簡単に「グループ ディクショナリ」オブジェクトを見つけることができます。この命令は「グループディクショナリ取得(getGroupDictionary)」です。この命令を利用すると、上のプログラムは以下のように記述することができます。

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

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim chk As Boolean    '(チェックの結果を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   es = obj.db ("グループディクショナリ取得" , Null , objId ) '(グループディクショナリのオブジェクトIDを取得)
   If es Then   '(上記の命令が正しく動作した場合次を実行)
       MsgBox "グループディクショナリのオブジェクトID:" & objId , vbOKOnly, "ディクショナリ情報"
   End If
End Sub

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

「手法@」とくらべて、ずっと簡単な内容になりました。図面データベースの構造を理解する上で「手法@」も必要ですが、実際にプログラムを設計する際には「手法A」を利用することが多くなるでしょう。

 参考:

図面データベース オブジェクトの「命令」には、この「グループ ディクショナリ」オブジェクトを直接見つける機能と同様に、「マルチラインスタイル ディクショナリ」、「印刷設定ディクショナリ」、「レイアウト ディクショナリ」などを直接見つける「命令」も用意されています。

作業A:「グループ」オブジェクトの検索

AutoCAD LTで複数の「グループ」を定義すると、それぞれに名前を付けて保管することができます。このとき、図面データベース内では、「グループ ディクショナリ」オブジェクトに、名前を付けて「グループ」オブジェクトが「つなげ」られています。LT VB-COMでこれらの「グループ」オブジェクトを操作する場合、「グループ ディクショナリ」オブジェクトから目的の「グループ」オブジェクトを見つける必要があります。

すべての「グループ」を操作する場合には、「グループ ディクショナリ」オブジェクトに「つながって」いるすべての「グループ」オブジェクトの「オブジェクトID」を取得できる、以下の命令を利用します。

 全レコード取得(getAllRecord)

また、特定の「グループ」のみを探して操作したい場合には、「グループ」の「名前」を指定して「グループ」オブジェクト(のオブジェクトID)を取得できる、以下の命令を使用します。

 名前から取得(getAt)

上記のいずれかの方法で、「グループ」オブジェクトを特定することができます。以下にそれぞれの使用例を紹介します。

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

[全レコードを取得する例]

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim ids As Variant   '(複数の「オブジェクトID」を格納する変数宣言)
   Dim setData As Variant '(命令の実行に必要な「設定データ」用変数宣言)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim chk As Boolean    '(チェックの結果を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   es = obj.db ("ディクショナリ取得" , Null , objId ) '(ディクショナリのオブジェクトIDを取得)
   chk = obj.typeCheck ("ディクショナリ", objId ) '(命令が使用できるかクラス名をチェック)
   If chk Then '(命令が使用できる場合、次の命令を実行)
       es = obj.cad ("ディクショナリ" , objId ,"全レコード取得" , Null , ids )
       If es Then   '(上記の命令が正しく動作した場合次を実行)
           For i = LBound ( ids ) To UBound ( ids )
               setData = ids ( i )
               getData = Empty
               es = obj.cad ("ディクショナリ" , objId ,"IDから名前取得" , setData , getData )
               If es Then   '(上記の命令が正しく動作した場合次を実行)
                   MsgBox "名前:" & getData , vbOKOnly, "要素(レコード):" & i + 1
               End If
           Next
           Erase ids
       End If
   Else
       MsgBox "オブジェクトは「ディクショナリ」ではありません",vbOKOnly , "エラー表示"
   End If
End Sub

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

[名前から取得する例]

Sub Sample()
   Dim es As Boolean    '(命令の「エラー状況」を格納する変数宣言)
   Dim objId As Variant   '(「オブジェクトID」を格納する変数宣言)
   Dim getData As Variant '(命令の実行結果を格納する「取得データ」用変数宣言)
   Dim chk As Boolean    '(チェックの結果を格納する変数宣言)
   '外部プログラムとの接続手続き
   Dim obj As Object     '(外部プログラムとの接続手続き保存用)
   Set obj = GetObject ( , "LT_VBCOM.Application") '(外部プログラムとの接続手続き)
   es = obj.db ("ディクショナリ取得" , Null , objId ) '(ディクショナリのオブジェクトIDを取得)
   chk = obj.typeCheck ("ディクショナリ", objId ) '(命令が使用できるかクラス名をチェック)
   If chk Then '(命令が使用できる場合、次の命令を実行)
       es = obj.cad ("ディクショナリ" , objId ,"名前から取得" , "ACAD_GROUP" , getData )
       If es Then   '(上記の命令が正しく動作した場合次を実行)
           MsgBox "グループディクショナリのオブジェクトID:" & getData , vbOKOnly, "ディクショナリ情報"
       End If
   Else
       MsgBox "オブジェクトは「ディクショナリ」ではありません",vbOKOnly , "エラー表示"
   End If
End Sub

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

作業B:「グループ」オブジェクトの操作

作業@、Aによって「グループ」オブジェクトが特定されれば、あとは通常のオブジェクト操作とまったくかわりません。「cad(オブジェクト基本操作)関数」を使用して、見つけた「グループ」オブジェクトを操作するだけです。

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

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

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, groupName & "グループ図形 " & getData ( 0 ) & "個"
                       Next
                       Erase getData '(リストの内容を削除)
                   End If
               End If
           Next
           Erase idArray '(リストの内容を削除)
       End If
   Else
       MsgBox "オブジェクトは「ディクショナリ」ではありません", vbOKOnly , "エラー表示"
   End If
End Sub

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