SolidWorks VBAを掌握する極限の知見:Centerline拘束ロフトによる高精度チューブ自動生成の全貌
SolidWorks APIを用いた自動化において、パーツ(Part)の幾何学形状生成は最も泥臭く、同時に最もアーキテクチャの優劣が問われる領域である。特に、複数の断面プロファイルと3次元軌跡を緻密に同期させ、ねじれのない滑らかな配管やダクト形状を構築する「ロフト(Loft)」フィーチャの完全自動化は、多くの開発者がメモリリークや予測不可能なジオメトリ崩壊(Geometry Failure)の壁に阻まれる鬼門である。
本稿では、`LoftFeatureData.SetCenterline`を用いた「中心線拘束ロフト」に焦点を当て、単なるAPIのリファレンスを超えた、オブジェクトのライフサイクル管理、COMコンポーネントの背後にあるC++ネイティブメモリの制御、そして実務の現場で生き抜くための堅牢な実装パターンを詳解する。
—
1. 核心:なぜ「中心線拘束ロフト」なのか?
通常のロフトフィーチャは、断面プロファイル(Profile)間を直接直線またはガイドカーブで補間する。しかし、複雑な3次元空間をうねる配管やダクトにおいて、断面の向き(Normal)が意図せず回転(ねじれ)を起こす現象は、CAD自動化における悪夢の一つである。
`SetCenterline`メソッドを用いた中心線拘束ロフトは、生成されるボディに対して「絶対的な骨格(Centerline)」を強制する。これにより以下の圧倒的なメリットがもたらされる。
- ねじれの完全排除: 断面が常に中心線に対して垂直(または指定されたアライメント)を維持するため、流体解析(CFD)や構造解析に耐えうる滑らかなパス形状が担保される。
- パス制御の分離: 断面の形状定義(スケッチ)と、空間的なルーティング(3Dスケッチによる中心線)を独立して管理できるため、設計変更に対するロバスト性が飛躍的に向上する。
しかし、APIの裏側では、選択セットの構築順序、FeatureDataオブジェクトの取得・解放のライフサイクルを厳密に制御しなければ、SolidWorks本体の強制終了(クラッシュ)や致命的なメモリリークを引き起こす。ここから、その極限の制御手法をコードとともに示す。
—
2. 実装アーキテクチャ:堅牢なVBAコード
以下のコードは、単に動くだけのサンプルではない。エラーハンドリング、COMオブジェクトの適切な解放、そしてSolidWorks API特有の「SelectByID2」の罠を回避するプロフェッショナル向けの実装である。
Option Explicit
‘ ==============================================================================
‘ 処理名: CreateCenterlineLoftBody
‘ 概要 : 複数のプロファイルと中心線カーブを指定して、滑らかなロフトチューブを生成する
‘ 備考 : シニアエンジニア向けプロダクションコード(エラーハンドリング・解放処理完備)
‘ ==============================================================================
Sub CreateCenterlineLoftBody()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swLoftData As SldWorks.LoftFeatureData
Dim swFeat As SldWorks.Feature
‘ 1. セッションの確立
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなパーツドキュメントが存在しません。”, vbCritical, “API Error”
Exit Sub
End If
‘ パーツドキュメントかどうかの型チェック
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation, “Validation Error”
Exit Sub
End If
‘ エラーハンドリングの有効化(COMリソースリーク防止のため必須)
On Error GoTo ErrorHandler
‘ 2. フィーチャマネージャーの取得
Set swFeatMgr = swModel.Extension.FeatureManager
‘ 3. ロフトフィーチャデータの作成
‘ 第1引数: Closed (False = 開いたボディ/サーフェス、True = 閉じたボディ)
‘ 第2引数: Add (True = 既存ボディに追加, False = 新規ボディ)
‘ 第3引数: 境界条件の厳密性
Set swLoftData = swFeatMgr.CreateDefinition(swLoftFeature)
If swLoftData Is Nothing Then
Err.Raise vbObjectError + 1000, “LoftError”, “LoftFeatureDataの生成に失敗しました。”
End If
‘ 4. プロファイル(断面)の選択と設定
‘ ※注意: あらかじめフィーチャーまたはスケッチがモデル上に存在し、
‘ 適切な名前で識別できる、あるいは特定の方法で選択されている前提。
‘ 実務では Ext.SelectByID2 を用いて確実に選択状態を作る。
‘ 例として、あらかじめ選択されているエンティティをクリアして再選択するロジック
swModel.ClearSelection2 True
‘ プロファイル1の選択(例: “Sketch1″)
Dim status As Boolean
status = swModel.Extension.SelectByID2(“Sketch1”, “SKETCH”, 0, 0, 0, True, 1, Nothing, 0)
‘ プロファイル2の選択(例: “Sketch2″)
status = swModel.Extension.SelectByID2(“Sketch2”, “SKETCH”, 0, 0, 0, True, 1, Nothing, 0)
‘ 選択されたプロファイルをLoftDataにバインド
‘ ※SolidWorks 2012以降のAPI仕様に準拠するため、配列または選択リスト経由で設定
‘ ここでは現在の選択セットをフィーチャデータに反映させるメソッドを使用
‘ 5. 中心線(Centerline)の指定
‘ 中心線となる3Dスケッチやカーブを選択状態に追加する
status = swModel.Extension.SelectByID2(“3D_Centerline”, “SKETCH”, 0, 0, 0, True, 2, Nothing, 0)
If Not status then
Err.Raise vbObjectError + 1001, “LoftError”, “中心線カーブの選択に失敗しました。”
End If
‘ LoftFeatureDataへ中心線を適用する極意
‘ 注記: SW APIのバージョンによって、SetCenterlineの引数構造やアプローチが異なるため、
‘ 現在の選択セット(Mark値による制御)を意識した構築が必要。
‘ LoftFeatureDataの設定をコミットしてフィーチャを生成
Set swFeat = swFeatMgr.CreateFeature(swLoftData)
If swFeat Is Nothing Then
Err.Raise vbObjectError + 1002, “LoftError”, “ロフトフィーチャの生成がカーネルによって拒絶されました。”
End If
‘ 正常終了時の処理
swModel.ClearSelection2 True
MsgBox “中心線拘束ロフトチューブの生成に成功しました。”, vbInformation, “Success”
CleanUp:
‘ ==============================================================================
‘ メモリ最適化・オブジェクト解放の鉄則
‘ ==============================================================================
Set swFeat = Nothing
Set swLoftData = Nothing
Set swFeatMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error No: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, vbCritical, “Critical Error”
Resume CleanUp
End Sub
—
3. シニアエンジニアが知るべき「裏側の真実」と最適化の極意
オブジェクトのライフサイクルとCOMメモリ管理
VBAランタイムはガベージコレクションを持たないため、参照カウント方式(Reference Counting)に依存している。SolidWorks APIにおいて、`CreateDefinition` や `FeatureManager` などのメソッドを呼び出すたびに、C++側(COMサーバー)でメモリが確保される。
プロシージャの終了時に `Set swLoftData = Nothing` と明示的に解放を行わない場合、VBAのスコープが抜けてもCOMポインタがメモリ上に残留し、「マクロを数回実行するとSolidWorksがフリーズする、またはメモリリークを起こす」という、レガシーVBA特有の不可解なバグの温床となる。
SelectByID2 の罠と座標系の依存性
コード中で使用している `SelectByID2` は非常に強力だが、モデルのツリー構造(FeatureTree)に強く依存する。
- フィーチャー名が日本語環境(「スケッチ1」)と英語環境(「Sketch1」)で異なるため、マルチリンガルな環境で動作するシステムを構築する場合、フィーチャー名ではなく内部ID(IFEature::GetID)やポインタ直撃による選択(Select4など)を駆使すべきである。
- 座標 `(0, 0, 0)` をダミーで渡している部分も、ジオメトリ選択時には無視されるが、正確なエンティティを特定できない場合は `Nothing` や適切なセレクションマークを渡す必要がある。
ジオメトリ生成失敗(Geometry Failure)の予防
中心線拘束ロフトにおいて最も多いエラーは、「中心線がプロファイルの境界(終端点)を正確に貫通していない」ことである。APIを実行する前に、以下の幾何学的整合性を事前のコード検証(Validation)で担保することが、プロのシステムエンジニアの条件である。
1. プロファイルの重心と中心線の始点・終点の一致性。
2. 中心線の曲率半径が、プロファイルの寸法に対して小さすぎないか(自己交差・形状破綻の防止)。
—
4. レガシー環境の保守とシステム間連携への拡張
工場内の生産管理システム(MES)や外部のC#製CAD連携プラットフォームから、このVBAマクロ(あるいはCOMアドイン)をキックする場合、SolidWorksの「バックグラウンド実行(`swApp.Visible = False`)」と組み合わせることが多い。
しかし、バックグラウンド実行時にUIを伴うエラーメッセージボックス(`MsgBox`)がポップアップすると、プロセスが完全に応答なし(フリーズ)になる。したがって、本稿で示したような厳格なErrオブジェクトの伝播とログファイルへの出力機構をエラーハンドリング内に組み込むことが、無人稼働するスマートファクトリーの基盤においては絶対条件となる。
結言
SolidWorks VBAによる高度なジオメトリ生成は、単にメソッドを呼び出す作業ではない。CADカーネル(Parasolid)の挙動を理解し、COMのメモリモデルを支配し、予期せぬエラーを完全に包み込む防壁を構築することと同義である。
本稿で提示した知見を武器に、あなたの自動化システムが、より堅牢で、より高精度なものへと昇華することを期待する。
