【SolidWorks VBA入門】SwApp.NewDocumentを使った図面テンプレートなしの純粋なパーツファイル(.sldprt)プログラム生成
こんにちは。チーフアーキテクトの私だ。
日々の業務自動化、ご苦労様。マクロ記録ボタンを押して、生成されたゴミだらけのコードを修正する作業に辟易していないか?
「ボタン一つで、テンプレートレスの完全なクリーン状態からパーツを生成したい」
「社内ニッチな規格に合わせた初期設定(単位系・カスタムプロパティの枠組み)を、コード実行の一瞬で完了させたい」
今回は、実務の現場で『絶対にバグらない』ための堅牢なドキュメント生成術を授けよう。
マクロ記録では絶対に辿り着けない、`SldWorks.SldWorks.NewDocument` の深淵へと案内する。
—
1. なぜ「マクロ記録」の新規作成では実務で破綻するのか?
初心者が最初に犯す過ちは、ファイル新規作成をマクロ記録することだ。
記録されるコードの多くは、以下のような代物だろう。
‘ 【悪夢の生成コード例】※実務では絶対に使ってはならない
Dim swApp As Object
Set swApp = Application.SldWorks
swApp.NewDocument “C:\ProgramData\SolidWorks\SolidWorks 202X\templates\part.prt”, 0, 0, 0
このアプローチには、エンジニアリングの観点から3つの致命的な地雷が埋まっている。
1. パス依存の脆さ:
PCの環境、SolidWorksのバージョン、あるいは社内標準テンプレートの保存場所が変わった瞬間にパスが見つからずエラー落ちする。
2. テンプレート依存の不確実性:
参照するテンプレート側にあらかじめ設定された単位系や図面枠、不要なカスタムプロパティが意図せず引き継がれ、上流工程のデータクレンジングを汚染する。
3. 戻り値の不活用(ドキュメントハンドルの喪失):
生成されたドキュメントのオブジェクト(`ModelDoc2`)を正しくキャッチしていないため、直後のフィーチャ操作で「現在アクティブなドキュメント」という曖昧なグローバル状態に依存し、他ウィンドウとの競合バグを引き起こす。
我々プロフェッショナルが目指すべきは、「環境に依存せず、コードの意志で完全に制御されたパーツをメモリ上に一から召喚する」ことだ。
—
2. 堅牢なパーツ生成の核心:`NewDocument` の正しいシグネチャ
パーツをプログラムから生み出すためには、`SldWorks` オブジェクトの `NewDocument` メソッドを使用する。
まずはその仕様を正確に把握しよう。
Set swModel = swApp.NewDocument(TemplateName, PaperSize, Width, Height)
- TemplateName (String): テンプレートファイルのフルパス。実はここを空文字 `””` にすることで、SolidWorksデフォルトの内部パラメータに基づいた「純粋なドキュメント」を立ち上げることが可能だ。
- PaperSize (Long): パーツ(Part)およびアセンブリ(Assembly)の場合は `0`(無視されるが指定必須)。
- Width / Height (Double): 図面(Drawing)用の用紙サイズ。パーツの場合は `0` を指定。
しかし、空文字 `””` を渡すだけでは、環境のデフォルト単位系(インチかミリか)に依存してしまう。真に堅牢なツールとは、生成された瞬間にコード側で明示的に環境を支配するものである。
—
3. 【プロダクションコード】コピペで動く最強のパーツ生成テンプレート
以下のコードは、エラーハンドリング、ドキュメントの確実な捕捉、そして初期設定(単位系をミリグラム・ミリメートル秒:MMGSへ強制変更)までを網羅した、実務投入可能なプロダクションコードだ。
Option Explicit
‘ ==============================================================================
‘ 処理名: テンプレートレス・純粋パーツファイル新規生成プロシージャ
‘ 概要 : 外部テンプレートへの依存を排除し、完全にクリーンな.sldprtを生成する
‘ ==============================================================================
Sub CreatePurePartDocument()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim retVal As Long
‘ 1. 堅牢なSolidWorksアプリケーションインスタンスの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
On Error GoTo ErrorHandler
‘ 2. 処理速度向上のための画面描画・イベント一時停止
swApp.UserControl = True
swApp.CommandInProgress = True
‘ 3. 図面テンプレートなし(空文字指定)で新規パーツドキュメントを生成
‘ 引数: テンプレートパス, 用紙タイプ(Partsは0), 幅(0), 高さ(0)
Set swModel = swApp.NewDocument(“”, 0, 0, 0)
If swModel Is Nothing Then
Err.Raise 9999, “CreatePurePartDocument”, “パーツドキュメントの生成に失敗しました。”
End If
‘ 4. 生成直後の初期設定(最重要:単位系を MMGS [mm, g, s] に強制設定)
‘ swUnitLength = 2 (ミリメートル), swUnitMass = 10 (グラム) 等
retVal = swModel.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swUnitSystem, swUnitSystem_e.swUnitSystem_MMGS)
If retVal = 0 Then
‘ 失敗時のフォールバック処理(必要に応じてログ出力や例外処理)
Debug.Print “警告: 単位系の明示的な設定に失敗しました。デフォルト設定が適用されています。”
End If
‘ 5. ビューポートの更新とアイソメトリック表示への初期化
swModel.ViewZoomtoFit2
‘ 処理終了の通知
MsgBox “クリーンなパーツドキュメントの生成と初期化が完了しました。”, vbInformation, “自動化システム”
CleanUp:
‘ 6. 状態の復元
swApp.CommandInProgress = False
Exit Sub
ErrorHandler:
‘ 異常系ハンドリング
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“説明: ” & Err.Description, vbCritical, “システムエラー”
Resume CleanUp
End Sub
—
4. チーフアーキテクトからの設計アドバイス
このコードをただコピペするだけでなく、君たちのチームの資産として昇華させるための要点を記す。
① データベース・外部CSV連携への拡張性
このコードで生成された `swModel`(`ModelDoc2` オブジェクト)に対して、この直後に社内DBやCSVから読み込んだ製品コード(PartNumber)をカスタムプロパティとしてインジェクトする処理を繋ぎこむのが定石だ。
「空の状態からコードでメタデータを流し込み、特定のフォルダーへサイレント保存する」パイプラインを構築すれば、手動オペレーションは完全に絶滅する。
② なぜ `CommandInProgress = True` を挟むのか?
大規模なアセンブリやパーツ生成をVBAから行う際、SolidWorksが裏でGUIの再描画やプレビュー計算を走らせると、実行速度が著しく低下し、最悪の場合フリーズする。
`swApp.CommandInProgress = True` を宣言することで、SolidWorksに対して「現在APIがバッチ処理を実行中である」と伝え、無駄なUIスレッドの占有を防ぐ。プロのVBAエンジニアなら必須のテクニックだ。
—
5. おわりに
マクロ記録の奴隷になるな。APIを支配し、コードでCADを意のままに操れ。
今回解説した `NewDocument` のハンドリングと初期化の思想は、パーツファイルだけに留まらず、アセンブリや図面(Drawing)の自動生成においてもそのまま通用する強力な基盤となる。
次のステップでは、この生成されたクリーンな空間に対して、スケッチを描画し、フィーチャ(押し出しボスなど)を数学的に構築する方法を解説しよう。
君たちの開発プロジェクトの成功を祈る。健闘を祈る!
