【テクニカル・上級編】【初心者向け】SolidWorks図面の新規作成と標準シートフォーマット自動適用のVBAマクロ – SolidWorks VBA解析バイブル

スポンサーリンク

序論:なぜ単なる「図面作成」がレガシー運用の破綻を招くのか

SolidWorks APIを利用した図面の自動生成は、CAD業務自動化における最重要課題の一つである。しかし、現場のシニアエンジニアや社内システム管理者が直面するトラブの多くは、この「図面の新規作成とシートフォーマット適用」という一見基礎的な処理に集中している。

インターネット上に溢れる初歩的なサンプルコードをそのまま運用環境(プロダクション環境)に投入すると、以下のような深刻な障害を引き起こす。

  • テンプレートとシートフォーマットの混同によるリンク切れ
  • 無応答(フリーズ)やCOMオブジェクトのメモリリークによるSolidWorksのクラッシュ
  • UNCパス指定時のネットワーク遅延によるAPIサイレントエラー
  • 図面枠(`.slddrt`)内のリンクテキスト($PRPSHEET等)が評価されない描画不具合

本稿では、VBAからSolidWorks COM APIを叩くにあたり、オブジェクトのライフサイクル管理、描画エンジンの制御、Windows APIを用いたファイル検証を含めた、エンタープライズ運用に耐えうる極限のVBAコードとその内部アーキテクチャを解剖する。

—

内部アーキテクチャの解剖:テンプレート(.drwdot)とシートフォーマット(.slddrt)の分離構造

自動化コードを記述する前に、SolidWorks内部における図面ドキュメントの構造を理解しなければならない。

[ 図面ドキュメント (.slddrw) ]
├── [ ドキュメント設定 / 単位 / 描画規格 ] ─── テンプレート (.drwdot) 由来
└── [ シート (ISheet) ]
├── [ ビュー群 (IView) ]
└── [ シートフォーマット (図面枠/表題欄) ] ─── シートフォーマット (.slddrt) 由来

1. テンプレート(`.drwdot`)

ドキュメントの初期化パラメータ(単位系、JIS/ANSI等の描画規格、フォント設定等)を保持するバイナリ。`SldWorks::NewDocument` メソッドで呼ばれるが、ここには最新の図面枠情報を持たせるべきではない。

2. シートフォーマット(`.slddrt`)

図面枠、表題欄のジオメトリ、およびモデルのプロパティ(図番、品名、重量等)を読み込むテキストリンク情報の集合体。

業務自動化において最も堅牢な設計は、「最小限の汎用 `.drwdot` でドキュメントを生成し、直後にプログラム側から指定の `.slddrt` を動的にロード・強制適用する」 という二段構えのアプローチである。これにより、将来的な図面枠の改修時にも過去のテンプレート更新漏れによる不具合を完全に防ぐことができる。

—

完全制御VBAコード:プロダクション環境向け実装 blueprint

以下に示すコードは、Windows APIによるパスの事前検証、SolidWorks描画エンジンの時限停止によるパフォーマンス最適化、およびCOM参照の明示的破棄を完全に網羅したプロダクション用コードである。

プロダクション環境用 VBAマクロ

Option Explicit

‘ ==============================================================================
‘ Windows API 宣言 (64bit環境対応)
‘ ファイル存在確認を高速かつ正確に行うため、Kernel32/Shlwapiを使用
‘ ==============================================================================
If VBA7 Then
Private Declare PtrSafe Function PathFileExistsW Lib “shlwapi.dll” (ByVal pszPath As LongPtr) As Long
Else
Private Declare Function PathFileExistsW Lib “shlwapi.dll” (ByVal pszPath As Long) As Long
End If

‘ ==============================================================================
‘ 定数定義 (社内標準環境に合わせて調整)
‘ ==============================================================================
Private Const TEMPLATE_PATH As String = “C:\SOLIDWORKS_Standards\Templates\Standard_Drawing.drwdot”
Private Const SHEET_FORMAT_PATH As String = “C:\SOLIDWORKS_Standards\Formats\A3_Standard.slddrt”

