【AutoCAD VBA】全ポリラインの頂点座標をCSVへ!効率化の第一歩を極める
こんにちは。AutoCADの自動化の世界へようこそ。
「マクロの記録」ボタンを押すだけの世界から、いよいよ自分の手でAutoCADを操り、業務を劇的に効率化するステップへ踏み出そうとしているあなた。素晴らしい決断です。
今回は、実務で頻出する「図面内の全ポリラインから頂点座標を抽出する」というタスクを題材に、AutoCAD VBAの真髄を伝授します。単に動くコードを書くだけでなく、「なぜそう書くのか」という設計思想まで理解すれば、あなたはもう脱・初学者です。
—
1. AutoCADオブジェクトモデルという「地図」を手に入れる
AutoCAD VBAをマスターするコツは、「オブジェクトの階層構造」をイメージすることです。
- Application: AutoCADそのもの
- Document: 開いている図面ファイル
- ModelSpace: 実際に図形が描かれている「作業台」
私たちは「ModelSpaceという作業台」の上にある「ポリライン(LWPolyline)」を一つずつ拾い上げ、その中にある「座標データ」という宝石を取り出す作業を行います。これが自動化の本質です。
—
2. 実践:ポリライン座標抽出スクリプト
以下のコードをVBAエディタ(`Alt + F11`)に貼り付けてください。単にコピペするだけでなく、コメントを読み解いてみてくださいね。
Sub ExportPolylineCoordinates()
Dim objEnt As AcadEntity
Dim objLWPoly As AcadLWPolyline
Dim varCoords As Variant
Dim i As Integer, j As Integer
Dim strPath As String
Dim fileNum As Integer
‘ 出力先のパスを指定(デスクトップのCSVを指定)
strPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\PolylineCoords.csv”
fileNum = FreeFile
Open strPath For Output As #fileNum
Print #fileNum, “PolylineID,VertexIndex,X,Y”
‘ ModelSpace内の全オブジェクトをスキャン
For Each objEnt In ThisDrawing.ModelSpace
‘ オブジェクトタイプがLWPolylineかチェック
If TypeOf objEnt Is AcadLWPolyline Then
Set objLWPoly = objEnt
‘ 座標配列を取得 (x1, y1, x2, y2, …)
varCoords = objLWPoly.Coordinates
‘ 2座標ずつペアで取得するループ
‘ LBound/UBoundで配列の範囲を動的に取得するのがプロの作法
For i = LBound(varCoords) To UBound(varCoords) Step 2
Print #fileNum, objLWPoly.Handle & “,” & (i / 2) & “,” & _
varCoords(i) & “,” & varCoords(i + 1)
Next i
End If
Next objEnt
Close #fileNum
MsgBox “座標抽出が完了しました!” & vbCrLf & strPath
End Sub
—
3. 現場で「詰まる」ポイントと解決策
初学者が必ずと言っていいほど遭遇する壁がいくつかあります。ここをクリアすれば、もう怖いものはありません。
① 「ポリライン」と「軽量ポリライン(LWPolyline)」の違い
AutoCADには、昔ながらの複雑な構造を持つ「Polyline」と、現在の主流であるデータ軽量な「LWPolyline」が存在します。VBAで扱う際、`TypeOf`を使って確実に`AcadLWPolyline`を狙い撃ちすることが、エラーを避けるコツです。
② 配列のインデックス(LBound / UBound)
`varCoords`に格納される座標は、`x, y, x, y…`という一次元配列です。これを扱う際、わざわざ「何個あるか」を数えてはいけません。`LBound(配列名)`から`UBound(配列名)`までを`Step 2`で回す。これが、配列のサイズが変化しても壊れない、堅牢なコードを書くための鉄則です。
③ ハンドル(Handle)の活用
図面内のオブジェクトを一意に識別するために、`obj.Handle`を使いましょう。これは図面内で唯一無二のIDです。エクスポートした後のデータと、AutoCAD上の図形を照らし合わせる際に最強のキーになります。
—
4. 最後に:あなたの自動化を加速させるために
このスクリプトは、あくまで「基礎の基礎」です。ここからさらに発展させるなら、以下のような拡張が考えられます。
- レイヤーごとに抽出を分ける(`If objLWPoly.Layer = “特定レイヤー” Then…`)
- 閉じたポリラインの面積も同時に出力する
- Excelを直接起動して、セルに書き込む
VBAは、あなたの「面倒くさい」を「ボタン一つ」に変える魔法です。コードを書いて、エラーが出て、調べて、解決する。このサイクルを繰り返すうちに、AutoCADの構造が見えてくるはずです。
何か分からないことがあれば、いつでもまた聞きに来てくださいね。あなたの自動化ライフを心から応援しています!
