【実務・中級編】【穴ウィザード完全制覇】HoleWizardDefオブジェクトを用いたMボルト用タップ穴の深さ・下穴径の動的カスタマイズ – SolidWorks VBA解析バイブル

スポンサーリンク

【穴ウィザード完全制覇】HoleWizardDefオブジェクトを用いたMボルト用タップ穴の深さ・下穴径の動的カスタマイズ

開発プロジェクトのリーダーである私から、SolidWorks VBAを極めようとするエンジニアのあなたへ問う。

「UIから穴ウィザードを手動でポチポチ操作し、規格の制約に縛られて冷や汗をかいたことはないか?」
「特殊な深さ、あるいは非標準の下穴径を持つMボルト用タップ穴を大量に、かつ一瞬でプログラムから生成したいと思ったことはないか?」

一般的なネット上のリファレンスには、「`InsertHoleWizard2` を使えば穴が作れます」としか書いていない。しかし、実務の現場でそんなお遊戯コードは使い物にならない。規格外の深さ、カスタム下穴、そして無数のパーツバリエーション……これらを完全制御下に置くためには、`HoleWizardDef` オブジェクトのライフサイクルと内部パラメータのブラックボックスを暴く必要がある。

今回は、標準規格の呪縛を断ち切り、プログラムから自由自在にタップ穴を操る「極限の知見」を授けよう。

1. なぜ標準APIのままでは破綻するのか?

SolidWorksのAPIで穴ウィザードを扱う際、多くの初心者がハマる罠がある。それは「UIの挙動をそのままVBAに移植しようとする」ことだ。

穴ウィザードの定義データ構造は非常に重く、不適切なパラメータの組み合わせを渡すと、APIはエラーすら吐かずに「サイレント失敗(作成失敗)」を起こすか、あるいはSolidWorksごと沈黙する。
特にMボルトのタップ穴(ISO Tap等)において、「ねじ部深さ(BlindDepth)」「穴深さ(HoleDepth)」、そして「下穴径(DrillDiameter)」の関係性を数式で動的に書き換えるには、`FeatureData2` からキャストして取得する `HoleWizardDef` の各プロパティの「更新順序」を厳密に守る必要がある。

場当たり的なコードは、保守フェーズにおいて必ずチームの足かせとなる。ここからは、プロダクション環境(現場)に耐えうる、堅牢でスケーラブルな実装パターンを解説する。

2. 堅牢なコード設計の要諦

業務自動化ツールとしてこの機能を組み込む場合、以下の3点を担保しなければならない。

1. ドキュメントコンテキストの厳格な管理: アクティブドキュメントの型チェック(PartDocであることの確認)
2. FeatureDataのスコープ管理: `AccessSelections` と `ModifyDefinition` の正しいトランザクション処理
3. エラーハンドリング: 不正な寸法値が入力された際のフェイルセーフ

これらを満たす、コピペ即実戦投入可能なプロダクションコードを以下に提示する。

3. 実装コード:Mボルト用タップ穴の動的カスタマイズ

以下のVBAコードは、指定した平面上に、標準規格をオーバーライドしたカスタム寸法のMボルト用タップ穴(盲穴)を生成するモジュールである。

Option Explicit

Sub CreateCustomHoleWizard_MTap()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatureMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
Dim swHoleDef As SldWorks.HoleWizardDef
Dim boolstatus As Boolean

‘ 1. アプリケーションおよびドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If

‘ 2. 穴ウィザード定義の作成
‘ 引数: 穴タイプ(ISOタップ=7), 規格(JIS=0等), 規格サイズ,
‘ ねじ深さ, 穴深さ, 下穴径… etc
Set swFeatureMgr = swModel.FeatureManager

‘ ここでは一旦ベースとなる穴ウィザード定義オブジェクトを生成する
‘ ※引数の詳細な定数はSolidWorks APIヘルプ (HoleWizardTypes) を参照
Set swHoleDef = swFeatureMgr.CreateDefinition(swDataDefinition_HoleWizard)

If swHoleDef Is Nothing Then
MsgBox “HoleWizardDefの生成に失敗しました。”, vbCritical, “致命的エラー”
Exit Sub
End If

With swHoleDef
‘ — 規格・サイズの指定 —
‘ 例: M8 x 1.25 のタップ穴をベースにする
.HoleType = swWizHoleTap ‘ タップ穴
.Standard = swWizStandardJIS ‘ JIS規格
.FastenerType = “M8” ‘ サイズ

‘ — 形状パラメータの動的オーバーライド(単位はメートル法:MKS推奨のため変換に注意) —
‘ 標準規格の制約を無視して、ミリメートル単位で直接値を流し込む

.Diameter = 0.0068 ‘ 下穴径 (例: 6.8 mm -> 0.0068 m)
.HoleDepth = 0.035 ‘ 穴全体の深さ (35 mm)
.BlindDepth = 0.025 ‘ ねじ部の深さ (25 mm)

‘ 栓(タップの頭部ざぐり等)が必要な場合はここで指定
.CosmeticThreadType = 1 ‘ 雌ねじ表示あり
End With

‘ 3. 2Dスケール上の配置点を作成(あらかじめ平面を選択している前提)
‘ 実務では事前にSketchPointを配置するか、XYZ座標で刺す
boolstatus = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “ベースとなるスケッチ平面が選択されていません。”, vbExclamation, “警告”
Exit Sub
End If

‘ 4. フィーチャの生成実行
Set swFeat = swFeatureMgr.CreateFeature(swHoleDef)

If Not swFeat Is Nothing Then
swModel.GraphicsRedraw2
MsgBox “カスタムMボルト用タップ穴の生成に成功しました。”, vbInformation, “完了”
Else
MsgBox “穴フィーチャの生成に失敗しました。パラメータの組み合わせを確認してください。”, vbCritical, “エラー”
End If

End Sub

4. チーフアーキテクトからの実務アドバイス

このコードをそのまま社内の設計自動化フローに組み込むにあたり、以下の2点を遵守してほしい。

単位系の罠(MKS vs IPS)

SolidWorks APIの内部値は、一貫して「メートル(m)」「ラジアン」で保持されている。画面上のUIが「ミリメートル(mm)」であっても、APIに渡す数値は必ず `0.001` を掛けたメートル換算値でなければならない。ここを怠ると、数メートル級の巨大な穴が空いてパーツが崩壊するか、エラーで弾かれる。

データベース連携時の設計

もしExcelや外部データベース(SQL Server等)からボルトの呼び径、ピッチ、深さを動的に取得してこのマクロを回す場合、「存在しない規格組み合わせ」を渡さないバリデーション層をVBAの手前に必ず一枚かませること。API側で例外トラップをするよりも、事前のデータクリーニングの方が圧倒的に堅牢性が高まる。

総括

穴ウィザードの自動化は、単なる「手動操作の代替」ではない。
規格の呪縛からエンジニアを解放し、真にクリエイティブな設計業務へリソースをシフトするための最強の武器だ。

今回伝授した `HoleWizardDef` のオブジェクト制御とパラメータ書き換えの知見をあなたのプロジェクトに実装し、圧倒的なスピードと品質をもたらしてほしい健闘を祈る。

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