【入門編】【ModelDoc2の基本】PartDoc、AssemblyDoc、DrawingDocへのキャストとインターフェース制御 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksマクロの記録ボタンを押したはいいものの、「生成された暗号のようなコードをどうにかしたい」「もっと自由自在にモデルを操りたい」と悩んでいませんか?

マクロの記録は素晴らしい出発点ですが、そこから一歩進んで「真に実用的な自動化ツール」を作ろうとしたとき、誰もが最初に直面する巨大な壁があります。それが「ModelDoc2と各専用インターフェース(PartDoc / AssemblyDoc / DrawingDoc)のキャストと制御」です。

ここをクリアすれば、SolidWorks VBAの基本はバッチリです!
今日は、世界中の現場で数々の自動化システムを構築してきたチーフアーキテクトの私から、このモデル操作の核心を優しく、そして深く伝授しましょう。

1. そもそもなぜ「キャスト」が必要なのか?

SolidWorksでVBAを書くとき、現在アクティブなドキュメントを取得するにはお馴染みのこのコードを書きますよね。

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

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

この `swModel` というオブジェクトは、今画面が開いているのが「部品(Part)」であれ、「アセンブリ(Assembly)」であれ、「図面(Drawing)」であれ、すべてを受け止める「汎用的な窓口(ModelDoc2インターフェース)」です。

しかし、この `swModel` という窓口、いわば「総合案内所」のようなもので、各フロアの深い専門業務までは直接やってくれません。
例えば:

  • 部品特有の「フィーチャーの編集」や「ボディの取得」
  • アセンブリ特有の「合致(Mates)の操作」や「コンポーネントの抑制」
  • 図面特有の「ビューの操作」や「シートの切り替え」

これらは、総合案内所(ModelDoc2)のままだと呼び出せないメソッド(命令)がたくさんあります。だからこそ、「今開いているのは部品だから、部品専用の窓口(PartDoc)に切り替えよう!」という操作が必要になります。これがキャスト(型変換)の本質です。

2. 【図解】インターフェースの階層構造

SolidWorksのAPIオブジェクトは、以下のような親子関係(階層構造)になっています。

[SldWorks.SldWorks] (SolidWorks アプリケーションそのもの)

└─> [SldWorks.ModelDoc2] (すべてのドキュメント共通の親)

├─> [SldWorks.PartDoc] (部品専用の特殊機能)
├─> [SldWorks.AssemblyDoc] (アセンブリ専用の特殊機能)
└─> [SldWorks.DrawingDoc] (図面専用の特殊機能)

VBAにおけるキャストとは、このツリー構造の中で「汎用の親(ModelDoc2)」から「特化された子(PartDocなど)」へ、安全にアクセス権をスライドさせる作業を指します。

3. 実践!安全なキャストとインターフェース制御のコード

それでは、現場でそのまま使える実用的なコードを見ていきましょう。
ここでは、「現在開いているドキュメントの種類を判定し、それぞれの専用インターフェースにキャストして固有の処理を実行する」という王道のパターンを実装します。

‘ ==============================================================================
‘ 【実践】ModelDoc2から各専用ドキュメントへの安全なキャスト制御サンプル
‘ ==============================================================================
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

‘ 1. アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 安全装置:ドキュメントが開かれていない場合のガード
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If

‘ 2. ドキュメントの種類(DocumentType)による分岐とキャスト
Select Case swModel.GetType

Case swDocPART
MsgBox “このファイルは【部品(Part)】です。”, vbInformation
Call ProcessPart(swModel)

Case swDocASSEMBLY
MsgBox “このファイルは【アセンブリ(Assembly)】です。”, vbInformation
Call ProcessAssembly(swModel)

Case swDocDRAWING
MsgBox “このファイルは【図面(Drawing)】です。”, vbInformation
Call ProcessDrawing(swModel)

Case Else
MsgBox “未知のドキュメントタイプです。”, vbExclamation
End Select

End Sub

