SolidWorks自動化の「闇」を照らせ:大規模バッチ処理を完全制御するロギング設計術
SolidWorksのAPIを用いた大規模な自動生成処理を行っている時、あなたは「イミディエイトウィンドウ」という名の頼りない灯火だけで迷宮を歩いていないだろうか。
数十万ステップに及ぶフィーチャ生成、あるいは数百のパーツを次々と作成するバッチ処理。「なぜ落ちたのか」「どの条件でジオメトリ計算が破綻したのか」。 実行終了後にフリーズしたSolidWorksを前に、頭を抱える時間は今日で終わりだ。
プロフェッショナルな現場では、ログは単なる記録ではない。「システムの状態を可視化する唯一のライフライン」である。本稿では、FileSystemObject(FSO)を中核に据えた、堅牢かつ保守性の高いロギング基盤の設計思想を伝授する。
—
1. なぜ「イミディエイトウィンドウ」では不十分なのか
VBAの標準的なデバッグ手法である `Debug.Print` に依存してはならない理由は明白だ。
1. 揮発性: SolidWorksがクラッシュした瞬間、メモリ上の出力はすべて霧散する。
2. 追跡不能: 処理が完了した後の「何が起きたか」を、後から再現・検証する術がない。
3. 非同期性: ログの出力コストを考慮しないコードは、大規模処理になるほどパフォーマンスを劣化させる。
我々が求めるのは、「いつ、どのフィーチャで、どんな引数が渡され、結果どうなったか」を時系列で追いかけられる、確固たるトレースログである。
—
2. ログ管理クラスの設計(クラスモジュール: `clsLogger`)
まずは、ログ出力機能を独立したオブジェクトとして定義する。これにより、メインロジックからログの書き込み処理を完全に分離(疎結合化)できる。
‘ クラスモジュール名: clsLogger
Option Explicit
Private fso As Object
Private ts As Object
Private logPath As String
‘ 初期化:ログファイルを生成または追記モードで開く
Public Sub Initialize(ByVal filePath As String)
Set fso = CreateObject(“Scripting.FileSystemObject”)
logPath = filePath
‘ ファイルがなければ作成、あれば追記モードで開く
Set ts = fso.OpenTextFile(logPath, 8, True, -1) ‘ 8:ForAppending, -1:Unicode
End Sub
‘ ログ書き込みメソッド
Public Sub WriteLog(ByVal message As String)
If ts Is Nothing Then Exit Sub
‘ タイムスタンプを付与して書き込む
ts.WriteLine Format(Now, “yyyy-mm-dd hh:mm:ss”) & ” | ” & message
End Sub
‘ 終了処理:リソースの解放
Private Sub Class_Terminate()
If Not ts Is Nothing Then
ts.Close
Set ts = Nothing
End If
Set fso = Nothing
End Sub
—
3. 実践:パーツ生成ロジックへの組み込み
メインの処理において、どのようにこのクラスを操るか。ポイントは「エラーハンドリングとログの同期」である。
Sub CreateComplexPart()
Dim swApp As SldWorks.SldWorks
Dim logger As New clsLogger
‘ ログの初期化(パスは適切に設定すること)
logger.Initialize “C:\Logs\SolidWorks_Log_” & Format(Date, “yyyymmdd”) & “.txt”
On Error GoTo ErrorHandler
logger.WriteLog “処理開始: パーツ生成開始”
‘ ここにフィーチャ生成処理を記述
‘ 例: swModel.CreateFeatureManager…
logger.WriteLog “処理成功: フィーチャ生成完了”
Exit Sub
ErrorHandler:
‘ 致命的なエラーが発生した場合、詳細をログに残して終了
logger.WriteLog “ERROR: ” & Err.Number & ” – ” & Err.Description
MsgBox “エラーが発生しました。ログを確認してください。”
End Sub
—
4. 伝説のエンジニアからの「極限の知見」
この設計を導入するにあたり、以下の3つの鉄則を守ってほしい。
① IOボトルネックを意識せよ
`OpenTextFile` を毎回呼び出すのは非効率だ。上記の例のように、クラスのライフサイクル内でファイルを掴み続け、最後に閉じる設計にすることで、ディスクIOのオーバーヘッドを最小化できる。
② コンテキストを詰め込め
「エラーが発生しました」というログは無価値だ。
- 処理対象の `FeatureName`
- 現在の `PartName`
- 直前に渡したパラメータ(寸法値など)
これらをログに含めることで、再現テストのスピードが劇的に向上する。
③ ログレベルの概念を取り入れる
成長するシステムには、将来的に「INFO(通常記録)」「WARN(警告)」「DEBUG(詳細な値の追跡)」といったログレベルが必要になる。`WriteLog(message, level)` のように引数を拡張し、実行時オプションで出力レベルを切り替えられるようにしておけば、保守性は飛躍的に高まる。
—
結びに:自動化は「信じるもの」ではなく「観測するもの」
あなたが書くコードは、単なるスクリプトではない。SolidWorksという巨大なCADエンジンの上を走る、精密な機械の歯車の一部である。
バグをゼロにすることは不可能に近い。しかし、「バグが発生した瞬間に、その原因を特定できる環境」を作ることは可能だ。 このロギング基盤こそが、あなたのコードを「動く」から「信頼できる」へと昇華させる最初の一歩になる。
さあ、イミディエイトウィンドウを閉じ、ログという名の証拠を積み上げよう。それが、伝説の自動化エンジニアへの唯一の道だ。