‘ SolidWorks API 定数 (swPaperSize_e)
Private Const swD32K As Long = 0
Private Const swPaperA3size As Long = 2

”’

”’ 図面新規作成および社内標準シートフォーマット自動適用メインプロシージャ
”’

Public Sub CreateStandardDrawingDocument()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim boolStatus As Boolean

‘ 1. 事前パス検証 (SolidWorks APIを呼び出す前のガードクローズ)
If Not SafeFileExists(TEMPLATE_PATH) Then
MsgBox “図面テンプレートが存在しません: ” & TEMPLATE_PATH, vbCritical, “システムエラー”
Exit Sub
End If

If Not SafeFileExists(SHEET_FORMAT_PATH) Then
MsgBox “シートフォーマットが存在しません: ” & SHEET_FORMAT_PATH, vbCritical, “システムエラー”
Exit Sub
End If

‘ 2. SolidWorks アプリケーションインスタンスのバインド
On Error Resume Next
Set swApp = Application.SldWorks
On Error GoTo 0

If swApp Is Nothing Then
MsgBox “SolidWorksインスタンスの取得に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If

‘ 3. バックグラウンド処理の最適化(画面描画・ダイアログの抑制)
‘ ※処理速度の向上およびCOMイベントの暴走を抑制
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swDisplayBatchErrors, True

