【実務・中級編】【サーフェスモデリング】FilledSurfaceやBoundSurfaceをVBAから駆使して複雑な三次元曲面を創る – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの深淵:複雑曲面を「コードで制する」ための設計思想

SolidWorksの自動化において、最もエンジニアの力量が試される領域。それが「サーフェスモデリングの自動生成」だ。

UIでポチポチと手動操作するなら誰でもできる。しかし、APIを介して複雑な曲面を定義し、それを破綻なくソリッド化させるには、SolidWorksの内部構造(B-Rep)に対する深い理解が不可欠だ。

今日は、場当たり的なコードで「エラー:再構築に失敗しました」と表示される悪夢から脱却し、堅牢で保守性の高いサーフェスモデリング基盤を構築するための極意を伝授する。

1. なぜ「手動操作の再現」では失敗するのか

多くの初心者は、UI上の操作順序をそのままAPIに移植しようとする。だが、APIは「意図」を汲み取ってはくれない。

  • 選択セットの危うさ: `SelectByID2` で面を選択するのは、モデルの状態に依存しすぎる。可能な限りオブジェクト参照(`Object`)を直接保持せよ。
  • 再構築のタイミング: ループ内で頻繁に `ForceRebuild3` を呼ぶのはパフォーマンスの自殺行為だ。必要なフィーチャ生成が終わるまで、再構築は保留すべきである。
  • トポロジーの不連続性: 境界サーフェス(FilledSurface)は、エッジの接続性が甘いと即座に崩壊する。許容誤差(Tolerance)を無視した設計は、実務では通用しない。

2. 堅牢なサーフェス生成のアーキテクチャ

複雑な形状を生成する際は、以下の「3段構え」で設計せよ。

1. データ準備層: 座標点やガイド曲線を配列として保持し、モデルの状態に依存しない抽象化を行う。
2. 生成層: サーフェスを生成し、一時的に保持。この段階ではまだソリッド化しない。
3. 統合層: 全サーフェスが揃った段階で `CreateSolidFromSurfaces` を実行し、最後にフィーチャの親子関係を整理する。

3. 実践:境界サーフェスを用いたソリッド化コード

以下は、選択された複数のエッジから境界サーフェスを生成し、ソリッド化するプロフェッショナル向けの実装例だ。

Option Explicit

‘ 境界サーフェスによるソリッド化の極致
Public Sub CreateSurfaceAndSolid()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModeler As SldWorks.Modeler
Dim swFeatMgr As SldWorks.FeatureManager

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swFeatMgr = swModel.FeatureManager

‘ エラーハンドリング:モデルがパーツでない場合は即座に中断
If swModel.GetType <> swDocPART Then Exit Sub

‘ 1. 境界サーフェスの定義(FilledSurface)
‘ ※本番環境では、選択セットを動的に構築するロジックをここに挟む
Dim swFeat As SldWorks.Feature
Dim swFilledSurfFeat As SldWorks.FilledSurfaceFeatureData

‘ 設定オブジェクトの作成
Set swFilledSurfFeat = swFeatMgr.CreateDefinition(swFtrTypeFilledSurface)

‘ 2. サーフェスのオプション設定
‘ 接触(Contact)や曲率(Curvature)の制約を適切に指定することが成功の鍵
swFilledSurfFeat.OptimizeSurface = True

‘ 3. フィーチャ生成
Set swFeat = swFeatMgr.CreateFeature(swFilledSurfFeat)

‘ 4. ソリッド化の実行
‘ ここでサーフェスを縫合し、ソリッドへ変換する
If Not swFeat Is Nothing Then
ConvertSurfacesToSolid swModel
End If
End Sub

‘ サーフェスをソリッドへ変換するための高信頼メソッド
Private Sub ConvertSurfacesToSolid(swModel As SldWorks.ModelDoc2)
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swModel.SelectionManager

‘ 全サーフェスを選択して縫合(Knit)するプロセスを自動化
‘ 許容値はモデルの精度に応じて調整せよ
swModel.Extension.SelectAll
swModel.InsertKnitSurface2 0.0001, 0.0001, 0, 0, 0, True, True

‘ 最後に「ソリッドを作成」オプションを有効化
‘ 実務ではこの後に、生成されたボディの健全性チェックを行うのがプロの流儀
End Sub

4. 開発現場で生き残るための「鉄則」

① データベース連携の注意点

サーフェス形状を外部DB(SQL Server等)から読み込んで生成する場合、「絶対座標」と「相対座標」の取り違えが最大のバグ源となる。必ず `MathTransform` を使用し、座標変換を明示的に記述すること。

② 保守性を高めるカプセル化

コードをすべて一つのプロシージャに詰め込むな。

  • `GetEdgesFromSketch()`:スケッチからエッジを取得する関数
  • `BuildSurfaceDefinition()`:サーフェス定義を生成する関数

このように機能ごとに分離し、ユニットテストが可能な状態を維持しろ。

③ ユーザーへのフィードバック

API実行中は画面更新を停止(`swModel.Visible = False` 等)させることがあるが、失敗した際に何が起きたか不明になる。`On Error GoTo` を駆使し、エラー発生時の「どの面が縫合に失敗したか」のログをテキストファイルに書き出す設計を忘れてはならない。

最後に:エンジニアとしての矜持

VBAは古臭い言語だと言われる。しかし、SolidWorksのAPIを操ることは、3次元空間の数学的制約と対話することに他ならない。

今回示したコードは単なるテンプレートではない。あなたが直面する「複雑な曲面」という難題を、論理という名のメスで切り刻み、構築するための礎だ。

もし再構築エラーで立ち止まったら、一度立ち止まり、そのサーフェスが数学的に「閉じているか(Manifold)」を疑え。それができるようになった時、あなたはただのオペレーターから、真の自動化エンジニアへと昇華するはずだ。

健闘を祈る。

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