【実務・中級編】【初心者】AcadDocument.ActiveLinetypeを「ByLayer」に強制リセットし、図面内の線種設定の乱れを自動補正する – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA 徹底解説】図面の癌を一刀両断!`ActiveLinetype` とオブジェクト線種を「ByLayer」へ強制リセットし図面を浄化する技術

開発現場のチーフアーキテクトである私のもとに、よくこんな悲鳴が届く。
「他社から受領した図面を開くと、線種がバラバラで修正できない」
「プロパティをいじりすぎて、どのオブジェクトがどの線種を持っているか分からない」

図面データにおける線種の直接指定(ハードコーディング)は、いわば「図面の癌」だ。これを放置すると、画層(Layer)管理が崩壊し、CADオペレーター全員の生産性を奪い去る。

今回は、AutoCAD VBAの根幹である `AcadDocument` とオブジェクトモデルを完全に掌握し、図面の線種設定を強制的に「ByLayer」へリセットして健全性を保つ、実務直結のプロダクションコードを授けよう。

1. なぜ「ByLayer(画層従属)」にこだわるのか?

実務において、オブジェクト個別に線種(Linetype)や色(Color)を割り当てることは「悪手」とされる。理由は明白だ。

  • 変更耐性の欠如: 後から「やっぱり中心線を一点鎖線から破線に変えてほしい」と言われた時、個別に線種を持ったオブジェクトは何千回もクリックして手動修正するハメになる。
  • データ肥大化と汚染: 不必要な線種ディクショナリが図面内に残存し、ファイルサイズが肥大化する。

我々エンジニアの使命は、「人間が手動でやるべきではない単調かつ破壊的な作業を、コードで一瞬にして終わらせること」だ。図面全体の線種を `ByLayer` に統一することは、BIM/CADデータの品質担保において絶対に譲れない防衛ラインである。

2. アーキテクチャ設計:安全な一括補正のロジック

今回のマクロでは、単に「現在画層の線種を変える」だけではない。
1. 図面全体の線種コントロール(`ActiveLinetype`)の補正
2. モデル空間(ModelSpace)およびペーパー空間(PaperSpace)に存在する全プリミティブの走査
3. 各エンティティの `Linetype` プロパティの強制上書き

これらを安全に行う。特に、AutoCAD VBAにおけるエラーハンドリングは甘く見てはならない。ロックされた画層や、外部参照(Xref)内のオブジェクトを誤って触ると、容赦なくエラーで落ちる。この「実務の罠」を回避する堅牢なコードを組み立てよう。

3. 【コピペ即実践】プロダクション品質のVBAコード

以下のコードをAutoCADのVBAエディタ(`Alt + F11`)に貼り付け、実行してほしい。実務で即座に使えるレベルの安全性とパフォーマンスを担保してある。

Option Explicit

‘ ==============================================================================
‘ 処理名: 討伐・線種ランダム地獄!図面内全オブジェクト線種ByLayer強制リセット
‘ 概要 : モデル・ペーパー空間の全図形、および図面全体のデフォルト線種を
‘ 「ByLayer」に強制的に統一し、図面の健全性を回復する。
‘ ==============================================================================
Public Sub PurgeAndResetToByLayer()
‘ 画面描画を停止し、処理速度を劇的に向上させる(パフォーマンスの基本)
ThisDrawing.Application.ScreenUpdating = False

On Error GoTo ErrorHandler

Dim counter As Long
counter = 0

‘ 1. 図面全体のデフォルト線種(ActiveLinetype)を “ByLayer” に設定
‘ ※ “ByLayer” 線種が図面にロードされていることが前提
On Error Resume Next
ThisDrawing.ActiveLinetype = ThisDrawing.Linetypes(“ByLayer”)
If Err.Number <> 0 Then
MsgBox “エラー: この図面には ‘ByLayer’ 線種がロードされていません。”, vbCritical, “致命的なエラー”
GoTo Finally
End If
On Error GoTo ErrorHandler ‘ エラー捕捉を通常に戻す

