こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。
日々の設計業務で、こんなストレスを感じたことはありませんか?
「複雑なアセンブリの内部構造を確認するために、あっちの部品を非表示にし、こっちのサブアセンブリも隠して……よし、点検完了!……あれ、元の表示状態に戻すの、どうやってやるんだっけ……?」
マクロの記録ボタンを押してポチポチ作業を記録しても、アセンブリの階層構造やコンポーネントのインスタンス名が変わると、途端に動かなくなる。そんな「マクロの記録の呪縛」に悩まされている方も多いはずです。
今回は、実務で即戦力となる「アセンブリ内の非表示部品を完璧に一時退避させ、検査モードが終わったらワンタッチで元の状態に復元するステート管理マクロ」を授けましょう。
ここをクリアすれば、単なる「操作の自動化」を超えた、「SolidWorksのメモリとオブジェクト構造を操るエンジニア」の仲間入りです。一緒に本質を学んでいきましょう!
—
1. なぜ「表示状態の管理」は難しいのか?
SolidWorksのアセンブリにおいて、部品の「表示・非表示」は単なる見た目の設定ではありません。
背後では、`Component2` というオブジェクトがメモリ上に存在し、その状態プロパティ(Visibleフラグなど)が書き換わっています。
ここで初心者が陥りがちな罠が、「名前だけで部品を特定しようとする」ことです。
アセンブリ内には、同じ部品(部品名)が複数のインスタンス(配置)として存在することがあります。そのため、名前だけでなく、「コンポーネントのパス(完全修飾名)」を正確に捉えて配列に格納しなければなりません。
—
2. アーキテクチャの設計思想
今回のマクロの戦略はこうです。
1. スキャン(Scan): アセンブリ内の全コンポーネントを再帰的に走査する。
2. 退避(Save State): もし「非表示」なら、そのコンポーネントのパスを動的配列に記録する。
3. 全表示(Isolate / Inspect): 検査のためにすべての部品を一旦表示状態にする(あるいは特定の作業を行う)。
4. 復元(Restore): 記録しておいた配列とアセンブリ内のコンポーネントを突き合わせ、非だったものを再度「非表示」に戻す。
この一連の流れを、VBAの「コレクション」あるいは「動的配列」を使ってスマートに実現します。
—
3. 実装コード:ステート管理マクロの全貌
以下のコードをSolidWorksのVBAエディタ([Alt] + [F11])に貼り付けてください。
実務でそのままコピペして使えるよう、細部まで魂を込めたコメントを入れています。
Option Explicit
‘ グローバル変数:非表示コンポーネントのパスを保持する動的配列
Private HiddenComponentPaths() As String
Private IsStateSaved As Boolean
‘================================================================0
‘ メインプロシージャ:現在の非表示状態を退避し、全表示にして検査モードへ
‘================================================================0
Sub ToggleHideState_SaveAndShowAll()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssm As SldWorks.AssemblyDoc
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 swAssm = swModel
‘ すでに退避状態であれば、確認メッセージを出すなどの制御も可能
ReDim HiddenComponentPaths(0)
IsStateSaved = False
‘ アセンブリ内のコンポーネントを再帰的に走査し、非表示のものを収集
Dim vComps As Variant
vComps = swAssm.GetComponents(True) ‘ True = トップレベルのみならず内部も含める
If IsEmpty(vComps) Then
MsgBox “コンポーネントが存在しません。”, vbExclamation, “情報”
Exit Sub
End If
Dim i As Long
Dim swComp As SldWorks.Component2
Dim count As Long
count = 0
For i = LBound(vComps) To UBound(vComps)
Set swComp = vComps(i)
‘ 抑制されている(Suppressed)コンポーネントは除外
If Not swComp.IsSuppressed Then
‘ 隠されている(Hidden)かどうかを判定
If swComp.Hidden Then
ReDim Preserve HiddenComponentPaths(count)
‘ 一意に特定するための「完全パス(PathName + 例外的なインスタンス名)」を取得
HiddenComponentPaths(count) = swComp.GetPathName & “|” & swComp.Name2
count = count + 1
End If
End If
Next i
If count > 0 Then
IsStateSaved = True
MsgBox count & “個の非表示部品の状態を退避しました。” & vbCrLf & _
“これからすべての部品を表示状態にします。”, vbInformation, “ステート保存完了”
Else
MsgBox “非表示の部品は存在しませんでした。”, vbInformation, “情報”
End If
‘ 検査のためにすべてのコンポーネントを表示状態にする
swModel.Extension.SelectAll
‘ 非表示解除のAPIを実行
Dim bRet As Boolean
bRet = swAssm.UnHideAllComponents()
swModel.ClearSelection2 True
‘ ※ここで任意の検査・作業コードを挟むことができます
End Sub
‘================================================================0
‘ メインプロシージャ:退避した状態を完璧に復元する
‘================================================================0
Sub ToggleHideState_Restore()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssm As SldWorks.AssemblyDoc
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アクティブなアセンブリドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
If Not IsStateSaved Then
MsgBox “復元すべきステートが保存されていません。” & vbCrLf & _
“先に「SaveAndShowAll」を実行してください。”, vbExclamation, “警告”
Exit Sub
End If
Set swAssm = swModel
Dim vComps As Variant
vComps = swAssm.GetComponents(True)
If IsEmpty(vComps) Then Exit Sub
Dim i As Long, j As Long
Dim swComp As SldWorks.Component2
Dim targetKey As String
Dim restoredCount As Long
restoredCount = 0
‘ アセンブリ内の全コンポーネントをループし、退避リストに一致するものを非表示に戻す
For i = LBound(vComps) To UBound(vComps)
Set swcomp = vComps(i)
If Not swcomp.IsSuppressed Then
targetKey = swcomp.GetPathName & “|” & swcomp.Name2
‘ 退避リストに含まれているか線形探索
For j = LBound(HiddenComponentPaths) To UBound(HiddenComponentPaths)
If HiddenComponentPaths(j) = targetKey Then
‘ 非表示に設定
swcomp.Visible = swComponentHidden
restoredCount = restoredCount + 1
Exit For
End If
Next j
End If
Next i
‘ 再描画をかけてビューを更新
swModel.GraphicsRedraw2
MsgBox “復元処理が完了しました。” & vbCrLf & _
restoredCount & “個の部品を元の非表示状態に戻しました。”, vbInformation, “復元完了”
‘ ステートを初期化
IsStateSaved = False
End Sub
—
4. コードのここがポイント!プロの技術解説
初心者のうちは、「なぜわざわざ `GetPathName & “|” & swComp.Name2` なんて面倒な文字列を作るの?」と疑問に思うでしょう。
ここにSolidWorks APIを使いこなす極意があります。
1. インスタンスの識別(`Name2` の重要性)
同じボルト部品をアセンブリ内に10個配置したとします。ファイルパスはすべて同じですが、ツリー上の名前(インスタンス名:`Bolt-1<1>`, `Bolt-1<2>` など)は異なります。パスとインスタンス名をパイプ (`|`) で結合した文字列をキーにすることで、「どの配置場所の部品が非表示だったか」を10リピートの精度で完全に特定できるのです。
2. `IsSuppressed` と `Hidden` の違い
- 抑制(Suppressed): メモリからデータがアンロードされている状態(重たいアセンブリでリソースを節約するために使う)。
- 非表示(Hidden): データはメモリにあるが、画面上に見えない状態。
今回は「表示・非表示の切り替え」が目的なので、誤って抑制中の部品を触ってエラーを出さないよう、`Not swComp.IsSuppressed` でガードを入れています。これが実務で絶対にエラーを出さない頑健性(ロバストネス)を生み出します。
—
5. まとめと次のステップ
今回は、アセンブリの表示状態をメモリ上の配列に一時退避させ、自由自在に復元するステート管理のテクニックを解説しました。
ここをクリアすれば、あなたもう「マクロの記録」に頼る初級者ではありません。SolidWorksのオブジェクトモデルを理解し、自分の意のままにアセンブリを操るエンジニアです。
実務では、このコードをベースにして「特定のレイヤーやコンフィギュレーションと連携させる」「UI(ユーザーフォーム)をつけてボタン一つで切り替えられるようにする」といった発展形に挑戦してみてください。
あなたの設計自動化ライフが、より快適で知的になりますように。それではまた、次の極限の知見でお会いしましょう!
