SolidWorks APIの深淵:IMeasure.RayIntersectionで実現する「見えない干渉」の自動検知
CADエンジニアの諸君、SolidWorksの「干渉チェック」機能に頼り切っていないだろうか? GUIベースのツールは便利だが、自動化の現場では「どこに、どの方向で、何が起きているか」をプログラムが完全に把握していなければならない。
今日は、SolidWorks APIの中でも特に高度で強力な武器、`IMeasure.RayIntersection`を用いた「レイキャスト検査」の設計思想を伝授する。これは単なるコードの紹介ではない。君たちの設計検証プロセスを「人間が目視する作業」から「計算機が即時判断する自動検知」へと昇華させるための極意だ。
—
1. なぜ「RayIntersection」なのか
一般的な干渉チェック(`IModelDocExtension::CheckInterference`)は、ソリッドボディ同士の衝突を検出する。しかし、以下の要件には対応できない。
- 肉厚不足の検証: 特定部位から壁面までの距離をピンポイントで測りたい。
- クリアランス違反: 穴の奥深くまで光を射抜き、遮蔽物がないか判定したい。
- 仮想レイによるクリアランス解析: 特定の方向ベクトルに対し、最初にぶつかる面が何であるかを計算したい。
`IMeasure.RayIntersection`は、3D空間上の点と方向ベクトルを指定し、モデル内の面(Face)と交差するポイントを計算する。これを使いこなせば、「設計者が意図しない空間の干渉」をコードベースで論理的に排除できる。
—
2. 堅牢な設計のためのアーキテクチャ
このAPIを扱う際、初心者が陥る最大の罠は「精度と速度のバランス」だ。以下の設計原則を遵守せよ。
- ユニットの統一: `IMeasure.RayIntersection`はメートル単位で動作する。ミリ単位のモデルを扱う際、必ず `1000.0` での除算・乗算を徹底すること。
- パフォーマンスの最適化: 空間の全域をスキャンしてはならない。必ず検査対象の`Body`を絞り込み、計算範囲を限定する。
- メモリ解放の義務: `IMeasure`オブジェクトは重い。ループ内でのインスタンス生成は避け、一括処理の設計を心がけろ。
—
3. 実装:RayIntersectionによる衝突検知エンジン
以下は、指定した座標と方向からレイを放ち、最初のヒットポイントを取得する実用的なコードだ。
‘ ———————————————————
‘ 衝突検知ロジック:RayIntersectionラッパー
‘ ———————————————————
Public Function GetFirstHitPoint(swModel As SldWorks.ModelDoc2, _
origin As Variant, _
direction As Variant) As Variant
Dim swMeasure As SldWorks.Measure
Dim swModelExt As SldWorks.ModelDocExtension
Set swModelExt = swModel.Extension
Set swMeasure = swModelExt.CreateMeasure
‘ レイの定義: 始点(x,y,z), 方向ベクトル(vx,vy,vz)
‘ ※単位はメートル(SI)であることに注意
swMeasure.RayIntersection origin, direction
‘ ヒットした面が存在するか確認
If swMeasure.RayIntersectionCount > 0 Then
‘ 最も近い交差点を取得 (インデックスは0ベース)
GetFirstHitPoint = swMeasure.GetRayIntersectionPoint(0)
Else
‘ ヒットなしの場合はEmptyを返す
GetFirstHitPoint = Empty
End If
End Function
運用時の注意点
- 法線ベクトルの正規化: `direction`配列には、必ず長さが1のベクトル(単位ベクトル)を渡せ。さもなくば計算が狂う。
- 例外処理: `swMeasure`は、モデルの再構築直後(`ForceRebuild`後)に呼び出さなければ、古いジオメトリ情報を参照し、誤判定を招く恐れがある。常に `swModel.ForceRebuild3` を先行させる運用を推奨する。
—
4. プロダクション環境への統合(データベース連携)
この自動検査を個人のツールで終わらせてはならない。
1. 検査結果のログ出力: 判定結果(干渉あり/なし、距離)をJSONやCSVで書き出し、PLMや共有データベースに同期させる。
2. 設計意図のタグ付け: どのレイがどこにヒットしたかを「注記(Annotation)」としてモデル上に動的生成させれば、後工程のレビュー担当者が一目で干渉箇所を視認できる。
—
最後に:エンジニアとしての矜持
VBAは、単なる自動化の道具ではない。君たちが設計した「正しい形状」を、ミスというノイズから守るための防波堤だ。
`RayIntersection`を用いた自動検査は、単に「干渉チェック」の時間を短縮するだけでなく、「人間が気付けない空間の矛盾」を論理的に潰し込むことを可能にする。
さあ、このコードを君のプロジェクトに組み込み、SolidWorksのAPIを支配せよ。技術的な壁にぶつかった時は、常に「オブジェクトのライフサイクル」と「幾何学の基本」に立ち返るのだ。それが、伝説的な自動化エンジニアへの唯一の道である。
—
本稿に関する技術的な質問や、さらに高度なトポロジー操作については、次回の「境界表現(B-Rep)の最適化」にて詳述する。期待して待っていてくれ。
