こんにちは!SolidWorks VBAの世界へようこそ。
マクロの記録ボタンを押して自動生成されたコードを眺めては、「なんだか呪文みたいだな…」「ここを変更したいだけなのに、なぜかエラーが出るな…」と悩んでいませんか?
大丈夫、その壁を突破する瞬間が一番プログラミングを楽しいと感じられる時です。今日は、SolidWorks APIの中でも一筋縄ではいかない「穴ウィザード(Hole Wizard)」を完全に手懐ける方法を授けましょう。
標準規格に縛られず、自分の思い通りの下穴径や深さを持ったMボルト用タップ穴をコードから自由自在に生成できるようになると、設計自動化の幅が劇的に広がります。
ここをクリアすれば、あなたももう「マクロの記録の奴隷」ではありません。さあ、一緒に本質を学んでいきましょう!
—
1. なぜ「穴ウィザード」の自動化は難しいのか?
SolidWorksの画面上で「穴ウィザード」を使うとき、私たちは「規格」「タイプ」「サイズ」をドロップダウンから選びますよね。
しかし、APIの世界では、これらを裏でコントロールしている`HoleWizardDef`(穴ウィザード定義)オブジェクトの存在を知る必要があります。
多くの人が陥る罠がこれです。
> 「マクロの記録をとってコードを見たけど、引数が多すぎて何がなんだか分からない!」
> 「数値を書き換えたはずなのに、次の行でエラー(型が違う等)で弾かれる!」
穴ウィザードのパラメータは、規格やサイズごとに「設定できる値の範囲」が厳密に決まっています。だからこそ、ただ数値を代入するのではなく、「どのプロパティを、どの順序でいじるべきか」というオブジェクトのライフサイクルを理解することが絶対に必要なのです。
—
2. 【核心】HoleWizardDefを自由自在に操るメカニズム
Mボルトのタップ穴(雌ネジ)をプログラムから生成する際の流れは、以下の4ステップに集約されます。
1. フィーチャデータの作成: `FeatureManager.CreateDefinition` を使って、穴ウィザード用の空っぽの定義データ(`HoleWizardDef`)を取得する。
2. 規格とタイプの指定: ISOなのかJISなのか、ボルトサイズ(M5など)はどれにするかを設定する。
3. カスタム値の注入(ここがキモ!): 標準規格に囚われず、下穴径や深さを自分の手で書き換える。
4. フィーチャの生成: パーツの面に対して、その定義データを適用して穴をブチ抜く。
百聞は一見にしかず。次の実用コードを見てください。そのままVBE(VBAエディタ)に貼り付けて動かせる完全版です。
—
3. 実践!Mボルト用タップ穴を動的カスタマイズするVBAコード
以下のコードは、アクティブなパーツの「平面」を選択した状態で実行すると、そこに「M6×1.0」をベースにしつつ、深さや下穴径をあえてカスタムしたタップ穴を生成するマクロです。
Sub CreateCustomHoleWizard_M_Tap()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
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 “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation
Exit Sub
End If
Set swFeatMgr = swModel.FeatureManager
‘ =========================================================================
‘ 2. 穴ウィザード定義(HoleWizardDef)の新規作成
‘ =========================================================================
‘ 引数 ‘0’ は「穴ウィザード」を示します
Set swHoleDef = swFeatMgr.CreateDefinition(swFmHoleWiz)
If swHoleDef Is Nothing Then
MsgBox “穴ウィザード定義の作成に失敗しました。”, vbCritical
Exit Sub
End If
‘ =========================================================================
‘ 3. 基本パラメータの設定(ISO規格のMボルトタップ穴を指定)
‘ =========================================================================
With swHoleDef
.HoleType = swisteHoleWizTap ‘ タップ穴(雌ネジ)を指定
.Standard = swisteStandardISO ‘ 規格:ISO
.FastenerType = swisteISOHoleTap ‘ タイプ:ISOタップ穴
.Size = “M6” ‘ サイズ:M6
‘ —【ここが今回の最重要テーマ:特殊な深さや下穴径の動的変更】—
‘ 標準規格値の上書きを有効にするため、まずカスタムプロパティにアクセスします
‘ 例:下穴径を標準から少し太めの「5.1mm」に強制変更(M6標準は通常5.0など)
.Diameter = 0.0051 ‘ 単位はメートル法(m)なので 5.1mm = 0.0051m
‘ 例:ネジ部の深さを「25mm」に設定
.ThreadDepth = 0.025 ‘ 25mm = 0.025m
‘ 例:全体の穴深さを「35mm」に設定(盲穴の場合)
.Depth = 0.035 ‘ 35mm = 0.035m
‘ 終了条件(Blind = 貫通しない指定)
.EndCondition = swEndCondBlind
End With
‘ =========================================================================
‘ 4. フィーチャの生成実行
‘ =========================================================================
‘ 注意:事前にスケッチの点(穴の位置)が選択されている必要があります。
‘ 今回はシンプルに、あらかじめ選択されている面に対して中央付近に自動配置させます
‘ ※実務ではスケッチポイントをあらかじめ作成して選択状態にしておきます
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatMgr.CreateFeature(swHoleDef)
If Not swFeat Is Nothing Then
MsgBox “カスタム・タップ穴の生成に成功しました!”, vbInformation, “SolidWorks VBA 成功”
Else
MsgBox “穴の生成に失敗しました。配置用の面やスケッチ点を確認してください。”, vbCritical
End If
‘ 画面を再描画
swModel.WindowRedraw
End Sub
—
4. コードの読み解きと「よくあるエラー」の回避術
このコードを自分のプロジェクトに組み込む上で、絶対に知っておくべきポイントを解説します。
① 単位系は「メートル(m)」が絶対のルール
API内部の数値を扱うプロパティ(`.Diameter`, `.Depth`, `.ThreadDepth` など)は、ドキュメントの単位系(mmやインチ)に関わらず、すべて「メートル(m)」単位で渡す必要があります。
- `5.1mm` なら `0.0051`
- `25mm` なら `0.025`
ここをミリの感覚で `5.1` と書いてしまうと、地球がひっくり返るような巨大な穴(あるいはミクロすぎてエラー)が発生するので注意してください。
② プロパティを書き換える順番の罠
`HoleWizardDef` を操作するとき、`Size = “M6″` などの標準設定を呼び出した「後」に、`Diameter` や `Depth` の上書きを行うのが鉄則です。
先に数値を代入しても、後から `Size = “M6″` を実行した瞬間に、そのサイズが持つデフォルトの規格値で上書きされてリセットされてしまいます。「あれ、数値が反映されないぞ?」というときは、大体この代入順序が間違っています。
③ 選択状態(Selection)の重要性
SolidWorksのフィーチャ作成APIの多くは、「今、画面上で何が選択されているか(SelectionMgr)」を暗黙の前提にしています。
実務でマクロを組む際は、対象となる「平面」や、あらかじめ配置した「スケッチの点(座標)」をプログラム側で確実に選択させてから `CreateFeature` を呼ぶようにしてください。
—
5. おわりに:ここをクリアすれば、もう怖くない!
お疲れ様でした!
「穴ウィザード」という、一見するとブラックボックスのように複雑な機能も、適切なオブジェクト(`HoleWizardDef`)のライフサイクルとプロパティ操作の順序さえ理解してしまえば、あなたの意のままにコントロールできるようになります。
「決まったサイズしかなければ、プログラムで書き換えればいい」
この発想を持てたあなたなら、社内の設計自動化や、ワンクリックで図面を量産するシステムの構築も夢ではありません。
もしコードがうまく動かない、あるいはさらに応用的なアセンブリ内での位置決めについて知りたいなどがあれば、いつでも気軽に質問してくださいね。あなたのVBAライフを、私は全力で応援しています!
