【入門編】【実務中級】AcadDocument.Utility.GetSubEntityによる「ネストされた図形」の直接選択とプロパティ編集 – AutoCAD VBA解析バイブル

スポンサーリンク

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ライフは劇的に変わるはずです。

何か分からないことがあれば、いつでも聞いてください。設計と自動化の道は、歩み続ける者にだけ開かれます。

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