SolidWorks自動化の真髄:FSO×CSVによる「パーツ量産エンジン」の極意
SolidWorksの自動化において、GUI操作の記録(マクロ記録)などというものは、せいぜい「初学者の遊び」に過ぎない。我々のようなシニアエンジニアが真に向き合うべきは、メモリの枯渇を防ぎ、数千のフィーチャを秒単位で制御し、システム全体の堅牢性を担保することだ。
今回は、CSVデータを起点とした「パーツのバッチ一括生成&寸法変更エンジン」の設計思想と実装の核心を、伝説的なコードの断片と共に解説する。
—
1. なぜ「FileSystemObject(FSO)」と「Late Binding」なのか
多くの開発者は、参照設定を多用し、プロジェクトに重い依存関係を詰め込む。これはシステムを脆弱にする悪手だ。
- FSOの優位性: `Open` ステートメントなどのレガシーなI/Oは、大規模データではエラーハンドリングが困難だ。FSOはオブジェクト指向で、エラーをイベントとして補足できる。
- Late Binding(遅延バインディング)の採用: `CreateObject` を用いることで、実行環境のSolidWorksのバージョン差異を吸収し、プロジェクトの「腐敗」を防ぐ。
—
2. 究極のメモリ管理:オブジェクトのライフサイクルを制御せよ
VBAにおいて「メモリリーク」は、`Nothing` を代入しなかったことによる怠慢から生まれる。特にSolidWorksの `ISldWorks` や `IModelDoc2` は、COMポインタの塊だ。これを適切に解放しないことは、数時間のバッチ処理を途中でクラッシュさせるトリガーとなる。
以下のコードは、数千回のリビルドを耐え抜くための「クリーンなループ構造」の模範である。
‘ 限界まで最適化されたバッチ処理の核
Public Sub BatchUpdatePartEngine(csvPath As String)
Dim swApp As Object
Dim swModel As Object
Dim fso As Object, ts As Object
Dim csvLine As String
‘ SolidWorksのインスタンスを掴む
Set swApp = GetObject(, “SldWorks.Application”)
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set ts = fso.OpenTextFile(csvPath, 1) ‘ 1 = ForReading
On Error Resume Next ‘ 致命的な例外からシステムを守る
Do Until ts.AtEndOfStream
csvLine = ts.ReadLine
‘ 【重要】データ処理ごとにパーツを明示的に開閉する
Set swModel = swApp.OpenDoc6(ExtractPath(csvLine), 1, 0, “”, 0, 0)
If Not swModel Is Nothing Then
Call UpdateDimensions(swModel, csvLine)
swModel.ForceRebuild3 False ‘ メモリをクリアしながら強制再構築
swModel.Save
swApp.CloseDoc swModel.GetTitle
End If
‘ オブジェクトの明示的解放(これが無いコードはゴミである)
Set swModel = Nothing
Loop
ts.Close
Set ts = Nothing
Set fso = Nothing
Set swApp = Nothing
End Sub
—
3. 「ForceRebuild3」の魔力とパフォーマンスチューニング
単純な `Rebuild` メソッドは、フィーチャツリーの再評価を省略することがある。数百のバリエーションを生成する場合、内部のジオメトリ整合性が崩れると、後続の計算で致命的なエラーを誘発する。
- ForceRebuild3(False): 全てのフィーチャを強制再計算させる。時間はかかるが、これは「信頼性」を買うためのコストだ。
- バックグラウンド処理の鉄則: `swApp.UserControl = False` および `swApp.Visible = False` を設定し、描画負荷を完全に排除せよ。GUI描画のコストは、処理全体の7割を占めることもある。
—
4. レガシー環境での保守性を高める「設計の分断」
数百行のCSVを読み込む際、全てのロジックを1つのモジュールに書くのは素人のやり方だ。以下の責務分担を徹底せよ。
1. I/O層: FSOによるデータ読み込みとパースのみを担当。
2. ロジック層: CSVデータから `Parameter` 値を取り出し、SolidWorks APIを叩く。
3. インターフェース層: `Set` や `Nothing` を管理し、例外をログファイルへ出力する。
特に、「どのパーツで、どの寸法が失敗したか」を記録するログクラスを別個に実装することを強く推奨する。数時間走らせた後に「不明なエラー」で全てが消えるのは、エンジニアとして最も避けるべき屈辱だ。
—
最後に:エンジニアへの提言
SolidWorks VBAは、現代の言語から見ればレガシーな技術かもしれない。しかし、製造現場の深部に深く入り込み、物理的な「モノ」を生成する力は、他のどんなスクリプト言語よりも強力だ。
- コードは「書く」のではなく「構築」せよ。
- リソースは「使う」のではなく「管理」せよ。
- 自動化は「効率」ではなく「品質」のためにある。
この知見を糧に、貴殿のシステムが数万のパーツをエラーなく、静かに生成し続けることを期待する。健闘を祈る。
