【実務・中級編】【実務中級】Excelの座標テーブル(X, Y, Z, 軸周り回転)を読み込み、アセンブリ内の複数部品を3次元空間に一括マッピング配置 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの真髄:Excel座標データによる「一括コンポーネント配置」の極意

SolidWorksの自動化において、最もコストを払い、そして最も恩恵を受けるのが「アセンブリ内のコンポーネント配置」の自動化だ。手作業で100個の部品を合致させている時間は、エンジニアにとっての死である。

今回は、Excelの座標テーブルを読み込み、アセンブリ内の各部品を一瞬で空間マッピングする「プロダクション級」のVBA実装を伝授する。ただ動くコードではなく、「二度と修正しなくて済む堅牢な設計」を叩き込む。

—

1. なぜ「合致(Mate)」を使ってはいけないのか

多くの初心者が犯す最大の過ちは、API経由で「合致」を大量生成することだ。

  • パフォーマンスの破綻: 合致は計算コストが重い。100個の合致を追加すれば、SolidWorksの再構築は指数関数的に遅くなる。
  • 保守性の欠如: 部品構成が少し変わっただけで、参照エラー(Dangling)が多発する。

プロの解は「Transform(変換行列)」の直接制御にある。
コンポーネントをアセンブリ空間上の行列として直接定義してやれば、再構築の計算コストは最小限であり、かつ合致エラーに悩まされることもない。

—

2. 堅牢な設計のアーキテクチャ

Excelから座標を読み込み、配置を反映させる際の鉄則は以下の通りだ。

1. コンポーネントの特定: ファイル名やコンポーネント名をキーに`IComponent2`オブジェクトを確実に取得する。
2. マトリクスの構築: `IMathTransform`を利用し、位置(X, Y, Z)と回転(回転行列)を合成する。
3. フィックスの解除: コンポーネントが固定されているとTransformは適用されない。必ず解除する。

—

3. 実践:トランスフォーム一括適用コード

以下のコードは、ExcelのA列にコンポーネント名、B-G列に位置と回転(オイラー角)を持つ構成を想定している。

Option Explicit

‘ SolidWorks APIの参照設定が必要
‘ SldWorks, SwConst, MathUtil

Public Sub ApplyAssemblyTransform()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Dim swMath As SldWorks.MathUtility

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてください。”
Exit Sub
End If

Set swAssy = swModel
Set swMath = swApp.GetMathUtility

‘ Excelシートからデータを取得(※実装詳細は割愛)
Dim compName As String, x As Double, y As Double, z As Double
Dim rotX As Double, rotY As Double, rotZ As Double

‘ ここでループ処理を行い、各コンポーネントを配置する
‘ 例: SetComponentTransform swAssy, “Part1-1”, 0, 0, 0, 0, 0, 0
End Sub

Private Sub SetComponentTransform(swAssy As AssemblyDoc, compName As String, _
x As Double, y As Double, z As Double, _
rx As Double, ry As Double, rz As Double)
Dim swComp As SldWorks.Component2
Dim swModel As SldWorks.ModelDoc2
Dim swMath As SldWorks.MathUtility
Dim transform As SldWorks.MathTransform

Set swComp = swAssy.GetComponentByName(compName)
If swComp Is Nothing Then Exit Sub

‘ 1. 固定を解除(重要)
If swComp.IsFixed Then swComp.Select4 False, Nothing, False: swAssy.UnfixComponent

‘ 2. 数学行列の生成(回転行列をオイラー角から生成)
‘ ここでは簡略化のため、MathUtilityのTransformMatrixを使用
‘ 実務では swMath.CreateTransform を使用して行列を合成する

‘ 3. 反映
swComp.SetTransformAndSolve2 transform
End Sub

—

4. プロの現場での注意点:ここが「バグの温床」だ

① コンポーネントの「名前」は動的に変わる

`GetComponentByName`は、アセンブリ内のインスタンス名(例: `Part1-1`)に依存する。ファイル名ではないことに注意せよ。もし部品が削除・再挿入される可能性があるなら、`GetID`やカスタムプロパティをキーにして探索するルーチンを必ず実装すること。

② ファイルパスのバリデーション

Excelデータと実際のファイル構成が乖離している場合、コードは例外を吐く。ファイルが存在するか、アセンブリに含まれているかをチェックする`CheckIntegrity`関数を前段に置くのが、シニアエンジニアの流儀だ。

③ 単位系(Units)の罠

APIは内部的に「メートル(m)」と「ラジアン(rad)」で計算する。Excel側がmmや度(deg)で記述されている場合、必ず変換処理を挟め。ここを疎かにすると、配置した瞬間にコンポーネントが宇宙の彼方へ飛んでいくことになる。

—

最後に:自動化は「道具」ではなく「思想」だ

今回紹介したTransformによる制御は、SolidWorksの内部挙動を理解した者だけが使える強力な武器だ。合致で苦しむ時間を減らし、その分を「設計の品質向上」という、人間にしかできない高度な判断に割いてほしい。

コードをコピペして満足するな。このロジックを自社の環境に合わせて拡張し、誰が触っても壊れない「ライブラリ」へと昇華させること。それが、真の自動化エンジニアへの第一歩だ。

質問があればいつでも歓迎する。エンジニアの戦場は、コードの向こう側にある。

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