SolidWorks APIの深淵:アセンブリ構成の一括抽出を「プロの作法」で実装する
現場のエンジニアからよく聞く嘆きがある。「アセンブリの構成(コンフィギュレーション)がどれになっているかを確認するだけで日が暮れる」と。
数千パーツを超えるアセンブリにおいて、各コンポーネントが意図したコンフィギュレーションで呼び出されているかを目視でチェックするなど、ナンセンスの極みだ。今回は、SolidWorks APIを使い、アセンブリ内の全構成情報をExcelへ瞬時に掃き出す「堅牢なツール」の設計術を伝授する。
単にコードをコピペさせる気はない。「なぜ、このAPIを呼ぶのか」「なぜ、再帰処理が必要なのか」。この本質を理解しなければ、大規模アセンブリを扱った瞬間にコードはメモリリークで沈む。
—
1. なぜ「再帰処理」が不可欠なのか
アセンブリには「サブアセンブリ」が存在する。これを理解せず、トップレベルの構成のみをリストアップして満足しているなら、それはツールとは呼べない。
SolidWorksのモデルツリー構造は「木構造(Tree Structure)」だ。したがって、処理ロジックも再帰呼び出し(Recursive Call)を用いて、末端の部品まで潜り込む必要がある。
設計の鉄則:
1. オブジェクトの解放を怠るな: `swComp`(コンポーネント)オブジェクトをループ内で生成し続けると、SolidWorksのメモリを圧迫する。使用後は明示的に `Nothing` を代入する習慣を。
2. エラーハンドリング: パスが通っていないファイルや、サプレッション(抑制)状態のコンポーネントをどう扱うか。ここが「動くコード」と「業務に耐えるコード」の分かれ道だ。
—
2. 実装コード:構成情報エクスポート・エンジン
このコードは、現在アクティブなアセンブリを読み込み、コンポーネント名と使用中のコンフィギュレーション名を取得してExcelへ書き出す。
Option Explicit
‘ メイン処理:アセンブリ走査を開始する
Public Sub ExportAssemblyConfigurations()
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
‘ Excelシートの準備
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1)
ws.Cells.Clear
ws.Range(“A1:C1”).Value = Array(“階層”, “コンポーネント名”, “使用コンフィギュレーション”)
‘ 再帰処理の開始
TraverseAssembly swAssy.GetComponentByName(swModel.GetTitle), 0, ws, 2
MsgBox “エクスポート完了”, vbInformation
End Sub
‘ 再帰的な走査処理
Private Sub TraverseAssembly(swComp As SldWorks.Component2, level As Integer, ws As Worksheet, ByRef row As Long)
If swComp Is Nothing Then Exit Sub
‘ コンポーネント情報の取得
Dim compName As String
Dim configName As String
compName = swComp.Name2
configName = swComp.ReferencedConfiguration
‘ Excelへの書き込み
ws.Cells(row, 1).Value = level
ws.Cells(row, 2).Value = compName
ws.Cells(row, 3).Value = configName
row = row + 1
‘ 子コンポーネントの取得
Dim vChildren As Variant
vChildren = swComp.GetChildren
If Not IsEmpty(vChildren) Then
Dim i As Integer
Dim swChild As SldWorks.Component2
For i = 0 To UBound(vChildren)
Set swChild = vChildren(i)
‘ 再帰的に子を走査
TraverseAssembly swChild, level + 1, ws, row
Next i
End If
‘ メモリ最適化
Set swComp = Nothing
End Sub
—
3. プロの視点:このコードをさらに進化させるために
上記のコードはベースとして完璧だが、実際のプロジェクトで運用する際には以下の視点を取り入れてほしい。
① パフォーマンスチューニング
大規模アセンブリでは、`GetChildren` を呼び出すたびにSolidWorksの内部キャッシュにアクセスが発生する。処理が遅いと感じたら、`swModel.ModelViewZoomtofit2` などの画面更新を伴うコードを排除し、バックグラウンドでの走査に徹すること。
② データベース連携の注意点
もしこの情報をAccessやSQL Serverに格納したい場合、「絶対パス(Full Path)」を必ず一緒に抽出するように設計すること。名前だけでは、同名の部品が複数のフォルダに存在する場合に衝突する。`swComp.GetModelDoc2.GetPathName` を活用せよ。
③ 保守性:ハードコーディングを避ける
出力先のシート名やセル位置は、必ず設定ファイルや定数として切り出しておくこと。設計者が変われば、求める出力フォーマットも変わる。コードをいじらずに設定値だけを変更できる設計こそ、エンジニアの「良心」だ。
—
最後に:ツールは作って終わりではない
このツールを導入することで、あなたは「アセンブリの構成ミス」という不毛なデバッグ作業から解放される。しかし、最も重要なのは「自動化によって生まれた時間を、設計の品質向上というクリエイティブな作業にどう充てるか」だ。
自動化は目的ではない。それは、さらなる高みへ到達するための「足場」に過ぎない。
もしコードの挙動に疑問があれば、SolidWorksの `Component2` オブジェクトのメンバをAPIヘルプで再確認し、自身のプロジェクトに最適化してほしい。あなたの挑戦を待っている。
