序論:座標を制する者は、AutoCADを制する
AutoCAD VBAの世界へようこそ。君がこの記事を読んでいるということは、単なる「描画の自動化」を超え、図面が持つ真のデータ――すなわち「座標」を自在に操り、業務を劇的に効率化したいと考えているはずだ。
多くの初学者が陥る罠がある。それは、画面上の見た目だけで図形を捉え、座標を「単なる3つの数字の羅列」と軽視することだ。しかし、プロフェッショナルな設計において、座標は図面のDNAであり、その扱いを一歩間違えれば、累積誤差やシステムエラーによる手戻りという地獄を招く。
この記事では、AutoCAD VBAにおける座標取得の「定石」と、実務に耐えうる堅牢なコード設計の真髄を伝授する。
—
1. AutoCAD VBAにおける座標の正体
AutoCAD VBAにおいて、座標は主に「倍精度浮動小数点数(Double)の配列」として扱われる。そして、それを格納する器は通常 `Variant` 型だ。
なぜ `Variant` なのか?
AutoCADのActiveXインターフェースは、COM(Component Object Model)に基づいている。座標(X, Y, Z)の3要素を一つのパッケージとしてやり取りするために、VBA側では可変型の `Variant` を受け皿にする必要がある。
座標系の鉄則:WCSとUCS
初心者が最も混乱するのが座標系だ。
- WCS (World Coordinate System): 絶対的な宇宙の原点。
- UCS (User Coordinate System): ユーザーが定義した作業用の原点。
「プログラムで座標を扱うときは、常にWCS(世界座標系)で思考せよ」。これが鉄則だ。ユーザーがたまたまUCSを傾けていただけで計算が狂うようなツールは、プロダクション環境ではゴミに等しい。
—
2. 座標取得の戦術:実務で使う2つのアプローチ
図面から座標を得る方法は、大きく分けて「既存オブジェクトから抽出する」か「ユーザーにクリックさせる」かの2通りだ。
2-1. オブジェクトのプロパティから取得する
例えば、円の中心点やポリラインの頂点。これらは各オブジェクトの `Center` や `Coordinates` プロパティに格納されている。
2-2. `Utility.GetPoint` でユーザーから取得する
対話型ツールを作る際、ユーザーに特定の場所を指示させる手法だ。ここでは「ユーザーがEscキーを押してキャンセルした時」の例外処理が必須となる。
—
3. 実践:保守性の高いプロダクションコード例
以下に、実務でそのまま使えるレベルの堅牢なコードを示す。このコードは、「ユーザーに点を選択させ、その座標に円を描画し、さらにその座標をデバッグウィンドウに出力する」という一連の流れを、エラーハンドリングを含めて実装したものだ。
Option Explicit
”’
”’
Public Sub CreateMarkerAtPoint()
On Error GoTo ErrorHandler
Dim acadApp As AcadApplication
Set acadApp = ThisDrawing.Application
Dim util As AcadUtility
Set util = ThisDrawing.Utility
‘ 1. ユーザーから座標を取得
Dim pickedPoint As Variant
On Error Resume Next ‘ GetPointのキャンセル(Esc)をトラップするために一時的に無視
pickedPoint = util.GetPoint(, vbCrLf & “中心点を選択してください: “)
If Err.Number <> 0 Then
‘ ユーザーがEscを押した場合などはここに来る
Debug.Print “ユーザーによって操作がキャンセルされました。”
Exit Sub
End If
On Error GoTo ErrorHandler ‘ エラーハンドリングを元に戻す
‘ 2. 座標の検証(プロフェッショナルの嗜み)
‘ Variant型の中身がDoubleの配列(0 to 2)であることを確認
If Not IsArray(pickedPoint) Then
Err.Raise vbObjectError + 1001, , “座標データの取得に失敗しました。”
End If
‘ 3. 取得した座標を利用して新しい図形(円)を作成
Dim circleObj As AcadCircle
Dim radius As Double: radius = 10.0 ‘ 半径は業務要件に応じて変数化
‘ ModelSpaceに円を追加
Set circleObj = ThisDrawing.ModelSpace.AddCircle(pickedPoint, radius)
circleObj.Color = acRed ‘ 目立つように赤色に設定
circleObj.Update
‘ 4. 座標値をデータベースや外部ファイルへ渡す想定のログ出力
‘ 浮動小数点の精度に注意を払うこと
Dim msg As String
msg = “X=” & Format(pickedPoint(0), “0.000”) & _
“, Y=” & Format(pickedPoint(1), “0.000”) & _
“, Z=” & Format(pickedPoint(2), “0.000”)
Debug.Print “成功: 図形を作成しました。座標: ” & msg
MsgBox “座標 ” & msg & ” にマーカーを作成しました。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
コードの解説:なぜこう書くのか
1. `On Error Resume Next` の局所化: `GetPoint` はユーザーがキャンセルするとランタイムエラーを投げる。これを安全にキャッチするために、必要な一行だけを囲むのがプロの書き方だ。
2. `Variant` へのアクセス: `pickedPoint(0)` がX、`(1)` がY、`(2)` がZである。これらは常に `Double` として扱う。
3. `Format` 関数による精度管理: 座標を文字列として外部(CSVやログ)に出力する場合、精度の指定を怠ってはいけない。
—
4. データベース・外部ファイル連携への布石
君が作るツールが「ただ円を描いて終わり」ではないはずだ。取得した座標をExcelやSQL Serverへ飛ばし、資材集計や施工管理に役立てるのが本来のゴールだろう。
注意点:座標の「型」を合わせる
- Excel連携: `pickedPoint(0)` をそのままセルに入れればよいが、Excel側で数値型として認識されるよう、セルの書式設定に留意せよ。
- データベース(SQL): SQLの `FLOAT` 型や `DECIMAL` 型に格納する際、VBAの `Double` の精度が失われないよう、パラメータクエリ(ADODB.Command)を使用することを強く推奨する。
—
5. まとめ:一流のエンジニアを目指す君へ
座標の取得は、AutoCAD自動化における「ハローワールド」の次に来るステップだが、ここにはソフトウェア設計の本質が詰まっている。
- データ型(Variant/Double)を正しく理解すること。
- ユーザーの予期せぬ操作(キャンセル)を想定すること。
- 常にWCSを基準に考え、座標系に依存しない堅牢なコードを書くこと。
これらを意識するだけで、君の書くコードの品質は劇的に向上し、現場で「本当に使える」ツールへと進化するだろう。次は、複数の図形をまたぐ「バッチ処理と座標変換」の世界で会おう。
—
執筆者:チーフアーキテクト
AutoCAD VBAの深淵から大規模BIMシステム構築までを手掛ける自動化のスペシャリスト。
