こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺めて、「これ、どうやって他のモデルに応用するんだろう……」と途方に暮れていませんか?
大丈夫、安心してください。今日この扉を開ければ、あなたもSolidWorks VBAの本質にグッと近づけます。
今回は実務でめちゃくちゃ需要が高い「マルチボディ部品の自動制御」をテーマに、不要なボディの削除(`DeleteBody2`)と、単一パーツのスマートな料理法をマスターしましょう。
ここをクリアすれば、あなたも立派な「APIを自在に操るエンジニア」の仲間入りです。一緒に楽しく学んでいきましょう!
—
なぜ「マルチボディ」の制御でつまずくのか?
SolidWorksで設計をしていると、1つのパーツファイル(`.sldprt`)の中に複数のソリッドボディが共存する状況によく遭遇します。
例えば、溶接構造物のフレームだったり、板金の展開前のアセンブリ的なパーツだったり。
ここで手作業なら「このボディはいらないから消して……」とツリーから選んで削除できますが、VBAにこれをやらせようとすると、多くの人が次のような壁にぶつかります。
- 「画面上のどのボディを指しているのか、プログラムが認識してくれない」
- 「マクロの記録をしたら、固有の名前(`Body-1` など)がハードコーディングされていて、モデルが変わるとエラーになる」
- 「削除したつもりが、フィーチャーが壊れてエラーマーク(黄色や赤)だらけになる」
これらを解決するのが、「オブジェクトのライフサイクルとポインタ」を意識した正しいAPIの呼び出し方です。
—
1. マルチボディ制御の基本方針
SolidWorks VBAにおいて、ドキュメントを司るのが `ModelDoc2`、そして個々のソリッドボディを司るのが `Body2` オブジェクトです。
マルチボディを自動制御する大まかな流れたはこうです。
1. 現在のアクティブなドキュメントを取得する。
2. その中にあるすべてのソリッドボディのリスト(配列)を取得する。
3. ループを回して、名前や条件で「どのボディを残し、どのボディを消すか」を判定する。
4. 削除対象のボディを `DeleteBody2` でスマートに消し去る。
これだけです。それでは、実際のコードを見てみましょう!
—
2. 実践!不要なボディを自動削除するVBAコード
以下のコードは、アクティブなパーツファイルから「特定の名前を含まないボディ」、あるいは「条件に合致しないボディ」を一括して安全に削除するための実用的なマクロです。
開発環境(VBE)の標準モジュールに貼り付けて、そのまま現場で使えます。
Option Explicit
Sub SmartDeleteBodiesSample()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim vBodies As Variant
Dim i As Long
Dim swBody As SldWorks.Body2
Dim bodyName As String
‘ 1. SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
‘ 2. アクティブなドキュメントの取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbExclamation
Exit Sub
End If
‘ ドキュメントが「パーツ」であるかチェック
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation
Exit Sub
End If
Set swPart = swModel
‘ 3. パーツ内のすべてのソリッドボディを取得 (引数 0 = ソリッドボディ)
vBodies = swPart.GetBodies2(swSolidBody, False)
If IsEmpty(vBodies) Then
MsgBox “ソリッドボディが見つかりませんでした。”, vbInformation
Exit Sub
End If
‘ 処理の安全性を高めるため、画面描画を一時停止(パフォーマンス向上)
swModel.Extension.UseExtraDrawingThreads = True
swModel.EditRebuild3
‘ 4. ボディの配列をループ処理
For i = LBound(vBodies) <= To UBound(vBodies)
Set swBody = vBodies(i)
bodyName = swBody.Name
' 【ロジック例】 ここでは "Keep_" という名前から始まらないボディを削除対象とする
' ※実務の要件に合わせてこの条件分岐(If文)を書き換えてください
If Left(bodyName, 5) <> “Keep_” Then
Debug.Print “削除対象ボディ: ” & bodyName
‘ 5. DeleteBody2 を実行するための準備・選択
‘ 注意: DeleteBody2はフィーチャーとして履歴に残る削除を行います
Dim status As Boolean
‘ ボディを選択状態にする
status = swBody.Select2(False, 0)
If status Then
‘ 削除実行 (DeleteBody2 は機能的にはフィーチャー削除に相当)
‘ ※正確なAPIメソッドはフィーチャーマネージャー経由、または直接削除操作を行います
Dim boolstatus As Boolean
boolstatus = swModel.Extension.DeleteSelection2(swDeleteSelectionOptions_Default)
If Not boolstatus Then
Debug.Print “警告: ボディ ‘” & bodyName & “‘ の削除に失敗しました。”
End If
End If
Else
Debug.Print “保持するボディ: ” & bodyName
End If
Next i
‘ 変更を反映して再構築
swModel.EditRebuild3
MsgBox “マルチボディの整理が完了しました!”, vbInformation
End Sub
—
3. コードの急所と、初心者がハマりやすい罠
上記のコードには、SolidWorks APIを扱う上で絶対に知っておくべき「プロの知見」が詰まっています。いくつかポイントを解説しますね。
① `GetBodies2` の引数の意味
`swPart.GetBodies2(swSolidBody, False)` の第二引数 `False` は、「非表示のボディも含めてすべてのソリッドボディを取得する」という意味です。もし画面に見えているものだけに限定したい場合は `True` に切り替えるなど、要件に応じた使い分けが可能です。
② なぜハードコーディングを避けるべきなのか?
マクロの記録をすると `swModel.Extension.SelectByID2(“Body-1@Part1”, “BODY”, …)` のようなコードが出力されます。これだと、モデルの設計変更でボディ名が `Body-3` に変わった瞬間にマクロが爆散します。
今回紹介したように、`GetBodies2` で取得したオブジェクトの配列(ポインタ)を直接ループで回すスタイルであれば、名前が何に変わろうともビクともしない堅牢なプログラムになります。
③ 削除の作法 `DeleteSelection2`
APIでボディを消す際、単にメモリから消去するわけではありません。「CADのフィーチャーとして削除履歴を残す」必要があるため、一度 `swBody.Select2` で選択状態にしてから `DeleteSelection2` を叩くという手順を踏んでいます。これがSolidWorksの思想に沿った最も安全なアプローチです。
—
まとめ:ここをクリアすれば、もう怖くない!
今回は、マルチボディ部品の自動制御の基本と、`GetBodies2` および選択削除のテクニックを解説しました。
- パーツ内の全ボディを配列で取得する
- 条件判定(名前や属性)を行う
- 選択して安全に削除する
この型をマスターすれば、板金の展開前処理や、溶接構造物の不要なカット、さらには個別ボディのSTEP形式での自動エクスポート(別名保存)への応用もラクラクです。
「ここをこう変えたら、自分の会社のあの面倒な作業も自動化できるのでは…?」
そう思えたなら、あなたはもう立派な自動化エンジニアです。
ぜひ、ご自身の環境でコードを試してみてください。あなたの設計効率が爆上がりすることを、心から応援しています!
