【入門編】【フィレット・面取り】Body2.GetFacesで取得した特定平面と交差するエッジ群の自動フィルタリングと角丸め処理 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の世界へようこそ。
マクロの記録ボタンを押して生成されるコードを眺める日々から、「自分の手で意図通りに形状をコントロールするマクロを書きたい!」と一歩を踏み出したあなたへ。

今回は、実務でめちゃくちゃ需要が高い「特定の平面に隣接するエッジだけを自動抽出して、スマートにフィレット(角丸め)をかける技術」を伝授します。

「モデル全体に一括でフィレットをかけたら、意図しないエッジまで巻き込んでエラーになった……」
そんな絶望を味わったことはありませんか?

ここをクリアすれば、あなたも単なる「マクロの記録者」から、現場を救う「自動化エンジニア」への階段を確実に登ることができます。優しく、そして本質的なところまで徹底的に解説していきますね。

なぜ「特定のエッジの自動抽出」が必要なのか?

SolidWorksのAPIでフィレット(`InsertFeatureFillet2` など)を実行するとき、一番の難所は「対象となるエッジをどうやってプログラムに指定するか」です。

人間なら画面を見て「この面のまわりの角ね」と一発で分かりますが、VBA(COMオブジェクト)は冷徹です。エッジには「Edge1」「Edge2」のようなランダムな名前(内部ID)しか振られておらず、モデルの形状が変わるとその名前も変わってしまいます。

だからこそ、「特定の基準となる平面」を起点にして、そこに接するエッジをプログラム側で動的に見つけ出す(フィルタリングする)というアプローチが絶対に必要なのです。

攻略の全体像:3つのステップ

今回のプログラムは、以下の3ステップでスマートに処理を実行します。

1. 基準となる平面(Face)の特定

  • モデルの中から、狙った平面(例えば「上面」や特定の押し出し面など)をプログラムで掴まえます。

2. 面を構成する境界エッジ(Edge)の取得

  • その平面が持っている「境界線(エッジの配列)」を `Body2.GetFaces` と `Face2.GetEdges` を使って一網打尽に取得します。

3. 安全なフィレットフィーチャの生成

  • 抽出したエッジのコレクションをSolidWorksに渡し、指定した半径でフィレットをかけます。

それでは、実際のコードを見ていきましょう!

実装コード:スマート・エッジ・フィレットマクロ

以下のコードを、SolidWorksのVBAエディタ([Alt] + [F11])に貼り付けて実行してみてください。
※事前に適当なブロック(直方体など)を作成したパート(.sldprt)ファイルを開いておくか、コード内の面名称を調整してください。

Option Explicit

Sub SmartFilletByPlane()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swBody As SldWorks.Body2
Dim vBodies As Variant
Dim vFaces As Variant
Dim swFace As SldWorks.Face2
Dim swSurface As SldWorks.Surface
Dim lFaceType As Long

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

If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If

If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation
Exit Sub
End If

Set swPart = swModel

‘ 1. パーツ内のソリッドボディを取得(最初のボディを対象とする)
vBodies = swPart.GetBodies2(swSolidBody, True)
If IsEmpty(vBodies) Then
MsgBox “ソリッドボディが見つかりません。”, vbCritical
Exit Sub
End If
Set swBody = vBodies(0)

‘ 2. ボディからすべての面(Face)を取得し、特定の条件(平面)でフィルタリング
vFaces = swBody.GetFaces
Dim targetFace As SldWorks.Face2
Dim found As Boolean
found = False

Dim i As Long
For i = LBound(vFaces) To UBound(vFaces)
Set swFace = vFaces(i)
Set swSurface = swFace.GetSurface

‘ ジオメトリが「平面(Planar)」であるか判定
If swSurface.IsPlane Then
‘ ここでは簡単のため、「最初に見つかった平面」をターゲットとします
‘ 実務では面の法線ベクトルや中心座標をチェックして特定します
Set targetFace = swFace
found = True
Exit For
End If
Next i

If Not found Then
MsgBox “対象となる平面が見つかりませんでした。”, vbExclamation
Exit Sub
End If

‘ 3. 選択のクリアと、特定平面に隣接するエッジの取得・選択
swModel.ClearSelection2 True

‘【重要】ターゲット面から境界エッジの配列を取得する
Dim vEdges As Variant
vEdges = targetFace.GetEdges

If IsEmpty(vEdges) Then
MsgBox “平面に隣接するエッジが取得できませんでした。”, vbExclamation
Exit Sub
End If

