現場の「継ぎ接ぎマクロ」を葬れ:アセンブリ自動化を「資産」に変えるクラス設計の極意
SolidWorks APIを触り始めたエンジニアが必ず陥る罠がある。それは、「ひたすら`swApp.ActiveDoc`を呼び出し、手続き型で合致(Mate)を羅列する」という、保守性ゼロのスパゲッティコードだ。
「とりあえず動けばいい」で作られたそのマクロは、半年後の設計変更で再起不能になる。なぜなら、そこには「オブジェクトの整合性」という概念が欠落しているからだ。
今回は、数千パーツのアセンブリを自動構築する現場でも破綻しない、「拡張可能合致ビルダー(Extensible Mate Builder)」への昇華手法を伝授する。
—
1. なぜ「手続き型」のコードが死を招くのか
古いマクロの多くは、以下のような構造をしている。
- `SelectByID2`を何十行も連打し、選択状態に依存する。
- エラーハンドリングが散逸し、スタックトレースが追えない。
- 合致の設定値(距離や角度)がハードコードされている。
これは自動化ではない。「手動操作の記録を高速再生しているだけ」だ。
真の自動化とは、モデルの幾何学的関係を「データモデル」として定義し、APIへ命令を投げることにある。
—
2. 「MateBuilder」クラスによるカプセル化
まずは、SolidWorksのドキュメントを抽象化し、合致処理をクラスに閉じ込める。これにより、メインロジックは「何を合致させるか」というビジネスロジックに集中できる。
クラスモジュール: `CMateBuilder`
‘ @Description: 合致操作を抽象化した堅牢なビルダー
Option Explicit
Private swApp As SldWorks.SldWorks
Private swModel As SldWorks.ModelDoc2
Public Sub Initialize(ByRef app As SldWorks.SldWorks, ByRef model As SldWorks.ModelDoc2)
Set swApp = app
Set swModel = model
End Sub
‘ 汎用的な合致追加メソッド(バリデーション付き)
Public Function AddCoincidentMate(comp1 As String, ent1 As String, comp2 As String, ent2 As String) As Boolean
Dim swMateFeat As SldWorks.Feature
‘ 選択状態のクリア(重要:選択の重複はバグの温床)
swModel.ClearSelection2 True
‘ 選択処理
If Not SelectEntity(comp1, ent1) Then Exit Function
If Not SelectEntity(comp2, ent2) Then Exit Function
‘ 合致作成
Set swMateFeat = swModel.AddMate5(swMateCOINCIDENT, swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, False, 0, Nothing)
AddCoincidentMate = Not (swMateFeat Is Nothing)
End Function
Private Function SelectEntity(compName As String, entName As String) As Boolean
‘ コンポーネント内のエンティティを確実に捕捉するロジック
Dim path As String
path = compName & “@” & swModel.GetTitle & “/” & entName
SelectEntity = swModel.Extension.SelectByID2(path, “FACE”, 0, 0, 0, True, 0, Nothing, 0)
End Function
—
3. 実行エンジンの構築(メインロジック)
メインモジュールは、クラスを使って「宣言的に」記述する。これにより、コードの可読性は劇的に向上する。
Sub Main()
Dim swApp As SldWorks.SldWorks: Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2: Set swModel = swApp.ActiveDoc
Dim mateBuilder As New CMateBuilder
mateBuilder.Initialize swApp, swModel
‘ 構造化された合致定義
If mateBuilder.AddCoincidentMate(“BasePart-1”, “Face1”, “CoverPart-1”, “Face1”) Then
Debug.Print “合致成功”
Else
Err.Raise 999, “MateError”, “合致の構築に失敗しました”
End If
End Sub
—
4. 実務で「絶対に守るべき」設計の鉄則
現場レベルで安定稼働させるためには、以下の3点を意識せよ。
1. 選択の「完全クリア」を徹底する:
SolidWorksは選択状態を維持する。`ClearSelection2`を怠ると、予期せぬパーツが合致対象になり、モデルが爆発(アセンブリ破綻)する。
2. ファイル名・コンポーネント名の抽象化:
データベース(ExcelやCSV)からコンポーネント構成を読み込む際、直接パスを叩くのではなく、必ず「名称解決用メソッド」を通せ。ファイル名が変わった瞬間にツールが死ぬのを防ぐためだ。
3. アセンブリの再構築(Rebuild)タイミング:
`swModel.EditRebuild3`は強力だが、合致作成のたびに呼ぶと処理時間が指数関数的に増える。一連の合致が終わった後に一度だけ呼ぶのが、高パフォーマンスの要諦だ。
—
結び:エンジニアとしての矜持
VBAはレガシーな言語かもしれない。しかし、その内部で動くSolidWorksのAPIは、現代の設計現場においても唯一無二のパワーを持っている。
「動くゴミ」を量産するのではなく、「拡張に耐えうるクラス」を設計せよ。あなたが書くそのコードは、後任のエンジニアが数年後に触れるかもしれない「会社の資産」なのだから。
もし、さらに複雑な動的拘束や、PDM連携が必要な場合は、次はC#への移行を検討すべきだ。だが、今の設計思想を磨いておけば、その移行は驚くほどスムーズに進むはずだ。
さあ、エディタを開け。スパゲッティを解き放つ時間だ。
