【テクニカル・上級編】【プロフェッショナル設計】クラスモジュールを用いたSolidWorksパーツフィーチャ生成ロジックのオブジェクト指向カプセル化 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAの極致:オブジェクト指向設計による「メンテナンスフリー」な自動化基盤の構築

多くのVBAエンジニアが陥る罠がある。それは、標準モジュールに数千行の「手続き型コード」を書き連ね、スパゲッティ化したロジックに自ら首を絞められることだ。

SolidWorks APIは強力だが、その本質は「COMオブジェクトの巨大な迷宮」である。適当に書いたコードはメモリリークを誘発し、SolidWorksのプロセスを徐々に腐らせる。本稿では、レガシーなVBA環境を、堅牢で拡張性の高い「真の工学システム」へと昇華させるためのアーキテクチャを提示する。

1. なぜ「クラスモジュール」なのか?――自動化の寿命を延ばす設計思想

VBAはオブジェクト指向言語の皮を被った手続き型言語だが、クラスモジュールを使えば、「状態を持つロジック」をカプセル化できる。

パーツ生成を例に取れば、標準モジュールで`swApp.ActiveDoc`を直接操作してはならない。それは「誰でも書き換え可能なグローバル変数」を弄り回すようなものだ。代わりに、パーツ操作の責任を負う`PartManager`クラスを作成し、SolidWorksの複雑なAPIインターフェースを、自社の設計ルールに合わせた簡潔なインターフェースへ抽象化するのだ。

2. 実装:フィーチャ生成の抽象化アーキテクチャ

以下は、パーツ生成をカプセル化したクラスの実装例である。

Class: `CFeatureBuilder.cls`

‘ ———————————————————
‘ SolidWorks APIの複雑さを隠蔽し、保守性を担保するクラス
‘ ———————————————————
Option Explicit

Private swApp As SldWorks.SldWorks
Private swModel As SldWorks.ModelDoc2

‘ 初期化時にSolidWorksインスタンスを注入(Dependency Injection)
Public Sub Initialize(ByVal app As SldWorks.SldWorks, ByVal model As SldWorks.ModelDoc2)
Set swApp = app
Set swModel = model
End Sub

‘ フィーチャ生成をカプセル化:エラーハンドリングと再利用性を確保
Public Function CreateExtrude(depth As Double, sketchName As String) As SldWorks.Feature
If swModel Is Nothing Then Err.Raise 91, , “Model is not initialized.”

‘ プロセスの実行と結果の返却
Set CreateExtrude = swModel.FeatureManager.FeatureExtrusion2(True, False, False, 0, 0, depth, 0, False, False, False, False, 0, 0, False, False, False, False, True, True, True, 0, 0, False)
End Function

‘ オブジェクトの明示的解放
Private Sub Class_Terminate()
Set swModel = Nothing
Set swApp = Nothing
End Sub

3. メモリ最適化とライフサイクルの管理

SolidWorksのAPIにおいて、`IDispatch`の解放漏れは致命的だ。特に、`SelectByRay`や`GetEntityName`などで取得した個別の`Feature`や`Face`オブジェクトは、プロシージャ終了時に明示的に`Set = Nothing`せねばならない。

これを怠ると、バックグラウンドのプロセスがゾンビ化し、大規模アセンブリの操作中に「メモリ不足」によるクラッシュを招く。「生成したものは必ずその場で殺す」。これが大規模自動化を支える鉄則である。

究極のクリーンアップ手法

Public Sub PerformComplexOperation()
Dim swFeat As SldWorks.Feature
‘ … 処理 …

‘ ループ内でのオブジェクト生成は必ずここで解放する
Set swFeat = Nothing
End Sub

4. レガシー環境を生き抜く「防御的プログラミング」

社内の古いPC環境では、API呼び出しのタイムラグが設計意図とズレを生むことがある。これを防ぐのがWindows APIによるプロセス監視だ。

`DoEvents`を連打するような原始的な手法は捨てろ。`Sleep`関数(Kernel32.dll)を用いて、SolidWorksの描画更新サイクルに合わせてウェイトを制御する。

If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If

‘ UIのフリーズを防ぎつつ、SolidWorksの計算を待つ
Public Sub PreciseWait(ms As Long)
Sleep ms
DoEvents
End Sub

5. 結論:真の自動化エンジニアへの道

保守性が低いのは、あなたのコードのせいではない。「設計」を怠ったシステムアーキテクチャのせいだ。

1. ロジックをクラスに閉じ込めよ(標準モジュールは「実行の入り口」のみにする)。
2. APIのラッパー層を作れ(直接`swModel.FeatureManager`を叩くコードを減らす)。
3. オブジェクトの寿命を厳格に管理せよ(メモリリークこそが最大の敵)。

このアプローチを徹底すれば、数年後にコードを見返したとき、「誰が書いたのか」と疑うほどクリーンで、かつ即座に拡張可能な資産が手に入るはずだ。自動化とは、単なる作業の代行ではなく、「設計という創造行為を加速させるための基盤構築」である。

次は、このクラス構造をベースに、JSONや外部DBからパラメータを読み込み、完全自動でパーツを構築する「ヘッドレス・オートメーション」について掘り下げていくとしよう。健闘を祈る。

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