AutoCAD VBAで「管理の神」になる:オブジェクトに連番を刻み込む極意
こんにちは。AutoCADの自動化という深淵な世界へようこそ。
「マクロの記録」ボタンを押すだけのエンジニアは卒業しましょう。今日皆さんが学ぶのは、AutoCADの魂である「オブジェクトモデル」を操作し、図面上の図形に「意思(管理番号)」を吹き込む技術です。
今回は、設備機器や配管などの図形に対し、自動で連番を振り、それを図面の深淵である「カスタムプロパティ」に書き込むソリューションを伝授します。
—
1. AutoCADオブジェクトモデルの「階層構造」を理解する
まず、AutoCADを操るための「地図」を頭に入れましょう。
- `AcadApplication`: AutoCADそのもの。すべての頂点。
- `AcadDocument`: 開いている図面ファイル。
- `ModelSpace`: 実際に線や円が描かれている「キャンバス」。
これらを操作する際、「今、誰を触っているのか?」を常に意識することが、バグのないコードを書く唯一の道です。
—
2. なぜ「カスタムプロパティ」に保存するのか?
多くの初学者は、文字図形として番号を画面上に書き出そうとします。しかし、それは「管理」としては脆弱です。文字が移動したり、誤って消されたりするリスクがあるからです。
真のエンジニアは、図形そのものが持つデータ領域(XDataやカスタムプロパティ)に情報を刻みます。今回は、図面全体で管理する「連番」を扱うため、`SummaryInfo` オブジェクトを活用します。
—
3. 実践コード:自動連番付与システム
以下のコードは、選択したオブジェクトに連番を付与し、その情報を図面内に保持するプロフェッショナルな設計です。
Option Explicit
‘ 選択したオブジェクトに連番を付与するメインルーチン
Public Sub AssignSequenceNumber()
Dim obj As AcadObject
Dim pickPt As Variant
Dim seqKey As String
Dim currentSeq As Integer
‘ 1. シーケンス番号の管理用キー(カスタムプロパティ名)
seqKey = “Equipment_Sequence_No”
‘ 2. 現在の連番をドキュメントのカスタムプロパティから取得
currentSeq = GetNextSequence(seqKey)
‘ 3. ユーザーに図形を選択させる
On Error Resume Next
ThisDrawing.Utility.GetEntity obj, pickPt, “連番を付与するオブジェクトを選択してください”
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
‘ 4. オブジェクトの拡張データ領域に番号を書き込む(例としてHandleを使用)
‘ ※本番環境ではここにXData(拡張データ)を用いるのが定石
Debug.Print “オブジェクト[” & obj.Handle & “]に番号[” & currentSeq & “]を割り当てました。”
‘ 5. 連番をインクリメントして保存
SaveNextSequence seqKey, currentSeq + 1
MsgBox “連番 ” & currentSeq & ” を付与しました。”
End Sub
‘ カスタムプロパティから次番号を取得する関数
Private Function GetNextSequence(key As String) As Integer
Dim info As AcadSummaryInfo
Set info = ThisDrawing.SummaryInfo
Dim val As String
info.GetCustomByKey key, val
‘ プロパティが未定義なら1から開始
If val = “” Then
GetNextSequence = 1
Else
GetNextSequence = CInt(val)
End If
End Function
‘ 次番号をカスタムプロパティに保存する関数
Private Sub SaveNextSequence(key As String, val As Integer)
Dim info As AcadSummaryInfo
Set info = ThisDrawing.SummaryInfo
‘ 既に存在すれば削除して再追加(更新)
On Error Resume Next
info.RemoveCustomByKey key
On Error GoTo 0
info.AddCustomInfo key, CStr(val)
End Sub
—
4. プロの視点:陥りやすい罠と対策
このコードを書いていく中で、必ず突き当たる壁があります。
① 「オブジェクトが選択できない!」というエラー
`GetEntity` メソッドを使う際、ユーザーが何も選択せずにEnterを押すとエラーが発生します。`On Error Resume Next` で適切にエラーハンドリングを行い、プログラムが不自然に落ちないようにするのが礼儀です。
② プロパティの重複エラー
`info.AddCustomInfo` は、既に存在するキーに対して実行するとエラーを吐きます。上記コードのように、一度 `RemoveCustomByKey` を経由する「更新処理」の設計が不可欠です。
③ 「連番」の排他制御(発展編)
複数人で図面を編集する場合、同時に番号を取得すると「番号の重複」が起こります。実務では「誰が今どの番号を使ったか」をログファイルに出力するか、データベースと連携させる必要があります。
—
最後に:自動化は「設計」である
コードを書くことは、単なる命令ではありません。「図面の中に、どのような秩序を持ち込むか」という設計そのものです。
今回紹介した「カスタムプロパティによる管理」は、AutoCADの標準機能を超えた、あなただけの独自ワークフローを構築する第一歩です。ここをクリアすれば、次は「図面を閉じる際に自動でチェックを行う」といった、より高度なイベント駆動型のプログラミングへとステップアップできます。
さあ、恐れずにエディタを開いてください。あなたの書いたコードが、図面の中に永遠に刻まれる「番号」を管理し始めるのですから。
何かあれば、いつでも相談してくださいね。応援しています!
