【実務・中級編】【初心者向け】AutoCAD VBAで図面上の点(Point)オブジェクトを、指定した座標に自動配置する – AutoCAD VBA解析バイブル

スポンサーリンク

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を掌握する唯一の道だ。健闘を祈る。

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