SolidWorks VBAを掌握する極限の知見:【穴ウィザード完全制覇】HoleWizardDefオブジェクトを用いたMボルト用タップ穴の深さ・下穴径の動的カスタマイズ
シニアエンジニアおよび社内CADインフラ管理者諸君。日々の設計自動化において、SolidWorksの標準UIに縛られた「穴ウィザード」の挙動にフラストレーションを感じたことはないか。
「社内独自の特殊な下穴径にしたい」
「規格にない中途半端なねじ深さをプログラムから一撃で流し込みたい」
「UIのダイアログを一切介さずに、高速かつ正確にフィーチャを生成したい」
GUIのマウス操作をそのままVBAで模倣するような愚行は、今すぐ捨て去るべきだ。APIの深淵を覗き、`HoleWizardDef` オブジェクトのメモリ構造とプロパティのライフサイクルを完全に掌握すれば、SolidWorksの穴生成エンジンは完全に我々の手中に収まる。
今回は、標準規格の呪縛を完全に打ち破り、Mボルト用タップ穴の深さや下穴径をコードから動的にねじ伏せる極限のテクニックを伝授する。
—
1. 穴ウィザードAPIのアーキテクチャと隠された罠
SolidWorks VBAにおいて、穴ウィザードフィーチャを生成する正統なアプローチは `FeatureManager.HoleWizard5` または `ICreateHoleWizard` インターフェースの利用である。しかし、ここで多くの開発者が陥る致命的な罠がある。
それは、「`FeatureDefinition`(穴定義オブジェクト)を適切に構築・解放せず、暗黙のCOM参照リークを引き起こすこと」だ。
SolidWorksのAPI背後では、C++ベースの重厚なCOMオブジェクトが稼働している。VBAのガベージコレクションやスコープアウト時の自動解放を信用してはならない。特に `HoleWizardDef` は、プロパティの設定順序を誤るとエラーを吐くか、最悪の場合クラッシュを引き起こす極めて気まぐれなオブジェクトである。
シニアが押さえるべき大原則
1. オブジェクトの明示的解放 (`Set obj = Nothing`): メモリリークを防ぐため、スコープの抜け際ではなく、使い終わった瞬間に即座に参照を切断する。
2. フィーチャ作成前の一括設定: `FeatureManager.CreateDefinition` でインスタンスを得た後、すべてのパラメータをメモリ上で完結させ、最後に `FeatureManager.CreateFeature` に引き渡す。
—
2. 実装コード:Mボルト用タップ穴の動的カスタマイズ
以下のコードは、標準規格の制約をバイパスし、任意のMボルト用タップ穴(ねじ径、下穴径、ねじ深さ、穴深さ)をプログラムから完全に制御して生成する実用プロシージャである。
レガシーなVBA環境であっても安定稼働するよう、エラーハンドリングとオブジェクト管理を極限まで洗練させている。
‘ ==============================================================================
‘ 担当:チーフアーキテクト
‘ 概要:HoleWizardDefを用いたMボルト用タップ穴の動的生成およびパラメータ上書き
‘ ==============================================================================
Sub CreateCustomHoleWizardTapped()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swHoleDef As SldWorks.HoleWizardDef
Dim swFeat As SldWorks.Feature
Dim boolstatus As Boolean
‘ 1. アプリケーションおよびアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなパーツドキュメントが存在しません。”, vbCritical, “API Error”
Exit Sub
End If
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツ環境でのみ実行可能です。”, vbCritical, “Type Error”
Exit Sub
End If
On Error GoTo ErrorHandler
Set swFeatMgr = swModel.FeatureManager
‘ 2. HoleWizardDefオブジェクトの生成
‘ 引数: 穴タイプ(SW_HOLE_WIZARD_TYPE: タップ = swWizardHoleStraightTap等)
‘ ※環境やバージョンに応じた適切なタイプ定数を使用すること
Set swHoleDef = swFeatMgr.CreateDefinition(swDataDefinition_HoleWizard)
If swHoleDef Is Nothing Then
Err.Raise vbObjectError + 1000, “HoleWizard”, “HoleWizardDefのインスタンス生成に失敗しました。”
End If
With swHoleDef
‘ — 規格・サイズの基本設定 —
‘ ここではJIS規格のMボルト用タップをベースに指定
.HoleType = swWizardHoleStraightTap ‘ ストレートタップ
.Standard = 0 ‘ 0: JIS (環境依存の為、事前確認推奨)
.FastenerType = 3 ‘ Mボルト等に応じた規格ID
.Size = “M8” ‘ 基準サイズ
‘ — 動的パラメータの上書き(ここが本題) —
‘ 標準規格の制約を無視し、独自の寸法をミリメートル(m単位)で直接流し込む
‘ 注意: API内部ではメートル単位系(MKS)で処理されるため変換に注意
‘ 下穴径の変更(例: 標準より少し大きめの 7.0mm を強制指定)
.Diameter = 0.007 ‘ 7.0mm = 0.007m
‘ 穴深さ(全体の深さ)の設定
.Depth = 0.025 ‘ 25.0mm = 0.025m
‘ ねじ深さの設定
.ThreadDepth = 0.018 ‘ 18.0mm = 0.018m
‘ 端面処理(沈めや角度など)の構成
.BlindDiameter = 0.007
.BlindDepth = 0.025
.HeadClearance = 0
.HeadClearanceAngle = 0
.Angle = 118 (3.14159265358979 / 180) ‘ 先端118度(ラジアン変換)
End With
‘ 3. プレーススケッチの配置面を選択状態にしておく必要がある
‘ (事前に平面や面が選択されている前提)
‘ 4. フィーチャの生成実行
Set swFeat = swFeatMgr.CreateFeature(swHoleDef)
If swFeat Is Nothing Then
Err.Raise vbObjectError + 1001, “HoleWizard”, “フィーチャの生成に失敗しました。スケッチ面が選択されているか確認してください。”
End If
‘ 成功時の処理
swModel.ForceRebuild3 False
MsgBox “カスタム穴ウィザードフィーチャの生成に成功しました。”, vbInformation, “Complete”
CleanUp:
‘ 5. メモリの明示的解放(極限の安定性を担保する作法)
Set swHoleDef = Nothing
Set swFeatMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “System Error”
Resume CleanUp
End Sub
—
3. シニアエンジニアが知るべき「単位系」と「内部プロパティ」の罠
上記のコードを見て、「なぜ `0.007` なんて値を入れているんだ?」と疑問に思った若手がいるならば、SolidWorks APIの本質をまだ理解していない証拠だ。
1. 内部単位系の鉄則 (MKS)
SolidWorksのAPIは、UI上でどのような単位系(mm、g、s)を選択していようとも、すべて内部的にはMKS(メートル・キログラム・秒)系で処理している。
そのため、VBAから渡す数値はすべて「メートル(m)」に換算されていなければならない。
- `7.0 mm` $\rightarrow$ `0.007 m`
- `18.0 mm` $\rightarrow$ `0.018 m`
ここをミリメートル単位のまま `7` や `18` で渡すと、宇宙規模の巨大な穴が生成され、ジオメトリ計算エラー(Zero geometryなど)でSolidWorksが沈黙することになる。
2. 規格プロパティとカスタム値の競合
`HoleWizardDef` において、`Size = “M8″` などの文字列を指定した瞬間、内部データベースから標準的なピッチや下穴径が自動ロードされる。
「標準規格のロード」 $\rightarrow$ 「独自プロパティの上書き」 という順序をコード上で厳守しなければ、標準値によって値が上書きされてしまう。
上記のコードでは、プロパティ代入の順序を緻密に制御することで、規格の利便性を利用しつつ、肝心の寸法だけをハックすることに成功している。
—
4. システム間連携・レガシー保守における知見
社内ニッチな設計基準や、ERP / PLMシステムからのマスターデータ(JSONやCSVなど)を元にして、このスクリプトをバッチ処理の基盤に組み込む場合のアーキテクチャ上の注意点を述べる。
- UI非表示(Headless)運用時の注意:
大規模なアセンブリやパーツ群に対してバックグラウンドでこのスクリプトを走らせる場合、`swApp.Visible = False` を検討したくなるが、HoleWizardのジオメトリ再構築エンジンは一部のグラフィックコンテキストに依存しているケースがある。完全なヘッドレス運用よりも、最小化ウインドウでの処理が最もトラブルが少ない。
- エラーログの高度化:
`Err.Description` だけでなく、SolidWorksの `IModelDocExt` のエラー/警告ステータス(`GetErrors` / `GetWarnings`)を併用し、どのパラメータが原因でジオメトリ生成に失敗したかをログに吐き出す仕組みを必ずラップすること。
総括
穴ウィザードのカスタマイズは、単なる「手間の削減」ではない。社内の設計標準や特殊加工のノウハウをCADのコードに封じ込め、人間のヒューマンエラーを物理的に排除するための高度なエンジニアリングだ。
「標準規格にないからできない」ではない。APIを支配する者だけが、CADの限界を突破できる。
この知見をあなたのシステムに実装し、圧倒的な自動化の領域へ到達してほしい。
