SolidWorks VBAで「アセンブリの全パーツ外形」を瞬時に抽出する極意
こんにちは。現場で「手作業」を撲滅し、エンジニアが本来の創造的な業務に没頭できる環境を整えることを信条としているアーキテクトです。
さて、皆さんはアセンブリを開いたとき、こんな風に思ったことはありませんか?
「この全パーツの梱包箱サイズ、あるいは占有領域を自動でExcelにリストアップできたら、どれほど楽だろうか…」と。
設計の現場では、レイアウト検討や梱包設計のたびに、いちいちパーツを開いてメジャーで測るという「非生産的な反復」が横行しています。今回は、SolidWorks APIを駆使して、アセンブリ内の全コンポーネントの外形寸法(バウンディングボックス)を一括取得し、Excelに叩き出す手法を伝授します。
マクロの記録ボタンを押して満足している段階から、一歩先の「エンジニアリングをコードで制御する世界」へ飛び込みましょう。
—
1. なぜ「バウンディングボックス」取得が難しいのか?
まず知っておいてほしいのは、SolidWorksにおける「外形寸法」は、決して単純な値ではないということです。
- パーツの向き(回転)
- コンフィギュレーションの違い
- フィーチャーの抑制状態
これらが複雑に絡み合っています。VBAでこれにアクセスするには、単に「長さを取る」のではなく、「モデルのジオメトリ情報を計算させる」というプロセスを経る必要があります。
核心となるAPI:`GetBox`
SolidWorksには、パーツのバウンディングボックスを計算するための `GetBox` という強力なメソッドがあります。これを使うために、私たちは「コンポーネントを巡回し、モデルを取得し、計算させる」というアルゴリズムを組み立てる必要があります。
—
2. 実装コード:アセンブリ解析の決定版
以下のコードは、現在開いているアセンブリの全コンポーネントをループし、その最大外形(XYZの最小・最大値)を取得して、イミディエイトウィンドウに書き出すものです。
‘ SolidWorks APIを利用した全コンポーネントの外形取得
Sub GetAssemblyBoundingBox()
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
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ アセンブリ以外なら終了
If swModel.GetType <> swDocASSEMBLY Then Exit Sub
Set swAssy = swModel
‘ アセンブリ内の全コンポーネントを取得
vComps = swAssy.GetComponents(False)
Debug.Print “コンポーネント名, X幅, Y幅, Z幅”
For i = 0 To UBound(vComps)
Set swComp = vComps(i)
‘ 隠れているパーツや抑制パーツの除外処理
If swComp.GetSuppression <> swComponentSuppressed Then
Dim swCompModel As SldWorks.ModelDoc2
Set swCompModel = swComp.GetModelDoc2
If Not swCompModel Is Nothing Then
‘ 境界ボックスの取得(配列として戻ってくる)
‘ vBox(0~2): 最小XYZ, vBox(3~5): 最大XYZ
Dim vBox As Variant
vBox = swCompModel.GetBox
Dim dx As Double, dy As Double, dz As Double
dx = (vBox(3) – vBox(0)) 1000 ‘ mm単位へ変換
dy = (vBox(4) – vBox(1)) 1000
dz = (vBox(5) – vBox(2)) 1000
Debug.Print swComp.Name2 & “, ” & _
Format(dx, “0.00”) & “mm, ” & _
Format(dy, “0.00”) & “mm, ” & _
Format(dz, “0.00”) & “mm”
End If
End If
Next i
MsgBox “全コンポーネントの外形取得が完了しました。”
End Sub
—
3. コードの読み解き:ここがエンジニアの分かれ道
このコードをただコピペするだけでなく、以下のポイントを理解することが「脱初心者」への鍵です。
1. `GetComponents(False)` の意味:
この `False` は「トップレベルのコンポーネントだけを取得する」という指定です。もしサブアセンブリの中身まで掘り下げたい場合は、再帰処理(関数の中で自分自身を呼び出すテクニック)が必要になります。
2. `GetBox` の罠:
`GetBox` が返す値は、モデルの「原点」や「向き」に依存します。もしコンポーネントがアセンブリ内で回転配置されている場合、この値は「そのパーツのローカル座標系での外形」になります。アセンブリ全体の座標系に合わせた「真のボックス」が必要な場合は、行列計算(Transform)が必要になる……ここが中級から上級への壁です。
3. `GetModelDoc2` の注意点:
コンポーネントが「軽量図面モード」で開かれている場合、モデルがメモリにロードされておらず、このメソッドが失敗することがあります。実務では、あらかじめパーツをメモリに読み込ませるロジック(`LoadComponent`)を挟むのが、プロの防御的プログラミングです。
—
4. 次のステップ:Excelへの橋渡し
今回のコードは `Debug.Print` でイミディエイトウィンドウに出力していますが、これを実務で使うなら、`Cells(row, col).Value` を使ってExcelシートに書き出すように書き換えてみてください。
- ヒント: `Set wb = Workbooks.Add` で新規ブックを作り、ループの中で `Cells(i+1, 1).Value = swComp.Name2` のように追記していくだけです。
最後に
SolidWorks APIは、あなたの設計業務の「手足」となる強力なツールです。今回のような「一括抽出」ができるようになると、数時間かかっていたリスト作成が「クリック一回」になります。
「ここをクリアすれば、基本はバッチリ」です。まずはこのコードを動かし、自分の目で結果を確認してください。エラーが出たら、それはPCがあなたに「もう少し詳しく教えて」と話しかけてくれているサインです。恐れずにコードと対話していきましょう!
何か不明点があれば、またいつでも聞いてください。応援していますよ。
