SolidWorks自動化の極意:同軸合致における「実行時エラー」を撲滅する事前バリデーション設計
SolidWorks APIを使いこなす上で、多くの開発者が陥る罠がある。それは「APIを呼んでから結果を判断する」という受け身のプログラミングだ。
特にアセンブリの自動組み立てにおいて、同軸合致(Concentric Mate)は頻出する。しかし、安易に `swAssembly.AddMate5` を叩いていないだろうか? 選択した面がそもそも円筒面でない場合、あるいは半径が極端に異なり「合致として成立しない」場合、コードは無慈悲な実行時エラーを吐く。
本稿では、プロダクションレベルの堅牢性を担保するための「事前バリデーション」の設計思想と実装パターンを伝授する。
—
1. なぜ「実行時エラー」が起きるのか?
SolidWorksのAPIは、成功したか失敗したかを戻り値で返すものもあれば、例外をスローするものもある。特にアセンブリの合致は、モデルの再構築(Rebuild)状況やジオメトリの整合性に依存するため、「APIを叩く前の型チェック」を怠ると、デバッグ不可能な無限ループやモデルの破壊を招く。
プロのエンジニアは、APIを呼ぶ前に以下の3点を必ず検証する。
1. Selection Type: 選択したオブジェクトは本当に「面(Face)」か?
2. Geometry Type: 面のジオメトリは「円筒(Cylinder)」か?
3. Tolerance Check: 半径や中心軸の整合性は許容範囲内か?
—
2. プロダクションコード:同軸合致バリデーション
以下は、選択された2つの面が「同軸合致可能か」を厳密に検証し、安全に実行するためのテンプレートである。
‘ @brief 2つの円筒面に対する同軸合致のバリデーションと実行
‘ @param swApp SolidWorks Application
‘ @param swAssy Active Assembly
‘ @param face1 面1 (Entity)
‘ @param face2 面2 (Entity)
Public Function SafeAddConcentricMate(swApp As SldWorks.SldWorks, swAssy As SldWorks.AssemblyDoc, face1 As SldWorks.Face2, face2 As SldWorks.Face2) As Boolean
Dim surf1 As SldWorks.Surface, surf2 As SldWorks.Surface
Set surf1 = face1.GetSurface
Set surf2 = face2.GetSurface
‘ 1. ジオメトリタイプの検証 (円筒面のみ許可)
If surf1.IsCylinder <> True Or surf2.IsCylinder <> True Then
Debug.Print “Error: 選択対象が円筒面ではありません。”
Exit Function
End If
‘ 2. 半径の検証 (極端な差がある場合はエラーとする)
‘ 実際の実務では誤差許容値を定数で管理すること
Dim rad1 As Double, rad2 As Double
rad1 = surf1.CylinderParams(6) ‘ CylinderParams(6)は半径
rad2 = surf2.CylinderParams(6)
If Abs(rad1 – rad2) > 0.001 Then ‘ 1mm以上の誤差は警告
Debug.Print “Warning: 半径が一致しません。合致が不安定になる可能性があります。”
‘ 必要に応じてここで処理を中断するか、ユーザーに確認を促す
End If
‘ 3. 合致の実行
Dim swMateFeat As SldWorks.Feature
Set swMateFeat = swAssy.AddMate5(swMateType_e.swMateCONCENTRIC, _
swMateAlign_e.swMateAlignALIGNED, _
False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, swMateFeat)
If Not swMateFeat Is Nothing Then
SafeAddConcentricMate = True
End If
End Function
—
3. 実務で生き残るための「3つの鉄則」
① データベース・ファイル連携は「非同期」を意識せよ
アセンブリの構成情報を外部DB(ExcelやSQL)から読み込む際、APIの呼び出しとファイル読み込みを同一のループ内で行うのは愚策だ。まずは「検証用データセット」をメモリ上に構築(配列化)し、全データがOKであれば合致処理へ進む「2段階パイプライン」を構築せよ。
② `GetSurface` のライフサイクル管理
`GetSurface` で取得したオブジェクトは、メモリを消費する。不要になったら即座に `Set … = Nothing` を行うこと。大規模アセンブリでこれを怠ると、メモリリークによりSolidWorksごとクラッシュする。
③ ユーザーへのフィードバック
エラーが発生した際、黙って失敗させるな。`Err.Number` や `swResult` を解析し、「なぜ失敗したか(半径不一致なのか、構成部品が固定されているのか)」をログファイル、あるいはステータスバーに出力する設計を組み込むこと。これが、保守性の高いコードと低いコードの決定的な差となる。
—
結論:自動化は「防御」から始まる
自動化エンジニアの仕事は、コードを書くことではなく、「失敗する余地を排除すること」にある。
今回紹介したバリデーションのパターンをベースに、あなたのプロジェクトの要件に合わせて「許容できる公差」や「合致のルール」を拡張してほしい。堅牢なコードは、数ヶ月後の自分自身を救う最高の保険となる。
さあ、泥臭いエラーハンドリングから卒業し、エンジニアリングの質を高めよう。