‘ 4. 取得したエッジ群をSolidWorks上で「マーク付き選択」する
Dim swEntity As SldWorks.Entity
Dim j As Long
For j = LBound(vEdges) To UBound(vEdges)
Set swEntity = vEdges(j)
‘ Mark = 1 はフィレットフィーチャ作成時のエッジ指定の作法
swEntity.Select4 True, 1
Next j

‘ 5. フィレットフィーチャの実行(半径 = 5mm)
Dim radius As Double
radius = 0.005 ‘ 単位はメートル(5mm)

Dim swFeature As SldWorks.Feature
‘ 引数: 処理タイプ, 半径, 伝播フラグ…
Set swFeature = swModel.FeatureManager.InsertFeatureFillet3( _
1, _ ‘ 0:定数半径, 1:変数… 等 (フィレットタイプ)
radius, _ ‘ 半径
0, 0, 0, 0, 0, 0, _ ‘ 各種オプション
Nothing, Nothing, _
0, 0, 0, 0, 0, 0, 0, 0)

If Not swFeature Is Nothing Then
MsgBox “特定の平面エッジに対するフィレット処理が完了しました!”, vbInformation
Else
MsgBox “フィレットの作成に失敗しました。ジオメトリの干渉を確認してください。”, vbCritical
End If

End Sub

コードのここがポイント!知的なエンジニアの解説

初心者の方がつまずきやすいポイントを、エンジニアの視点で分かりやすく紐解きます。

① `Surface.IsPlane` でジオメトリの本質を見抜く

コードの途中で `swSurface.IsPlane` というメソッドを使っています。
SolidWorksのAPIでは、見た目の「平面」だけでなく、円柱や自由曲面など、あらゆる面が `Surface` という数学的な定義を持っています。
「この面は数式的にフラット(平面)か?」をプログラムに直接問いかけることで、意図しない形状の選択ミスを完全に防ぐことができます。

② `Entity.Select4` の「マーク(Mark)」の概念

VBAでフィーチャを作成する際、どの面やエッジに対して処理を行うかをSolidWorksに伝えるために `Select4` メソッドを使います。
ここで重要なのが第2引数の `Mark` です。フィレット機能の場合、「エッジを選択するときのマークは『1』を指定しなければならない」というSolidWorks API特有のルールがあります。ここを適当に0にすると、「選択エラー」でマクロが爆発しますので注意してくださいね。

③ 単位系は「メートル(m)」の世界

コード内で `radius = 0.005` と記述しています。「あれ、5ミリなのに 0.005?」と思った方、素晴らしい着眼点です!
SolidWorksのAPI内部では、ドキュメントの表示単位(mmやinch)に関わらず、長さの基準単位は常に「メートル(m)」で処理されます。実務で「5mmのフィレットをかけたいのに、めちゃくちゃデカいエラーが出た!」というミスの9割は、この単位系のトラップが原因です。

陥りやすいエラーと対策

  • エラー:「オブジェクト変数が設定されていません。(Error 91)」
  • 原因: 選択したモデルにソリッドボディが含まれていない、または面が正しく取得できていません。
  • 対策: `vFaces` や `vEdges` が空(Empty)になっていないか、必ず `If IsEmpty(…)` でガード文を書きましょう。
  • エラー:フィレットが生成されず、フィーチャが黄色や赤の警告になる
  • 原因: 指定したフィレット半径(例: 5mm)に対して、モデルのエッジの長さが短すぎる、または干渉している。
  • 対策: 自動化するモデルの最小寸法をあらかじめ把握し、無理のない半径をコード内で動的に計算・設定するようにしましょう。

まとめ:ここをクリアすれば、基本はバッチリ!

お疲れ様でした!今回は、

  • `Body2.GetFaces` と `Surface.IsPlane` を組み合わせたスマートな面・エッジの絞り込み
  • SolidWorks API特有の「メートル単位系」「選択マーク(Mark)」のルール

を解説しました。

ここをマスターすれば、単なるマクロの記録の域を脱し、「自分の思い通りにモデルを自動構築するプログラム」が書けるようになります。現場の業務効率化が一気に加速すること間違いなしです。

「もっとこんな自動化がしたい」「ここのAPIの使い方が分からない」といった疑問があれば、ぜひコメント欄や次の記事でお会いしましょう。あなたのSolidWorks自動化ライフを、これからも応援しています!

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