【実務・中級編】【初心者向け】AutoCAD VBAで図面上の座標を取得・利用する基本 – AutoCAD VBA解析バイブル

スポンサーリンク

序論:座標を制する者は、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システム構築までを手掛ける自動化のスペシャリスト。

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