SolidWorks VBAで「整列」を自動化せよ:散らかったアセンブリを劇的に美しく整える極意
こんにちは。現場で泥臭く、かつエレガントにSolidWorksを操るエンジニアの皆さん。
「マクロの記録」ボタンを押して、生成された無駄なコードの多さに絶望したことはありませんか? SolidWorks APIの世界は、単なる操作の自動記録ではありません。それは、「SolidWorksという巨大なデータベースを、自分の意図通りに記述・操作する」という、極めてクリエイティブな作業です。
今回は、現場でよくある「適当に配置されたブラケットやクリップを、ピッチルールに従って美しく等間隔に整列させる」という自動化タスクを題材に、VBAの真髄を伝授します。
—
1. なぜ「手動」ではなく「コード」なのか?
数百個のブラケットを手動でドラッグし、合致(Mate)を一つずつ修正する……そんな作業は今日で終わりにしましょう。
プログラミングによる整列のメリットは、単に「速い」ことではありません。「計算された座標に数学的に配置できる」という点です。人間がマウスで行う作業には必ず誤差が生じますが、APIで制御すれば、ミクロン単位で完璧なレイアウトが確定します。これが「プロの仕事」です。
—
2. 核心:パーツの座標を制御する「MathTransform」
SolidWorksの座標系は、`MathTransform` というオブジェクトで管理されています。アセンブリ内のパーツを動かすには、この行列計算を理解する必要があります。
しかし、難しく考える必要はありません。今回は、最も直感的でミスが少ない「Component.Transform2」を使った座標更新のテクニックを解説します。
実装コード:指定ピッチでコンポーネントを整列させる
このコードは、選択した複数のコンポーネントを、指定した「基準軸」に沿って、「指定ピッチ」で再配置するものです。
Option Explicit
‘ 選択したパーツを指定間隔(mm)でX方向に整列させるマクロ
Sub AlignComponentsByPitch()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swComp As SldWorks.Component2
Dim swMathUtil As SldWorks.MathUtility
Dim swTransform As SldWorks.MathTransform
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swSelMgr = swModel.SelectionManager
Set swMathUtil = swApp.GetMathUtility
Dim i As Integer
Dim pitch As Double: pitch = 50.0 ‘ ここでピッチを設定(mm)
Dim currentX As Double: currentX = 0
‘ 選択したコンポーネントをループ処理
For i = 1 To swSelMgr.GetSelectedObjectCount2(0)
Set swComp = swSelMgr.GetSelectedObjectsComponent4(i, 0)
‘ 現在の配置情報を取得
Dim currentTransform As SldWorks.MathTransform
Set currentTransform = swComp.Transform2
‘ 新しい座標(X軸方向のみ移動)を作成するデータ配列
Dim data(15) As Double
data(0) = 1: data(1) = 0: data(2) = 0 ‘ 回転行列(そのまま)
data(3) = 0: data(4) = 1: data(5) = 0
data(6) = 0: data(7) = 0: data(8) = 1
data(9) = currentX / 1000 ‘ X座標をメートル単位で設定
data(10) = 0: data(11) = 0 ‘ Y, Zは固定
data(12) = 1 ‘ スケール
Set swTransform = swMathUtil.CreateTransform(data)
‘ 座標を適用
swComp.Transform2 = swTransform
‘ 次のパーツのために位置を更新
currentX = currentX + pitch
Next i
swModel.GraphicsRedraw2 ‘ 画面を再描画
MsgBox “整列完了!”, vbInformation
End Sub
—
3. ここをクリアすれば一人前!陥りやすい罠
このコードを動かす際、以下のポイントに注意してください。これが理解できれば、あなたは中級者の壁を確実に突破しています。
- 単位は「メートル」である: SolidWorks APIの内部計算は、設定に関わらず常に「メートル」です。50mmを移動させたいなら `0.05` と記述する必要があります。ここを間違えると、パーツが遥か彼方に飛んでいきます。
- MathTransformのライフサイクル: `Transform2` プロパティを代入することで座標が動きますが、これはあくまで「配置」の変更です。もし「合致(Mate)」が拘束されている場合、エラーになるか、合致が外れます。
- 解決策: 厳密に運用するなら、事前に `Mate` を削除(または抑制)してから整列し、最後に再度合致を追加するロジックを組むのがプロの定石です。
- 選択順序の罠: `SelectionManager` はユーザーがクリックした順に認識されます。意図した順序で並べたい場合は、事前にツリーで名前順に並び替えるか、名前をパースしてソートする工程を挟むと完璧です。
—
4. さあ、次のステージへ
今回のコードは、整列の「第一歩」に過ぎません。ここからさらに応用を効かせるなら:
1. 「ユーザーフォーム」を作ってピッチを自由に入力できるようにする。
2. 「基準となる平面や線」をクリックさせ、そのベクトルに沿って整列させる。
3. 配置後に自動で「距離合致」を作成し、位置を固定する。
ここまでできれば、あなたの業務効率は、同僚の10倍、いや100倍になるはずです。
SolidWorks VBAは、あなたの「面倒くさい」を「知的財産」に変える魔法の杖です。恐れずに、どんどんコードを書き換えて、自分だけの最強のツールを作り上げてください。
何か詰まったら、いつでも聞いてください。設計者のためのプログラミング道、一緒に極めていきましょう。
