序文:ジオメトリの「創世記」を制御せよ
SolidWorks APIの世界において、`PartDoc`(パーツドキュメント)の初期化は、すべての自動化プロセスの起点、いわば「創世記」である。しかし、多くのエンジニアがこの第一歩を軽んじ、数千行のコードを積み上げた後に「原因不明のクラッシュ」や「メモリリーク」という報いを受ける。
単に `swApp.NewDocument` を呼び出すだけなら、公式リファレンスを読めば済む。だが、PLM(製品ライフサイクル管理)との連携や、数万点の部品を扱う大規模アセンブリの自動生成という極限の環境において、我々が求めるのは「動くコード」ではなく「決して折れない鋼のロジック」だ。
本稿では、レガシー環境の保守から最新のシステム間連携までを見据え、Windows APIを併用したパス制御、そしてSolidWorksのCOMオブジェクトを完全に掌握するための初期化プロトコルを詳解する。
—
1. テンプレート・トラップ:暗黙の依存を排除せよ
新規ドキュメント作成時、多くの初心者が陥る罠が「デフォルトテンプレートへの依存」である。
‘ 典型的な初心者のコード
Set swModel = swApp.NewDocument(“C:\Templates\Part.prtdot”, 0, 0, 0)
このコードは、そのパスにファイルが存在し、かつ権限が許可されているという「希望的観測」に基づいている。エンタープライズ環境では、テンプレートパスはレジストリや設定ファイルで動的に管理されるべきだ。我々シニアは、`GetUserPreferenceStringValue` を用いて、現在のセッションが正しく参照しているテンプレートを動的に取得する。
さらに、拡張子の処理をVBAの脆弱な `InStr` や `Right` 関数に委ねてはならない。パス操作には Windows API (`shlwapi.dll`) を導入し、OSレベルでの堅牢性を確保するのが作法だ。
—
2. Windows API によるパス・エンジニアリング
ファイル保存時、拡張子の有無を判定し、適切に付与する処理は、システム間連携において極めて重要だ。拡張子が重複したり、欠落したりすれば、ダウンストリームのERP連携で致命的なエラーを引き起こす。
ここでは、`PathFindExtension` を利用したプロフェッショナルなパス処理を組み込む。
‘ Windows APIの宣言
Private Declare PtrSafe Function PathFindExtension Lib “shlwapi.dll” Alias “PathFindExtensionA” (ByVal pszPath As String) As LongPtr
Private Declare PtrSafe Function PathAddExtension Lib “shlwapi.dll” Alias “PathAddExtensionA” (ByVal pszPath As String, ByVal pszExt As String) As Long
—
3. 実装:堅牢なる PartDoc 初期化プロトコル
以下に示すコードは、単なるサンプルではない。例外処理、メモリ管理、そしてパスの整合性チェックを統合した、プロダクションレベルのアーキテクチャである。
Option Explicit
‘ Windows API: パス操作用
Private Declare PtrSafe Function PathAddExtension Lib “shlwapi.dll” Alias “PathAddExtensionA” (ByVal pszPath As String, ByVal pszExt As String) As Long
”’
”’
Public Sub InitializeExtremePartDoc()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim templatePath As String
Dim savePath As String
Dim errors As Long
Dim warnings As Long
On Error GoTo ErrorHandler
‘ 1. SolidWorks インスタンスの捕捉
‘ 既存のインスタンスを掴むか、新規に立ち上げるかの判断は、
‘ システムのライフサイクル設計に依存する。
Set swApp = Application.SldWorks
‘ 2. システム設定からデフォルトテンプレートパスを動的に取得
‘ ハードコードは「罪」である。
templatePath = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
If templatePath = “” Then
Err.Raise vbObjectError + 513, “PartDocInitialize”, “有効なテンプレートパスが見つかりません。”
End If
‘ 3. 新規ドキュメントの生成
‘ swDocPART = 1 (定数を使用すること)
Set swModel = swApp.NewDocument(templatePath, 0, 0, 0)
If swModel Is Nothing Then
Err.Raise vbObjectError + 514, “PartDocInitialize”, “ドキュメントの生成に失敗しました。”
End If
‘ 4. PartDoc オブジェクトへのキャスト
‘ ModelDoc2 は抽象的なインターフェースであり、パーツ固有の操作には PartDoc が必要。
Set swPart = swModel
‘ — ジオメトリ生成処理 (中略) —
‘ ここで押し出しや回転などのフィーチャ操作を行う。
‘ 5. 拡張子なしパスのハンドリングと保存
‘ 例: ユーザーや外部システムから与えられた「拡張子なし」のパス
savePath = “C:\Output\Project_Alpha_Component_001”
‘ 拡張子 “.SLDPRT” を安全に付与する (Windows API 的アプローチのシミュレーション)
‘ VBA内部では単純結合でも可能だが、API呼出によりパスの正当性を担保する思考が重要。
If InStr(1, savePath, “.SLDPRT”, vbTextCompare) = 0 Then
savePath = savePath & “.SLDPRT”
End If
‘ 6. 静的な保存実行
‘ swSaveAsOptions_Silent を使用し、自動化を阻害するダイアログを徹底排除。
Dim status As Boolean
status = swModel.Extension.SaveAs(savePath, swSaveAsVersion_e.swSaveAsCurrentVersion, _
swSaveAsOptions_e.swSaveAsOptions_Silent, _
Nothing, errors, warnings)
If Not status Then
Debug.Print “保存失敗。Errorコード: ” & errors
Else
Debug.Print “正常に保存完了: ” & savePath
End If
CleanUp:
‘ 7. オブジェクトの明示的解放
‘ SolidWorks VBAにおいて、Set Nothing は「おまじない」ではなく「義務」である。
‘ COMの参照カウントを正しく管理しなければ、SolidWorksプロセスがゾンビ化する。
Set swPart = Nothing
Set swModel = Nothing
‘ swApp は外部アプリケーションとして存続させる場合が多い。
Exit Sub
ErrorHandler:
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical, “チーフアーキテクトからの警告”
Resume CleanUp
End Sub
—
4. チーフアーキテクトの知見:メモリとパフォーマンス
COMオブジェクトの生存期間(Lifetime)
SolidWorks APIはCOMベースである。VBAのスコープを抜ければ自動的に解放されると信じるのは甘い。特に `ModelDoc2` や `SelectionMgr` は、明示的に `Nothing` を代入しなければ、SolidWorks本体のメモリ使用量を不必要に押し上げ、最終的には `OutOfMemory` 例外を引き起こす。ループ内でドキュメントを生成・破棄する場合は、各サイクルでの完全な解放を徹底せよ。
ファイルパスの「正規化」
本稿では拡張子の付与に触れたが、ネットワークパス(UNCパス)や、パス長制限(MAX_PATH: 260文字)も考慮すべきだ。最新のWindows環境では長大なパスが許容される設定もあるが、SolidWorks内部の古いDLLがそれを処理できずクラッシュすることがある。自動生成されるパスは、可能な限り短く、そしてユニークであることを設計段階で担保せよ。
システム間連携の要諦
パーツファイルの新規作成を自動化する際、そのファイル名は単なる名前ではなく「プライマリキー」である場合が多い。DB(SQL Serverなど)と連携する場合、ファイル保存の成否をトランザクションとして管理し、保存に失敗した場合はDB側のレコードもロールバックするような、一貫性のある設計を心がけてほしい。
結言
`PartDoc` を初期化するという行為は、単なるプログラミング作業ではない。それは、デジタルの世界に物理的な裏付けを持つ「実体」を定義する厳格な儀式である。今回解説した堅牢な初期化プロセスとWindows APIの活用は、あなたの開発するシステムを「便利ツール」から「基幹インフラ」へと昇華させるだろう。
コードの背後にある、OSとCOMの挙動を常に意識せよ。それが伝説的なエンジニアへの唯一の道である。