‘ ——————————————————————————
‘ 部品専用の処理ルーチン
‘ ——————————————————————————
Private Sub ProcessPart(ByVal swModel As SldWorks.ModelDoc2)
‘ ModelDoc2 から PartDoc へのキャスト(VBAでは代入するだけで自動キャストされる)
Dim swPart As SldWorks.PartDoc
Set swPart = swModel

‘ 【PartDoc固有の処理】例:ボディ数の取得など
Dim bodyCount As Long
bodyCount = swPart.GetBodyCount

MsgBox “部品処理完了:この部品には ” & bodyCount & ” 個のボディがあります。”, vbInformation

‘ ※ここで swPart.○○ と打つと、部品専用のインテリセンス(入力補助)が効くようになります!
End Sub

‘ ——————————————————————————
‘ アセンブリ専用の処理ルーチン
‘ ——————————————————————————
Private Sub ProcessAssembly(ByVal swModel As SldWorks.ModelDoc2)
‘ ModelDoc2 から AssemblyDoc へのキャスト
Dim swAssy As SldWorks.AssemblyDoc
Set swAssy = swModel

‘ 【AssemblyDoc固有の処理】例:コンポーネント数の取得
Dim vComps As Variant
vComps = swAssy.GetComponents(True) ‘ TopLevelOnly = True

Dim compCount As Long
If Not IsEmpty(vComps) Then
compCount = UBound(vComps) – LBound(vComps) + 1
Else
compCount = 0
End If

MsgBox “アセンブリ処理完了:トップレベルの部品点数は ” & compCount & ” 個です。”, vbInformation
End Sub

‘ ——————————————————————————
‘ 図面専用の処理ルーチン
‘ ——————————————————————————
Private Sub ProcessDrawing(ByVal swModel As SldWorks.ModelDoc2)
‘ ModelDoc2 から DrawingDoc へのキャスト
Dim swDraw As SldWorks.DrawingDoc
Set swDraw = swModel

‘ 【DrawingDoc固有の処理】例:アクティブシート名の取得
Dim sheetName As String
sheetName = swDraw.GetCurrentSheet.GetName

MsgBox “図面処理完了:現在のシート名は [” & sheetName & “] です。”, vbInformation
End Sub

4. 陥りやすいエラーと、プロが教える「絶対のルール」

初心者のうちは、次のような罠にハマりがちです。ここを知っているだけでも、デバッグの時間が何時間も節約できます。

罠①:図面が開いているのに `PartDoc` にキャストしようとする

‘ 図面が開いている状態でこれをやると…
Dim swPart As SldWorks.PartDoc
Set swPart = swModel ‘ ← 型が違うため、実行時エラーや意図しない挙動になる!

【対策】 必ず今回のコードサンプルのように、`swModel.GetType` で事前にドキュメントの種類を判定(ガード)してからキャストを行ってください。

罠②:Early Binding(事前バインディング)をサボる

変数宣言を `Dim swPart As Object` のように曖昧(遅延バインディング)にしていると、VBAの入力補助(インテリセンス)が効かないだけでなく、実行時エラーの発見が遅れます。
必ず `Dim swPart As SldWorks.PartDoc` のように明示的な型宣言を行いましょう。これがSolidWorks VBAを極めるための第一歩です。

まとめ

いかがでしたでしょうか?
「ModelDoc2」という共通の入り口から入り、`GetType` で判定して、それぞれの専門インターフェース(`PartDoc` / `AssemblyDoc` / `DrawingDoc`)へ安全にバトンタッチする。

このパターンをマスターすれば、どんなに複雑なアセンブリ構造であっても、図面の大量一括処理であっても、迷うことなくコードを組み立てられるようになります。

基礎から本質を押さえたあなたなら、もう「マクロの記録の奴隷」ではありません。ぜひ自分の手で、このコードをVBE(Visual Basic Editor)に貼り付けて動かしてみてください。
現場の自動化の世界へようこそ。それでは、次回の極限知見でお会いしましょう!

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