SolidWorks APIの真髄:正規表現を用いた「構成部品」の極限フィルタリング術
SolidWorks APIを扱う際、初心者が陥る最大の罠は「ループ処理の甘さ」と「オブジェクトの無駄な走査」だ。特に数千の構成部品や複雑なコンフィギュレーションを持つアセンブリにおいて、愚直な`If InStr(…)`の連打は、コードの可読性を殺すだけでなく、実行時間を指数関数的に増大させる。
今日は、VBAにおける「正規表現(VBScript.RegExp)」をSolidWorks APIのオブジェクトモデルと融合させ、柔軟かつ堅牢なフィルタリングを実現する「実戦的アーキテクチャ」を伝授する。
—
なぜ「正規表現」なのか?
`ModelDoc2.GetConfigurationNames`で取得した配列を、単純な文字列比較で処理しようとすれば、命名規則の揺らぎ(大文字小文字の混在や、連番の桁数変化など)に対応できず、最終的にメンテナンス不能なスパゲッティコードが完成する。
正規表現を使う最大のメリットは、「命名ルールの仕様書」をコードの中に埋め込めることにある。保守フェーズに入った際、仕様変更があっても「正規表現パターン」を書き換えるだけで対応できる。これがプロの設計だ。
—
プロダクションコード:柔軟なコンフィギュレーション抽出
以下に、再利用性と堅牢性を極限まで高めたクラス設計の雛形を提示する。
‘ 参照設定: Microsoft VBScript Regular Expressions 5.5
Option Explicit
”’
”’
Public Function GetFilteredConfigs(ByVal swModel As SldWorks.ModelDoc2, ByVal pattern As String) As Variant
Dim configNames As Variant
Dim i As Long
Dim regEx As RegExp
Dim matches As MatchCollection
Dim resultList As Collection
‘ 正規表現エンジンの初期化
Set regEx = New RegExp
With regEx
.pattern = pattern
.IgnoreCase = True ‘ 大文字小文字を区別しない(要件に合わせて変更)
.Global = True
End With
Set resultList = New Collection
configNames = swModel.GetConfigurationNames
‘ 配列走査は最小限の処理で
For i = LBound(configNames) To UBound(configNames)
If regEx.Test(configNames(i)) Then
resultList.Add configNames(i)
End If
Next i
‘ コレクションを配列に変換(呼び出し元での扱いやすさを考慮)
If resultList.Count > 0 Then
ReDim filteredArray(0 To resultList.Count – 1) As String
For i = 1 To resultList.Count
filteredArray(i – 1) = resultList(i)
Next i
GetFilteredConfigs = filteredArray
Else
GetFilteredConfigs = Array()
End If
End Function
—
現場で「死なない」ための3つの鉄則
単にコードを動かすだけなら誰でもできる。現場で「壊れない」システムを構築するために、以下の知見を心に刻んでほしい。
1. オブジェクト生存期間の管理(メモリリークの防止)
`SldWorks`や`ModelDoc2`オブジェクトをループ内で何度も呼び出すのはNGだ。パフォーマンスを優先するなら、プロシージャの冒頭で参照をキャッシュし、処理終了時には明示的に`Nothing`を代入してガベージコレクションを促す。特に大規模アセンブリを扱う場合、メモリの断片化はSolidWorks自体のクラッシュを誘発する。
2. ファイル・データベース連携の注意点
抽出したコンフィギュレーション名をファイル名に変換する場合、ファイルシステムで禁止されている文字(\ / : ? ” < > |)がコンフィギュレーション名に含まれていないか、正規表現で事前にフィルタリングするロジックを必ず入れること。データベースへ書き出す際は、SQLインジェクション対策として、パターンマッチングの段階で不正文字列を排除する「検証的フィルタ」として正規表現を活用するのがベストプラクティスだ。
3. 処理速度を犠牲にする「賢い選択」
もしあなたが数千の構成部品を毎日処理するなら、APIを叩く回数そのものを減らすことを検討せよ。SolidWorksのAPIはネットワーク越し(あるいはCOMインターフェース)の呼び出しコストが非常に高い。一度`GetConfigurationNames`で配列を取得したら、そのメモリ内で完結させる。外部リソースへのアクセスは「最小限の回数」に抑えることが、業務効率化の鉄則である。
—
結び:エンジニアとしての矜持
VBAは古い言語だと揶揄されることがある。しかし、SolidWorksの深層にあるAPIを自在に操り、複雑なCAD作業を数秒で終わらせるツールを構築できるのは、この言語の構造を深く理解した者にしか許されない特権だ。
「とりあえず動く」コードから、「メンテナンスを前提とした堅牢な」コードへ。あなたが書くその1行が、明日、同僚のエンジニアの時間を1時間救うかもしれない。その責任を胸に、コードを磨き続けてほしい。
次回の記事では、このフィルタリング結果を起点とした「コンフィギュレーションごとの一括図面PDF出力」における、メモリ最適化手法について解説する。期待していてほしい。
