【実務・中級編】【サーフェスモデリング】PlanarSurfaceを使った閉ループスケッチからの高精度平面サーフェス生成とソリッド変換 – SolidWorks VBA解析バイブル

スポンサーリンク

サーフェスを経由する極限のソリッドモデリング:PlanarSurfaceとThickenによる高精度自動化アーキテクチャ

SolidWorks APIを用いたCAD自動化において、多くのエンジニアが最初に直面する壁——それが「複雑な押出ボス/カット(Extrusion)の失敗」だ。

幾何学的に複雑なプロファイル、微小なセグメントを含む多角形、あるいは多重トポロジーを持つスケッチに対して、ダイレクトにソリッドの押出処理を行うと、パラメトリックの依存関係が崩れ、わずかな寸法変更でフィーチャ生成が失敗する。

実務に耐えうる頑健な自動化を実現するプロフェッショナルは、「スケッチ → 平面サーフェス(PlanarSurface) → 厚み付け(Thicken)によるソリッド昇華」という二段階アプローチを好む。

本稿では、この「サーフェス経由のソリッド生成」を、バグを極限まで排除した堅牢なSolidWorks VBAコードとともに徹底解説する。マクロ記録から抜け出せない初学者コードとの決定的な差を、アーキテクチャの視点から解き明かそう。

1. なぜ「直接押出」ではなく「PlanarSurface → Thicken」なのか?

幾何計算エンジン(Parasolid)の挙動を理解する

SolidWorksのカーネルであるParasolidにおいて、ソリッドの直接押出は「スケッチのトポロジー検証」と「3次元立体の境界表現(B-Rep)構築」を同時に行う重い処理だ。スケッチ内に微小な隙間や自己交差、あるいは冗長なジオメトリが存在すると、押出フィーチャの生成ロジックは即座に例外をスローするか、壊れたボディを生成する。

一方で、PlanarSurface(平面サーフェス)は、指定された閉ループの「2Dトポロジーの評価」のみに特化している。

1. トポロジー検証の切り離し: まず`PlanarSurface`で閉ループが正しく面を張れるかを確認。
2. 決定論的な3次元化: 成功したサーフェスに対して`Thicken`を実行し、法線ベクトル方向に機械的に厚みを付与する。

この分離アプローチにより、幾何学的失敗の発生箇所が明確になり、自動化スクリプト内での例外トラップが劇的に容易になる。

2. 実務で「動かないコード」が生まれる3つの死角

マクロ記録が生成するVBAコードをそのまま本番環境(あるいはExcel DB連携ツール)に投入すると、必ず不具合が発生する。原因は以下の3点に集約される。

① UI依存の`SelectByID2`による選択失敗

マクロ記録は `SelectByID2(“Sketch1”, “SKETCH”, …)` のように、文字列名とスクリーン座標に依存した選択を行う。しかし、バッチ処理やグラフィック非描画モード、あるいはフィーチャ名の言語依存(英語OS環境と日本語OS環境の差)によって、この参照は簡単に途切れる。
プロの解法: ポインタ(`IFeature` オブジェクト)を割り当て、`Feature.Select2` メソッドで明示的に選択状態を制御する。

② スケッチの閉塞性チェック欠如

スケッチが「閉じたループ(Closed Loop)」になっていない状態で `InsertPlanarRefSurface` を呼び出すと、APIは静かに失敗し `Nothing` を返すか、ランタイムエラーを引き起こす。
プロの解法: サーフェス生成前に `Sketch.GetSketchSegments` から幾何公差を検証するか、APIの戻り値 `Feature` オブジェクトのヌルチェックを厳格に行う。

③ 法線ベクトル(Normal Vector)とThicken方向の未制御

サーフェスには表裏(法線方向)が存在する。`FeatureThicken` を実行する際、厚み付けの方向(Side1, Side2, Both)と法線反転オプション(`ReverseDirection`)の指定を固定値でハードコードすると、スケッチを描画した平面の向きによって意図しない方向にソリッドが成長する。

3. プロダクション環境用 完全自動化VBAコード

以下は、実務の大量処理ツールやDB連携システムにそのまま組み込める、極めて堅牢なプロダクションコード例だ。

