【SolidWorks API】干渉チェックの自動レポート化:機械学習以前の「堅牢な自動化」の極意
大規模アセンブリの干渉チェックは、設計の最終段階における最大の鬼門だ。GUIで一個ずつ確認し、Excelにコピペする作業は、我々エンジニアが人生で最も浪費すべきではない時間である。
今回は、`IAssemblyDoc.FeatureInterference2` を中核に据え、Excelへのデータ転送、そして幾何学的な位置を特定した動的なスクリーンショット取得までを自動化する。単なるコードの羅列ではない。メモリ管理と、SolidWorksという巨大なコンポーネントをいかに「行儀よく」扱うかという、アーキテクチャの視点を共有する。
—
1. 破壊的コードを回避するアーキテクチャ設計
SolidWorksのAPI、特にアセンブリ関連はメモリリークの温床だ。`SldWorks`や`ModelDoc2`オブジェクトを闇雲に保持し続けるのは自殺行為に近い。
守るべき鉄則
1. オブジェクトの明示的解放: `Set obj = Nothing` を徹底せよ。特に大規模アセンブリでは、COM参照カウンタが積み重なると、SolidWorks本体がメモリ不足でクラッシュする。
2. 画面更新の抑制: `swApp.Visible = True` だとしても、`ModelDocExtension.FeatureManager.EnableFeatureTree = False` を活用し、UI描画負荷を極限まで下げる。
3. エラーハンドリングの多重化: 干渉ゼロの場合にAPIが空のVariantを返した瞬間にVBAは沈黙する。`IsArray`での厳密な型チェックが必須だ。
—
2. 干渉レポート自動化の実装ロジック
以下に、Excel VBAからSolidWorksを操作する中核モジュールを示す。
‘ 必要な参照設定: SolidWorks 20xx Type Library, Excel Object Library
Option Explicit
Public Sub GenerateInterferenceReport()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Dim vInterferences As Variant
Dim i As Long
‘ SolidWorksプロセスへの接続(既存のインスタンスを掴むのが基本)
Set swApp = GetObject(, “SldWorks.Application”)
Set swModel = swApp.ActiveDoc
If swModel.GetType <> swDocASSEMBLY Then Exit Sub
Set swAssy = swModel
‘ 干渉チェックの実行
‘ 第4引数は「全てのアセンブリ構成部品」を対象にする定数
vInterferences = swAssy.FeatureInterference2(Nothing)
If IsEmpty(vInterferences) Then
MsgBox “干渉は見つかりませんでした。”, vbInformation
Exit Sub
End If
‘ Excelシートの準備
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1)
‘ レポート出力ループ
For i = 0 To UBound(vInterferences)
Dim swInterference As SldWorks.Interference
Set swInterference = vInterferences(i)
‘ 1. 部品名と体積の出力
ws.Cells(i + 2, 1).Value = swInterference.Component1.Name2
ws.Cells(i + 2, 2).Value = swInterference.Component2.Name2
ws.Cells(i + 2, 3).Value = swInterference.Volume
‘ 2. 干渉箇所へのズームとキャプチャ
Call CaptureInterference(swModel, swInterference, ws.Cells(i + 2, 4))
‘ COM参照解放
Set swInterference = Nothing
Next i
‘ 終了処理
Set swAssy = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
3. 「キャプチャの極意」:WinAPIの活用
SolidWorksの `ModelDoc2.Extension.SaveAs` は便利だが、特定の干渉箇所をズームしてキャプチャするなら、`ViewZoomToSelection` を経由したクリップボード経由のキャプチャが最も信頼性が高い。
Private Sub CaptureInterference(swModel As ModelDoc2, swInt As Interference, targetCell As Range)
‘ 干渉部品を選択状態にし、ズーム
swModel.ClearSelection2 True
swInt.Component1.Select2 False, 0
swInt.Component2.Select2 True, 0
swModel.ViewZoomToSelection
‘ Windows APIを使用して画面キャプチャをクリップボードへコピー
‘ (※別途 user32.dll の keybd_event 等を定義する必要あり)
Call Keybd_PrintScreen
‘ Excelへ貼り付け
targetCell.Select
ActiveSheet.Paste
End Sub
—
4. チーフアーキテクトからの助言:保守の壁を越えるために
この記事を読んでいるあなたが、明日から現場でこのツールを導入するなら、以下の3点だけは忘れないでほしい。
- バージョン互換性: `FeatureInterference2` は、SolidWorksのマイナーアップデートで挙動が微妙に変わることがある。必ず開発環境と運用環境のビルド番号を一致させよ。
- 非同期処理の誤解: VBAはシングルスレッドだ。SolidWorksが重い処理を行っている最中にExcel側で干渉データを触りに行くと、COM例外が発生する。`DoEvents` を適切に挟み、SolidWorks側の処理完了を待機するロジックを入れ込むこと。
- レガシーの継承: このコードは、将来的にC# (.NET 6+)へ移植することを前提に書くべきだ。VBAはあくまでプロトタイピングのツールである。ロジック(干渉解析)とビュー(Excel出力)を分離しておくことが、数年後の自分を救うことになる。
技術は手段であり、目的は「工数の削減と設計品質の向上」だ。このスクリプトが、あなたの設計現場における「静かな革命」のトリガーとなることを期待している。
