SolidWorks VBAの極意:Excelでアセンブリを操る「行列変換」の自動化術
こんにちは。現場で「なぜ手作業で動かしているの?」と自問自答し続けてきた皆さんへ。
SolidWorksのアセンブリレイアウト、マウスでドラッグ&ドロップして「合致(Mate)」を追加していませんか? それ、実は数千パーツある大規模アセンブリでは、PCのメモリを無駄に食いつぶす「重い」操作なんです。
今回は、マクロの記録が吐き出す「おまじない」から脱却し、Excel上の座標リストからアセンブリ内のパーツを直接再配置する「Transform(変換行列)」の制御手法を伝授します。これを使えば、一瞬でレイアウトを更新できる「設計の自動化」が実現します。
—
なぜ「合致」を使わずに「Transform」を操作するのか?
初心者はすぐに「Mate(合致)」を追加しようとしますが、実は大規模アセンブリでこれをやりすぎると、再計算(Rebuild)のたびにSolidWorksが計算負荷でフリーズします。
「Transform(行列)」を操作するとは、パーツの「絶対座標」を数学的に直接書き換えること。合致という拘束条件を介さず、パーツを空中浮遊させてパズルのように配置する。この手法こそが、自動化エンジニアが到達する「高速化」の秘訣です。
—
準備するもの
1. Excelリスト: A列(パーツ名), B列(X), C列(Y), D列(Z)
2. SolidWorks: 対象のアセンブリが開かれていること
—
現場で使える実践コード
このコードは、アクティブなアセンブリ内のコンポーネントを検索し、Excelのリストに従って位置を書き換えるものです。
‘ SolidWorks API を活用したコンポーネントの高速再配置
Sub UpdateComponentPositions()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim swMathUtil As SldWorks.MathUtility
Dim vTransform As Variant
Dim swTransform As SldWorks.MathTransform
‘ Excel側の設定(例:シート1の2行目から読み込み)
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1)
Dim i As Integer
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swAssy = swModel
Set swMathUtil = swApp.GetMathUtility
‘ 各行をループ
For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Dim compName As String: compName = ws.Cells(i, 1).Value
Dim x As Double: x = ws.Cells(i, 2).Value / 1000 ‘ mmからmへの変換が必須!
Dim y As Double: y = ws.Cells(i, 3).Value / 1000
Dim z As Double: z = ws.Cells(i, 4).Value / 1000
‘ コンポーネントの取得
Set swComp = swAssy.GetComponentByName(compName)
If Not swComp Is Nothing Then
‘ MathUtilityを使って位置ベクトルを作成
Dim vPos As Variant: vPos = Array(x, y, z)
Dim swPoint As SldWorks.MathPoint
Set swPoint = swMathUtil.CreatePoint(vPos)
‘ 現在の行列を取得して位置だけ更新
Set swTransform = swComp.Transform2
Set swTransform = swTransform.Multiply(swMathUtil.CreateTransform(Array(1, 0, 0, 0, 1, 0, 0, 0, 1, x, y, z)))
‘ パーツに適用
swComp.Select4 False, Nothing, False
swAssy.CompConfigProperties3 0, 0, True, False, “”, True
swComp.Transform2 = swTransform
End If
Next i
swModel.ForceRebuild3 False
MsgBox “全パーツの再配置が完了しました。”
End Sub
—
ここがハマりポイント!「エンジニアの視点」
1. 単位系は「メートル(m)」が鉄則
SolidWorksのAPIは、ドキュメントの単位系(mm)に関わらず、内部的にはすべて「メートル(m)」で計算されます。Excelで「100mm」と入力しても、コード内で `/ 1000` を忘れると、パーツは遥か彼方の宇宙空間へ飛んでいきます。初心者が一番最初に泣く場所です。
2. `GetComponentByName` の罠
コンポーネント名は「パーツ名-1」といった形式で管理されています。もしアセンブリ内のパーツ名が重複していると、このメソッドは最初に見つけたものしか操作しません。厳密に制御したい場合は `GetRootComponent` から再帰的に検索するアルゴリズムを組むのがプロの仕事です。
3. `ForceRebuild3` の重み
最後に呼んでいる `ForceRebuild3` は強力ですが、毎回実行すると処理が遅くなります。ループの中では絶対に使わず、すべての処理が終わった後に一度だけ実行するようにしてください。
—
まとめ:マクロは「作業」を「設計」に変える武器
今回紹介した「行列による操作」を理解すると、単なる配置だけでなく、「CSVから自動でラインレイアウトを構築する」「最適化アルゴリズムで導き出した最適配置を自動適用する」といった高度な設計支援ツールを作れるようになります。
まずはこのコードをコピーして、簡単なアセンブリで試してみてください。動いた瞬間に、皆さんの設計業務は「作業」から「自動生成」へと進化します。
もしエラーが出ても怖がらないでください。それは、SolidWorksが「もっと正しい手順で教えてくれ」と対話しようとしている証拠です。次は、このパーツの回転角度を制御する「回転行列」の世界へご案内します。
さあ、自動化の先にある、新しいエンジニアリングの世界へ!
