こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけの「自動化ごっこ」は、今日で終わりにしましょう。
今回は、AutoCAD VBAの心臓部である「オブジェクトモデル(`AcadApplication`と`AcadDocument`)」を完全に手なずけ、図面から「長さ」や「面積」を自在に引き出す実践的なテクニックを授けます。
「図面から手作業で拾い出しをしていて、計算ミスが怖い……」
「指定したレイヤにあるポリラインの総延長を、一瞬で算出したい!」
そんな現場の絶叫を、たった数行の美しいコードで解決する方法を、優しく、そして骨太にお伝えしていきますね。ここをクリアすれば、あなたのAutoCAD VBAスキルは間違いなく「初心者」から「実務即戦力のエンジニア」へとシフトします。準備はいいですか?さあ、始めましょう!
—
1. AutoCAD VBAの骨格を支配する「2大巨頭」を理解する
AutoCADをVBAで操る際、絶対に避けて通れないのがオブジェクト階層の頂点に君臨する2つの存在です。
1. `ThisDrawing.Application`(または `AcadApplication`)
- AutoCADという「アプリケーションそのもの」を指します。画面の最大化や、開いている複数の図面を統括する親玉です。
2. `ThisDrawing`(または `AcadDocument`)
- 今あなたが開いている「個別の図面ファイル」そのものを指します。これから紹介する線分やポリラインといった図形(Entity)は、すべてこの `Document` の中に存在しています。
VBAを書くとき、私たちは常に「今どの図面の、どの空間(ModelSpace)にアクセスしているか」を意識しなければなりません。
図面空間(ModelSpace)という名のキャンバス
図形は宙に浮いているわけではありません。必ず「モデル空間(ModelSpace)」という巨大なキャンバスの上に描かれています。
コードで表現すると、こうなります。
Dim 空間 As AcadModelSpace
Set 空間 = ThisDrawing.ModelSpace
この `空間` さえ掴んでしまえば、その中にあるすべての線や円を自由自在に料理できるようになります。ここが全ての出発点です。
—
2. 図形が持つ「隠された魔力(プロパティとメソッド)」
AutoCADの図面要素(線分、円、ポリラインなど)は、ただ画面に線が表示されているだけではありません。それぞれが「自分自身の情報(長さや面積など)」を計算する機能を持っています。
例えば、以下のようなオブジェクトが代表的です。
- 線分 (`AcadLine`): `Length` プロパティで一発で長さが出る。
- 円 (`AcadCircle`): `Radius` や `Area`(円の場合は面積)を持つ。
- ポリライン (`AcadLWPolyline`): `Length` で総延長、閉じていれば `Area` で面積が出現する。
これらを「わざわざ人間が測る必要なんてない」のです。プログラムに「お前、長さはいくつだ?」と問いかければ、一瞬で正確な数値を返してくれます。
—
3. 【実践】モデル空間の全ポリラインから「総延長と面積」を暴くVBA
それでは、実務でそのまま使えるコードをお見せしましょう。
このマクロは、現在の図面(ModelSpace)にあるすべてのオブジェクトを総当たりでチェックし、「それがポリラインであれば、長さと面積をイミディエイトウィンドウに出力する」というものです。
VBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けて実行してみてください。
Sub CalclatePolylineMetrics()
‘ —————————————————————–
‘ 目的: モデル空間内のすべてのポリラインを走査し、長さと面積を計算する
‘ —————————————————————–
Dim ent As AcadEntity
Dim polyLineObj As AcadLWPolyline
Dim totalLength As Double
Dim totalArea As Double
Dim count As Long
‘ 変数の初期化
totalLength = 0#
totalArea = 0#
count = 0
‘ エラーハンドリングの基本(実務では必須)
On Error GoTo ErrorHandler
‘ ユーザーへの優しいフィードバック
Debug.Print “=== 数量算出レポート開始 ===”
‘ モデル空間内の全エンティティをループ処理
For Each ent In ThisDrawing.ModelSpace
‘ オブジェクトが「軽量ポリライン (AcDbPolyline)」であるか判定
If TypeOf ent Is AcadLWPolyline Then
Set polyLineObj = ent
‘ 長さを加算
totalLength = totalLength + polyLineObj.Length
‘ 閉じた図形(閉合している)の場合は面積も加算
If polyLineObj.Closed = True Then
totalArea = totalArea + polyLineObj.Area
End If
count = count + 1
End If
Next ent
‘ 結果の出力
Debug.Print “対象ポリライン数: ” & count & ” 本”
Debug.Print “総延長 (Length): ” & Format(totalLength, “#,
0.00″) & ” mm”
Debug.Print “総面積 (Area): ” & Format(totalArea, “#,
0.00″) & ” mm²”
Debug.Print “=== 数量算出レポート終了 ===”
MsgBox “計算が完了しました。イミディエイトウィンドウを確認してください。”, vbInformation, “完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
このコードの知的ポイント
1. `TypeOf … Is …` による型安全な判定
モデル空間には文字、寸法線、ハッチングなど、さまざまなものが混ざっています。その中から「ポリラインだけ」を正確に選別するためにこの構文が不可欠です。
2. `Closed` プロパティの活用
ポリラインが閉じている(端と端が結ばれて領域になっている)場合のみ面積(`Area`)を計算させています。開いたポリラインの面積を無理に取得しようとしてエラーになるのをスマートに防いでいます。
3. `Format` 関数による実務的な配慮
生データは小数点以下が長くなりすぎて見づらいため、`#,
0.00` で整形しています。こういう細部へのこだわりがプロの仕事です。
—
4. 初学者が必ずハマる「罠」と回避策
AutoCAD VBAで数量計算を行う際、多くの人が以下の罠に引っかかります。ここを事前に知っておくだけで、無駄なデバッグ時間を何時間も節約できます。
罠1:図面の単位(UNITS)と寸法のスケール問題
AutoCAD内部では、長さはすべて「図面単位(Drawing Units)」で保持されています。ミリメートルなのか、メートルなのか、あるいはインチなのかは、AutoCADが勝手に判断してくれません。
プログラムが弾き出す数値はあくまで「内部の生データ」です。必要に応じて縮尺係数を掛け合わせる設計にすることを忘れないでください。
罠2:画層(Layer)のフィルター抜け
先ほどのコードは「すべてのポリライン」を対象にしましたが、実務では「特定の画層(例: `A-WALL` や `C-LINE`)だけ計算したい」というケースがほとんどです。
その場合は、ループの中に以下の条件式を1行挟むだけで解決します。
If ent.Layer = “あなたの指定したい画層名” Then
‘ ここに計算処理を書く
End If
これだけで、実務での実用性が一気に跳ね上がります。
—
5. おわりに:ここをクリアすれば、もう怖くない!
お疲れ様でした!今回は、`AcadApplication`と`AcadDocument`の立ち位置を整理し、図面内のエンティティから長さや面積を引き出す実践コードを解説しました。
「図面をプログラムでスキャンし、一瞬で情報を抽出してレポートする」
これができるようになると、AutoCADは単なる「お絵描きソフト」ではなく、「最強のデータベース」へと生まれ変わります。
ここをクリアしたあなたなら、もうマクロの記録機能の限界にイライラすることはありません。ぜひご自身の図面でコードを試し、カスタマイズしてみてください。
あなたのAutoCADライフが、より知的で劇的に効率的なものになることを応援しています。それでは、次のステップでお会いしましょう!
