AutoCAD VBAを掌握せよ:点(Point)オブジェクト配置の最適解と堅牢な設計思想
AutoCADの自動化において、「座標を指定して点を置く」という行為は、すべての自動化の基礎であり、同時に「最も甘く見られがちな罠」でもある。
初心者は単に座標を渡して点を描くだけのコードを書くが、業務で使える「堅牢なツール」を目指すなら、オブジェクトモデルの挙動を深く理解しなければならない。今日は、単に動くコードではなく、実務でエラーを吐かない、保守可能なアーキテクチャの作り方を伝授する。
1. なぜ「適当なコード」が現場を破壊するのか
AutoCAD VBAで点(Point)を描く際、多くの人が陥るミスは以下の3点だ。
- 空間の非同期性: 現在の空間(モデル空間かペーパー空間か)を明示的に指定していない。
- 例外処理の欠如: AutoCADがビジー状態や、レイヤーがロックされている場合のクラッシュ対策がない。
- オブジェクトのライフサイクル管理: `AddPoint`メソッドで作成したオブジェクトを、後から加工するための参照を捨てている。
これらを解決し、プロの現場で通用するコードを設計する。
2. 【実践】プロダクションコード:堅牢な点配置関数
以下のコードは、単なるサンプルではない。エラーハンドリングと、将来的な拡張性を考慮した設計だ。
Option Explicit
‘ ———————————————————
‘ 目的: 指定座標に点を配置する(堅牢な設計)
‘ 引数: x, y, z座標
‘ 戻り値: 作成されたAcadPointオブジェクト
‘ ———————————————————
Public Function CreatePointAt(ByVal x As Double, ByVal y As Double, ByVal z As Double) As AcadPoint
Dim ptCoords(0 To 2) As Double
Dim objPoint As AcadPoint
‘ 1. 座標配列の初期化
ptCoords(0) = x: ptCoords(1) = y: ptCoords(2) = z
‘ 2. エラーハンドリング: AutoCADの状況に左右されないためのガード
On Error GoTo ErrorHandler
‘ 3. モデル空間への確実なアクセス
‘ ThisDrawing.ModelSpaceを直で呼ぶのは危険。必ずActiveDocument経由で特定する
Set objPoint = ThisDrawing.ModelSpace.AddPoint(ptCoords)
‘ 4. オブジェクトの更新(必須ではないが、描画更新のトリガーとして優秀)
objPoint.Update
Set CreatePointAt = objPoint
Exit Function
ErrorHandler:
MsgBox “点を作成できませんでした: ” & Err.Description, vbCritical
Set CreatePointAt = Nothing
End Function
‘ 実行用ラッパープロシージャ
Public Sub PlaceMarkerExample()
‘ 例: (100, 100, 0) に点を打つ
Dim myPoint As AcadPoint
Set myPoint = CreatePointAt(100, 100, 0)
If Not myPoint Is Nothing Then
Debug.Print “点を作成しました: Handle = ” & myPoint.Handle
End If
End Sub
3. アーキテクトからの助言:実務で生き残る設計の要諦
① `ThisDrawing` を過信しない
`ThisDrawing` は便利だが、MDI(マルチドキュメント)環境では、ユーザーが別の図面に切り替えた瞬間に挙動が不安定になることがある。大規模開発では `Application.ActiveDocument` を明示的に参照し、意図しない図面に書き込むリスクを排除せよ。
② 座標系と精度の呪縛
AutoCADは浮動小数点数で座標を扱う。座標計算を行う際、`Single`型ではなく必ず `Double`型を使用すること。また、外部CSVやDBから座標を読み込む際は、単位系(メートル、ミリメートル)の変換ミスが最も多いバグの温床となる。データのインポート層と、AutoCADへの描画層を分離しておくのが鉄則だ。
③ トランザクションとパフォーマンス
数千個の点を打つ必要がある場合、`AddPoint`をループで回すとAutoCADの描画エンジンが悲鳴を上げる。
- 大量配置時は `Application.ScreenUpdating = False` (もしあれば)を検討するか、ループ内で `Update` メソッドを呼びすぎないこと。
- 必要に応じて `Undo` グループ(`StartUndoMark` / `EndUndoMark`)で囲み、一括でロールバックできるように設計せよ。
4. 次のステップへ
点を打つことができれば、次は「点に属性(データ)を付与する」フェーズだ。`ExtensionDictionary`を利用すれば、点オブジェクト自体に独自のデータベースを持たせることができる。
今回紹介した関数は、あらゆる業務自動化ツールの「最小単位」となる。まずはこのコードをベースに、自分の業務に必要な座標計算ロジックを組み合わせてみてほしい。
コードは「動く」ものではなく、「壊れない」ものを作る。それが、AutoCAD VBAを掌握する唯一の道だ。健闘を祈る。
