【テクニカル・上級編】【押し出しボス徹底攻略】FeatureManager.FeatureExtrusion3の「薄板フィーチャ(Thin Feature)」パラメータを活用した中空パイプ形状の自動生成 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極限解説】FeatureExtrusion3を支配せよ:薄板フィーチャ(Thin Feature)による中空パイプ自動生成の深層

SolidWorksマクロの自動化において、最も頻繁に、そして最もフラストレーションを溜め込む領域の一つが「フィーチャ生成のパラメータ制御」である。特に`FeatureManager.FeatureExtrusion3`は、引数の数が膨大であり、COMの型ミスマッチや、背後でうごめくC++コア(Parasolid)の挙動に起因するエラーに泣かされたエンジニアも少なくないだろう。

今回は、この`FeatureExtrusion3`メソッドの真髄、とりわけ「薄板フィーチャ(Thin Feature)」のパラメータを完全にハックし、コードから一発で高精度な中空パイプ形状を生成する実践的アプローチを公開する。

レガシーなVBA環境であっても、メモリのライフサイクルを厳密に管理し、システム間連携に耐えうる堅牢なコードを構築するための知見を授けよう。

1. 現場のエンジニアが陥る「薄板押し出し」の罠

筐体設計や配管ルーティングの初期ベースとなる「中空パイプ」を自動生成する際、多くの初心者は「外側円を描いてから内側円をくり抜く(カット extrude)」という冗長なアプローチをとる。

しかし、これは悪手である。

  • スケッチ要素の肥大化: 2つの同心円をスケッチ拘束付きで管理する必要があり、モデルの rebuild(再構築)コストが増大する。
  • フィーチャツリーの汚染: ボスとカットの2つのフィーチャが生成され、後続の設計変更に対するロバスト性が著しく低下する。

正解は「単一の円(または閉曲線)スケッチに対し、薄板フィーチャのパラメータを直接インジェクトする」ことだ。 これにより、1つのフィーチャで肉厚を持った中空形状をダイレクトに生成できる。

2. FeatureExtrusion3 のシグネチャと「薄板」フラグの真実

`FeatureExtrusion3` メソッドは、VBAからコールする際、非常に多くの引数を要求する。特に薄板フィーチャを制御するためには、以下のパラメータ群を正確に理解し、ビットフラグや数値を渡さなければならない。

Dim swFeat As SldWorks.Feature
Set swFeat = swModel.FeatureManager.FeatureExtrusion3( _
ByVal ThinType As Long, ‘ 薄板のタイプ (swThinWallType_e)
ByVal RevDir As Boolean, ‘ 押し出し方向反転
ByVal BothEndDir As Boolean, ‘ 両方向押し出し
ByVal D1 As Double, ‘ 押し出し深さ 1
ByVal D2 As Double, ‘ 押し出し深さ 2
ByVal DRAFT_ANG_1 As Double, ‘ 抜き勾配 1
ByVal DRAFT_ANG_2 As Double, ‘ 抜き勾配 2
ByVal DRAFT_OUT_1 As Boolean, ‘ 抜き勾配外側 1
ByVal DRAFT_OUT_2 As Boolean, ‘ 抜き勾配外側 2
ByVal OFFSET_THICK_1 As Boolean, ‘ オフセット有効
ByVal OFFSET_THICK_2 As Boolean, ‘ オフセット有効
ByVal TRANSLATE_SURF_1 As Boolean, ‘ サーフェスを翻訳
ByVal TRANSLATE_SURF_2 As Boolean, ‘ サーフェスを翻訳
ByVal TDIR1 As Long, ‘ 薄板の方向 (swThinWallDir_e)
ByVal TDIR2 As Long, ‘ 薄板の方向
ByVal THICK1 As Double, ‘ 板厚 1
ByVal THICK2 As Double, ‘ 板厚 2
ByVal Merge As Boolean, ‘ 既存ボディとのマージ
ByVal UseFeatScope As Boolean, ‘ フィーチャースコープ
ByVal UseAutoSelect As Boolean ‘ 自動選択
)

この中でも、中空パイプ生成の肝となるのは以下の3点だ。
1. `ThinType` (swThinWallType_e): 一方向 (`swThinWallOneDirection`)、両方向 (`swThinWallMidPlane`)、等などを指定。
2. `TDIR1` (swThinWallDir_e): 外側、内側、あるいは押し出し方向に対する配置を決定。
3. `THICK1`: 実際の肉厚値(メートル単位)。

3. 実践:中空パイプをミリ単位で制御して一発生成するVBAコード

以下のコードは、バックグラウンドでのオブジェクトライフサイクル管理を徹底し、メモリリークを排除した実務仕様のプロシージャである。新規パーツドキュメントの生成から、XY平面への円スケッチ、そして薄板押し出しによるパイプ化までを完璧に実行する。

Option Explicit

‘ ——————————————————————————–
‘ 伝説のチーフアーキテクトによる実装モデル
‘ 目的: 薄板フィーチャを活用した中空パイプの自動生成
‘ ——————————————————————————–
Sub CreateThinWallPipe()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim boolstatus As Boolean
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature

‘ 1. SolidWorks アプリケーションの取得 (Late/Early Bindingの選択)
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If

