【AutoCAD VBA中級】ブロック属性を自在に操る――「マクロの記録」を超えた先にある自動化の世界
こんにちは。AutoCADの自動化という荒野を切り拓く同志の皆さん。
「マクロの記録」が使えないAutoCADの世界で、私たちは自らコードを書き、図面という名のデータベースを操る必要があります。
今回は、多くの設計者が直面する「ブロック属性(Attribute)の一括編集・抽出」という壁を突破しましょう。ここを理解すれば、AutoCAD VBAのオブジェクトモデルの「心臓部」に触れたことになります。
—
1. なぜ「ブロック属性」は一筋縄ではいかないのか?
AutoCADの図面は単なる絵ではありません。「ブロック参照(BlockReference)」というコンテナの中に、「属性(AttributeReference)」というデータが格納されている階層構造を持っています。
初心者がよく陥る罠は、「ブロックを選んだから、その中身もすぐ取れるだろう」と安易に考えることです。しかし、VBAの階層構造は少しだけ深淵です。
- 図面(Document) → モデル空間(ModelSpace) → ブロック参照(BlockReference) → 属性(AttributeReference)
この「一段掘り下げる」という操作をコードで書けるかどうかが、自動化の達人への第一歩です。
—
2. 【実用】ブロック属性を一括で抽出するコード
まずは、図面内の特定のブロックから属性値を読み取り、イミディエイトウィンドウに出力するコードを見てみましょう。
Sub ExtractAttributes()
Dim objEnt As AcadEntity
Dim objBlockRef As AcadBlockReference
Dim varAttributes As Variant
Dim i As Integer
‘ モデル空間内の全オブジェクトをループ
For Each objEnt In ThisDrawing.ModelSpace
‘ オブジェクトがブロック参照であるかを確認
If TypeOf objEnt Is AcadBlockReference Then
Set objBlockRef = objEnt
‘ ブロック名が対象のものかチェック(例:”PARTS_BLOCK”)
If objBlockRef.Name = “PARTS_BLOCK” Then
‘ 属性情報を取得(配列として返される)
varAttributes = objBlockRef.GetAttributes
‘ 属性を一つずつ取り出す
For i = LBound(varAttributes) To UBound(varAttributes)
Debug.Print “タグ名: ” & varAttributes(i).TagString & _
” / 値: ” & varAttributes(i).TextString
Next i
End If
End If
Next
End Sub
このコードの「極意」
- TypeOf演算子: `TypeOf`を使って型を判定するのはエンジニアの嗜みです。これを怠ると、線分や円などが混ざった図面でエラーの嵐に見舞われます。
- GetAttributesメソッド: これが今回の主役です。属性は「配列」として格納されています。`LBound`から`UBound`で回すのは、属性が0個の場合の予期せぬエラーを防ぐための、現場で培われた防衛策です。
—
3. 【実用】ブロック属性を一括で更新するコード
次は抽出だけでなく、値を書き換えるステップです。これは設計変更やナンバリングの修正で爆速の効果を発揮します。
Sub UpdateBlockAttributes()
Dim objEnt As AcadEntity
Dim objBlockRef As AcadBlockReference
Dim varAttributes As Variant
Dim i As Integer
For Each objEnt In ThisDrawing.ModelSpace
If TypeOf objEnt Is AcadBlockReference Then
Set objBlockRef = objEnt
If objBlockRef.Name = “PARTS_BLOCK” Then
varAttributes = objBlockRef.GetAttributes
For i = LBound(varAttributes) To UBound(varAttributes)
‘ タグ名「PART_NO」の値だけを更新する
If varAttributes(i).TagString = “PART_NO” Then
varAttributes(i).TextString = “NEW-12345”
varAttributes(i).Update ‘ 画面の再描画を忘れずに!
End If
Next i
End If
End If
Next
MsgBox “属性の更新が完了しました。”
End Sub
ここで陥りやすいエラーと対策
- `.Update`の重要性: 属性値を書き換えても、画面上は古いままに見えることがあります。`Update`メソッドは、AutoCADのキャッシュされた表示データとメモリ上の最新データを同期させるための「魔法の呪文」です。
- 大文字・小文字の罠: `TagString`は通常大文字で管理されます。比較する際は念のため `UCase()` 関数を使って比較する等の配慮があると、より堅牢なコードになります。
—
4. チーフアーキテクトからのアドバイス
AutoCAD VBAを使いこなすコツは、「オブジェクトの寿命(ライフサイクル)を意識すること」です。
今回紹介した`GetAttributes`メソッドは、呼び出すたびにメモリを消費します。数千個のブロックを処理するような大規模な図面では、無駄な再代入を避け、一度取得した変数を使い回す工夫が、プログラムの動作を劇的に軽くします。
次のステップへ
ここまで理解できれば、あなたはもう「記録されたマクロを動かす人」ではなく、「図面をプログラムで制御するエンジニア」です。
次は、取得した属性情報をCSVやExcelに書き出す処理を組み込んでみてください。設計・製図の工数を「数時間」から「数秒」に短縮する未来が、すぐそこに待っていますよ。
何か詰まったら、いつでも戻ってきてください。コードの向こう側にいるあなたの成功を、いつも応援しています。
