SolidWorks VBAを掌握する極限の知見:SketchManager.CreateSplineによる3次元デザインスケッチの完全自動化
実務において、意匠性の高い筐体や流線型のインダストリアルデザインをプログラムから自動生成する要求に直面したことはないだろうか。定型的な直方体やシリンダーであればパラメータ駆動で容易に構築できるが、「有機的な曲面」「滑らかな3次元スプライン」をVBAから制御する領域に踏み込んだ途端、多くのエンジニアがSolidWorks APIの不可解な挙動とパフォーマンスの壁に阻まれる。
本稿では、`SketchManager.CreateSpline`を用いた自由曲面ベースの3次元デザインスケッチ自動作図手法について、オブジェクトのライフサイクル管理、メモリ最適化、そして実務に耐えうる堅牢なコード実装の極限を解説する。
—
1. 3次元スプライン自動生成におけるAPIの罠とアーキテクチャの設計思想
VBAからSolidWorksのスケッチエンティティを操作する際、最大のボトルネックとなるのは「ドキュメントとアクティブビューのコンテキスト同期」と「COMオブジェクトの適切な解放」である。
特に`CreateSpline`メソッドは、渡す配列の次元やデータ型(Variant型による3次元座標の平坦化配列)を厳密に要求する。C#などのモダンな環境であればLINQや強型付けの恩恵を受けられるが、VBA環境ではメモリレイアウトを意識した配列の構築が不可欠となる。不適切なオブジェクト参照の放置は、長時間のバッチ処理におけるメモリリークを引き起こし、最終的にはSolidWorks自体の強制終了(クラッシュ)を招く。
制御点配列(Double型配列)の構築における鉄則
`CreateSpline`に渡す座標配列は、`X1, Y1, Z1, X2, Y2, Z2…` の順序で並んだ1次元のVariant(内部データ型はDouble)でなければならない。Variant配列を動的に再定義する際は、`ReDim Preserve`のコストを最小限に抑えるアルゴリズムを採用する。
—
2. 実装コード:3次元スプライン自動作図プロシージャ
以下に、実務のシステム間連携(CSVや外部データベースからの座標インポートを想定)において即座に流用可能な、堅牢かつ洗練されたVBAコードを示す。
Option Explicit
‘ ==============================================================================
‘ 処理名: 3次元スプライン自動作図エンジン
‘ 概要: 外部から渡された制御点群を元に、アクティブパーツ内に3Dスケッチスプラインを生成する
‘ ==============================================================================
Sub ExecuteAdvanced3DSplineGeneration()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSketchMgr As SldWorks.SketchManager
Dim boolstatus As Boolean
‘ 1. アプリケーションコンテキストの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation, “警告”
Exit Sub
End If
‘ 2. パーツドキュメントであることの型安全性の担保
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbCritical, “型不一致エラー”
Exit Sub
End If
Set swSketchMgr = swModel.SketchManager
‘ 3. トランザクション処理の開始(パフォーマンス向上とロールバック担保)
swModel.ClearSelection2 True
‘ 3Dスケッチモードへ強制移行(既存のスケッチが開いている場合は閉じる)
If swSketchMgr.IsSketchEditing Then
swSketchMgr.Insert3DSketch True
End If
swSketchMgr.Insert3DSketch True ‘ 3Dスケッチ開始
On Error GoTo ErrorHandler
‘ 4. 制御点座標データ(X, Y, Z)の生成(実務ではここで外部DBやCSVからデータを読み込む)
Dim vPoints As Variant
vPoints = GenerateControlPointsDataset()
‘ 5. スプライン生成の実行
Dim swSpline As SldWorks.SketchSegment
Set swSpline = swSketchMgr.CreateSpline(vPoints)
If swSpline Is Nothing Then
Err.Raise vbObjectError + 1000, “CreateSpline”, “スプラインの生成に失敗しました。座標データを確認してください。”
End If
‘ 6. 3Dスケッチの終了と再構築
swSketchMgr.Insert3DSketch True
swModel.ForceRebuild3 True
‘ 正常終了時のクリーンアップ
GoTo CleanUp
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “実行時例外”
‘ 異常終了時のスケッチコンテキスト破棄
If Not swSketchMgr Is Nothing Then
If swSketchMgr.IsSketchEditing Then
swSketchMgr.Insert3DSketch False ‘ 変更を破棄して閉じる
End If
End If
CleanUp:
‘ COMオブジェクトの明示的解放(メモリリークの完全防止)
Set swSpline = Nothing
Set swSketchMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
End Sub
‘ ==============================================================================
‘ 内部関数: 制御点データセットのモック生成(X, Y, Zの1次元配列を返す)
‘ ==============================================================================
Private Function GenerateControlPointsDataset() As Variant
Dim pts() As Double
Dim i As Long
Dim numPoints As Long
numPoints = 10 ‘ 制御点数
ReDim pts(0 to (numPoints 3) – 1)
‘ 螺旋状の3次元スプライン座標を数式で自動生成(単位:メートル)
Dim t As Double
For i = 0 To numPoints – 1
t = CDbl(i) / 2.0
pts(i 3 + 0) = 0.05 Cos(t 3.14159265358979) ‘ X座標
pts(i 3 + 1) = 0.05 Sin(t 3.14159265358979) ‘ Y座標
pts(i 3 + 2) = 0.02 CDbl(i) ‘ Z座標 (高さ方向)
Next i
GenerateControlPointsDataset = pts
End Function
—
3. チーフアーキテクトが伝授する「極限の知見」とパフォーマンスチューニング
上記のコードは基本を押さえたものだが、大規模なアセンブリや何千もの制御点を持つ複雑な意匠面を扱うシステムにおいては、さらに踏み込んだアーキテクチャが必要となる。
A. 画面描画の凍結(ScreenUpdatingの罠)
VBAの`Application.ScreenUpdating = False`はExcel VBAでは常識だが、SolidWorks APIにおいては効果が限定的である。SolidWorksのグラフィックエンジン(OpenGLコンテキスト)を完全に沈黙させるには、モデルのビューポート更新を抑制するAPIを活用するか、フィーチャーツリーのプレビューを一時的に無効化する処理を挟む必要がある。
大量のスプラインを連続生成する場合、生成ごとにビューが再描画されるとパフォーマンスが数分の一に低下するため、トランザクション中は選択セットのクリアと再構築のタイミングを厳密に制御せよ。
B. COMオブジェクトの参照カウントとメモリ管理
VBAはガベージコレクタを持たないため、`Set obj = Nothing` を明示的に行わない限り、COMラッパーがメモリ上に残存し続ける。特にループ内で `CreateSpline` や関連する拘束(Relation)を動的に付与する処理を書く場合、ループのスコープごとにローカル変数を確実に破棄しなければ、SolidWorksのプロセスが徐々に肥大化し、最終的にOut of Memoryを引き起こす。
C. レガシー環境・外部システム連携への拡張性
今回のコードはVBA単体で完結しているが、実際のプラント設計や自動車の意匠設計現場では、C#やPythonで最適化した座標群をJSON等で出力し、それをVBA(あるいはCOMアドイン)経由でSolidWorksに流し込むアーキテクチャが主流である。
配列データをVariant型経由で確実に受け渡すインターフェース設計を維持することで、将来的な.NETへの移行(COM Interop化)もシームレスに行うことが可能となる。
—
総括
SolidWorks VBAによる3次元スプラインの自動作図は、単なる「コードの自動化」にとどまらない。背後にある数学的モデル(制御点配列)、SolidWorksのドキュメントライフサイクル、そしてCOMプログラミングの厳格なメモリ管理の3つが完璧に噛み合ったとき初めて、実務に耐えうる「真の自動化システム」が構築できる。
妥協のない設計とコード品質をもって、日々のエンジニアリングを極限まで効率化してほしい。
