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` を呼び出す実装に挑戦してみてください。
もし、さらに深い階層のコンポーネント取得や、複雑な合致定義で詰まったら、いつでもここへ戻ってきてくださいね。あなたの自動化ライフが、より快適で創造的なものになることを願っています!
