AutoCAD VBAの深淵へ:動的ブロックを「コード」で操り、設計自動化の壁を超える
こんにちは。AutoCADの自動化の現場で、長年コードを書き続けてきた者です。
「マクロの記録」ボタンを押して、生成されたコードを眺めて「なるほど、これが自動化か」と納得している段階は、実はまだ入り口に過ぎません。AutoCAD VBAの真の力は、図面上の「生きているオブジェクト(ダイナミックブロック)」を、論理的に制御することにあります。
今回は、多くのエンジニアが躓き、そしてここを突破することで「脱・初心者」を果たせる「ダイナミックブロックの動的プロパティ操作」について、プロフェッショナルの視点から解説します。
—
1. なぜ「動的プロパティ」の操作が難しいのか?
通常のブロック(AcadBlockReference)は、位置や回転といった「固定プロパティ」しか持ちません。しかし、ダイナミックブロックは違います。内部に「カスタムプロパティ(Distance, Angle, Flipなど)」を隠し持っています。
初心者の方が陥る罠は、「オブジェクトのプロパティウィンドウに表示されている項目を、どうやってVBAのコードから指定すればいいか分からない」という点です。
これを解決する鍵は、`GetDynamicBlockProperties` メソッドにあります。
—
2. 核心:ダイナミックブロックを制御する作法
ダイナミックブロックのプロパティは、通常のプロパティとは異なる配列として管理されています。以下のステップを踏むのが、伝説的なアーキテクト流の「確実な操作法」です。
1. BlockReference オブジェクトを取得する
2. `GetDynamicBlockProperties` を呼び出し、プロパティの配列を取得する
3. 配列をループし、操作したい「プロパティ名」と一致するものを特定する
4. `Value` プロパティに新しい値を代入する
実践:ダイナミックブロックの「長さ」をコードで書き換える
以下のコードは、選択したダイナミックブロックの「距離(Distance1)」というプロパティを、プログラムから強制的に書き換えるサンプルです。
Public Sub UpdateDynamicBlockProperty()
Dim objSel As AcadObject
Dim objBlockRef As AcadBlockReference
Dim dynProps As Variant
Dim i As Integer
‘ 1. オブジェクトを選択
On Error Resume Next
ThisDrawing.Utility.GetEntity objSel, pt, “ダイナミックブロックを選択してください:”
If TypeOf objSel Is AcadBlockReference Then
Set objBlockRef = objSel
‘ 2. ダイナミックブロックかどうか確認
If objBlockRef.IsDynamicBlock Then
‘ 3. 動的プロパティの配列を取得
dynProps = objBlockRef.GetDynamicBlockProperties
‘ 4. 配列をループして目的のプロパティを探す
For i = LBound(dynProps) To UBound(dynProps)
‘ プロパティ名を確認(ブロック定義側の名前に注意!)
If dynProps(i).PropertyName = “距離1” Then
‘ 5. 値を更新(型に注意:ここではDoubleを指定)
dynProps(i).Value = 500.0
‘ 更新を反映させるために再描画
objBlockRef.Update
MsgBox “プロパティを更新しました。”
Exit For
End If
Next i
Else
MsgBox “選択したオブジェクトはダイナミックブロックではありません。”
End If
End If
End Sub
—
3. ここをクリアすれば一人前:開発者が知るべき「3つの注意点」
コードを動かすだけなら上記で十分ですが、現場で「止まらないコード」を書くには以下の知見が不可欠です。
① プロパティ名の「表示名」と「内部名」の乖離
AutoCADの画面上で見えている名前と、VBAが認識する `PropertyName` が異なる場合があります。もし上記のコードでプロパティが見つからない場合は、一度ループ内で `Debug.Print dynProps(i).PropertyName` を実行し、コンソールで正確な文字列を確認してください。
② 値の型(Variant型)への配慮
動的プロパティの `Value` は `Variant` 型です。数値(Double)だけでなく、文字列や列挙値(Flipなら0か1)が入ることもあります。予期せぬ型を代入するとエラーで落ちますので、代入前に `TypeName(dynProps(i).Value)` で型を確認する習慣をつけましょう。
③ 隠れた「読み取り専用」プロパティ
一部のプロパティは、ダイナミックブロックの制約によって「読み取り専用」になっていることがあります。`dynProps(i).ReadOnly` を事前にチェックするロジックを組むのが、堅牢なシステムを構築するエンジニアの作法です。
—
最後に:自動化は「道具」ではなく「思考」
ダイナミックブロックを制御できるようになると、AutoCADは単なる製図ソフトから、「設計意図をコードで実装するプラットフォーム」へと変貌します。
今回紹介したコードは、単なるプロパティの変更ですが、これを「Excelの表データから読み込んで、図面を一括生成する」といった処理に組み込めば、数時間のルーチンワークを数秒で終わらせることが可能です。
「コードを書くこと」に満足せず、「どうすれば図面の保守性が高まるか?」という視点を常に持ち続けてください。その先には、誰も見たことのない効率的な設計環境が待っています。
何か分からないことがあれば、いつでも聞いてください。一緒に、設計の未来をコードで切り拓いていきましょう。
