【入門編】【実務中級】図面内の全円弧(Arc)オブジェクトの始点・終点・中心座標と半径を取得・リスト化する – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけの自動化から一歩抜け出し、「自分の手でCADを自在に操りたい」と願うあなたにとって、今日のテーマは最高のステップアップになります。

今回は、実務でも非常によく使う「図面内にあるすべての円弧(Arc)から、中心・始点・終点・半径の幾何情報を一網打尽に抽出し、リスト化する」という実践的なプログラムを解説します。

ここをクリアすれば、AutoCAD VBAの根幹である「オブジェクトモデル」と「コレクションの走査」の基本が完全にバッチリ身につきますよ。さあ、一緒にプロの扉を開きましょう!

1. なぜ「円弧」のデータ取得は実務で重要なのか?

設計の現場では、図面から座標データを抜き出して解析したり、他のシステム(CAMやFEM解析など)へデータを渡したりする作業が頻繁に発生します。

特に「円弧(Arc)」は、直線(Line)と違って「中心座標」と「半径」という独自のパラメータを持っています。これをAutoCADの画面上から手作業でプロパティウィンドウを覗いて転記していたら、日が暮れてしまいますよね。

VBAを使えば、数千個の円弧があっても一瞬でデータをメモリ上に捉え、Excelに出力したり、ログとしてウィンドウに吐き出したりすることが可能です。

2. 押さえておくべきAutoCADオブジェクトモデルの基礎

AutoCAD VBAを書く上で、絶対に頭に入れておかなければならない「ピラミッド構造」があります。それが以下の階層です。

AcadApplication (AutoCAD本体)
└─ AcadDocument (現在開いている図面)
└─ AcadModelSpace (作図空間 / モデル空間)
└─ AcadEntity (個々の図形:Line, Circle, Arc など)

今回のミッションをこの構造に当てはめると、手順はたったこれだけです。
1. 「今開いている図面のモデル空間」を指し示す。
2. モデル空間の中にある「すべての図形」を1つずつ順番に見ていく
3. その図形が「円弧(Arc)」であるかを確認する。
4. 円弧であれば、中心、始点、終点、半径のプロパティを引っこ抜く

たったこれだけです。非常にシンプルでしょう?

3. 【実務仕様】全円弧データ抽出マクロ

それでは、開発環境(VBE:Visual Basic Editor)を開いて、以下のコードを標準モジュールに貼り付けてみてください。実務でそのまま使えるよう、エラーハンドリングと丁寧なコメントを仕込んであります。

Sub ExtractArcGeometryData()
‘ 変数の宣言
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim modelSpace As AcadModelSpace
Dim entity As AcadEntity
Dim arcObj As AcadArc

‘ データ格納用の変数
Dim centerPt As Variant
Dim startPt As Variant
Dim endPt As Variant
Dim radius As Double

‘ カウンターと出力用文字列
Dim arcCount As Long
Dim reportLog As String

On Error GoTo ErrorHandler

‘ 1. 実行中のAutoCADアプリケーションとアクティブドキュメントを取得
Set acadApp = ThisDrawing.Application
Set acadDoc = acadApp.ActiveDocument
Set modelSpace = acadDoc.ModelSpace

arcCount = 0
reportLog = “— 図面内円弧データ抽出レポート —” & vbCrLf

‘ 2. モデル空間内の全エンティティをループ処理
For Each entity In modelSpace
‘ 3. オブジェクトのタイプが「円弧 (AcDbArc)」であるか判定
If TypeOf entity Is AcadArc Then
‘ 型キャスト(AcadEntity から専用の AcadArc へ)
Set arcObj = entity

‘ 4. 各種ジオメトリプロパティの取得
‘ ※AutoCADの座標(Point)は3次元配列(X, Y, Z)で返されます
centerPt = arcObj.Center
startPt = arcObj.StartPoint
endPt = arcObj.EndPoint
radius = arcObj.Radius

