【入門編】【実務中級】図面内の「非表示画層」にあるオブジェクトだけをAcadDocumentから一括抽出・集計 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!現場の自動化を進める中で、「画面には見えていないけれど、図面の中にひっそり眠っているデータ」を拾い上げる必要に迫られたことはありませんか?

マクロの記録から一歩抜け出し、AutoCAD VBAのオブジェクトモデルを本気で使いこなせるようになると、こうした複雑な条件分岐も驚くほどスマートに解決できるようになります。

今回は、実務で絶対に役立つ「非表示画層にあるオブジェクトの一括抽出・集計テクニック」を、プロの視点を交えながら優しく、そして深く解説していきます。ここをクリアすれば、あなたのAutoCAD VBAのスキルは確実に中級者の領域へ到達しますよ。バッチリついてきてくださいね!

1. なぜ「非表示画層」の集計でつまずくのか?

AutoCADで図面を描いていると、不要な線を一時的に隠すために「画層(レイヤー)の非表示」を頻繁に使いますよね。

しかし、VBAで単純に `ModelSpace` や `PaperSpace` の全オブジェクトを走査(ループ)すると、「画面に見えているオブジェクト」も「隠れているオブジェクト」も、すべて同じように取得されてしまいます。

「画面に見えていない=存在しない」と勘違いして集計から漏らしてしまい、後から数量違いのクレームに繋がる……これは実務で本当によくある失敗です。

これを防ぐためには、「オブジェクトが属している画層の名前」を調べ、その「画層自体が現在オン(表示)なのかオフ(非表示)なのか」を判定するという、二段構えのフィルターが必要になります。

2. AutoCADオブジェクトモデルの核心に迫る

この処理を実装するために、私たちは以下の3つの要素を連携させます。

1. `AcadDocument.ModelSpace`: 図面内のすべての図形が眠る空間。
2. `AcadEntity.Layer`: 各図形が「どの画層に所属しているか」を示すプロパティ(文字列)。
3. `AcadLayers` コレクションと `LayerOn` プロパティ: 画層の名前からその実体(`AcadLayer`オブジェクト)を引くインデックスと、それが「表示(True)」か「非表示(False)」かを示す真偽値。

特に、`Layers` コレクションから画層名でピンポイントにオブジェクトを引く方法は、実務のパフォーマンスを最適化するうえで非常に重要なテクニックです。

3. 【実践】非表示画層のオブジェクトを一網打尽にするコード

それでは、実際に動くコードを見てみましょう。
このマクロは、現在の図面空間(モデル空間)をスキャンし、「非表示画層に属している図形」だけを抽出し、その種類(画層名とエンティティ名)を集計してイミディエイトウィンドウに報告するものです。

Sub CountHiddenLayerObjects()
‘ —————————————————————–
‘ 目的: 非表示画層にあるオブジェクトを網羅的に抽出し、集計する
‘ —————————————————————–

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

Dim ent As AcadEntity
Dim targetLayer As AcadLayer
Dim hiddenCount As Long

‘ 集計カウンターの初期化
hiddenCount = 0

Debug.Print “=== 【非表示画層オブジェクトの集計開始】 ===”

‘ モデル空間内のすべてのエンティティを走査
For Each ent in acadDoc.ModelSpace

‘ エラーハンドリング(削除済みオブジェクトなどの例外対策)
On Error Resume Next

‘ オブジェクトが属する画層名から、Layersコレクションの画層オブジェクトを取得
‘ ※ AutoCADのLayersは「画層名(文字列)」をキーにして直接取得できます
Set targetLayer = acadDoc.Layers.Item(ent.Layer)

If Err.Number = 0 Then
‘ 画層の表示状態をチェック (LayerOn = False なら非表示)
If targetLayer.LayerOn = False Then

hiddenCount = hiddenCount + 1

‘ 該当するオブジェクトの情報をイミディエイトウィンドウに出力
Debug.Print “発見 [” & hiddenCount & “]: ” & _
“種類 = ” & ent.EntityName & “, ” & _
“画層名 = ” & targetLayer.Name

‘ 将来的にここでレイヤーを一時表示させたり、削除・移動する処理を挟めます

End If
End If

On Error GoTo 0 ‘ エラーリセット
Next ent

Debug.Print “=== 集計完了: 非表示画層のオブジェクト数 = ” & hiddenCount & ” 件 ===”
MsgBox “非表示画層のオブジェクトスキャンが完了しました。” & vbCrLf & _
“合計 ” & hiddenCount & ” 件の隠しオブジェクトを検知しました。”, vbInformation
End Sub

4. コードの注目ポイントと知見

ここでお伝えしたコードには、プロのエンジニアが現場で必ず組み込む「こだわり」が詰まっています。

① `acadDoc.Layers.Item(ent.Layer)` による高速ルックアップ

画層を調べる際、すべての画層をループで総当たりして探すのは、図面が重くなったときに致命的なパフォーマンス低下を招きます。`Layers` コレクションはキー(画層名)を指定してダイレクトに取得できるため、どれほど巨大な図面であっても高速に動作します。

② `On Error Resume Next` の正しい使い方

「エラー対策に何でもかんでも `On Error Resume Next` を書くのは悪」と教わった方もいるかもしれませんが、AutoCAD VBAにおいては、図面データベース内のアタッチミスや未定義データに対する安全弁として、ピンポイントで利用するのがプロの作法です。今回のコードでは、画層の取得時に万が一の不整合が起きてもマクロが途中でクラッシュしないよう、巧みにガードしています。

③ 拡張性を持たせた設計

今回は「集計してログに出す」だけですが、`If targetLayer.LayerOn = False Then` のブロックの中身を書き換えれば、

  • 非表示画層にある特定の文字(Text)だけを強制的に削除する
  • 非表示画層の図形を特定の「ゴミ箱画層」へ強制移動させる

といった、高度な図面クレンジングツールへと簡単に発展させることができます。

5. おわりに:ここをクリアすれば、もう怖くない!

今回は、`Layers` コレクションの `LayerOn` プロパティを軸に、図面の裏側に隠れたデータをあぶり出す実践的な手法を解説しました。

「画面に見えているものだけがすべてではない」——この視点を持てるようになったあなたなら、単なるマクロの記録者ではなく、「AutoCADの内部構造を理解したシステムエンジニア」です。

ぜひご自身の業務図面でこのコードを試して、VBAの奥深い世界を体感してみてください。あなたの自動化ライフが、さらに飛躍することを応援しています!

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