【実務・中級編】【初心者向け】図面内の「非グラフィカルデータ」にアクセス!LinetypesやTextStylesコレクションの列挙と基本操作 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは。チーフアーキテクトの私だ。
日々のCADオペレーション業務を自動化するにあたり、君たちは「線の長さの計算」や「レイヤーの自動作成」といったグラフィカルデータ(目に見える図形)の操作ばかりに気を取られてはいないだろうか?

実務の現場において、本当に厄介な問題を引き起こすのは、図面の裏側にひっそりと隠れている「非グラフィカルデータ(シンボルテーブル)」の肥大化とカオス化だ。

今回は、AutoCAD VBAの真髄である「コレクションの走査と管理」にスポットを当て、線種(Linetypes)や文字スタイル(TextStyles)の構造を完全に掌握する方法を伝授する。

1. なぜ「非グラフィカルデータ」の管理が実務で重要なのか?

AutoCADの図面(DWG)は、単なる線の集まりではない。背後には「線種」「文字スタイル」「画層」「寸法スタイル」といった定義情報のデータベース(シンボルテーブル)が存在している。

特に、他社から受領した図面や、長年改修を重ねた図面を思い浮かべてほしい。

  • 「なんかこの図面、やたらとファイルサイズが重い……」
  • 「文字スタイルを開こうとしたら、見慣れない変なフォント名がズラリと並んでいる……」

これらはすべて、誰も使っていない不要な非グラフィカルデータが蓄積されていることが原因だ。
手動でこれらを整理するのは時間の無駄であり、ヒューマンエラーの温床となる。ここで我々エンジニアがVBAを使って、一瞬でこれをクレンジングする自動化ツールを構築すべきなのだ。

2. AutoCADオブジェクトモデルの構造的罠

ここで、初心者が必ずハマるAutoCAD VBA特有のトラップについて触れておこう。

Excel VBAの感覚でコードを書くと痛い目を見る。
Excelのワークシートやセルは `ActiveSheet.Cells` のように直接参照・変更が容易だが、AutoCADの `AcadDocument` に紐付くコレクション(`Linetypes`, `TextStyles`, `Layers` など)は、「データベースのポインタを直接叩いている」という意識が必要だ。

特にコレクションの走査(ループ処理)を行う際、オブジェクトの削除や変更を伴う処理を適当に書くと、メモリリークや致命的なクラッシュ(Access Violation)を引き起こす。
これから提示するコードは、プロの現場でも耐えうる堅牢なエラーハンドリングと、安全なコレクション走査のパターンを実装している。

3. 【プロダクションコード】未使用スタイルを特定・列挙する堅牢なツール

以下のコードは、現在の図面データベースにアクセスし、登録されているすべての「文字スタイル(TextStyle)」と「線種(Linetype)」をイテレートし、それぞれが図面内で実際に使用されているかどうかを判定する実用スクリプトだ。

余計な解説は不要だな。コードそのものが雄弁に語るはずだ。

Option Explicit

‘ ==============================================================================
‘ 処理名: 資産管理・クレンジング支援ツール
‘ 概要: 図面内の非グラフィカルデータ(TextStyles / Linetypes)を走査し、
‘ 未使用の項目をイミディエイトウィンドウに列挙する。
‘ 著者: チーフアーキテクト
‘ ==============================================================================
Public Sub AuditNonGraphicalData()
‘ 1. エラーハンドリングの要件定義
On Error GoTo ErrorHandler

Dim doc As AcadDocument
Set doc = ThisDrawing.Application.ActiveDocument

‘ 実行開始のログ
Debug.Print “==========================================”
Debug.Print ” 非グラフィカルデータ 監査レポート”
Debug.Print ” 対象図面: ” & doc.Name
Debug.Print “==========================================”

‘ 2. 文字スタイル(TextStyles)の監査
Call AuditTextStyles(doc)

‘ 3. 線種(Linetypes)の監査
Call AuditLinetypes(doc)

Debug.Print “==========================================”
Debug.Print ” 監査が正常に完了しました。”
Debug.Print “==========================================”
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “AutoCAD VBA 実行エラー”
End Sub

