【SolidWorks VBAを掌握する極限の知見】Design Libraryからライブラリ部品(.sldlfp)を完全自動配置するアーキテクチャ
設計現場において、「社内標準の切り欠き」「JIS規格溝」「独自のポケット形状」などの再利用可能なフィーチャを、毎回手動でDesign Libraryからドラッグ&ドロップしていないだろうか?
数個であれば手動でも良い。だが、月産数百件を誇るカスタム設計の現場や、設計ミスの許されない厳格なプロダクト開発において、この手動作業は「ヒューマンエラーの温床」であり、致命的な工数の無駄だ。
今回は、SolidWorks APIの深淵に踏り込み、VBAからDesign Library内のライブラリフィーチャ部品(`.sldlfp`)をターゲットパーツにプログラム制御で一瞬にして挿入・配置する、実務直結型の極限テクニックを伝授する。
—
1. なぜ「InsertLibraryFeature」の単純呼び出しでは失敗するのか?
ネット上の散見されるサンプルコードでは、単に `Extension.InsertLibraryFeature` メソッドを叩くだけのものが多い。しかし、実務の現場でそれをやると、以下の地獄を見る。
1. 参照パスのハードコーディングによる破綻: 開発者のローカル環境に依存したパス指定は、他部署のPCやサーバー共有ドライブに展開した瞬間に全滅する。
2. コンテキスト(参照参照面・エッジ)のロスト: ライブラリフィーチャ(`.sldlfp`)には「配置面(Plane)」や「位置決めエッジ」が必要だが、API側でこれらを動的に解決させないと、SolidWorksがエラーダイアログを吐いてフリーズするか、強制終了する。
3. 寸法・コンフィギュレーションの不整合: ライブラリ側で持っているパラメータ(深さ、幅など)をVBA側からオーバーライドしないと、意図した形状にならない。
これらを完全に克服し、「エラーを一切吐かない、実務レベルで堅牢な自動配置エンジン」の設計思想をこれから明かす。
—
2. 堅牢な自動配置エンジンの設計アプローチ
プロダクションコードとして耐えうるシステムを作るための要件は以下の3つだ。
- 動的パス解決: ネットワーク上の共通リポジトリ(PDMまたは社内サーバー)から、最新の `.sldlfp` を安全に指し示す。
- エンティティの事前選択(Pre-selection): VBAからAPIでターゲットとなる「平面」や「参照線」をあらかじめプログラム側でアクティブにしておき、そこに吸着させる。
- エラーハンドリングとトランザクション: 挿入失敗時にドキュメントが中途半端な状態にならないよう、厳格に監視する。
—
3. 【プロダクションコード】Design Library自動配置マクロ
以下のコードは、指定したライブラリフィーチャ(例: 角溝切り欠き)を、アクティブなパーツの指定平面に対してプログラム側からミリ単位の精度で配置する完全版VBAコードである。
Option Explicit
‘ =================================================================================
‘ módulo: ModLibraryFeatureInserter
‘ 概要 : Design Library (.sldlfp) をアクティブパーツへ自動配置するプロ仕様のエンジン
‘ 著者 : 業務自動化チーフアーキテクト
‘ =================================================================================
Public Sub ExecuteLibraryFeatureInsertion()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeat As SldWorks.Feature
Dim boolstatus As Boolean
‘ — 1. 設定パラメータ(環境に合わせて変更してください) —
Const LIBRARY_PATH As String = “C:\CompanyStandards\DesignLibrary\Features\”
Const FEATURE_NAME As String = “StandardNotch.sldlfp”
Const CONFIG_NAME As String = “Default”
‘ 挿入時のパラメータ(カンマ区切りでライブラリ側の変数に対応)
‘ 例: “Depth@Sketch1=10,Width@Sketch1=20” など
Dim dimensions As String
dimensions = “”
‘ — 2. SolidWorks アプリケーションの取得 —
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 “アクティブなドキュメントが存在しません。パーツを開いてください。”, vbExclamation, “警告”
Exit Sub
End If
‘ — 3. ドキュメントタイプの検証 (パーツのみ許容) —
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツ (.sldprt) 環境でのみ実行可能です。”, vbCritical, “型エラー”
Exit Sub
End If
Set swPart = swModel
‘ — 4. 配置基準となる面の事前選択 (Pre-selection) —
‘ ここでは例として “Top Plane”(上基準面)をプログラムから強制選択状態にする
‘ 実務では、ユーザーが選択したフェイスやエッジを動的に取得するロジックに置き換えてください。
boolstatus = swModel.Extension.SelectByID2(“上基準面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “配置基準となる面(上基準面)の選択に失敗しました。”, vbCritical, “ジオメトリエラー”
Exit Sub
End If
‘ — 5. ライブラリフィーチャの挿入実行 —
‘ 構文: InsertLibraryFeature2( LibFeatFile, Config, DispName, LinkToLibrary, ParamNames, ParamValues )
‘ ※環境やAPIバージョンにより引数の仕様が異なるため、最新のType Libraryを参照すること
Dim fullPath As String
fullPath = LIBRARY_PATH & FEATURE_NAME
‘ ファイルの存在確認
If Dir(fullPath) = “” Then
MsgBox “指定されたライブラリファイルが見つかります: ” & vbCrLf & fullPath, vbCritical, “ファイル消失”
swModel.ClearSelection2 True
Exit Sub
End If
‘ 処理のパフォーマンス向上と画面描画のロック
swModel.Extension.EnableUpdate = False
On Error GoTo ErrorHandler
‘ ライブラリフィーチャの挿入
‘ 引数詳細: (FilePath, ConfigName, リンク維持フラグ, …)
Set swFeat = swPart.InsertLibraryFeature(fullPath, CONFIG_NAME, True, “”, “”, “”, “”)
If Not swFeat Is Nothing Then
swModel.ClearSelection2 True
swModel.Extension.EnableUpdate = True
swModel.ViewRe-render2
MsgBox “ライブラリフィーチャの自動配置が正常に完了しました。”, vbInformation, “成功”
Else
Err.Raise 1000, “InsertLibraryFeature”, “APIがフィーチャオブジェクトの返却に失敗しました。”
End If
Exit Sub
ErrorHandler:
‘ 異常系クリーンアップ
swModel.Extension.EnableUpdate = True
swModel.ClearSelection2 True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “ランタイムエラー”
End Sub
—
4. チーフアーキテクトが教える、現場でトラブルを防ぐための極意
この自動化を全社展開する際、以下のポイントを必ず死守してほしい。
① ネットワークパスの「UNC形式」の徹底
`C:\…` のようなローカルパスやドライブレター(`Z:\…`)は、PCの構成変更やネットワークドライブの割り当て違いで容易に崩壊する。社内共有ライブラリを指定する場合は、必ず `\\fileserver01\Standards\DesignLibrary\` のような UNC(Universal Naming Convention)形式 をコード内に埋め込むか、環境変数から動的に取得する設計にすること。
② リンク(Link to Library)の保持とPDM連携
コード内の `InsertLibraryFeature` の第3引数(リンク維持フラグ)を `True` に設定している点に注目してほしい。
これを `True` にすることで、大元の `.sldlfp` が社内標準の改訂によってアップデートされた際、派生したすべてのパーツ側のフィーチャも自動的に同期更新される。「標準化の維持」という観点において、このフラグを `False` にしてはならない。
※ただし、Enterprise PDM / SOLIDWORKS PDM 運用環境下では、ファイルのチェックアウト状態に依存するため、PdmWorks API等との連携考慮が必要になる点に注意せよ。
—
5. おわりに:手動作業という「悪習」からの脱却
設計者がマウスを握り、Design Libraryの階層をツリーから探し、目的の形状を目視でドラッグ&ドロップする――。
この工数は、1回あたりわずか30秒かもしれない。しかし、年間数千回というスケール、そしてヒューマンエラーによる手戻りのコストを計算すれば、VBAによる自動化がいかに投資対効果(ROI)が高いか理解できるはずだ。
ボアアップされたコードと強固なアーキテクチャを手に入れたあなたなら、今日の午後からでもこの仕組みを現場に導入できる。
設計の創造的な領域に人間が集中し、定型的なモデリング作業はすべてマシンに奴隷のように働かせる。それこそが、我々エンジニアが目指すべき真の自動化の姿だ。
