AutoCAD VBAの深淵へ:ブロックを「分解せず」に核心を突く(GetSubEntityの魔術)
こんにちは。AutoCADの自動化を極めようと足掻くあなたへ。
これまで「ブロック内の図形を編集したい」という壁にぶつかり、泣く泣くブロックを分解(Explode)して、後で再作成して……なんて非効率なことをしていませんでしたか?
ブロックを分解するということは、設計意図を破壊し、データの整合性を汚す行為です。AutoCAD VBAの真の使い手は、「分解せずに、ネストされた図形(SubEntity)を直接狩る」方法を知っています。
今日は、AutoCAD VBAの隠れた名メソッド『`GetSubEntity`』を使って、ブロックや外部参照の「中の人」に直接アクセスする極意を伝授します。
—
1. なぜ「GetEntity」ではダメなのか?
初学者が必ず通る道が `Utility.GetEntity` です。しかし、これでブロックを選択すると、返ってくるのは「ブロック参照(`AcadBlockReference`)」という巨大な塊だけです。
「いや、その中のあの線を赤くしたいんだ!」
そう願っても、`GetEntity` ではその線までたどり着けません。そこで登場するのが `GetSubEntity` です。これは、「クリックした場所から、その下にある具体的な図形(線や円など)の正体と、そこに至るまでの道筋(パス)」を掘り当てるための専用ツールなのです。
—
2. 実践:ネストされた図形をピンポイントで編集する
以下のコードは、ユーザーがクリックしたブロック内部の個別の図形を取得し、その色を強制的に変更するプロトタイプです。
Sub ModifyNestedEntity()
Dim pickObj As Object
Dim pickPoint As Variant
Dim transMatrix As Variant
Dim contextObj As Variant
Dim subEnt As AcadEntity
‘ 1. ユーザーに図形を選択させる
‘ GetSubEntityは、選択した図形(pickObj)だけでなく、
‘ その階層構造(contextObj)まで引き抜いてくれます
On Error Resume Next
ThisDrawing.Utility.GetSubEntity pickObj, pickPoint, transMatrix, contextObj, “編集する図形をクリックしてください: ”
If Err.Number <> 0 Then
MsgBox “選択がキャンセルされました。”
Exit Sub
End If
‘ 2. 取得したオブジェクトが何者かを確認
‘ contextObj(0) には、その図形が含まれているブロック参照が入ります
If TypeOf contextObj(0) Is AcadBlockReference Then
‘ 3. 取得したサブエンティティ(線や円など)にアクセス
‘ 今回は便宜上、選択されたオブジェクトを直接操作します
Set subEnt = pickObj
‘ プロパティを変更(例:赤色に変更)
subEnt.Color = acRed
subEnt.Update
MsgBox “ブロック内の図形を直接書き換えました!”
Else
MsgBox “ブロック内の図形を選択してください。”
End If
End Sub
—
3. このコードを理解するための「3つの鍵」
このコードがなぜ動くのか、その裏側の仕組みをエンジニアの視点で解説します。
① `contextObj` という名の「階層のパスポート」
`GetSubEntity` が返す `contextObj` 配列は、いわば「図形までの住所録」です。ブロックの中にブロックが入っている(ネスト)場合、この配列を辿ることで、どこの階層のどの図形かを特定できます。今回は一番浅い階層(0番)を参照していますが、複雑な図面ではここをループ処理で掘り下げていくのがプロの技です。
② `transMatrix` の重要性
ネストされた図形は、親ブロックの座標系に依存しています。もし、その図形の「絶対座標(ワールド座標)」を知りたい場合は、この `transMatrix`(変換行列)を使って座標変換を行う必要があります。今回は色を変えるだけなので無視していますが、位置情報を扱う際はここが最重要ポイントになります。
③ 陥りやすい罠:`On Error Resume Next`
`GetSubEntity` は、ユーザーが何も選択せずにEnterを押すと即座にエラーを吐きます。実務で使う際は、必ずエラーハンドリングを行い、「ユーザーの操作」と「プログラムの意図」の乖離を埋めてあげてください。
—
4. チーフアーキテクトからのアドバイス
AutoCAD VBAをマスターするコツは、「オブジェクトの階層構造をイメージすること」です。
ブロック参照は「窓口」であり、その裏側に実際の図形データ(`BlockDefinition`)が隠れています。`GetSubEntity` を使うことで、あなたは「窓口の外側にいるユーザー」から、「窓口の内側の書類を直接書き換える管理者」へと昇格できます。
この手法を覚えれば、大量の図面の中から特定の線だけを色分けしたり、画層を入れ替えたりする作業が、一瞬で終わるようになります。
さあ、次はあなたの番です。まずは上のコードをコピーして、手元のブロック図形で試してみてください。「分解せずにアクセスできる」という感覚を掴んだ時、あなたのAutoCADライフは劇的に変わるはずです。
何か分からないことがあれば、いつでも聞いてください。設計と自動化の道は、歩み続ける者にだけ開かれます。
