SolidWorks APIの深淵:正規表現を用いた構成(Configuration)フィルタリングの極致
SolidWorks APIを扱う際、多くのエンジニアが陥る罠がある。それは、`GetConfigurationNames`で取得した配列を、愚直に`If…Then…`のネストで選別するルーチンだ。
数千のコンフィギュレーションを抱える大規模アセンブリにおいて、泥臭い文字列比較はメモリリークの温床となり、処理速度を著しく低下させる。真のエンジニアは、OSが提供する強力なエンジン――`VBScript.RegExp`をSolidWorksのオブジェクトモデルに組み込み、宣言的に構成を制御する。
本稿では、レガシー環境の保守から次世代の自動化システムまで通用する、極限のフィルタリング手法を提示する。
—
1. なぜ「RegExp」なのか:パフォーマンスと保守性の相克
VBAにおける文字列操作は、往々にしてアロケーションのオーバーヘッドを伴う。特に`ModelDoc2`の各構成を走査する際、名前の照合に正規表現を用いる利点は以下の3点に集約される。
1. 複雑な命名規則の抽象化: `P-
-rev` のような可変長パターンを、数行のコードで堅牢にキャプチャできる。
2. 実行時コンパイルの効率: `RegExp`オブジェクトをループの外側でインスタンス化することで、処理の高速化とメモリ消費の最小化を実現する。
3. 疎結合な設計: 命名規則の変更がプロジェクトの仕様変更に直結する場合、正規表現パターンを変数化するだけでロジックを一切修正せずに対応可能である。
—
2. 実装:メモリ管理を徹底した構成フィルタリング
以下のコードは、単なるスニペットではない。オブジェクトのライフサイクルを制御し、例外を最小限に抑えるための「アーキテクトの型」である。
Option Explicit
‘ 伝説的なエンジニアは、定数やオブジェクトのスコープを厳格に管理する
Public Sub ProcessFilteredConfigurations()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim vConfigNames As Variant
Dim i As Long
‘ 正規表現エンジンのセットアップ
Dim regEx As Object
Set regEx = CreateObject(“VBScript.RegExp”)
‘ パターン定義: P-で始まり、3桁の数字、-revの後になんでも続く
With regEx
.Pattern = “^P-\d{3}-rev.$”
.IgnoreCase = True
.Global = True
End With
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then Exit Sub
‘ GetConfigurationNamesはVariant配列を返す。メモリ効率を考慮し、一度だけ呼び出す
vConfigNames = swModel.GetConfigurationNames
For i = LBound(vConfigNames) To UBound(vConfigNames)
‘ 正規表現によるマッチング評価
If regEx.Test(vConfigNames(i)) Then
‘ ここにバッチ処理(例: ステータス書き出し、PDF生成のトリガーなど)を記述
Debug.Print “Matched Configuration: ” & vConfigNames(i)
Call PerformBatchOperation(swModel, vConfigNames(i))
End If
Next i
‘ 明示的なオブジェクト解放:VBAのガーベジコレクションを待たない
Set regEx = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
Private Sub PerformBatchOperation(ByVal model As SldWorks.ModelDoc2, ByVal configName As String)
‘ 構成の切り替えはコストが高い処理である。必要最小限の回数に留めること
Dim swConfig As SldWorks.Configuration
Set swConfig = model.GetConfigurationByName(configName)
‘ モデルの切り替えによる再計算の負荷を考慮し、ここでは詳細な処理を分離する
‘ …
End Sub
—
3. シニアエンジニアが意識すべき「隠れたコスト」
この実装において、注意すべき点が二つある。
A. コンフィギュレーション切り替えの重み
`ShowConfiguration2` を頻繁に呼び出すことは、SolidWorksの内部エンジンに莫大な再計算コストを強いる。フィルタリングによって抽出したリストに対し、「本当にアクティブにする必要があるのか」を自問すべきだ。プロパティの取得だけで済むならば、`Configuration`オブジェクトを直接参照する手法(`GetConfigurationByName`)を優先せよ。
B. エラーハンドリングの境界線
VBAの`On Error Resume Next`を乱用するな。特定のコンフィギュレーションでモデルが破損していた場合、処理全体が沈黙するのは致命的である。正規表現でのマッチング後、`GetObject`による構成取得時に必ず`Nothing`チェックを挟むこと。これが、システムを「停止しない自動化」へと昇華させる唯一の道だ。
—
結びに:レガシーを「遺産」へ
VBAは、正しく扱えばSolidWorksの持つポテンシャルを極限まで引き出す最高峰の武器となる。オブジェクトモデルとOSレベルのライブラリをいかに調和させるか。その視点を持つか否かで、書かれるコードの寿命は10倍変わる。
この正規表現フィルタリングは、単なるテクニックではない。膨大な設計データから必要な「本質」だけを抽出する、エンジニアリングの精神そのものだ。
さあ、次は君の番だ。このロジックをベースに、さらに強固な自動化ワークフローを構築してほしい。
