こんにちは!AutoCADの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進んで、「自分の手でCADを自在に操りたい」と願うあなたへ。
今回は、AutoCAD VBAの心臓部とも言える「オブジェクトモデル」と、実務でめちゃくちゃ役立つ「寸法計算の自動化」をテーマにお話しします。
「画面上で測った距離に、図面の尺度(スケール)を掛け算して、実際の構造物の大きさをパッと出すツール」を作ってみましょう。ここをクリアすれば、AutoCAD VBAの基礎はバッチリです!一緒にマスターしていきましょうね。
—
1. AutoCAD VBAの基本:世界は「Application」と「Document」から始まる
VBAを書くとき、私たちはAutoCADという巨大な宇宙をコントロールすることになります。その宇宙のピラミッド構造をまず頭に叩き込みましょう。
- `AcadApplication` (最高神:AutoCADそのもの)
- applicationオブジェクトは、CADのウィンドウ全体や、複数の図面ファイル全体を管理します。
- `AcadDocument` (現人神:現在開いている図面)
- 私たちが普段図面を描いている「モデル空間」や「レイアウト」、そして図面内の線や文字といったすべてのオブジェクトは、この `Document` の中に存在しています。
今回の主役:`Utility` オブジェクトの魔法
`AcadDocument` の中には、ユーザー対話(画面をクリックさせたり、文字を入力させたりする機能)を司る `Utility`(ユーティリティ) という強力な相棒がいます。
この `Utility` の中にある `GetDistance` というメソッドを使うと、画面上でユーザーに2点を選ばせ、その「CAD上のピクセル…ではなく図面単位の距離」を瞬時に取得できるのです。
—
2. 陥りやすい罠:「CAD上の長さ」と「現実の長さ」のギャップ
ここで実務ならではの大きな罠があります。
例えば、1:100の縮尺で描かれた建築図面があるとします。
画面上で2点間を測り、`GetDistance` が返してきた値が `10`(mm)だったとします。
しかし、構造物の実寸(現実の大きさ)はいくつですか?
そう、10mm × 100 = 1000mm(1メートル)ですよね。
初心者の方がやりがちなのは、取得したCAD上の数値だけを信じてしまい、「あれ?実寸と計算が合わないぞ…」とパニックになることです。実務のツールを作るなら、「現在の図面が何分の1で描かれているか(尺度)」を考慮するひと手間が絶対に必要になります。
—
3. 実装:実寸算出計測ツールのコード
お待たせしました!ここからは、実務の現場でそのままコピー&ペーストして使える実践的なVBAコードを公開します。
VBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてください。
Sub MeasureRealDistanceWithScale()
‘ —————————————————————-
‘ 2点間の距離を測り、図面の縮尺を考慮した実寸値を算出するツール
‘ —————————————————————-
‘ エラーハンドリング(ユーザーがESCキーでキャンセルした時の対策)
On Error GoTo ErrorHandler
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing.Application.ActiveDocument
Dim util As AcadUtility
Set util = acadDoc.Utility
Dim cadDistance As Double
Dim realDistance As Double
Dim drawingScale As Double
Dim promptMsg As String
‘ 1. ユーザーに図面上の「縮尺(例: 1/50なら 50)」を尋ねる
promptMsg = vbCrLf & “図面の尺度係数を入力してください (例: 1/100の図面なら 100):”
drawingScale = util.GetReal(promptMsg)
‘ 2. 画面上で1点目と2点目を指定してもらい、CAD上の距離を取得する
cadDistance = util.GetDistance(, vbCrLf & “計測する1点目を指定してください: “)
‘ 3. CAD上の距離 × 尺度係数 = 実寸値の算出
realDistance = cadDistance drawingScale
‘ 4. 結果をメッセージボックスとコマンドラインに出力する
Dim resultMessage As String
resultMessage = “— 計測結果 —” & vbCrLf & _
“CAD上の計測値: ” & Format(cadDistance, “#,
0.00″) & ” 単位” & vbCrLf & _
“適用した尺度: 1 / ” & drawingScale & vbCrLf & _
“——————” & vbCrLf & _
“【実寸値】: ” & Format(realDistance, “#,
0.00″) & ” mm”
MsgBox resultMessage, vbInformation, “実寸計測アシスタント”
‘ コマンドラインにもログとして残す(実務では地味に便利!)
acadDoc.Utility.Prompt vbCrLf & resultMessage & vbCrLf
Exit Sub
ErrorHandler:
‘ ユーザーがESCキーを押した場合などのエラーを優しくスルーする
If Err.Number <> -2147352567 Then
‘ 想定外のエラーのみ通知
‘ MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub
—
4. コードの深掘り解説:なぜこの書き方なのか?
世界最高峰のエンジニアとして、このコードの「こだわりポイント」を少しだけ解説させてください。
1. `ThisDrawing.Application.ActiveDocument` の明示
複数の図面を開いているマルチドキュメント環境において、どの図面を対象にしているのかを曖昧にしないことは、バグを防ぐための鉄則です。
2. `util.GetReal` による安全な数値入力
文字入力ではなく数値だけを受け付ける `GetReal` を使うことで、ユーザーがアルファベットなどを誤入力するリスクを防いでいます。
3. 優美なエラーハンドリング (`On Error GoTo`)
CADの計測系メソッドは、ユーザーが途中で `ESC` キーを押してキャンセルすると実行時エラーを起こして強制終了します。これをそのまま放置するとユーザーがイライラするので、エラー番号をトラップして静かに終了させています。この「ユーザーフレンドリーな配慮」こそが、プロとアマの分水嶺です。
—
まとめ
今回は、`AcadDocument` と `Utility` オブジェクトを駆使して、単なる距離計測にとどまらない「実務で使える実寸算出ツール」を作りました。
- CAD上の「見た目の数値」と、現実の「スケールが反映された数値」は別物であること。
- `GetDistance` と `GetReal` を組み合わせれば、対話的な高度なツールが簡単に作れること。
ここをクリアできたあなたなら、もうAutoCAD VBAの基礎は完全に自分のものにできています。自信を持って、日々の業務の自動化に挑んでくださいね。それでは、次のステップでお会いしましょう!
