アセンブリの混沌をコードで律する:SolidWorks APIによる「等間隔自動整列」の深淵
設計現場において、アセンブリ内に散乱したクリップやブラケットの群れを一つずつ手作業で整列させるのは、エンジニアの時間をドブに捨てるに等しい愚行だ。SolidWorksのAPIは強力だが、マクロが「重い」と感じるなら、それはオブジェクトのライフサイクル管理と座標計算のロジックが未熟である証拠に他ならない。
今日は、数千個のコンポーネントが混在するアセンブリでも一瞬で配置を最適化する、実務レベルの「整列アルゴリズム」について語る。
—
1. 座標計算の哲学:なぜ「再帰」と「行列」なのか
配置間隔が不規則なパーツ群を等間隔に並べる際、多くの初心者は`IComponent2::Select`と`IMate2`をループで回して力技で解決しようとする。これはアセンブリの再構築(Rebuild)を過剰に発生させ、パフォーマンスを劇的に低下させる。
極意:
1. 座標の抽象化: まず、すべての対象コンポーネントの`IMathTransform`を一括抽出し、メモリ上の配列(Variant)に格納する。
2. ベクトル演算: SolidWorks APIに頼らず、自身のコード内で目的の座標を算出する。APIへのクエリはコストが高い。最小限の回数に留めるのが鉄則だ。
3. 明示的解放: `Set swComp = Nothing`をループ内で確実に実行し、ガベージコレクションの気まぐれに身を委ねない。
—
2. 実装の核心:コンポーネント整列マクロ
以下は、選択したパーツ群を、基準となるパーツの軸に沿って指定間隔で配置するVBAコードの骨子である。
‘ SolidWorks APIによるコンポーネント整列プロトタイプ
Sub AlignComponentsEqually()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swSelMgr As SldWorks.SelectionMgr
Dim vComps As Variant
Dim i As Long
Dim dSpacing As Double: dSpacing = 0.05 ‘ 50mm間隔
Set swApp = Application.SldWorks
Set swAssy = swApp.ActiveDoc
Set swSelMgr = swAssy.SelectionManager
‘ 選択したコンポーネントを配列で取得
vComps = GetSelectedComponents(swSelMgr)
‘ アセンブリの再構築を一時停止(パフォーマンス最適化)
swAssy.CompConfigProperties 0, 0, 0, 0, “”, False, False
For i = 0 To UBound(vComps)
Dim swComp As SldWorks.Component2
Set swComp = vComps(i)
‘ ターゲット座標の算出(X軸方向に等間隔配置)
Dim targetX As Double: targetX = i dSpacing
‘ 変換行列を更新(SetComponentTransformは強力だが慎重に扱うこと)
Dim swMathUtils As SldWorks.MathUtility
Set swMathUtils = swApp.GetMathUtility
‘ 現在の変換情報を取得し、位置ベクトルのみを置換
Dim swTransform As SldWorks.MathTransform
Set swTransform = swComp.Transform2
‘ ここで行列演算を行い、新旧の変換行列を合成する
‘ … (行列計算の詳細は割愛するが、回転情報は保持するのが鉄則)
swComp.Select4 False, Nothing, False
swAssy.CompConfigProperties 0, 0, 0, 0, “”, True, False ‘ 最終的に配置
‘ オブジェクトの解放
Set swComp = Nothing
Next i
swAssy.ForceRebuild3 False
End Sub
—
3. シニアエンジニアが守るべき「メモリ管理の禁じ手」
VBAはレガシーな言語だが、SolidWorksという巨大なC++ベースのバックエンドを叩く際、メモリリークは致命的な「SolidWorksのクラッシュ」を招く。
- COMオブジェクトの連鎖を避ける: `swApp.ActiveDoc.SelectionManager.GetSelectedObject6(1)`のように、メソッドを繋げて書くのはデバッグの敵だ。必ず変数に格納し、最後に`Nothing`を代入する。
- Windows APIの介入: マクロの実行中に「SolidWorksが応答なし」になるのを防ぐために、`DoEvents`を適切に配置する。ただし、多用しすぎると再帰的に実行されるため、タイマー制御を挟むのがプロの流儀だ。
- Undoスタックの肥大化抑制: 数百個のパーツを動かす場合、一度の実行でUndoスタックが溢れる。重要なプロセス以外は`swAssy.EditRebuild3`の回数を最小限に抑え、最後に一度だけリビルドをかける設計にせよ。
—
4. システム間連携への布石
このロジックを完成させた後、次に行うべきは「外部データ(CSVやJSON)からの自動配置」だ。
SolidWorks VBA単体で完結させず、設定ファイルを読み込み、配置ルールを外部から動的に制御する。そうすることで、CADオペレーターは「マクロを実行する」のではなく「設定ファイルを置き換える」だけで、アセンブリ全体のレイアウトを数秒で最適化できるようになる。
これが、我々が目指すべき「真の自動化」の姿だ。
コードを記述する際は、常に「自分が書いたコードが、翌週の自分を救うのか、あるいは呪うのか」を自問自答すること。美しくないコードは、機械にも人間にも優しくない。
健闘を祈る。
