AutoCAD VBAを掌握せよ:ポリライン操作の「正解」と堅牢な設計指針
AutoCADの自動化において、`Polyline`(LWPOLYLINE)は避けて通れない最重要オブジェクトだ。しかし、多くの初心者が陥る罠がある。「とりあえず動くコード」を量産し、半年後に修正不可能なスパゲッティコードに泣くことだ。
今日は、AutoCAD VBAのアーキテクトとして、単なる「ポリラインの描き方」ではなく、「実務で耐えうる堅牢なポリライン制御術」を伝授する。
—
1. なぜ「ポリライン」を甘く見てはいけないのか
AutoCADのオブジェクトモデルにおいて、`AddLightWeightPolyline`は極めて強力だが、頂点情報の扱いに癖がある。多くのチュートリアルは「配列を渡して終わり」と教えるが、実務では頂点の追加・削除・座標変更を動的に行う必要がある。
ここで意識すべきは、「メモリ管理」と「オブジェクトの更新(Updateメソッド)」だ。
—
2. 【プロダクションコード】ポリラインの生成と編集のテンプレート
以下のコードは、単に動くだけでなく、エラーを抑制し、後続の処理に影響を与えないよう設計された「実戦型」のモジュールだ。
Option Explicit
‘ ———————————————————
‘ ポリライン生成および編集のベストプラクティス
‘ ———————————————————
Public Sub CreateAndEditPolyline()
Dim acadDoc As AcadDocument
Dim plineObj As AcadLWPolyline
Dim points(0 To 5) As Double ‘ 3頂点分の座標 (x1, y1, x2, y2, x3, y3)
‘ 初期化
Set acadDoc = ThisDrawing
‘ 1. 座標の定義
points(0) = 0: points(1) = 0
points(2) = 100: points(3) = 0
points(4) = 100: points(5) = 100
‘ 2. オブジェクト生成(ModelSpaceに直書きは厳禁。関数化推奨)
Set plineObj = acadDoc.ModelSpace.AddLightWeightPolyline(points)
‘ 閉じたポリラインにする
plineObj.Closed = True
‘ 3. 幅の設定 (定数で管理し、マジックナンバーを排除する)
Const GlobalWidth As Double = 2.5
plineObj.ConstantWidth = GlobalWidth
‘ 4. 頂点編集(第2頂点を移動させる)
‘ 注意:頂点インデックスは0から始まる
Dim newVertex(0 To 1) As Double
newVertex(0) = 150: newVertex(1) = 50
plineObj.SetPoint 1, newVertex
‘ 5. データベースの更新を明示的に呼ぶ(重要)
plineObj.Update
MsgBox “ポリラインの構築が完了しました。”
End Sub
—
3. 実務で「バグらせない」ための3つの鉄則
① 配列の次元と型を厳密に管理せよ
AutoCADのAPIは、データ型に非常に敏感だ。`Variant`型で曖昧に渡すと、予期せぬ実行時エラーが発生する。`Double`型の配列を明示的に宣言し、サイズ変更が必要な場合は `ReDim` を活用すること。
② データベース更新は「更新のトリガー」を知る
`plineObj.Update` を呼ばなくても図面は描画されることがある。しかし、複雑な計算を伴うプログラムでは、描画キャッシュとデータベースが不整合を起こす。「オブジェクトを変更した直後はUpdateを呼ぶ」という規律を、チームのコーディングルールに刻め。
③ ファイル・DB連携時の注意点
外部のCSVやExcelから座標を読み込んでポリラインを生成する場合、必ず以下のステップを踏め。
1. 入力データのバリデーション: `NaN`(数値以外)が含まれていないかチェックする。
2. トランザクション的思考: 途中でエラーが起きたら、描画されたオブジェクトを削除(Rollback)する例外処理を `On Error GoTo` で実装すること。これがないツールは、ゴミ図面を量産する「破壊兵器」だ。
—
4. アーキテクトからの助言:次のステップへ
初心者は「描くこと」に集中するが、真のエンジニアは「どう修正しやすくするか」に集中する。
- 関数化の徹底: `CreatePolyline(points As Double(), width As Double)` のように、引数で制御可能な関数に分割せよ。
- クラスモジュールの活用: 将来的にポリラインを「管理オブジェクト」として扱いたくなったら、標準モジュールではなくクラスモジュールへ移行せよ。
AutoCADのAPIは古いが、その堅牢性は今もなお最強だ。コードを書き捨ての消耗品にせず、資産として積み上げる意識を持ってほしい。
君の作るツールが、誰かの残業を1分でも減らすことを願っている。健闘を祈る。
