SolidWorks VBAの極致:サーフェスからソリッドへ。「CreateThickenFeature」の罠を完全攻略する
こんにちは。SolidWorksの世界へようこそ。
マクロの記録ボタンを押して「生成されたコードを眺めて溜息をつく」のは、今日で終わりにしましょう。
今日は、サーフェスモデリングの最終工程にして、多くのエンジニアが躓く「厚み付け(Thicken)」の自動化について、その本質を伝授します。特に、なぜかエラーで止まる「方向反転の謎」と、その裏側にあるAPIの挙動について深く掘り下げていきます。
—
1. なぜ「CreateThickenFeature」で詰まるのか?
サーフェスをソリッドに変換する際、手動操作では「どちら側に厚みを付けるか」を直感的に選べますが、VBAではそうはいきません。
`CreateThickenFeature` メソッドは非常に強力ですが、「法線(Normal)の向き」と「厚み方向の指定」という2つの概念が噛み合わないと、容赦なくエラーを吐き出します。
- 罠①:面の法線ベクトル
サーフェスの「表」がどちらを向いているかによって、厚みのプラス・マイナスの解釈が変わります。
- 罠②:厚み設定のパラメータ不整合
APIは「厚み(Thickness)」と「方向(Side)」を独立した引数として受け取りますが、サーフェスが複雑すぎると(曲率が急すぎる場合など)、指定した厚みでは自己交差が発生し、計算不能に陥ります。
—
2. 実装の極意:CreateThickenFeature を操るコード
では、現場でそのまま使える「堅牢な」コードを見てみましょう。マクロの記録では決して教えてくれない、エラーハンドリングを意識した構成です。
Sub CreateThickenFeatureRobust()
Dim swApp As Object
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swFeatMgr = swModel.FeatureManager
‘ 1. 面の選択状態を確認(今回は事前に面が選択されている前提)
If swModel.SelectionManager.GetSelectedObjectCount2(0) = 0 Then
MsgBox “対象となるサーフェス面を選択してください。”
Exit Sub
End If
‘ 2. 厚み付けの実行
‘ 引数: 厚み(m), 方向(0:両側, 1:片側法線方向, 2:片側逆方向),
‘ 逆方向にするか(True/False), 結合するか(True/False)
Dim thickness As Double: thickness = 0.005 ‘ 5mm
Dim sideType As Long: sideType = 1 ‘ 1: 法線方向に厚み付け
Dim isReverse As Boolean: isReverse = False ‘ 必要に応じてTrueにする
On Error Resume Next ‘ ジオメトリ計算エラーを制御するため
Set swFeat = swFeatMgr.CreateThickenFeature(thickness, sideType, isReverse)
If swFeat Is Nothing Then
MsgBox “エラー:厚み付けに失敗しました。曲率半径が小さすぎる可能性があります。”
Else
MsgBox “成功:サーフェスがソリッド化されました。”
End If
On Error GoTo 0
End Sub
コードの解説
- `sideType` の重要性: `1`(法線方向)を指定したとき、サーフェスの法線が内側を向いていると、意図せずソリッドが内側に生成されます。もし「外側に出てほしいのに!」という場合は、`isReverse` を `True` に切り替えるか、元となるサーフェスの法線を `ReverseFace` メソッドで反転させる処理を前段に入れる必要があります。
- `On Error Resume Next`: これは手抜きではありません。サーフェスモデリングにおいて、ジオメトリの計算失敗は「予期せぬ挙動」ではなく「起こり得る現象」です。エラー時にプログラムを強制終了させず、適切にメッセージを出すための防波堤です。
—
3. 初学者が陥る「エラーの正体」と解決策
よくあるのが「実行時エラー 91: オブジェクト変数または With ブロック変数が設定されていません」という警告です。これは、`CreateThickenFeature` が生成に失敗し、何も返さなかった(Nothing)ために発生します。
解決のステップ:
1. 選択の再確認: コードで `ClearSelection` を行い、確実に目的の面だけを選択状態にしてください。
2. 法線の可視化: 「表示」>「非表示/表示」>「サーフェスの法線」を表示させ、現在の「表」がどちらを向いているか確認する癖をつけましょう。
3. オフセットの極小値: 厚みが薄すぎても、逆に厚すぎて曲率に干渉してもエラーになります。まずは手動でそのサーフェスに厚み付けができるか確認し、そこから数値をパラメータ化するのが自動化への最短ルートです。
—
最後に:先輩からのアドバイス
SolidWorks VBAは、「あなたの思考をAPIに翻訳する作業」です。
最初はうまくいかなくて当然です。特にサーフェス操作は、数学的な整合性が厳密に求められるため、コンピュータにとっても「頭の使い所」なのです。
「なぜ動かないのか」を一つずつログに出し、法線の向きを一つずつ確認する。その泥臭いプロセスこそが、あなたを単なる「マクロユーザー」から「自動化エンジニア」へと昇華させる唯一の道です。
さあ、次はあなたの設計データで試してみてください。壁にぶつかったら、またいつでもここへ来てくださいね。応援しています。