‘ 2. 新規パーツドキュメントの作成 (テンプレートパスは環境依存)
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\SolidWorks 2023\templates\part.prtdot”, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “パーツドキュメントの作成に失敗しました。”, vbCritical
Exit Sub
End If

Set swPart = swModel

‘ 3. スケッチ平面の選択 (Front Plane)
boolstatus = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “ベース平面の選択に失敗しました。”, vbCritical
Exit Sub
End If

‘ 4. 円スケッチの作成 (直径 50mm = 0.05m)
‘ 単位系は常にMKS (Meter, Kilogram, Second) で処理するのがAPIの鉄則
swModel.SketchManager.InsertSketch True
Dim swSketchCircle As SldWorks.SketchSegment
Set swSketchCircle = swModel.SketchManager.CreateCircleByRadius(0, 0, 0, 0.025)
swModel.SketchManager.InsertSketch True ‘ スケッチ終了

‘ 5. FeatureManagerの取得とエラーハンドリング
Set swFeatMgr = swModel.FeatureManager
If swFeatMgr Is Nothing Then
MsgBox “FeatureManagerの取得に失敗しました。”, vbCritical
GoTo CleanUp
End If

‘ 6. 薄板フィーチャによる押し出し実行 (中空パイプ生成)
‘ 引数設計:
‘ – ThinType: swThinWallOneDirection (1)
‘ – RevDir: False
‘ – BothEndDir: False
‘ – D1 (押し出し長さ): 0.2m (200mm)
‘ – D2: 0 (未使用)
‘ – Draft: 0
‘ – ThinDir: swThinWallDir_Namespace.swThinWall_OneDir_Outer (1)
‘ – Thickness: 0.003m (3mm厚)
‘ – Merge: True (マルチボディ化を防ぎ、単一ソリッドとして構築)

On Error GoTo ApiError
Set swFeat = swFeatMgr.FeatureExtrusion3( _
1, _ ‘ ThinType: 一方向薄板
False, _ ‘ RevDir
False, _ ‘ BothEndDir
0.2, _ ‘ D1 (depth: 200mm)
0#, _ ‘ D2
0#, 0#, _ ‘ Draft angles
False, False, _ ‘ Draft outward
False, False, _ ‘ Offset thickness
False, False, _ ‘ Translate surface
1, _ ‘ TDIR1: 外側方向へ厚み付加 (swThinWall_OneDir_Outer等に相当)
0, _ ‘ TDIR2
0.003, _ ‘ THICK1: 3mmの肉厚
0#, _ ‘ THICK2
True, _ ‘ Merge
True, _ ‘ UseFeatScope
True _ ‘ UseAutoSelect
)
On Error GoTo 0

If swFeat Is Nothing Then
MsgBox “フィーチャの生成に失敗しました。Parasolidカーネルがエラーを返した可能性があります。”, vbCritical
Else
swModel.ViewZoomtofit1
MsgBox “中空パイプの自動生成が完了しました。”, vbInformation
End If

CleanUp:
‘ 7. メモリ最適化とオブジェクト参照の明示的解放
‘ COMオブジェクトの残存によるメモリリークを防ぐため、逆順でNothing代入を徹底
Set swFeat = Nothing
Set swFeatMgr = Nothing
Set swSketchCircle = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub

ApiError:
MsgBox “API実行時予期せぬエラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub

4. シニアエンジニアが知るべき「メモリ最適化」と「APIの罠」

上記のコードを見て、「なぜ最後にわざわざ `Set swFeat = Nothing` などを丁寧に記述しているのか?」と疑問に思った若手エンジニアもいるだろう。

VBAのガベージコレクションは非常に怠惰(Lazy)である。特にSolidWorksのような巨大なCOMコンポーネントを操作する場合、変数スコープを抜けただけではCOM参照が解放されず、バックグラウンドプロセス(SLDWORKS.exe)のメモリ空間にゴミが残留し続ける。これが蓄積すると、マクロの連続実行時に「オートメーション エラー (-2147417848 (80010108))」や突然のクラッシュを引き起こす。

極限の知見:

  • MKS単位系の強制: SolidWorks APIは内部単位として「メートル(m)」と「ラジアン(rad)」を絶対とする。UI側の表示単位(mmなど)に依存したコードを書くことは、システム間連携や海外拠点とのデータ共有において致命的なバグの温床となる。コード内では常にメートルで記述せよ。
  • フィーチャースコープの制御: アセンブリ文脈や複雑なパーツにおいて `UseFeatScope` と `UseAutoSelect` を適切に設定しないと、意図しない既存ボディとの結合(マージ)が発生し、ジオメトリが崩壊する。単一パーツのベース生成であっても、ここを明示的に指定するのがプロの作法である。

5. 総括

`FeatureExtrusion3` の薄板フィーチャパラメータをマスターすることは、単にコードの行数を削減するだけでなく、「CADの数学的コア(Parasolid)と直接対話し、意図したトポロジーをミリ秒単位で構築する」というエンジニアリングの領域に踏み込むことを意味する。

レガシーなVBAであっても、オブジェクトのライフサイクルを制御し、パラメータの物理的意味を完全に理解していれば、屈強な自動化システムを構築できる。

手作業によるモデリングの時代は終わった。コードで形状を支配し、真の設計自動化を手に入れてほしい。

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