機能概要

  • 新規パーツを作成し、フロント平面に複雑な閉ループ(外形+内郭ホール)を生成。
  • スケッチから高精度な `PlanarSurface` を生成。
  • サーフェスに対して `Thicken` を適用し、ソリッドボディ化。
  • UI描画を一時凍結して超高速処理を実現し、例外時にはリソースを確実に解放。

‘ ==============================================================================
‘ Module: ModPlanarSurfaceToSolid
‘ Description: 閉ループスケッチからの高精度PlanarSurface生成およびThickenによるソリッド化
‘ Architecture: SolidWorks Direct API Access (No UI dependency)
‘ Author: Lead Automation Architect
‘ ==============================================================================
Option Explicit

‘ SolidWorks API Constant Definitions
Private Const swDocPART As Long = 1
Private Const swSelectOptionDefault As Long = 0
Private Const swMbWarning As Long = 1
Private Const swMbInformation As Long = 2
Private Const swMbOkOnly As Long = 0

‘ Thicken API Direction Constants
Private Const swThickenSide1 As Long = 0
Private Const swThickenSide2 As Long = 1
Private Const swThickenBoth As Long = 2

Public Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swModelExt As SldWorks.ModelDocExtension
Dim swFeatMgr As SldWorks.FeatureManager

On Error GoTo ErrorHandler

‘ 1. SolidWorksインスタンスの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub

‘ 2. 新規パーツドキュメントの生成
‘ ※環境の標準テンプレートパスを自動取得するロジックを実装
Dim defaultTemplate As String
defaultTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
If defaultTemplate = “” Then
MsgBox “標準パーツテンプレートが見つかりません。”, vbCritical, “エラー”
Exit Sub
End If

Set swModel = swApp.NewDocument(defaultTemplate, swDocPART, 0, 0)
If swModel Is Nothing Then
MsgBox “ドキュメントの作成に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If

Set swModelExt = swModel.Extension
Set swFeatMgr = swModel.FeatureManager
Set swPart = swModel

‘ 3. パフォーマンス最適化:UI描画およびフィーチャツリー更新の凍結
Call OptimizationStart(swModel)

‘ 4. 閉ループスケッチの生成
Dim swSketchFeat As SldWorks.Feature
Set swSketchFeat = CreateClosedProfileSketch(swModel, swModelExt)
If swSketchFeat Is Nothing Then
Err.Raise vbObjectError + 5101, “CreateClosedProfileSketch”, “スケッチ生成に失敗しました。”
End If

‘ 5. PlanarSurface(平面サーフェス)の生成
Dim swSurfaceFeat As SldWorks.Feature
Set swSurfaceFeat = CreatePlanarSurfaceFromSketch(swModel, swSketchFeat)
If swSurfaceFeat Is Nothing Then
Err.Raise vbObjectError + 5102, “CreatePlanarSurfaceFromSketch”, “PlanarSurfaceの生成に失敗しました。スケッチが閉じた平面ループか確認してください。”
End If

‘ 6. Thicken(厚み付け)によるソリッド化
Dim thickness As Double
thickness = 0.005 ‘ 5mm (SI単位系: メートル表現)

Dim swSolidFeat As SldWorks.Feature
Set swSolidFeat = ConvertSurfaceToSolidThicken(swModel, swFeatMgr, swSurfaceFeat, thickness, swThickenSide1)
If swSolidFeat Is Nothing Then
Err.Raise vbObjectError + 5103, “ConvertSurfaceToSolidThicken”, “Thicken処理に失敗しました。”
End If

‘ 7. 後処理とビューの最適化
Call OptimizationEnd(swModel)
swModel.ViewZoomtofit2

MsgBox “PlanarSurfaceからソリッドへの昇華が正常に完了しました。”, vbInformation + swMbOkOnly, “成功”
Exit Sub

ErrorHandler:
‘ 異常終了時のリカバリ
If Not swModel Is Nothing Then Call OptimizationEnd(swModel)
MsgBox “致命的エラーが発生しました: [” & Err.Number & “] ” & Err.Description, vbCritical, “処理中断”
End Sub

‘ ==============================================================================
‘ Function: CreateClosedProfileSketch
‘ Summary: 基準平面上に外周と内郭ホールを持つ閉じた2Dスケッチを構築する
‘ ==============================================================================
Private Function CreateClosedProfileSketch(ByRef swModel As SldWorks.ModelDoc2, ByRef swModelExt As SldWorks.ModelDocExtension) As SldWorks.Feature
Dim skMgr As SldWorks.SketchManager
Set skMgr = swModel.SketchManager

