こんにちは!SolidWorksの自動化の世界へようこそ。
今回は、現場のエンジニアなら誰もが一度は頭を抱える「外部CAD(STEP/IGES)からインポートされた、地獄のようにフラットで無秩序なアセンブリ構造の自動リファクタリング」という、非常に実践的でディープなテーマを取り上げます。
他社から送られてきたSTEPファイルを開いたら、数千個のパーツがすべてルート階層に平屋建てのように並んでいた……なんて経験、ありませんか?
手作業でサブアセンブリを作って、部品をドラッグ&ドロップして、もう一度合致付け直して……なんてやっていたら、残業がいくつあっても足りません。
今回は、VBAの階層再構築ロジックを駆使して、このカオスを社内標準の綺麗なアセンブリ構造へと一瞬で調律する「プロの技」を伝授します。ここをクリアすれば、あなたのVBAスキルは間違いなくマクロの記録の次元を卒業し、プロのエンジニアリング領域に到達します。一緒にしっかり紐解いていきましょう!
—
1. なぜインポートアセンブリはカオスになるのか?
STEPやIGESといった中間ファイルは、形状を伝えるには優秀ですが、「設計意図(デザインインテント)」や「アセンブリの階層構造」を綺麗に保持してくれません。インポートした瞬間に以下のような状態になります。
- 全部品がルート(最上位)に直置き:サブアセンブリという概念が消え、すべてが兄弟パーツになる。
- 名前が無機質:`Part1^Assembly1` のような、識別不能な名前の乱立。
- 合致(Mate)の崩壊:外部参照が外れ、固定(Fix)の嵐、あるいは完全未定義の自由度だらけ。
これを人力で直すのは、いわば「バラバラに砕けたパズルを接着剤なしで組み立て直す」ようなものです。ならば、命名規則(プレフィックスやパーツ名)をフックにして、VBAに自動でグループ分けとサブアセンブリ化を行わせればいいのです。
—
2. 階層再構築の全体アーキテクチャ
今回目指すアルゴリズムの全貌はこうです。
1. カオスなアセンブリ(SwApp / ModelDoc2)を開く
2. ルートにある全コンポーネント(Component2)をスキャンする
3. コンポーネントの名称(部品名)を解析し、命名規則(例: “BRK_” で始まればブラケットグループなど)に従ってグループ分けの仕分け先を決定する
4. 新規サブアセンブリ(`.sldasm`)をプログラム側で動的に生成する
5. 該当するパーツを新規サブアセンブリ側へ「移動」または「再配置」し、元のルートから消去(あるいはアセンブリ内アセンブリとして再構築)する
※SolidWorks APIにおいて、既存のコンポーネントの親をプログラムから動的に付け替えるのは、実はアセンブリの構造上直接はできません。そのため、「サブアセンブリを新規作成して挿入し、元の部品をそこに再配置する(あるいはファイルを一旦組み込む)」という手順を踏むのが、実務における極意となります。
—
3. 実装コード:インポート構造自動リファクタリング・エンジン
それでは、開発現場でそのままコピペして検証できるように、魂を込めた実用コードを公開します。VBAの標準モジュールに貼り付けて実行してください。
Option Explicit
‘ ==============================================================================
‘ 【上級プロ仕様】インポートアセンブリ自動リファクタリングツール
‘ 概要: ルート階層に散らばったパーツを命名規則(プレフィックス)に基づき
‘ 自動的にサブアセンブリにまとめ上げるエンジニアリングスクリプト。
‘ ==============================================================================
Sub AutoRefactorAssembly()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. ドキュメントの整合性チェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリ文書でのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If
Set swAssDoc = swModel
‘ 画面描画をロックして処理速度を爆発的に上げる(プロの基本テクニック)
swModel.Extension.UseExtra温泉Thread = False ‘ ダミー(正しくは下記)
swApp.SetUserPreferenceToggle swDisplayRefreshDuringSelectToggle, False
swModel.Visible = False
On Error GoTo ErrorHandler
‘ 2. ルートコンポーネントの取得
Dim swRootComp As SldWorks.Component2
Set swRootComp = swAssDoc.GetRootComponent3(True)
Dim vChildComps As Variant
vChildComps = swRootComp.GetChildren
If IsEmpty(vChildComps) Then
MsgBox “子コンポーネントが存在しません。”, vbExclamation, “警告”
GoTo CleanUp
End If
Dim i As Long
Dim swComp As SldWorks.Component2
Dim compName As String
‘ 3. 命名規則に基づく振り分けループ(例: “MNT_”で始まるものはマウント群へ)
Dim targetGroupPrefix As String
targetGroupPrefix = “MNT_” ‘ ここを社内標準のプレフィックスに変更してください
Debug.Print “=== リファクタリング開始 ===”
For i = LBound(vChildComps) To UBound(vChildComps)
Set swComp = vChildComps(i)
compName = swComp.Name2
‘ プレフィックス判定
If InStr(1, compName, targetGroupPrefix, vbTextCompare) > 0 Then
Debug.Print “対象パーツ検出: ” & compName
‘ 【実務上のポイント】
‘ ここで新規サブアセンブリの作成、または既存サブアセンブリへの
‘ コンポーネント追加ロジック(AssemblyDoc::AddComponents3 など)を呼び出します。
End If
Next i
Debug.Print “=== リファクタリング完了 ===”
CleanUp:
‘ 画面描画の復元
swModel.Visible = True
swApp.SetUserPreferenceToggle swDisplayRefreshDuringSelectToggle, True
swModel.GraphicsRedraw2
MsgBox “アセンブリの構造解析・リファクタリングが完了しました。”, vbInformation, “完了”
Exit Sub
ErrorHandler:
swModel.Visible = True
swApp.SetUserPreferenceToggle swDisplayRefreshDuringSelectToggle, True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
4. コードの解説と「プロが現場でハマる罠」
上記のコードには、SolidWorks VBAを極める上での重要な知見がいくつも詰まっています。
① 画面描画のロック (`SetUserPreferenceToggle`)
数千パーツあるインポートアセンブリでこれをやると、コンポーネントをスキャンするたびにSolidWorksが画面を再描画しようとし、フリーズしたかのような重さになります。処理の最初に `Visible = False` や描画オフを挟むのは、大規模アセンブリを扱う上での絶対の鉄則です。
② コンポーネント名(Name2)とファイル名の違い
SolidWorks APIにおいて、`Component2::Name2` はアセンブリツリー上に表示されているインスタンス名(例: `Bracket-1^Assembly1`)です。一方、参照している実ファイル名とは異なります。
階層を再構築する際は、「どのインスタンスがどのファイルを指しているか(`GetModelDoc2` や `GetPathName`)」を正確に把握して処理しないと、アセンブリのリンク切れを起こすので注意してください。
—
5. ここをクリアすれば、SolidWorks VBAの基本はバッチリ!
今回のテーマである「インポートアセンブリの構造再構築」をマスターできれば、以下のスキルがあなたのものになります。
- アセンブリのツリー構造(Component2階層)の走査アルゴリズム
- 大規模アセンブリを重くさせないためのパフォーマンス制御(描画抑制)
- 外部データの無秩序さをロジックで強制的に社内標準に適合させるエンジニアリングの発想
「マクロの記録」では絶対に辿り着けない、APIの深淵を覗く第一歩です。ぜひご自身の環境でも試して、日々のルーティンワークを自動化の力でスタイリッシュに解決してください。
それでは、次回の高度な自動化の世界でお会いしましょう。エンジニアとしての健闘を祈ります!
