SolidWorksアセンブリの「赤マーク」を狩る:APIで実現する合致エラーの自動特定と解析の極意
大規模アセンブリにおいて、ツリーに並ぶ無数の「赤マーク」。設計変更のたびに現れるこの悪魔を、手動で追いかけているようでは、プロのエンジニアとは呼べない。
SolidWorks APIを使い倒し、その構造を熟知している者であれば、合致エラーは「解析すべきデータ」に過ぎない。今回は、合致エラーを引き起こしているコンポーネントのペアをVBAで一瞬にして特定し、解析コストをゼロにするための実装手法を伝授する。
—
1. なぜ「手動」ではいけないのか:オブジェクトのライフサイクルとメモリの観点から
大規模アセンブリにおいて、`FeatureManager`をUI経由で操作するのは極めて非効率だ。APIを用いる場合、最も重要なのは「どのオブジェクトがどの階層に属しているか」というメモリ上の参照関係を意識することである。
不適切な参照の連鎖(循環参照や、メモリリークを誘発するグローバル変数でのオブジェクト保持)は、SolidWorksのプロセスを徐々に蝕み、最終的には「Access Violation」でシステムをクラッシュさせる。今回提示するコードでは、明示的な解放と、軽量な再帰処理によって、メモリ負荷を最小限に抑える設計を採用する。
—
2. 合致エラー特定の実装戦略
合致エラーの特定には、`IMateFeature`インターフェースの`GetMateError`メソッドを活用する。しかし、単にエラーを拾うだけでは不十分だ。エラーが発生している「合致」を取得し、その合致が参照している`MateEntity`を辿ることで、対になるコンポーネントを特定する。
実装コード:Mate Error Detector
Option Explicit
‘ メインプロシージャ:エラーが発生している合致とその相手を特定する
Public Sub DetectAssemblyMateErrors()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim vMates As Variant
Dim i As Long
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてください。”
Exit Sub
End If
Set swAssy = swModel
vMates = swAssy.GetComponents(False) ‘ コンポーネント取得
‘ 合致フィーチャーの走査
Dim swFeat As SldWorks.Feature
Set swFeat = swModel.FirstFeature
Do While Not swFeat Is Nothing
If swFeat.GetTypeName2 = “MateGroup” Then
Call ProcessMateGroup(swFeat)
End If
Set swFeat = swFeat.GetNextFeature
Loop
‘ 明示的解放
Set swAssy = Nothing
Set swModel = Nothing
End Sub
Private Sub ProcessMateGroup(ByVal swMateGroup As SldWorks.Feature)
Dim swSubFeat As SldWorks.Feature
Dim swMate As SldWorks.Mate2
Dim errorStatus As Long
Set swSubFeat = swMateGroup.GetFirstSubFeature
Do While Not swSubFeat Is Nothing
If swSubFeat.GetTypeName2 = “Mate” Then
Set swMate = swSubFeat.GetSpecificFeature2
‘ 合致エラーのチェック (swMateError_NoError以外ならエラー)
errorStatus = swMate.GetMateError
If errorStatus <> 0 Then
Debug.Print “エラー検出: ” & swSubFeat.Name & ” (Code: ” & errorStatus & “)”
‘ ここで各MateEntityを解析し、コンポーネントを特定
Call ExtractMateComponents(swMate)
End If
End If
Set swSubFeat = swSubFeat.GetNextSubFeature
Loop
End Sub
—
3. シニアエンジニアが意識すべき「APIの深淵」
1. `GetMateEntity` の扱い
合致は、単なる2つのコンポーネントの組み合わせではない。`MateEntity`は「面」「エッジ」「頂点」を指す。ここから`GetOwner`を呼び出すことで、親コンポーネント(`Component2`オブジェクト)を逆引きできる。この一連のプロセスは、SolidWorksのドキュメント構造を理解していないと迷子になるポイントだ。
2. Windows APIとの連携(Windows 10/11環境)
大規模なリストを表示する場合、VBA標準の`MsgBox`は使い物にならない。必要に応じて、Windows APIの`MessageBoxIndirect`を呼び出すか、あるいは非同期にログファイルへ吐き出し、外部システムと連携させるアーキテクチャを推奨する。
3. パフォーマンスの真実
`DoEvents`をループ内にむやみに挿入するのは避けること。これは処理速度を劇的に低下させるだけでなく、スタックオーバーフローのリスクを高める。プロフェッショナルは、計算回数を最小化し、メモリの確保・解放のタイミングを設計段階で決める。
—
結びに:自動化は手段であり、目的ではない
このコードは、エラーを「見つける」ための武器に過ぎない。しかし、この武器が手元にあるだけで、設計者は「何が原因か」という本質的な問いに時間を割くことができるようになる。
SolidWorks VBAはレガシーと言われることもあるが、APIの深層を理解すれば、これほど強力なオートメーションツールは他にない。「ツールに使われるな、ツールを支配しろ」。この言葉を胸に、貴殿の現場をより強固なものにアップデートしてほしい。
さらなる深淵(例えば、エラーの内容に基づいた自動修復や、コンポーネントの置換まで)に触れたい場合は、また次の機会に語ることにしよう。
