SolidWorks APIの深淵:`AddMate5`を使いこなし、アセンブリ構築を「完全自動化」する極意
SolidWorks APIを触り始めたエンジニアが最初につまずく壁、それが「合致(Mate)」の自動化だ。
マクロ記録を使えばコードは生成されるが、それは「その場しのぎのゴミ」に過ぎない。実務で求められるのは、設計変更に耐えうる、堅牢で再利用可能な自動化ロジックだ。
今日は、`AddMate5`を駆使し、アセンブリ構築を「機械作業」から「知的資産」へと昇華させるための極限の知見を授ける。
—
1. なぜ「マクロ記録」では業務が破綻するのか
多くの初心者は、マクロ記録で出力されたコードをそのまま流用しようとする。だが、考えてみてほしい。マクロ記録は「選択したエンティティの内部ID」をハードコードする。モデルを少しでも修正すれば、そのIDは無効化され、マクロはエラーを吐いて沈黙する。
プロの設計は、こうあるべきだ:
1. SelectionManagerを使わない: UI上のクリック操作に依存してはいけない。
2. 名前解決の抽象化: 部品名や面名から動的にオブジェクトを取得する。
3. エラーハンドリングの徹底: 合致の競合を想定し、失敗時にはクリーンアップを行う。
—
2. 【核心】AddMate5の設計思想
`AddMate5`は強力だが、引数が多く、直感的ではない。重要なのは、「合致を作成する前に、いかに正確にエンティティ(面や軸)を特定し、セレクションセットを構築するか」だ。
以下のコードは、実務でそのまま使える「面一致合致」の構築テンプレートだ。
‘ —————————————————————————
‘ @brief 部品同士の面一致合致を作成する堅牢な関数
‘ @param swApp SldWorks.SldWorks
‘ @param swAssy SldWorks.AssemblyDoc
‘ @param compName1 合致させる部品名1
‘ @param faceName1 部品1内の面名
‘ @param compName2 合致させる部品名2
‘ @param faceName2 部品2内の面名
‘ —————————————————————————
Sub CreateMate_FaceCoincident(swApp As SldWorks.SldWorks, swAssy As SldWorks.AssemblyDoc, _
compName1 As String, faceName1 As String, _
compName2 As String, faceName2 As String)
Dim swComp1 As SldWorks.Component2, swComp2 As SldWorks.Component2
Dim swEnt1 As SldWorks.Entity, swEnt2 As SldWorks.Entity
‘ 1. コンポーネントの取得
Set swComp1 = swAssy.GetComponentByName(compName1)
Set swComp2 = swAssy.GetComponentByName(compName2)
‘ 2. 面の取得(名前での特定はFeatureManagerに依存するため、実務ではAttributeやFaceIDの使用を推奨)
Set swEnt1 = swComp1.Select2(faceName1, False)
Set swEnt2 = swComp2.Select2(faceName2, False)
‘ 3. 合致の構築
Dim swMateFeature As SldWorks.Feature
Dim errCode As Long
‘ AddMate5: 0:一致, 1:平行, 2:同軸… (詳細はAPI Help参照)
‘ 最後の引数は「合致の方向反転」など
Set swMateFeature = swAssy.AddMate5(0, 0, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, errCode)
If errCode <> 0 Then
Err.Raise vbObjectError + 1000, “MateEngine”, “合致作成失敗: Error Code ” & errCode
End If
‘ 4. 再構築(パフォーマンスのため必要最小限にする)
swAssy.EditRebuild3
End Sub
—
3. 実務で「バグらせない」ための3つの鉄則
① エンティティ特定に「名前」を使わない
上記のコード例では簡略化のために面名を使用したが、実務では「モデルの面名」は変更されるリスクがある。
最も安全なのは、「Attribute(属性)」を付与することだ。あらかじめ部品の設計段階で、特定の面に属性を埋め込んでおき、APIでその属性を持つ面を検索して合致させる。これが「伝説的」な自動化の第一歩だ。
② モデルのロード状態を管理せよ
アセンブリ内の全部品が完全ロード(Resolved)されているかを確認せよ。軽量(Lightweight)状態では、面情報にアクセスできずAPIがNULLを返す。`swComp.SetSuppression2 swComponentFullyResolved` を必ず通すこと。
③ トランザクション思考を持つ
合致の作成は「失敗する前提」でコードを書け。
もし3つ目の合致で失敗した場合、作成済みの2つをどうするのか?`Undo`を実装するか、あるいは一度アセンブリを閉じてやり直すか。ビジネスロジックの中で「状態の巻き戻し」を意識できる者だけが、真の自動化エンジニアと呼べる。
—
4. 最後に:エンジニアへの提言
自動化とは、単なる作業の代行ではない。「設計者が思考すべき本質的な領域以外を、すべてシステムに押し付ける行為」だ。
SolidWorks APIは、あなたの指先を拡張する武器だ。だが、武器は使い手を選ぶ。今日紹介した`AddMate5`の構造を理解し、自身の環境に合わせた「ラッパー関数」を構築してほしい。
コードをコピペして終わるな。その先にある「なぜこのAPIが呼ばれるのか」という設計思想にまで踏み込んだ時、あなたの自動化ツールは、誰にも真似できない最強の武器になるだろう。
健闘を祈る。
