こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して図形をポチポチ描かせるだけの自動化から、一歩先の世界へ踏み出そうとしているあなたへ、今日はとてもエキサイティングなテーマを用意しました。
私たちが普段画面で見ている「線」や「文字」……実はあれは、図面という名のキャンバスに描かれた表側の顔にすぎません。
その裏側には、図面を支える「非グラフィカルデータ(定義データ)」という重要な裏方たちが控えています。
今回は、この裏方たち——具体的には「線種(Linetype)」と「文字スタイル(TextStyle)」にスポットライトを当て、これらをVBAで自由自在に操る方法を授けましょう。ここをクリアすれば、あなたのAutoCAD VBAの基礎力は本物のエンジニアの領域に到達します。さあ、一緒に扉を開けましょう!
—
1. 「非グラフィカルデータ」ってなに? なぜそれが重要なの?
AutoCADの図面(`AcadDocument`)を開いたとき、画面には何も描かれていなくても、裏では「ByLayer」や「Continuous」といった線種や、「Standard」という文字スタイルが最初から用意されていますよね。
これらは画面上に「座標を持つ図形(LineやCircleなど)」としては存在しません。しかし、図面を形作るための「辞書データ」として、メモリの深くにしっかりと息づいています。これが「非グラフィカルデータ」です。
実務でこんな悩みにぶつかったことはありませんか?
- 「外部からもらった図面、使われていないゴミみたいな文字スタイルが多すぎてパージできない……」
- 「指定した線種が図面内にちゃんと存在するか、一括でチェックしたい」
これらを人の目や手作業でやろうとしたら、気が遠くなりますよね。
だからこそ、VBAの出番です。コレクションをループで総なめにし、裏側のデータを掌握する技術を身につけましょう。
—
2. オブジェクトモデルの構造を覗いてみよう
AutoCAD VBAの頂点には `AcadApplication` があり、その下に現在アクティブな図面である `AcadDocument` がぶら下がっています。
そして、非グラフィカルデータにアクセスするための「専用の棚(コレクション)」が、それぞれDocumentオブジェクトの直下に用意されています。
- 線種の棚:`ThisDrawing.Linetypes`
- 文字スタイルの棚:`ThisDrawing.TextStyles`
この「棚」から、一つひとつのアイテム(`AcadLinetype` や `AcadTextStyle`)を取り出して調べるのが、基本のループ処理となります。
—
3. 【実践】図面内のすべての線種と文字スタイルを暴き出せ!
まずは、現在開いている図面に「どんな線種」と「どんな文字スタイル」が定義されているのか、イミディエイトウィンドウにリストアップするコードを書いてみましょう。
以下のコードをVBAエディタ(Alt + F11)の標準モジュールに貼り付けて実行してみてください。
Sub ListNonGraphicalData()
‘ —————————————————————–
‘ 目的: 図面内に定義されているすべての線種と文字スタイルを列挙する
‘ 対象: 初学者〜中級者向け
‘ —————————————————————–
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
Dim lt As AcadLinetype
Dim ts As AcadTextStyle
‘ — 1. 線種(Linetypes)の列挙 —
Debug.Print “========== 【線種 (Linetype) 一覧】 ==========”
‘ CollectionをFor Eachで回す王道のパターン
For Each lt In acadDoc.Linetypes
‘ 名前のほかに、説明文(Description)も取得できます
Debug.Print “線種名: ” & lt.Name & ” / 説明: ” & lt.Description
Next lt
Debug.Print vbCrLf ‘ 改行を挿入
‘ — 2. 文字スタイル(TextStyles)の列挙 —
Debug.Print “========== 【文字スタイル (TextStyle) 一覧】 ==========”
For Each ts In acadDoc.TextStyles
‘ フォント名や、縦書きフラグなども取得可能です
Debug.Print “スタイル名: ” & ts.Name & ” / フォントファイル: ” & ts.FontFile
Next ts
MsgBox “イミディエイトウィンドウに出力完了しました! (Ctrl + G で確認)”, vbInformation, “完了”
End Sub
💡 ここがエンジニアの急所:コードのポイント解説
- `For Each … In …` 構文: AutoCADのコレクションを操作するときの基本中の基本です。インデックス(0, 1, 2…)を自分で管理する必要がなく、安全かつスマートに全要素にアクセスできます。
- `ThisDrawing`: 現在アクティブな図面を指すショートカットオブジェクトです。わざわざ変数に `Set doc = Application.ActiveDocument` と書かなくても動くので、覚えておくと非常に便利です。
—
4. さらに一歩進む:未使用の文字スタイルを特定するロジック
「ただ一覧を出すだけじゃ物足りない!」という探究心旺盛なあなたのために、実務で直結するテクニックを教えましょう。
図面内にあるすべての文字スタイルをループし、「もし、そのスタイルが現在どの文字図形からも使われていなければ、『未使用』と判定する」という、ちょっと高度な判定処理です。
……と言いたいところですが、ここでAutoCAD VBAにおける「最大の罠(注意点)」をお伝えしなければなりません。
⚠️ 陥りやすいエラーと知見:オブジェクトのライフサイクルと参照
AutoCADにおいて、あるスタイルや画層(Layer)が「使われているかどうか」を正確に判定するには、ModelSpaceやPaperSpace、果てはブロック定義の中にあるすべての図形(AcadTextやAcadMText)を総なめにし、`StyleName` プロパティが一致するかどうかを総当たりでチェックする必要があります。
さらに、`Standard` や `ByLayer` のような、絶対に削除してはいけないシステム予約済み項目を除外するガードロジックも必須です。
ここでは、その概念をシンプルにした「安全な列挙とチェックの骨組み」を見てみましょう。
Sub CheckUnusedTextStyles()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
Dim ts As AcadTextStyle
Dim isUsed As Boolean
Dim ent As AcadEntity
Debug.Print “=== 文字スタイルの使用状況チェック ===”
For Each ts In acadDoc.TextStyles
isUsed = False ‘ 初期化
‘ 予約されている標準スタイルはスキップする親切設計
If UCase(ts.Name) = “STANDARD” Then
Debug.Print ” -> [” & ts.Name & “] はシステム標準のためスキップします。”
GoTo ContinueLoop
End If
‘ モデル空間の図形を総当たりしてチェック
For Each ent In acadDoc.ModelSpace
‘ オブジェクトが「文字(Text)」または「マルチテキスト(MText)」か判定
If TypeOf ent Is AcadText Then
If ent.StyleName = ts.Name Then
isUsed = True
Exit For ‘ 見つかったらループを抜け出す(パフォーマンス最適化!)
End If
ElseIf TypeOf ent Is AcadMText Then
If ent.StyleName = ts.Name Then
isUsed = True
Exit For
End If
End If
Next ent
‘ 判定結果の出力
If isUsed Then
Debug.Print ” [使用中] ” & ts.Name
Else
Debug.Print ” [★未使用] ” & ts.Name & ” -> 削除候補です!”
End If
ContinueLoop:
Next ts
End Sub
🧠 プロのエンジニアからのアドバイス
上記のコードを見て、「お、`Exit For` を使って無駄なループを回さないように最適化しているな」と気づいたあなたは素晴らしいセンスの持ち主です。
非グラフィカルデータとグラフィカルデータを組み合わせる処理は、図面が重くなればなるほど処理ループの負荷が跳ね上がります。
「どのコレクションを走査し、どこで枝刈り(最適化)すべきか」を意識するだけで、マクロの実行速度は劇的に変わります。
—
おわりに:ここをクリアすれば、あなたはもう初心者ではない
お疲れ様でした!今回は、図面の裏側にある「非グラフィカルデータ」であるLinetypesやTextStylesのアクセス方法と、実務的なループ処理について解説しました。
画面に見える図形をいじるだけでなく、「図面のルールや定義そのものをプログラムで読み解き、操作する」という感覚がつかめましたか?
ここをクリアできたあなたなら、レイヤーの自動生成や、画層状態の管理、画一的な図面基準のチェックツールなども、自力で開発できる素地が十分につきています。
基礎をマスターした次は、ぜひあなたの業務の課題にこのコードを応用してみてください。
「ここがちょっと分からない」「こんな応用はできる?」といった疑問があれば、いつでもまたこの扉を叩いてくださいね。
それでは、快適なAutoCAD VBAライフを!
