【入門編】【初心者向け】アセンブリ保存時に未保存のサブアセンブリや外部参照ファイルを自動検知して警告する安全チェック術 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks自動化】「保存したはずなのに…」を防ぐ!未保存サブアセンブリの検知術

こんにちは。現場でSolidWorksと格闘する皆さんの「もっと楽に、もっと安全に」を支えるエンジニアです。

SolidWorksを使っていて、こんな経験はありませんか?
「メインのアセンブリを保存したから大丈夫!」と思っていたら、実は内部のサブアセンブリが『未保存状態』で、うっかり閉じてしまい変更が消えてしまった……。

これは、SolidWorksの「アセンブリは階層構造である」という仕様ゆえに起きる悲劇です。今日は、そんなデータ損失の絶望を未然に防ぐ「未保存サブアセンブリの検知・警告システム」の作り方を伝授します。

マクロの記録から一歩踏み出し、SolidWorksの「構造」を理解する第一歩を一緒に踏み出しましょう。

—

1. なぜ「Dirtyフラグ」をチェックするのか?

SolidWorksのAPIには、ファイルの状態を判定するための`GetSaveFlag`という非常に重要なプロパティがあります。

  • Dirty(ダーティ)状態: 変更が加えられたが、まだディスクに書き込まれていない状態のこと。
  • このフラグをコンポーネント(サブアセンブリや部品)ごとに走査することで、メインアセンブリの状態だけでなく、「隠れた未保存」をあぶり出すことができます。

—

2. 【実用コード】未保存を検知するマクロ

このコードを標準モジュールに貼り付けて実行してみてください。開いているアセンブリの全構成要素をチェックし、未保存のものがあればメッセージボックスで警告します。

Option Explicit

Sub CheckUnsavedComponents()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim vComps As Variant
Dim swComp As SldWorks.Component2
Dim i As Long
Dim unsavedCount As Integer

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ アセンブリ以外なら終了
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてから実行してください。”, vbExclamation
Exit Sub
End If

Set swAssy = swModel
vComps = swAssy.GetComponents(False)
unsavedCount = 0

‘ すべての構成部品をループ処理
For i = 0 To UBound(vComps)
Set swComp = vComps(i)

‘ GetModelDoc2がNothingなら、読み込まれていない(あるいは仮想構成部品)
If Not swComp.GetModelDoc2 Is Nothing Then
‘ GetSaveFlagで保存状態をチェック(0以外なら未保存)
If swComp.GetModelDoc2.GetSaveFlag = True Then
Debug.Print “未保存発見: ” & swComp.Name2
unsavedCount = unsavedCount + 1
End If
End If
Next i

‘ 結果の報告
If unsavedCount > 0 Then
MsgBox unsavedCount & ” 個のサブアセンブリ/部品が未保存です!保存してから閉じてください。”, vbCritical
Else
MsgBox “全ての構成部品は保存済みです。安心してください。”, vbInformation
End If
End Sub

—

3. コードのポイント解説(ここが本質!)

① `swAssy.GetComponents(False)`

アセンブリ内の構成部品をすべて配列として取得します。`False`を指定することで、トップレベルだけでなく、深い階層にあるサブアセンブリの部品まで全て網羅します。

② `swComp.GetModelDoc2`

構成部品(コンポーネント)から、その実体であるモデルドキュメントを取得するステップです。「部品の入れ物」と「部品の中身」を切り分ける、API操作の基本ルールです。

③ `GetSaveFlag`

これが今回の主役です。真偽値(True/False)で返ってくるため、コードの判定が非常にシンプルになります。これを使えば、保存忘れという「ヒューマンエラー」をコードで完全に封じ込めることができます。

—

4. 初学者が陥りやすい罠

1. 「読み込まれていない部品」の処理:
非常に大きなアセンブリでは、一部の部品が「軽量表示」で読み込まれていないことがあります。`GetModelDoc2` が `Nothing` を返す場合は、その部品がメモリ上に存在しないことを意味します。この判定を入れないと、マクロがエラーで止まってしまうので注意が必要です。
2. 仮想構成部品(Virtual Component):
内部構成部品はファイルとして保存されません。これらは `GetSaveFlag` の挙動が通常ファイルと異なる場合があるため、大規模なアセンブリで運用する場合は注意してください。

—

最後に:自動化の第一歩

今回紹介したコードは、あくまで「チェックする」ためのものです。
これを応用すれば、「保存ボタンを押した瞬間に、未保存の部品も強制的に保存する」という神ツールに進化させることも可能です。

SolidWorks APIは、最初は難しく感じるかもしれません。しかし、一つひとつのオブジェクトが持つ「プロパティ」を理解すれば、面倒な手作業から解放される日はすぐそこです。

「ここが動かない!」「もっとこうしたい!」という疑問があれば、いつでも聞いてください。皆さんのエンジニアリングが、より創造的なものになることを応援しています!

タイトルとURLをコピーしました