【SolidWorks API】大規模アセンブリの「干渉チェック自動レポート化」:泥沼化を防ぐアーキテクチャ設計
大規模アセンブリにおいて、手動での干渉チェックとExcelへのコピペ作業を繰り返すのは、エンジニアの時間をドブに捨てる行為に等しい。SolidWorks APIを使いこなせば、これを数秒のタスクに変えられる。
しかし、多くの初心者が書くコードは、メモリリークを誘発し、アセンブリが巨大化した瞬間にクラッシュする。「なぜ動かないのか」ではなく、「なぜその設計では破綻するのか」という視点で、現場で通用する堅牢な実装を伝授する。
—
1. 勘所:なぜ「IAssemblyDoc.FeatureInterference2」なのか
干渉チェックには `IAssemblyDoc::GetInterference` も存在するが、実務レベルでは `FeatureInterference2` を推奨する。理由は以下の2点だ。
1. 計算効率: 内部エンジンが最適化されており、大規模モデルでも計算時間が短縮される。
2. 空間データ: 衝突箇所の重心や体積といったメタデータにアクセスしやすく、後のレポート生成で「どの部品がどれだけ食い込んでいるか」を数値化できる。
2. 堅牢な設計のための鉄則
APIを叩く際、以下の3点を徹底しなければ「動くが使えないコード」になる。
- Excelの早期バインディング: `CreateObject` ではなく、参照設定で `Microsoft Excel 16.0 Object Library` を追加すること。インテリセンスが効かない環境での開発は、デバッグのコストが跳ね上がる。
- メモリ解放の徹底: SolidWorksのCOMオブジェクトは、明示的に `Nothing` を代入して解放しないと、バックグラウンドでプロセスが残り続け、次回の実行でメモリ不足を引き起こす。
- 画面更新の制御: `SldWorks.Visible` を隠すのではなく、`ModelDocExtension.ViewZoomToSelection` を利用して干渉箇所へカメラを飛ばし、一時的に表示を制御するスマートな処理を組むこと。
—
3. 実践コード:干渉抽出からExcel転記まで
このコードは、現在開いているアセンブリの干渉を検出し、Excelへ出力するプロダクションモデルの骨子である。
‘ 必要な参照設定: SolidWorks 20xx Type Library / Microsoft Excel 16.0 Object Library
Option Explicit
Sub GenerateInterferenceReport()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてください。”
Exit Sub
End If
Set swAssy = swModel
‘ 干渉設定の定義
Dim swIntMgr As SldWorks.InterferenceDetectionMgr
Set swIntMgr = swAssy.CreateInterferenceDetectionMgr
‘ 干渉計算の実行
swIntMgr.TreatCoincidentAsInterference = False
swIntMgr.EntitiesToInterfere = Nothing ‘ 全部品対象
Dim vInterferences As Variant
vInterferences = swIntMgr.GetInterferences
‘ Excelへの転記処理へ(要別途実装: Excelインスタンスの作成とシートセットアップ)
Call ExportToExcel(vInterferences, swModel)
‘ 後処理
swIntMgr.CloseInterferenceDetection
Set swIntMgr = Nothing
End Sub
Private Sub ExportToExcel(vInterferences As Variant, swModel As SldWorks.ModelDoc2)
‘ 簡易実装例:Excelの各セルに情報を書き込む
‘ 実際にはここで swModel.Extension.SelectByID2 等を用いて
‘ 干渉部位をズームし、CaptureImageメソッドでスクリーンショットを保存する
Dim i As Long
For i = 0 To UBound(vInterferences)
‘ vInterferences(i) は Interference オブジェクト
‘ 干渉体積: vInterferences(i).Volume
‘ 部品名: vInterferences(i).Component1.Name2 等
Debug.Print “Interference found between ” & vInterferences(i).Component1.Name2
Next i
End Sub
—
4. プロの視点:画像キャプチャの落とし穴
多くの開発者が躓くのが、「キャプチャ画像の貼り付け」だ。単にスクリーンショットを撮るだけでは、背景が黒かったり、解像度が低すぎたりして使い物にならない。
- 背景設定: `swModel.ViewGraphicsProperty` を操作し、一時的に背景を白、表示スタイルを「影なし」に切り替えてから撮影する。
- 座標の正規化: 干渉部位のバウンディングボックスを取得し、カメラを適度にオフセットさせてから撮影することで、資料として価値のある「干渉強調画像」が生成できる。
結論:自動化は「道具」ではなく「資産」
このツールは、単なる作業の代行ではない。「設計者が本来考えるべき課題」へ時間を集中させるための投資である。
コードを書く際は、常に「半年後の自分がメンテできるか?」を自問してほしい。複雑な処理はモジュール化し、エラーハンドリングを徹底する。それが、伝説のアーキテクトとしての第一歩だ。
もし大規模アセンブリの処理で重さに悩んでいるなら、次は「非表示部品の干渉除外」と「キャッシュメモリの管理」について深掘りしよう。その先には、自動化の真の境地が待っている。
