こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然わからない……」と途方に暮れていませんか?
大丈夫、安心してください。今日あなたがここで「AcadEntityのCoordinatesプロパティ(座標情報)」の扱い方をマスターすれば、AutoCADは単なる「お絵描きソフト」から、「強力なデータベース&自動化エンジン」へと姿を変えます。
図面からスマートにデータを抽出し、外部システムと連携させる――そんなプロのエンジニアへの第一歩を、私と一緒に楽しく踏み出していきましょう!
—
1. AutoCAD VBAの根幹:オブジェクトモデルとEntityの正体
AutoCAD VBAのコードを書くとき、私たちは常に「オブジェクトの階層構造(モデル)」を意識しています。
- `AcadApplication`: AutoCADという巨大なアプリケーションそのもの。
- `AcadDocument`: 今、目の前で開いている「図面ファイル」。
- `AcadModelSpace` / `AcadPaperSpace`: 図面の中にある「空間」。
- `AcadEntity`: その空間に存在するすべての図面要素(線分、円、ポリラインなど)の総称(抽象概念)です。
「何が描かれているか」をVBAに問いかける
図面の中にある線や円は、VBAから見ると最初はみな「何かの図形(`AcadEntity`)」です。「あ、これは円だな」「こっちはポリラインだな」と判別し、それぞれの図形が持つ固有のデータ(中心点、半径、頂点など)を引っ張り出すのが、今回のメインテーマです。
ここで最強の武器となるのが、図形たちが共通して持っている(あるいは個別で持っている)`Coordinates`プロパティです。
—
2. ジオメトリ抽出の要:Coordinatesプロパティの罠と真実
さて、ここからが少しプロフェッショナルな領域、本質のお話です。
`Coordinates`(座標)という言葉を聞くと、「XとYのペアでしょう?」と思いがちですよね。しかし、ここがAutoCAD VBAで最も多くの初心者がハマる「最初の落とし穴」です。
🚨 2D/3Dの呪縛と「1次元配列」という仕様
AutoCADは、見た目が2次元の平面図であっても、内部データは3次元(X, Y, Z)で保持されています。さらに、`Coordinates`プロパティが返すのは、整然とした2次元配列ではなく、「1次元のVariant型配列」という少しクセのあるデータ構造です。
- 線分(AcadLine)の場合: `[始点X, 始点Y, 始点Z, 終点X, 終点Y, 終点Z]` という6つの数値が、ズラッと1列に並んだ配列として返ってきます。
- 軽量ポリライン(AcadLWPolyline)の場合: 2Dの頂点データであっても、`[X1, Y1, X2, Y2, X3, Y3…]` のように、XとYが交互にフラットな配列として格納されます。
この「フラットな1次元配列」を頭の中でスッとイメージできるようになると、AutoCAD VBAの座標処理は驚くほど簡単になりますよ!
—
3. 【実践】モデル空間からジオメトリを抽出するコード
百聞は一見にしかず。実際にモデル空間にあるすべての図形をスキャンし、線分(Line)と円(Circle)、そしてポリライン(LWPolyline)から座標情報を華麗に抽出するマクロを見てみましょう。
VBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Sub ExtractGeometryData()
Dim acadDoc As AcadDocument
Dim ent As AcadEntity
Dim msg As String
‘ 現在アクティブな図面を取得
Set acadDoc = ThisDrawing.Application.ActiveDocument
‘ モデル空間内のすべてのエンティティをループ処理
For Each ent In acadDoc.ModelSpace
‘ 図形の種類(TypeName)によって処理を分岐
Select Case TypeName(ent)
Case “AcadLine”
‘ 線分の場合:始点と終点の座標を取得
Dim lineCoords As Variant
lineCoords = ent.Coordinates
MsgBox “【線分を発見】” & vbCrLf & _
“始点: X=” & lineCoords(0) & “, Y=” & lineCoords(1) & vbCrLf & _
“終点: X=” & lineCoords(3) & “, Y=” & lineCoords(4), _
vbInformation, “ジオメトリ抽出”
Case “AcadCircle”
‘ 円の場合:中心点と半径を取得(Coordinatesは中心座標を返す)
Dim centerPoint As Variant
centerPoint = ent.Coordinates
MsgBox “【円を発見】” & vbCrLf & _
“中心: X=” & centerPoint(0) & “, Y=” & centerPoint(1) & vbCrLf & _
“半径: ” & ent.Radius, _
vbInformation, “ジオメトリ抽出”
Case “AcadLWPolyline”
‘ 軽量ポリラインの場合:頂点座標の配列を取得
Dim polyCoords As Variant
polyCoords = ent.Coordinates
‘ 頂点数の計算(配列の要素数 / 2。2Dポリラインの場合)
Dim vertexCount As Long
vertexCount = (UBound(polyCoords) + 1) / 2
MsgBox “【ポリラインを発見】” & vbCrLf & _
“頂点数: ” & vertexCount & ” 箇所”, _
vbInformation, “ジオメトリ抽出”
End Select
Next ent
MsgBox “すべてのジオメトリ抽出が完了しました!”, vbExclamation, “完了”
End Sub
コードの解説:ここがポイント!
1. `For Each ent In acadDoc.ModelSpace`: モデル空間にある図形を1つずつ取り出す、定番かつ最も安全な走査ループです。
2. `TypeName(ent)`: オブジェクトの本当の型を文字列で返してくれます。これを使うことで、条件に応じた安全なキャスト(型変換)が可能になります。
3. 配列のインデックス: VBAの配列は通常 `0` から始まります。そのため、線分の始点Xは `lineCoords(0)`、始点Yは `lineCoords(1)` と指定します。
—
4. 現場でありがちな「エラー」と回避の極意
実務でこのコードを運用し始めると、いくつかの「お約束の罠」に直面します。先輩エンジニアとして、あらかじめ回避策を授けておきましょう。
⚠️ エラー1:「オブジェクトはサポート外のプロパティまたはメソッドを持っています」
- 原因: すべての `AcadEntity` が `Coordinates` や `Radius` を持っているわけではありません。例えば、文字(`AcadText`)やハッチング(`AcadHatch`)には、線分のような「頂点配列」はありません。
- 回避策: 上記のサンプルコードのように、必ず `Select Case TypeName(ent)` で型をチェックしてからプロパティにアクセスしてください。型を無視していきなり `ent.Coordinates` を叩くと、容赦なく実行時エラー(エラー438)が発生します。
⚠️ エラー2:3D図面(Z座標が含まれている場合)の落とし穴
- 原因: 3Dポリライン(`AcadPolyline`)や、Z軸に高さを持った線分を処理する場合、前述の「1次元配列のインデックスの刻み幅」が変わります(2DならX,Yの2つ刻み、3DならX,Y,Zの3つ刻み)。
- 回避策: 2D図面を前提とするうちは `AcadLWPolyline`(軽量ポリライン)を対象にし、Z座標が必要な場合は配列のステップ数(`UBound` の割り算)を `3` に切り替えるロジックを組み込みましょう。
—
5. まとめ:ここをクリアすれば、AutoCAD VBAの基本はバッチリ!
お疲れ様でした!今回は `AcadEntity` と `Coordinates` プロパティを切り口に、AutoCAD図面からジオメトリ情報を抽出する本質を解説しました。
- 図形はすべて `AcadEntity` という抽象概念として扱える。
- 座標データはフラットな1次元配列(`Variant`)で返ってくる。
- `TypeName` で図形の種類を判定してから安全にデータを引き出す。
ここをしっかりとクリアできれば、図面から座標をCSV形式で書き出したり、外部の構造計算ソフトやExcelと連携して自動見積もりシステムを作ったりすることも、もはや夢ではありません。
あなたのAutoCAD自動化ライフが、ここからさらに加速することを応援しています。
それでは、次のステップでお会いしましょう!
