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

スポンサーリンク

ようこそ。SolidWorks自動化の深淵へ。

マクロの記録ボタンを押して、生成されたコードを眺める段階はもう卒業しましょう。今日から君は、SolidWorksの内部構造を操る「エンジニア」としての一歩を踏み出すのです。

現場で最も恐ろしいのは、「アセンブリを開いていることに気づかず、パーツ用のマクロを実行してしまい、モデルが崩壊する」という人為的ミスです。これを防ぐことは、自動化の第一歩にして、最も重要な「守り」の技術です。

さあ、`ModelDoc2.GetType` を使った、堅牢な判定ロジックの極意を伝授します。

1. なぜ「GetType」を知る必要があるのか?

SolidWorksのAPIにおいて、全てのドキュメント(パーツ・アセンブリ・図面)は `ModelDoc2` という共通の親クラスをベースにしています。

しかし、実行する処理が「パーツのフィーチャを操作する」ものなら、相手がアセンブリや図面では困りますよね? 誤った相手に命令を出すと、マクロはエラーで停止するか、最悪の場合、意図しないドキュメントを破壊します。

ここで登場するのが `GetType` メソッドです。これは、現在アクティブなドキュメントが「何者であるか」を数字で教えてくれる、門番のような存在です。

2. 厳密な判定ロジック:実装のテンプレート

現場でそのまま使える、安全性を担保したコードがこちらです。このパターンをテンプレートとして暗記してください。

Sub SafePartOperation()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

‘ SolidWorksへの接続
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 1. ドキュメントが開かれているか確認(nullチェック)
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If

‘ 2. GetTypeによる厳密な型判定
‘ swDocPART = 1, swDocASSEMBLY = 2, swDocDRAWING = 3
If swModel.GetType <> swDocPART Then
MsgBox “エラー:このマクロはパーツファイル専用です。” & vbCrLf & _
“現在のアクティブドキュメント種別: ” & swModel.GetType, vbExclamation
Exit Sub
End If

‘ 3. ここから先は「確実にパーツである」と保証された領域
Debug.Print “パーツとして安全に処理を開始します。”
‘ 実際のフィーチャ操作コードをここに記述

End Sub

なぜこの書き方が「プロ」なのか?

  • Guard Clause(ガード節)の採用: `If` 文の中に処理をネストさせるのではなく、問題がある場合に即座に `Exit Sub` で脱出しています。これにより、コードの深さが浅くなり、可読性が格段に向上します。
  • 定数の活用: `1, 2, 3` というマジックナンバーを直書きせず、SolidWorks側が用意した定数 `swDocPART` を使用することで、コードの意図を明確にしています。

3. 初学者が陥りやすい罠と解決策

罠その1:ドキュメントが一つも開いていない

`swApp.ActiveDoc` を実行した際、何も開いていないと `swModel` は `Nothing` になります。この状態で `swModel.GetType` を呼び出すと、「オブジェクト変数または With ブロック変数が設定されていません」というエラーでマクロが強制終了します。
解決策: 上記コードのように、処理の冒頭で必ず `If swModel Is Nothing` をチェックする習慣をつけてください。

罠その2:判定を省略してAPIを叩く

「自分で操作しているから大丈夫」という過信が、最も手戻りを生みます。APIは「命令されたことを忠実に実行するだけ」です。アセンブリに対してパーツ用の命令(例: `InsertFeatureTreeFolder2` など)を送ると、SolidWorksが挙動不審に陥ることがあります。
解決策: プログラムは「常に間違える前提」で組むのが、最強のエンジニアの流儀です。

4. さらなる高みへ:型変換(キャスト)の重要性

`ModelDoc2` はあくまで「万能な器」に過ぎません。パーツの特定のジオメトリ(スケッチや面など)を精密に操るためには、さらに詳細なクラスである `PartDoc` 型へキャスト(変換)する必要があります。

‘ 型変換の例
Dim swPart As SldWorks.PartDoc
Set swPart = swModel ‘ 明示的にパーツ型として扱うことで、インテリセンスが効くようになる

この「型を意識する」という感覚を養うことが、マクロの記録から脱却し、真の自動化エンジニアへと進化する鍵です。

最後に:コードは「会話」です

SolidWorksと対話する時、相手が誰であるかを常に確認すること。これが、あなたの書くマクロを「壊れにくい、愛されるツール」に変える一番の近道です。

さあ、今日学んだこの「型チェック」を、今すぐあなたの既存マクロに組み込んでみてください。それだけで、あなたのマクロの信頼性は飛躍的に向上します。

分からないことがあれば、いつでもまた聞きに来てください。君のエンジニアとしての成長を、心から応援していますよ。

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