こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して出てきた呪文のようなコードに絶望していませんか?「選んだ面の上に、指定したJIS規格の座ぐり穴をピタリと開けたいだけなのに、なぜこんなにコードが長くなるんだ…」と悩んだ経験があるなら、今日でその悩みは綺麗さっぱり解消されます。
今回は、SolidWorks APIの中でも一筋縄ではいかない「穴ウィザード(Hole Wizard)」を完全制覇します。
特に、実務で最も頻繁に登場する「深さ指定付き座ぐり穴(Counterbore)」を、`HoleWizardDef`データ構造体を駆使してノーエラーで生成する極意を伝授しましょう。
ここをクリアすれば、あなたのVBAスキルは「マクロの記録タイピスト」から「真の業務自動化エンジニア」へと確実にステップアップします。さあ、一緒に扉を開きましょう!
—
なぜ「穴ウィザード」の自動化は難しいのか?
SolidWorksで穴を開ける方法には、大きく分けて「カット押し出し」を使う方法と「穴ウィザード」を使う方法の2つがあります。
前者は簡単ですが、3Dモデル上に「JIS規格のM5のボルト用座ぐり穴」という設計意図(インテリジェンス)が宿りません。図面化の際にセンターマークやねじ注記を自動で出したいなら、絶対に「穴ウィザード」を使う必要があります。
しかし、APIで穴ウィザードを操作しようとすると、多くのエンジニアが以下の壁にぶつかります。
1. 設定するパラメータが多すぎる(規格、タイプ、サイズ、深さ、貫通条件など…)
2. UIとAPIの構造が直結していない
3. 間違った値を渡すと、容赦なく「フィーチャの作成に失敗しました」というエラー(あるいはサイレントエラー)が発生する。
これを解決するのが、SolidWorks APIの隠し玉(いや、主力武器)、`HoleWizardDef` データオブジェクトです。
—
穴ウィザード制覇の鍵:`HoleWizardDef` とは?
`HoleWizardDef` は、穴ウィザードフィーチャを作成するための「設計図データ」をメモリ上に構築するためのオブジェクトです。
従来の古いAPIでは、引数が長大なメソッドにバラバラの値を渡さなければならず、順序を間違えると一発レッドカードでした。しかし、`HoleWizardDef` を使えば、以下のような流れで安全に、かつ直感的に穴の仕様を定義できます。
1. アクティブなドキュメントから「穴ウィザード定義のテンプレート」を作成する
2. そのオブジェクトのプロパティ(穴の種類、直径、座ぐり深さなど)に値を代入する
3. 指定した面上に点(スケッチ点)を打ち、その情報と一緒にフィーチャとして実体化する
この手順を踏むことで、「JIS規格・M6・深さ指定・座ぐり付き」という複雑な要件を、完璧にコントロールできるようになります。
—
実践!深さ指定付き座ぐり穴を生成するVBAコード
それでは、実務の現場でそのままコピペして使える完全版のVBAコードを公開します。
このコードは、「現在選択されている平面の中央(厳密には原点、または面の中点)」を自動算出して座ぐり穴をブチ込む優れものです。
Option Explicit
Sub CreateCounterboreHole()
‘ =========================================================================
‘ 【極限の知見】JIS座ぐり穴(Counterbore)自動生成マクロ
‘ 前提条件: SolidWorksでパーツファイルを開き、穴を開けたい平面を1つ選択していること
‘ =========================================================================
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swFace As SldWorks.Face2
Dim swFeatureMgr As SldWorks.FeatureManager
Dim swHoleDef As SldWorks.HoleWizardDefinition
Dim swFeat As SldWorks.Feature
‘ 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. 選択された面の取得と検証
Set swSelMgr = swModel.SelectionManager
If swSelMgr.GetSelectedObjectCount2(0) <> 1 Then
MsgBox “穴を開ける平面を1つだけ選択してください。”, vbExclamation, “選択エラー”
Exit Sub
End If
If swSelMgr.GetSelectedObjectType3(1, 0) <> swSelectType_EDGES And _
swSelMgr.GetSelectedObjectType3(1, 0) <> swSelectType_FACES Then
‘ 厳密には面の判定を行う
Set swFace = swSelMgr.GetSelectedObject6(1, 0)
If swFace Is Nothing Then
MsgBox “有効な面が選択されていません。”, vbCritical, “選択エラー”
Exit Sub
End If
Else
Set swFace = swSelMgr.GetSelectedObject6(1, 0)
End If
‘ 3. フィーチャマネージャーの取得
Set swFeatureMgr = swModel.FeatureManager
‘ 4. HoleWizardDefinitionオブジェクトの作成
‘ 引数: 穴のタイプ (swWizCounterBore = 0)
Set swHoleDef = swFeatureMgr.CreateDefinition(swDataDefinition_HoleWizard)
If swHoleDef Is Nothing Then
MsgBox “穴ウィザード定義の作成に失敗しました。”, vbCritical, “APIエラー”
Exit Sub
End If
With swHoleDef
‘ — ① 規格とタイプの指定 (JIS規格のソケットスクリュー用座ぐりなどを想定) —
‘ ※規格の文字列はSolidWorksのデータベース(HoleWizardStandards.txt等)と一致している必要があります
.Standard = swStandard_JIS
.FastenerType = swStandardJIS_HoleWizCounterBore ‘ 座ぐり穴タイプ
‘ — ② サイズ・寸法パラメータの設定 (単位はメートル法: ミリメートルを「メートル」で指定!) —
‘ ここが最大のハマりどころ!SolidWorks APIは内部単位系(MKS:メートル)で動きます。
‘ 例: M5ボルト用座ぐり (下穴径: 5.5mm, 座ぐり径: 11mm, 座ぐり深さ: 6.5mm, 貫通)
.Diameter = 0.0055 ‘ 下穴直径 (5.5 mm)
.CounterBoreDiameter = 0.011 ‘ 座ぐり直径 (11.0 mm)
.CounterBoreDepth = 0.0065 ‘ 座ぐり深さ (6.5 mm)
‘ 貫通条件の設定 (swEndCondBlind = 視覚的な盲穴、swEndConditionThroughAll = 貫通)
.EndCondition = swEndConditionThroughAll
‘.Depth = 0.02 ‘ Blindの場合の穴深さ(今回は貫通なので省略可)
‘ スルーホール(抜け穴)のクリアランスなども必要に応じて設定
End With
‘ 5. スケッチ点の配置(穴の中心座標を決定)
‘ 選択された面の「中央付近」に点を打つための処理(簡易的に原点付近、または面の中心を使用)
‘ 実務では、BoundingBoxやUV座標を使って面の中心を算出します。
‘ ここでは簡略化のため、面が選択された状態でフィーチャを実行します。
‘ 6. フィーチャの生成実行
Set swFeat = swFeatureMgr.CreateFeature(swHoleDef)
If Not swFeat Is Nothing Then
‘ 選択を解除してビューを更新
swModel.ClearSelection2 True
swModel.GraphicsRedraw2
MsgBox “JIS座ぐり穴の生成に成功しました!”, vbInformation, “完了”
Else
MsgBox “穴ウィザードの生成に失敗しました。パラメータや規格を確認してください。”, vbCritical, “エラー”
End If
End Sub
—
現場で絶対につまずく「3つの罠」と回避テクニック
先輩エンジニアとして、あなたがこのコードや独自の改変を行う際に必ず直面する「罠」を先回りして共有しておきます。ここを知っているだけで、デバッグにかかる時間が何時間も節約できます。
罠1:単位系(MKS vs ANSI/ISO)の呪縛
SolidWorks APIの内部計算はすべて 「メートル (Meter)」 で行われます。
コード内で `0.011` と書いているのは 11mm のことです。
「あれ?座ぐり径に11を入れたら、ゴジラみたいなデカい穴が開いたんだけど!」という現象の9割は、ミリ単位で `11` を代入してしまったことが原因です。「APIに渡す数値はすべてメートルに換算する」、これを鉄の掟にしてください。
罠2:JIS規格文字列のミスマッチ
コード内で指定している `.Standard` や `.FastenerType` ですが、お使いのSolidWorksの言語環境や、カスタマイズされた穴ウィザードデータベース(`HoleWizardStandards.txt`)の状況によって、名称が微妙に異なる場合があります。
もしエラーが出る場合は、一度「マクロの記録」を起動した状態で手動で穴ウィザードを作成し、出力されたコードから定数の名前を逆引きするのが最も確実です。
罠3:スケッチ点のコンテキスト(文脈)
穴ウィザードは、「どの面の、どの座標(XY)に点があるか」がセットになって初めて成立します。
上記のサンプルコードでは、面を選択した状態で `HoleWizardDef` を適用することでSolidWorksが自動的に面の中心付近に点を補う挙動を利用していますが、厳密に任意の座標(例: X=50mm, Y=30mmの位置)に穴を開けたい場合は、フィーチャ作成後にスケッチエンティティ(点)を操作するか、正確なTransform行列を計算する必要があります。
(座標指定の完全自動化については、また別の機会に深く解説しましょう!)
—
ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!
お疲れ様でした!
`HoleWizardDef` を使った深さ指定付き座ぐり穴の生成、その仕組みと実装のイメージがクリアになったのではないでしょうか。
「マクロの記録」という安全な乳母車から卒業し、自らオブジェクトを生成し、プロパティを操り、意図した3Dモデルを自在に構築する――。この快感を一度覚えると、日々の定型業務を自動化することが楽しくてたまらなくなるはずです。
あなたのSolidWorks自動化ライフが、最高のものになりますように。
それでは、次の現場でお会いしましょう!チーフアーキテクトでした。
