SeaGate HomePage 別館
本館 別館 ブログ
 
トップページ
第01回
第02回
第03回
第04回
第05回
第06回
第07回
第08回
第09回
第10回
第11回
第12回
第13回
第14回
おまけ
VBAではじめるAutoCADカスタマイズ VBAではじめるAutoCADカスタマイズ
第7回 AutoCADとユーザとの対話

■ はじめに

前回は、座標や半径などの値をプログラムコード中に直接記述して図形や文字の作図を行いました。しかし、通常AutoCADで作図する時は、作図ウィンドウ上で位置を指定したり、コマンドウィンドウに値を入力しながらコンピュータと対話的に作業を進めていきます。今回は、AutoCAD VBAでユーザが作図ウィンドウ上で指定した座標位置や選択した図形を取得したり、コマンドウィンドウに入力した数値や文字などを取得する方法について説明します。

■ ユーザ入力

◆ ユーザ入力メソッド

ユーザが作図ウィンドウ上で指定した座標位置や距離、角度を取得したり、コマンドウィンドウに入力した数値や文字などを取得するには、Documentオブジェクトの子オブジェクトであるUtilityオブジェクトの持つメソッドを使用します。代表的なユーザ入力メソッドには下表に示すようなものがあり、コマンドウィンドウからの入力だけを取得するものとコマンドウィンドウと作図ウィンドウの両方からの入力を取得することができるものがあります。

コマンドウィンドウからの入力だけを取得するユーザ入力メソッド
GetInteger([プロンプト]) コマンドウィンドウから整数値を取得する。プロンプトにはユーザに入力を求める際、コマンドウィンドウに表示する文字列を指定する。
GetReal([プロンプト]) コマンドウィンドウから実数(倍精度浮動小数点型)値を取得する。
GetString(HasSpaces[, プロンプト]) コマンドウィンドウから文字列を取得する。HasSpacesには文字列にスペースを含むかどうかをTrueまたはFalseで指定する。

コマンドウィンドウと作図ウィンドウの両方からの入力を取得するユーザ入力メソッド
GetPoint([基点][, プロンプト]) コマンドウィドウまたは作図ウィンドウ上で指定した座標位置を取得する。
GetDistance([1番目の点][, プロンプト]) コマンドウィドウに入力した距離の値または作図ウィンドウ上で指定した2点間の距離を取得する。
GetOrientation ([1番目の点][, プロンプト]) コマンドウィドウに入力した角度の値または作図ウィンドウ上で指定した2点のXY 平面上の角度を取得する。

ユーザ入力メソッドはコマンドウィンドウにプロンプトを表示し、ユーザが入力した値を返します。取得できる値の形式はメソッドごとに決まっていて、例えばGetIntegerは整数型の値、GetReal, GetDistance, GetOrientationなどのメソッドは倍精度浮動小数点数型の値、GetStringは文字列型の値を返します。また、GetPointは取得したWCS(ワールド座標系)の3次元座標を要素3の倍精度浮動小数点数型の一次元配列として返します。

ユーザ入力メソッドとともにInitializeUserInputメソッドを使用すると、ユーザが入力できる値のタイプや範囲を限定することができます。例えばInitializeUserInputメソッドの引数に1を指定するとNULL入力(Enter]または[スペース]だけの入力)を、2を指定した場合はゼロ(0)の入力を、4を指定した場合は負の値の入力を制限でき、逆に128を指定した場合は入力値を制限しません。また、引数の値を加算することで複数の条件を指定することもできます。

ユーザ入力メソッドの使用例
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

◆ キーワードの使用

AutoCADでは多くのコマンドがコマンドウィンドウにプロンプトを表示し、座標位置や数値の入力を行うかキーワードを入力して作図や編集などのオプションを指定するかを選択することできます。AutoCAD VBAでこのような機能を実現するには、GetInputメソッドをGetPointなどの文字列以外の値を返すユーザ入力メソッドとともに使用し、ユーザがコマンドウィンドウに入力したキーワードを取得してそのキーワードに応じた処理を行うようにします。

キーワードの例
キーワードの例
Circleコマンドは中心点を指定する他にキーボードから「2P」「3P」などのキーワードを入力することができる。