‘ Front Plane(前準面)を選択
Dim boolStatus As Boolean
boolStatus = swModelExt.SelectByID2(“Front Plane”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolStatus Then
‘ 言語違い(日本語版)のリカバリ処理
boolStatus = swModelExt.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
End If
If Not boolStatus Then Exit Function

‘ スケッチ開始
skMgr.InsertSketch True
skMgr.AddToDB = True ‘ グラフィック更新をバイパスして座標を直接注入(高速化)

‘ 外郭プロファイル(100mm x 50mmの四角形)
‘ 単位変換: 1mm = 0.001m
skMgr.CreateCornerRectangle -0.05, 0.025, 0, 0.05, -0.025, 0

‘ 内郭プロファイル(径20mmの円=肉抜きホール)
skMgr.CreateCircle 0, 0, 0, 0.01, 0, 0

skMgr.AddToDB = False
skMgr.InsertSketch True ‘ スケッチ確定

‘ 作成されたスケッチフィーチャの参照を取得
Set CreateClosedProfileSketch = swModel.FirstFeature
Do While Not CreateClosedProfileSketch Is Nothing
If CreateClosedProfileSketch.GetTypeName2() = “ProfileSketch” Then
‘ 最新のスケッチを取得
Exit Function
End If
Set CreateClosedProfileSketch = CreateClosedProfileSketch.GetNextFeature
Loop
End Function

‘ ==============================================================================
‘ Function: CreatePlanarSurfaceFromSketch
‘ Summary: 明示的にスケッチを選択し、PlanarSurfaceフィーチャを生成する
‘ ==============================================================================
Private Function CreatePlanarSurfaceFromSketch(ByRef swModel As SldWorks.ModelDoc2, ByRef swSketchFeat As SldWorks.Feature) As SldWorks.Feature
Dim swModelExt As SldWorks.ModelDocExtension
Set swModelExt = swModel.Extension

‘ クリア選択
swModel.ClearSelection2 True

‘ ポインタ経由で確実にスケッチを選択
Dim boolStatus As Boolean
boolStatus = swSketchFeat.Select2(False, 0)
If Not boolStatus Then Exit Function

‘ PlanarSurfaceの実行(API: InsertPlanarRefSurface)
Dim swFeatMgr As SldWorks.FeatureManager
Set swFeatMgr = swModel.FeatureManager

Set CreatePlanarSurfaceFromSketch = swFeatMgr.InsertPlanarRefSurface()
End Function

‘ ==============================================================================
‘ Function: ConvertSurfaceToSolidThicken
‘ Summary: 平面サーフェスに対して厚み付けを行い、ソリッドボディ化する
‘ ==============================================================================
Private Function ConvertSurfaceToSolidThicken( _
ByRef swModel As SldWorks.ModelDoc2, _
ByRef swFeatMgr As SldWorks.FeatureManager, _
ByRef swSurfaceFeat As SldWorks.Feature, _
ByVal thicknessValue As Double, _
ByVal thickenSide As Long) As SldWorks.Feature

swModel.ClearSelection2 True

‘ サーフェスフィーチャを選択 (Mark = 1 はThicken APIに必要なセレクションマーク)
Dim boolStatus As Boolean
boolStatus = swSurfaceFeat.Select2(False, 1)
If Not boolStatus Then Exit Function

‘ FeatureThicken3 の引数構成:
‘ Thickness, TargetSide, ThicknessDirection, Merge, MakeSolid, ReverseDirection
‘ ※ MakeSolid = True でサーフェス本体を消去してソリッドへ全置換
Dim newFeat As SldWorks.Feature
Set newFeat = swFeatMgr.FeatureThicken3( _
thicknessValue, _
thickenSide, _
0, _
True, _
True, _
False)

Set ConvertSurfaceToSolidThicken = newFeat
End Function

‘ ==============================================================================
‘ Helper Subroutines: グラフィック描画およびパイプラインの高速化制御
‘ ==============================================================================
Private Sub OptimizationStart(ByRef swModel As SldWorks.ModelDoc2)
Dim swModView As SldWorks.ModelView
Set swModView = swModel.ActiveView
If Not swModView Is Nothing Then swModView.EnableGraphicsUpdate = False
swModel.FeatureManager.EnableFeatureTree = False
End Sub

Private Sub OptimizationEnd(ByRef swModel As SldWorks.ModelDoc2)
Dim swModView As SldWorks.ModelView
Set swModView = swModel.ActiveView
If Not swModView Is Nothing Then swModView.EnableGraphicsUpdate = True
swModel.FeatureManager.EnableFeatureTree = True
swModel.ForceRebuild3 True
End Sub

4. コードの深層解説とプロダクション運用の鉄則

上記のコードには、過酷な実務自動化の現場で磨かれた「落とし穴を回避する設計パターン」が組み込まれている。

① `AddToDB = True` によるジオメトリ直接注入

スケッチを描画する際、`skMgr.AddToDB = True` を宣言している点に注目してほしい。通常、API経由で線や円を描くたびにSolidWorksは内部でソリューション計算と画面描画を行う。`AddToDB` を `True` に切り替えることで、これらの描画イベントをバイパスし、メモリ上のデータベースへ幾何データを直接注入できる。大スケールのデータ処理において、実行速度は数倍から数十倍に跳ね上がる。

② `Select2` とマーク値(Mark)の精密制御

`ConvertSurfaceToSolidThicken` 内で、サーフェスを選択する際に `swSurfaceFeat.Select2(False, 1)` と第2引数に `1`(Mark)を渡している。
SolidWorks APIのフィーチャ生成メソッドの多くは、単に「選択されているオブジェクト」を見るのではなく、「特定のマーク値を持って選択されているオブジェクト」を識別して処理を行う。マクロ記録ではこのマーク値が暗黙的に処理されるためブラックボックス化しやすいが、明示的に指定することがバグをゼロにする鍵だ。

③ `FeatureThicken3` の `MakeSolid = True`

サーフェスからソリッドを作成するとき、`MakeSolid` パラメータを `True` に設定することで、元の平面サーフェスが自動的に消費され、リソースリーク(使われないサーフェスボディの残留)を防ぐことができる。これにより、ツリー構造がクリーンに保たれ、後のフィーチャ参照崩れを未然に防げる。

5. 大量処理・データベース連携におけるパフォーマンス最適化

CSVや外部データベース(SQL Server / Excel)から輪郭座標を連続的に読み込み、パーツを自動生成するようなパイプラインを構築する場合、メモリ解放の徹底が不可欠だ。

VBAの特性上、ループ内で `Set swFeat = Nothing` を明示的に行わないと、SolidWorks内部のCOM参照カウンタが保持されたままになり、数百個のパーツを生成したあたりで動作が著しく鈍化、最悪の場合はOutOfMemoryクラッシュを引き起こす。

‘ バッチ処理ループ内での適切なリソース解放パターン
Do While Not rs.EOF
‘ — ジオメトリ生成処理 —

‘ 明示的なオブジェクト解放
Set swSolidFeat = Nothing
Set swSurfaceFeat = Nothing
Set swSketchFeat = Nothing

‘ ドキュメントのクローズ(メモリから完全に抹消)
swApp.CloseDoc swModel.GetTitle
Set swModel = Nothing

rs.MoveNext
Loop

また、バッチ処理時には `swApp.SetUserPreferenceToggle(swUserPreferenceToggle_e.swDisplayFieldsUpdateInPreview, False)` などを用い、グラフィック処理を極限までオフにするチューニングを施すべきだ。

6. まとめ:アーキテクトとしての設計思想

単に「動くマクロ」を書くレベルから、「堅牢な業務自動化エンジン」を構築するレベルへと昇華するためには、CADの幾何計算エンジンが裏でどのように動いているかを理解しなければならない。

  • 直接のソリッド化ではなく、位相(PlanarSurface)と立体化(Thicken)を分離する。
  • 画面上の操作を模倣する `SelectByID2` を全廃し、オブジェクトの直接参照(`Select2`)に切り替える。
  • APIの非表示描画モード(`AddToDB`)とメモリ管理を厳格に行う。

この3原則を徹底することで、環境の変化や複雑なスケッチトポロジーに屈しない、最強のSolidWorks VBAソリューションを構築することができる。現場の業務効率化を推進するリードエンジニアとして、ぜひこの堅牢な設計パターンを自身のライブラリに組み込んでほしい。

タイトルとURLをコピーしました