【入門編】【実務中級】アセンブリ座標系を基準にした相対座標計算と、オフセット付き距離合致の動的プログラミング – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks VBAの世界へようこそ。
マクロの記録ボタンを押して、生成された呪文のようなコードを眺めて「ううむ……」と頭を抱えた経験はありませんか?

「画面上のクリック位置に依存せず、アセンブリの原点(Origin)からの相対的な座標を計算して、部品を狙いすました位置に配置したい」
「距離合致のオフセット値を、条件に応じて動的に変えたい」

実務の現場で自動化を進めると、必ずこの壁にぶつかります。ここをクリアすれば、あなたはもう「マクロの記録タイピスト」ではありません。真のSolidWorks自動化エンジニアの仲間入りです。

今日は、アセンブリ座標系を基準にした相対座標計算と、オフセット付き距離合致の動的プログラミングについて、私が現場で培った極限の知見を優しく、かつ深く伝授しましょう。ここをクリアすれば、アセンブリ構築の自動化は怖くありませんよ!

—

1. なぜ「マクロの記録」だけでは実務の自動化ができないのか?

まず、敵を知ることから始めましょう。
SolidWorksで部品を配置して合致をつけるとき、マクロの記録を使うと以下のようなコードが出力されます。

‘ マクロ記録の成れの果て(実務では使い物になりません)
boolstatus = swModel.Extension.SelectByID2(“Part1-1@Assembly”, “COMPONENT”, 0, 0, 0, False, 0, Nothing, 0)
boolstatus = swModel.Extension.SelectByID2(“Plane1@Assembly”, “PLANE”, 0, 0, 0, True, 0, Nothing, 0)
swModel.AddMate3 0, 2, False, 0.05, 0.05 …

このコードの何が問題か分かりますか?

  • 画面上の選択に依存している: 画面解像度や、コンポーネントの内部ID(インスタンス名)が変わった瞬間にエラーで爆発します。
  • 数値がハードコーディングされている: 「50mm離す」という数値がコードに埋め込まれており、外部の設計変更パラメータ(ExcelやUIからの入力)に連動できません。

プログラミングによる真の自動化とは、「数学的な空間認識(座標計算)」と「APIによる確実なオブジェクト操作」の融合です。

—

2. アセンブリ座標系と相対座標計算のメカニズム

今回目指すのは、「親アセンブリの原点(Origin)から、指定したオフセット距離だけ離れた位置に、子部品を配置して距離合致でロックする」という処理です。

ここで重要になるのが、SolidWorksの空間座標系です。
SolidWorksのAPIでは、すべての位置やベクトルは `Array(配列)` を使って `(X, Y, Z)` の形でやり取りします。

Dim originPos(2) As Double
originPos(0) = 0.0: originPos(1) = 0.0: originPos(2) = 0.0

実務では、この原点を基準にして「X方向に +100mm、Y方向に -50mm」といった相対座標を計算し、その座標値を合致のオフセット引数に渡してやります。

—

3. 【実践】動的オフセット距離合致を定義するVBAコード

それでは、現場でそのままコピペして使える実践的なコードを公開します。
このコードは、アセンブリを開いた状態で実行すると、特定の基準平面に対して、変数で計算したオフセット値を持つ距離合致を動的に作成するものです。

Option Explicit

Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc
Dim boolstatus As Boolean

‘ 1. アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If

If swModel.GetType() <> swDocASSEMBLY Then
MsgBox “アクティブなドキュメントがアセンブリではありません。”, vbCritical
Exit Sub
End If

Set swAssDoc = swModel

‘ ==========================================
‘ 2. 動的パラメータ(オフセット値)の設定
‘ ==========================================
‘ 実務では、ここでExcelセルの値やユーザーフォームの入力を受け取ります
Dim targetOffsetMeters As Double
targetOffsetMeters = 0.15 ‘ 150mm をメートル単位で指定(APIの基本単位はメートル!)

‘ ==========================================
‘ 3. ジオメトリ(面や基準)のスマート選択
‘ ==========================================
‘ 文字列による直接選択ではなく、APIオブジェクトとして安全にキャッチします
‘ ここでは例として、アセンブリの「前面(Front Plane)」と、
‘ 配置する部品の面を指定して選択状態を作ります。

