【SolidWorks API】アセンブリの「保存漏れ」という地雷を排除する:堅牢な安全チェック術
諸君、SolidWorks APIの世界へようこそ。
現場でよく耳にする悲劇がある。「アセンブリを保存したつもりで閉じたら、構成部品のサブアセンブリが未保存で、整合性が崩壊した」というものだ。これは単なる個人のミスではない。設計者の工数を奪い、データの信頼性を根底から揺るがす「設計プロセスの欠陥」だ。
なぜ、こうしたミスが起きるのか? それは多くのエンジニアが、SolidWorksのドキュメント構造を「ただのファイルの集まり」と甘く見ているからだ。アセンブリとは、メモリ上に展開された複雑なオブジェクトの木構造である。
今回は、この「未保存のサブアセンブリ」を自動検知し、保存前に警告を出すための「安全装置」を実装する。
—
1. なぜ「Dirtyフラグ」を見るだけでは不十分なのか
初心者は往々にして `ModelDoc2.GetSaveFlag` を参照するだけで満足する。しかし、大規模アセンブリを扱う実務において、それだけでは片手落ちだ。
- コンテキスト依存: 外部参照が壊れている場合、アセンブリ本体が「未保存」であっても、子要素のステータスが正しく伝搬していないケースがある。
- 仮想構成部品 (Virtual Components): これらはアセンブリ内部に埋め込まれているため、通常のファイルパス走査では引っかからない。
- パフォーマンスの罠: 再帰的な走査は、部品点数が数千個規模になると一気に重くなる。
堅牢なシステムを構築するには、「再帰的にコンポーネントをトラバースし、各ドキュメントのDirty状態を個別に評価する」というアプローチが不可欠だ。
—
2. 堅牢な安全チェック・スクリプト
以下に、実務でそのまま使えるプロダクションコードを提示する。このコードは、現在開いているアセンブリの全構成部品を再帰的に走査し、未保存のドキュメントがあれば即座にリストアップする。
‘ SolidWorks APIによる未保存部品チェック・スクリプト
Option Explicit
Public Sub CheckUnsavedComponents()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy 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
Set swAssy = swModel
Dim unsavedList As String
unsavedList = “”
‘ 再帰処理の開始
TraverseComponents swAssy.GetComponents(False), unsavedList
If unsavedList <> “” Then
MsgBox “警告:以下の部品が未保存です。” & vbCrLf & unsavedList, vbExclamation
Else
MsgBox “全部品保存済みです。安全に作業を継続できます。”, vbInformation
End If
End Sub
‘ コンポーネントを再帰的に走査するエンジン
Private Sub TraverseComponents(comps As Variant, ByRef unsavedList As String)
Dim i As Long
Dim swComp As SldWorks.Component2
Dim swModel As SldWorks.ModelDoc2
If IsEmpty(comps) Then Exit Sub
For i = 0 To UBound(comps)
Set swComp = comps(i)
Set swModel = swComp.GetModelDoc2
‘ モデルがロードされている場合のみチェック
If Not swModel Is Nothing Then
‘ Dirtyフラグが立っているか確認
If swModel.GetSaveFlag = True Then
unsavedList = unsavedList & “- ” & swModel.GetTitle & vbCrLf
End If
‘ サブアセンブリがある場合は再帰的に掘り下げる
If swComp.GetChildrenCount > 0 Then
TraverseComponents swComp.GetChildren, unsavedList
End If
End If
Next i
End Sub
—
3. 実務担当者へのアドバイス:保守性を高める設計思想
このコードをただコピペするだけでなく、君たちの環境に合わせて以下の工夫を盛り込むことを推奨する。
1. イベント駆動型への昇華
上記のコードはボタンで実行する形式だが、真にプロフェッショナルな自動化は「イベント」を使う。`DAssemblyDocEvents_FileSaveNotify` イベントをフックすれば、保存ボタンを押した瞬間にこのチェックを割り込ませることが可能だ。保存を阻止することもできる。
2. ログのデータベース連携
大規模なプロジェクトでは、誰がいつ未保存のまま閉じたかという「ログ」が重要になる。`FileSystemObject` を使って、未保存リストをテキストファイルやサーバー上のデータベースに書き出せば、チーム全体の「保存習慣」を可視化・改善するデータになる。
3. パフォーマンスの最適化
構成部品が多いアセンブリで再帰処理を行うと、確かに遅延が発生する。その場合は `swComp.GetSuppression` で「抑制済み」の部品をスキップするロジックを追加してほしい。不要なロードを避けることが、エンジニアリングにおける最適化の第一歩だ。
—
最後に:ツールは「文化」を変える
自動化ツールとは、単なる機能ではない。チームの「データは整合性がとれていて当たり前」という規律を支えるためのバックボーンだ。
このスクリプトを導入し、君たちのチームから「保存漏れによるデータ破損」という悲劇を過去のものにしてほしい。それが、世界最高峰のエンジニアを目指す諸君に期待する仕事だ。
質問があればいつでも聞いてくれ。設計の自動化に、妥協は不要だ。
