SolidWorks VBAを掌握する:クラスモジュールによるフィーチャ生成の「極限」設計
SolidWorks APIを触り始めたエンジニアが必ず陥る罠がある。それは、`swApp`や`swModel`といったオブジェクトを標準モジュールに乱立させ、処理のたびに`SelectionManager`を呼び出す「スパゲッティコード」だ。
「動けばいい」という段階は卒業しよう。業務自動化ツールを資産に変えるためには、フィーチャ生成ロジックを「オブジェクト指向」でカプセル化する必要がある。
本記事では、堅牢で保守性が高く、バグを物理的に排除する設計の極意を伝授する。
—
1. なぜ「手続き型」の設計は破綻するのか
標準モジュールに書かれた長大な`Sub`は、以下の負債を生む。
- 状態管理の崩壊: どのモジュールがどの`ModelDoc2`を掴んでいるのか追跡不能になる。
- 再利用性の欠如: 特定のパーツ生成ロジックを別のツールで使いたい時、数千行のコードからコピペという「汚染」が始まる。
- エラーハンドリングの脆弱性: 予期せぬ選択解除やモデルのクローズに対して無防備すぎる。
プロフェッショナルは、「何を作るか(モデル)」と「どう作るか(操作)」を分離する。
—
2. 【設計指針】FeatureBuilderクラスの構築
フィーチャ生成の責務を負う`clsFeatureBuilder`を作成しよう。このクラスは「SolidWorksのモデルを操作するための専門インターフェース」として振る舞う。
クラスモジュール: `clsFeatureBuilder`
‘ @Description: パーツ操作の責務をカプセル化するクラス
Option Explicit
Private swApp As SldWorks.SldWorks
Private swModel As SldWorks.ModelDoc2
‘ 初期化時にモデルをバインドする
Public Sub Initialize(ByVal model As SldWorks.ModelDoc2, ByVal app As SldWorks.SldWorks)
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 1001, , “モデルが初期化されていません。”
‘ スケッチを選択(選択状態の管理をメソッド内部に隠蔽する)
If Not swModel.Extension.SelectByID2(sketchName, “SKETCH”, 0, 0, 0, False, 0, Nothing, 0) Then
Err.Raise 1002, , “対象スケッチが見つかりません: ” & sketchName
End If
‘ フィーチャ生成
Dim swFeat As SldWorks.Feature
Set swFeat = swModel.FeatureManager.FeatureExtrusion2(True, False, False, 0, 0, depth, depth, False, False, False, False, 0, 0, False, False, False, False, True, True, True, 0, 0, False)
Set CreateExtrude = swFeat
End Function
—
3. 実践:メインルーチンでの呼び出し
メインモジュール側は、驚くほどシンプルになる。ロジックの詳細を知る必要はない。
Sub Main()
Dim swApp As SldWorks.SldWorks: Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2: Set swModel = swApp.ActiveDoc
‘ 構築クラスをインスタンス化
Dim builder As New clsFeatureBuilder
builder.Initialize swModel, swApp
‘ 宣言的にフィーチャを生成
On Error GoTo ErrorHandler
builder.CreateExtrude 0.05, “Sketch1”
Exit Sub
ErrorHandler:
MsgBox “失敗しました: ” & Err.Description
End Sub
—
4. プロフェッショナルのための「3つの鉄則」
① 「選択」の隠蔽
SolidWorks VBAのバグの9割は「意図しない選択状態」に起因する。クラス内で`swModel.ClearSelection2 True`を徹底し、メソッドの最初と最後で選択状態をクリーンに保て。
② データベース連携と「ID管理」
CSVやSQLからパラメータを読み込む際、直接APIを叩くな。一旦`Parameter`クラス(データ構造体)を介し、検証済みデータをクラスに渡せ。型変換のミスが実行時に発生するリスクを排除できる。
③ ライフサイクル管理
`ModelDoc2`が閉じられた際、クラス内部の参照が残るとメモリリークやクラッシュを招く。`Terminate`イベントや明示的な`Cleanup`メソッドを用意し、確実に`Set swModel = Nothing`を行うこと。
—
最後に:なぜこの設計なのか
「コードが長くなるのではないか?」という懸念はもっともだ。だが、「変更に強いコード」とは、変更すべき箇所が1箇所に特定されているコードのことである。
将来、SolidWorksのバージョンアップでAPI仕様が変わっても、修正すべきは`clsFeatureBuilder`のメソッド内部だけだ。メインの業務ロジックを一行も変える必要はない。
これこそが、数年先を見据えた「伝説的エンジニア」の仕事の流儀だ。君の自動化ツールを、単なるスクリプトから、堅牢なエンジニアリング・アセットへと進化させたまえ。
