SolidWorks VBAで「姿勢制御」を掌握せよ:CSVから部品の回転を自動一括設定する極意
設計現場で「何百もの部品を、CSVの座標データ通りに回転させて配置せよ」なんて指示が飛んできたら、マウスでカチカチ作業しますか? それはエンジニアとして最も避けるべき「退屈な時間」です。
今日は、SolidWorks APIの核心である「数学的姿勢(回転マトリクス)」をVBAで操り、CSVから読み込んだ回転角を一括適用する技術を伝授します。マクロの記録を卒業し、プロの自動化領域へ足を踏み入れましょう。
—
1. なぜ「回転」は難しいのか?
SolidWorksで部品を回転させる際、`Component.Rotate`のような単純なメソッドを想像しがちですが、実務では「回転行列(Rotation Matrix)」を直接操作するのが正攻法です。
なぜなら、単純な回転命令は「現在の向きからの相対変化」を計算し続けるため、誤差が蓄積し、最終的に部品が意図しない方向へ吹っ飛ぶからです。「絶対座標系に対して、何度回転させるか」を定義する行列を書き込む。 これが、一括配置を破綻させないための黄金律です。
—
2. 実装のステップ:CSVから行列へ
今回の目標は、CSVの「X軸回転, Y軸回転, Z軸回転」を読み込み、部品の姿勢として書き込むことです。
必要な準備
1. 参照設定: `SolidWorks 20xx Type Library`
2. 数学的準備: 回転角(オイラー角)を、SolidWorksが受け入れる「3×3の回転行列」に変換する関数を用意する。
実装コード:回転適用ロジック
Option Explicit
‘ CSVから読み込んだ回転角を適用し、コンポーネントを回転させるメイン処理
Sub RotateComponentFromCSV()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swAssy = swModel
‘ ここで特定の部品を選択している前提
Set swComp = swAssy.GetSelectedObjectsComponent4(1, -1)
‘ 例:CSVから読み込んだ回転角(度)
Dim rotX As Double: rotX = 45 ‘ 実際はCSV読み込み処理をここに
Dim rotY As Double: rotY = 0
Dim rotZ As Double: rotZ = 0
‘ 変換用の行列(9要素)
Dim mat(8) As Double
Call GetRotationMatrix(rotX, rotY, rotZ, mat)
‘ コンポーネントに姿勢を適用(Transformの書き換え)
Dim swTransform As SldWorks.MathTransform
Dim swMathUtils As SldWorks.MathUtility
Set swMathUtils = swApp.GetMathUtility
‘ 行列からMathTransformを作成し、部品に適用
Set swTransform = swMathUtils.CreateTransform(mat)
swComp.Transform2 = swTransform
swModel.EditRebuild3
End Sub
‘ オイラー角を回転行列(9要素)に変換する関数
Sub GetRotationMatrix(rx As Double, ry As Double, rz As Double, mat() As Double)
‘ 角度をラジアンに変換して行列を計算する数学処理
‘ ※行列の並び順はSolidWorksのAPI仕様(MathTransform)に従う
‘ ここでは簡略化のため、行列計算のロジックは標準的な回転行列公式を使用
‘ mat(0)~mat(2): X軸方向, mat(3)~mat(5): Y軸方向, mat(6)~mat(8): Z軸方向
‘ …(ここに三角関数を用いた行列計算を記述)
End Sub
—
3. 陥りやすい「落とし穴」
初心者が必ずと言っていいほどハマるポイントが2つあります。
① 「コンポーネント」と「フィーチャー」の混同
`Component2`オブジェクトはあくまでアセンブリ上の「配置」を管理しています。部品の中身(フィーチャー)を回転させようとすると、アセンブリ全体が崩壊します。必ず「アセンブリ上の配置(Transform)」を操作対象にしてください。
② MathTransformの罠
`MathTransform`は、位置だけでなく「回転」も内包しています。行列を適用するときに、現在の「位置(XYZ座標)」を考慮せずに回転行列だけ書き換えると、部品が原点にワープしてしまいます。
改善策: 現在の`MathTransform`から位置データ(Translation)を抽出し、新しい回転行列と合成してからセットする。これができると、一気に中級者の壁を超えられます。
—
4. 先輩エンジニアからのアドバイス
「マクロの記録」で生成されるコードは、あくまでその場の操作のなぞり書きに過ぎません。しかし、今回のように`MathUtility`を用いた行列操作を習得すれば、あなたのコードは「設計エンジンの拡張機能」へと進化します。
最初は数学的な行列計算に戸惑うかもしれません。でも大丈夫。一度仕組みを理解してしまえば、どんなに複雑なレイアウト変更も、CSVを読み込む数秒の処理に変わります。
「自動化とは、手作業をコードに置き換えることではない。手作業そのものを不要にする設計思想そのものだ。」
このコードをベースに、まずは自分の手元の部品で試してみてください。エラーが出たら、それはSolidWorksがあなたに「もっと最適化できるよ」と教えてくれているサインです。応援しています!
