SolidWorks APIの真髄:Excelからアセンブリを「構造的」に生成する極意
SolidWorks APIを扱う際、初心者は「とりあえず動くコード」を書こうとします。しかし、我々のようなエンジニアが目指すべきは、「堅牢で、拡張性が高く、そして何よりメモリリークを許さないコード」です。
今回は、Excel上のBOMリストからアセンブリを自動構築する自動化ツールを題材に、SolidWorks APIを掌握するための設計思想を伝授します。
—
1. なぜ「手当たり次第」に組み込んではいけないのか
多くの開発者が陥る罠は、`SldWorks`オブジェクトや`ModelDoc2`オブジェクトを闇雲に生成し、終了処理を怠ることです。SolidWorksのCOMインターフェースは非常にデリケートです。
- コンポーネントの重複登録: 同一パーツを複数呼び出す際、パスの解決を適当に行うと、SolidWorksは「どのファイルか」を検索する無駄なプロセスを走らせます。
- メモリの解放: オブジェクトを明示的に `Nothing` にしない、あるいは `ReleaseComObject` を意識しないコードは、長時間稼働させるとSolidWorksのパフォーマンスを確実に劣化させます。
設計の鉄則: アセンブリへの追加は `IAssemblyDoc::AddComponent5` を使い、常に「戻り値(コンポーネント)」を管理下に置くこと。
—
2. 堅牢な自動生成エンジン:プロダクションコード
このコードは、ExcelのA列に「ファイルフルパス」、B列に「X座標」、C列に「Y座標」、D列に「Z座標」が記載されている前提で構築します。
Option Explicit
‘ 必要なライブラリ:SolidWorks 20xx Type Library
‘ 参照設定忘れずに: SolidWorks Interop
Public Sub BuildAssemblyFromExcel()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim ws As Worksheet
Dim lastRow As Long, i As Long
Dim filePath As String
Dim x As Double, y As Double, z As Double
‘ 1. インスタンスの取得(既存の起動済みプロセスに接続)
Set swApp = Application.SldWorks
‘ 2. 新規アセンブリ作成
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\…\Assembly.asmdot”, 0, 0, 0)
Set swAssy = swModel
Set ws = ThisWorkbook.Sheets(“BOM”)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
‘ 3. ループ処理:エラーハンドリングを必ず噛ませる
On Error GoTo ErrorHandler
For i = 2 To lastRow
filePath = ws.Cells(i, 1).Value
x = ws.Cells(i, 2).Value / 1000 ‘ mmからmへの変換は必須
y = ws.Cells(i, 3).Value / 1000
z = ws.Cells(i, 4).Value / 1000
‘ コンポーネント追加
Set swComp = swAssy.AddComponent5(filePath, “”, “”, False, “”, x, y, z)
If swComp Is Nothing Then
Debug.Print “Failed to load: ” & filePath
Else
‘ 必要に応じて合致(Mate)を追加するロジックをここに
End If
Next i
MsgBox “アセンブリ構築完了”
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description
‘ ここでオブジェクトのクリーンアップを行う
End Sub
—
3. 実務で勝つための「3つの極意」
① 座標系と単位系を疑え
SolidWorks APIの内部単位は「メートル(m)」です。Excel側を「ミリ(mm)」で管理している場合、必ず `1000` で割る処理をコードに組み込んでください。これを忘れると、パーツが遥か彼方に配置されることになります。
② フルパスの妥当性検証
`Dir(filePath)` 関数を使い、ファイルが存在するかどうかを事前に検証してください。ファイルが見つからないままAPIを叩くと、SolidWorksのダイアログが前面に出て、自動化プロセスがそこで停止します。「自動化プロセスを止めるダイアログ」はエンジニアの敵です。
③ 履歴管理と再実行性
一度実行したアセンブリを再度実行する場合、既存のモデルをどう扱うか決めていますか?
- 既存ファイルを開くのか?
- 新しい名前で保存するのか?
- 一度すべて消去するのか?
これらを「設定ファイル」で切り替えられるようにしておくと、保守性が飛躍的に向上します。
—
結論:コードは「資産」である
今回提示したコードは、単なるスクリプトではありません。あなたの業務を拡張し、手作業によるミスを排除するための「資産」です。
SolidWorks APIを扱う際は、常に「SolidWorksがこの操作をどう受け取り、どうメモリを消費するか」を想像してください。その想像力が、あなたをただのプログラマーから、業務自動化のアーキテクトへと変貌させます。
何か行き詰まったら、まずはAPIヘルプ(`swconst.bas`)を読み込み、戻り値のステータスコードを一つ一つ確認する癖をつけてください。近道はありませんが、その積み重ねが、誰にも真似できない最強の自動化ツールを生み出すのです。
