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

スポンサーリンク

SolidWorks自動化の極意:エッジ選択の地獄から解放される「自動フィレット付与」の設計術

こんにちは。SOLIDWORKSのAPIという深淵をさまよい、数多の自動化プロジェクトを完遂してきたエンジニアです。

皆さんは、モデルを作るたびに「すべてのエッジにフィレットをかける」という退屈な作業をしていませんか?1本ずつクリックして選択し、修正が入ればまた選択し直す……。そんな人間がやるべきではない仕事は、APIに丸投げしましょう。

今回は、`GetEntityCount`を使い、プログラムがモデルのエッジを「知覚」して一括で処理する、自動化の第一歩を伝授します。

1. なぜ「マクロの記録」だけでは限界があるのか?

初心者の方がまずやるのが「マクロの記録」です。しかし、記録されたコードは「特定の固定ID(Entity ID)」を掴んでいるだけ。モデルの形状が変わった瞬間に、マクロはエラーを吐いて停止します。

本物の自動化とは、プログラムが「モデルの属性(長さやトポロジー)」を読み取り、動的に対象を判断することです。

今回目指すのは、「モデル内のすべて(あるいは条件を満たす)のエッジを、プログラムが勝手に探してフィレットをかける」という賢いマクロです。

2. 実装の設計図:エッジを狩るアルゴリズム

処理の全体像は以下の通りです。

1. ModelDoc2オブジェクトを取得する。
2. PartDocとしてモデルのボディ情報を走査する。
3. GetEdgesメソッドで全てのエッジを配列に格納する。
4. FeatureManager.InsertFillet2を使って、エッジ配列を一括で食わせる。

3. 実践:全エッジ一括フィレット付与コード

このコードは、アクティブなパーツファイル内のすべてのエッジを抽出し、指定した半径でフィレットを一括適用します。

Option Explicit

Sub AutoFilletAllEdges()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swBody As SldWorks.Body2
Dim swEdges As Variant
Dim vEdge As Variant
Dim swEdge As SldWorks.Edge

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

‘ パーツファイル以外では実行しない安全策
If swModel Is Nothing Or swModel.GetType <> swDocPART Then
MsgBox “パーツファイルを開いてください。”
Exit Sub
End If

Set swPart = swModel

‘ ボディを取得(通常は一番最初のボディを対象)
Dim vBodies As Variant
vBodies = swPart.GetBodies2(swSolidBody, False)
Set swBody = vBodies(0)

‘ 全エッジを取得
swEdges = swBody.GetEdges

‘ 選択状態をクリアしてから一括選択
swModel.ClearSelection2 True

‘ すべてのエッジを選択状態にする
For Each vEdge In swEdges
Set swEdge = vEdge
swEdge.Select4 True, Nothing
Next vEdge

‘ フィレット生成(半径 2mm)
‘ 引数: 半径, 伝播設定(0:なし, 1:接線), 保持設定, 断面形状
swModel.FeatureManager.InsertFillet2 0.002, 0, 0, 0, 0, 0, 0

MsgBox “全エッジへのフィレット適用が完了しました。”
End Sub

4. 現場で役立つ「極限の知見」:陥りやすい罠

このコードを書いていく中で、必ずぶつかる壁が2つあります。ここを理解すれば、あなたはもう中級者です。

罠①:再構築(Rebuild)のタイミング

APIでフィーチャを追加した直後は、モデルのトポロジーが確定していないことがあります。連続して操作を行う場合は、必ず `swModel.EditRebuild3` を挟む癖をつけてください。これがないと、「選択したエッジが見つかりません」というエラーで撃沈します。

罠②:エッジの「伝播(Propagation)」の制御

上記のコードはすべて個別に選択していますが、実際には「接線連続するエッジ」を自動選択したい場合が多いはずです。
`InsertFillet2` の第2引数を `1` にすることで、接線伝播を有効にできます。手動でやるより遥かに速く、ミスもありません。

5. 次のステップへ

今回のコードは「すべて」のエッジを選択しましたが、応用編として 「特定の長さ以上のエッジだけを抽出する」 という条件分岐を `For Each` の中に入れるだけで、穴のエッジだけを回避するなどの高度なフィルタリングが可能になります。

「プログラムに判断させる」。これが自動化の本質です。

まずはこのコードをコピーして、手元の適当なボックスモデルで走らせてみてください。一瞬でエッジが滑らかになる瞬間、きっと自動化の快感に目覚めるはずです。

何か詰まったら、いつでも聞いてください。設計者の時間を守るのが、私たちの仕事ですから。

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