【実務・中級編】【中級・実務】CutExtrusion機能における「サーフェスまで(Up To Surface)」を指定した際のターゲット面ロストを防ぐスマート参照管理 – SolidWorks VBA解析バイブル

スポンサーリンク

【極限のSolidWorks VBA】「サーフェスまで」のカットで二度と参照エラーを起こさない、プロの設計流儀

SolidWorksの自動化において、最も開発者を悩ませるのが「参照の消失(Dangling Reference)」だ。特に、`FeatureExtrusionCut2`(押し出しカット)で「Up To Surface(サーフェスまで)」を指定する場合、手動操作の感覚でコードを書くと、形状変更のたびにマクロが牙を剥く。

「昨日まで動いていたマクロが、モデルの寸法を変えただけでエラーになる」

もし君がこの問題に直面しているなら、それはAPIの使い方が悪いのではない。「オブジェクトのライフサイクル管理」と「トポロジーの特定戦略」が欠如しているのだ。

今回は、伝説的なアーキテクトの視点から、堅牢極まる「サーフェス指定カット」の実装法を伝授する。

1. なぜ君のコードは「ターゲット面」を見失うのか

一般的な教本では、`SelectByID2` を使って「”Face1@Part1″」といった名前で面を選択するよう教える。だが、実務においてこれは禁忌(タブー)だ。

  • 理由1: 内部IDの流動性

フィーチャの追加や順序変更により、面の内部名(Face1, Face2…)は容易に変化する。

  • 理由2: 選択バッファの不確実性

`SelectByID2` はグローバルな選択状態に依存する。別のプロセスやユーザー操作が割り込めば、容易に崩壊する。

プロフェッショナルは、名前ではなく「幾何学的・位相的属性」で面を特定し、その場でオブジェクト参照を掴む。

2. 堅牢な「スマート参照管理」の3大原則

「サーフェスまで」のカットを確実に成功させるには、以下の3ステップを設計に組み込む必要がある。

1. 静的タグ付け(命名)または幾何学的フィルタリング: ターゲットとなる面を、面積・法線ベクトル・重心位置などで特定する。
2. Entity参照の保持: 選択直前にオブジェクトが有効(Not Nothing)であることを確認する。
3. マーク(Mark)の厳密な管理: `SelectByID2` の第10引数(Mark)を使い分け、スケッチとターゲット面を明確に分離してスタックに積む。

3. プロダクション・グレードの実装例

以下に、特定の面積を持つサーフェスを自動検出し、そこまでカットを行う堅牢なコードを示す。このコードは、単なるコピペ用ではない。「どうやって確実に面を特定するか」というロジックを読み取ってほしい。


‘ Description: 堅牢な「サーフェスまで」押し出しカットの実装
‘ Developer: SolidWorks Architect

Sub SmartUpToSurfaceCut()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swSelMgr As SldWorks.SelectionMgr
Dim swFeatMgr As SldWorks.FeatureManager

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Or swModel.GetType <> swDocPART Then Exit Sub

Set swPart = swModel
Set swSelMgr = swModel.SelectionManager
Set swFeatMgr = swModel.FeatureManager

‘ 1. スケッチの選択 (Mark: 1)
‘ ここでは既に作成済みの “CutSketch” を想定。本来はオブジェクト参照から取るべき。
Dim status As Boolean
status = swModel.Extension.SelectByID2(“CutSketch”, “SKETCH”, 0, 0, 0, False, 1, Nothing, 0)
If Not status Then
MsgBox “スケッチが見つかりません。”: Exit Sub
End If

‘ 2. ターゲット面の特定 (幾何学的フィルタリング)
‘ 名前ではなく、面積や法線で面を探し出す「FindTargetFace」関数を呼び出す
Dim targetFace As SldWorks.Face2
Set targetFace = FindTargetFace(swPart, 0.005) ‘ 例: 面積が約0.005平米の面を探す

If targetFace Is Nothing Then
MsgBox “ターゲット面を特定できませんでした。”: Exit Sub
End If