‘ 2. モデル空間のオブジェクトを走査
Dim ent As AcadEntity
Dim ms As AcadModelSpace
Set ms = ThisDrawing.ModelSpace

For Each ent In ms
‘ ロック画層や外部参照などの書き込み不可オブジェクトをスキップ
If IsEditable(ent) Then
‘ 線種を強制的に ByLayer へ変更
ent.Linetype = “ByLayer”
counter = counter + 1
End If
Next ent

‘ 3. ペーパー空間(レイアウト)のオブジェクトを走査
Dim ps As AcadPaperSpace
Set ps = ThisDrawing.PaperSpace

For Each ent In ps
If IsEditable(ent) Then
ent.Linetype = “ByLayer”
counter = counter + 1
End If
Next ent

‘ 変更を反映
ThisDrawing.Regen acActiveViewport

‘ 完了通知
MsgBox “図面の浄化が完了しました。” & vbCrLf & _
“修正されたオブジェクト総数: ” & counter & ” 件”, vbInformation, “一括補正完了”

Finally:
‘ 画面描画を必ず復元する(これを忘れるとAutoCADがフリーズしたように見える)
ThisDrawing.Application.ScreenUpdating = True
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error No: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, vbCritical, “システムエラー”
Resume Finally
End Sub

‘ ==============================================================================
‘ 関数名: IsEditable
‘ 概要 : オブジェクトが編集可能(ロックされていない、かつ通常図形)か判定
‘ ==============================================================================
Private Function IsEditable(ByRef ent As AcadEntity) As Boolean
IsEditable = False

‘ 念のためオブジェクトの有効性をチェック
If ent Is Nothing Then Exit Function

‘ 画層がロックされている場合は触らない(AutoCADの基本マナー)
Dim targetLayer As AcadLayer
Set targetLayer = ThisDrawing.Layers.Item(ent.Layer)

If targetLayer.Lock = True Then
Exit Function
End If

‘ 画層が非表示(Freeze/Off)であっても、データ構造としての書き込みは可能だが
‘ 安全のため今回はスルーせず処理対象とする(要件に応じて変更可)

IsEditable = True
End Function

4. コードの深掘りとエンジニアリングの勘所

ただ動くだけのコードなら素人でも書ける。プロのエンジニアがこのコードに込めた「こだわり」を解説しよう。

① `ScreenUpdating = False` による爆速化

大量のオブジェクト(数万〜数十万エンティティ)をループで回す際、AutoCADが毎回のプロパティ変更を描画しようとすると、それだけで処理が何十倍も遅くなる。処理の最初に画面描画を止め、最後に `Regen`(再描画)を1回だけ叩く。これが大規模図面を扱う際の鉄則だ。

② 画層ロック(Lock)のガード

実務の図面は複雑だ。「触ってほしくないレイヤー」がロックされている。もしロックされた画層のオブジェクトの線種を無理やり書き換えようとすれば、VBAはランタイムエラーを吐いてクラッシュする。`IsEditable` 関数を挟み、編集権限があるものだけを安全に処理する設計にしている。

③ エラーハンドリングの確実な復旧

もし途中で予期せぬエラーが起きても、`Finally` ラベルを経由して必ず `ScreenUpdating = True` が実行されるようにしてある。これを怠ると、ユーザーは「AutoCADが固まった」と勘違いして強制終了し、データ破損を招くことになる。

5. おわりに:真の自動化エンジニアを目指すあなたへ

今回紹介した `ActiveLinetype` の制御とオブジェクトの走査は、AutoCAD VBAにおける基本中の基本でありながら、最も強力なテクニックの一つだ。

「手動で図面を綺麗にする」という泥臭い業務は、今日で終わりにしよう。このスクリプトを社内の標準ツールとして組み込めば、無駄な修正作業から解放され、より本質的な設計業務に集中できるはずだ。

コードを信じよ、そしてロジックで図面を支配せよ。

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