ようこそ。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と対話する時、相手が誰であるかを常に確認すること。これが、あなたの書くマクロを「壊れにくい、愛されるツール」に変える一番の近道です。
さあ、今日学んだこの「型チェック」を、今すぐあなたの既存マクロに組み込んでみてください。それだけで、あなたのマクロの信頼性は飛躍的に向上します。
分からないことがあれば、いつでもまた聞きに来てください。君のエンジニアとしての成長を、心から応援していますよ。
