【AutoCAD VBA超入門】円弧(Arc)の幾何データを完全掌握せよ:始点・終点・中心座標の堅牢な抽出と実務活用
業務自動化エンジニアの私だ。
日々の設計作業において、図面上の円弧(Arc)から正確な幾何データを吸い上げ、それを後続の演算や別システム(Excel、データベース)へ連携する処理は、CAD自動化の最も基本的かつ、「最も実装の優劣が出やすい」領域の一つである。
ネット上の散在するサンプルコードをそのままコピペして、「なぜか動かない」「特定の図面でエラーになる」と頭を抱えたことはないか?
今回は、AutoCAD VBAのオブジェクトモデルの深層に触れながら、円弧オブジェクトの始点・終点・中心座標をミリ単位の狂いもなく安全に取得し、実務のツールとして昇華させるための極限の知見を授けよう。
—
1. なぜ「素朴なコード」は実務で破綻するのか?
多くの初学者がやりがちな失敗は、選択したオブジェクトが本当に「円弧(Arc)」であるかを確認せず、いきなりプロパティにアクセスすることだ。さらに、AutoCAD特有の「WCS(世界座標系)とOCS(オブジェクト座標系)の罠」を無視しているケースも散見される。
実務の現場において、図面は混沌としている。
- ユーザーが円(Circle)や線分(Line)を選択しているかもしれない。
- 3D空間上で回転されたUCS上の円弧かもしれない。
これらを考慮せず、ただ `Arc.Center` を叩くようなコードは、プロダクション環境では「不良品」の烙印を押される。プロのエンジニアであれば、「型安全性の担保」「エラーハンドリング」「座標系の意識」の3つを初手から組み込まなければならない。
—
2. 実務仕様:堅牢な円弧データ抽出アルゴリズム
これから提示するコードは、単に座標をMessageBoxに表示するようなお遊戯ではない。
選択された図形が確実に「Arc」であることを判定し、中心点(Center)、始点(StartPoint)、終点(EndPoint)の3次元座標(Variant型配列)を安全に取得した上で、即座にイミディエイトウィンドウへの出力、およびExcelへのデータ吐き出しへと繋げられるプロ仕様の設計だ。
プロダクション・コード例
以下のコードをAutoCADのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けて実行してほしい。
Option Explicit
” =================================================================
” 処理名: 選択した円弧の幾何データ抽出マクロ
” 概要: 単一の円弧オブジェクトから中心・始点・終点を安全に取得し、
” コンソールに出力するとともに、実務での活用基盤を提供する。
” =================================================================
Public Sub GetArcGeometryData()
‘ 1. 宣言セクション(メモリ効率と型安全性を意識した厳密な宣言)
Dim acadObj As AcadEntity
Dim pickPoint As Variant
Dim arcObj As AcadObject
‘ 座標格納用の配列変数(AutoCADの座標は3要素のDouble型配列で返る)
Dim vCenter As Variant
Dim vStart As Variant
Dim vEnd As Variant
On Error GoTo ErrorHandler
‘ 2. ユーザーに対象の円弧を1つだけ選択させる(SelectOnScreenの罠を回避するセキュアな設計)
ActiveDocument.Utility.GetEntity acadObj, pickPoint, vbCrLf & “— 抽出対象の円弧を選択してください: ”
‘ 3. オブジェクトの型判定(Typeof演算子による厳格なダックタイピング回避)
If TypeOf acadObj Is AcadArc Then
‘ 4. 遅延バインディングを防ぎ、明確にキャスト
Set arcObj = acadObj
‘ 各種幾何データの取得(プロパティアクセス)
‘ ※注意: 取得される座標は常にWCS(世界座標系)基準の3次元配列である
vCenter = arcObj.Center
vStart = arcObj.StartPoint
vEnd = arcObj.EndPoint
‘ 5. ログ出力(実務ではここにDB書き込みやExcel連携処理が入る)
Debug.Print “=== 円弧データ解析結果 == ”
Debug.Print “半径 (Radius): ” & Format(arcObj.Radius, “0.000”)
Debug.Print “中心点 (Center): X=” & Format(vCenter(0), “0.000”) & “, Y=” & Format(vCenter(1), “0.000”) & “, Z=” & Format(vCenter(2), “0.000”)
Debug.Print “始点 (Start) : X=” & Format(vStart(0), “0.000”) & “, Y=” & Format(vStart(1), “0.000”) & “, Z=” & Format(vStart(2), “0.000”)
Debug.Print “終点 (End) : X=” & Format(vEnd(0), “0.000”) & “, Y=” & Format(vEnd(1), “0.000”) & “, Z=” & Format(vEnd(2), “0.000”)
Debug.Print “中心角 (Angle): ” & Format(arcObj.TotalAngle (180 / 3.14159265358979), “0.00”) & ” 度”
MsgBox “円弧データの抽出に成功しました。” & vbCrLf & _
“詳細はイミディエイトウィンドウを確認してください。”, vbInformation, “自動化ツール”
Else
‘ 予期せぬ図形が選択された場合のアーキテクチャ上のフェイルセーフ
MsgBox “エラー: 選択された図形は円弧(Arc)ではありません。”, vbCritical, “型不一致エラー”
End If
Exit Sub
ErrorHandler:
‘ ユーザーがESCキーでキャンセルした場合などのトラップ
If Err.Number = -2174508310 Or Err.Number & “” = “429” Then
‘ キャンセル時は静かに抜ける
Exit Sub
Else
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “システムエラー”
End If
End Sub
—
3. コードの急所:プロが解説するアーキテクチャのポイント
上記のコードには、現場で生き残るための高度な設計思想が組み込まれている。
① `TypeOf` による厳密な型チェック
`AcadEntity` として取得したオブジェクトに対し、いきなり `Radius` などのプロパティを叩くと、選択した図形が線分だった瞬間に実行時エラー(ランタイムエラー 438: オブジェクトは、このプロパティまたはメソッドをサポートしていません)でマクロがクラッシュする。`If TypeOf acadObj Is AcadArc Then` による事前検証は、堅牢なツールを作るための絶対条件だ。
② AutoCADにおける「座標配列」の仕様
AutoCAD VBAにおいて、`Center` や `StartPoint` といったプロパティは、単なる数値ではなく `Double`型の1次元配列(0〜2の3要素) として返される。
そのため、`vCenter(0)`(X座標)、ビジュアルベーシックの作法に則り、インデックスを指定して安全に引き抜く必要がある。ここを理解していないと、「型が一致しません」というエラーの無限ループに陥る。
③ 単位系とラジアンの罠
コード内で `TotalAngle`(中心角)を度に変換している部分に注目してほしい。AutoCADのAPIが返す角度系は、一貫して「ラジアン(Radian)」である。実務の帳票やExcel連携では「度(Degree)」が求められることが多いため、自前で `180 / π` の係数を乗算して変換する一手間が、エンジニアとしてのセンスの見せ所となる。
—
4. さらなる高みへ:外部システム(Excel)への拡張性
今回取得した `vCenter`、`vStart`、`vEnd` の各座標データは、配列としてメモリ上に保持されている。
これを実務でどう活かすか?
例えば、以下のようにExcelへのバッチ出力ロジックを直結させることで、「図面上の全円弧の座標リストを数秒でExcelの表にする自動見積もりシステム」などが簡単に構築できる。
‘ 【概念スニペット】Excelへのデータ書き出しイメージ
Dim xlApp As Object
Set xlApp = CreateObject(“Excel.Application”)
‘ … Excelワークブックを開き、取得した vCenter(0), vCenter(1) などをセルに代入していく
オブジェクトモデルのライフサイクルを意識し、メモリリーク(COMオブジェクトの解放漏れ)にさえ気を付ければ、AutoCAD VBAはあなたの最強の武器となる。
—
総括
円弧の始点・終点・中心座標の取得は、CAD自動化の第一歩にすぎない。しかし、その基本の処理において「型安全性」「エラーハンドリング」「座標・単位系の理解」を徹底できるかどうかが、プロのエンジニアとアマチュアを分ける境界線だ。
今回のコードをベースに、自社の業務フローに合わせたカスタマイズを加え、設計現場の非効率を根絶してほしい。君の健闘を祈る。
