AutoCAD VBAを掌握する:線分計測から始まる「自動化アーキテクチャ」の極意
AutoCADの自動化を志す諸君、歓迎する。
多くの初心者は「動くコード」を書いて満足する。だが、我々のようなエンジニアが目指すべきは、「誰が使ってもエラーで落ちず、かつ数年後の自分でも改修できるコード」だ。
今回は、AutoCAD VBAの入り口として「線分(Line)の距離計測」を題材にする。一見単純なこのタスクを通じて、メモリ管理、エラーハンドリング、そしてオブジェクト指向の設計思想を叩き込む。
—
1. なぜ「適当なコード」が現場を破壊するのか
まず、初心者が陥りがちな「やってはいけないコード」を想像してほしい。
‘ 【悪い例:初心者が書きがちなコード】
Sub BadPractice()
Dim lineObj As AcadLine
Set lineObj = ThisDrawing.ModelSpace.Item(0) ‘ 0番目って何だ?
‘ 座標取得と計算…
End Sub
このコードが抱える「3つの罪」を理解せよ。
1. オブジェクトの脆弱性: インデックス `(0)` で指定すると、図面に線分がなかった瞬間に即死(エラー)する。
2. 型安全性の欠如: `ModelSpace` に線分以外のオブジェクト(円やブロック)が含まれていた場合、実行時エラーを引き起こす。
3. 保守性の死: 処理がサブプロシージャに固められており、他のツールから再利用できない。
これらは、現場の業務を自動化するのではなく、「自動化ツールが動かない」という新たな業務を増やすだけのゴミだ。
—
2. 堅牢なプロダクションコードの書き方
実務で使えるコードは、「型チェック」と「エラーハンドリング」が設計の8割を占める。以下に、現場のスタンダードとなり得る「線分抽出・距離計算コード」を提示する。
Option Explicit
‘ ========================================================
‘ 線分を選択し、その距離を計算する実務用関数
‘ ========================================================
Public Sub CalculateSelectedLineLength()
Dim ent As AcadEntity
Dim pickPoint As Variant
‘ 1. オブジェクトの選択(ユーザーの入力を安全に受け取る)
On Error Resume Next
ThisDrawing.Utility.GetEntity ent, pickPoint, “線分を選択してください: ”
If Err.Number <> 0 Then
MsgBox “選択がキャンセルされたか、無効な選択です。”, vbExclamation
Exit Sub
End If
On Error GoTo 0
‘ 2. 型チェック(これが最も重要。Line以外が選ばれたら即終了)
If TypeOf ent Is AcadLine Then
Dim lineObj As AcadLine
Set lineObj = ent
‘ 3. 距離計算(ユークリッドの距離公式)
Dim dist As Double
dist = GetDistance3D(lineObj.StartPoint, lineObj.EndPoint)
MsgBox “線分の距離: ” & Format(dist, “0.000”), vbInformation
Else
MsgBox “線分ではありません。”, vbCritical
End If
End Sub
‘ ——————————————————–
‘ 汎用的な距離計算ロジック(別プロシージャに切り出すのが鉄則)
‘ ——————————————————–
Private Function GetDistance3D(pt1 As Variant, pt2 As Variant) As Double
Dim dx As Double, dy As Double, dz As Double
dx = pt1(0) – pt2(0)
dy = pt1(1) – pt2(1)
dz = pt1(2) – pt2(2)
GetDistance3D = Sqr(dx dx + dy dy + dz dz)
End Function
—
3. このコードが「プロ仕様」である理由
① `TypeOf` による型安全性の確保
`AcadEntity` として取得した後、`TypeOf ent Is AcadLine` で厳密に検証している。これにより、予期せぬオブジェクトが選択されても、システム全体がクラッシュすることはない。
② 計算ロジックの分離
`GetDistance3D` 関数を分離した意図を汲み取れ。これは将来、ポリラインの頂点間距離や、ブロック同士の距離を測る際にも「そのまま使い回せる」。DRY(Don’t Repeat Yourself)原則の基礎だ。
③ ユーザー体験への配慮
`On Error Resume Next` を使い、ユーザーがESCキーを押した際の「強制終了」をスマートに処理している。無作法なエラーダイアログは、ユーザーの信頼を損なう最大の要因だ。
—
4. 今後のステップ:さらなる高みへ
このコードをマスターした諸君に次なる課題を与える。
- Excel連携: 計算した距離をCSVやExcelに書き出し、見積書を自動生成する。
- レイヤーフィルタ: 特定のレイヤーに属する線分だけを自動抽出して合計距離を出す。
- データベース連携: `ADO (ActiveX Data Objects)` を使い、計測値を設計管理データベースへ直接送る。
AutoCAD VBAは、単なる「図形操作ツール」ではない。「設計データを資産に変えるエンジン」だ。
コードを書くときは常に想像せよ。あなたの書いたその1行が、100人の設計者の時間を1分ずつ短縮するのか、それとも100回のエラーで彼らを苛立たせるのか。
さあ、エディタを開け。君のコードで、現場を圧倒しろ。
