【実務・中級編】【干渉チェックの自動レポート化】IAssemblyDoc.FeatureInterference2の結果をExcelの表形式とキャプチャ画像付きで出力 – SolidWorks VBA解析バイブル

スポンサーリンク

【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` を操作し、一時的に背景を白、表示スタイルを「影なし」に切り替えてから撮影する。
  • 座標の正規化: 干渉部位のバウンディングボックスを取得し、カメラを適度にオフセットさせてから撮影することで、資料として価値のある「干渉強調画像」が生成できる。

結論:自動化は「道具」ではなく「資産」

このツールは、単なる作業の代行ではない。「設計者が本来考えるべき課題」へ時間を集中させるための投資である。

コードを書く際は、常に「半年後の自分がメンテできるか?」を自問してほしい。複雑な処理はモジュール化し、エラーハンドリングを徹底する。それが、伝説のアーキテクトとしての第一歩だ。

もし大規模アセンブリの処理で重さに悩んでいるなら、次は「非表示部品の干渉除外」と「キャッシュメモリの管理」について深掘りしよう。その先には、自動化の真の境地が待っている。

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