エンジニアの皆さん、こんにちは。SolidWorksの世界へようこそ。
「マクロの記録」ボタンを押して生成されたコードを眺め、その冗長さに絶望したことはありませんか?あるいは、複雑なアセンブリで「表示状態をいじったら元に戻せなくなった」という冷や汗ものの経験をしたことは?
今日は、そんな皆さんのステップアップのために、「アセンブリの表示状態を『一時避難』させて『完璧に復元』する」という、実務で極めて重要なテクニックを伝授します。これは単なるコードの紹介ではありません。SolidWorksのオブジェクトモデルの「心臓部」を理解するための第一歩です。
—
1. なぜ「状態の保存」が必要なのか?
大規模なアセンブリで特定の部品だけを選択したり、解析のために強制表示させたりする処理を行うと、元の設計者の意図した表示状態が破壊されます。
「元の状態を覚えておき、処理が終わったら戻す」。これが自動化の鉄則です。ここで重要なのは、「部品の表示状態は、各部品(Component)が保持している」という事実です。
陥りやすい罠:単なる「非表示」の切り替え
初心者は、すべての部品をループして `Component.Visible = True` にしがちです。しかし、これでは「もともと非表示だった部品」まで表示されてしまい、アセンブリがカオスになります。
2. 賢者のロジック:状態の「スナップショット」を取る
今回用いる戦略は以下の通りです。
1. 辞書(Collection/Dictionary)の準備: 現在の「表示状態」を記憶するための箱を用意する。
2. 部品の巡回: アセンブリ内の全部品を走査する。
3. 状態の保存: 非表示(Hidden)の部品名(またはオブジェクトのポインタ)を箱に入れる。
4. 強制変更: 解析のために部品を表示させる。
5. 復元: 処理終了後、箱の中身を参照し、元の非表示状態へ戻す。
3. 実践コード:アセンブリ表示状態のバックアップ&リストア
このコードは、`Scripting.Dictionary` を使用します。これにより、処理速度が格段に向上します。
Option Explicit
‘ メイン処理:表示状態を一時保存し、解析後に復元する
Sub ToggleAndRestoreComponentVisibility()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim vComps As Variant
Dim i As Long
‘ 辞書オブジェクトの生成(Scripting Runtimeを参照設定してください)
Dim hiddenComps As Object
Set hiddenComps = CreateObject(“Scripting.Dictionary”)
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel.GetType <> swDocASSEMBLY Then Exit Sub
Set swAssy = swModel
‘ 1. 【保存工程】非表示部品を特定して記録
vComps = swAssy.GetComponents(False)
For i = 0 To UBound(vComps)
Set swComp = vComps(i)
‘ コンポーネントが非表示の場合、名前を記録
If swComp.Visible = False Then
hiddenComps.Add swComp.Name2, swComp
End If
Next i
‘ — ここで解析処理や選択処理を行う —
Debug.Print “非表示部品を ” & hiddenComps.Count & ” 個記録しました。”
‘ 例:全ての部品を一旦表示させる
swAssy.ShowComponents vComps
MsgBox “解析準備が整いました。OKを押すと元の表示状態に戻します。”
‘ 2. 【復元工程】記録に基づいて非表示に戻す
Dim compName As Variant
For Each compName In hiddenComps.Keys
Set swComp = hiddenComps(compName)
swComp.Visible = False ‘ 元の状態へ
Next compName
swModel.EditRebuild3 ‘ モデルの更新
MsgBox “復元が完了しました。”
End Sub
4. プロの視点:コードを読み解くポイント
- `swComp.Name2` の重要性: SolidWorksにおいて部品を特定する際、単なる名前ではなく「Name2」を使用するのが安全です。これはアセンブリ階層内での一意な識別子です。
- `Scripting.Dictionary` の利点: 配列で管理すると、後から特定の部品を探すのが大変です。辞書オブジェクトなら、名前をキーにして直接アクセスできるため、コードが直感的かつ高速になります。
- `EditRebuild3`: APIで状態を変更した後は、SolidWorksのグラフィックエンジンに再計算を促す必要があります。これを忘れると、画面上は変化していないように見えてしまいます。
5. 最後に:マクロの記録を超えて
ここまでくれば、あなたはもう「マクロの記録ボタン」に頼り切る初心者ではありません。「オブジェクトのライフサイクルを制御する」というエンジニアとしての第一歩を踏み出したのです。
今回のコードをベースに、「特定のレイヤーの部品だけを操作する」や「特定のコンフィギュレーションで実行する」といった条件を組み込んでみてください。SolidWorks VBAの世界は、あなたが思っている以上に自由で、そして非常に強力です。
もしエラーが発生したり、挙動が怪しいと感じたら、それはあなたが「深い領域」に足を踏み入れた証拠です。いつでも相談してくださいね。さあ、次はどんな自動化に挑戦しますか?