ユーザが入力することができるキーワードを定義するには、GetInputやGetKeywordメソッドとともにInitializeUserInputメソッドを使用し、"keyword1 keyword2"のようにキーワードをスペースで区切った文字列をInitializeUserInputメソッドの2番目の引数に指定します。

GetPointなどの文字列以外の値を返すユーザ入力メソッドでユーザがキーワードを入力すると、エラー番号-2145320928(「ユーザ入力がキーワードです」)というエラーが発生します。このエラーが発生した時GetInputメソッドを実行すると、直前のユーザ入力メソッドでユーザが入力したキーワードを文字列として取得することができます。また、InitializeUserInputメソッドでNULL入力が認められている時、[Enter]または[スペース]を入力すると、GetInputメソッドは""(長さ0の文字列)を返します。

座標位置や数値の入力とキーワードの入力を選択するのではなく、単にユーザにキーワードの入力だけを求める時はGetKeywordメソッドを使用します。GetKeywordメソッドは実行してもエラーは発生せず、ユーザが入力したキーワードを直接文字列として取得することができます。

キーワードの使用例
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

エラー処理

プログラムの実行時にエラーが発生すると、エラーメッセージが表示されその時点でプログラムの実行が中断してしまいます。AutoCAD VBAでは実行時エラーが発生した時、それを適切に処理するためのプログラムコードを実行させることができるようになっています。このような仕組みをエラー処理(エラートラップやエラーハンドリングなどとも呼ばれる)といい、次の2種類の方法が用意されています。

On Error Goto [行ラベル] 実行時エラーが発生するとプログラムの実行を強制的に行ラベルの次の処理に移す。エラー処理をまとめて行う時によく用いられる。また、行ラベルに0を指定するとエラー処理を無効にすることができる。
On Error Resume Next 実行時エラーが発生してもプログラムの実行を中断せず、エラーが発生した箇所の次の処理から継続して実行する。エラーの発生が予想される箇所のすぐ後でエラー処理を行う時によく用いられる。

実行時にエラーが発生すると、AutoCAD VBAはErrオブジェクトに発生したエラーの情報を格納します。Errオブジェクトはエラー情報を管理するオブジェクトで、プログラムコードからこのErrオブジェクトの持つNumberプロパティ(エラー番号)やDescriptionプロパティ(エラーの説明文)を参照することで、どのようなエラーが発生したのかを知ることができます。そして、エラー処理を行った後はClearメソッドを実行し、エラー情報をクリアしておきます。

エラー処理は本来プログラム実行中に発生する予期しないエラーに対処するためのものですが、AutoCADの各オブジェクトが持つメソッドの中には、GetPointメソッドなどのようにユーザから座標位置ではなくキーワードが入力された時やGetEntityメソッドで図形が何も選択されなかった時など、メソッドの実行結果やその状態を表わすために利用するものがあります。

■ 図形の選択

◆ GetEntityメソッド

作図ウィンドウ上でユーザが単一の図形や文字などを選択できるようにするには、Utilityオブジェクトが持つGetEntityメソッドを使用します。通常このメソッドの1番目の引数にはAcadEntity型のオブジェクト変数を指定し、2番目の引数には倍精度浮動小数点型の動的配列を指定します。

GetEntityメソッドを実行してユーザが図形や文字を選択すると、選択した図形や文字が1番目の引数に指定したオブジェクト変数に格納され、ユーザが作図ウィンドウ上でクリックした位置のWCS(ワールド座標系)の3次元座標が2番目の引数に指定した倍精度浮動小数点型の動的配列に要素数3の一次元配列として格納されます。

GetEntityメソッドの使用例
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

◆ 選択セット

選択セット(SelectionSetオブジェクト)とは、その内部に指定した図形や文字などのオブジェクトを格納することができるオブジェクトのことで、選択セットを利用すると関連する複数の図形に対して一括して同じ処理を行うことができます。選択セットを使用するには、Documentオブジェクトの子オブジェクトであるSelectionSetsコレクションのAddメソッドの引数に任意の名前を指定してSelectionSetオブジェクトを作成します。

