【実務・中級編】【初心者向け】AutoCAD VBAで図面上の点群データ(Point Cloud)を読み込み・表示する基本 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する極限の知見
第1回:VBAから点群データ(Point Cloud)をねじ伏せる──3Dスキャンデータ自動インポートの極意

こんにちは。チーフアーキテクトの私だ。
これまで数多のレガシーなAutoCADマクロをリファクタリングし、現場の自動化を泥臭く、かつエレガントに実現してきた。

今回は、実務で急速に需要が高まっている「点群データ(Point Cloud / LAS, E57など)のVBAによる自動読み込みと配置」について解説する。

「おい、VBAで点群なんて扱えるのか?」
「UIを手動でポチポチする方が早いんじゃないか?」

そう思ったそこのあなた。甘い。数百枚、数千枚の3Dスキャンデータを一括処理する現場において、手動オペレーションは「悪」だ。今回は、AutoCADのオブジェクトモデルの深層に切り込み、バグを絶対に起こさない堅牢な点群インポート・自動化コードをあなたに伝授しよう。

1. AutoCAD VBAにおける「点群(Point Cloud)」の現実と設計思想

まず、残酷な現実を伝えておこう。
AutoCADのVBA(COMインターフェース)は、何でもかんでも自由自在に操れるわけではない。特に新しい機能や重いリソースを扱うオブジェクト(点群やCivil 3Dのサーフェスなど)は、VBAのネイティブなラッパーが用意されていないか、極めて限定的なプロパティしか公開されていないことが多い。

しかし、絶望するにはまだ早い。
AutoCADには、`SendCommand`という「最後の切り札」がある。
「なんだ、ただのコマンドのエミュレーションか」と侮るなかれ。適切にエラーハンドリングを行い、COMの非同期性と同期性を理解した上で使えば、`SendCommand`は極めて強力な自動化の武器になる。

点群読み込みにおける3つの罠

1. ファイルのパス解決ミス: 相対パスやネットワークドライブの遅延による読み込み失敗。
2. 図面単位(Units)の不一致: ミリメートルとメートルのスケール崩壊。
3. メモリ不足とハングアップ: 巨大なE57/LASファイルを無謀に同時ロードすることによるAutoCADのクラッシュ。

これらを完全にコントロールした、プロダクション品質のコードを見ていこう。

2. 【コピペ即実戦投入可】堅牢な点群インポート・モジュール

以下のコードは、単にコマンドを叩くだけではなく、ファイルの存在確認、例外処理、そしてトランザクション的な視点を取り入れた実務仕様のコードだ。

Option Explicit

‘ ==============================================================================
‘ モジュール名: modPointCloudImporter
‘ 概要: 外部点群データ(LAS/E57等)を安全にAutoCAD図面にアタッチする
‘ アーキテクト特記事項:
‘ – ファイルI/Oの事前検証を徹底し、AutoCADの沈黙(フリーズ)を防ぐ。
‘ – SendCommandの特性を考慮し、文字列のエスケープと空白処理を厳格化。
‘ ==============================================================================

Public Sub ImportPointCloudData()
On Error GoTo ErrorHandler

Dim targetFilePath As String
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument

‘ 1. アプリケーションとドキュメントの参照を取得(Early Bindingを推奨)
Set acadApp = ThisDrawing.Application
Set acadDoc = acadApp.ActiveDocument

‘ 2. インポートする点群ファイルのパスを指定(実務ではFileDialog等に拡張可能)
‘ ※環境に合わせてパス書き換えてください
targetFilePath = “C:\Data\PointCloud\SampleBuilding.e57”

‘ 3. 【最重要】ファイルの存在チェック(これを行わないエンジニアは三流だ)
If Not CheckFileExists(targetFilePath) Then
MsgBox “指定されたファイルが存在しません。” & vbCrLf & targetFilePath, vbCritical, “インポートエラー”
Exit Sub
End If

‘ 4. 座標挿入の基準点(X=0, Y=0, Z=0)と尺度、回転角の設定
‘ 実務ではここでCSV等から座標を動的に読み込む設計にすべきである。
Dim insertX As Double, insertY As Double, insertZ As Double
Dim scaleFactor As Double
Dim rotationAngle As Double

