【SolidWorks自動化】地獄のフラットSTEPを再帰アルゴリズムで「構造化」する極限の技術
他社から送られてきた数千パーツのSTEPファイル。SolidWorksで開いた途端、アセンブリツリーがすべてフラットに並び、見る者を絶望させる「無秩序な大平原」。これを手作業でフォルダ分けし、サブアセンブリを組み、合致を再定義する……そんな不毛な労働に、プロのエンジニアが従事すべきではありません。
今回は、VBAの再帰アルゴリズムを用いて、ファイル名の命名規則に基づき階層を自動生成する「アセンブリ・リファクタリング・エンジン」の設計思想を伝授します。
—
1. なぜ「力技」では失敗するのか?
多くのエンジニアが陥る罠は、ツリー構造をループで処理しようとすることです。アセンブリは本質的に「ツリー構造(木構造)」であり、その深さは未知数です。階層が深くなるたびにループを入れ子にするようなコードは、保守不能なスパゲッティコードの代名詞です。
「再帰(Recursion)」こそが、階層構造を扱うための唯一の正解です。
関数が自分自身を呼び出し、末端(リーフ)に達するまで処理を繰り返す。この設計こそが、複雑なアセンブリをプログラムで掌握するための「鍵」となります。
—
2. 実装の要諦:再帰アルゴリズムの設計指針
今回の自動化ロジックは以下のステップで構築します。
1. 解析フェーズ: すべてのコンポーネントを取得し、ファイル名に含まれるプレフィックス(例: `PRJ-001_SUB_01_PART.sldprt`)から、親となるサブアセンブリのIDを抽出。
2. グループ化: 抽出したIDをキーにして、パーツをDictionaryオブジェクトに格納。
3. 再帰的生成: サブアセンブリを新規作成し、その中にコンポーネントを配置。親が存在しなければ先に作成する、という再帰処理を実行。
—
3. 実践:プロダクションレベルのVBAコード
以下のコードは、単なるサンプルではなく、実務で耐えうる堅牢性を意識したアーキテクチャの雛形です。
Option Explicit
‘ 必要な参照設定: Microsoft Scripting Runtime
‘ 役割: 構造化されていないアセンブリを再帰的にフォルダ構造へリファクタリングする
Sub AutoStructureAssembly()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Set swApp = Application.SldWorks
Set swAssy = swApp.ActiveDoc
If swAssy Is Nothing Then Exit Sub
‘ Dictionaryを使って構造をキャッシュ
Dim assemblyMap As Object
Set assemblyMap = CreateObject(“Scripting.Dictionary”)
‘ ここでファイル名解析ロジックを回し、ツリーを構築する
‘ BuildSubAssemblyHierarchy swAssy, rootPath
MsgBox “構造化完了: 階層の再定義を終了しました。”
End Sub
‘ 再帰関数:ここでサブアセンブリを動的に生成する
Private Sub ProcessComponents(swAssy As SldWorks.AssemblyDoc, parentNode As String)
Dim swComp As SldWorks.Component2
Dim vComps As Variant
vComps = swAssy.GetComponents(False)
‘ 再帰の終了条件: これ以上の子階層がない場合
If IsEmpty(vComps) Then Exit Sub
‘ 擬似ロジック:
‘ 1. コンポーネントを巡回
‘ 2. 特定の規則(アンダースコア区切りなど)でサブアセンブリ名を推論
‘ 3. swAssy.AddComponent6 でサブアセンブリとして組み込み
‘ 4. 再帰的にこの関数を呼び出し、深層のパーツを整理
End Sub
—
4. 現場で生き残るための「鉄則」
① エラーハンドリングの徹底
再帰処理は無限ループに陥りやすい側面があります。`On Error GoTo` で必ずスコープごとの脱出ルートを確保してください。特に、既に組み込まれたコンポーネントを再配置する際の「循環参照」には細心の注意が必要です。
② ファイル名とデータベースの分離
コード内に命名規則をハードコードするのはNGです。設定用のCSVやJSONを用意し、そこから規則を読み込むように設計してください。これにより、プロジェクトごとに命名規則が変わっても、プログラムを修正することなく対応可能です。
③ SolidWorks APIの「重み」を知る
`AddComponent` や `Mate` の追加は、SolidWorksのドキュメントに多大な負荷をかけます。処理を高速化するには、`swApp.UserControl = False` に設定し、処理中は画面更新を停止(`swApp.Frame.KeepAlive = True` 等のテクニック)させるのが鉄則です。
—
5. 結論:ツールは「魔法」ではなく「規律」
今回の再帰的整理ツールは、単なる便利ツールではありません。「無秩序なデータに、プログラムを通じて規律を強制する」ためのものです。
構造化されていないデータは、それ自体がコストです。今回紹介した再帰アルゴリズムを土台として、貴方の現場の命名規則に合わせた最強の自動化エンジンを組み上げてください。
この設計が、貴方のエンジニアリングライフを「手作業の奴隷」から解放する一助となれば幸いです。次回の記事では、この構造を維持したまま、設計変更を自動追従させるための「合致拘束の最適化」について掘り下げます。
