【テクニカル・上級編】【実務中級】アセンブリ図面一括出力への前段階:全コンポーネントのバウンディングボックス(外形寸法)をVBAで自動算出 – SolidWorks VBA解析バイブル

スポンサーリンク

アセンブリの全容を数値で支配せよ:バウンディングボックス自動抽出の極意

SolidWorks APIを使いこなすということは、単にメソッドを叩くことではない。メモリの呼吸を読み、エンジンの挙動を制御することだ。特にアセンブリレベルでの外形寸法取得は、一歩間違えればメモリリークの温床となり、数千パーツの解析でPCをフリーズさせる悪夢の引き金となる。

今回は、生産管理システムや梱包設計への橋渡しとなる「全コンポーネント・バウンディングボックス抽出」のアーキテクチャを解剖する。

1. なぜ「GetBox」だけでは足りないのか

多くの初心者は `IPartDoc::GetBox` を安易に呼び出すが、それは罠だ。
アセンブリ内のパーツは「親の座標系」ではなく「ローカル座標系」で保持されている。これにアセンブリ内の位置(Transform)を掛け合わせなければ、真の空間占有域は算出できない。

さらに、`Component2::GetBox` を使用する際、「コンポーネントがロードされていない(軽量構成)」という事態を考慮していないコードは、実務ではゴミ同然だ。

2. メモリ最適化とライフサイクルの管理

数千パーツをループ処理する場合、VBAのガベージコレクション(GC)を信用してはならない。`Set Nothing` を怠れば、SOLIDWORKSのプロセスは確実に膨張し、結果として動作が重くなる。

以下のコードは、効率と安定性を両立させた、我々が現場で用いる「堅牢なテンプレート」である。

3. 実装コード:Bounding Box 抽出エンジン

このコードは、Excel VBAからSOLIDWORKSを制御することを前提としている。

‘ 必要な参照設定: SolidWorks 20xx Type Library
Option Explicit

Sub ExportBoundingBoxesToExcel()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim vComps As Variant
Dim i As Long

‘ プロセスへの接続(Late Binding推奨のケースもあるが、開発効率重視でEarly Binding)
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel.GetType <> swDocASSEMBLY Then Exit Sub
Set swAssy = swModel

‘ コンポーネント配列の取得
vComps = swAssy.GetComponents(False)

‘ 処理開始:画面更新停止(パフォーマンス最適化の鉄則)
swApp.UserControl = False

For i = LBound(vComps) To UBound(vComps)
Set swComp = vComps(i)

‘ コンポーネントが抑制されていないか確認
If swComp.GetSuppression <> swComponentSuppressed Then
Call ExtractDimensions(swComp)
End If

‘ メモリの明示的解放:ループ内での破棄が安定動作の秘訣
Set swComp = Nothing
Next i

swApp.UserControl = True
MsgBox “全コンポーネントの解析が完了しました。”
End Sub

Private Sub ExtractDimensions(swComp As SldWorks.Component2)
Dim vBox As Variant
Dim dWidth As Double, dDepth As Double, dHeight As Double

‘ GetBoxは [MinX, MinY, MinZ, MaxX, MaxY, MaxZ] を返す
‘ 座標変換が必要な場合は、swComp.Transform2 を適用すること
vBox = swComp.GetBox

dWidth = vBox(3) – vBox(0)
dDepth = vBox(4) – vBox(1)
dHeight = vBox(5) – vBox(2)

‘ ここでExcelのセルへデータを書き込む処理を記述
Debug.Print swComp.Name2 & “: ” & dWidth & ” x ” & dDepth & ” x ” & dHeight
End Sub

4. シニアエンジニアが意識すべき「隠れた仕様」

コードを動かすだけなら上記で十分だ。しかし、真に「システム管理者」として信頼されるためには、以下の点に注意せよ。

  • 軽量構成(Lightweight)の罠: `swComp.GetBox` は、コンポーネントが軽量状態だと正確な値を返さないことがある。必要に応じて `swComp.SetSuppression2 swComponentFullyResolved` を挟む必要があるが、これを行うと処理速度が劇的に低下する。パフォーマンスと精度のトレードオフを計算せよ。
  • 非表示パーツの除外: `swComp.Visible` プロパティを確認し、非表示(隠し)パーツを計算対象から除外するフィルタリングロジックは必須だ。梱包対象外のボルトやナットまで算出しても、ゴミデータが増えるだけである。
  • 単位系の正規化: APIが返す値はデフォルトで「メートル(メートル法)」だ。現場の図面単位がミリメートルであっても、APIはメートルで計算する。この誤差で数千倍のミスを犯すエンジニアを何人も見てきた。必ず `1000` を乗算してミリメートルに換算せよ。

結論

アセンブリ解析の自動化は、単なるプログラミングではない。SOLIDWORKSという巨大なエンジンの内部構造を、APIというインターフェースを通じて「ハック」する行為だ。

このバウンディングボックスのデータを抽出できれば、次は自動見積もりシステムへの統合や、梱包箱の自動レイアウト最適化への道が開ける。技術を武器に、手作業という負債を一つずつ消し去っていこう。それが、我々エンジニアの責務だ。

タイトルとURLをコピーしました