狂気のパラメトリック・ビルド:ADODBとSolidWorks APIによる「完全自動生成」の極意
SolidWorks APIを操るエンジニア諸君。GUIをポチポチとクリックしてパーツを生成する時代は、とっくに終わっている。
我々が直面するのは、数百のバリエーションを持つ製品群を、いかに「ミスなく」「高速に」「堅牢に」生成するかという課題だ。Excelの仕様表を横目に手作業でコンフィギュレーションを切り替えるなど、エンジニアの仕事ではない。今回は、ADODBを介したデータベース接続とSolidWorks APIを直結させ、メモリの断片化を許さない極限のバッチ処理アーキテクチャを伝授する。
—
1. なぜ「ADODB」なのか?:レガシーの皮を被った最強の接続層
現代のWeb APIやORM全盛の時代に、なぜあえてADODB(ActiveX Data Objects)を使うのか。理由は単純だ。「依存関係の排除」と「実行速度」である。
SolidWorks VBA環境において、巨大な外部ライブラリをロードすることはメモリリークのリスクを高める。ADODBはWindows OSに標準搭載されており、追加のランタイムを必要としない。SQL Serverであれ、Accessであれ、あるいはCSVをSQLで叩くためのText Driverであれ、ADODBは最も低レイヤーで安定した橋渡し役となる。
接続の鉄則:Connectionは「使い捨て」にするな
多くのエンジニアはループのたびに接続を試みるが、それは愚策だ。接続と切断のオーバーヘッドは積もり積もれば数分単位のロスになる。
‘ 接続オブジェクトをモジュールレベルで保持し、バッチ開始時に開き、終了時に閉じる
Private cn As ADODB.Connection
Public Sub InitializeDatabase(connectionString As String)
Set cn = New ADODB.Connection
cn.ConnectionString = connectionString
cn.Open
End Sub
—
2. メモリ管理:SolidWorks APIの「不可視の毒」を抜く
SolidWorks APIを連続稼働させると、必ずと言っていいほどメモリの肥大化に直面する。特に `ModelDoc2` や `Feature` オブジェクトをループ内で生成し続けると、ガベージコレクションが追いつかず、SolidWorksプロセスがクラッシュする。
鉄則:オブジェクトの「強制解放」と「プロセス管理」
`Set obj = Nothing` だけでは不十分だ。SolidWorksのメモリを解放するためには、ドキュメントを明示的に閉じ、不要なCOM参照を完全に切る必要がある。
‘ メモリリークを防止するイディオム
Public Sub ProcessPart(spec As Object)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
‘ プロセスを再利用するか、定期的に再起動するロジックを組み込むこと
Set swApp = GetObject(, “SldWorks.Application”)
‘ モデルを開く/新規作成
Set swModel = swApp.NewDocument(…)
‘ — ジオメトリ操作ロジック —
‘ パラメータ更新、再構築(Rebuild)
swModel.EditRebuild3
‘ 保存
swModel.SaveAs2 “Path\To\File.sldprt”, …
‘ 強制解放
swApp.CloseDoc swModel.GetTitle
Set swModel = Nothing
‘ ここでWindows APIのSleepを挟むと、COMスタックが落ち着く
Sleep 500
End Sub
—
3. 実践:仕様マトリクスからの完全自動ビルド
以下のコードは、ADODBで取得したレコードセットをループし、SOLIDWORKSの寸法値を書き換えていくバッチ処理の核となる部分だ。
Sub BatchGenerator()
Dim rs As ADODB.Recordset
Dim sql As String
sql = “SELECT PartName, DimA, DimB, Material FROM Specifications WHERE Status = ‘Pending'”
Set rs = cn.Execute(sql)
Do Until rs.EOF
‘ 1. モデルを開く
‘ 2. 寸法オブジェクトを検索し、値を更新
UpdateDimension “D1@Sketch1”, rs!DimA
UpdateDimension “D2@Sketch1”, rs!DimB
‘ 3. マテリアル設定
SetMaterial rs!Material
‘ 4. 再構築して保存
SaveAndClose rs!PartName
rs.MoveNext
Loop
rs.Close
End Sub
—
4. チーフアーキテクトからの助言:安定運用のための最後の一線
Windows APIによる「監視」
SolidWorksがハングアップした際、VBAの実行スレッドも道連れになる。これを防ぐために、`GetWindowThreadProcessId` 等のWindows APIを駆使し、SolidWorksの応答性を監視する外付けのウォッチドッグ(C#やPython等の別プロセス)を走らせるのが、プロの現場での常識だ。
ログとロールバック
何十ものパーツを生成する際、一つでもファイルパスの重複やパラメータ不正があれば、全バッチが止まる。
- トランザクションを意識せよ: 生成に失敗した場合は、そのログをDBに書き込み、次の行へ進む「フォールトトレラント」な設計を組み込むこと。
- テンポラリファイルの削除: 生成途中で失敗した残骸は、次に同じ名前のファイルを生成する際に致命的なエラーを招く。`Kill` ステートメントによるクリーンアップ処理を必ず `Error Handler` に仕込むこと。
—
結びに代えて
自動化とは、単にコードを書くことではない。「システムが沈黙していても、正しく動き続けるための環境を構築すること」である。
VBAはレガシーと言われるが、その制御性は依然として最強だ。ADODBという古き良き盾を持ち、SolidWorks APIという剣を研ぎ澄ませ。君たちが構築するそのシステムが、明日の製造業の生産性を数倍に引き上げることを期待している。
技術に妥協するな。コードは常に、君の誇りであれ。
