【実務・中級編】【初心者向け】AutoCAD VBAで図面上の線分(Line)の始点・終点座標を取得し、距離を計算する – AutoCAD VBA解析バイブル

スポンサーリンク

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回のエラーで彼らを苛立たせるのか。

さあ、エディタを開け。君のコードで、現場を圧倒しろ。

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