【入門編】【サーフェスモデリング】FilledSurface.SetPatchBoundaryを用いた多角形境界ループからの高品質な穴埋めサーフェス生成 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks VBAの世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺めて、「なんだか同じような処理の繰り返しばかりだな…」「もっとスマートに複雑な形状を自動生成できないものか…」と感じていませんか?

今回は、そんな「マクロの記録」の向こう側にある本格的なサーフェスモデリングの自動化についてお話しします。

テーマは「`FilledSurface.SetPatchBoundary`を用いた多角形境界ループからの高品質な穴埋めサーフェス生成」です。
「名前からして難しそう…」と思いましたか? 大丈夫。ここをクリアすれば、あなたも単なる「操作の自動化」を超えた、真の形状エンジニアリングの扉を開くことができます。優しく丁寧に解説していきますので、一緒に一歩ずつ進んでいきましょう!

1. なぜ「FilledSurface(面埋め)」をAPIで操る必要があるのか?

複雑な3次元形状を設計していると、意図せず「穴」や「切り欠き」ができてしまうこと、あるいはデザイン上の理由で滑らかなパッチ面(面)をピタリと嵌め込みたい場面に出くわしますよね。

UI(画面操作)でこれをやろうとすると、境界のエッジを1本ずつクリックし、接線連続性(G1)や曲率連続性(G2)をポチポチと設定し……と、非常に手数がかかります。しかも、モデルの形状が変わるたびにやり直しです。

これをSolidWorks VBA(API)で自動化できれば、「どんなに複雑な多角形の境界ループであっても、一瞬で、しかも数学的に滑らかなサーフェスを生成し、ゆくはソリッド化の基礎を固める」ことが可能になります。

2. 魔法のメソッド `SetPatchBoundary` の正体

今回主役となるのは `FilledSurfaceFeatureData` オブジェクトが持つ `SetPatchBoundary` というメソッドです。

このメソッドは、文字通り「囲まれた境界(Boundary)」をサーフェスフィーチャに教え込むためのものです。

ざっくりとした仕組み

1. 穴の周りにあるエッジ(境界線)の配列をVBA側で収集する。
2. そのエッジ群を `SetPatchBoundary` にぶつける。
3. 接触する面に対する連続性の条件(接触、接線、曲率など)を設定する。
4. `FeatureManager.CreateFeature` でフィーチャとして実体化させる。

言葉で言うのは簡単ですが、APIの世界では「どのエッジを、どのような順序で、どう渡すか」が成否を分けます。ここが腕の見せ所です。

3. 実践!高品質な面埋めサーフェスを生成するVBAコード

それでは、実際に動かせる実用コードを見てみましょう。
以下のコードは、アクティブなパーツドキュメントにおいて、事前に選択された境界エッジ群から「面埋めサーフェス(Filled Surface)」を構築するプロシージャです。

Sub CreateHighQualityFilledSurface()
‘ =========================================================================
‘ 智識の扉:FilledSurfaceによる高品質パッチ生成サンプル
‘ 前提条件: 穴を囲むエッジ群をあらかじめSolidWorks上で選択しておいてください。
‘ =========================================================================
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swFeatMgr As SldWorks.FeatureManager
Dim swSurfData As SldWorks.FilledSurfaceFeatureData
Dim swFeat As SldWorks.Feature

‘ アプリケーションとドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If

Set swSelMgr = swModel.SelectionManager
Set swFeatMgr = swModel.FeatureManager

‘ 1. FeatureManagerからFilledSurface用のデータオブジェクトを作成
Set swSurfData = swFeatMgr.CreateDefinition(swFmFilledSurface)

If swSurfData Is Nothing Then
MsgBox “面埋めデータの作成に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If

‘ 2. 選択されたエンティティ(エッジ)を配列として取得・設定する
‘ ここが本日の最重要ポイント!境界ループを構成するエッジ群を配列で渡します。
Dim count As Long
count = swSelMgr.GetSelectedObjectCount2(-1)

