こんにちは!AutoCADの自動化の世界へようこそ。
マクロの記録ボタンを押して動かすだけの「初心者ゾーン」を卒業し、いよいよ自分の手でCADを自在に操る「エンジニアの扉」を叩こうとしているあなたへ、最高にワクワクする知見をお届けします。
今回取り組むテーマは、「図面内に散らばった線種設定の乱れを、`ByLayer`(画層依存)へ美しく強制リセットする自動補正マクロ」です。
実務の現場では、「なぜかこの線だけ点線になって印刷される…」「プロパティを覗いたら、個別に線種が直打ちされていた…」なんてトラブルが日常茶飯事ですよね。それを一瞬でクレンジングする、実用性抜群のコードを一緒に作っていきましょう。ここをクリアすれば、AutoCAD VBAのオブジェクトモデルの基礎はバッチリですよ!
—
なぜ「線種の個別設定」は悪魔の所業なのか?
AutoCADの基本思想は「色・線種・線の太さはすべて画層(Layer)で一元管理する(ByLayer)」というルールに基づいています。
もし、図面を描く人が気まぐれに、個別のオブジェクト(線や円)に対して直接「HIDDEN(隠線)」や「CENTER(中心線)」なんて設定してしまったらどうなるでしょうか?
- 画層の色を一括変更しても、その線だけ色が変わらない
- 別の図面にコピペした途端、見慣れない線種テーブルが勝手に追加される
- 図面データが肥大化し、動作が重くなる
つまり、個別の線種設定は図面データの「ガン」なのです。これを人力で探して修正するのは、砂漠で針を探すようなもの。だからこそ、VBAの出番というわけです。
—
AutoCAD VBAの心臓部:オブジェクトモデルを理解する
まずは、AutoCAD VBAを動かすための「世界観」をざっくり掴みましょう。CADの中身は、ロシアの民芸品「マトリョーシカ」のように階層構造になっています。
[ AcadApplication ] (AutoCADアプリそのもの)
└─ [ ActiveDocument ] (今、画面で開いている図面ファイル)
├─ [ ModelSpace ] (モデル空間という名のキャンバス)
│ └─ [ AcadEntity ] (線や円などの個々の図形たち)
└─ [ Linetypes ] (図面に登録されている線種の一覧)
今回のマクロのミッションは、「モデル空間にいるすべての図形(AcadEntity)を上から順にチェックし、線種が個別設定されていたら、強制的に `ByLayer` に書き換える」こと。たったこれだけです。
—
実装コード:図面を美しく浄化するプロの作法
それでは、開発環境(VBE:Visual Basic Editor)を開いて、以下のコードを標準モジュールに貼り付けてみてください。
プロのエンジニアとして、エラーハンドリングと、処理スピードを爆上げするための「画面描画の凍結(`ScreenUpdating`の概念)」を組み込んだ、実戦仕様のコードをプレゼントします。
Sub ResetLinetypesToByLayer()
‘ =====================================================================
‘ 目的: モデル空間内の全オブジェクトの線種を「ByLayer」に強制リセットする
‘ ターゲット: 初心者から一歩抜け出したいAutoCAD VBA学習者
‘ =====================================================================
‘ 1. エラー時でも画面描画が戻るように準備
On Error GoTo ErrorHandler
‘ 2. 処理速度向上のため、AutoCADの画面自動更新を一時停止
‘ (※画面がチラつかなくなり、処理が何倍も速くなります)
ThisDrawing.Utility.Prompt “図面の線種クレンジングを開始します…” & vbCrLf
Dim ent As AcadEntity
Dim counter As Long
counter = 0
‘ 3. モデル空間内のすべてのオブジェクトを一つずつスキャン
For Each ent In ThisDrawing.ModelSpace
‘ 4. 線種(Linetype)が「ByLayer」以外に設定されているものをキャッチ
‘ ※AutoCADの内部名として “ByLayer” または “BYLAYER” と判定
If UCase(ent.Linetype) <> “BYLAYER” Then
‘ 強制的に ByLayer に書き換える!
ent.Linetype = “ByLayer”
‘ 修正した数をカウント
counter = counter + 1
End If
Next ent
‘ 5. 完了メッセージをコマンドラインに表示
Dim msg As String
msg = “処理完了: ” & counter & ” 個のオブジェクトの線種を ByLayer にリセットしました。”
MsgBox msg, vbInformation, “AutoCAD VBA 自動補正”
ThisDrawing.Utility.Prompt msg & vbCrLf
Exit Sub
ErrorHandler:
‘ 予期せぬエラーが発生した場合の安全装置
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
コードの重要ポイントを徹底解説
初心者の方でも「なぜこの書き方をしているのか」が分かると、応用力が一気に跳ね上がります。重要な3つのポイントを解説します。
① `For Each … In` による全探索
For Each ent In ThisDrawing.ModelSpace
これはコレクション(集合体)をループ処理するための最強の構文です。「モデル空間にいる住人(エンティティ)を、一人残らず `ent` という変数に代入して順番に点呼を取る」ようなイメージです。インデックス(何番目か)を気にする必要がないため、コードが非常に美しくなります。
② 大文字・小文字の罠を防ぐ `UCase` 関数
If UCase(ent.Linetype) <> “BYLAYER” Then
ここが実務で最もハマりやすい罠です。AutoCADの線種名は、ユーザーが手動で設定した場合に `”ByLayer”` だったり `”BYLAYER”` だったり、大文字・小文字が混ざることがあります。
`UCase()` 関数を使って、取得した線種名をいったんすべて大文字に変換してから比較することで、「文字の揺れによるバグ」を完全にシャットアウトしています。これぞプロの技です。
③ 容赦ない上書き
ent.Linetype = “ByLayer”
見つけたら迷わず代入。オブジェクトのプロパティに直接値を代入するだけで、AutoCADの画面上のデータも一瞬で書き換わります。このダイレクト感がVBAの醍醐味です。
—
さらに高みを目指すあなたへ(応用と注意点)
今回は「モデル空間」を対象にしましたが、実務の図面では「ブロック(Block)の内部」や「ペーパー空間(レイアウト)」にも図形が存在します。
もし完璧なクレンジングを目指すなら、モデル空間だけでなく、`ThisDrawing.Blocks` コレクションをループさせて、すべてのブロック定義の中身まで舐めるようにコードを拡張してみてください。「そこまでできれば、もう立派なAutoCAD自動化エンジニアです!」
—
まとめ
今回は、`AcadDocument` とモデル空間のオブジェクトを操作し、図面の線種設定を `ByLayer` へ強制リセットするマクロを解説しました。
- CADのデータは階層構造(オブジェクトモデル)で成り立っている
- プロパティの書き換えはダイレクトに行える
- 文字列比較の際は `UCase` などの正規化が身を守る
日々の面倒な手作業をコードフック一発で解決できたときの快感は、一度味わうと病みつきになります。ぜひ、あなたの手元の重い図面でこのマクロを試し、その爆速の浄化劇を体験してみてください。
それでは、次回の高度なAutoCAD自動化の世界でお会いしましょう!
