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

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然読めない……」と頭を抱えていませんか?

大丈夫。今日、そのモヤモヤを綺麗に解消しましょう。ここをクリアすれば、AutoCAD VBAの基本とオブジェクトモデルの考え方はバッチリあなたのものです。

今回は実務でも非常によく使う「図面内にあるすべての円(Circle)の『中心座標』と『半径』をごっそり抽出し、リスト化する」というテーマに挑みます。単にコードを動かすだけでなく、「なぜその書き方をするのか」というAutoCAD独自のライフサイクルやメモリの裏側まで、優しく、そして深く解説していきますね。

1. なぜ「全円のリスト化」なのか?(オブジェクトモデルの基礎)

AutoCAD VBAをマスターする上で最初に立ちはだかる壁が、この「オブジェクトモデル(階層構造)」です。

Excel VBAなら `ActiveSheet.Cells` で終わるところが、AutoCADでは少し違います。
AutoCADの世界は、次のようなピラミッド構造になっています。

[AcadApplication] (AutoCAD本体)
└─ [AcadDocument] (現在開いている図面)
└─ [ModelSpace] または [PaperSpace] (作図空間)
└─ [AcadEntity] (線、文字、そして今回の主役「Circle」など)

つまり、図面中の円を取り出すには、「今開いている図面の、モデル空間というキャンバスを覗き込んで、そこにある図形(Entity)の中から『円(Circle)』だけをピンポイントで捕まえに行く」という手順を踏む必要があります。

ここを直感的にイメージできるようになると、AutoCAD VBAで書けないものはありません。

2. 実装コード:図面の全円をリスト化するマクロ

それでは、開発環境(VBAエディタ:`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてみてください。実務でそのまま使える、堅牢で丁寧なコメント付きのコードです。

Sub ExportAllCirclesInfo()
‘ 変数の宣言(AutoCADのオブジェクトたち)
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim ent As AcadEntity
Dim circleObj As AcadCircle

‘ データ格納用
Dim centerPt As Variant
Dim radius As Double
Dim outputText As String
Dim circleCount As Long

‘ 1. AutoCAD本体と現在のアクティブな図面を確実に取得する
On Error Resume Next
Set acadApp = ThisDrawing.Application ‘ または GetObject(, “AutoCAD.Application”)
Set acadDoc = ThisDrawing
On Error GoTo 0

If acadDoc Is Nothing Then
MsgBox “有効な図面が開かれていません。”, vbCritical, “エラー”
Exit Sub
End If

‘ 初期化
circleCount = 0
outputText = “— 図面内 円情報リスト —” & vbCrLf

‘ 2. モデル空間(ModelSpace)の全エンティティを走査する
For Each ent In acadDoc.ModelSpace

‘ 3. 取得した図形が「円(AcDbCircle)」であるか判定する
‘ ※ここが実務で最も重要なエラー回避テクニックです!
If TypeOf ent Is AcadCircle Then

‘ 型キャスト(AcadEntity から AcadCircle へ格上げ)
Set circleObj = ent

‘ 中心座標(Variant型の3次元配列 X, Y, Z)と半径を取得
centerPt = circleObj.Center
radius = circleObj.radius

‘ リスト文字列に追加
circleCount = circleCount + 1
outputText = outputText & _
“No.” & circleCount & _
” | 中心X: ” & Format(centerPt(0), “0.000”) & _
” | 中心Y: ” & Format(centerPt(1), “0.000”) & _
” | 半径: ” & Format(radius, “0.000”) & vbCrLf

End If
Next ent

‘ 4. 結果の出力(円が見つからなかった場合への配慮)
If circleCount > 0 Then
‘ イミディエイトウィンドウに出力
Debug.Print outputText

‘ 画面上にも結果を表示
MsgBox “抽出完了! 合計 ” & circleCount & ” 個の円が見つかりました。” & vbCrLf & _
“詳細はイミディエイトウィンドウ(Ctrl + G)を確認してください。”, vbInformation, “成功”
Else
MsgBox “この図面のモデル空間には円が見つかりませんでした。”, vbExclamation, “通知”
End If

End Sub

3. コードの急所:ここが分かれば中級者!

上記のコードには、現場でベテランが必ず仕込む「2つの知見」が隠されています。ここをしっかり押さえておきましょう。

① `For Each` と `TypeOf … Is` のコンボ

モデル空間には、線(Line)、文字(Text)、ブロック(BlockReference)など、あらゆる図形が雑多に入り混じっています。
ここでいきなり `Set circleObj = ent` とやると、「型が一致しません」というエラー(実行エラー 13)でマクロが強制終了します。

そのため、`If TypeOf ent Is AcadCircle Then` という「関所」を設けて、円以外の図形を華麗にスルーさせることが絶対に必要なのです。

② 中心座標は「Variant型の3次元配列」で返ってくる

AutoCADの座標系(`Center` プロパティなど)は、内部的に `X, Y, Z` の配列データを返します。
VBAでは `centerPt(0)` がX座標、ビギナーが忘れがちな `centerPt(1)` がY座標になります。いきなり `MsgBox centerPt` などとやると怒られてしまうので、`centerPt(0)` のようにインデックスを指定して取り出すのが鉄則です。

4. 陥りやすい罠とトラブルシューティング

  • 「何も出力されないんだけど……?」

→ 今回のコードは「モデル空間(ModelSpace)」を対象にしています。もし文字や円が「ブロック定義の中」や「ペーパー空間(レイアウトタブ)」にある場合、このコードでは拾えません。レイアウト空間も対象にしたい場合は、`acadDoc.PaperSpace` を走査するループを別途用意する必要があります。

  • 「イミディエイトウィンドウってどこ?」

→ VBAエディタ画面で `Ctrl + G` を押すか、メニューの「表示」>「イミディエイト ウィンドウ」を選択すると下部に現れます。大量のテキストデータをスマートに確認するのに非常に便利です。

おわりに

お疲れ様でした!今回は「図面内の全円をリスト化する」というテーマを通じて、AutoCADオブジェクトの走査、型判定、そして座標データの扱い方を見てきました。

この基礎さえ腹に落ちれば、次は「取得した円の半径を一括で書き換える」「Excelへデータをエクスポートする」といった、より高度な自動化へスムーズに進むことができます。

一つひとつのオブジェクトと丁寧に対話する感覚を掴んで、あなたのAutoCADライフを劇的に快適なものにしてくださいね。それでは、次のステップでお会いしましょう!

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