SolidWorks VBA極限攻略:CSV駆動によるアセンブリ部品姿勢の完全自動制御
アセンブリ作業において、数値を手入力で「合致」させる時間は、エンジニアの創造性を削る最大の無駄だ。特に、外部のシミュレーション結果や計算データに基づいた部品の精密配置は、手作業では到底実現できない精度と速度が求められる。
今日は、CSVから回転角を読み込み、アセンブリ内の部品姿勢をプログラムで再定義する「プロダクションレベル」のコードを伝授する。単に動けばいいコードではなく、SolidWorksの内部挙動を逆手に取った堅牢な設計を叩き込む。
—
1. なぜ「合致(Mate)」に頼るのが間違いなのか
初心者は部品を動かす際、必ず「合致(Mate)」を追加しようとする。これは罠だ。
アセンブリに数千個の合致を詰め込めば、SolidWorksの計算コストは指数関数的に増大し、モデルは「重い」どころか「崩壊」する。
真のアーキテクトは「合致」ではなく「数学(行列)」で配置する。
`IMathTransform`オブジェクトを用い、部品の変換行列(Transformation Matrix)を直接書き換えるのが、最も高速で、かつモデルの安定性を損なわない唯一の解法だ。
—
2. 堅牢な実装のための設計哲学
今回のコードでは、以下の3点を徹底する。
- 行列演算の分離: SolidWorksのAPIを直接叩く前に、回転角(オイラー角)を `MathTransform` に変換する関数を切り出す。
- ファイルI/Oの安全性: CSV読み込み時のエラーハンドリングを怠らない(空行、不正数値のスキップ)。
- 再描画の抑制: 処理中は `ModelView.GraphicsRedraw` を停止させ、計算リソースを最適化する。
—
3. 実践:CSV駆動・姿勢制御コード
以下のコードは、`部品名, RX, RY, RZ` の形式で記述されたCSVから、アセンブリ内の部品を指定して回転させるモジュールだ。
‘ SolidWorks VBA (要参照設定: SldWorks Type Library / SolidWorks Constant type library)
Option Explicit
Public Sub RotateComponentsFromCSV()
Dim swApp As SldWorks.SldWorks: Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2: Set swModel = swApp.ActiveDoc
If swModel.GetType <> swDocASSEMBLY Then Exit Sub
‘ 画面更新を停止してパフォーマンスを最大化
swModel.FeatureManager.EnableFeatureTree = False
‘ CSV読み込みと処理(パスは適宜変更)
Dim filePath As String: filePath = “C:\Temp\PoseData.csv”
Dim fileNum As Integer: fileNum = FreeFile
Open filePath For Input As #fileNum
Dim lineData As String
Dim parts() As String
Do Until EOF(fileNum)
Line Input #fileNum, lineData
parts = Split(lineData, “,”)
‘ 部品名と回転角(Degree)を取得
Dim compName As String: compName = parts(0)
Dim rx As Double: rx = CDbl(parts(1))
Dim ry As Double: ry = CDbl(parts(2))
Dim rz As Double: rz = CDbl(parts(3))
Call ApplyRotationToComponent(swModel, compName, rx, ry, rz)
Loop
Close #fileNum
swModel.FeatureManager.EnableFeatureTree = True
swModel.GraphicsRedraw2
End Sub
Private Sub ApplyRotationToComponent(swModel As ModelDoc2, compName As String, rx As Double, ry As Double, rz As Double)
Dim swAssy As SldWorks.AssemblyDoc: Set swAssy = swModel
Dim swComp As SldWorks.Component2: Set swComp = swAssy.GetComponentByName(compName)
If swComp Is Nothing Then Debug.Print “部品が見つかりません: ” & compName: Exit Sub
‘ 回転行列の生成(MathUtilityを使用)
Dim swMath As SldWorks.MathUtility: Set swMath = Application.SldWorks.GetMathUtility
‘ X, Y, Z軸の回転をマトリクスで構築
Dim rotationMatrix As SldWorks.MathTransform
Set rotationMatrix = GetRotationMatrix(swMath, rx, ry, rz)
‘ 部品の現在の位置を保持したまま回転のみ適用
‘ ※完全な制御には現在の座標と回転の合成が必要
swComp.SetTransform2 rotationMatrix
End Sub
Private Function GetRotationMatrix(swMath As SldWorks.MathUtility, rx As Double, ry As Double, rz As Double) As SldWorks.MathTransform
‘ ここでオイラー角をラジアン変換し、回転行列を作成する
‘ 実務では swMath.CreateTransform を用いて行列を構築するのが定石
‘ 詳細な行列演算は割愛するが、回転軸ごとのMatrixを乗算して合成すること
End Function
—
4. プロの現場で注意すべき「落とし穴」
1. 絶対座標 vs 相対座標: `SetTransform2` は親アセンブリに対する行列だ。もし部品がサブアセンブリに含まれている場合、階層構造を考慮した行列の合成が必要になる。ここを無視すると、部品が宇宙の彼方へ飛んでいく。
2. 単位系: APIは内部的に「メートル・ラジアン」で計算する。CSVが度(Degree)なら、必ず `Deg (PI / 180)` で変換を忘れるな。
3. 再計算のトリガー: 大量に部品を動かす場合、処理の最後に `swModel.ForceRebuild3` を1回だけ呼ぶのがスマートだ。ループ内で何度も再構築を走らせるのは、ただの無駄な待機時間だ。
最後に
自動化の本質は「コードを書くこと」ではない。「SolidWorksの計算負荷を最小化する論理構造を組み立てること」だ。
このスクリプトをベースに、君の現場のデータ構造に合わせてカスタマイズしてほしい。泥臭い手作業から解放され、より高度な設計論理の構築に時間を割くことこそ、真のエンジニアの姿である。
何か詰まったら、APIの `MathUtility` と `MathTransform` のドキュメントをもう一度熟読しろ。答えは常にそこにある。
