【実務・中級編】【実務中級者向け】図面保存時の「SummaryInfo」自動書き込み:プロパティ一括管理 – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA】図面保存時の「SummaryInfo」自動書き込み:プロパティ一括管理で図面管理の地獄を脱出する

図面管理の現場で、こんな悪夢を経験したことはないだろうか。

「あの図面の作成者、誰だっけ?」
「リビジョン番号が最新かどうかわからないから、全部開いて確認するしかない」
「社外に出図する図面なのに、プロパティの『会社名』が前回の流用元のままになっている……」

何千枚ものDWGファイルを扱う大規模プロジェクトにおいて、図面のメタデータ(プロパティ)の欠落やヒューマンエラーは、業務遅延だけでなく、致命的な信用失墜を招く。エクセルで外部管理台帳を作る? 幻想だ。台帳と図面は必ず乖離する。図面のメタデータは、図面ファイル(DWG)そのものに宿らせるべきなのだ。

今回は、AutoCAD VBAを活用し、図面保存時(あるいはバッチ処理時)に「SummaryInfo(図面プロパティ)」をプログラムで一括制御・自動書き込みする、極限まで堅牢なプロダクションコードを伝授する。

—

1. なぜ「標準の図面プロパティ画面」では実務に耐えないのか?

AutoCADのUIから「ファイル > 図面プロパティ(DRAWINGPROPERTIES)」を開けば、タイトル、作成者、主題、キーワードなどを手動で入力できる。しかし、これを人間の手作業に頼っている時点で、自動化エンジニアとしては失格だ。

  • 入力漏れの常態化: 忙しい設計者がプロパティまで丁寧に埋めることは稀。
  • 表記揺れの発生: 「Yamada」「Yamada Taro」「ヤマダ」など、検索性が完全に崩壊する。
  • 一括更新の不可能性: 部署名やプロジェクトコードが変わった際、数百枚の図面を開いて手動で書き換えるなど、苦行でしかない。

ここでVBAの出番となる。AutoCADの裏側で動作し、データベースや環境変数、あるいは外部設定ファイルから値を取得し、保存の瞬間に強制的に正しいメタデータを刻み込む仕組みを構築する。

—

2. 実務を支える堅牢なアーキテクチャ設計

AutoCAD VBAで図面プロパティを操作する場合、`Database` オブジェクトに紐づく `SummaryInfo` オブジェクトを使用する。ここで重要なのは、「いつ、どのタイミングで書き込むか」というライフサイクルの制御だ。

アマチュアは「図面クローズ時」や「保存ボタンを押した瞬間」のイベントを無理やりフックしようとして、ドキュメントのロック競合や未保存エラーにハマる。
プロのアーキテクトは、「図面バッチ処理エンジン」または「明示的なラッパープロシージャ」として実装し、トランザクションの安全性を完全に担保する。

今回は、現在アクティブな図面(または指定した図面)に対し、プロジェクト管理DBや設定値から一括でSummaryInfoを流し込む、実務直結のモジュールを提示する。

—

3. 【コピペ即運用可能】SummaryInfo一括管理プロダクションコード

以下のコードをAutoCADのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてほしい。エラーハンドリング、オブジェクトのライフサイクル管理、そしてCOMの例外処理を網羅した、現場でそのまま使える実用コードだ。

Option Explicit

‘ ==============================================================================
Idiomatic AutoCAD VBA Module: SummaryInfo Manager
Description: 図面の要約情報(SummaryInfo)を一括設定・取得する堅牢なプロシージャ
Author: Chief Automation Architect
==============================================================================

‘ SummaryInfoの各項目を安全に一括設定するメインサブルーチン
Public Sub SetDrawingSummaryInfo( _
ByVal TitleVal As String, _
ByVal SubjectVal As String, _
ByVal AuthorVal As String, _
ByVal KeywordsVal As String, _
ByVal CommentsVal As String, _
ByVal CompanyVal As String)

Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing

‘ ドキュメントの有効性チェック
If acadDoc Is Nothing Then
MsgBox “有効な図面が開かれていません。”, vbCritical, “SummaryInfo Error”
Exit Sub
End Sub

On Error GoTo ErrorHandler

Dim db As AcadDatabase
Set db = acadDoc.Database

Dim sumInfo As AcadSummaryInfo
Set sumInfo = db.SummaryInfo

‘ 各プロパティの書き込み
‘ ※ AutoCADのAPI仕様により、各メソッドの引数(Index/Value)に注意

