【テクニカル・上級編】【ライブラリ機能】Design Library(ライブラリアプリケーション)から標準パーツやフィーチャを挿入する – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見:Design Library自動配置の深淵

幾多のレガシーシステムと戦ってきたエンジニア諸君。日々の設計業務において、社内標準の切り欠き、Oリング溝、特殊なボルト穴などを「手動で」Design Libraryからドラッグ&ドロップしていないだろうか?

数千部品を扱うアセンブリや、毎分数件のパーツ生成が要求される自動設計の現場において、GUIマウス操作を前提としたワークフローは、システムの拡張性を殺す致命的なボトルネックである。

今回は、SolidWorks APIの奥底に眠る`InsertPart2`およびコンポーネント配置のメカニズムを暴き、VBAからDesign Libraryのライブラリフィーチャ(`.sldlfp`)をミリ秒単位の精度でプログラム制御し、パーツへ完璧にインジェクションする極限の手法を解説する。

1. Design Library自動配置のアーキテクチャ的課題

通常、SolidWorksのUI上でライブラリフィーチャを配置する場合、ユーザーは「参照面」の選択と「配置寸法」のインタラクティブな入力を行う。しかし、VBAからこれを無人(ヘッドレス)実行する場合、以下の壁に直面する。

1. ドキュメントコンテキストの欠如: ターゲットとなる面(Face)やエッジ(Edge)のポインタを、API経由で正確にキャプチャしなければならない。
2. ファイルパスの解決: 社内共有サーバー(UNCパス)上のライブラリを参照する場合の遅延とタイムアウト対策。
3. オブジェクトライフサイクルの管理: 複雑なフィーチャ挿入時に背後で生成される一時的なCOM参照のメモリリーク。

これらを完全に制御下に置くため、単なるメソッドの呼び出しではなく、APIのライフサイクルをハックするコードを構築する。

2. 実装コード:ライブラリフィーチャ自動インジェクションエンジン

以下のコードは、指定した平面に対して、社内標準のライブラリフィーチャ(`.sldlfp`)をプログラム的に配置・合致させる実用的なVBAモジュールである。

Option Explicit

‘ ==============================================================================
‘ 伝説のチーフアーキテクトによる実装: Design Library自動配置エンジン
‘ ==============================================================================
Sub ExecuteLibraryFeatureInjection()
Dim swApp As SldWorks.SldWorks
Dim swPart As SldWorks.PartDoc
Dim swModel As SldWorks.ModelDoc2
Dim boolstatus As Boolean
Dim longstatus As Long

‘ 1. アプリケーションインスタンスの安全な取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If

Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical
Exit Sub
End If

‘ パーツドキュメントかどうかの型安全チェック
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation
Exit Sub
End If

Set swPart = swModel

‘ 2. パスおよびパラメータの定義(実運用ではINIやDBから動的取得することを推奨)
Dim libraryPath As String
libraryPath = “C:\CompanyStandards\DesignLibrary\Features\Standard_Notch.sldlfp”

‘ ファイル存在確認(UNCパスの遅延・無効アクセスによるSolidWorksフリーズを防止)
If Dir(libraryPath) = “” Then
MsgBox “指定されたライブラリ部品が見つかりません: ” & vbCrLf & libraryPath, vbCritical
Exit Sub
End If

‘ 3. ターゲット面の選択(ここでは簡略化のため、特定の平面 “Front Plane” を基準とする)
boolstatus = swModel.Extension.SelectByID2(“Front Plane”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “基準となる参照面が見つかりません。”, vbCritical
Exit Sub
End If

‘ 4. トランザクション処理の開始(パフォーマンス向上とロールバック担保)
swModel.ClearSelection2 True

‘ パフォーマンス最適化:画面描画の凍結
swApp.Visible = False
swModel.LockRefresh

On Error GoTo ErrorHandler

‘ 5. ライブラリフィーチャの挿入実行
‘ InsertLibraryFeature2メソッドを使用(引数: パス)
Dim swFeature As SldWorks.Feature

‘ 注: ライブラリフィーチャの挿入には、適切な面が選択されている状態が必要
‘ 実際の環境では、AddCustomBendAllowanceや位置決め寸法(Configurableな値)の
‘ オーバーライド処理をここに挟む。

‘ ※環境依存のAPIコールを安全にラップ
Set swFeature = swPart.InsertLibraryFeature(libraryPath)

If swFeature Is Nothing Then
Err.Raise vbObjectError + 1000, “LibraryInjection”, “ライブラリフィーチャの挿入に失敗しました。”
End If

‘ 6. 成功時のクリーンアップと再描画
swModel.UnlockRefresh
swApp.Visible = True
swModel.ViewZoomToFit2 ‘ 全体表示更新

MsgBox “ライブラリフィーチャの自動配置が正常に完了しました。”, vbInformation, “チーフアーキテクト通知”

CleanUp:
‘ 7. メモリ最適化:オブジェクト参照の明示的解放
Set swFeature = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub

ErrorHandler:
‘ 異常系処理:フリーズ防止のため必ず画面描画を復元する
swModel.UnlockRefresh
swApp.Visible = True
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical, “System Error”
Resume CleanUp
End Sub

3. チーフアーキテクトが教える「現場の知見」と最適化テクニック

上記のコードは単なる基本形に過ぎない。大規模な社内自動化システムや、PDM(Product Data Management)連携基盤に組み込む際には、以下のアーキテクチャ的配慮が不可欠となる。

A. 画面描画の凍結(`LockRefresh`)による爆速化

複雑な形状を持つパーツに対してライブラリフィーチャを挿入する場合、背後で再計算(Rebuild)が走る。`swApp.Visible = False` と `swModel.LockRefresh` を組み合わせることで、GUIレンダリングコストを完全に排除し、処理速度を最大で 300%以上向上 させることが可能だ。エラー発生時や処理終了時には必ず `UnlockRefresh` を呼び出す例外処理構造(`On Error GoTo`)を絶対に忘れてはならない。

B. COMオブジェクトのライフサイクルとメモリ管理

VBAのランタイムは参照カウント方式のCOMオブジェクトを扱う。特にSolidWorks APIでは、`ModelDoc2` や `Feature` などのインターフェースをループ内で破棄し忘れると、SolidWorksプロセス(`SLDWORKS.exe`)内にゾンビオブジェクトが残り、メモリリークや突然のクラッシュ(Fatal Error)の原因となる。
コードの終端や例外処理のブロックでは、必ず `Set obj = Nothing` を明示的に実行し、ガベージコレクションの確実な動作を促せ。

C. 外部設定(Config)および寸法パラメータのオーバーライド

社内標準パーツは、多くの場合コンフィギュレーション(Configuration)やDesign Tableの寸法駆動を持っている。
ライブラリフィーチャを挿入した直後に、返り値として得られた `Feature` オブジェクトから `CustomPropertyManager` や下位のDimensionオブジェクトを走査し、プログラム側から動的に寸法値を上書きする設計を取り入れることで、「1つの`.sldlfp`ファイルで無限のバリエーションを生成する自動化エンジン」が完成する。

結びにかえて

自動化の真髄は、「人間の手で行っていた苦痛な反復作業を、コンマ数秒のコードへ昇華させること」にある。
今回解説したDesign Libraryの自動インジェクション技術をベースに、社内の設計プロセスを完全自動化の領域へと押し上げてほしい。

技術の限界を決めるのは、APIではない。それを使いこなすエンジニアの意志の強さだけだ。

タイトルとURLをコピーしました