【上級プロへの登竜門】SolidWorksイベントフックでアセンブリを「監視」する:リアルタイム同期システムの構築
こんにちは。自動化の深淵へようこそ。
「マクロの記録」ボタンを押して生成されたコードを並べるだけの時代は、今日で終わりにしましょう。
アセンブリを操作する際、最も困難なのは「ユーザーが今、何をしたか」をシステムが知ることです。パーツを追加したのか、削除したのか。それをVBAで追いかけるには、単なるコマンドの実行ではなく、「SldWorksのイベント駆動型アーキテクチャ」を掌中に収める必要があります。
今回は、SolidWorksアセンブリ内のコンポーネント変動をリアルタイムでフックする、プロフェッショナルな監視システムの設計図を伝授します。
—
1. なぜ「イベント」を使うのか?
従来の「ボタンを押してマクロを実行する」手法では、ユーザーの手動操作(ドラッグ&ドロップでの追加など)を検知できません。
私たちが目指すのは、「アセンブリが自律的に自身の変化を外部へ通知する」状態です。これには`SldWorks.AssemblyDoc`インターフェースが持つイベントを利用します。
必要な準備
1. クラスモジュールを使用する(イベントをキャッチする「窓口」を作るため)。
2. `WithEvents`キーワードでSolidWorksオブジェクトを宣言する。
—
2. 監視システムの構築:実装コード
まずは、アセンブリ内のコンポーネント増減をキャッチするクラスモジュールを作成します。
クラスモジュール(名前: `clsAssemblyMonitor`)
Option Explicit
‘ WithEventsを使い、AssemblyDocのイベントを監視対象にする
Public WithEvents swAssy As SldWorks.AssemblyDoc
‘ コンポーネントが追加された瞬間に走るイベント
Private Function swAssy_ComponentAddedNotify(ByVal ComponentModel As Object, ByVal CompName As String) As Long
Debug.Print “検知: コンポーネントが追加されました -> ” & CompName
‘ ここに外部データベースへの書き込みや、ログ出力処理を書く
swAssy_ComponentAddedNotify = 0 ‘ 0を返すのが作法
End Function
‘ コンポーネントが削除された瞬間に走るイベント
Private Function swAssy_ComponentDeletingNotify(ByVal ComponentModel As Object, ByVal CompName As String) As Long
Debug.Print “警告: コンポーネントが削除されます -> ” & CompName
‘ 削除前の最終確認や、依存関係のチェックが可能
swAssy_ComponentDeletingNotify = 0
End Function
標準モジュール(監視を起動するトリガー)
Option Explicit
‘ インスタンスを保持する変数
Public myMonitor As clsAssemblyMonitor
Sub StartMonitoring()
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
‘ 現在のアクティブドキュメントを監視対象にする
If swApp.ActiveDoc Is Nothing Or swApp.ActiveDoc.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてください。”
Exit Sub
End If
Set myMonitor = New clsAssemblyMonitor
Set myMonitor.swAssy = swApp.ActiveDoc
MsgBox “アセンブリ監視システムが起動しました。”
End Sub
—
3. 陥りやすい罠:なぜ監視が止まるのか?
このシステムを組む際、多くの初学者が直面する壁が「メモリからの変数の消失」です。
「変数の寿命」を理解する
標準モジュールで宣言した `myMonitor` は、VBAの実行が終わるとメモリから解放されようとします。監視を継続させるには、この変数が「生き続けている」必要があります。
- 解決策: 上記のように標準モジュールで `Public` 変数として宣言するか、あるいは常駐型のフォーム(UserForm)を表示し続け、そのモジュールレベルで保持するのが定石です。
—
4. プロの視点:パフォーマンスと安定性
リアルタイム監視システムで最も注意すべきは「イベントハンドラ内での重い処理」です。
- 再帰呼び出しの回避: イベントの中で再びアセンブリ操作(パーツの追加など)を行うと、無限ループ(イベントがイベントを呼ぶ)に陥り、SolidWorksがクラッシュします。
- 非同期的な設計: 重い外部通信やデータベース接続を行う場合は、イベント内には「フラグを立てる」ことだけを記述し、実際の処理は `OnTime` メソッドなどで非同期に実行する工夫が必要です。
—
最後に:エンジニアとしてのステップアップ
ここをクリアしたあなたは、もう「マクロを動かす人」ではありません。「SolidWorksというプラットフォームを制御するアーキテクト」です。
イベント駆動を使いこなせば、設計ミスを未然に防ぐチェックツールや、PDMと連携したリアルタイムパーツリスト作成など、現場の生産性を劇的に変えるシステムが構築できます。
「動くコード」を書くのではなく、「壊れない設計」を書く。
その意識を持てば、あなたのコードは格段に洗練されるはずです。
何か不明点があれば、またいつでも聞いてください。あなたの自動化の旅を、全力でサポートします。
