【テクニカル・上級編】【コンフィギュレーション名の正規表現マッチング】VBScript.RegExpを組み合わせたマルチ構成部品の柔軟なフィルタリング – SolidWorks VBA解析バイブル

スポンサーリンク

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倍変わる。

この正規表現フィルタリングは、単なるテクニックではない。膨大な設計データから必要な「本質」だけを抽出する、エンジニアリングの精神そのものだ。

さあ、次は君の番だ。このロジックをベースに、さらに強固な自動化ワークフローを構築してほしい。

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