こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないコードが生成されたけど、編集できない……」と悩んでいませんか?
今回は、SolidWorks VBAエンジニアなら誰もが一度はぶつかる壁、「穴ウィザード(Hole Wizard)の完全制御」をマスターします。
特に、実務で最も使用頻度が高い「深さ指定付きねじ穴」と「座ぐり(カウンターボア)加工」を、`HoleWizardDef` データ構造体を使って完全パラメータ駆動で生成する方法を伝授します。
ここをクリアすれば、あなたもマクロの記録から完全に脱却し、設計データを自由自在に操るプロフェッショナルへの階段を大きく登ることができますよ。しっかりついてきてくださいね!
—
1. なぜ「穴ウィザード」の自動化は難しいのか?
通常の押し出しやカットフィーチャであれば、スケッチを描いて数値を渡すだけなので簡単です。しかし、穴ウィザードは別格です。
JIS規格などの膨大な規格データ、下穴径、ねじ深さ、座ぐりの直径や深さなど、数えきれないほどのパラメータが複雑に絡み合っているからです。
これをAPIで制御するためには、SolidWorksが用意している専用の設計図(データ構造体)である `HoleWizardDef` を正しく理解し、適切な値を順番に流し込む必要があります。
—
2. 実戦投入!「座ぐり付きねじ穴」を生成するVBAコード
百聞は一見にしかず。まずは、実務でそのまま使える完全なコードをお見せします。
このコードは、アクティブなパーツの指定した平面上に、JIS規格に基づいた「M6の座ぐり付きタップ穴(深さ指定)」をドリル加工します。
Option Explicit
Sub CreateAdvancedHoleWizard()
‘ 1. SolidWorks アプリケーションとアクティブパーツの取得
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
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. 特徴的な面(今回は正面 / Front平面)をあらかじめ選択しておく
‘ 実際の実務では、面を自動検索するか、ユーザーにクリックさせます
Dim boolstatus As Boolean
boolstatus = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “基準となる平面が見つかりませんでした。”, vbCritical
Exit Sub
End If
‘ 3. 穴ウィザード定義(HoleWizardDef)オブジェクトの作成
Dim swFeatureMgr As SldWorks.FeatureManager
Set swFeatureMgr = swModel.FeatureManager
‘ FeatureDataの作成(引数 11 = swFeatType_HoleWzd 穴ウィザードを示す)
Dim swHoleDef As SldWorks.HoleWizardDef
Set swHoleDef = swFeatureMgr.CreateDefinition(11)
If swHoleDef Is Nothing Then
MsgBox “HoleWizardDefの生成に失敗しました。”, vbCritical
Exit Sub
End If
‘ 4. 穴ウィザードの基本パラメータを設定
With swHoleDef
‘ 【規格設定】
‘ 穴の種類: swWzdCounterBore (座ぐり穴)
‘ 規格: swWzdJIS (JIS規格)
‘ 規格タイプ: swWzdJISScrewThreads (JISねじ)
‘ 止めねじサイズ: “M6”
.HoleType = swWzdCounterBore
.Standard = swWzdJIS
.FastenerType = swWzdJISScrewThreads
.螺子サイズ = “M6” ‘ ※環境によっては英語プロパティ名 (Size等) に読み替えてください
‘ 【寸法・深さの設定】(単位はメートル法(MKS)の場合はメートル指定に注意)
‘ ※SolidWorks APIの内部単位は常に「メートル法 (m, kg, s)」です!
.CounterBoreDiameter = 0.011 ‘ 座ぐり直径 11mm
.CounterBoreDepth = 0.0063 ‘ 座ぐり深さ 6.3mm
.HoleDiameter = 0.005 ‘ 下穴直径(M6並目下穴の例) 5mm
.Depth = 0.015 ‘ 穴全体の深さ 15mm
.ThreadDepth = 0.012 ‘ ねじ部の深さ 12mm
‘ 終了条件: swEndCondBlind (盲穴 = 深さ指定)
.EndCondition = swEndCondBlind
End With
‘ 5. 穴の位置(座標)を設定する
‘ 穴ウィザードは、フィーチャ作成後に「どこに穴を開けるか」の点(スケッチ点)が必要です。
‘ 今回は簡易的に原点 (0, 0) に配置します。
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatureMgr.CreateFeature(swHoleDef)
If Not swFeat Is Nothing Then
MsgBox “座ぐり付きねじ穴の生成に成功しました!”, vbInformation
Else
MsgBox “穴の生成に失敗しました。パラメータの組み合わせを確認してください。”, vbCritical
End If
‘ 選択状態を解除
swModel.ClearSelection2 True
End Sub
—
3. コードの急所を解説!ここがプロの勘所
上記のコードの中で、初心者が必ずと言っていいほどハマるポイントを3つ解説します。ここさえ押さえれば、どんな複雑な穴も怖くありません。
① 単位系は「常にメートル(m)」の呪縛
SolidWorksの画面上では「mm」で入力している数値も、APIのバックグラウンドではすべて「メートル(m)」で処理されています。
- `0.011` = 11 mm
- `0.005` = 5 mm
「あれ? 穴が米粒みたいに小さくなった!」という時は、単位の桁数(1000倍のズレ)を疑ってください。これがプログラミング初心者が最初に泣くポイントです。
② HoleWizardDef の「正しい手順」
穴ウィザードの作成手順は、料理のレシピと同じで順番が命です。
1. `FeatureManager.CreateDefinition` で空の定義書を取り出す。
2. `With swHoleDef` の中で、穴の種類、規格、サイズ、深さを漏れなく書き込む。
3. `FeatureManager.CreateFeature` にその定義書を渡して、一気に形にする。
この「定義してから実行する(Deferred Execution)」というデザインパターンは、SolidWorks APIの高度なフィーチャ操作の基本形です。
③ 規格とサイズの整合性
JIS規格を指定しているのに、存在しないねじサイズや不自然な座ぐり値を無理やり代入すると、SolidWorksはエラーを吐くか、サイレント失敗(何も起きない)を起こします。
もしコードがうまく動かないときは、まず手動で同じ穴ウィザードを開き、画面上でどのような選択肢が選べるかを確認してから、APIの定数や文字列に落とし込むのが最短のデバッグ手法です。
—
4. エンジニアからのエール
お疲れ様でした!
「穴ウィザード」という、一見するとブラックボックスのように複雑な機能も、`HoleWizardDef` という適切なデータ構造体を介すことで、VBAから完全にコントロールできることが分かったはずです。
マクロの記録では決して手に入らない、この「パラメータ駆動による完全自動化」を手に入れたあなたは、もうただの初心者ではありません。立派なSolidWorks自動化エンジニアへの道を歩み始めています。
日々の定型業務や、何百個もあるねじ穴の図面作成・修正地獄から、自分自身を解放してあげましょう。
明日からの設計業務が、もっとクリエイティブで楽しいものになることを応援しています!
