【テクニカル・上級編】【初心者向け】ModelDoc2.GetTypeメソッドを使ったアクティブドキュメントの厳密なパーツ判定と誤操作防止ロジック – SolidWorks VBA解析バイブル

スポンサーリンク

現場の「誤操作」を撲滅せよ:SolidWorks APIにおけるドキュメント判定の極致

SolidWorks APIを扱うエンジニアにとって、最も忌むべきは「意図しないドキュメントに対する破壊的な操作」である。アセンブリを開いている状態で、パーツ用のフィーチャ生成ロジックが暴走した経験はないだろうか?

多くのエンジニアは単に `GetType` を使うだけで満足するが、それはアマチュアの思考だ。シニアエンジニアであれば、APIが返す整数値の背後にあるオブジェクトのライフサイクルと、メモリリークのリスク、そしてWindows環境におけるプロセス間通信の脆弱性を常に意識しなければならない。

今日は、アクティブドキュメントの型を厳密に判定し、安全かつ堅牢なシステムを構築するための「極限のロジック」を伝授する。

1. `ModelDoc2.GetType` が隠し持つ危険性

SolidWorks APIの `GetType` メソッドは、確かに `swDocPART (1)` や `swDocASSEMBLY (2)` といった値を返すが、これだけに依存するのは危険だ。特に、アドインや外部実行ファイルからの操作において、SolidWorksのプロセスが「ビジー状態」であるか、あるいはドキュメントが完全にロードされていない不安定な状態でこのメソッドを叩くことは、COM例外を誘発する引き金となる。

真のプロは、型判定の前に「ドキュメントの生存確認」と「インターフェースの整合性」を保証する。

2. 安全な判定ロジックの実装例

以下に、現場レベルで即座に導入できる「防御的プログラミング」のテンプレートを示す。

Option Explicit

‘ SolidWorks API 定数定義(enumを直書きすることでライブラリ参照の依存を回避する工夫)
Private Const swDocPART As Long = 1

”’

”’ アクティブドキュメントが確実にパーツであることを保証する検証関数
”’

Public Function IsValidPartDocument(ByRef swApp As SldWorks.SldWorks, ByRef swModel As SldWorks.ModelDoc2) As Boolean
‘ 1. オブジェクトの生存確認:これが欠けるとアクセス違反でSWがクラッシュする
If swModel Is Nothing Then
Debug.Print “エラー: ドキュメントが開かれていません。”
IsValidPartDocument = False
Exit Function
End If

‘ 2. GetTypeによる種別判定
‘ ここで単純なif文にせず、型判定を厳密に行う
If swModel.GetType <> swDocPART Then
MsgBox “操作対象外のドキュメントです。このマクロはパーツファイル(.sldprt)でのみ有効です。”, vbCritical
IsValidPartDocument = False
Exit Function
End If

‘ 3. 拡張チェック(堅牢性向上のため)
‘ ファイルパスから拡張子を直接確認する二段構えのセキュリティ
Dim fileName As String
fileName = swModel.GetPathName
If Right$(LCase$(fileName), 7) <> “.sldprt” Then
‘ ファイルが未保存の場合、GetPathNameは空文字を返す。その場合は例外処理が必要。
If fileName <> “” Then
IsValidPartDocument = False
Exit Function
End If
End If

IsValidPartDocument = True
End Function

3. メモリ解放とパフォーマンスへの配慮

VBAはガベージコレクションを自動で行うが、SolidWorksのような重厚なCOMオブジェクトを扱う際、明示的な解放を怠るとメモリの断片化(フラグメンテーション)を引き起こす。

特にループ処理内で `ModelDoc2` を操作する際、参照カウントを意識しないコードは、数千回繰り返すうちにSolidWorksの動作を鈍化させる。

  • インターフェースの開放: `Set swModel = Nothing` を行う習慣をつけよ。
  • イベントハンドラの管理: `WithEvents` を多用する場合、終了処理で必ず接続を解除すること。これを怠ると、SolidWorksを閉じた後もプロセスが背後で残り続ける「ゾンビプロセス」の温床となる。

4. レガシー環境とWindows APIの活用

さらに踏み込んだ話をしよう。大規模な社内システムでは、アクティブウィンドウが本当にSolidWorksの編集画面にあるかを確信できない場合がある。そんな時は、Windows APIの `GetForegroundWindow` や `GetWindowText` を組み合わせ、SolidWorksのドキュメント名とウィンドウ名が一致しているかを外部から監視するロジックを組むこともある。

しかし、まずは「APIへの依存を最小限にし、戻り値を疑う」こと。これが、伝説的なシステムを維持するための唯一の正解だ。

エンジニア諸君へ

「動けば良い」というコードは、数ヶ月後の自分への負債である。特にパーツ生成のような自動化領域において、型判定の曖昧さは、後工程のアセンブリ構成や図面生成における致命的なバグに直結する。

明日から、君のコードに「厳密な門番」を設置せよ。それだけで、君のチームの生産性は劇的に向上するはずだ。

―― 完璧なコードは、完璧な疑念から始まる。

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