【上級プロへの登竜門】SolidWorks VBA:面ID依存を脱却し、設計変更に「壊れない」最強の合致エンジンを構築する
こんにちは。SolidWorksの自動化の世界へようこそ。
「マクロの記録」で生成されたコードをそのまま使って、設計変更のたびに「エラー:面が見つかりません」と泣きを見た経験はありませんか?実は、SolidWorks APIの核心は、「面(Face)をIDで捉えるな、トポロジー(幾何学的特徴)で捉えろ」という一点に集約されます。
今日は、設計変更の荒波にも揺るがない、プロ仕様の「ロバスト合致生成エンジン」の作り方を伝授しましょう。
—
1. なぜ「面ID」を頼ってはいけないのか?
マクロの記録が吐き出すコードは、`SelectByID2` メソッドを多用します。これは「モデルのこのIDの面を選択せよ」という命令です。しかし、SolidWorksでフィーチャーを追加・削除し、モデルを再構築すると、内部的な面IDは平気で書き換わります。
「IDという砂上の楼閣」に依存する自動化は、実務では一瞬で崩壊します。
私たちが目指すべきは、「円筒面の軸」や「特定の法線ベクトルを持つ平面」といった、形状の本質(トポロジー)をプログラムが認識して合致させる仕組みです。
—
2. 極限の知見:IMateEntity2 と トポロジー解析の融合
堅牢な合致を作るための鍵は、`IMateEntity2` インターフェースです。これは、単なる「面」ではなく、「合致されるべき幾何学的な属性」を保持するプロキシのようなものです。
今回は、「特定の円筒面」を自動検出し、それを合致の対象として確実に捕まえるためのアプローチを解説します。
実践コード:形状特徴量ベースの面取得
このコードは、部品の中から「半径が指定値に近い円筒面」を抽出し、それを合致の対象として登録するロジックの断片です。
‘ 形状特徴量を基に面を特定する堅牢な関数
Public Function GetCylindricalFaceByRadius(swComp As SldWorks.Component2, targetRadius As Double) As SldWorks.Face2
Dim swBody As SldWorks.Body2
Dim swFace As SldWorks.Face2
Dim swEnt As SldWorks.Entity
Dim swSurf As SldWorks.Surface
Dim swCyl As SldWorks.Cylinder
‘ コンポーネントからボディを取得(トポロジー解析の起点)
Set swBody = swComp.GetBody
Set swFace = swBody.GetFirstFace
Do While Not swFace Is Nothing
Set swSurf = swFace.GetSurface
‘ 面が円筒面かどうかを確認
If swSurf.IsCylinder Then
Set swCyl = swSurf
‘ 半径が指定値と一致するか(公差を考慮)
If Abs(swCyl.Radius – targetRadius) < 0.0001 Then
Set GetCylindricalFaceByRadius = swFace
Exit Function
End If
End If
Set swFace = swFace.GetNextFace
Loop
End Function
---
3. ロバスト合致生成エンジンの心臓部
面を特定したら、次はそれを `IMate` に変換し、アセンブリに適用します。ここで重要なのは、「合致の定義順序」と「エラーハンドリング」です。
‘ 合致を生成するメインエンジン
Public Sub CreateRobustMate(swApp As SldWorks.SldWorks, face1 As SldWorks.Face2, face2 As SldWorks.Face2)
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swMateFeat As SldWorks.Feature
Set swModel = swApp.ActiveDoc
Set swAssy = swModel
‘ 面をエンティティとして選択状態にする
face1.Select4 False, Nothing
face2.Select4 False, Nothing
‘ 同心円合致を追加(引数は合致タイプ、位置合わせなど)
Set swMateFeat = swAssy.AddMate5(swMateType_CONCENTRIC, swMateAlign_CLOSEST, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, 0)
If swMateFeat Is Nothing Then
MsgBox “合致の生成に失敗しました。形状の変化を確認してください。”
Else
Debug.Print “堅牢な合致が成功しました: ” & swMateFeat.Name
End If
End Sub
—
4. 初学者が陥りやすい「3つの落とし穴」
1. 選択のクリア忘れ: `swModel.ClearSelection2 True` を呼び出し元で確実に行わないと、前の選択状態が残り、予期せぬ場所に合致が適用されます。
2. 再構築(Rebuild)のタイミング: 合致を追加した後は、必ず `swModel.EditRebuild3` を実行してください。これを怠ると、SolidWorksの内部データとAPIの認識が乖離し、後続処理でクラッシュします。
3. コンポーネントの参照エラー: `Component2` がアセンブリ内で正しくロードされているか確認してください。大きなアセンブリでは、大規模コンポーネントが「軽量」状態だとAPIが面を認識できないことがあります。
—
最後に:自動化の先にあるもの
「マクロが壊れる」という悩みは、あなたがSolidWorksの表面的な操作しか見ていなかったことの証明でもあります。しかし、今日からあなたは「トポロジー」という視点を得ました。
面IDに頼るのではなく、「このモデルはどのような幾何学的特性を持っているか」をAPIに問いかけるコードを書くこと。それが、真の意味で「設計変更に耐えうる」自動化エンジニアへの第一歩です。
まずは、上記のコードをベースに、手持ちの部品の円筒面を検索することから始めてみてください。それが、伝説のアーキテクトへの第一歩となります。
何か行き詰まったら、いつでも聞いてください。あなたのコードがより堅牢なものになるよう、また導きます。
