SolidWorks APIの真髄:サブアセンブリを「ピンポイント」でSTEP抽出する自動化術
こんにちは。SOLIDWORKSの自動化の世界へようこそ。
「マクロの記録」ボタンを押して、生成されたコードを眺めて首をかしげる。そんな日々は今日で卒業しましょう。業務で最も頻出する「特定部品だけを別形式で書き出す」という作業。手動で行うと地味に時間がかかり、ミスも誘発しやすいですよね。
今日は、アセンブリ全体ではなく、「特定のサブアセンブリだけを狙い撃ちしてSTEP出力する」という、実務で極めて重宝するテクニックを伝授します。
—
1. なぜ「マクロの記録」では不十分なのか?
SOLIDWORKSのマクロ記録は、「今の操作をなぞる」ことに特化しています。しかし、APIを直接操るということは、「SOLIDWORKSが頭の中でどう考えているか(ツリー構造)」を直接操作するということです。
今回扱う「サブアセンブリの個別エクスポート」において重要なのは以下の3点です。
1. SelectionManager(選択マネージャー)の活用: 何が選ばれているかを正確に特定する。
2. ModelDoc2の取得: 選択されたサブアセンブリを「一時的なモデル」として扱う。
3. SaveAsAPI: ファイル形式を指定して、静かに保存する。
—
2. 実装コード:サブアセンブリを射抜く
このコードは、現在開いているアセンブリのツリーで「サブアセンブリ」を選択した状態で実行してください。そのサブアセンブリだけを、元のファイルと同じ場所にSTEPとして出力します。
Option Explicit
Sub ExportSelectedSubAssemblyAsStep()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swComp As SldWorks.Component2
Dim swSubModel As SldWorks.ModelDoc2
Dim exportPath As String
Dim status As Boolean
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. モデルが開いているか確認
If swModel Is Nothing Then Exit Sub
‘ 2. 選択マネージャーをセット
Set swSelMgr = swModel.SelectionManager
‘ 3. 選択されているのがコンポーネントか判定
If swSelMgr.GetSelectedObjectType3(1, -1) <> swSelCOMPONENT Then
MsgBox “対象のサブアセンブリを選択してから実行してください。”
Exit Sub
End If
‘ 4. 選択されたコンポーネントを取得
Set swComp = swSelMgr.GetSelectedObjectsComponent4(1, -1)
Set swSubModel = swComp.GetModelDoc2
‘ まだ開かれていない(メモリにロードされていない)場合は開く
If swSubModel Is Nothing Then
Set swSubModel = swApp.OpenDoc6(swComp.GetPathName, swDocASSEMBLY, swOpenDocOptions_Silent, “”, 0, 0)
End If
‘ 5. 出力パスの作成(元のファイル名の拡張子をSTEPに変更)
exportPath = Left(swSubModel.GetPathName, InStrRev(swSubModel.GetPathName, “.”)) & “step”
‘ 6. STEPとして保存
‘ SaveAsの引数は重要です。ここではシンプルに保存します。
status = swSubModel.SaveAs3(exportPath, 0, 0)
If status Then
MsgBox “エクスポート完了: ” & vbCrLf & exportPath
Else
MsgBox “保存に失敗しました。パスや権限を確認してください。”
End If
End Sub
—
3. このコードを理解するための「3つの鍵」
① `SelectionManager` はあなたの目
SOLIDWORKSにおいて「今、何が選ばれているか」を判定する唯一の窓口です。`GetSelectedObjectType3` を使うことで、ユーザーが部品を選んでいるのか、面を選んでいるのかを厳密に区別できます。
② `GetModelDoc2` の魔法
アセンブリの中にいる「サブアセンブリ」は、単なるパーツの集まりですが、裏側では「一つのモデルファイル」として存在しています。`GetModelDoc2` を呼び出すことで、そのサブアセンブリ単体に対して、あたかも独立したファイルを開いているかのように命令を送れるようになります。
③ `swOpenDocOptions_Silent` の重要性
自動化の敵は「ダイアログボックス(警告や確認画面)」です。`.OpenDoc6` を使う際、このオプションを付けることで、画面をチラつかせずに裏側で処理を進めることができます。これこそが、プロの自動化コードの嗜みです。
—
4. 陥りやすいエラーと対策
- 「ファイルが開かれていない」エラー:
`swComp.GetModelDoc2` は、SOLIDWORKSがメモリ上にロードしているモデルしか返しません。ツリー上で「折りたたまれている」サブアセンブリは、まだメモリにない場合があります。上記のコードのように、`Nothing` だったら `OpenDoc6` で読み込むという処理が必須です。
- パスの取得ミス:
`GetPathName` はフルパスを返します。ファイルの保存先を制御したい場合は、`FileSystemObject` を使ってフォルダパスを切り出すのが定石です。
—
最後に:エンジニアとしての第一歩
このマクロを使えば、これまで数分かかっていた「特定の構造だけの切り出し」が、わずか1秒のクリックで終わります。
最初は難しく感じるかもしれませんが、「SOLIDWORKSをデータ構造として捉える」という感覚が身につけば、どんな複雑な自動化も夢ではありません。まずはこのコードをコピーして、ご自身の環境で動かしてみてください。
「動いた!」という感動が、あなたのエンジニアとしてのキャリアを大きく飛躍させるはずです。応援していますよ。
—
次のステップへ: もし興味があれば、次は「アセンブリ内の全サブアセンブリをループで回して一括エクスポートする」という自動化に挑戦してみましょう。世界が変わります。
