SolidWorks VBAの極地:CreateThickenFeatureを完全制御し、厚み付けの「地獄」から脱却する
SolidWorks APIを扱うエンジニア諸君。`CreateThickenFeature`で苦しんだことはないか?
「サーフェスを選択して厚みを付けるだけ」という単純な処理。しかし、一度でも実務で複雑な曲面を扱った者なら知っているはずだ。「方向反転エラー(Reversal Error)」と「ジオメトリの破綻」という名の泥沼に。
APIリファレンスをただなぞるだけのコードは、現場ではゴミ同然だ。今日は、サーフェスモデリングの自動化において、堅牢かつ「落ちない」厚み付け実装の極意を伝授する。
—
1. なぜ `CreateThickenFeature` は期待を裏切るのか
多くのエンジニアが陥る罠は、サーフェスの法線方向を無視して「とりあえずプラス値」を放り込むことだ。
SolidWorksの `Thicken` フィーチャは、内部的にサーフェスの法線ベクトルを参照している。しかし、インポートしたIGESやSTEP、あるいは複雑なパッチワーク面では、法線がバラバラな方向を向いていることが多い。
実務で守るべき「3つの鉄則」
1. 法線の統一: 厚み付けの前に `IFeatureManager::Thicken` を呼ぶのではない。まずは面を選択し、それが「どちら側を向いているか」を設計意図と照合せよ。
2. 方向指定の明示: `ThickenType` に頼るな。`ThickenDir` 引数を論理的に計算し、定数 `swThickenType_OneSide` で制御せよ。
3. 境界の破綻回避: 複雑な曲面では、厚み付けによって自己交差が発生する。API実行前に `SelectionManager` で確実に面が取得されているか、そしてその面が「ソリッド化可能なトポロジーか」を検証するステップが必須だ。
—
2. 実装コード:堅牢なThicken操作のテンプレート
以下は、私が大規模設計自動化プロジェクトで標準採用している「安全な肉付け」のコードだ。エラーハンドリングとオブジェクト参照の解放を徹底している。
‘ 堅牢なサーフェス厚み付け関数
‘ swApp: SolidWorks Application
‘ swModel: PartDoc
‘ swSurface: 選択したサーフェス本体
‘ thickness: 厚み値 (mm)
‘ flipDir: 方向を反転させるか (Boolean)
Public Function CreateSolidThicken(swApp As Object, swModel As Object, swSurface As Object, thickness As Double, flipDir As Boolean) As Object
Dim swFeatMgr As Object
Set swFeatMgr = swModel.FeatureManager
‘ 1. 選択状態のクリアと対象の選択
swModel.ClearSelection2 True
If Not swSurface.Select2(False, 0) Then
Err.Raise vbObjectError + 1000, , “サーフェスの選択に失敗しました。”
End If
‘ 2. 厚み付けの実行
‘ 第1引数: 厚み
‘ 第2引数: どちら側か (1: 片側, 2: 両側, 3: 反対側)
‘ 第3引数: 頂点/エッジ等を保持するか (True)
‘ 第4引数: 反転フラグ
Dim swThicken As Object
Set swThicken = swFeatMgr.InsertThicken( _
thickness / 1000, _
IIf(flipDir, 3, 1), _
0, _
True, _
False, _
True)
If swThicken Is Nothing Then
‘ ここで詳細なエラーログを吐く設計にすること
Debug.Print “厚み付け失敗: ジオメトリが不正か、厚みが大きすぎます。”
Exit Function
End If
Set CreateSolidThicken = swThicken
End Function
—
3. プロダクション環境における注意点
データベース連携の罠
自動化ツールがデータベース(SQL Server等)から厚みのパラメータを受け取る際、単位系(メートル法 vs ミリメートル法)の変換ミスが多発する。APIは常に「メートル単位」で計算するため、必ず `1000` で割る処理を隠蔽せよ。
メモリリークとCOMオブジェクト
VBA環境での `SelectionManager` や `Feature` オブジェクトの取り扱いは注意が必要だ。ループ処理内で何度も `InsertThicken` を呼ぶ場合は、必ず `DoEvents` を挟み、SolidWorksのグラフィックス更新とバッファを解放させなければ、大規模モデルでクラッシュする。
ジオメトリの「再構築(Rebuild)」
`InsertThicken` の直後に `swModel.ForceRebuild3` を呼ぶのは素人のやり方だ。実行直後に `swModel.EditRebuild3` を呼び出し、フィーチャが正常にソリッドとして確定したか `swThicken.GetDefinition` で確認する。これがプロのコードだ。
—
最後に:エンジニアへのメッセージ
サーフェスからソリッドへの変換は、単なるAPI呼び出しではない。それは「数学的な接合」だ。
もし諸君が作成しているツールが「時々エラーを吐く」のであれば、それはAPIのせいではない。「サーフェスの法線という変数を、コードが掌握できていない」ことが原因だ。
コードを信じるな。モデルのトポロジーを疑え。そして、エラー発生時に「なぜ失敗したか」をログとして吐き出させるための、堅牢な検証レイヤー(Validation Layer)を構築せよ。
それが、真の自動化エンジニアへの道だ。質問があれば、次のコードを書き終えてから来たまえ。健闘を祈る。
