【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であっても、オブジェクトのライフサイクルを制御し、パラメータの物理的意味を完全に理解していれば、屈強な自動化システムを構築できる。
手作業によるモデリングの時代は終わった。コードで形状を支配し、真の設計自動化を手に入れてほしい。