選択セット(SelectionSetオブジェクト)と図形や文字オブジェクトの関係
選択セット(SelectionSetオブジェクト)と図形や文字オブジェクトの関係

SelectionSetオブジェクトを作成すると、その内部にモデル空間やペーパー空間に作図された図形や文字などのオブジェクトを追加したり除去したりすることができるようになります。図形や文字オブジェクトの追加や除去には下表に示すSelectionSetオブジェクト自身が持つメソッドを使用します。また、Countプロパティを使用すると現在選択セットに格納されている図形や文字オブジェクトの数を取得することができます。

AddItems 1つまたは複数の図形や文字オブジェクトを選択セットに追加する。
Select 図形や文字オブジェクトの選択条件を指定して選択セットに追加する。オブジェクトの選択条件には窓、交差、直前、最後、すべてを指定することができる。
SelectAtPoint 指定した点を通る図形や文字オブジェクトを選択セットに追加する。
SelectByPolygon 指定したポリゴンと交差するかまたは内部にある図形や文字オブジェクトを選択セットに追加する。
SelectOnScreen ユーザが作図ウィンドウ上で選択した図形や文字オブジェクトを選択セットに追加する。

RemoveItems 1つまたは複数の図形や文字オブジェクトを選択セットから除去する。除去された図形や文字オブジェクトは図面上からは削除されない。
Clear 選択セット内のすべての図形や文字オブジェクトを除去する。選択セット自身は残され、除去された図形や文字オブジェクトも図面上からは削除されない。
Erase 選択セット内のすべての図形や文字オブジェクトを削除する。選択セット自身は残されるが、削除された図形や文字オブジェクトは図面上からも削除される。
Delete 選択セット内のすべての図形や文字オブジェクトを除去する。選択セット自身は削除されるが、除去された図形や文字オブジェクトは図面上からは削除されない。

SelectionSetsコレクションのAddメソッドを使用してSelectionSetオブジェクトを作成する時、既に同じ名前の選択セットが存在する場合はエラーが発生します。選択セットが不要になった時はDeleteメソッドを使用して選択セットを削除しておきます。また、既存の選択セットを利用したい時は、ThisDrawing.SelectionSets.Item("NAME")のようにSelectionSetsコレクションItemメソッドの引数にその名前を指定して参照します。

選択セットの使用例
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

Entityオブジェクト

Entityオブジェクトとは、図形や文字などのオブジェクトを共通した操作で扱えるようにするためのオブジェクト(正確にはインターフェイスという)です。AcadEntity型として宣言したオブジェクト変数には、AutoCADで作成することができるすべての図形や文字オブジェクトを格納することができ、これらのオブジェクトに共通して備わっているLayerプロパティやCopyメソッドなどを使用することもできます。また、ObjectNameプロパティを使用すると、オブジェクト変数に格納されている図形や文字オブジェクトの種類を調べることができます。

逆に、Entityオブジェクトに格納された図形や文字オブジェクトを取り出すには、Setキーワードを使用して取り出したい図形や文字オブジェクトの型として宣言したオブジェクト変数に代入します。このような操作をキャストといい、こうすることにより元の図形や文字オブジェクトに固有のプロパティやメソッドが使用できるようになります。

ModelSpaceコレクションやSelectionSetオブジェクトには複数の異なる種類の図形や文字オブジェクトが含まれる場合がありますが、For Each文とEntityオブジェクトを使用してその内部に含まれる図形や文字オブジェクトを列挙すると、図形の種類に関わらずすべての図形や文字オブジェクトをAcadEntity型のオブジェクト変数に取り出して操作することができます。

GetEntityメソッドの使用例
> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

■ 最後に

一般的なWindowsアプリケーションと同様、AutoCADもオプションの指定にコマンドよりもダイアログを使用することが多くなりました。しかし、今回説明したコマンドウィンドウや作図ウィンドウによる入力は、AutoCADによるユーザ入力の基本です。記述するコードが多く複雑ですが、一度手順を覚えてしまえばいつでも同じ方法でプログラムを作成することができますので、一歩一歩着実にマスターしていってください。
SeaGate
コレクション



inserted by FC2 system