‘ 5. ログデータの構築
arcCount = arcCount + 1
reportLog = reportLog & “【円弧 No.” & arcCount & “】” & vbCrLf & _
” – 中心座標: X=” & Format(centerPt(0), “0.000”) & _
“, Y=” & Format(centerPt(1), “0.000”) & _
“, Z=” & Format(centerPt(2), “0.000”) & vbCrLf & _
” – 始点座標: X=” & Format(startPt(0), “0.000”) & _
“, Y=” & Format(startPt(1), “0.000”) & _
“, Z=” & Format(startPt(2), “0.000”) & vbCrLf & _
” – 終点座標: X=” & Format(endPt(0), “0.000”) & _
“, Y=” & Format(endPt(1), “0.000”) & _
“, Z=” & Format(endPt(2), “0.000”) & vbCrLf & _
” – 半径 : ” & Format(radius, “0.000”) & vbCrLf & _
“———————————-” & vbCrLf
End If
Next entity

‘ 6. 結果の出力(イミディエイトウィンドウに表示)
Debug.Print reportLog
MsgBox “処理が完了しました。” & vbCrLf & “抽出された円弧の数: ” & arcCount & ” 個” & vbCrLf & “(詳細はイミディエイトウィンドウを確認してください)”, vbInformation, “完了”

Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub

4. コードの深掘りポイント&初心者がハマりやすい罠

このコードには、AutoCAD VBAをマスターする上で絶対に知っておくべき「技術的なエッセンス」が詰まっています。いくつか重要なポイントを解説します。

① `TypeOf … Is` による型安全なフィルタリング

モデル空間には、線、円、文字、ブロックなど、ありとあらゆる図形が混在しています。もし `If TypeOf entity Is AcadArc Then` の判定を入れずに、いきなり `Set arcObj = entity` を実行すると、「型が一致しません(Type mismatch)」という有名な実行時エラーでマクロがクラッシュします。
「すべての図形を見るが、円弧のときだけ処理する」というこのガード文が、堅牢なプログラムの命です。

② AutoCAD特有の「Variant型で返る座標配列」

`arcObj.Center` や `arcObj.StartPoint` が返す値は、単なる数値ではなく 「3要素のDouble型配列(X, Y, Z)」 です。
VBAではこれを `Variant` 型の変数で受け取るのが定跡です。そのため、取り出すときは `centerPt(0)`(X座標)、`centerPt(1)`(Y座標)、`centerPt(2)`(Z座標)のように、インデックスを指定してアクセスします。ここを `centerPt.X` のように書くと怒られてしまうので注意してください。

③ 結果の確認方法(イミディエイトウィンドウ)

今回のコードでは、大量のデータをすっきり確認するために `Debug.Print` を使ってVBEの「イミディエイトウィンドウ」に結果を出力しています。
VBEの画面で `Ctrl + G` を押すと下部に現れるウィンドウです。Excelのセルに書き出す前段階のデバッグやデータ確認において、この手法はプロの現場でも愛用されています。

5. さらに実務で活用するために(発展のヒント)

今回のコードをベースにすれば、次のような実務の自動化へ簡単に応用できます。

  • Excel連携: `Debug.Print` で出力している部分を、Excelのワークシートオブジェクト(`Range(“A1”).Value = …`)に書き換えるだけで、ワンクリックで「円弧リストのExcel帳票」が完成します。
  • 条件分岐の追加: 「半径が50以上の大きな円弧だけを抽出したい」といった条件を `If radius >= 50 Then` のようにループ内に挟むだけで、高度な設計データのフィルタリングが実現できます。

まとめ

今回は、図面内の全円弧からジオメトリ情報を抽出するプログラムを通じて、AutoCAD VBAのオブジェクトモデルの走査と型判定の基本を解説しました。

「図面の中にあるオブジェクトを一つずつ検査し、必要な情報だけを抜き出す」——このパターンさえ掴んでしまえば、線分であれ、文字であれ、ブロックであれ、アプローチは全く同じです。

あなたのCADライフを劇的に楽にする自動化の第一歩、ぜひご自身の環境でも試してみてくださいね。それでは、次回の応用編でお会いしましょう!

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