【テクニカル・上級編】【初心者向け】Environ関数とAcadDocument.SummaryInfoの連携:図面作成者のPCログイン名を「作成者プロパティ」に自動記録する管理マクロ – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCADの「魂」を管理せよ:SummaryInfoとEnvironが織りなすトレーサビリティの極致

AutoCADの図面管理において、最も空虚で、かつ最も重要な「誰がこの図面を触ったのか」という問い。

多くの管理者は、図枠の属性ブロックに頼るという原始的な手法を繰り返している。だが、AutoCADの真のアーキテクチャを理解する者であれば、`SummaryInfo` オブジェクトこそが図面の「真の履歴書」であることを知っているはずだ。

本稿では、`Environ` 関数と `SummaryInfo` を直結させ、図面作成者のPCログイン名を強制的にメタデータとして刻み込む、堅牢な自動スタンプ・アーキテクチャを解説する。

1. なぜ「属性ブロック」では不十分なのか

属性ブロックはあくまで図面上の「図形」に過ぎない。画層をオフにすれば隠れ、誤って削除すれば履歴は消失する。対して `SummaryInfo` は、DWGファイルそのもののプロパティ(メタデータ)として格納される。

これはAutoCADの内部オブジェクトモデルの深層に位置しており、外部システム(AutoLISPやC#、あるいは単純なファイルプロパティ抽出ツール)から直接参照可能だ。ここを自動化することは、図面管理の自動化における「最初の関門」である。

2. 実装:プロフェッショナルのための自動スタンプ・コード

単にプロパティを書き込むだけなら誰にでも書ける。だが、メモリ管理とエラーハンドリングを怠れば、レガシーなAutoCAD環境ではメモリリークや不安定な挙動を引き起こす。以下のコードは、オブジェクトをスタックから確実に解放し、例外を制御する設計となっている。

Option Explicit

”’

”’ 図面プロパティに作成者情報を書き込むプロシージャ
”’ 伝説的エンジニアの流儀:オブジェクトは使い捨てない、確実に閉じる。
”’

Public Sub StampDocumentCreator()
Dim acadDoc As AcadDocument
Dim info As AcadSummaryInfo
Dim userName As String

‘ 1. 環境変数からログイン名を取得
‘ Environ(“USERNAME”)はWindows APIを直接叩くよりも高速で枯れた技術
userName = Environ(“USERNAME”)

If userName = “” Then userName = “Unknown_User”

‘ 2. 現在のドキュメントにアクセス
Set acadDoc = ThisDrawing

‘ 3. SummaryInfoオブジェクトへのアクセス
‘ ここでエラーハンドリングを挟むのは、図面が読み取り専用等の可能性を考慮するため
On Error Resume Next
Set info = acadDoc.SummaryInfo

If Err.Number <> 0 Then
MsgBox “SummaryInfoへのアクセスに失敗しました。”, vbCritical
Exit Sub
End If
On Error GoTo 0

‘ 4. 「作成者」プロパティの更新
‘ 既存の情報を上書きするこの行為は、トレーサビリティの「強制」である
info.Author = userName

‘ 5. メモリの明示的解放
‘ VBAのガベージコレクションを待つ必要はない。即座に開放せよ。
Set info = Nothing
Set acadDoc = Nothing

Debug.Print “Stamp applied for: ” & userName
End Sub

3. シニアエンジニアが意識すべき「深淵」

メモリのライフサイクル管理

VBAはCOMベースの言語だ。`Set obj = Nothing` を軽視するエンジニアは、AutoCADのインスタンスを数時間操作しただけで、メモリ肥大化という「時限爆弾」を抱えることになる。特に、数百枚の図面を連続処理するバッチ処理を組む場合、`Set` の明示的解放はパフォーマンスの生命線だ。

環境変数 `Environ` の脆弱性と対策

`Environ(“USERNAME”)` は確かに便利だが、システム管理者が環境変数を変更している可能性を考慮すべきだ。より厳格な要件が求められる場合、Windows APIの `GetUserName` をコールし、C言語ライクな文字列バッファ処理を行う必要がある。だが、通常の業務自動化であれば、このレベルの抽象化で十分だ。

システム間連携への布石

この `SummaryInfo` に情報を書き込んでおけば、将来的にC#やPythonで「全図面から作成者リストを抽出するレポート生成ツール」を作成する際、AutoCADを起動することなく、`ObjectDBX` を通じて高速にデータを抽出できる。

結び:技術は「仕組み」に宿る

「誰がいつ触ったか」を人間が意識するな。すべてをコードに任せ、自動化の網を張り巡らせる。それこそが、AutoCADのレガシー環境を現代の自動化ワークフローへと脱皮させる唯一の道だ。

コードを書き終えたら、次はこれを `Document_BeginSave` イベントにフックさせるか、あるいは図面オープン時に実行される `AcadDocument_Activate` に忍ばせてみてほしい。図面を開くたびに、そこには「管理者の意思」が静かに刻まれることになる。

技術とは、魔法ではない。積み重ねられた、正確なコードの集積だ。健闘を祈る。

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