‘ 選択クリア
swModel.ClearSelection2 True

‘ アセンブリの前面を選択
boolstatus = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 1, Nothing, 0)

‘ 配置する部品の面を選択(※事前にアセンブリ内に “Bracket-1” が存在する前提)
boolstatus = swModel.Extension.SelectByID2(“Face1@Bracket-1”, “FACE”, 0, 0, 0, True, 2, Nothing, 0)

If Not boolstatus0 Then
MsgBox “合致対象のエンティティが見つかりませんでした。”, vbCritical
Exit Sub
End If

‘ ==========================================
‘ 4. 距離合致(Distance Mate)の動的定義
‘ ==========================================
‘ AddMate3の引数仕様:
‘ MateType, Alignment, Flip, Distance, DistanceMax, DistanceMin …
‘ MateType: swMateTYPE_Distance (2)
‘ Alignment: swMateALIGN_CLOSEST (0) 等

Dim errorStatus As Long

‘ 距離合致を実行(ここで変数のオフセット値を渡す!)
‘ 引数詳細:
‘ 1: MateType (2 = 距離)
‘ 2: Alignment (0 = 最も近い)
‘ 3: Flip (False)
‘ 4: Distance (targetOffsetMeters – 動的変数)
‘ 5, 6: 最大/最小距離 (今回は未使用なので0)
‘ …

boolstatus = swAssDoc.AddMate3( _
2, _ ‘ swMateTYPE_Distance
0, _ ‘ 整合性
False, _ ‘ 向きを反転するか
targetOffsetMeters, _ ‘ ★ここに動的変数を渡す!
0#, 0#, 0#, 0#, 0#, 0#, 0#, False, errorStatus)

If boolstatus Then
MsgBox “相対座標に基づく動的オフセット合致の定義に成功しました!”, vbInformation
Else
MsgBox “合致の作成に失敗しました。エラーコード: ” & errorStatus, vbCritical
End If

‘ 再構築をかけてモデルを更新
swModel.ForceRebuild3 True

End Sub

—

4. 陥りやすい罠とエンジニアの知見(Error Trap)

このコードを実務で動かす際、初学者が必ずハマる「3つの罠」があります。ここを知っておくだけで、デバッグ時間が何時間も短縮されます。

罠その1:単位系(Unit System)の罠

SolidWorks APIの内部計算単位は、すべて「メートル(m)」と「ラジアン(rad)」で統一されています。
画面上では「mm」で表示されていても、VBAに渡すときは `150mm = 0.15` のようにメートル換算しなければなりません。ここを忘れると、部品が宇宙の彼方に吹っ飛ぶか、顕微鏡で見えないほどの微小な隙間で合致されます。

罠その2:コンポーネント名(インスタンス名)の動的変動

アセンブリ内で部品をコピーしたり削除したりすると、コンポーネント名は `Bracket-1` から `Bracket-2`, `Bracket-1~Assembly-1` のように変化します。
実務ロジックでは、固定の文字列で `SelectByID2` を叩くのではなく、「コンポーネントコレクションをループして、ファイル名から動的にオブジェクトを取得する」アプローチをとるのがプロの作法です。

罠その3:再構築(Rebuild)のタイミング

APIで合致を追加した直後は、画面上のグラフィックスと内部のデータ構造が同期していないことがあります。処理の最後には必ず `swModel.ForceRebuild3 True` を挟み、モデルの整合性を強制的に担保してください。

—

最後に:ここをクリアすればSolidWorks VBAはあなたの武器になる

お疲れ様でした!
アセンブリ座標系を意識した相対計算と、変数を絡めた動的な合致定義の流れ、イメージできましたか?

「画面をクリックして手作業で組んでいたアセンブリが、数行のコードと変数の操作で一瞬にして組み上がる」
この感動を味わえたなら、あなたはもうマクロの記録の呪縛から完全に解放されています。

日々の定型作業を自動化し、クリエイティブな設計の本質に集中するための強力な武器を、ぜひあなたのものにしてください。
ここをクリアしたあなたなら、どんな複雑なアセンブリ自動化も必ず実現できますよ。それでは、次回の極限知見でお会いしましょう!

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