SolidWorksの「ゴミ屋敷」を撲滅せよ!重複パーツを自動検知して削除する最強のクリーンアップ術
こんにちは。SOLIDWORKSのAPIの深淵を日々探索しているエンジニアです。
設計変更を繰り返す中で、ふとアセンブリを見て「あれ、同じ部品が重なって配置されている…?」と冷や汗をかいた経験はありませんか?手動で探すのは時間の無駄ですし、見落としはデータ肥大化の元凶です。
今回は、「アセンブリ内の重複コンポーネントを検知し、余剰分をスマートに消去する」という、現場で即戦力となる自動化手法を伝授します。マクロの記録ボタンを卒業し、プロの設計自動化へ一歩踏み出しましょう。
—
1. なぜ「重複」が生まれるのか?そしてなぜ消すべきか?
設計の現場では、Ctrl+ドラッグでのコピーや、修正後の再挿入などで、意図せず同じ座標に同じ部品が配置されることがあります。
- パフォーマンスの悪化: 不要なインスタンスがメモリを食いつぶします。
- 部品表(BOM)の汚染: 数が合わないBOMは、調達部門の悪夢です。
- 干渉チェックの誤作動: 重複しているだけで「干渉」と判定されるため、本来の設計ミスを見逃します。
これらを防ぐには、「コンポーネントの参照パス」と「配置座標(変換行列)」をキーにして判定するのが王道です。
—
2. 【核心】重複排除のロジック
SolidWorksのAPIにおいて、コンポーネントの配置情報は `MathTransform` というオブジェクトで保持されています。この行列データが完全に一致すれば、それは「全く同じ場所にいる同一の部品」です。
実装コード
このコードは、現在開いているアセンブリ内の全コンポーネントをスキャンし、重複を見つけたら2つ目以降を削除します。
Option Explicit
Sub CleanupDuplicateComponents()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim vComps As Variant
Dim i As Long, j As Long
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてから実行してください。”
Exit Sub
End If
Set swAssy = swModel
vComps = swAssy.GetComponents(False)
‘ コンポーネントの配置情報を記憶する辞書(Dictionary)を作成
‘ キー: パス文字列 + 行列データ
Dim dict As Object
Set dict = CreateObject(“Scripting.Dictionary”)
For i = LBound(vComps) To UBound(vComps)
Set swComp = vComps(i)
‘ コンポーネントが抑制されていたら無視(実務上の注意点)
If Not swComp.IsSuppressed Then
Dim path As String
Dim transform As String
path = swComp.GetPathName
transform = GetTransformString(swComp.GetTotalTransform)
Dim key As String
key = path & “|” & transform
If dict.Exists(key) Then
‘ 重複を発見!削除を実行
Debug.Print “重複検知: ” & swComp.Name2
swAssy.DeleteComponent swComp.Name2
Else
dict.Add key, True
End If
End If
Next i
MsgBox “クリーンアップ完了です!”
End Sub
‘ 行列データを比較可能な文字列に変換するヘルパー関数
Function GetTransformString(swMathTrans As SldWorks.MathTransform) As String
Dim vData As Variant
vData = swMathTrans.ArrayData
GetTransformString = Join(vData, “,”)
End Function
—
3. このコードを使いこなすための「知的な注意点」
① 抑制状態(Suppressed)の扱い
コード内で `swComp.IsSuppressed` をチェックしているのは、「あえて隠している部品」まで削除してしまわないためです。現場ではコンフィギュレーションごとに部品の出入りがあるため、この判定は必須です。
② MathTransformの罠
`MathTransform` は非常に強力ですが、浮動小数点数(小数)の計算には誤差が生じることがあります。もし「厳密に重なっていないが、極微小なズレがある重複」も弾きたい場合は、`Join` する際に数値を丸める処理(`Round`関数など)を加えると、より堅牢なプログラムになります。
③ Undo(戻る)はできない場合がある
APIを通じた削除は、多くの場合「取り消し」ができません。必ずバックアップを取ってからテスト運用してください。これは自動化エンジニアの鉄則です。
—
4. さあ、次のステップへ
今回のコードは「コンポーネントのパスと行列」を比較の軸にしましたが、これを応用すれば、「同じ部品だけど、特定のコンフィギュレーションだけ違うもの」を抽出したり、「指定した階層以下の部品だけ対象にする」といった高度な選別も可能です。
マクロの記録だけではたどり着けない、「設計意図をプログラムで制御する」という感覚。これこそが、SolidWorks APIを操る楽しさです。
もし分からない部分があれば、まずは一行ずつステップ実行(F8キー)して、変数の値がどう変化するか確認してみてください。それが、伝説のエンジニアへの第一歩です。応援しています!
