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

スポンサーリンク

はじめに:AutoCAD VBAの「心臓部」へようこそ

こんにちは。AutoCAD自動化の世界へ一歩踏み出したあなたを、心から歓迎します。

多くのユーザーが「マクロの記録」からプログラミングの道に入りますが、すぐに一つの壁にぶつかります。それは、「図面上の『ここ』にある情報を、どうやってプログラムに伝えるか?」という問題です。

AutoCADの本質は、美しい図面を描く道具である以上に、「精密な座標データの集合体」です。座標を制する者は、AutoCAD VBAのすべてを制すると言っても過言ではありません。

今日は、座標の取得(インプット)から利用(アウトプット)まで、現場で一生使える「本質的な基礎」を、私と一緒にマスターしていきましょう。ここをクリアすれば、あなたのCAD操作は「手作業」から「自動生成」へと劇的な進化を遂げるはずです。

1. 座標の正体は「3つの要素を持つ配列」

まず、最も大切なルールを覚えてください。AutoCAD VBAにおいて、点は単一の変数ではなく、「3つのDouble型(実数)を持つ配列」として扱われます。

  • `Point(0)` : X座標
  • `Point(1)` : Y座標
  • `Point(2)` : Z座標

初心者の方が最初にはまる罠は、この「配列」という概念です。VBAではこれらをまとめて扱うために、汎用的な型である`Variant`(バリアント型)によく格納します。

2. 実践:ユーザーに点をクリックしてもらう (`GetPoint`)

まずは、ユーザーに図面上の好きな場所をクリックしてもらい、その座標を取得するコードを見てみましょう。これは対話型マクロの基本中の基本です。

Sub GetUserPoint()
‘ AutoCADのドキュメントとユーティリティオブジェクトへのアクセス
Dim acDoc As AcadDocument
Set acDoc = ThisDrawing

Dim returnPnt As Variant ‘ 座標を受け取るための箱

On Error Resume Next ‘ ユーザーがエスケープを押した時のエラー対策

‘ GetPointメソッド:画面上をクリックさせる
‘ 引数1:基準点(今回は無しなのでEmpty)、引数2:プロンプトメッセージ
returnPnt = acDoc.Utility.GetPoint(, “中心点を選択してください: “)

‘ エラーチェック(ユーザーがキャンセルした場合など)
If Err <> 0 Then
MsgBox “選択がキャンセルされました。”
Exit Sub
End If

‘ 取得した座標をメッセージボックスで表示(小数点第2位まで)
MsgBox “取得した座標は以下の通りです:” & vbCrLf & _
“X = ” & Format(returnPnt(0), “0.00”) & vbCrLf & _
“Y = ” & Format(returnPnt(1), “0.00”) & vbCrLf & _
“Z = ” & Format(returnPnt(2), “0.00”)
End Sub

ここがポイント!

  • `Utility.GetPoint`: これが「クリックを待つ」魔法のコマンドです。
  • `Variant`型の活用: 戻り値は自動的に「3つの数値が入った配列」としてこの変数に格納されます。

3. 取得した座標を使って図形を作る

座標を取得できたら、次はそれを使って新しい図形を作ってみましょう。例として、クリックした位置を中心に円を描きます。

Sub CreateCircleAtPoint()
Dim centerPnt As Variant
Dim radius As Double
Dim circleObj As AcadCircle

‘ 1. 中心点をクリックしてもらう
centerPnt = ThisDrawing.Utility.GetPoint(, “円の中心をクリック: “)

‘ 2. 半径を指定(今回は固定値50にします)
radius = 50#

‘ 3. モデル空間に円を作成
‘ AddCircle(中心点, 半径)
Set circleObj = ThisDrawing.ModelSpace.AddCircle(centerPnt, radius)

‘ 作成した円の色を赤に変えてみる(視覚的なフィードバック)
circleObj.Color = acRed
circleObj.Update

MsgBox “半径” & radius & “の円を作成しました。”
End Sub

プロの視点:`ModelSpace` の意識

AutoCAD VBAでは、図形を作る場所を明示する必要があります。`ThisDrawing.ModelSpace` は、あなたがいつも見ている黒い作図画面のことです。ここを意識するだけで、コードの構造がぐっとプロっぽくなります。

4. 既存の図形から座標を「抜き出す」

新しいものを作るだけでなく、既にある図形の座標を知りたい場面も多いでしょう。例えば、線分(Line)の始点と終点を取得する方法です。

Sub GetLineCoordinates()
Dim entity As AcadEntity
Dim pickedPnt As Variant
Dim lineObj As AcadLine

‘ 1. 図面上のオブジェクトを選択させる
On Error Resume Next
ThisDrawing.Utility.GetEntity entity, pickedPnt, “線分を選択してください: ”

‘ 2. 選択されたものが「線分」かチェックする
If TypeOf entity Is AcadLine Then
Set lineObj = entity

‘ 始点(StartPoint)と終点(EndPoint)を取得
Dim startPt As Variant
Dim endPt As Variant
startPt = lineObj.StartPoint
endPt = lineObj.EndPoint

MsgBox “始点X: ” & startPt(0) & vbCrLf & “終点X: ” & endPt(0)
Else
MsgBox “それは線分ではありません。”
End If
End Sub

5. 座標を使って図形を「動かす」 (Moveメソッドの罠)

最後に、座標を使った「移動」について触れます。ここには初心者の方が最も陥りやすい「最大の罠」が潜んでいます。

`Move` メソッドの引数は、「移動先の座標」ではなく「移動ベクトル(どの地点から、どの地点へ)」なのです。

Sub MoveObjectSmartly()
‘ 選択した図形を、現在の位置から「右に100、上に50」移動させる
Dim entity As AcadEntity
Dim pickedPnt As Variant
ThisDrawing.Utility.GetEntity entity, pickedPnt, “移動する図形を選択: ”

‘ 移動ベクトルの定義
Dim fromPt(0 To 2) As Double ‘ 基点(0,0,0)
Dim toPt(0 To 2) As Double ‘ 目的方向

‘ 0,0,0 から 100,50,0 への移動 = 相対的な移動量
fromPt(0) = 0: fromPt(1) = 0: fromPt(2) = 0
toPt(0) = 100: toPt(1) = 50: toPt(2) = 0

‘ 移動実行
entity.Move fromPt, toPt
entity.Update
End Sub

なぜ「0,0,0」から始めるのか?

もし特定の座標 `(500, 500)` に図形を飛ばしたい場合は、「図形の現在の中心点」から「(500, 500)」へのベクトルを指定する必要があります。単に `Move(500, 500)` と書くことはできない、というのがAutoCAD APIの厳格なルールです。

まとめ:あなたは今、AutoCADを「操作」し始めた

お疲れ様でした。今回学んだことは以下の3点です。

1. 座標は3つの要素を持つ配列(Variant)で扱う。
2. `GetPoint` でユーザーから座標を「もらう」ことができる。
3. `Move` や `AddCircle` などのメソッドで座標を「与える」ことができる。

座標を自由自在に扱えるようになると、図面から自動で集計表を作ったり、Excelのデータから一瞬で図面を組み上げたりすることが可能になります。

次は、複数の図形をまとめて処理する「セレクトセット」の世界があなたを待っています。一歩ずつ、しかし確実に、この強力なツールを自分の手足にしていきましょう。

あなたがこの魔法(VBA)を使いこなし、退屈な作業から解放される日を楽しみにしています!

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