【SolidWorks VBA】社内標準テンプレートからのパーツ生成:その「甘え」を捨て、堅牢なアーキテクチャを構築せよ
多くのエンジニアが「なんとなく」書いている `NewDocument`。しかし、大規模な社内環境や、PDMとの連携、あるいは数百のバリエーションを動的生成するシステムにおいて、その「なんとなく」は数年後に爆弾となって返ってくる。
今日は、SolidWorks APIを使い倒し、メモリとプロセスを完全に掌握するための「真のテンプレート生成術」を伝授する。
なぜ「デフォルト」を信じてはならないのか
SolidWorksのデフォルト設定は、個々の開発者のPC環境や、過去のパッチ適用状況によって揺らぐ。`NewDocument` を引数なしで呼ぶことは、「どのテンプレートが適用されるか運任せにする」という、プロとしてあってはならないギャンブルに等しい。
我々が求めるのは、常に一定のドキュメントプロパティ、単位系、カスタムプロパティ(メタデータ)を保持した「社内標準」の正確な展開だ。
堅牢なパーツ生成:実践的コード
以下のコードは、単にテンプレートを開くだけではない。オブジェクトのライフサイクルを明示的に管理し、異常系への耐性を備えた「プロダクション・グレード」のコードである。
Option Explicit
‘ 伝説のエンジニアが教える、最も堅牢なパーツ生成の作法
Public Sub CreatePartFromTemplate()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim templatePath As String
‘ 1. インスタンスの取得(Late Bindingを避け、型安全性を確保)
Set swApp = Application.SldWorks
‘ 2. テンプレートパスのバリデーション
‘ ネットワークドライブ上のパスをハードコードせず、設定ファイルやレジストリから取得するのが定石
templatePath = “C:\CompanyStandard\Templates\Standard_Part.prtdot”
If Dir(templatePath) = “” Then
Err.Raise vbObjectError + 1000, “TemplateLoader”, “テンプレートが見つかりません: ” & templatePath
End If
‘ 3. NewDocumentEx による明示的なドキュメント生成
‘ 戻り値は ModelDoc2。これを直接キャストして操作する
Set swModel = swApp.NewDocument(templatePath, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “ドキュメントの生成に失敗しました。”, vbCritical
Exit Sub
End If
‘ 4. ここから先は自由だが、必ず「モデルの再構築」と「メモリ解放」を意識せよ
‘ ジオメトリ生成後には以下の処理が必須
‘ swModel.ForceRebuild3 True
‘ オブジェクトの明示的解放(VBAにおいては重要)
Set swModel = Nothing
Set swApp = Nothing
End Sub
シニアエンジニアが押さえるべき「極限の知見」
1. メモリリークを許すな
VBAにおいて、`SldWorks`オブジェクトをグローバルスコープで安易に使い回すと、大規模な自動化処理中にプロセスが肥大化する。特に `NewDocument` を繰り返すバッチ処理では、各反復の最後に `Set swModel = Nothing` を呼び出し、必要に応じて `DoEvents` を挟み、Windowsのリソース開放を促す必要がある。
2. ファイルパスの抽象化(依存性の注入)
テンプレートパスをコード内に直書きするなど論外だ。
- 環境変数: `%SW_STD_TEMPLATE%` のような環境変数を利用する。
- 設定ファイル: JSONやINIファイルで管理し、実行時に注入する。
これにより、テンプレートの更新時にバイナリを再コンパイルする必要がなくなる。
3. Windows APIによるプロセス監視
大規模なシステム連携を行う場合、SolidWorksがフリーズした際にVBA側でタイムアウトを検知する必要がある。`FindWindow` APIを使用してSolidWorksのウィンドウハンドルを監視し、応答がない場合は `TerminateProcess` で強制終了させる。ここまでの制御を行って初めて「業務自動化」と呼べる。
結びに:保守性こそがエンジニアの矜持
あなたが書くコードは、あなたがいなくなった後の後輩が保守する。`NewDocument` 一つとっても、「なぜこのパスを選んだのか」「エラーが起きた時にどうハンドリングしているのか」という意図がコードから滲み出ている必要がある。
「動けばいい」というコードは、今日で卒業しよう。
SolidWorksという巨大なレガシー・モンスターを飼い慣らすのは、このような細部への執着心を持ったエンジニアだけなのだ。
さあ、次はフィーチャの動的生成における「キャッシュを活用した再構築の最適化」について議論するとしよう。準備はいいか?
