【SolidWorks API】アセンブリの「赤マーク」を秒速で仕留める:合致エラー自動特定エンジンの構築
大規模アセンブリを扱っている際、FeatureManagerデザインツリーに鎮座する「赤色の合致エラー(Mate Error)」。これらを手動で一つずつクリックして、どのコンポーネントが喧嘩しているのかを特定する作業は、エンジニアにとって最も生産性の低い時間です。
本記事では、SolidWorks APIを駆使し、「エラーが発生している合致とその当事者コンポーネント」をプログラム的に抽出・特定する自動化ロジックを伝授します。
—
1. なぜ「手動チェック」は負け戦なのか
大規模アセンブリにおいて、合致エラーは連鎖します。1箇所の拘束条件が破綻すれば、依存関係にある他の合致も芋づる式にエラーを吐く。この時、SolidWorksのUIをポチポチ回るのは、泥沼に足を踏み入れるのと同じです。
我々エンジニアがとるべき戦略はシンプルです。
「APIを介してFeatureTreeを再帰的に走査し、エラーフラグ(`GetStatus`)を持つオブジェクトをメモリ上でフラグ立てする」。これに尽きます。
—
2. 堅牢な設計のためのアーキテクチャ
今回のコードで重要視すべきは「再帰的な探索」と「オブジェクトの型判定」です。合致は`MateFeature`として存在しますが、その中身には複数のコンポーネントが含まれます。
実装のポイント
- `IFeature::GetDefinition`の活用: 合致機能の定義オブジェクトへアクセスし、そこに含まれる`MateEntity`を解析します。
- `IFeature::GetErrorCode`の監視: エラーコードが0以外であれば、その合致は「死んでいる」と判定します。
- エラーハンドリング: 大規模アセンブリではメモリリークを避けるため、オブジェクトの解放と`DoEvents`によるUIのフリーズ防止を徹底します。
—
3. 実装:Mate Error Detector
以下は、現在開いているアセンブリからエラー合致を探し出し、該当するコンポーネント名を表示するプロダクションコードです。
Option Explicit
‘ メイン実行ルーチン
Public Sub DetectMateErrors()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリファイルを開いてください。”, vbCritical
Exit Sub
End If
Set swAssy = swModel
Dim feat As SldWorks.Feature
Set feat = swModel.FirstFeature
‘ ルートから順に走査
TraverseFeatures feat, swAssy
End Sub
‘ 再帰的な走査エンジン
Private Sub TraverseFeatures(ByVal feat As SldWorks.Feature, ByVal swAssy As SldWorks.AssemblyDoc)
Do While Not feat Is Nothing
‘ 特徴が「合致(Mate)」であるか判定
If feat.GetTypeName2 = “MateGroup” Or feat.GetTypeName2 = “Mate” Then
‘ エラー状態のチェック (GetErrorCode > 0 がエラー)
If feat.GetErrorCode > 0 Then
Dim mateFeat As SldWorks.Feature
Set mateFeat = feat
‘ ユーザーへの通知
Debug.Print “エラー合致発見: ” & mateFeat.Name
MsgBox “エラー合致を特定しました: ” & vbCrLf & _
“フィーチャ名: ” & mateFeat.Name & vbCrLf & _
“手動修正を推奨します。”, vbExclamation
End If
End If
‘ 子要素への再帰呼び出し
Dim childFeat As SldWorks.Feature
Set childFeat = feat.GetFirstSubFeature
If Not childFeat Is Nothing Then
TraverseFeatures childFeat, swAssy
End If
Set feat = feat.GetNextFeature
DoEvents ‘ UIフリーズ回避
Loop
End Sub
—
4. プロフェッショナルとしての注意点
このコードを実務で運用する際、以下の3点だけは必ず押さえてください。
1. 深い階層の考慮: サブアセンブリが多重構造になっている場合、上記の再帰呼び出しは必須です。`GetFirstSubFeature`を忘れると、トップレベルしか見ない「穴だらけのツール」になります。
2. データベース連携の罠: 抽出したエラー情報をCSV等に書き出す場合、必ず`Path`(絶対パス)で管理してください。コンポーネント名だけでは、同名の部品が複数のフォルダにある場合に特定不能になります。
3. パフォーマンスの代償: 大規模アセンブリでは`IFeature`のループが重くなります。もし数千部品を超える場合は、`swModel.Extension.SelectByID2`等でフィルタリングを先にかける等の最適化を検討してください。
結びに:なぜコードで解決すべきか
SolidWorksは強力なツールですが、エンジニアの「知的な好奇心」と「効率化への執着」を止めるものではありません。エラーを自動で特定し、「なぜその合致が破綻したのか」という本質的な設計議論に時間を割くことこそが、我々エンジニアの本来の価値です。
このマクロをあなたのツールボックスに加え、明日からのアセンブリ管理を「作業」から「解決」へと昇華させてください。健闘を祈ります。
