【実務・中級編】【形状検証・検査】IMeasure.RayIntersectionを用いた指定方向への干渉・レイキャスト判定自動化マクロ – SolidWorks VBA解析バイブル

スポンサーリンク

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)の最適化」にて詳述する。期待して待っていてくれ。

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