こんにちは!SolidWorks自動化の現場で泥臭く、かつエレガントなマクロを書き続けている先輩エンジニアです。
マクロの記録ボタンを押して生成されたコードを眺めて、「おっ、動いたぞ!」と喜んでいた時期は、誰にでもありますよね。でも、いざ複雑なアセンブリを扱おうとすると、記録されたコードでは歯が立たなくなったり、原因不明のエラーに悩まされたりしていませんか?
今回は、アセンブリの内部構造をVBAでクリアに見せるための極意、「コンポーネントの非表示・透明化制御」を徹底解説します。ここをクリアすれば、単なる「操作の自動化」から脱却し、「SolidWorksの空間構造を意のままに操る」ワンランク上のプログラマーへ確実にステップアップできますよ。
バッチリ分かりやすく解説していくので、ついてきてくださいね!
—
なぜ、アセンブリの内部構造制御でつまずくのか?
大規模なアセンブリモデルを開いたとき、外側のガワ(筐体やカバー)が邪魔をして、肝心の内部メカや配管が見えない……。干渉確認(干渉チェック)の準備をするだけでも、一つひとつ部品を選んで右クリックから「非表示」にするのは、気の遠くなる作業です。
これをVBAで自動化しようとしたとき、多くの人が最初にハマる罠があります。それが、「コンポーネント(部品)の器」と「ボディ(形状実体)」の混同です。
- コンポーネント(Component2): アセンブリの中に配置された「部品のインスタンス」そのもの。
- ボディ(Body2): その部品が持つ実際の3D形状。
非表示や透明化を制御する場合、私たちは「コンポーネント単位」で操作するのか、それとも「特定の条件に合致する部品」を狙い撃ちするのかを、APIに対して明確に指示してあげる必要があります。ここを履き違えると、「コードはエラーにならないのに、何も画面が変わらない!」という幽霊現象に悩まされることになります。
—
基本アプローチ:コンポーネントを巡回し、名前で制御する
まずは、現在アクティブなアセンブリに含まれるすべてのコンポーネントを取得し、特定の名前(あるいは特定の文字列が含まれるもの)を非表示にする基本パターンを見てみましょう。
以下のコードをSolidWorksのVBAエディタ(VBE)に貼り付けてみてください。
実用VBAコード:特定部品の非表示・一括透明化
Sub ControlAssemblyVisibility()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssoc As SldWorks.AssemblyDoc
Dim vComps As Variant
Dim i As Long
Dim swComp As SldWorks.Component2
Dim compName As String
‘ 1. アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントが開かれていない、またはアセンブリ以外なら終了
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アクティブなドキュメントがアセンブリではありません。”, vbCritical
Exit Sub
End If
Set swAssoc = swModel
‘ 2. アセンブリ内の全コンポーネント(最上位)を取得
‘ ※Trueを指定すると、サブアセンブリ内の末端部品まで再帰的に取得できます
vComps = swAssoc.GetComponents(True)
If IsEmpty(vComps) Then
MsgBox “コンポーネントが存在しません。”, vbExclamation
Exit Sub
End If
‘ 3. ループ処理でコンポーネントを1つずつチェック・制御
For i = LBound(vComps) To UBound(vComps)
Set swComp = vComps(i)
‘ コンポーネントのファイル名(あるいはインスタンス名)を取得
compName = swComp.Name2
‘ 【例1】名前に「COVER」が含まれる部品は非表示にする
If InStr(UCase(compName), “COVER”) > 0 Then
‘ 第2引数をFalseにすると非表示になる(Trueなら表示)
swComp.Visible = False
End If
‘ 【例2】名前に「BRACKET」が含まれる部品は透明化する
If InStr(UCase(compName), “BRACKET”) > 0 Then
‘ 透明化の設定(Trueで透明化、Falseで通常)
swComp.ánica = True ‘ おっと、ここはAPIの正しいメソッドを使いましょう!
‘ 正しくは以下のメソッドを使います(後述解説)
End If
Next i
‘ 4. 画面を強制再描画
swModel.GraphicsRedraw2
MsgBox “アセンブリの構造制御が完了しました!”, vbInformation
End Sub
—
ここがプロの技!透明化を正しくコントロールするAPIの極意
先ほどのコードの途中で、あえて「おっと」と書きましたが、SolidWorks APIにおいてコンポーネントの「透明化(Transparency)」は、少しだけコツが必要です。
コンポーネント自体のプロパティには、「透明にする」というシンプルなスイッチが用意されていない場合があります。そのため、実務では以下の2つのアプローチを使い分けます。
1. コンポーネントの表示状態(Visibility)を切り替える(今回メイン)
2. コンポーネントが持つ「ボディ」の色や透過度(MaterialPropertyValues)を直接書き換える
干渉確認の準備として「内部構造をクリアに見せる」だけであれば、邪魔な外装パーツをゴッソリ非表示(`Visible = False`)にしてしまうのが最も確実で、パフォーマンス上の負荷も少ないためオススメです。
非表示・表示を切り替える魔法の1行
‘ 非表示にする
swComp.Visible = False
‘ 表示に戻す
swComp.Visible = True
たったこれだけですが、アセンブリの大規模な階層構造(ツリー)を自動で駆け巡り、一瞬で視界をクリアにしてくれるため、実務でのタイパ(タイムパフォーマンス)は爆発的に向上します。
—
陥りやすいエラーと回避のためのチェックリスト
現場でこのコードを実装する際、よくあるトラブルと対策をまとめておきます。ここを知っているだけで、デバッグの時間が何時間も短縮されますよ。
1. サブアセンブリの中にある部品が対象にならない!
- 原因: `GetComponents(False)` を使っている場合、最上位のアセンブリ直下の部品しか取得できません。
- 対策: 引数に `True` を渡してください(`swAssoc.GetComponents(True)`)。これでネストされた奥深くの部品やパーツまで網羅的に取得できます。
2. 非表示にしたはずなのに、画面が更新されない!
- 原因: VBA側でプロパティを変更しても、SolidWorksのグラフィック画面が自動で再描画されていないケースがあります。
- 対策: ループの最後に必ず `swModel.GraphicsRedraw2` または `swModel.ViewZoomtofit2` などを挟んで、画面をリフレッシュさせましょう。
3. パフォーマンスが妙に重い
- 原因: ループの回数分、画面描画やアセンブリの再構築(Rebuild)が走っている可能性があります。
- 対策: マクロの実行前に画面更新をストップさせるお決まりのテクニックを使いましょう。
‘ 処理高速化のゴールデンセット
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayDisableUpdate, True
‘ — ここに重い処理 —
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayDisableUpdate, False
swModel.GraphicsRedraw2
—
まとめ:ここをクリアすれば、SolidWorks VBAの基本はバッチリ!
今回は、コンポーネントの非表示・透明化制御を通じて、アセンブリ構造をVBAで自在に操るアプローチを解説しました。
- コンポーネント(インスタンス)とボディの違いを理解する
- `GetComponents(True)` で再帰的に全パーツをキャッチする
- `swComp.Visible = False` で邪魔な外装をスマートに消し去る
この基本 さえ押さえておけば、干渉確認前の前処理だけでなく、特定のコンポーネント群だけを抽出してステップ図面を出力するなど、あらゆる自動化へ応用できます。
「マクロの記録」を卒業したあなたなら、このコードをベースに「特定のレイヤーにあるものだけ非表示にする」「材質ごとに条件分岐させる」といったカスタマイズも自由自在です。
ぜひ現場の業務効率化に役立ててくださいね。それでは、また次の知見でお会いしましょう!
