鉄の規律:SQL ServerからSolidWorksへ至る「完全自動パーツ生成エンジン」の設計思想
多くのエンジニアがVBAを「簡易スクリプト」と侮る中、我々はそれを「SolidWorksという巨大なCADエンジンを制御する高精度なインテグレーター」として扱う。
特に、SQL Server上の製品マトリクスをソースとし、設計者が一切介在することなくパーツを生成するアーキテクチャにおいては、「メモリ管理の怠慢」と「例外処理の欠如」は、そのままシステムの死を意味する。
今回は、FileSystemObject (FSO) と ADODB を駆使し、レガシー環境でも安定稼働する「完全自動パーツ生成エンジン」の核心を解説する。
—
1. アーキテクチャの要諦:接続とメモリの断捨離
データベース接続(ADODB)とファイル操作(FSO)を行う際、最も避けるべきは「リソースのゾンビ化」だ。特にSolidWorksのオブジェクトは巨大であり、明示的に解放しなければメモリリークで数時間後にシステムがフリーズする。
ADODB/FSO接続のベストプラクティス
コネクションを開きっぱなしにするのは論外だ。必要な瞬間に接続し、即座にクローズする。`Nothing`代入による参照カウントのデクリメントを徹底せよ。
‘ ADODBによるSQL取得の定石
Public Function GetProductSpecs(ByVal OrderID As String) As ADODB.Recordset
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
‘ 接続タイムアウトを明示的に指定(ネットワーク遅延対策)
conn.ConnectionTimeout = 15
conn.Open “Provider=SQLOLEDB;Data Source=SERVER_NAME;Initial Catalog=DB_NAME;Integrated Security=SSPI;”
Set GetProductSpecs = New ADODB.Recordset
GetProductSpecs.Open “SELECT FROM Specifications WHERE OrderID = ‘” & OrderID & “‘”, conn
‘ ここでconnを閉じるとRecordsetが切れるため、呼び出し元で制御する設計が鉄則
End Function
—
2. SolidWorks API:フィーチャ再計算の負荷を制御せよ
パーツ生成で最もコストが高いのは `Rebuild`(再計算)だ。ループ内で何度も `swPart.ForceRebuild3` を呼ぶのは、エンジンの寿命を縮める行為に等しい。
ジオメトリ生成の鉄則:
1. サスペンド処理: `ModelDocExtension.SuspendRebuild` を使用し、すべてのフィーチャ操作が完了するまで再計算を抑制せよ。
2. モデル単位のクリア: 処理終了後は必ず `Set swPart = Nothing` で参照を断ち切る。
‘ フィーチャ操作の最適化エンジン
Sub BuildPartFromSpec(rs As ADODB.Recordset)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.NewDocument(“Part”, 0, 0, 0)
‘ 再計算のサスペンド
swModel.Extension.SuspendRebuild = True
‘ スケッチ・押し出し等のパラメータ適用
Call ApplyDimension(swModel, “D1@Sketch1”, rs(“Length”).Value)
Call ApplyMaterial(swModel, rs(“Material”).Value)
‘ 最終再計算
swModel.Extension.SuspendRebuild = False
swModel.ForceRebuild3 False
‘ 保存とメモリ解放
swModel.SaveAs2 “C:\Vault\Output\” & rs(“PartNumber”).Value & “.sldprt”, 0, False, False
swApp.CloseDoc swModel.GetTitle
Set swModel = Nothing
End Sub
—
3. レガシー環境を生き抜く:Windows APIの活用
ADODB接続時、ネットワークが不安定な現場ではVBAがハングアップする。これを防ぐには、Windows API `Sleep` を利用した待機ロジックを組み込み、CPU負荷を下げつつ再試行回数を制御する「指数バックオフアルゴリズム」を取り入れるべきだ。
If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If
‘ ネットワークリトライの極意
Dim retryCount As Integer
Do While retryCount < 3
On Error Resume Next
' ... DB接続処理 ...
If Err.Number = 0 Then Exit Do
retryCount = retryCount + 1
Sleep 2000 ' 2秒待機して再挑戦
Loop
---
4. チーフアーキテクトの提言
このシステムを「単なる自動化ツール」で終わらせるな。
ログ出力は必須だ。 どのパーツが、どの仕様で、いつ生成されたか。この履歴をFSOでCSV/テキストとして残すことは、後に設計のトレーサビリティを担保する唯一の手段となる。
- エラー処理: `Err.Clear` を呼ぶ前に、必ずスタック情報を記録せよ。
- パフォーマンス: 大量生成時は、SolidWorksを非表示モード(`swApp.Visible = False`)で起動し、バックグラウンドで処理せよ。
- 保守性: SQLクエリをVBAコード内に直書きせず、`config.ini` や外部SQLファイルから読み込む構造にせよ。
我々が書くコードは、数年後の後輩たちが「なぜ動いているのか分からない」と頭を抱えるようなブラックボックスであってはならない。堅牢で、かつ拡張性に富んだエンジンこそが、プロフェッショナルの矜持である。
さあ、実装に取り掛かれ。CADの限界を突破するのは、いつだって我々のコードだ。
