SolidWorks VBAを掌握する極限の知見:【押し出しボス徹底攻略】`FeatureExtrusion3`「オフセット(Offset From Surface)」の要塞設計
こんにちは。業務自動化エンジニアの私だ。
これまで数多の製造業における設計プロセスの自動化を手がけてきたが、SolidWorksのAPI、特にフィーチャ生成領域における「暗黙のルール」を無視したコードは、例外なく現場で破綻する。
ネット上のコードをコピペして「動いたからヨシ」としていないだろうか?
モデルの変更、参照面の削除、コンテキストの喪失――少しの仕様変更でクラッシュする脆弱なマクロは、エンジニアの信頼を地に落とす。
今回は、実務で最も頻繁に遭遇する難所の一つ、`FeatureExtrusion3`メソッドを用いた「オフセット(Offset From Surface)」による端面処理を徹底解説する。
単なるメソッドの使い方の解説ではない。「なぜそのパラメータが必要なのか」「どう書けば100%安全なプロダクションコードになるのか」を、私と一緒に紐解いていこう。
—
1. なぜ「オフセット(Offset From Surface)」なのか?実務における致命的な課題
パーツ設計において、ある基準面や既存のサーフェスから「一定距離離れた位置」で押し出しを終端させたいケースは多々ある。
例えば、金型の逃げ形状、熱収縮を見込んだオフセット、あるいはアセンブリの干渉回避などだ。
これを素人が実装するとどうなるか。
「終端条件:サーフェスからオフセット(`swEndCond_OffsetFromSurface`)」を指定せず、わざわざ仮想的なオフセット面をジオメトリとして自作し、そこに「サーフェスまで」で押し込もうとする。
今すぐその非効率な設計はやめなさい。
ジオメトリの乱立はSolidWorksの再構築(Rebuild)時間を増大させ、モデルの肥大化とエラー耐性の低下を招く。
APIの正しき作法は、`FeatureExtrusion3` の引数を完璧に制御し、単一のフィーチャ内でオフセット終端を完結させることだ。ここにエンジニアとしてのプライドを持て。
—
2. APIの核心:`FeatureExtrusion3` のシグネチャと罠
まず、恐るべき多引数を誇る `FeatureExtrusion3` の仕様を直視しよう。
特に「オフセット」を司るパラメータ群は、型や順序を間違えた瞬間にエラー 0x80020005 (型ミスマッチ) や、沈黙の失敗(フィーチャが生成されずモデルが崩壊する)を引き起こす。
オフセット指定時に死守すべき主要パラメータ
- `Dir`: 方向に依存。
- `T1Type`: 終端条件(ここで `swEndCond_OffsetFromSurface` を指定する)。
- `T2Type`: 第2方向の終端条件。
- `Depth`: ブラインド時の深さ(オフセット時はここが「オフセット距離」の受け皿になることがあるため注意が必要)。
- `OffsetReverse1`: オフセット方向の反転(True/False)。これが鬼門。
特に `OffsetReverse1` や参照するサーフェスの「方向ベクトル」の概念を理解していない者は、必ず右往左往することになる。
—
3. 【プロダクションコード】堅牢なオフセット押し出し実装
現場でそのまま組み込める、エラーハンドリング完備の実務レベルのコードを提示する。
このコードは、既存の平面(またはサーフェス)を選択し、そこから指定ミリメートル浮かせた状態でボス押し出しを行うものである。
‘ ==============================================================================
‘ 堅牢性重視型:オフセット・ボス押し出し実行プロシージャ
‘ 前提条件: アクティブパーツにスケッチが存在し、かつオフセットの基準となる平面/面が存在すること
‘ ==============================================================================
Public Sub CreateOffsetExtrusionSample()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
‘ 1. アプリケーションとドキュメントの安全な取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ パーツドキュメントかどうかの型チェック (0 = swDocASSEMBLY, 1 = swDocDRAWING, 2 = swDocPART)
If swModel.GetType <> 2 Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation, “処理中断”
Exit Sub
End If
Set swFeatMgr = swModel.FeatureManager
If swFeatMgr Is Nothing Then Exit Sub
‘ エラーハンドリングの有効化
On Error GoTo ErrorHandler
‘ 2. パラメータの定義
Dim draftAngle As Double
Dim isThin As Boolean
Dim reverseDir As Boolean
Dim dir As Long
Dim t1Type As Long
Dim t2Type As Long
Dim depth As Double
Dim depth2 As Double
Dim dDraftAng1 As Double
Dim dDraftAng2 As Double
Dim fwd As Boolean
Dim bFlush As Boolean
Dim cut As Boolean
Dim capEnds As Boolean
Dim t1TranslateSurface As Boolean
Dim t2TranslateSurface As Boolean
‘ — 設定値の流し込み —
draftAngle = 0#
isThin = False
reverseDir = False // 押し出し方向の反転
dir = 0 // 0: 双方なし、等
‘ 【重要】終端条件の指定: サーフェスからのオフセット
‘ swEndCond_e.swEndCond_OffsetFromSurface の値は通常 13
t1Type = 13 ‘ swEndCond_OffsetFromSurface
t2Type = 0 ‘ 終端2は未使用 (swEndCond_Blind等)
depth = 0.015 // オフセット距離 (15mm の場合 0.015m [SI単位系])
depth2 = 0#
dDraftAng1 = 0#
dDraftAng2 = 0#
fwd = True // スケッチ平面からの前進方向
bFlush = False
cut = False // Bossの場合はFalse (Cutの場合はTrue)
capEnds = False
t1TranslateSurface = False // サーフェスを平行移動するか、形状に沿わせるか
t2TranslateSurface = False
‘ 3. 参照サーフェス(オフセットの基準面)の事前選択チェック
‘ 実務では、あらかじめAPI側で面をプログラム選択(Extension.SelectByID2など)しておく必要がある。
‘ ここではユーザーが事前に面を選択している前提とする。
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swModel.SelectionManager
If swSelMgr.GetSelectedObjectCount2(1) < 1 Then MsgBox "オフセットの基準となる面(サーフェス/平面)が選択されていません。", vbExclamation, "選択エラー" Exit Sub End If ' 4. FeatureExtrusion3 の実行 ' 注記: SolidWorksのAPIバージョンや仕様により引数の数が多いため、正確に型を合わせる。 Set swFeat = swFeatMgr.FeatureExtrusion3( _ fwd, _ ' 押し出し方向 (方向1) reverseDir, _ ' 逆方向フラグ cut, _ ' 切り取りか否か t1Type, _ ' 終端条件1 (Offset From Surface) t2Type, _ ' 終端条件2 depth, _ ' 奥行き / オフセット距離 depth2, _ ' 奥行き2 draftAngle, _ ' 抜き勾配1 dDraftAng1, _ ' 抜き勾配2 False, _ ' 抜き勾配外側方向 False, _ ' 抜き勾配外側方向2 isThin, _ ' 薄板フィーチャか 0#, _ ' 薄板壁厚1 0#, _ ' 薄板壁厚2 0, _ ' 薄板端部処理1 0, _ ' 薄板端部処理2 False, _ ' 自動フィレット外側 False, _ ' 自動フィレット内側 t1TranslateSurface, _ ' オフセットサーフェスの平行移動モード t2TranslateSurface ' オフセットサーフェス2の平行移動モード ) If swFeat Is Nothing Then Err.Raise 9999, "Macro", "FeatureExtrusion3 の実行に失敗しました。参照面の選定やオフセット距離を確認してください。" End If ' 5. 成功時のクリーンアップと再構築 swModel.ClearSelection2 True swModel.EditRebuild3 MsgBox "オフセット押し出しフィーチャの生成に成功しました。", vbInformation, "完了" Exit Sub ErrorHandler: MsgBox "予期せぬエラーが発生しました。" & vbCrLf & _ "エラー番号: " & Err.Number & vbCrLf & _ "説明: " & Err.Description, vbCritical, "システムエラー" ' 必要に応じたログ出力やトランザクション破棄処理をここに記述 End Sub ---
4. チーフアーキテクトが教える「現場でハマる3つの罠と対策」
上記のコードをそのまま動かしても、実務の現場では容赦なくバグが牙をむくことがある。以下の3点は必ず押さえておけ。
罠1:単位系(SI単位系:メートル法)の罠
SolidWorksのAPI内部処理は、例外なく「メートル (m)」で動作している。
画面上では「15mm」と表示されていても、コード上で `depth = 15` と記述すれば、それは 15メートル(15,000mm)の壁 を生み出すことになる。モデルが一瞬で爆発するか、計算エラーで弾かれるのはそのためだ。
コード内の距離指定は必ず `0.015` のようにメートル換算で行うこと。
罠2:コンテキストの喪失(参照面の変更・削除)
「オフセット元として指定した平面」が、上流のモデリング変更によって削除されたり、IDが置き換わったりした場合、APIは路頭に迷う。
これを防ぐには、
1. 参照面を名前(Name)ではなく Persistent ID(PID) で確実にバインドする。
2. もしくは、マクロ実行前に必要な基準面をプログラム側で動的に生成・確定させてから押し出しを叩く。
この2点のいずれかを設計に組み込むべきだ。
罠3:`t1TranslateSurface`(サーフェス平行移動モード)の挙動
オフセット時に、選択したサーフェスの「形状のままオフセットする」のか、「サーフェスの接平面を無限に拡張してオフセットする」のかは、`t1TranslateSurface` の真偽値(True/False)で挙動が激変する。
複雑な形状や曲面に対してオフセット押し出しを行う場合、ここを誤ると「交差エラー(Zero thickness or geometry error)」を引き起こす。曲面を相手にする場合は必ずテスト環境でこのフラグの挙動を検証すること。
—
5. まとめ:自動化コードに「魂」を宿せ
今回は、SolidWorks VBAにおける `FeatureExtrusion3` の「オフセット(Offset From Surface)」パラメータを活用した堅牢な端面処理について解説した。
単に動くコードを書くだけなら、マクロ記録をボタン一つ押せばいい。だが、我々が目指すべきは「どんな仕様変更やモデルの揺らぎに対してもびくともしない、メンテナンス性の高い堅牢な自動化資産の構築」である。
パラメータの型、単位系、エラーハンドリング、そして参照面のライフサイクル。これらを完全に掌握したとき、君の書くマクロは単なる「お助けスクリプト」から、現場を支える「強固なエンジニアリングツール」へと昇華する。
健闘を祈る。次の現場でも、美しいコードでSolidWorksを従えてくれ。