‘ 3. ターゲット面の選択 (Mark: 32)
‘ FeatureExtrusionCut2において、”Up To Surface” のターゲットは通常 Mark 32 (or 0 depend on settings)
‘ ここでは Entity インターフェースを介して選択を行う
Dim swEntity As SldWorks.Entity
Set swEntity = targetFace
status = swEntity.Select4(True, swSelMgr.CreateSelectData) ‘ Append選択

‘ SelectByID2にMarkを渡して再選択(これが確実)
‘ ※UpToSurfaceのMark値は、APIのバージョンやカットの方向に依存するため注意
status = swModel.Extension.SelectByID2(“”, “FACE”, 0, 0, 0, True, 32, Nothing, 0)

‘ 4. 押し出しカットの実行
‘ 引数詳細:
‘ Sd (True=片側), Flip (False), Dir (False), TermType (3=UpToSurface)
‘ TermType2 (0), Overhang (False), AssemblyOpt (False), …
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatMgr.FeatureExtrusionCut2( _
True, False, False, swEndCondUpToSurface, 0, _
0.01, 0.01, False, False, False, _
False, 0.01, 0.01, False, False, _
False, False, False, True, True, _
True, True, False, 0, 0, False)

If swFeat Is Nothing Then
MsgBox “カットフィーチャの作成に失敗しました。”
Else
Debug.Print “Success: ” & swFeat.Name
End If
End Sub

‘ — 補助関数: 面積条件で面を特定する —
Private Function FindTargetFace(swPart As SldWorks.PartDoc, targetArea As Double) As SldWorks.Face2
Dim vBodies As Variant
vBodies = swPart.GetBodies2(swAllBodies, True)

Dim i As Integer, j As Integer
For i = 0 To UBound(vBodies)
Dim swBody As SldWorks.Body2
Set swBody = vBodies(i)

Dim vFaces As Variant
vFaces = swBody.GetFaces

For j = 0 To UBound(vFaces)
Dim swFace As SldWorks.Face2
Set swFace = vFaces(j)

‘ 面積による判定 (誤差許容範囲 1%)
Dim area As Double
area = swFace.GetArea
If Abs(area – targetArea) < (targetArea 0.01) Then Set FindTargetFace = swFace Exit Function End If Next j Next i End Function ---

4. 業務効率化ツールとしての「極限の知見」

データベース・外部ファイル連携の勘所

実務では、ターゲットにする面の「面積」や「法線」の閾値を外部のJSONやExcelから取得する設計にすべきだ。ハードコーディングは負債でしかない。

  • Config管理: `targetArea` などのパラメータを外部化することで、モデル形状が変わってもソースコードを書き換えずに対応できる。

パフォーマンスの重み

`GetBodies2` や `GetFaces` は、大規模アセンブリや複雑なマルチボディパーツではコストが高い。

  • 最適化: 探索対象のボディを `swSolidBody` に限定する、あるいは特定のフィーチャ(`Feature.GetFaces`)からのみ面を抽出することで、計算時間を劇的に短縮できる。

エラーハンドリングの極意

`FeatureExtrusionCut2` が `Nothing` を返した際、単に「失敗」と出すのは素人だ。

  • プロのデバッグ: なぜ失敗したのか?「スケッチが完全拘束されていないのか」「ターゲット面がスケッチの法線上に存在しないのか」。`ModelDocExtension.GetLastFeatureAdded` を使い、直前の状態をロールバックする仕組みを実装せよ。

5. 結論:ツール作成担当者が目指すべき地平

SolidWorks VBAを「ただ動くマクロ」から「業務を支えるシステム」に昇華させるには、APIの裏側にあるジオメトリの整合性に対する深い理解が不可欠だ。

今回紹介した「幾何学フィルタリングによるターゲット特定」は、その第一歩に過ぎない。ターゲット面に `Attribute`(属性)を付与して永続的に追跡する手法など、さらなる高みも存在する。

君が書く一行の `Select` が、モデルの変更に耐えうる「意志」を持っているか。常にそれを自問自答してほしい。

執筆者:SolidWorks 伝説のチーフアーキテクト
「コードは、設計者の思考を映す鏡である。美しいジオメトリには、美しいコードが必要だ。」

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