【実務・中級編】【初心者向け】AcadDocumentオブジェクトで新規図面を作成し、基本的な図形(線、円)を配置する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの「儀式」を超えて:堅牢な図面生成とモデル空間の掌握

AutoCADの自動化を志すエンジニア諸君。VBAによる自動化は、単なる「作業の代行」ではない。それはAutoCADという巨大なCADエンジンの心臓部に直接命令を送り込む「設計の神」になる行為だ。

多くの初心者が「ネットで拾ったコードをコピペして動いた」というレベルで止まっている。だが、実務で数千枚の図面を扱うエンジニアにとって、それは「時限爆弾」を抱えるに等しい。本稿では、`AcadDocument`と`ModelSpace`を制御し、業務で通用する「枯れたコード」の書き方を叩き込む。

1. なぜ「雑なコード」は死を招くのか

多くのコードが陥る罠は、「現在の図面が何であるか」を特定せずに処理を行うことだ。`ThisDrawing`という甘美なキーワードに依存してはならない。

実務レベルのコードでは、必ず「どのドキュメントを対象にしているか」を明示的にオブジェクト変数に格納せよ。これにより、メモリの解放漏れを防ぎ、複数の図面を跨いだバッチ処理にも耐えうる設計が可能になる。

2. 堅牢な図面作成と図形配置の実装

以下に、新規図面を作成し、モデル空間に線と円を配置する「プロダクション(本番)用」のコードを示す。

Option Explicit

‘ ———————————————————
‘ 機能: 新規図面に線分と円を描画する
‘ ポイント: オブジェクト変数を明示的に管理し、エラーを抑制する
‘ ———————————————————
Public Sub CreateDrawingAndShapes()
Dim acadApp As AcadApplication
Dim newDoc As AcadDocument
Dim mSpace As AcadModelSpace

‘ 1. AutoCADアプリケーションへの接続(Late Binding/Early Bindingの考慮)
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If Err.Number <> 0 Then
MsgBox “AutoCADが起動していません。”, vbCritical
Exit Sub
End If
On Error GoTo 0

‘ 2. 新規図面の作成
‘ テンプレートを指定しない場合はデフォルトが使用される
Set newDoc = acadApp.Documents.Add(“acad.dwt”)

‘ 3. モデル空間へのアクセス
‘ 描画のコンテキストを確定させる
Set mSpace = newDoc.ModelSpace

‘ 4. 図形の描画処理
DrawSampleShapes mSpace

‘ 5. ビューの更新(重要)
newDoc.Regen acActiveViewport

MsgBox “図面の生成が完了しました。”, vbInformation
End Sub

Private Sub DrawSampleShapes(ByRef targetSpace As AcadModelSpace)
Dim startPt(0 To 2) As Double
Dim endPt(0 To 2) As Double
Dim centerPt(0 To 2) As Double
Dim radius As Double

‘ 線分の定義
startPt(0) = 0: startPt(1) = 0: startPt(2) = 0
endPt(0) = 100: endPt(1) = 100: endPt(2) = 0
targetSpace.AddLine startPt, endPt

‘ 円の定義
centerPt(0) = 50: centerPt(1) = 50: centerPt(2) = 0
radius = 25
targetSpace.AddCircle centerPt, radius
End Sub

3. 実務エンジニアが守るべき「3つの鉄則」

コードが動くことはスタートラインに過ぎない。現場で生き残るために、以下の設計思想を脳に刻んでほしい。

① 座標系の管理を疎かにしない

AutoCADのAPIが要求する座標は、常に`Variant型(Double配列)`だ。動的に座標を計算する際は、必ず配列の境界値(0 to 2)を厳守せよ。ここを適当に書くエンジニアは、複雑な図面になった瞬間に座標計算ミスで地獄を見る。

② モデル空間とペーパー空間の分離

今回紹介した `ModelSpace` へのアクセスは、図面の「図面領域」に直結する。しかし、実務ではレイアウトタブ(PaperSpace)への出力も頻出する。`targetSpace` を引数として渡す設計にしておけば、モデル空間かペーパー空間かを切り替えるだけで、同じ描画ロジックを再利用可能だ。

③ エラーハンドリングは「沈黙」を許さない

`On Error Resume Next` を無闇に使うな。これはデバッグを困難にする悪魔の呪文だ。例外が発生した際に、それが「図面が存在しないのか」「メモリ不足なのか」をユーザーに明示できる設計こそが、プロの仕事である。

最後に:自動化の先にあるもの

AutoCAD VBAは、単なるスクリプト言語ではない。AutoCADのオブジェクトモデルを理解することは、「設計データを構造として捉える力」を養うことと同義だ。

これから君たちが作成するツールは、明日には誰かの残業を数時間分消し去るかもしれない。その重みを理解し、常に「保守性」と「堅牢性」を意識したコードを書いてほしい。

さあ、次はデータベースとの連携だ。図面情報をExcelや外部DBと同期させ、真の「インテリジェントな製図」を実現する準備をしておくように。コードの質が、君たちのエンジニアとしての価値を決めるのだから。

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