insertX = 0.0
insertY = 0.0
insertZ = 0.0
scaleFactor = 1.0 ‘ 必要に応じて調整(例: mmからmへの変換なら0.001など)
rotationAngle = 0.0 ‘ ラジアン

‘ 5. AutoCADの標準コマンド「POINTCLOUDATTACH」を安全に実行
‘ 注: AutoCADのバージョンや言語(日本語版/英語版)によってコマンド名や
‘ プロンプトの挙動が異なるため、スクリプト実行時は極力ハイフン付き(-POINTCLOUDATTACH)を使用する。
Dim cmdString As String

‘ パスにスペースが含まれている場合に備えてダブルクォーテーションで囲む
cmdString = “_.-POINTCLOUDATTACH “”” & targetFilePath & “”” ” & _
CStr(insertX) & “,” & CStr(insertY) & “,” & CStr(insertZ) & ” ” & _
CStr(scaleFactor) & ” ” & _
CStr(rotationAngle) & vbCr

‘ デバッグ用(イミディエイトウィンドウにコマンドを出力)
Debug.Print “Executing Command: ” & cmdString

‘ コマンドの実行
acadDoc.SendCommand cmdString

‘ 6. 画面の強制再描画(点群の初回読み込み時は表示が崩れやすいため必須)
acadApp.Update
acadDoc.Regen acAllViewports

MsgBox “点群データの読み込みコマンドを送信しました。”, vbInformation, “処理完了”
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error No: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, vbCritical, “致命的エラー”

End Sub

‘ ==============================================================================
‘ 関数名: CheckFileExists
‘ 概要: ファイルの物理存在確認を行うヘルパー関数
‘ ==============================================================================
Private Function CheckFileExists(ByVal filePath As String) As Boolean
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

If fso.FileExists(filePath) Then
CheckFileExists = True
Else
CheckFileExists = False
End If

Set fso = Nothing
End Function

3. チーフアーキテクトが教える「現場でバグらせないための心得」

上記のコードをそのまま社内展開しても動くが、真に「プロフェッショナルな自動化ツール」に仕立て上げるためには、以下の設計思想を頭に叩き込んでおいてほしい。

① 日本語版AutoCADと英語版AutoCADの差異を吸収せよ

AutoCAD VBAの `SendCommand` は、実行するAutoCADの言語環境に依存する。特にコマンドの前にハイフン(`-`)をつけることで、ダイアログボックスをポップアップさせずにコマンドライン(CUI)経由で実行することができる。
実務では、ユーザの環境が日本語版か英語版か、あるいはカスタマイズされたエイリアスが存在するかを考慮し、極力ローカライズの影響を受けないハイフン付きコマンドを使うのが鉄則だ。

② 大容量データ処理における非同期の罠

点群データは数GBから数十GBに及ぶことが珍しくない。`SendCommand` はコマンドをキューイングするだけで、AutoCAD本体が実際にファイルをインデックス化し、ビューポートに描画し終えるまでの完了をVBA側で待ってくれない(非同期処理)。
もしこのスクリプトの直後に別の図形操作(トリムや画層変更など)を記述すると、「点群の読み込みが終わっていないのに次の処理が走ってエラーになる」という典型的な競合バグを踏むことになる。
連続処理を組む場合は、十分なウェイトを入れるか、AutoCADのイベント(`AcadDocument_BeginCommand` 等)を監視する高度な設計が必要となる。

③ データベース(外部連携)との結合

実際の業務では、「どこにどの点群を配置するか」の座標データは、Excel、SQLite、あるいは専用の管理DBに格納されているはずだ。
ハードコーディングされたパスを直すようなツールは、作った本人しか使えない「おもちゃ」にすぎない。前回の記事や一般的なVBAの知見を応用し、ExcelのテーブルからX, Y, Z座標とファイルパスを動的に読み込み、ループで次々と点群をアタッチしていくバッチ処理へと昇華させてほしい。

結びに代えて

AutoCAD VBAはレガシーだと言う者もいる。だが、現場のニーズに即座に応え、手作業の地獄からエンジニアを救い出す「最も手軽で強力な即効薬」であることに変わりはない。

オブジェクトのライフサイクルを理解し、背後で何が起きているのかをロジカルに想像する。その視点さえあれば、VBAはあなたを裏切らない。

さあ、このコードをベースに、あなたの現場のワークフローを極限まで自動化して見せろ。健闘を祈る。

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