マクロ記録は「設計図」ではない。SolidWorksアセンブリ自動化の闇と、プロが選ぶ堅牢な設計手法
SolidWorksでアセンブリの自動化を志したとき、誰もが最初に通る道が「マクロ記録機能」だ。しかし、このマクロ記録を信じてプロダクションコードを書こうとしているなら、今すぐ立ち止まってほしい。
マクロ記録が出力するコードは、単なる「操作の履歴」であり、再利用性もエラー耐性もゼロの「その場しのぎの文字列」に過ぎない。本稿では、なぜマクロ記録が実務で通用しないのか、そして堅牢なアセンブリ構築のための「真のアーキテクチャ」について解説する。
—
1. なぜ「マクロ記録」を使ってはいけないのか
マクロ記録が生成するコードには、致命的な欠陥が2つある。
欠陥1:`SelectByID2` への過度な依存
マクロ記録は、画面上の選択状態をベースにコードを生成する。
`swModel.Extension.SelectByID2(“Part1-1@Assembly1”, “COMPONENT”, …)`
このように、名前(文字列)でコンポーネントを特定する方法は、アセンブリの階層が変わったり、ファイル名が変更された瞬間に破綻する。 現場で修正に追われるエンジニアの最大の要因はここにある。
欠陥2:オブジェクトのライフサイクル無視
マクロ記録は、APIが内部で管理している「アクティブな選択セット」を操作する。しかし、プログラムは「どのオブジェクトを操作しているか」を明示的にハンドル(変数)として保持しなければならない。画面上の選択に頼るコードは、裏で別のウィンドウが開いたり、再計算が走ったりした瞬間に制御不能となる。
—
2. プロが実践する「堅牢なコンポーネント指定」の極意
堅牢なコードの要諦は、「文字列による検索」を避け、「オブジェクトの参照(IComponent2)」を維持することにある。
アセンブリ構築の際、以下のステップを徹底せよ。
1. 参照を取得する: `AddComponent6` メソッドの戻り値として、`IComponent2` オブジェクトを直接受け取る。
2. 名前を検索しない: コンポーネントを特定するために名前を使うのは、どうしても必要な時(DB連携等)のみにする。
3. 合致条件の直接指定: 面(Face)の選択も `SelectByID2` ではなく、オブジェクトの `GetEntityByName` や `GetSelectedObject6` を経由した「型」による指定を行う。
—
3. 実践:保守性の高いアセンブリ構築コード
以下は、コンポーネントを読み込み、明示的に合致を追加するプロダクションレベルの基本テンプレートだ。
‘ SolidWorks アセンブリ自動構築テンプレート
Option Explicit
Sub AddComponentAndMate()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.IComponent2
Dim swModel As SldWorks.ModelDoc2
Dim swMate As SldWorks.Mate2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swAssy = swModel
‘ 1. コンポーネントの追加
‘ ファイルパスは定数化し、Config管理下に置くのが鉄則
Dim compPath As String
compPath = “C:\Parts\BasePlate.sldprt”
‘ 戻り値としてIComponent2を保持することで、以降の処理が確実になる
Set swComp = swAssy.AddComponent6(compPath, “Default”, 0, 0, 0, False)
If swComp Is Nothing Then
MsgBox “コンポーネントの挿入に失敗しました。”
Exit Sub
End If
‘ 2. ここで合致処理(簡略化例)
‘ 実務では swComp.GetModelDoc2 を経由して面を選択し、
‘ IAssemblyDoc::AddMate5 を呼ぶのが定石。
‘ 文字列検索(SelectByID2)は極力排除する設計を心掛ける。
swModel.EditRebuild3
End Sub
—
4. データベース連携とスケールする設計へのヒント
アセンブリ自動化が本格化すると、ExcelやSQL Server上のBOM(部品表)データと連携したくなるはずだ。その際、以下の鉄則を守るだけで保守コストは劇的に下がる。
- コンフィギュレーション管理: アセンブリ内のコンポーネントは、必ず特定のコンフィギュレーションを指定して読み込む(`AddComponent6` の第2引数)。「Default」と決め打ちしないこと。
- パスの抽象化: ファイルパスをコード内に直接書かず、設定ファイル(JSONやXML、または別シート)から読み込む。環境が変わってもコードを一行も書き換えない設計こそが、プロの仕事だ。
- エラーハンドリングの義務: APIが返す `Boolean` 値を無視してはいけない。`If Not swAssy.AddComponent6(…) Then` と記述し、失敗時のログ出力とロールバック処理を必ず用意する。
最後に:なぜ「自作コード」が必要なのか
マクロ記録は、APIという広大な海を航海するための「コンパス」にはなり得る。しかし、目的地(自動化による業務効率化)に到達するためには、自ら操舵し、エンジンの仕組み(APIのライフサイクル)を理解しなければならない。
「動けばいい」というコードは、数ヶ月後の自分を苦しめる。今日紹介した「オブジェクト参照の維持」という考え方は、SolidWorks自動化の基礎体温だ。まずは、あなたのコードから `SelectByID2` を一つずつ減らすことから始めてほしい。
それが、世界最高峰の自動化エンジニアへの第一歩だ。
