はじめに: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)を使いこなし、退屈な作業から解放される日を楽しみにしています!
