【入門編】【実務中級】AutoCAD VBAで図面内の全ブロック参照(Block Reference)を検索し、属性値に基づいてフィルタリングする – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する:ブロック属性抽出の「極意」を授けよう

AutoCAD VBAの世界へようこそ。マクロの記録ボタンを押して「なんとなく動いたコード」に一喜一憂するのは今日で終わりです。

今日は、業務自動化の第一歩にして最大の壁である「図面データベースへのアクセス」について、その本質を伝授します。テーマは「特定の条件を満たすブロック参照の抽出」。これができれば、部品表の作成も、図面情報の修正も、あなたの手元で完結します。

1. なぜ「BlockReference」が重要なのか

AutoCADにおいて、図面は「データベース」です。その中でも「ブロック参照(AcadBlockReference)」は、属性(Attribute)という情報を抱える、いわば「生きたデータ」の塊です。

初心者がやりがちなのは「図面上の全図形をループして、力技で判定する」ことですが、これでは図面が巨大化した瞬間にフリーズします。私たちは「モデル空間(またはペーパー空間)というオブジェクトの海の中から、必要な魚だけをスマートに釣り上げる」必要があります。

2. 実践コード:属性値フィルタリングの極致

以下のコードは、単にブロックを探すだけでなく、特定の属性値を比較して「合致するものだけを抽出する」という実務直結型のコードです。

Sub FilterBlockAttributes()
Dim ent As AcadEntity
Dim blkRef As AcadBlockReference
Dim atts As Variant
Dim i As Integer

‘ 処理の高速化:画面更新を一時停止する(必須のテクニック)
ThisDrawing.Utility.Prompt “ブロックを検索中…”

‘ モデル空間内の全オブジェクトをループ
For Each ent In ThisDrawing.ModelSpace

‘ オブジェクトがブロック参照かどうかを確認
If TypeOf ent Is AcadBlockReference Then
Set blkRef = ent

‘ ブロック名が一致するか判定
If blkRef.Name = “MY_BLOCK_NAME” Then

‘ 属性情報を取得
atts = blkRef.GetAttributes

‘ 属性が存在する場合のみループ
If UBound(atts) >= 0 Then
For i = LBound(atts) To UBound(atts)
‘ 属性タグ名と値をチェック
If atts(i).TagString = “PART_NO” And atts(i).TextString = “A-100” Then
‘ ここで抽出成功!ハイライトする等の処理を行う
blkRef.Highlight True
ThisDrawing.Utility.Prompt “対象ブロックを発見しました: ” & blkRef.Handle & vbCrLf
End If
Next i
End If
End If
End If
Next ent

ThisDrawing.Regen acActiveViewport
End Sub

3. このコードを「使いこなす」ための3つの知見

① `TypeOf` を使った型安全なフィルタリング

`For Each` で全オブジェクトをなめる際、`TypeOf` を使わずにプロパティにアクセスしようとすると、線分(Line)や円(Circle)が混ざった瞬間にエラーが飛びます。「触る前に、それが何者かを確認する」。これがエンジニアの作法です。

② 属性は「配列(Variant)」で返ってくる

`GetAttributes` メソッドは属性を配列で返します。ここで初心者が躓くのが `UBound` と `LBound` です。属性が一つもないブロックに対してこれらを無視すると「添字が範囲外です」というエラーが即座に発生します。必ず `UBound(atts) >= 0` で存在確認をしてください。

③ パフォーマンスを意識せよ

大規模な図面で上記のコードを動かすと、モデル空間の全オブジェクトを回るため時間がかかります。もし対象が特定のレイヤーにあると分かっているなら、`SelectOnScreen` や `Filter` を使って、あらかじめ検索範囲を絞り込むのが真のプロの設計です。

4. 陥りやすい「罠」

  • 名前空間の混同: `ThisDrawing` はアクティブなドキュメントを指します。複数の図面を開いている場合、意図しない図面を操作しないよう、必ず `ActiveDocument` を明確に意識してください。
  • 属性の更新: 属性値を変更しただけでは、画面上ですぐに反映されないことがあります。最後に `blkRef.Update` を呼ぶか、全体の `Regen` を忘れないようにしましょう。

最後に:あなたへのメッセージ

AutoCAD VBAは、古い言語だと言われることもあります。しかし、設計の現場において、これほど直接的に図面という「資産」を操作できるツールは他にありません。

今回紹介したコードは、言わば「汎用的な釣り竿」です。ここから、「属性値をCSVに書き出す」「特定のブロックを別のブロックに置換する」といった拡張は、今のあなたの力で十分に可能です。

コードを書き、失敗し、また書く。その繰り返しの中にしか、真の技術力は宿りません。さあ、次はどんな図面を自動化しますか?応援しています。

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