【SolidWorks自動化】ボルト・ナット一括実装の極意:座標抽出から合致制約までを完全制御する
多くの設計現場で「標準部品の配置」は、最も退屈でミスを誘発するルーチンワークだ。特にアセンブリの穴位置を拾い、適切な径のボルトを呼び出し、面を合わせる……この一連の作業を手作業で行うのは、21世紀のエンジニアの仕事ではない。
今回は、Excelのマスターデータを基に、SolidWorksアセンブリへボルト・ナットを自動装着する「堅牢なアーキテクチャ」を伝授する。単なるコードの羅列ではない。「なぜ動かないのか」「なぜ重くなるのか」という実務の壁を突破するための設計思想を共有する。
—
1. 悲劇を招く「非効率な設計」からの脱却
初心者が陥る最大の間違いは、「手作業の動作をそのままVBAに移植しようとする」ことだ。
例えば、`SelectByID2`を連発して画面描画を繰り返す手法は、大規模アセンブリでは数分間画面がフリーズする原因になる。
堅牢な自動化のための3つの鉄則
1. Selection Managerに頼るな: 面の特定には `IFeature` や `IEntity` を使用し、内部オブジェクトのポインタを直接操作せよ。
2. 描画更新を封印せよ: `swApp.Visible = False` や `swModel.GraphicsRedraw2 = False` を駆使し、バックグラウンドで完結させる。
3. パスの正規化: Excelのデータとファイルパスを切り離し、絶対パスによる依存関係の崩壊を防ぐ。
—
2. 実装コード:ボルト装着エンジン
以下は、指定された穴座標(Excelから読み込んだ想定)に対して、ボルトを挿入し、同軸合致と面合致を適用するコアロジックだ。
‘ 必要な参照設定: SolidWorks 20xx Type Library
Option Explicit
Sub AutoAssembleBolts()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim swMate As SldWorks.Mate2
Set swApp = Application.SldWorks
Set swAssy = swApp.ActiveDoc
‘ 1. ボルト部品の呼び出し
Dim boltPath As String
boltPath = “C:\StandardParts\M8_Bolt.SLDPRT” ‘ 本来はExcelから取得
Dim swModel As SldWorks.ModelDoc2
Set swComp = swAssy.AddComponent5(boltPath, “”, 0, 0, 0)
‘ 2. 面の取得と合致制約 (同軸合致)
‘ 穴の円筒面とボルトの円筒面を特定して合わせる
‘ ※実務ではFindMateEntity等の自作関数で面を取得するのがベスト
Dim entHole As SldWorks.Entity
Dim entBolt As SldWorks.Entity
‘ 【重要】面は選択状態からではなく、フィーチャー名や面IDから取得し直すのが堅牢
‘ ここでは概念コードとして示す
Set entHole = GetFaceById(swAssy, “Hole_Face_ID”)
Set entBolt = GetFaceById(swComp.GetModelDoc2, “Bolt_Shaft_ID”)
‘ 同軸合致の追加
swAssy.AddMate5 swMateConcentric, swMateAlignCLOSEST, False, 0, 0, _
entHole, entBolt, 0, 0, 0, 0, False, False, False, 0
‘ 3. 再構築(Rebuild)は最後に一度だけ
swAssy.EditRebuild3
End Sub
—
3. 実務で「詰まない」ための設計ポイント
① データベース(Excel)との連携
Excelをデータベースとして使う場合、`ADODB.Recordset` を使用してSQLライクにデータを抽出せよ。`Cells(i, j)` でセルを一つずつ読み込むのは保守性が低い。また、アセンブリ内の穴径とボルト径の「マッチングテーブル」を別シートで管理することで、将来的な規格変更にもコードを書き換えずに対応可能になる。
② 合致の「名前」を意識せよ
`AddMate5` で作成した合致は、デフォルトで `Concentric1`, `Coincident1` のような名前になる。これらを放置すると、後から「どのボルトがどの穴に付いているか」の追跡が不可能になる。
作成直後に `MateFeature.Name = “M8_Bolt_001_Mate”` のようにリネームする習慣を付けるだけで、デバッグの効率が劇的に変わる。
③ ファイルパスの環境変数化
「自分のPCでしか動かないコード」は組織の資産にならない。環境設定シートを作成し、`RootPath = Range(“Settings!B1”).Value` のようにパスを外出しせよ。
—
4. 最後に:エンジニアとしてのスタンス
自動化ツールは「作って終わり」ではない。
現場の設計者が、「あ、このボルト、あとでサイズ変えたいな」と思ったときに、ツール側がどう追従できるか。そこまで考え抜いて初めて、それは「伝説的なツール」になる。
まずは、上記コードで「1本のボルトを確実に配置する」ところから始めよう。それができれば、ループ処理で100本配置するのも、条件分岐でボルト長を最適化するのも、単なる応用問題に過ぎない。
君の設計現場が、不要な作業から解放され、よりクリエイティブな課題に集中できる時間を生み出せることを期待している。健闘を祈る。
