点の座標を一括で取得するマクロ|AutoCAD VBAマクロの作成方法
今回のサンプルマクロは図面(モデル空間)内に存在するすべての点の座標を一括で取得するマクロです。点の座標はPointオブジェクトのプロパティにアクセスすることで、簡単に取得することができます。座標値は数値の配列データとして取得ができるため、VBAで操作可能なExcelやPowerPointに出力したり、CSVファイルやテキストファイルのような外部に出力することも可能です。
マクロ機能
・取得した点の座標はマルチテキストでモデル空間内に出力する
※座標値は小数第2位までにまるめる
本マクロではすぐに結果が見られるように点の座標をマルチテキストとして図面上に出力していますが、Excelに出力したりCSVやテキスト形式にして出力することも可能です。
サンプルコード
マクロのサンプルコードは下記のとおりです。事前にアクティブドキュメントのモデル空間に閉じたポリラインを作成しておく必要があります。測定結果を表示するテキストのサイズは定数のため、ポリラインのサイズによっては小さすぎたり大きすぎたりする可能性があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Option Explicit Sub main() Dim mdlSpace As AcadModelSpace Dim oEntity As AcadEntity Dim oPoint As AcadPoint Dim vCoords As Variant Dim oMtext As AcadMText Dim sText As String Set mdlSpace = ThisDrawing.ModelSpace 'モデル空間要素ループ For Each oEntity In mdlSpace If TypeName(oEntity) = "IAcadPoint" Then 'Entity→Pointオブジェクトに変換 Set oPoint = oEntity '点座標取得 vCoords = oPoint.Coordinates '座標値から文字列作成 sText = "X=" & Format(vCoords(0), "0.00") & vbLf & _ "Y=" & Format(vCoords(1), "0.00") 'マルチテキスト作成(座標値出力) Set oMtext = mdlSpace.AddMText(vCoords, 10, sText) oMtext.Height = 10 End If Next '描画更新 Call ThisDrawing.Regen(acActiveViewport) End Sub |
コード解説
モデル空間内の点ループ処理
モデル空間を操作するためのModelSpaceはコレクションであるため、コレクション内ループを行うことでモデル空間内の全要素を取得することができます。このとき取得したオブジェクトのタイプを判定することで、点要素のみに対して特定の処理を行うことができるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'モデル空間取得 Set mdlSpace = ThisDrawing.ModelSpace 'モデル空間要素ループ For Each oEntity In mdlSpace 'ポリラインの場合のみ測定対象 If TypeName(oEntity) = "IAcadPoint" Then 'If oEntity.ObjectName = "AcDbPoint" Then こちらでも可 '※点に対する処理 End If Next |
サンプルコードでは上記の通りTypeName関数を使って要素が点であるかを判定していますが、別の方法として「ObjectNameプロパティ」を調べるという手法もあります。
点の座標を取得
点の座標はPointオブジェクトのCoordinatesプロパティより取得することができます。CoordinatesプロパティはDouble型の配列データとなっていますが、データの受け渡しを行うためVariant型の変数で受け取る必要があります。このときVariant型の配列とする必要もありません。
Dim vCoords As Variant ‘※Doubleや配列として宣言しない
vCoords = [Point].Coordinates
基本的にAutoCADの座標関連のデータはDouble型の配列となっていはいますが、実際の処理上ではVariant型の変数でやり取りするケースが非常に多いです。逆にDouble型や配列として用意した変数で座標値を受け取ろうとするとエラーが発生する場合があるので注意が必要です。
座標値をマルチテキスト出力
取得した点のXY座標をマルチテキストとして出力します。マルチテキストはVBAではMTextオブジェクトとして扱われ、ModelSpaceオブジェクトのAddMTextメソッドにより作成可能です。AddMTextメソッドの使い方やMTextの編集方法などはMTextオブジェクトページを参照ください。
1 2 3 4 5 6 7 8 9 |
'座標値から文字列作成 sText = "X=" & Format(vCoords(0), "0.00") & vbLf & _ "Y=" & Format(vCoords(1), "0.00") 'マルチテキスト作成(座標値出力) Set oMtext = mdlSpace.AddMText(vCoords, 10, sText) oMtext.Height = 10 |
Coordinatesプロパティで取得される座標値は小数点以下のかなり細かい数値まで取得できるため、サンプルコードではFormat関数を使って小数点以下第2位まで表示するようにしています。
まとめ
今回のマクロの核である「点座標の取得」は、PointオブジェクトのCoordinatesプロパティにアクセスするだけで取得可能です。点の座標さえ取得できてしまえば座標の小さい順にソート(並べ替え)したり、結果を出力したり、それをもとに線を引いたりと様々な処理には制することができます。
処理としてはコード1行で終わる簡単な内容ですが、座標を取得する系の処理は基本的にどれも似たような内容になっています。本ページの内容が理解できればその他のオブジェクトの座標も同じ要領で簡単に取得することができます。(プロパティはCoordinates以外のものもありますが)