こんにちは。SolidWorks VBAの世界へようこそ。
現場で設計自動化の最前線に立つエンジニアの皆さん、そして「マクロ記録のコードが動かなくて頭を抱えている」そこのあなた。今日は一歩、プロの領域へ踏み出してみましょう。
今回のテーマは、実務で非常によく使う「押し出しカット(Cut-Extrude)」です。
それも、単に「10mmカットする」といった単純なものではなく、「特定の曲面(サーフェス)までカットする」という、実戦的なテクニックに焦点を当てます。
マクロ記録でこの操作を記録すると、高確率で「実行するとエラーになる」「ターゲットの面が見つからない」という壁にぶち当たります。なぜそれが発生するのか、どうすれば「絶対に外さない」コードが書けるのか。
「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ」という自信を持って解説していきます。
—
1. なぜ「マクロ記録」のコードは壊れやすいのか?
まず、原因を知ることから始めましょう。マクロ記録を行うと、面を選択するコードは通常このようになります。
‘ マクロ記録の例(壊れやすい!)
boolstatus = Part.Extension.SelectByID2(“Face1@Part-1”, “FACE”, 0.1, 0.2, 0, False, 0, Nothing, 0)
この `”Face1@Part-1″` という書き方が諸悪の根源です。
SolidWorksが内部的に自動で振った名前(Face1など)は、形状が変わったり、フィーチャの順番を入れ替えたりするだけで、簡単に変わってしまいます。これが「ターゲット面ロスト」の正体です。
プロのエンジニアは、名前ではなく「オブジェクトそのもの」を捕まえに行きます。
—
2. ターゲット面を確実に「捕まえる」スマートな手法
「サーフェスまでカット」を実現するには、以下の3ステップが必要です。
1. スケッチを選択する(カットする形状)
2. ターゲットとなる面(Face)を特定する(どこまで切るか)
3. FeatureCut4 メソッドを実行する
特に「2」が重要です。名前で指定する代わりに、「特定の座標を通る面」や「特定のフィーチャが持つ面」として取得するのがスマートです。
—
3. 実践コード:曲面まで確実にカットする
では、具体的なコードを見ていきましょう。このコードは、あらかじめ作成された「曲面(Surface-Body)」をターゲットにして、スケッチを押し出しカットする例です。
‘
‘ Title: Smart Cut-Extrude Up To Surface
‘ Description: ターゲット面を確実に捕捉し、「サーフェスまで」のカットを実行する
‘
Sub SmartCutToSurface()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swFeatMgr As SldWorks.FeatureManager
Dim swEnt As SldWorks.Entity
Dim boolstatus As Boolean
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントが開いているかチェック
If swModel Is Nothing Then
MsgBox “パーツファイルを開いてください。”
Exit Sub
End If
Set swSelMgr = swModel.SelectionManager
Set swFeatMgr = swModel.FeatureManager
‘ — STEP 1: カットしたいスケッチを選択 —
‘ ここでは “Sketch2” という名前を仮定していますが、
‘ 本来は直前に作成したスケッチオブジェクトを指定するのが理想的です。
boolstatus = swModel.Extension.SelectByID2(“Sketch2”, “SKETCH”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “スケッチが見つかりません。名前を確認してください。”
Exit Sub
End If
‘ — STEP 2: ターゲットとなる「面」を特定する (重要!) —
‘ ここでは、特定の座標 (x, y, z) に触れている面を取得するロジックを使います。
‘ これにより、”Face1″といった不安定な名前に頼らずに済みます。
‘ 例として (0, 0.05, 0) 付近にある面を選択
‘ SelectByID2の引数: 座標(x,y,z), タイプ(FACE), マップ等
‘ 最後の引数「Mark」に「1」を入れるのがポイント(FeatureCutの終点指定用)
boolstatus = swModel.Extension.SelectByID2(“”, “FACE”, 0, 0.05, 0, True, 1, Nothing, 0)
If Not boolstatus Then
MsgBox “ターゲットとなる面が見つかりませんでした。”
Exit Sub
End If
‘ — STEP 3: 押し出しカットの実行 (FeatureCut4) —
‘ FeatureCut4 の引数は非常に多いですが、重要なのは第4引数の「swEndCond_UpToSurface」です。
‘ 引数の解説:
‘ SD1 (第1方向): True, 反転: False, 貫通: False
‘ 終点条件: 4 (swEndCond_UpToSurface)
‘ …中略…
‘ ターゲット面を Mark=1 で選択しているため、自動的にそこが終点になります。
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatMgr.FeatureCut4( _
True, _
False, False, _
4, 0, _
0.01, 0.01, _
False, False, False, False, _
0.01745, 0.01745, _
False, False, False, False, _
False, True, True, _
True, True, False, _
0, 0, False, False)
If Not swFeat Is Nothing Then
Debug.Print “カット成功: ” & swFeat.Name
Else
MsgBox “カットフィーチャの作成に失敗しました。”
End If
swModel.ClearSelection2 True
End Sub
—
4. プロの視点:ここが「ハマり」ポイント!
① `Mark`(マーク)の重要性
`SelectByID2` の引数にある `1` という数字(Mark)に注目してください。
SolidWorksのAPIでは、「どの選択肢が何の役割か」をこの数値で区別します。
`FeatureCut4` において、「どの面までカットするか」を指定するには、その面を Mark = 1 で選択しておく必要があります。これを知らないと、いくら面を選択しても「終点が見つかりません」というエラーになります。
② `FeatureCut4` の引数の多さ
「引数が多すぎて何を入力すればいいかわからない!」となりますよね。
実務で特に意識すべきは以下の3つだけです。
- 第1方向の終点条件 (EndCondition): `4` (`swEndCond_UpToSurface`) を指定。
- 第1方向の深度: 「サーフェスまで」の場合は無視されますが、一応適当な値(0.01など)を入れます。
- 反転 (Flip): カットする方向が逆になったら、第2引数の `True/False` を切り替えます。
③ 座標指定による選択の安定化
`SelectByID2` で名前(”Face1″など)を空文字 `””` にして、座標 `(x, y, z)` を指定すると、SolidWorksはその地点にあるオブジェクトを探しに行きます。
もし可能であれば、ターゲットとなるサーフェスを作成した直後に、そのフィーチャから `GetFaces` メソッドで面を直接取得し、`Entity.Select4` を使って選択するのが「世界最高峰」の安定性を誇る書き方です。
—
5. まとめ:自動化を成功させるマインドセット
今回のポイントを整理しましょう。
1. 名前(String)に頼らない: 名前は変わるもの。座標やオブジェクト参照を使おう。
2. Markを使いこなす: APIが「どの面をターゲットにすべきか」を理解できるように。
3. 座標選択を活用する: `SelectByID2` は座標でも選択できる強力な武器。
「マクロ記録」は、あくまで「どのメソッドを使うべきか」を調べるための辞書のようなものです。そのまま使うのではなく、今回のように「オブジェクトをどう確実に捕まえるか」という視点で書き直すことで、あなたのコードは劇的に安定します。
これができれば、複雑な金型設計や自動モデリングの基礎はマスターしたも同然です。
次は、複数のボディが絡む「マルチボディ」のカットにも挑戦してみてくださいね。
あなたの自動化ライフが、より創造的で楽しいものになることを願っています!
