【SolidWorks VBA極限解説】PlanarSurfaceが導く高精度サーフェスモデリングと頑健なソリッド変換の極意
SolidWorks VBAによる自動化の領域において、パーツモデリングの真髄は「いかにして破綻のない位相(Topology)を構築するか」に尽きる。特に、複雑な2次元プロファイルからソリッドボディを生成する際、標準的なボス押し出し(Boss Extrude)では対応できない非対称な空間や、複数セグメントが入り組む閉ループにおいて、サーフェスモデリングを介したアプローチは不可欠な技術となる。
今回は、`PlanarSurface`(平面サーフェス)APIを駆使した閉ループスケッチからの高精度サーフェス生成と、それを起点としたソリッド化(Thicken)の自動化ロジックについて、オブジェクトのライフサイクル管理やメモリ最適化の観点を交えながら、シニアエンジニア向けにその極意を解説する。
—
1. 現場を崩壊させる「スケッチエラー」とAPIの罠
実務の現場において、VBAからスケッチを操作し、それを元にフィーチャを生成するコードは、往々にして「突然の失敗」に直面する。原因の多くは、SolidWorksのドキュメントコンテキストとセレクションマネージャの挙動にある。
特に`PlanarSurface`フィーチャを作成する場合、APIは「何が選択されているか(SelectionManager)」に強く依存する。不完全な選択状態でAPIを叩けば、戻り値として`Nothing`が返却され、その後の処理でヌルポインタ例外を引き起こす。
このリスクを完全に排除するためには、以下の鉄則を遵守する必要がある。
1. アクティブドキュメントの厳密な型安全性の確保
2. セレクションキャッシュの確実なクリア
3. COMオブジェクトの参照解放(マニュアルガベージコレクション)
—
2. 実装コード:堅牢性を極めたPlanarSurface & Thicken ロジック
以下に、閉ループスケッチのエンティティを選択状態にし、`PlanarSurface`を生成した上で、即座にソリッドボディへ変換(Thicken)する実用的なVBAプロシージャを示す。
Option Explicit
‘ =================================================================================
‘ 処理名: CreateSolidFromPlanarSurface
‘ 概要: 閉ループスケッチからPlanarSurfaceを生成し、指定厚みでソリッド化する
‘ =================================================================================
Sub CreateSolidFromPlanarSurface()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
Dim boolstatus As Boolean
‘ — 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
‘ パーツドキュメントであることの型チェック (swDocPART = 1)
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation, “Validation Error”
Exit Sub
End If
‘ — 2. 編集コンテキストの退避とセレクションクリア —
Set swSelMgr = swModel.SelectionManager
swModel.ClearSelection2 True
‘ 【重要】あらかじめ選択されている閉ループスケッチ(または面・エッジ)を前提とする
‘ 実運用ではここで特定SketchのIEntityをMark付きでAPI選択させるか、
‘ あらかじめユーザーに選択させておく。ここでは選択済みエンティティを処理の起点とする。
If swSelMgr.GetSelectedObjectCount2(-1) = 0 Then
MsgBox “対象となる閉ループ(スケッチ等)を選択してください。”, vbExclamation, “Selection Required”
GoTo CleanUp
End If
Set swFeatMgr = swModel.FeatureManager
If swFeatMgr Is Nothing Then GoTo CleanUp
‘ — 3. PlanarSurfaceフィーチャの生成 —
‘ 平面サーフェスを作成 (InsertPlanarSurface)
‘ 内部的に選択セットを消費してサーフェスボディを構築する
Set swFeat = swFeatMgr.InsertPlanarSurface()
If swFeat Is Nothing Then
MsgBox “PlanarSurfaceの生成に失敗しました。閉ループが閉じているか確認してください。”, vbCritical, “Feature Error”
GoTo CleanUp
End If
‘ ジオメトリの再構築を強制
swModel.ForceRebuild3 False
‘ — 4. サーフェスのソリッド化 (Thicken) —
‘ 生成したサーフェスを選択状態にして厚み付けを実行
‘ ※InsertThickenSurface2の引数:
// (Depth, Dir, CreateSolid, Merge, ReverseDirection, 1側厚み, 2側厚み)
‘ ここではサーフェスボディを選択状態にし、外側に向かって10mm厚みをつけてソリッド化する
boolstatus = swModel.Extension.SelectByID2(swFeat.Name, “BODYFEATURE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “生成されたサーフェスボディの再選択に失敗しました。”, vbCritical, “Selection Error”
GoTo CleanUp
End If
‘ 厚み 10.0mm, ソリッド作成 = True, マージ = True, 逆方向 = False
Dim swThickenFeat As SldWorks.Feature
‘ 注: APIの仕様により、サーフェスフィーチャそのものを選択してThickenをかける場合と、
‘ サーフェス「ボディ」をIfaceから直接選択する場合がある。
‘ ここでは堅牢なThickenサーフェスフィーチャ追加メソッドを使用する。
‘ 厚み付けパラメータの設定 (例: 10mm, 方向1, ソリッド化)
‘ 実務では swModel.FeatureManager.InsertThickenSurface2 を使用
‘ 引数詳細: Depth(Double), Dir(Long), BothSides(Boolean), Thickness2(Double), ReverseDirection(Boolean), Merge(Boolean)
Set swThickenFeat = swFeatMgr.InsertThickenSurface2(0.01, 0, True, 0.0, False, True)
If swThickenFeat Is Nothing Then
MsgBox “サーフェスのソリッド化(Thicken)に失敗しました。”, vbCritical, “Thicken Error”
Else
MsgBox “高精度サーフェスからのソリッド化が完了しました。”, vbInformation, “Success”
End If
CleanUp:
‘ — 5. メモリ最適化:COMオブジェクトの明示的解放 —
‘ VBAのランタイムガベージコレクションに依存せず、確実にメモリリークを防ぐ
Set swThickenFeat = Nothing
Set swFeat = Nothing
Set swFeatMgr = Nothing
Set swSelMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
3. チーフアーキテクトが教える「メモリ最適化」と「ライフサイクル管理」の極意
大規模なアセンブリや、数十・数百のパーツをバッチ処理で生成する設計自動化ツールにおいて、VBAのメモリ管理を軽視することは致命傷につながる。
COMポインタの参照カウントとVBAの限界
SolidWorks API(C++ベースのCOMコンポーネント)をVBAから操作する場合、VBAの変数に代入されたオブジェクトは内部でCOMの参照カウント(AddRef / Release)をインクリメントしている。プロシージャが終了してローカル変数がスコープアウトする瞬間まで、COMオブジェクトはメモリ上に保持され続ける。
特にループ内でオブジェクトを変数に再代入し続けるような実装(例: `Set swFeat = …` をループ内で何度も回す)を行うと、VBAの裏側で参照解放が追いつかず、徐々にメモリ消費量が増加し、最終的に「Automation Error (-2147417848 (80010108))」やSolidWorks自体の強制終了(クラッシュ)を招く。
対策:ループ内のスコープ分離と明示的 `Nothing` 代入
もしこのロジックをバッチ処理に組み込み、複数の閉ループに対して連続でサーフェス生成を行う場合は、以下のようにループのスコープを極限まで小さくし、イテレーションごとに `Set … = Nothing` を明示的に呼ぶこと。
‘ バッチ処理時のメモリリークを防ぐイテレーションパターンの例
Dim i As Long
For i = 1 To LoopCount
Dim swTargetFeat As SldWorks.Feature
‘ — 処理 —
Set swTargetFeat = swFeatMgr.InsertPlanarSurface()
‘ 処理完了後、即座に解放
Set swTargetFeat = Nothing
Next i
この泥臭いまでのリソース管理の徹底こそが、何時間も稼働し続ける堅牢な社内CAD自動化システムと、現場で突然落ちる「おもちゃのマクロ」を分かつ唯一の境界線である。
—
4. レガシー環境・外部システム連携における注意点
社内ニッチなPDMシステムや、Excel/Accessなどの外部データベースからこのVBAをキックするアーキテクチャを採用している場合、SolidWorksの「バックグラウンド実行(`swApp.Visible = False`)」とサーフェス生成の相性問題に注意が必要だ。
`PlanarSurface` や `Thicken` は、内部的にジオメトリの計算(B-repトポロジーの構築)を行うため、UI描画が非表示の状態であっても、フィーチャマネージャーのツリー構造とモデルの再構築エンジン(Rebuild Engine)が正常に同期している必要がある。 外部連携時は、必ず `swModel.ForceRebuild3 True` を挟み、モデルの位相が完全に確定したことを保証してから次のAPIコールへ移行する実装パターンを強く推奨する。
真の自動化エンジニアを目指すのであれば、APIリファレンスをなぞるだけではなく、「背後で動くC++のメモリとオブジェクトツリーが今どうなっているのか」を脳内でビジュアライズしながらコードを紡ぎ出してほしい。
