【入門編】【実務中級】円筒面の同軸合致において半径違いのエラーを事前にキャッチする型安全なアセンブリ検証バリデーション – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAの「実行時エラー」にさようなら:同軸合致の事前バリデーション術

こんにちは。SOLIDWORKS自動化の深淵へようこそ。

マクロの記録ボタンを押して生成されたコードを眺め、「なぜかたまに動かない」「合致エラーで画面が止まる」と頭を抱えたことはありませんか?それは、あなたがコードの「書き方」は知っていても、SOLIDWORKSという巨大なジオメトリエンジンの「機嫌」を損ねる操作をしているからです。

今日は、アセンブリの自動化で最も頻出する「同軸合致(Concentric Mate)」を例に、エラーが起きる前に「それは無理だよ」とコードに判断させる、堅牢なバリデーション技術を伝授します。

—

1. なぜ「合致」はエラーを吐くのか?

初心者が陥りやすい最大の罠は、「人間なら視覚的に判断できることが、APIには伝わらない」という点です。

例えば、円筒面同士の同軸合致。人間なら「細い棒を太い穴に入れるのは無理だ」と直感的にわかりますよね。しかし、APIは命令された通りに合致させようとして、失敗して初めて例外を投げます。これが「実行時エラー」の正体です。

「実行してから失敗する」のではなく、「実行する前に論理的にチェックする」。 これが、プロの自動化エンジニアへの第一歩です。

—

2. 「半径違い」を事前に検知する実装パターン

以下のコードは、選択した2つの面を取得し、それらが本当に「円筒」なのか、そして「半径は合致可能か」をチェックするロジックです。

‘ 選択された2つの面が同軸合致可能か検証する関数
Public Function CanBeConcentric(face1 As SldWorks.Face2, face2 As SldWorks.Face2) As Boolean
Dim surf1 As SldWorks.Surface, surf2 As SldWorks.Surface
Dim cyl1 As SldWorks.Cylinder, cyl2 As SldWorks.Cylinder

Set surf1 = face1.GetSurface
Set surf2 = face2.GetSurface

‘ 1. そもそも円筒面(Cylinder)か確認
If surf1.GetType <> swSurfaceTypes_e.SW_SURFACE_CYLINDER Or _
surf2.GetType <> swSurfaceTypes_e.SW_SURFACE_CYLINDER Then
MsgBox “対象は円筒面である必要があります。”
Exit Function
End If

Set cyl1 = surf1
Set cyl2 = surf2

‘ 2. 半径のチェック(許容誤差を含めるのがプロの流儀)
‘ APIは内部的にメートル単位で処理するため、比較には注意が必要です
If Abs(cyl1.Radius – cyl2.Radius) > 0.000001 Then
Debug.Print “半径が異なります: ” & cyl1.Radius & ” vs ” & cyl2.Radius
CanBeConcentric = False
Exit Function
End If

CanBeConcentric = True
End Function

—

3. このコードの「本質」を解説

この短いコードには、実務で生き残るための3つの「知見」が詰まっています。

① 型の厳密な確認 (`surf.GetType`)

`SelectionManager` で拾ったオブジェクトが、必ずしも円筒とは限りません。平面や円錐を選択してしまうミスはよくあります。`GetType`で物理的な性質を確認することで、プログラムの暴走を未然に防ぎます。

② メートル単位系の呪縛

SOLIDWORKS APIは、ドキュメントの単位設定に関わらず、内部的にはメートル(MKS)で数値を返します。`cyl1.Radius` が `0.005` と返ってきたら、それは5mmのことです。この感覚を身につけると、計算ミスが激減します。

③ 許容誤差(Epsilon)の考え方

プログラムで `If A = B` と書くのは危険です。浮動小数点演算の誤差により、数学的には等しくてもコンピュータ上は「0.00000000001の差がある」と判断されることが多々あります。`Abs(A – B) > 0.000001` とすることで、「誤差範囲内なら良しとする」という、実用的な判断を行っています。

—

4. まとめ:コードを「賢く」育てる

今回紹介したバリデーションは、アセンブリ自動化の土台です。

1. 選択したものの正体を突き止める(`GetSurface`)
2. 型を判定する(`GetType`)
3. 物理的な整合性を計算で確認する(`Radius`の比較)

これさえ守れば、あなたのマクロは「エラーで止まる」ものではなく、「条件が揃っているときだけ確実に仕事をする」という、信頼性の高いツールへと進化します。

「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ」。
次は、このバリデーションを通過した後に、`AssemblyDoc::AddMate` を呼び出す実装に挑戦してみてください。

もし、さらに深い階層のコンポーネント取得や、複雑な合致定義で詰まったら、いつでもここへ戻ってきてくださいね。あなたの自動化ライフが、より快適で創造的なものになることを願っています!

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