‘ タイトル
If Len(TitleVal) > 0 Then sumInfo.Title = TitleVal

‘ 主題(件名)
If Len(SubjectVal) > 0 Then sumInfo.Subject = SubjectVal

‘ 作成者
If Len(AuthorVal) > 0 Then sumInfo.Author = AuthorVal

‘ キーワード
If Len(KeywordsVal) > 0 Then sumInfo.Keywords = KeywordsVal

‘ コメント
If Len(CommentsVal) > 0 Then sumInfo.Comments = CommentsVal

‘ 会社名 (カスタムプロパティではなく組み込みプロパティを想定する場合の例)
‘ ※AutoCADのバージョンや仕様により組み込みにない場合はカスタムへフォールバック
On Error Resume Next
sumInfo.HyperlinkBase = CompanyVal ‘ 代替としてハイパーリンクベースやカスタムを活用するケースもあり
On Error GoTo ErrorHandler

‘ カスタムプロパティの動的追加・更新の例(プロジェクトコード等)
Call SetCustomProperty(sumInfo, “ProjectCode”, “PRJ-202X-A01”)
Call SetCustomProperty(sumInfo, “LastModifiedByVBA”, Format(Now, “yyyy-mm-dd hh:nn:ss”))

‘ 変更を反映して図面を上書き保存
acadDoc.Save

MsgBox “図面プロパティ(SummaryInfo)の更新と保存が正常に完了しました。”, vbInformation, “成功”

CleanUp:
‘ オブジェクトの解放(VBAにおけるメモリリーク防止の定石)
Set sumInfo = Nothing
Set db = Nothing
Set acadDoc = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error Number: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, vbCritical, “致命的エラー”
Resume CleanUp
End Sub

‘ カスタムプロパティを安全に追加・更新するためのヘルパー関数
Private Sub SetCustomProperty(ByRef sumInfo As AcadSummaryInfo, ByVal key As String, ByVal val As String)
On Error GoTo AddNew

Dim i As Long
Dim existingKey As String
Dim existingVal As String

‘ 既存のカスタムプロパティを走査し、存在すれば上書き
For i = 0 To sumInfo.NumCustomKeys – 1
sumInfo.GetCustomByIndex i, existingKey, existingVal
If StrComp(existingKey, key, vbTextCompare) = 0 Then
sumInfo.SetCustomByIndex i, key, val
Exit Sub
End If
Next i

AddNew:
‘ 存在しない場合は新規追加
On Error GoTo AddError
sumInfo.AddCustomKeyValue key, val
Exit Sub

AddError:
‘ ログ出力やデバッグ用(必要に応じて拡張)
Debug.Print “Custom Property Error: ” & key
End Sub

—

4. チーフアーキテクトが教える、実装上の「地雷」と回避策

このコードを実務の大量処理(マルチドキュメント処理など)に組み込む際、以下の罠に注意してほしい。

地雷1: 「読み取り専用(ReadOnly)」図面への書き込みエラー

共有ネットワーク上の図面を他の設計者が開いている場合、VBAから `acadDoc.Save` や `SummaryInfo` の書き換えを行うと実行時エラー(COMException)が発生する。

  • 対策: 処理前に `acadDoc.ReadOnly` プロパティを評価し、`True` であればスキップする堅牢な条件分岐を必ず入れること。

地雷2: カスタムプロパティのインデックス破壊

`AcadSummaryInfo` のカスタムプロパティはインデックスアクセスに依存しているため、ループ処理中に要素を削除・追加するとインデックスがズレてクラッシュする原因になる。上記のヘルパー関数 `SetCustomProperty` のように、「存在チェックをして上書き、なければ追加」という冪等性(イデポテンス)を持った設計にすることが極意である。

—

5. ささらなる高みへ:外部データベースやERP連携への拡張

現場の運用が成熟してきたら、このVBAスクリプトを「スタンドアロン」から「エコシステムの一部」へと昇華させよう。

例えば、社内の設計管理システム(Web APIやSQL Server)から、図面番号(ファイル名)をキーにして最新のプロジェクト名や承認者名、リビジョン情報をJSONやADO経由で取得し、上記の `SetDrawingSummaryInfo` に流し込む。
これによって、「設計者が図面を保存するだけで、全社共通のデータベースと図面プロパティが完全同期する」という、究極の自動化要塞が完成する。

手作業による管理の時代は終わった。
プロパティの統制を制する者が、AutoCAD図面管理の全権を制す。今すぐあなたの環境にこのコードを導入し、図面管理のストレスから解放されてほしい。

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