‘ 4. 新規図面ドキュメントの生成
‘ IModelDoc2ではなくIDrawingDocとして受けるためにキャスト考慮
Set swModel = swApp.NewDocument(TEMPLATE_PATH, swPaperA3size, 0#, 0#)

If swModel Is Nothing Then
MsgBox “ドキュメントの生成に失敗しました。”, vbCritical, “エラー”
GoTo Cleanup
End If

‘ ModelDoc2からDrawingDocへのインタフェース取得
If swModel.GetType <> swDocumentTypes_e.swDocDRAWING Then
MsgBox “生成されたドキュメントが図面ではありません。”, vbCritical, “エラー”
GoTo Cleanup
End If

Set swDraw = swModel

‘ 5. 描画更新のロック(描画パイプラインを切断して高速化)
‘ 大規模アセンブリからの図面化等で劇的な効果を発揮
swModel.Lock

‘ 6. アクティブシートの取得とシートフォーマットの強制再適用
Set swSheet = swDraw.GetCurrentSheet()

If Not swSheet Is Nothing Then
Dim sheetName As String
sheetName = swSheet.GetName()

‘ SetupSheet5 パラメータ詳細:
‘ (Name, PaperSize, TemplateIn, Scale1, Scale2, FirstAngle, TemplateName, Width, Height, PropertyControl)
‘ PropertyControl = True に設定することで、モデルプロプロパティの自動同期を強制
boolStatus = swDraw.SetupSheet5( _
sheetName, _
swPaperSizes_e.swPaperA3size, _
swD32K, _
1.0, _
2.0, _
True, _
SHEET_FORMAT_PATH, _
0.42, _
0.297, _
“標準”, _
True _
)

If Not boolStatus Then
MsgBox “シートフォーマットの適用に失敗しました。”, vbExclamation, “警告”
Else
‘ フォーマットのリロードを実行し、プロパティリンクを確定させる
swSheet.ReloadTemplate False
End If
End If

‘ 7. 画面の強制再描画とロック解除
swModel.UnLock
swModel.ForceRebuild3 False

MsgBox “標準図面の作成が完了しました。”, vbInformation, “処理完了”

Cleanup:
‘ ==========================================================================
‘ COMオブジェクトの厳密な解放処理
‘ ガベージコレクションに頼らず、参照カウントを明示的にクリアする
‘ ==========================================================================
Set swSheet = Nothing
Set swDraw = Nothing
Set swModel = Nothing

‘ アプリケーション設定のリカバリ
If Not swApp Is Nothing Then
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swDisplayBatchErrors, False
Set swApp = Nothing
End If

‘ 明示的メモリ回収のトリガー
VBA.UserControl.CollectGarbage ‘ VBA内部参照の整理
End Sub

”’

”’ Windows APIを使用した高速かつ信頼性の高いファイル存在チェック
”’

Private Function SafeFileExists(ByVal filePath As String) As Boolean
If Len(filePath) = 0 Then Exit Function
SafeFileExists = (PathFileExistsW(StrPtr(filePath)) <> 0)
End Function

—

現場の知見:実装における致命的穴場と回避策

1. `SetupSheet5` の第11引数 `PropertyControl` の真実

上記コード内で利用している `SetupSheet5` APIの最後の引数(`PropertyControl`)は、`True` に設定しなければ図面枠内の文字($PRPSHEET等)がモデルのカスタムプロパティを読みに行かない。
多くのレガシーコードでは旧API(`SetupSheet4` 以前)が使われており、これが原因で「マクロで作成した図面だけ表題欄が空欄になる」というバグが発生する。必ず `SetupSheet5` 以降を使用し、明示的に `True` を渡さなければならない。

2. COM参照の解放順序とメモリリーク

VBA環境下であっても、SolidWorks APIは裏でCOM(Component Object Model)インタフェースの参照カウントを保持している。
特に `swModel.Lock` を呼び出した後に例外が発生して `swModel.UnLock` が呼ばれなかった場合、SolidWorksのUI操作が凍結したままプロセスが残存する。

これを防ぐため、コード例のように `On Error` によるハンドリングと `GoTo Cleanup` ラベルによる確実な解放ブロック を構築することが、社内運用システムの設計者には義務付けられる。

‘ 理想的な解放順序:末端のCOMオブジェクトからルートに向かって破棄
Set swSheet = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing

3. `ReloadTemplate` の非同期性と画面更新

`SetupSheet5` を実行しただけでは、内部キャッシュの図面枠描画が更新されないケースが存在する。
`swSheet.ReloadTemplate False` を呼び出すことで、ディスク上の `.slddrt` から最新の幾何要素と注記を再読み込みし、その後に `swModel.ForceRebuild3 False` を実行するのが、完全な描画を実現するプロの定石である。

—

エンタープライズ保守とインフラ観点でのシステム設計

社内システム管理者やアーキテクトがこのマクロを組織展開する場合、VBAコード内にハードコーディングされたパス(`TEMPLATE_PATH` 等)を運用してはならない。

1. 環境変数またはレジストリからの動的取得
標準テンプレートのパスは、SolidWorksのシステムオプション(`swUserPreferenceStringValue_e.swDefaultTemplateDrawing`)から取得するか、社内共有のネットワークパス(UNC)を環境変数経由で引き渡す構造にリファクタリングする。

2. UNCパス使用時の応答遅延(タイムアウト)対策
ネットワーク共有フォルダ(`\\NAS\CAD_Standards\…`)上の `.slddrt` を直接読み込む場合、Windowsのネットワークカードの省電力設定やドメイン認証の遅延により、APIがタイムアウトしてサイレントエラーを吐くことがある。
本コードに組み込んだ `PathFileExistsW`(Windows API)による事前チェックは、VBAネイティブの `Dir()` 関数よりも圧倒的に高速であり、ネットワークパスの非生存時にSolidWorksをフリーズさせずに即座に制御を戻すための防御壁となる。

—

結論

SolidWorksの図面自動生成は、単なるAPI呼び出しの羅列ではない。
テンプレートとシートフォーマットの完全な分離、COMの参照カウント管理、Windows APIを用いたファイルIOの堅牢化、そして描画パイプラインの制御。これらが一体となって初めて、現場の設計者を支える「止まらない自動化システム」が完成する。

今回提示した設計パターンとVBA blueprintをベースに、既存のレガシーマクロを見直し、堅牢なCAD自動化基盤へと再構築していただきたい。

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