‘ ——————————————————————————
‘ 文字スタイルの使用状況チェック
‘ ——————————————————————————
Private Sub AuditTextStyles(ByVal targetDoc As AcadDocument)
Dim ts As AcadTextStyle
Dim styleName As String
Dim isUsed As Boolean
Dim ent As AcadEntity

Debug.Print “[文字スタイル (TextStyles) 監査開始]”

For Each ts In targetDoc.TextStyles
styleName = ts.Name
isUsed = False

‘ デフォルトスタイル(Standard等)は原則としてスキップ対象とする場合もあるが、
‘ 今回は全数チェックを行う。

‘ 図面内の全エンティティを走査して参照をチェック
‘ ※大規模図面ではパフォーマンスに影響するため、実務ではSelectionSet等のフィルタリングを推奨
For Each ent In targetDoc.ModelSpace
If TypeOf ent Is AcadText Then
If CType_Text(ent).StyleName = styleName Then
isUsed = True
Exit For
End If
ElseIf TypeOf ent Is AcadMText Then
If CType_MText(ent).StyleName = styleName Then
isUsed = True
Exit For
End If
End If
Next ent

‘ 結果の出力
If isUsed Then
Debug.Print ” [使用中] ” & styleName
Else
Debug.Print ” [未使用] ” & styleName & ” -> 削除候補”
End If
Next ts
Debug.Print “”
End Sub

‘ ——————————————————————————
‘ 線種の使用状況チェック
‘ ——————————————————————————
Private Sub AuditLinetypes(ByVal targetDoc As AcadDocument)
Dim lt As AcadLinetype
Dim ltName As String
Dim isUsed As Boolean
Dim ent As AcadEntity

Debug.Print “[線種 (Linetypes) 監査開始]”

For Each lt In targetDoc.Linetypes
ltName = lt.Name
isUsed = False

‘ ByLayerやByBlock、標準線種(Continuousなど)の特例処理
If UCase(ltName) = “BYLAYER” Or UCase(ltName) = “BYBLOCK” Or UCase(ltName) = “CONTINUOUS” Then
isUsed = True
Else
‘ エンティティのLinetypeプロパティを走査
For Each ent In targetDoc.ModelSpace
If ent.Linetype = ltName Then
isUsed = True
Exit For
End If
Next ent
End If

‘ 結果の出力
If isUsed Then
Debug.Print ” [使用中] ” & ltName
Else
Debug.Print ” [未使用] ” & ltName & ” -> 削除候補”
End If
Next lt
Debug.Print “”
End Sub

‘ ヘルパー関数: 型安全性を高めるためのキャスト(VBAにおける擬似的な実装)
Private Function CType_Text(ByVal ent As AcadEntity) As AcadText
Set CType_Text = ent
End Function

Private Function CType_MText(ByVal ent As AcadEntity) As AcadMText
Set CType_MText = ent
End Function

4. チーフアーキテクトからの実務アドバイス

上記のコードをそのまま巨大な図面(例えば、数十万要素を含むプラント図面など)で実行すると、モデル空間の全走査ループ(`For Each ent In targetDoc.ModelSpace`)がボトルネックとなり、処理がフリーズしたような状態になる

実務でこれをスケールさせるための極意を授けよう。

1. SelectionSet(選択セット)の活用
もし特定の画層や特定のタイプだけに絞る必要があれば、モデル空間全体を舐めるのではなく、`SelectionSet` をフィルター付きで生成し、メモリ上で高速に判定せよ。
2. パージ(Purge)コマンドとの組み合わせ
未使用のオブジェクトをVBA側で個別に `.Delete` メソッドで消去しようとすると、依存関係(他のオブジェクトから参照されている等)でエラーを吐くことが多い。
AutoCADには強力なビルトインコマンドである `_.PURGE` が存在する。VBAからは `SendCommand` や、よりモダンなアプローチとしてドキュメントのデータベースメソッドを組み合わせて制御するのが、最もバグを生みにくい。

非グラフィカルデータの掌握は、AutoCADカスタマイズにおける「中級者への登竜門」だ。表面的などこにでもあるコードをコピペするのではなく、裏側のデータ構造(シンボルテーブル)を意識した設計を心がけてほしい。

君たちの自動化プロジェクトの成功を祈る。質問があればいつでも開発ルームへ来たまえ。

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