こんにちは。SolidWorks APIの深淵へようこそ。
「マクロの記録」ボタンを押して生成される、あの冗長で遅いコードに別れを告げる時が来ましたね。今日は、SolidWorksを単なる3D CADとしてではなく、「数学的な演算エンジン」として使い倒すための極意をお伝えします。
通常、アセンブリで部品を動かすには「合致(Mate)」を使います。しかし、複雑なリンク機構や数千パーツの同時制御において、Mateは「重すぎる足かせ」です。計算のたびにSolidWorksのソルバーが拘束条件を解き直すからです。
今日学ぶのは、そのソルバーを無視し、4×4の変換行列(Transform)を直接メモリ上で書き換えて、CADの描画を支配する「力技」です。
—
1. なぜ「合致」を使わずに「行列」を操作するのか?
SolidWorksのMateは、物理的な拘束を管理するための高度なAIです。しかし、外部の数式モデル(PythonやExcelで計算したキネマティクスなど)が既に答えを持っている場合、CAD側に再計算させる必要はありません。
Transform(変換行列)を直接操作するメリットは圧倒的です。
- 高速性: ソルバーによる衝突判定や拘束計算をバイパスするため、リアルタイムに部品が追従します。
- 安定性: 複雑な機構で起こりがちな「合致の不具合(エラー)」とは無縁です。
- 精度: 数学的に正しい座標をミリ単位以下で強制的に反映できます。
—
2. 座標変換の概念:4×4行列の正体
SolidWorksの世界では、各パーツの位置と姿勢は、親アセンブリを基準とした「4×4の行列」で管理されています。
- 左上3×3: 回転成分(向き)
- 右列上3つ: 平行移動成分(座標)
- 最下行: 0, 0, 0, 1(固定)
この行列を直接 `MathTransform` オブジェクトを通じて書き換えるのが、今回のゴールです。
—
3. 実践:VBAによる高速キネマティクス制御
まずは、最も基本的な「部品を座標指定で動かす」コードを見てみましょう。
‘ SolidWorks APIによるTransform直接操作のテンプレート
Sub MoveComponentDirectly()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim swMathUtils As SldWorks.MathUtility
Dim swTransform As SldWorks.MathTransform
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swAssy = swModel
Set swMathUtils = swApp.GetMathUtility
‘ 1. 対象のコンポーネントを取得
‘ ※名前は実際のファイル名に合わせてください
Set swComp = swAssy.GetComponentByName(“Part1-1”)
‘ 2. 座標変換行列を作成 (例: X方向に100mm移動)
Dim vData(0 To 15) As Double
‘ 単位行列の初期化(対角成分を1にする)
vData(0) = 1: vData(5) = 1: vData(10) = 1: vData(15) = 1
‘ 移動成分を設定 (X:100, Y:0, Z:0)
vData(3) = 0.1 ‘ SolidWorksの内部単位はメートルです!要注意
Set swTransform = swMathUtils.CreateTransform(vData)
‘ 3. 行列をコンポーネントに直接適用
‘ これにより、合致を無視して強制的に位置が変わります
swComp.Transform2 = swTransform
‘ 4. 画面更新
swModel.GraphicsRedraw2
End Sub
【超重要】ここを間違えると動かない
- 単位系: SolidWorks APIの内部演算は常に「メートル(m)」です。100mm動かしたいなら `0.1` と指定しなければなりません。ここで多くの初心者が「なぜか動かない!」と頭を抱えます。
- 再描画: `GraphicsRedraw2` を忘れると、メモリ上の位置は変わっても画面が更新されず、ストレスが溜まります。
—
4. 陥りやすい罠と解決策
罠1:コンポーネントが固定(Fix)されている
コンポーネントが「固定」されていると、API経由でもTransformを変更できません。コード内で `swComp.Select` してから `swModel.EditSuppress` 等で固定を解除する処理を挟むか、手動で「フロート」状態にしておく必要があります。
罠2:親子関係の連鎖
サブアセンブリ内のパーツを操作する場合、親のTransformが適用された後の「ローカル座標」として扱われることに注意してください。複雑な場合は、`GetTotalTransform` を使って、ワールド座標系での位置を計算してから逆算するのがプロの作法です。
—
最後に:エンジニアとしての一歩先へ
「合致」を使わずに部品を動かすという発想は、SolidWorksを単なる設計ツールから「解析・可視化エンジン」へと昇華させる第一歩です。
今回紹介したTransform操作をマスターすれば、Excelで計算したロボットの軌跡をSolidWorks上で寸分の狂いなく再現したり、膨大な数の部品を数式で一斉に制御したりすることが可能になります。
まずは、小さな立方体をコードで動かすところから始めてみてください。プログラムが物理法則を支配する感覚は、何物にも代えがたい快感ですよ。
不明点があれば、いつでも聞いてくださいね。あなたの自動化ライフを全力で応援しています!
