SolidWorks VBAを掌握する極限の知見:LibraryFeatureDataによる標準形状の「物理演算レベル」自動配置
現場で「標準形状の挿入」を自動化したいと考えたとき、多くのエンジニアは単に `InsertLibraryFeature` を呼んで終わらせる。しかし、それは自動化ではなく、ただの「手作業の模倣」に過ぎない。
真のエンジニアは、SolidWorksのメモリ空間におけるオブジェクトのライフサイクルを制御し、いかにして再計算コストを最小化し、堅牢なジオメトリ更新を実装するかを考える。本稿では、`LibraryFeatureData` を駆使し、社内標準ポケット・ボスを座標指定で射出するアーキテクチャを解剖する。
—
1. 概念的支配:LibraryFeatureDataの真価
`LibraryFeatureData` は、単なるフィーチャ挿入ツールではない。これは、SolidWorksのジオメトリカーネルであるParasolidに対して、「どの面を基準に、どのパラメータ(スケッチ駆動寸法など)で、どの配置参照(Reference)を拘束するか」を明示的に命令するための低レイヤーインターフェースだ。
この操作をVBAで行う際、最大の敵は「再計算のスパイク」と「COM参照のリーク」である。
2. 実装の核心:配置ロジックの最適化
以下のコードは、単にライブラリを置くのではなく、明示的なオブジェクト解放と、`ModelDocExtension` を介した高速なアタッチメント処理を前提としている。
‘ 伝説的なアーキテクトによる、LibraryFeature配置の最適化実装
Sub InsertStandardFeature(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, libPath As String, targetFace As SldWorks.Face2, x As Double, y As Double, z As Double)
Dim swFeatMgr As SldWorks.FeatureManager
Dim swLibData As SldWorks.LibraryFeatureData
Dim swFeat As SldWorks.Feature
Set swFeatMgr = swModel.FeatureManager
‘ 1. ライブラリフィーチャデータの生成
Set swLibData = swFeatMgr.CreateDefinition(swFeatureNameID_e.swFtrLibraryFeature)
‘ 2. 物理パスの検証(実行時エラーを避けるために必須)
If Dir(libPath) = “” Then Err.Raise vbObjectError + 1001, “AutoFeature”, “ライブラリファイルが見つかりません”
swLibData.LibraryFeatureFileName = libPath
‘ 3. 参照配置の最適化
‘ ここで重要なのは、ターゲット面を明示的に選択し、配置コンテキストを固定すること
Dim refs(0) As Object
Set refs(0) = targetFace
swLibData.References = refs
‘ 4. メモリ管理とフィーチャ挿入
‘ 再計算を最小限にするため、一度の処理で完結させる
Set swFeat = swFeatMgr.CreateFeature(swLibData)
‘ 5. 明示的なメモリ解放(VBAのGCを待たない)
Set swLibData = Nothing
Set swFeat = Nothing
Set swFeatMgr = Nothing
‘ 成功の証:モデルの更新を強制
swModel.EditRebuild3
End Sub
3. シニアエンジニアが意識すべき「隠れたコスト」
① COMオブジェクトのライフサイクル管理
VBAの `Set = Nothing` は単なる習慣ではない。SolidWorksのような巨大なCOMサーバを操る際、参照カウントが残ったままループを回すと、Windowsのプロセス内でメモリリークが蓄積し、数千回の自動処理後にSOLIDWORKSが沈黙(フリーズ)する。`CreateDefinition` を呼び出した後は、必ずスコープ外で参照を破棄するプロトコルを徹底せよ。
② 再計算のトラップ
`swModel.EditRebuild3` は強力だが、コストが高い。もし複数のポケットを同時に配置する場合、各配置ごとにリビルドをかけるのは愚策だ。全ての配置処理が完了した後に、一度だけ `ForceRebuild3` を実行するスタックアーキテクチャを組むべきである。
③ 座標変換とベクトル
ライブラリフィーチャの配置において、座標値(x, y, z)を直接指定できないケース(スケッチの拘束に依存する場合)は多い。この場合、`SketchManager` を使い、一時的な「配置用点スケッチ」を作成し、それをライブラリの参照として渡すのが最も堅牢だ。これにより、モデルの変更に対して追従性の高いパラメトリックな設計を維持できる。
4. 拡張の極致:Windows APIによるシステム間連携
社内システムから生成された「配置座標リスト(CSVやJSON)」を読み込んで自動配置する際、`DoEvents` を挟むタイミングを誤ると、Windowsメッセージループが飽和し、SolidWorksのUIが「応答なし」になる。
大量処理時には、Windows APIの `Sleep` をミリ秒単位で挟み、OSのメッセージキューをクリアする余裕を持たせるのが、システム管理者としての矜持である。
‘ メッセージループを保護するためのAPI宣言
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
‘ ループ処理内での制御例
For i = 0 To UBound(coordList)
Call InsertStandardFeature(…)
DoEvents
Sleep 10 ‘ OSへの敬意を払う
Next i
結論
SolidWorksの自動化は、単なるスクリプトの作成ではない。それは、CADという巨大なソフトウェアの「呼吸」を理解し、そのリソース管理を掌握することに他ならない。
`LibraryFeatureData` を使いこなすことは、社内の標準化を強制する強力な武器となる。しかし、その力は常に「最適化されたメモリ」と「整合性のある参照」の上にのみ成り立つ。現場の混沌を秩序立てるために、この知見を役立ててほしい。
