はじめに
AutoCAD VBAでコードによる図形オブジェクトの選択には、選択フィルタを指定することが可能です。
例えば、画面上で図形オブジェクトをクリックやドラッグで選択するSelectionSet.SelectOnScreen
メソッドでは、画面上で非表示やフリーズにしていなくても選択フィルタにしたがった図形オブジェクトだけを選択できますし、SelectionSet.Select
メソッドでは、選択フィルタを指定することでクイック選択のような処理を行うことも可能です。
ここでは、3回に分けて選択フィルタを作成するFunctionプロシージャを紹介します。第1回は前段として公式リファレンスのサンプルコードを見ていきます。
公式リファレンスのサンプルコード(改)
公式リファレンスに掲載されている選択フィルタの作り方は、コード内がすべて英語ということもあり、少しわかりづらいものです。
以下はSelectionSet.Select
メソッドに掲載されているサンプルコードを最低限翻訳・改変して注記を入れたものです。
Sub Example_Select()
' 円でフィルタリングして選択セットにメンバーを追加するサンプルコード
' 'SSET'という名前の選択セットを作成 (※この時点では中身は空です)
Dim ssetObj As AcadSelectionSet
Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
' 選択する範囲を表す矩形の対角線の2点を指定 (※3次元座標値 X,Y,Z を表す1次元配列)
Dim corner1(0 To 2) As Double
Dim corner2(0 To 2) As Double
corner1(0) = 28: corner1(1) = 17: corner1(2) = 0
corner2(0) = -3.3: corner2(1) = -3.6: corner2(2) = 0
' 選択モードとして交差(矩形内部および枠線にかかっている図形を選択するモード)を指定
Dim mode As Integer
mode = acSelectionSetCrossing
' 選択フィルタの中身となる配列を作る
Dim gpCode(0) As Integer ' 筆者注 : FilterTypeの中身 (常に As Integer)
Dim dataValue(0) As Variant ' 筆者注 : FilterDataの中身 (様々な値があるためVariant)
gpCode(0) = 0 ' 筆者注 : 図形タイプをテキストで指定するときのDXFグループコード
dataValue(0) = "Circle" ' 筆者注 : 図形タイプを表すテキスト
' Selectメソッドの引数となる配列を作る (こちらは常にVariant)
Dim groupCode As Variant
DIm dataCode As Variant
groupCode = gpCode
dataCode = dataValue
' SelectionSet.Selectメソッドを実行
ssetObj.Select mode, corner1, corner2, groupCode, dataCode
End Sub
コードの解説
(1) 選択セットの作成
特にありませんが、指定した名前の選択セットが既にある場合はエラーになりますので、その対処をしておくべきかもしれません(このコードはあくまでサンプルなので……)。
On Error Resume Next
ThisDrawing.SelectionSets("SSET").Delete
On Error GoTo 0
(2) 矩形の対角線を表す2点の指定
特にありません。点を表す変数は3要素の1次元配列です。つまり、X, Y, Z座標の値です。
(3) 選択モードの指定
選択モードの指定は、AcSelect 列挙型で指定します。
AcSelect 列挙型には8つの定数があり、その内、Selectメソッドで5つ、SelectByPolygonメソッドで3つ使います。
(4) 選択フィルタの中身となる配列を作る
まず、フィルタをいくつ指定するかが必要なため、要素数を指定して配列を定義しています。1つ目のgpCode(0)
は内容が常にDXFグループコードとなるため、Integer型となります。2つ目のdataCode(0)
は、1つ目のgpCode(0)
に対応する値で、様々な型(Integer, Long, Single, Double, String, など)が入ってくるため、Variant型となります。
(5) Selectメソッドの引数となる配列を作る
こちらはSelectメソッドの引数となるもので、常にVariant型である必要があります。
(6) SelectionSet.Selectメソッドを実行
指定した条件で選択が実行されます。注意点としては、画面上で選択されているわけではなく、あくまで'SSET'という名前の選択セットに対象のオブジェクトが格納されたということです。
ssetObj.Select Mode:=mode _
, Point1:=corner1 _
, Point2:=corner2 _
, FilterType:=groupCode _
, FilterData:=dataCode
おわりに
(4)では、フィルタの中身を作る際にフィルタ数を決め打ちしています。汎用のフィルタ作成ファンクションを作るにあたっては、これを可変にした方が良さそうです。
次回は、Selectメソッドで指定するフィルタ(配列)を作成するファンクションプロシージャについて解説していきます。