【入門編】【上級】AcadApplication.ListArxとLoadArxによる「ObjectARXアドイン」の動的ロードと依存関係管理 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化を進めていくと、「VBAだけでは手が届かない、もっと高速な処理がしたい」「自社製の専用コマンド(ARX)と連携させたい」という壁にぶつかることがありますよね。

今回は、VBAからAutoCADの心臓部であるObjectARX(C++で書かれた超高速な拡張プログラム)を自在にコントロールする、ちょっとディープで最高に実用的なテクニックをご紹介します。

「VBAから外部のプログラムをロードするなんて難しそう…」と思うかもしれませんが、安心してください。ここをクリアすれば、あなたのAutoCAD環境は一気に「プロ仕様の統合システム」へと進化します。優しく紐解いていきますので、一緒にマスターしていきましょう!

1. なぜVBAからARXを動的ロードする必要があるのか?

AutoCADを起動するたびに、必要なアドイン(.arxファイル)を毎回手動でロードしていませんか?あるいは、特定の図面を開いたときだけ、裏側で専用のプログラムを動かしたいと思ったことはありませんか?

人間が手動でやっているうちは、ロード忘れによるエラー(「未知のコマンドです」という冷たいメッセージ)が必ず発生します。

それを防ぐのが、今回解説する「ランチャー機能」です。

  • `ListArx`メソッドを使って、現在AutoCADのメモリ上にそのARXがすでにロードされているかを静かに確認する。
  • `LoadArx`メソッドを使って、もしロードされていなければ、プログラムが瞬時に自動ロードする。

この仕組みを作っておけば、ユーザーは余計な手順を一切意識することなく、VBAからいつでも安心して拡張機能のコマンドを呼び出せるようになります。

2. 基礎知識:AcadApplicationとARXのライフサイクル

AutoCAD VBAの根幹には、常に最高位のオブジェクトである `ThisDrawing.Application` (または単に `Application` / `AcadApplication`) が存在します。

ObjectARXは、AutoCADのプロセス空間に直接DLLとしてロードされ、メモリ上で密に連携します。そのため、VBAからこれを扱う際には、以下のポイントに注意する必要があります。

1. 二重ロードの防止: すでにロードされているARXを再度ロードしようとすると、AutoCADがエラーを返すか、予期せぬ挙動を引き起こします。そのため、必ず事前にチェックするというワンクッションがプロの作法です。
2. パスの解決: ARXファイルの場所は、相対パスではなく、絶対パス(またはAutoCADのサポートファイル検索パスに含まれる場所)で指定するのが鉄則です。

3. 【実践】動的ロード&依存関係管理コード

それでは、実際の現場でそのままコピペして使える実用的なVBAコードを公開します。
このコードは、指定したARXファイルがロードされているかを`ListArx`で調べ、未導入であれば`LoadArx`で自動ロードするプロシージャです。

Option Explicit

‘ ==============================================================================
‘ 担当:シニアCAD自動化エンジニア
‘ 概要:指定されたObjectARXアドインのロード状態を監視・自動ロードする関数
‘ ==============================================================================
Public Sub EnsureArxLoaded(ByVal arxFullPath As String)

Dim acadApp As AcadApplication
Set acadApp = ThisDrawing.Application

Dim arxList As Variant
Dim isLoaded As Boolean
Dim i As Long

isLoaded = False

On Error GoTo ErrorHandler

‘ 1. 現在ロードされているARXのリストを配列として取得する (ListArx)
arxList = acadApp.ListArx()

‘ 2. リストが空(何もロードされていない)でなければ走査する
If Not IsEmpty(arxList) Then
For i = LBound(arxList) To UBound(arxList)
‘ ファイル名やパスの大文字小文字を区別せずに比較
If UCase(arxList(i)) = UCase(arxFullPath) Then
isLoaded = True
Exit For
End If
Next i
End If

‘ 3. 未ロードの場合は動的にロードする (LoadArx)
If Not isLoaded Then
acadApp.LoadArx arxFullPath
MsgBox “ARXアドインのロードに成功しました:” & vbCrLf & arxFullPath, vbInformation, “自動ロード完了”
Else
‘ すでにロードされている場合は何もしない(クワイエット・サクセス)
‘ Debug.Print “ARXは既にロードされています: ” & arxFullPath
End If

Exit Sub

ErrorHandler:
MsgBox “ARXのロード中に重大なエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “エラー”
End Sub

‘ ==============================================================================
‘ 実行用のラッパープロシージャ
‘ ==============================================================================
public Sub RunMyCustomTool()
‘ ※環境に合わせてパスを書き換えてください
Const TARGET_ARX = “C:\CompanyCADTools\Arx\SuperFastGeometry.arx”

‘ 依存関係の解決(ARXのロード)
EnsureArxLoaded TARGET_ARX

‘ ここでARXが提供するカスタムコマンドを呼び出す
‘ 例: ThisDrawing.SendCommand “MY_SUPER_COMMAND ”

MsgBox “準備完了!独自の拡張機能を実行できます。”, vbInformation
End Sub

4. コードの解説:ここがエンジニアのこだわりポイント!

  • `acadApp.ListArx()` の戻り値の正体

`ListArx`メソッドは、AutoCADに現在読み込まれているすべてのARX(および一部の関連モジュール)のパスを文字列の配列(Variant)として返します。これを`IsEmpty`や`LBound`/`UBound`で安全にループ処理するのがポイントです。

  • 大文字小文字の吸収 (`UCase`)

Windowsのファイルパスは大文字小文字を区別しませんが、プログラムの世界では厳密に比較すると「C:\Path\Tool.arx」と「c:\path\tool.arx」を別物とみなしてしまうことがあります。`UCase`で揃えて比較することで、無駄な再ロードを防ぎます。

  • 堅牢なエラーハンドリング (`On Error GoTo`)

もし指定したパスにARXファイルが存在しなかったり、ファイルが破損していたりする場合、`LoadArx`は実行時エラーを発生させます。現場でマクロが突然フリーズするのを防ぐため、必ずエラーハンドラを仕込んでおきましょう。

5. 陥りやすい罠とアドバイス

初心者のうちは、次のようなトラブルに直面しがちです。

> Q. 「ファイルが見つかりません」というエラーが出ます。
> A. AutoCADのセキュリティ設定(信頼できるパスなど)や、ネットワークドライブの権限を確認してください。基本的にはローカルの固定パス(例: `C:\MyTools\…`)を指定するか、完全な絶対パスを渡すのがトラブル回避の近道です。

> Q. ロードは成功するのに、肝心のコマンドが動きません。
> A. `LoadArx`が実行されてから、AutoCADがそのコマンドを認識して登録するまでに、ごくわずかなタイムラグが生じる場合があります。もし連続してコマンドを送信する場合は、必要に応じて`DoEvents`を挟むなど、システムの息継ぎを考慮してあげると完璧です。

まとめ

今回は、`AcadApplication.ListArx`と`LoadArx`を駆使した、ObjectARXアドインの動的ロードと依存関係管理について解説しました。

ここをクリアできれば、VBA単体の限界を軽々と突破し、自社専用の強力なC++アドインとVBAをシームレスに連携させるプロフェッショナルな自動化環境が手に入ります。

「マクロの記録」の向こう側にある、こうしたシステム構築の面白さを知っていただければエンジニアとしてこれ以上の喜びはありません。あなたのAutoCADライフを、ぜひさらに快適にアップデートしてくださいね!

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