【実務・中級編】【実務中級】CSVファイルから読み込んだX軸・Y軸・Z軸の回転角パラメータを適用し、アセンブリ内部品の姿勢を一括変更 – SolidWorks VBA解析バイブル

スポンサーリンク

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` のドキュメントをもう一度熟読しろ。答えは常にそこにある。

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