SolidWorks APIの深淵:アセンブリ重量・材質解析の極致
「アセンブリを開いて、手動でひとつずつプロパティを確認し、Excelに転記する」。
もしあなたが今、そんな原始的な作業を繰り返しているのなら、今すぐその手を止めてください。設計エンジニアの時間は、データの転記作業のためにあるのではありません。
今日は、SolidWorks APIを使い倒し、アセンブリ内の全コンポーネントから「材質」と「質量」を瞬時に抽出し、Excelへレポート出力する堅牢かつ高速な自動化アーキテクチャを伝授します。
—
1. なぜ「素人コード」は破綻するのか?
多くのVBA初心者が陥る罠は、再帰処理の設計ミスとオブジェクトの解放漏れです。
アセンブリには「サブアセンブリ」が存在します。単純なループ処理では最下層の部品(Part)まで到達できず、計測漏れが発生します。また、API呼び出しごとにExcelセルへ直接書き込むようなコードは、実行速度を劇的に低下させます。
成功するための3つの鉄則
1. 再帰関数(Recursive Function)の活用: 階層構造を恐れず、ルートから末端までフラットに走査するアルゴリズムを組む。
2. メモリ管理: `swModel` や `swComponent` は、処理が終わるごとに適切に参照をクリアする(VBAでは自動解放を過信しない)。
3. データの一括出力: Excelへの書き込みは最小限に。配列にデータを溜め込み、最後に一括でセルへ流し込む(これがパフォーマンスの差を生む)。
—
2. プロダクションコード:アセンブリ解析エンジン
このコードは、メインのアセンブリを開いた状態で実行してください。参照設定で `SolidWorks 20xx Type Library` および `Microsoft Excel Object Library` を有効にすることを忘れずに。
Option Explicit
‘ 伝説のアーキテクトによる重量・材質集計ツール
Sub ExportAssemblyProperties()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim vComps As Variant
Dim results() As Variant
Dim count As Long
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
count = 0
‘ 結果格納用配列の初期化
ReDim results(1 To 3, 1 To 1000) ‘ 適宜サイズは調整してください
‘ 再帰処理でコンポーネントを走査
TraverseComponents swAssy.GetComponents(False), results, count
‘ Excelへの一括転記(高速化の肝)
OutputToExcel results, count
End Sub
‘ 再帰的にコンポーネントを巡回する関数
Private Sub TraverseComponents(vComps As Variant, results() As Variant, count As Long)
Dim i As Long
Dim swComp As SldWorks.Component2
Dim swChildModel As SldWorks.ModelDoc2
Dim swMass As SldWorks.MassProperty
If IsEmpty(vComps) Then Exit Sub
For i = LBound(vComps) To UBound(vComps)
Set swComp = vComps(i)
‘ サブアセンブリかどうかの判定
If swComp.GetChildrenCount > 0 Then
TraverseComponents swComp.GetChildren, results, count
Else
‘ 部品(Part)の場合のみ計測
Set swChildModel = swComp.GetModelDoc2
If Not swChildModel Is Nothing Then
count = count + 1
results(1, count) = swComp.Name2
results(2, count) = swChildModel.MaterialPropertyName ‘ 材質名
‘ 質量計算
Set swMass = swChildModel.Extension.CreateMassProperty
results(3, count) = swMass.Mass ‘ kg単位
End If
End If
Next i
End Sub
‘ Excelへの出力処理
Private Sub OutputToExcel(results() As Variant, count As Long)
Dim wb As Object
Dim ws As Object
Set wb = CreateObject(“Excel.Application”)
wb.Visible = True
Set ws = wb.Workbooks.Add.Sheets(1)
ws.Range(“A1:C1”).Value = Array(“部品名”, “材質”, “質量(kg)”)
ws.Range(“A2”).Resize(count, 3).Value = Application.Transpose(results)
End Sub
—
3. 実務運用における注意点(ここがプロの差)
このスクリプトを運用に乗せる際、以下の点に注意してください。
- コンフィギュレーションの罠: 上記コードは「現在表示されているコンフィギュレーション」の質量を拾います。アセンブリ内でコンフィギュレーションを切り替えて運用している場合は、`swComp.ReferencedConfiguration` を明示的に指定する必要があります。
- 非表示部品の扱い: `GetComponents(False)` を使用していますが、抑制状態(Suppressed)の部品を含める場合は引数を `True` に変更してください。ただし、抑制部品はロードされていないため、質量計算が正しく行えない場合があります。
- データベース連携: このデータをそのままCSV出力し、社内のPLMやERPと連携させることで、コスト試算の自動化までシームレスに繋がります。
終わりに
自動化とは、単にコードを書くことではありません。「設計者が本来行うべき思考の時間を、泥臭い作業から解放すること」です。
今回紹介した再帰処理の考え方は、BOMの展開から図面管理に至るまで、SolidWorks API自動化のあらゆる場面で通用する「最強の武器」になります。まずはこのコードをベースに、あなたの現場の仕様に合わせてカスタマイズしてみてください。
もし不明点があれば、またいつでも聞きに来なさい。エンジニアの成長を支援するのは、アーキテクトとしての悦びでもある。
