SolidWorks自動化の極致:Excel仕様マトリクスからパーツを「完全自律生成」する堅牢設計術
諸君。設計現場で「パラメトリックなモデルのバリエーション出し」に時間を浪費していないか?
何十種類ものパーツを一つずつ手動で開き、数値を打ち込み、別名保存する。そんな作業はエンジニアの仕事ではない。それは「作業」であり、我々が目指すべき「自動化」の対極にあるものだ。
今回は、Excelの仕様マトリクスをマスターデータとし、ADODBを介してSolidWorksのAPIを叩き、パーツを全自動で量産する「プロダクション環境」の構築術を伝授する。
—
1. なぜ「手抜きマクロ」が現場で破綻するのか
多くの者が陥る罠がある。
- イベント駆動の欠如: `DoEvents`を乱用し、SolidWorksの描画更新(`ViewZoomtofit2`など)を毎ループ呼び出す。
- メモリリークの放置: `ISldWorks`や`IModelDoc2`のオブジェクトを正しく解放せず、20個目のパーツでSolidWorksが落ちる。
- エラーハンドリングの不在: データベース接続やファイルI/Oでエラーが起きた際、プロセスがゾンビ化する。
真の自動化エンジニアは、「SolidWorksのプロセス負荷を制御し、例外を握りつぶさない」設計を徹底する。
—
2. アーキテクチャの核心:ADODB + SolidWorks API
Excelを単なるファイルとして開くのは低速だ。ADODB(ActiveX Data Objects)を使用し、Excelシートを「データベース」として接続することで、大規模な仕様マトリクスもSQLライクに高速抽出できる。
構成案
1. データ層: ADODBによるExcel仕様書の高速読み込み。
2. ロジック層: テンプレートモデルを読み込み、`Configuration`を制御または`Dimension`を直接書き換え。
3. 保存層: 命名規則に従ったパス生成とバックグラウンド保存。
—
3. 実装コード:プロダクションレベルのパーツ生成
以下は、テンプレートモデルをコピーし、仕様を適用して保存する堅牢な実装サンプルだ。
Option Explicit
‘ 参照設定: Microsoft ActiveX Data Objects x.x Library
‘ 参照設定: SolidWorks 20xx Type Library
Public Sub BatchGenerateParts()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strConn As String
‘ 1. SolidWorks起動
Set swApp = Application.SldWorks
‘ 2. Excel仕様書への接続 (HDR=YESはヘッダーあり)
strConn = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & ThisWorkbook.FullName & _
“;Extended Properties=””Excel 12.0 Xml;HDR=YES;IMEX=1″”;”
Set conn = New ADODB.Connection
conn.Open strConn
‘ 3. 仕様データの抽出
Set rs = conn.Execute(“SELECT FROM [Sheet1$] WHERE [Status] = ‘Ready'”)
Do Until rs.EOF
‘ テンプレートから新規作成(または既存コピー)
Set swModel = swApp.OpenDoc6(“C:\Templates\BasePart.SLDPRT”, swDocPART, swOpenDocOptions_ReadOnly, “”, 0, 0)
‘ 寸法の書き換え
UpdateDimension swModel, “D1@Sketch1”, rs(“ValueA”).Value
UpdateDimension swModel, “D1@Boss-Extrude1”, rs(“ValueB”).Value
‘ 保存処理
swModel.SaveAs2 “C:\Output\” & rs(“FileName”).Value & “.SLDPRT”, 0, False, False
swApp.CloseDoc swModel.GetTitle
rs.MoveNext
Loop
‘ 後処理
rs.Close
conn.Close
Set swModel = Nothing
MsgBox “全自動生成完了”, vbInformation
End Sub
Private Sub UpdateDimension(model As IModelDoc2, dimName As String, val As Double)
Dim swDim As IDimension
Set swDim = model.Parameter(dimName)
If Not swDim Is Nothing Then
swDim.SystemValue = val 0.001 ‘ メートル法への変換
model.EditRebuild3
End If
End Sub
—
4. 現場で生き残るための「鉄則」
1. `EditRebuild3` のタイミング
毎ループで `EditRebuild3` を呼ぶのは重いが、寸法変更後にモデルが破綻していないか確認するために不可欠だ。複雑なフィーチャの場合は、`ForceRebuild3` を検討せよ。
2. ゾンビプロセス対策
SolidWorksがクラッシュした際、`swApp` 変数が残るとバックグラウンドでプロセスが動き続ける。`On Error GoTo` で必ず `swApp.ExitApp` または `Set swApp = Nothing` を行うハンドラを実装すること。
3. ファイルパスのバリデーション
ADODBで読み込んだ文字列に、ファイルシステムで使用禁止な文字(`\ / : ? ” < > |`)が含まれていないか、`RegExp`等で正規化するガード句を必ず入れろ。ここで手を抜くと、バッチ実行の途中で確実に停止する。
—
結びに代えて
自動化とは、単にコードを書くことではない。「システムが止まったときに、誰が、どう復旧するか」までを設計することだ。
このマクロを導入すれば、君のチームは「単純な設計の繰り返し」から解放され、よりクリエイティブな「製品の価値を高める設計」に集中できるはずだ。
実装で迷うことがあれば、またここへ来い。さらなる深淵へと導いてやる。
