AutoCAD VBAを掌握する極限の知見:点群データ(Point Cloud)インポートの深層
シニアアーキテクトの領域へようこそ。
一般の入門書が「ボタンの押し方」や「構文のいろは」で足踏みしている間、我々は常にシステム全体のライフサイクル、メモリのフットプリント、そしてAutoCADという巨大なC++ネイティブ・アプリケーションのCOM(Component Object Model)境界の向こう側を直視しなければならない。
特に、今日の3Dスキャンデータの主流である膨大な点群データ(LAS、LAZ、E57など)をAutoCAD VBAから扱う場合、無知なコードは即座にメモリリークを引き起こし、致命的なクラッシュを招く。
本稿では、AutoCAD VBAを用いた点群データのインポート・表示の基本を解説しつつ、実務の現場で生き残るための「真のアーキテクチャ」を授けよう。
—
1. AutoCADオブジェクトモデルにおける点群(PointCloud)の立ち位置
AutoCADのCOM APIにおいて、点群データは `AcadPointCloud` もしくは拡張された `AcadEntity` のサブカテゴリとして表される。だが、忘れてはならないのは、点群は単なるベクター線分ではないということだ。それは数百万から数億の「3次元座標と輝度・RGB値を持つ構造化データの塊」である。
VBAからこれらを制御する場合、`.NET API (ObjectARX)` のようなネイティブなポインタ操作はできない。私たちはCOMラッパーの制約の中で、最大のパフォーマンスを引き出すコードを書く必要がある。
点群インポートの限界と前提
AutoCAD VBA自体には、直接「LASファイルをパースしてバイナリを読む」ようなネイティブメソッドは用意されていない。通常、AutoCADは内部でインデクサ(Autodesk ReCap等)を介して点群をキャッシュ最適化(`.rcp` / `.rcs` 形式への変換)する。
したがって、VBAからのアプローチとしては、「既存の最適化済み点群プロジェクト(.rcp)を図面にアタッチする」、もしくは「COM経由でインポートコマンドを安全にキックする」という2つの現実解が存在する。
—
2. 実装コード:安全な点群アタッチのプロトタイプ
以下に、実務の現場で使用に耐えうる、エラーハンドリングとオブジェクトのライフサイクル管理を徹底したVBAコードを示す。
Option Explicit
‘ ==============================================================================
‘ モジュール名: MdlPointCloudLoader
‘ 概要: 外部の点群プロジェクト(RCP形式)を指定座標にアタッチする極限の実装
‘ アーキテクト: 伝説のチーフアーキテクト
‘ ==============================================================================
Public Sub AttachPointCloudToCurrentDrawing()
‘ 1. 宣言と初期化(暗黙の型変換を排除)
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim modelSpace As AcadModelSpace
Dim pointCloudObj As AcadEntity ‘ COMの境界を意識した汎用型
‘ ファイルパスと挿入基点の設定(実環境に合わせて変更せよ)
Dim rcpFilePath As String
rcpFilePath = “C:\Data\PointClouds\FactorySiteA.rcp”
‘ 挿入基点 (X, Y, Z)
Dim insertionPoint(0 To 2) As Double
insertionPoint(0) = 0.0: insertionPoint(1) = 0.0: insertionPoint(2) = 0.0
‘ スケール、回転角
Dim scaleFactor As Double: scaleFactor = 1.0
Dim rotationAngle As Double: rotationAngle = 0.0
‘ 2. 堅牢なファイル存在チェック (FileSystemObjectの活用)
If Not CheckFileExists(rcpFilePath) Then
MsgBox “致命的エラー: 指定された点群プロジェクトが見つかりません。” & vbCrLf & rcpFilePath, vbCritical, “API Error”
Exit Sub
End If
‘ 3. AutoCADセッションの確実な捕捉
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If Err.Number <> 0 Then
MsgBox “実行中のAutoCADインスタンスを捕捉できません。”, vbCritical, “COM Exception”
Exit Sub
End If
On Error GoTo 0
Set acadDoc = acadApp.ActiveDocument
Set modelSpace = acadDoc.ModelSpace
‘ 4. トランザクション的処理の開始とパフォーマンス最適化
‘ 画面描画をフリーズさせることで、COM通信のオーバーヘッドを劇的に削減する
acadApp.Preferences.Display.TextScreenampilkan = False ‘ 必要に応じ調整
acadDoc.SetVariable “REGENMODE”, 0
On Error GoTo ErrorHandler
‘ 5. 点群アタッチの実行
‘ 注: AutoCADのバージョン(API仕様)により AddPointCloud メソッドのシグネチャが
‘ 異なる場合があるため、SendCommandによる安全なCUIコマンド実行を併用するケースもある。
‘ ここではモダンなCOMメソッドの適用例を示す。
Dim cmdString As String
‘ コマンドライン経由でのアタッチはレガシー環境でも最も確実な手法の一つである
‘ “-POINTCLOUDATTACH” コマンドを構築する
cmdString = “_POINTCLOUDATTACH ” & Chr(34) & rcpFilePath & Chr(34) & ” ” & _
CStr(insertionPoint(0)) & “,” & CStr(insertionPoint(1)) & “,” & CStr(insertionPoint(2)) & ” ” & _
CStr(scaleFactor) & ” ” & _
CStr(rotationAngle) & vbCr
‘ 同期的にコマンドを送信
acadDoc.SendCommand cmdString
‘ 6. 成功ログと環境復元
acadDoc.SetVariable “REGENMODE”, 1
acadDoc.Regen acAllViewports
MsgBox “点群データのアタッチが正常に完了しました。”, vbInformation, “Architecture Success”
GoTo Finally
ErrorHandler:
‘ 異常系ハンドリング
MsgBox “予期せぬエラーが発生しました: [” & Err.Number & “] ” & Err.Description, vbCritical, “Critical Failure”
Finally:
‘ 7. メモリ最適化とオブジェクトの明示的解放(極めて重要)
‘ COMオブジェクトの参照カウンタを確実にデクリメントする
Set modelSpace = Nothing
Set acadDoc = Nothing
Set acadApp = Nothing
‘ 環境変数の強制復元
On Error Resume Next
acadDoc.SetVariable “REGENMODE”, 1
On Error GoTo 0
End Sub
‘ — ヘルパー関数: FSOによる高速ファイルチェック —
Private Function CheckFileExists(ByVal filePath As String) As Boolean
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
CheckFileExists = fso.FileExists(filePath)
Set fso = Nothing
End Function
—
3. チーフアーキテクトが教える「現場の知見」とメモリ最適化
上記のコードを見て、「なぜ直接COMオブジェクトを生成して追加しないのか?」と疑問に思ったシニアエンジニアもいるだろう。そこにはAutoCAD特有の深い闇と知見がある。
① COMラッパーの限界と `SendCommand` の優位性
点群エンジン(Autodesk ReCap SDK)は、数ギガバイトに及ぶインデックスデータをバックグラウンドでロードする。VBAから直接プロパティやメソッドを叩くアプローチは、COMのマーシャリング境界を頻繁に跨ぐため、バスネック(速度低下)や原因不明のCOM例外(HRESULT 80004005など)を引き起こしやすい。
あえて `SendCommand` を用いてネイティブコマンド(`-POINTCLOUDATTACH`)を駆動する手法は、レガシーなAutoCAD環境やバージョン差異に対しても最も頑健(ロバスト)である。
② メモリ最適化の鉄則:オブジェクトの解放
VBAはガベージコレクションを持たない。`Set modelSpace = Nothing` を省略するコードは、開発者の怠慢であり、長時間稼働する設計システムにおいてはメモリリークの温床となる。
特に点群を扱うセッションでは、CAD本体のメモリ消費量が跳ね上がるため、プロシージャの終了時には必ずすべてのCOM変数を明示的に `Nothing` に解放し、VBAランタイムの参照カウンタを強制的にゼロに落とさなければならない。
③ システム間連携(BIM/CIMプラットフォームへの昇華)
このVBAマクロ単体で終わらせてはならない。例えば、外部のERPやPDM(製品データ管理)システムからCSVやJSON形式で「どの点群ファイルをどの座標に配置すべきか」のメタデータを受け取り、それをFileSystemObjectで動的に読み込んで一括アタッチするバッチ処理へと昇華させるべきだ。
それこそが、単なる「マクロ作成者」から「インフラストラクチャ・アーキテクト」へと脱皮するための条件である。
—
結びにかえて
点群データの活用は、もはや未来の技術ではなく、今日のインフラ・建築業界の必須要件だ。VBAという一見レガシーに見える言語であっても、背後にあるCOMの挙動、メモリ管理、そしてAutoCADのアーキテクチャを完全に掌握していれば、最先端の3Dワークフローを制御する強力な武器となる。
妥協なきコードを書き続けろ。システムは、君の知見の深さにのみ比例して安定するのだから。