If count < 3 Then MsgBox "境界を形成する3つ以上のエッジを選択してください。", vbExclamation, "警告" Exit Sub End If Dim edgeArray() As Object ReDim edgeArray(count - 1) Dim i As Long For i = 0 To count - 1 ' 選択されているエッジを取得して配列に格納 Set edgeArray(i) = swSelMgr.GetSelectedObject6(i + 1, -1) Next i ' 3. SetPatchBoundaryメソッドで境界を定義 ' 構文: SetPatchBoundary(EdgeArray, PatchOption) ' ※PatchOption: 0=接触(G0), 1=接線(G1), 2=曲率(G2) などの制御が可能 Dim success As Boolean success = swSurfData.SetPatchBoundary(edgeArray, 1) ' ここではG1(接線)連続性を指定 If Not success Then MsgBox "SetPatchBoundaryの設定に失敗しました。エッジの連続性を確認してください。", vbCritical, "エラー" Exit Sub End If ' 4. オプションの設定(必要に応じて解像度や最適化を調整) swSurfData.OptimizeSurface = True ' サーフェスの最適化 ' 5. フィーチャの生成実行 Set swFeat = swFeatMgr.CreateFeature(swSurfData) If Not swFeat Is Nothing Then MsgBox "高品質な面埋めサーフェスの生成に成功しました!", vbInformation, "完了" ' 選択をクリア swModel.ClearSelection2 True Else MsgBox "フィーチャの生成に失敗しました。", vbCritical, "エラー" End If End Sub ---

4. コードの深掘りと「陥りやすいエラー」の回避術

上記のコード、一見するとシンプルですが、SolidWorks APIの深い知識が詰まっています。現場で必ず直面する「つまずきポイント」を先回りして解説しましょう。

トラップ1: 「エッジの選択順序と連結性」

`SetPatchBoundary` に渡すエッジ配列は、互いに端点で繋がっていなければなりません。途中に隙間(ギャップ)があったり、順番がバラバラでループを形成していなかったりすると、メソッドは容赦なく `False` を返します。

  • 対策: あらかじめ手動でループを選択するか、API側でトポロジー(位相幾何学)を辿ってエッジの繋がりを検証するロジックを挟むのがプロの技です。

トラップ2: 連続性(G0, G1, G2)の選択ミス

コード内で `swSurfData.SetPatchBoundary(edgeArray, 1)` と記述している部分の「`1`」は、境界における連続性のレベルを意味しています。

  • `0` : G0(接触 / Contact) … 単に面がくっついているだけ。角ができる。
  • `1` : G1(接線 / Tangent) … 境界で面の向き(接線ベクトル)が一致する。滑らか。
  • `2` : G2(曲率 / Curvature) … 曲率の変化率まで一致する。究極に美しい写り込みを生む。

デザイン部品や外観パーツを扱うなら `1` や `2` が必須ですが、隣接する面が歪んでいるとG2指定はエラーを起こしやすいです。「エラーになる時はまずG1に落としてみる」のがデバッグの鉄則です。

5. おわりに:ここをクリアすれば、もう初学者ではない

お疲れ様でした!今回は `FilledSurface.SetPatchBoundary` を使った、少し高度なサーフェス自動生成の裏側を覗いてみました。

「マクロの記録」では絶対に吐き出されない、オブジェクト指向的な定義・構築のプロセス(`CreateDefinition` → パラメータ設定 → `CreateFeature`)の美しさを感じていただけたでしょうか?

このパターンをマスターすれば、ロフトやスイープだけでなく、複雑な多角形の穴埋めすらも完全にプログラムの支配下に置くことができます。ソリッド化への道筋もぐっと近くなりますよ。

ここをクリアしたあなたなら、もうSolidWorks VBAの基本はバッチリです!
自信を持って、次の自動化の荒野へと漕ぎ出してください。それでは、また次回のエンジニアリングでお会いしましょう!

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