【テクニカル・上級編】【フィレット・面取り】GetEntityCountによる全エッジ一括選択と条件付きフィレット付与マクロ – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks API】エンジニアを殺す「手動フィレット」の終焉:全エッジ一括選別と最適化実装の極意

SolidWorksの設計現場で、最も不毛な時間はどこにあるか。それは、複雑なモデルに対して数百箇所のエッジを一つひとつポチポチと選択し、フィレットや面取りを付与する作業だ。

APIを操る我々にとって、GUI操作は敗北を意味する。本稿では、`GetEntityCount`を起点に、モデルのトポロジーを解析し、条件に合致するエッジを一括で射抜く「選別式フィレット自動化」の神髄を伝授する。

1. 脳死した全選択は「死」を招く:トポロジー解析の重要性

単純にすべてのエッジを取得してフィレットをかけるコードを書く初心者がいるが、それは地獄への入り口だ。面取りやフィレットは計算負荷が非常に高く、無効なエッジに適用を試みれば、SolidWorksは容易にフリーズし、メモリを食いつぶす。

我々がやるべきは「エッジの属性(Edge Attributes)」のフィルタリングだ。

  • エッジの長さ
  • 隣接する面の角度(折れ曲がり角)
  • 曲率の連続性

これらをプログラム側で判定し、処理対象を最小限に絞り込む。これが、大規模アセンブリを殺さないためのプロフェッショナルの作法だ。

2. 実装:一括抽出とフィレット付与の最適化コード

以下は、モデル内のすべてのエッジを走査し、特定の条件(例:ある程度の長さがあるエッジのみ)を抽出してフィレットを付与する実装の骨子である。

‘ SolidWorks APIによるエッジ一括処理の最適化例
Option Explicit

Sub ApplySmartFillet()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swBody As SldWorks.Body2
Dim swEdge As SldWorks.Edge
Dim vEdges As Variant
Dim swEnt As SldWorks.Entity
Dim i As Long
Dim edgeList As Collection

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

If swModel.GetType <> swDocPART Then Exit Sub

Set swPart = swModel
Set edgeList = New Collection

‘ ボディの取得とエッジ走査
‘ プロダクションコードではGetBodies2を使用してメモリ効率を最大化する
Dim vBodies As Variant
vBodies = swPart.GetBodies2(swSolidBody, False)

For i = 0 To UBound(vBodies)
Set swBody = vBodies(i)
vEdges = swBody.GetEdges

Dim j As Long
For j = 0 To UBound(vEdges)
Set swEdge = vEdges(j)

‘ 【重要】ここでエッジの属性を評価する
‘ 全てのエッジに適用せず、必要なものだけを選別
If IsTargetEdge(swEdge) Then
edgeList.Add swEdge
End If
Next j
Next i

‘ フィレット付与の実行
ApplyFilletToCollection edgeList, 0.005 ‘ 5mmフィレット

‘ 明示的メモリ解放(VBAのGCを信頼しない)
Set swEdge = Nothing
Set swBody = Nothing
Set swPart = Nothing
End Sub

‘ 特定の条件判定ロジック
Private Function IsTargetEdge(swEdge As SldWorks.Edge) As Boolean
‘ ここで曲率や長さを評価。
‘ GetCurveメソッドで幾何学的な属性を抽出し、閾値と比較する
‘ 実装例: エッジの長さ > 10mm 等
IsTargetEdge = True ‘ 簡略化のためTrue
End Function

3. シニアエンジニアが守るべき「メモリと実行の鉄則」

① `GetEntityCount` とコレクションの使い分け

ループ処理において、`GetEntityCount` を用いて配列のサイズを静的に確保する方法は高速だが、VBAのコレクション(`Collection`)や辞書(`Scripting.Dictionary`)を併用することで、後段のフィーチャ操作を柔軟に制御できる。メモリ消費と速度のトレードオフを計算せよ。

② Windows APIとの連携:フリーズ防止

長時間にわたるフィーチャ再構築が発生する場合、Windows APIの `DoEvents` を適切に叩く必要があるが、多用は禁物だ。再描画を抑制する `swModel.ViewZoomtofit2` や `swModel.GraphicsRedraw2` の制御を組み合わせ、バックグラウンドでの処理を徹底せよ。

③ レガシー環境での保守性

もしあなたが古いバージョンのSolidWorksを扱っているなら、`SelectByRay` などの空間検索APIが不安定なケースがある。その場合は、`GetEdges` をベースにしたトポロジー走査が最も堅牢だ。APIの仕様が変わっても、`Body -> Edge -> Face` という階層構造は変わらない。本質的な部分で実装を固めることが、10年後の保守を楽にする。

4. 結び:自動化は「道具」ではなく「意志」である

コードを書いて自動化することは、単なる作業の効率化ではない。それは、設計という創造的な行為から「単純作業のノイズ」を排除し、真に考えるべき幾何学的な問いに向き合うための環境構築だ。

君たちが書くその数行のコードが、誰かの残業を減らし、設計ミスを未然に防ぐ。SolidWorksの内部構造を知り尽くした者だけが、その重みを知っているはずだ。

さあ、GUIから解放され、コードでモデルを支配せよ。

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