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

スポンサーリンク

SolidWorks自動化の真髄:エッジ選択の「地獄」から脱却するフィーチャ自動付与の設計思想

設計現場において、数千本のフィレットを1本ずつ手動で選択する作業ほど、エンジニアの生産性を殺す行為はない。だが、多くのVBA初心者は「フィーチャの選択」というフェーズで躓く。`SelectByID2`を羅列するようなコードは、モデルの変更に対して脆く、エラーが頻発する「技術的負債」の温床だ。

本稿では、SolidWorks APIを掌中で操り、「モデルのトポロジーをプログラム的に解析し、条件に合致するエッジを一括で射抜く」ための極限の設計手法を伝授する。

なぜ「手動選択」をコード化すべきなのか

SolidWorksの自動化において、最もコストがかかるのは「選択(Selection)」だ。人間がマウスで行う選択をなぞるのではなく、`IEdge`オブジェクトを直接配列として取得し、それをフィーチャに流し込む設計こそが、プロダクションレベルの強靭さを生む。

今回紹介するロジックは以下の3ステップだ。
1. 全エッジの抽出: ボディから全エッジをイテレーションで取得。
2. 幾何学的フィルタリング: 曲率や長さ、隣接面情報からフィレット対象を識別。
3. 一括適用: 選択セットを構築し、`FeatureManager`で一括処理。

実装コード:堅牢な一括フィレット生成エンジン

このコードは、パーツ内のすべてのエッジを走査し、「長さが規定値以下」または「直線エッジのみ」といったフィルタリングを適用した上で、一括でフィレットを付与するひな形だ。

‘ 必要な参照設定: SolidWorks 20xx Type Library
Option Explicit

Sub AutoFilletByCondition()
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 swFeatMgr As SldWorks.FeatureManager
Dim vBodies As Variant
Dim swSelMgr As SldWorks.SelectionMgr
Dim swSelData As SldWorks.SelectData

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

‘ 1. ボディの取得(マルチボディ対応)
vBodies = swPart.GetBodies2(swAllBodies, False)

‘ 2. 選択セットをクリア
swModel.ClearSelection2 True

Dim i As Long
Dim swEdgeList As Collection
Set swEdgeList = New Collection

‘ 3. エッジの走査と抽出条件の適用
Dim swBodyObj As SldWorks.Body2
For i = 0 To UBound(vBodies)
Set swBodyObj = vBodies(i)

Dim vEdges As Variant
vEdges = swBodyObj.GetEdges

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

‘ 【ここにロジック】例:エッジの長さが10mm以下なら抽出
If swEdge.GetLength < 0.01 Then swEdge.Select4 True, Nothing ' 選択に追加 End If Next j Next i ' 4. フィレットの付与(エラーハンドリングを伴う実行) Set swFeatMgr = swModel.FeatureManager On Error Resume Next swFeatMgr.FeatureFillet2 0.005, 0, 0, 0, 0, 0, 0 ' 半径5mmでフィレット If Err.Number <> 0 Then
MsgBox “フィレット生成中にエラーが発生しました。ジオメトリが不正である可能性があります。”, vbCritical
End If

swModel.ClearSelection2 True
End Sub

プロダクション環境で生き残るための「3つの鉄則」

コードを動かすだけなら上記で十分だが、業務で使い続けるためには以下の設計思想が不可欠だ。

1. トポロジーの変化に備える(名前による選択を捨てる)

`SelectByID2`で「Edge<1>」のような名前を指定してはいけない。フィーチャが再計算されるたびに内部IDは再定義される可能性がある。`IEdge`オブジェクトの参照を直接保持・操作することで、モデルの構成変更に左右されない強固なコードが書ける。

2. 計算負荷の管理

`GetEdges`はモデル全体を走査するため、複雑なアセンブリや大規模パーツでは処理が重くなる。`swBody.GetEdges`を呼び出す前に、バウンディングボックスによる選別や、特定のフィーチャ直下の面からエッジを抽出するなど、探索範囲を絞り込むアルゴリズムを導入せよ。

3. データベース連携とパラメータ管理

もし、このマクロを「製品ごとのルール」として運用するなら、フィレット半径や条件式をVBA内にハードコーディングしてはならない。JSONや外部CSVで設定を外部化し、マクロはそれを読み込んで実行するだけの「エンジン」に徹させること。これが保守性を高める唯一の解だ。

最後に:エンジニアとしての誇り

自動化の目的は単なる省力化ではない。「ミスが起きる余地をプログラムで論理的に排除すること」にある。
「マクロが止まる」のは、あなたのコードのせいではない。モデルの未来を予測できていない設計の問題だ。

今回紹介したエッジ取得のロジックは、フィレットだけでなく、面取り(Chamfer)や、特定の面に対する色付け、さらには製造性チェック(Dfm)にも応用できる。この「トポロジー抽出」の型を身につければ、あなたはもう、手作業に縛られることはない。

さあ、次はどの手作業を自動化の糧にする?

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