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

スポンサーリンク

【SolidWorks APIの極致】干渉箇所を可視化せよ!衝突位置にマーカーを自動配置する技術

こんにちは。SolidWorks APIの深淵へようこそ。
マクロの記録ボタンを押して満足している段階は、もう卒業しましょう。今日は「干渉チェック」という、設計現場で最も頭を悩ませる問題を、コードの力でスマートに解決する方法を伝授します。

今回目指すのは、「干渉チェックの結果を読み取り、その座標に自動で赤い球体(マーカー)を配置する」という高度な自動化です。これができれば、設計者は膨大な干渉リストと格闘する必要がなくなります。

—

1. なぜ「干渉チェック」の自動化が難しいのか?

SolidWorksの干渉検出API(`IAssemblyDoc::GetInterferences`)は、単に「どこが当たっているか」を返すだけではありません。膨大なオブジェクトの配列として結果を返してくるため、初心者はここで迷子になります。

重要なのは、「干渉している2つのボディ(Body)から、どの点が交差しているか」を抽出するアルゴリズムです。今回は、その核心部分に触れていきます。

—

2. 実装の設計思想:ステップ・バイ・ステップ

1. 干渉の検出: `IAssemblyDoc::GetInterferences` を使い、干渉データをメモリ上に展開。
2. 空間座標の抽出: `IInterference` オブジェクトから、干渉の中心点(重心)を取得。
3. マーカーの生成: あらかじめ用意した「赤い球体パーツ」を、`AddComponent`で配置。
4. 座標変換: マトリックス計算を用いて、パーツを正確な空間位置へ移動。

—

3. 実践コード:干渉箇所への自動マーカー配置

以下のコードは、アクティブなアセンブリで干渉チェックを行い、各干渉点に球体を生成するプロトタイプです。

‘ ※使用前準備: プロジェクトの参照設定で “SolidWorks 20XX Type Library” を追加してください
Sub AutoPlaceInterferenceMarkers()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Dim swInterference As Object
Dim interferenceList As Variant
Dim i As Integer
Dim pos(2) As Double

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swAssy = swModel

‘ 1. 干渉チェックの実行
interferenceList = swAssy.GetInterferences

If IsEmpty(interferenceList) Then
MsgBox “干渉は見つかりませんでした。完璧な設計ですね!”
Exit Sub
End If

‘ 2. 各干渉箇所をループ処理
For i = 0 To UBound(interferenceList)
Set swInterference = interferenceList(i)

‘ 干渉の重心座標を取得 (ここが重要!)
pos(0) = swInterference.CentroidX
pos(1) = swInterference.CentroidY
pos(2) = swInterference.CentroidZ

‘ 3. マーカーパーツ(赤い球体)を配置
‘ ※あらかじめ “C:\Markers\RedSphere.SLDPRT” を作成しておいてください
Call PlaceMarker(swAssy, “C:\Markers\RedSphere.SLDPRT”, pos)
Next i

swModel.ForceRebuild3 True
End Sub

Sub PlaceMarker(assy As SldWorks.AssemblyDoc, path As String, pos() As Double)
Dim swComp As SldWorks.Component2
Set swComp = assy.AddComponent(path, pos(0), pos(1), pos(2))

‘ 配置したパーツを固定して動かないようにする
swComp.Select2 False, 0
assy.UnfixComponent
assy.FixComponent
End Sub

—

4. プロが教える「陥りやすい罠」と対策

① 座標系の罠(モデル空間 vs コンポーネント空間)

`CentroidX` 等で取得した座標は「アセンブリの絶対座標」です。もし配置したマーカーが変な場所に飛んでいくなら、それは「パーツ側の原点」がずれている証拠です。パーツの原点を球体の中心に合わせておくのが鉄則です。

② 干渉データの更新タイミング

大規模アセンブリで `GetInterferences` を呼ぶと、SolidWorksがフリーズすることがあります。必ず `swModel.EditRebuild` を実行し、モデルの状態を最新にしてから呼び出す癖をつけましょう。

③ メモリの解放

ループ内で `swInterference` オブジェクトを多数生成するため、処理の最後には必ずオブジェクトの参照を `Nothing` にクリアしてください。さもないと、SolidWorksが重くなり、最悪の場合は強制終了します。

—

5. 次のステップへ

このコードが動いた時、あなたの設計業務は「目視」から「数値による管理」へと進化します。

次は、「干渉しているボディ同士を透過表示にする」や「干渉レポートをExcelに自動書き出しする」といった機能を追加してみるのが面白いでしょう。SolidWorks APIは、あなたの指先一つで設計の限界を押し広げることができます。

「ここをもっと詳しく知りたい」「エラーが出て止まってしまった」という方は、ぜひコメントで教えてください。あなたの挑戦を、私は全力でサポートしますよ。

さあ、自動化という名の武器を手に、設計の現場を圧倒しましょう。

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