こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけの自動化から一歩進み、自分だけのプログラムでAutoCADを意のままに操りたい――そう願うあなたなら、きっと今日のテーマにワクワクするはずです。
今回は、実務で絶対に役立つ「図面メタデータの外部連携」をマスターします。
図面のタイトルや設計者名、あるいは進捗状況といった「図面の裏側にある情報(カスタムプロパティ)」を抽出し、XML形式に書き出して外部の工程管理システムと同期させる手法を、伝説のチーフアーキテクトである私と一緒に紐解いていきましょう。
ここをクリアすれば、単なる「お絵かきソフト」としてのAutoCADではなく、「全社システムの一部として稼働するデータハブ」としてAutoCADを捉えられるようになります。気負わず、優しく解説していくので、一緒に一歩ずつ進んでいきましょう!
—
1. なぜ「SummaryInfo」とXML連携なのか?
私たちが普段図面を描くとき、図面枠(表題欄)に「図面番号」「設計者」「リビジョン」などを書き込みますよね。しかし、外部の進捗管理システムから「現在の全図面の進捗はどうなっている?」と問われたとき、わざわざ1枚ずつ図面を開いて目視で確認していませんか?
そんな非効率な作業は今日で終わりにしましょう。
AutoCADの裏側には、図面ファイルそのものに紐づく`Database.SummaryInfo`というメタデータ領域が存在します。ここには、標準的なプロパティ(タイトル、著者など)だけでなく、ユーザーが自由に追加できる「カスタムプロパティ」を格納できます。
これをVBAでバッチリ読み込み、外部システムが好むXML形式で出力できれば、次のような夢のようなワークフローが完成します。
- 夜間に全図面のカスタムプロパティを自動巡回してXML化
- 工程管理システムがそのXMLを自動取り込みし、ダッシュボードの進捗率を更新
この仕組みのキモとなる、AutoCADオブジェクトモデルの階層構造をまずは押さえましょう。
—
2. AutoCADオブジェクトモデルの地図
VBAで図面を操作するとき、私たちは常に「今、どこを触っているのか」の階層(コンテキスト)を意識する必要があります。
[AcadApplication] (AutoCAD本体)
│
└─> [AcadDocument] (アクティブな図面)
│
└─> [Database] (図面のデータベース本体:図形や設定の塊)
│
└─> [SummaryInfo] (図面のプロパティ・管理情報)
│
├─> 標準プロパティ (Title, Authorなど)
└─> カスタムプロパティ (ユーザー定義のキーと値)
この地図さえ頭に入っていれば、迷子になることはありません。それでは早速、この `SummaryInfo` からカスタムプロパティをごっそり抜き出し、XMLファイルとして出力する実用コードを見ていきましょう。
—
3. 実装コード:カスタムプロパティのXMLエクスポート
以下のコードを、AutoCADのVBAエディタ(`Alt + F11` で起動)の標準モジュールに貼り付けてください。実務でそのまま使えるよう、エラーハンドリングも組み込んだ堅牢な設計にしています。
Option Explicit
‘ ==============================================================================
‘ 処理名 : ExportCustomPropertiesToXML
‘ 概要 : アクティブな図面のSummaryInfoからカスタムプロパティを抽出し、
‘ 指定されたパスにXMLファイルとして出力する
‘ ==============================================================================
Public Sub ExportCustomPropertiesToXML()
On Error GoTo ErrorHandler
Dim acadDoc As AcadDocument
Dim db As AcadDatabase
Dim summaryInfo As IAcadDatabaseSummaryInfo
Dim numProps As Long
Dim i As Long
Dim key As String
Dim value As String
‘ 1. 現在アクティブなドキュメントとデータベースを取得
Set acadDoc = ThisDrawing
Set db = acadDoc.Database
Set summaryInfo = db.SummaryInfo
‘ 2. 保存先パスの決定(図面と同じフォルダに同名で拡張子を.xmlにする)
Dim xmlPath As String
If acadDoc.Path = “” {
MsgBox “この図面はまだ保存されていません。一度保存してから実行してください。”, vbExclamation, “警告”
Exit Sub
}
xmlPath = acadDoc.Path & “\” & Left(acadDoc.Name, InStrRev(acadDoc.Name, “.”) – 1) & “_meta.xml”
‘ 3. XMLファイルへの書き込み準備(FSOまたはVBのPrint #ステートメントを使用)
Dim fileNum As Integer
fileNum = FreeFile
Open xmlPath For Output As #fileNum
‘ XMLヘッダーとルート要素の書き込み
Print #fileNum, “”
Print #fileNum, “
Print #fileNum, ”
Print #fileNum, ”
Print #fileNum, ”
‘ 4. カスタムプロパティの総数を取得し、ループで全件走査
numProps = summaryInfo.NumCustomKeys
If numProps > 0 {
For i = 0 To numProps – 1
‘ キーと値のペアを取得
Call summaryInfo.GetCustomByIndex(i, key, value)
‘ XMLのノードとして出力(特殊文字のエスケープは簡略化のため割愛)
Print #fileNum, ”
Print #fileNum, ”
Print #fileNum, ”
Print #fileNum, ” ” & “
Next i
Else
Print #fileNum, ” ”
End If
‘ 5. XMLのルート要素を閉じる
Print #fileNum, ” ”
Print #fileNum, “”
‘ 6. ファイルを閉じて終了
Close #fileNum
MsgBox “XMLの書き出しが完了しました!” & vbCrLf & xmlPath, vbInformation, “成功”
Exit Sub
ErrorHandler:
If fileNum > 0 Then Close #fileNum
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “エラー”
End Sub
‘ ==============================================================================
‘ 補助関数 : XMLの特殊文字をエスケープする簡易関数
‘ ==============================================================================
Private Function EscapeXML(ByVal text As String) As String
text = Replace(text, “&”, “&”)
text = Replace(text, “<", "<")
text = Replace(text, ">“, “>”)
text = Replace(text, “”””, “"”)
text = Replace(text, “‘”, “'”)
EscapeXML = text
End Function
—
4. コードの解説:ここがプロの勘所
初心者の方が躓きやすいポイントや、実務で知っておくべき「AutoCAD特有の作法」をいくつか解説しておきます。
① `IAcadDatabaseSummaryInfo` インターフェースの取得
通常のAutoCADオブジェクトとは異なり、`SummaryInfo` はデータベースから特定のメソッドやプロパティを介して取得、あるいは直接参照します。`db.SummaryInfo` を取得することで、図面のプロパティダイアログ(「図面プロパティ」コマンド)で編集できる内容をプログラムから直接触ることができます。
② `NumCustomKeys` と `GetCustomByIndex` のコンボ
カスタムプロパティは「キー(項目名)」と「値」のペアの集まりです。
- `NumCustomKeys` で「いくつカスタムプロパティがあるか」の総数を取得し、
- `For` ループで `0` から `総数 – 1` までインデックスを指定して `GetCustomByIndex` で中身を引っ張り出す。
これが、AutoCAD VBAにおけるコレクション走査の王道パターンです。
③ 図面未保存エラーへの配慮
実務で最も多いトラブルが、「新規作成しただけでまだ保存していない図面」に対してマクロを実行し、`AcadDocument.Path` が空文字(`””`)になってファイルパス生成に失敗するケースです。コード内であらかじめ `If acadDoc.Path = “” Then` でガードを入れているのは、現場を知るエンジニアならではの配慮です。
—
5. 陥りやすい罠とトラブルシューティング
最後に、このコードを運用する上で現場で直面しがちな「罠」と、その回避策を共有しておきます。
- 罠1: 日本語キー名や値の文字化け
- 原因: VBAの標準的なファイル出力(`Open … For Output`)は環境のANSIコード(Shift-JISなど)に依存するため、外部システムがUTF-8を要求している場合に文字化けを起こします。
- 対策: 本格的なシステム連携を行う場合は、FileSystemObjectやADODB.Streamオブジェクトを使用して明示的にUTF-8エンコーディングでファイルを書き出すようにチューニングしてください。
- 罠2: プロパティが1つもない図面での挙動
- 0件のときのケア: 上記のコードでは `numProps > 0` で分岐を入れているためエラーになりませんが、これを怠ると `GetCustomByIndex` の呼び出しでインデックス範囲外エラー(実行エラー)が発生するので注意が必要です。
—
おわりに:ここをクリアすれば、AutoCAD VBAはあなたの武器になる
お疲れ様でした!今回は `AcadDocument.Database.SummaryInfo` を使ったメタデータの抽出と、外部連携の第一歩となるXML出力について解説しました。
「図面を描くだけのツール」だったAutoCADが、プログラムを介すことで「データを生み出す上流工程の強力な情報源」に変わる感覚を掴んでいただけたでしょうか。
ここをクリアできれば、次は「フォルダ内の全図面を自動で巡回して一括XML化するバッチ処理(FileSystemObjectの活用)」など、さらなる高みへ進むことができます。
あなたのAutoCAD自動化ライフが、より豊かでスマートなものになることを応援しています。それでは、次のステージでお会いしましょう!
