混沌を秩序へ変える:SolidWorksアセンブリ「等ピッチ整列」自動化の極意
設計現場でよく見る光景がある。配管クランプや電装クリップが、設計者の手作業によって微妙にズレた間隔で配置されているアセンブリ。これらは単に「汚い」だけでなく、後の設計変更でパラメータを追いかける際、致命的な手戻りの温床となる。
今回は、手作業による配置の悪夢を終わらせ、「基準軸に沿ってコンポーネントを一括等ピッチ整列させる」ための堅牢な自動化ロジックを伝授する。
—
1. なぜ「力技の座標操作」は失敗するのか
多くの初心者は、`Component.Select2` で選択し、`ModelDocExtension.EditMove` をループさせるようなコードを書く。だが、これは「SolidWorks APIの設計思想」を無視した愚策だ。
- 再構築(Rebuild)のコスト: 座標を一つ動かすたびにフル再構築が走れば、コンポーネントが増えるほど時間は指数関数的に増大する。
- 合致(Mate)の競合: 既に合致が付いている場合、API経由の移動は「合致エラー」や「位置関係の不整合」を誘発する。
- 堅牢性の欠如: 外部参照やコンテキスト参照を含む場合、座標計算のみで強引に動かすと、モデルの整合性が崩れる。
我々プロフェッショナルがとるべき戦略は、「既存の合致を制御する」か、あるいは「合致を一度剥がして再構築し、配置後に拘束する」というアプローチだ。今回は、最も実務的かつ安全な「距離合致による一括制御」の設計思想を紹介する。
—
2. 実装の心臓部:ロジックの設計方針
今回の実装では、以下のステップを厳守する。
1. SelectionManagerの最適化: 選択セットを明示的にクリアし、メモリリークを防ぐ。
2. 合致の更新(MateController的な考え方): 既存の距離合致(Distance Mate)の値をAPIで書き換える。これが最もSolidWorksの挙動として自然で、再構築エラーを回避できる。
3. エラーハンドリング: 選択されたコンポーネントが本当にアセンブリ内に存在するか、型は正しいかを事前に検証する。
—
3. 実装コード:等ピッチ整列プロシージャ
このコードは、あらかじめ「基準点」と「基準面」または「基準軸」に対して距離合致が設定されているコンポーネント群を一括で再整列させるものだ。
‘ SolidWorks Assembly Re-Aligner
‘ 指定された距離合致(Distance Mate)の値を等ピッチで再計算・更新する
Public Sub AutoAlignComponents(ByVal mateNamePrefix As String, ByVal interval As Double)
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swFeat As SldWorks.Feature
Dim swMate As SldWorks.Mate2
Dim swMateFeat As SldWorks.Feature
Dim i As Integer
Dim currentDistance As Double
Set swApp = Application.SldWorks
Set swAssy = swApp.ActiveDoc
If swAssy Is Nothing Then Exit Sub
‘ 編集中のアセンブリのフィーチャーを走査
Set swFeat = swAssy.FirstFeature
Do While Not swFeat Is Nothing
‘ 特定の命名規則(例: “AlignMate_01”, “AlignMate_02″…)を持つ合致を検索
If InStr(swFeat.Name, mateNamePrefix) > 0 Then
If swFeat.GetTypeName2 = “Mate” Then
Set swMate = swFeat.GetSpecificFeature2
‘ 距離合致のみを対象とする (1: Distance Mate)
If swMate.Type = swMateType_e.swMateDISTANCE Then
‘ 等ピッチ計算:インデックスに基づいて距離を更新
‘ ※この計算式は実装に合わせて適宜調整
i = i + 1
currentDistance = i interval
‘ 合致の値を変更
swMate.Distance = currentDistance / 1000 ‘ mm単位
‘ 更新を反映
swFeat.ModifyDefinition swMate
End If
End If
End If
Set swFeat = swFeat.GetNextFeature
Loop
‘ 最後に一括再構築
swAssy.ForceRebuild3 False
MsgBox “整列完了: ” & i & ” 個のコンポーネントを再配置しました。”, vbInformation
End Sub
—
4. 現場で生き残るための「鉄則」
コードを動かすことと、業務を回し続けることは別次元の話だ。以下の注意点を忘れてはならない。
- 命名規則の厳格化:
コード内で `mateNamePrefix` を指定している通り、APIによる自動化を前提とするなら、手動での命名ルールを現場に徹底させること。命名が崩れると、ツールは即座に無力化する。
- データベース連携の罠:
もしExcel等から配置間隔を読み込む場合、`DoEvents`を適宜挟み、SolidWorksの描画更新とVBAの処理速度に差が出ないよう制御すること。さもなくば、OS側から「応答なし」の判定を受ける。
- Undo(元に戻す)のコスト:
APIで行った操作は、一括で元に戻せないケースがある。重要な設計データに適用する前には、必ず `swApp.SaveAll` を呼び出すか、ファイルのバックアップを自動生成するロジックを前段に組み込むこと。
結びに:エンジニアの誇りとして
「自動化」とは、単に楽をすることではない。「人間がやるべきでない、付加価値の低い繰り返し作業を機械に委ね、設計者はその分、機構の最適化や強度検討という『思考』に時間を割く」ことだ。
今回の整列ロジックは、そのための第一歩に過ぎない。君のアセンブリが、美しく、かつ論理的に整理された状態を保てるよう、このコードを武器にして現場の混沌を切り拓いてほしい。
何か不明な点があれば、またいつでも問うがいい。我々には、コードで解決できない問題など存在しないのだから。
