【テクニカル・上級編】【上級プロ】アセンブリの干渉チェック(Interference Detection)結果の空間座標をパースし、衝突位置に3Dマーカーを自動配置 – SolidWorks VBA解析バイブル

スポンサーリンク

アセンブリの深淵を可視化せよ:干渉箇所への3Dマーカー自動配置アーキテクチャ

SolidWorks APIを操るエンジニア諸君。設計者が「干渉チェック」のレポートを眺めながら、画面の奥深くにある衝突部位をマウスで必死に探す姿を、いつまで放置するつもりだ?

干渉チェックAPI(`IAssemblyDoc::AddInterference`)が返すデータは、ただの数値の羅列ではない。それは設計上の「腫瘍」そのものだ。本稿では、この膨大な干渉データを抽出し、空間座標をパースして、衝突地点に自動的に3Dマーカー(ダミーパーツ)を生成する、堅牢かつ高速な自動化アーキテクチャの真髄を伝授する。

—

1. 勘所:干渉検出APIの「メモリの罠」とライフサイクル管理

VBAでアセンブリを扱う際、最も陥りやすい罠が「IInterferenceオブジェクトの残留」だ。干渉チェックの結果はCOMオブジェクトとしてメモリ上に保持されるが、これをループ処理で適切に解放しないと、アセンブリが肥大化し、SolidWorks自体がメモリリークでクラッシュする。

究極のメモリ管理術

  • 明示的な解放: `Set obj = Nothing` をループの末尾で必ず実行せよ。
  • コレクションの利用: `IInterference`のリストを取得する際、Variant型の配列で一括取得し、必要最小限のデータのみを抽出してCOMの接続を即座に切断する。

—

2. 衝突地点を空間に刻む:実装コードの核心

以下のコードは、`IAssemblyDoc::GetInterference`から取得した干渉データから重心点(`Centroid`)を割り出し、そこに球体マーカーを生成するプロセッサの核となる。

‘ 伝説のアーキテクトによる干渉マーカー生成ロジック
Public Sub PlaceInterferenceMarkers(swApp As SldWorks.SldWorks, swAssy As SldWorks.AssemblyDoc)
Dim swModel As SldWorks.ModelDoc2
Set swModel = swAssy

‘ 干渉チェックの実行
Dim swInterference As SldWorks.Interference
Dim vInterferences As Variant
vInterferences = swAssy.GetInterferences

If IsEmpty(vInterferences) Then Exit Sub

Dim i As Long
For i = LBound(vInterferences) To UBound(vInterferences)
Set swInterference = vInterferences(i)

‘ 干渉部位の重心を取得
Dim vPoint As Variant
vPoint = swInterference.Centroid ‘ 衝突の中心座標(X, Y, Z)

‘ マーカーパーツ(ダミー)を生成・挿入
CreateMarkerPart swApp, swAssy, vPoint

‘ 循環参照を防ぐための明示的解放
Set swInterference = Nothing
Next i

swModel.ForceRebuild3 False
End Sub

Private Sub CreateMarkerPart(swApp As SldWorks.SldWorks, swAssy As SldWorks.AssemblyDoc, vPoint As Variant)
‘ 外部ファイル(マーカー用球体)を挿入し、座標を固定する
Dim swComp As SldWorks.Component2
Set swComp = swAssy.AddComponent(“C:\Lib\Marker_Ball.sldprt”, vPoint(0), vPoint(1), vPoint(2))

‘ 物理的な合致よりも、座標指定による「配置」の方が高速かつ安定する
‘ パフォーマンス重視のため、外部参照は最小限に抑える
End Sub

—

3. レガシー環境とWindows APIの静かなる協調

大規模アセンブリを扱う際、SolidWorksのUIスレッドをブロックしないことが重要だ。特に干渉チェックが長時間に及ぶ場合、Windows APIの `Sleep` 関数や `DoEvents` を適切に配置し、Windowsメッセージキューを制御せよ。

また、複雑なアセンブリでは `GetInterferences` 実行時に `swModel.EditSuppress2` を併用し、検査対象外のサブアセンブリを一時的に軽量化(サプレス)することで、解析時間を劇的に短縮できる。これこそが、数千パーツを超える現場で生き残るための「最適化の美学」だ。

—

4. チーフアーキテクトからの提言

このシステムは、単に「マーカーを置く」だけのものではない。

  • 設計履歴のトレース: マーカーに干渉情報をカスタムプロパティとして埋め込めば、後から「なぜこの干渉が無視されたのか」を追跡できる監査ログとなる。
  • システム連携: 取得した座標をJSON形式で書き出し、後続の製造シミュレーションや、Webベースのダッシュボードへ流し込むための「ゲートウェイ」としても機能する。

VBAはレガシーと言われるが、APIの深層を理解した者が書くコードは、PythonやC#をも凌駕する「現場直結の速さ」を持つ。コードはただ動けばいいのではない。アセンブリの静寂を切り裂き、設計者の盲点を突くために存在せよ。

諸君の環境で、このアーキテクチャが設計の未来を照らすことを期待する。

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