【入門編】【上級】AcadApplication.EvalによるAutoLISP連携:VBAのSelectionSetsでは困難な「複雑なフィルタ選択(ssget)」を突破するハイブリッド実装 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの限界を突破せよ:`Eval`でAutoLISPの「最強の選択フィルタ」を呼び出す技術

AutoCAD VBAを使いこなす中で、一度はこんな壁にぶつかったことはありませんか?
「VBAの`SelectionSets`で複雑なフィルタ条件を指定しようとしたが、ドキュメントが難解すぎて断念した」あるいは「ネストされた図形や、特定のプロパティを組み合わせた動的な絞り込みがうまく機能しない」。

実は、AutoCADには「VBAにはないが、AutoLISPにはある」という強力な武器が存在します。それが`ssget`関数です。

今日は、VBAの制限を軽々と飛び越え、AutoLISPの強力なエンジンをVBAから呼び出す「禁断のハイブリッド実装」を伝授します。これさえマスターすれば、あなたの自動化ツールは「初心者レベル」から「プロフェッショナルな設計支援システム」へと進化します。

なぜ `SelectionSets` では力不足なのか?

VBAの`SelectionSets.Add`メソッドは、確かに強力です。しかし、条件設定(`SetFilterType`や`SetFilterData`)を行うには、コードが冗長になりがちで、特に「ネストされたブロック内」や「特定の論理演算(OR/ANDの組み合わせ)」を扱う際には、開発者の気力を削ぐような複雑さが待ち受けています。

一方、AutoLISPの`ssget`は、一行の文字列で複雑な検索パターンを記述できます。

  • VBA: 数十行のコードでフィルタ設定を記述。
  • AutoLISP: `(ssget “_X” ‘((0 . “CIRCLE”) (8 . “Layer1”) (-4 . ““)))`

この「表現力」の差を埋めるのが、今回紹介する `AcadApplication.Eval` です。

核心技術:Evalによるハイブリッド実装

`AcadApplication.Eval` は、AutoCADのコマンドラインに直接LISP式を投げ込む関数です。これを使えば、LISP側で絞り込んだ結果(選択セット)を、VBA側で受け取ることができます。

しかし、ここで一つ重要な注意点があります。「LISP側で作った選択セットを、どうやってVBAに渡すか?」という問題です。最もスマートな解決策は、一時的な「名前付き選択セット」をLISP側で作成し、それをVBA側で捕捉することです。

実装コード:LISPのフィルタをVBAから操る

このコードは、現在の図面から「画層名が”TEST”、かつ色が”赤”または”黄色”の円」を一括選択するサンプルです。

Public Sub HybridSelectionExample()
Dim acadApp As AcadApplication
Set acadApp = ThisDrawing.Application

‘ 1. LISPを使って選択セットを作成する式を定義
‘ “TEMP_SS” という名前で選択セットを作成する
Dim lispExpression As String
lispExpression = “(ssget “”_X”” ‘((0 . “”CIRCLE””) (8 . “”TEST””) (-4 . “”“”)))”

‘ 2. Evalで実行し、結果が空でないか確認
‘ LISP側で選択セットが作成されると、その名前が返る
Dim result As Variant
result = acadApp.Eval(lispExpression)

‘ 3. VBA側でその選択セットを捕捉
On Error Resume Next
Dim ss As AcadSelectionSet
Set ss = ThisDrawing.SelectionSets.Add(“MyTempSS”)
If Err.Number <> 0 Then
Set ss = ThisDrawing.SelectionSets.Item(“MyTempSS”)
ss.Clear
End If
On Error GoTo 0

‘ 4. ここでLISPで作った選択をVBAのオブジェクトとして再構築するロジックを組む
‘ ※注意: Evalで直接VBAオブジェクトは返せないので、
‘ 実際にはLISP側で選択された図形をVBAで回す工夫が必要です。

MsgBox “フィルタリング完了。選択された図形数: ” & ss.Count
End Sub

陥りやすいエラーと回避の鉄則

1. 引用符(クォート)の二重化:
VBAの文字列の中でLISPの引用符(`”`)を使うとき、`””`のように二重にする必要があります。これが原因で構文エラーになるケースが非常に多いです。常にLISPコードを一度メモ帳に書き出し、それをVBA文字列に変換する癖をつけましょう。

2. 選択セットの寿命管理:
`SelectionSets.Add`で同じ名前を使うとエラーになります。コードの冒頭で必ず「同名の選択セットが存在しないか確認し、あれば削除する」というクリーンアップ処理を徹底してください。これができないエンジニアは、現場でトラブルを撒き散らします。

3. パフォーマンスの過信:
`Eval`は強力ですが、多用しすぎるとコードの可読性が極端に下がります。「VBAで書ける部分はVBAで、どうしても複雑なフィルタが必要なときだけLISPを呼び出す」という、適材適所の精神を忘れないでください。

先輩エンジニアからのアドバイス

「AutoCAD VBAのオブジェクトモデルを理解する」ということは、「AutoCADという巨大なエンジンのどこにどうアクセスすれば一番効率が良いかを知ること」と同義です。

今回紹介した`Eval`による連携は、いわば「裏技」です。しかし、この裏技を理解することで、あなたは「VBAの制約」に縛られる存在から、「AutoCADの機能を自在に統合できるアーキテクト」へと一歩近づきます。

まずは、簡単な`ssget`のフィルタ条件から試してみてください。一つフィルタが成功すれば、あなたの業務自動化の幅は、昨日とは比べ物にならないほど広がっているはずです。

何か詰まったら、いつでも聞いてください。壁を越える準備はできていますか?

タイトルとURLをコピーしました