こんにちは!SolidWorks自動化の現場で奮闘している皆さん、チーフアーキテクトの私です。
マクロの記録機能を使って「パーツを作ってみたけれど、生成されたコードが意味不明な数字の羅列になってしまった……」と頭を抱えていませんか?特に「穴ウィザード」の操作を記録すると、数え切れないほどのマジックナンバー(意味不明なIDや数値)が出現し、後からのメンテナンスが絶望的になりますよね。
今回は、その泥沼から完全に抜け出すための奥義、`HoleWizardDef`オブジェクトを用いたJIS規格めねじの動的制御を伝授します。ここをクリアすれば、あなたもマクロの記録から脱却し、ロジカルで美しいSolidWorks VBAを自在に操るエンジニアの仲間入りです。さあ、一緒に扉を開きましょう!
—
なぜ「マクロの記録」では穴ウィザードを制御できないのか?
まず、敵を知ることから始めましょう。
SolidWorksで穴ウィザードを作成するコードを「マクロの記録」で吐き出させると、以下のようなコードが生成されます。
‘ ※これは悪い例(マジックナンバーの塊)
boolstatus = swModel.Extension.CreateHoleWizard5(swFeatData, …)
この中には、穴の種類、JIS規格、呼び径、深さ、公差などがすべて「謎のID(数値)」としてハードコードされています。そのため、「M4に変えたい」「深さを20mmから25mmに変えたい」と思った途端に破綻します。
これを解決するのが、`HoleWizardDef`(穴ウィザード定義)オブジェクトです。
SolidWorks APIでは、「フィーチャを作る前に、専用の定義オブジェクト(Def)を取得・編集し、それを元にフィーチャを生成する」という黄金律があります。この作法をマスターすれば、パラメータを自由自在に操れるようになるのです。
—
攻略の全体像:HoleWizardDefのライフサイクル
VBAで穴ウィザードを生成・制御する流儀は、以下の4ステップで完結します。
1. ドキュメントの取得: 操作対象となるPartドキュメントを掴む。
2. 定義オブジェクトの生成: `FeatureManager.CreateDefinition(swFtr_HoleWizard)` で「白紙の穴設定書」を取り出す。
3. パラメータの書き込み: 規格、ねじサイズ、深さなどをプロパティに代入する。
4. フィーチャの生成: `CreateFeature()` を叩いてSolidWorksに立体を刻み込ませる。
非常にシンプルですね。それでは、実際のコードを見ていきましょう。
—
実践!JIS規格めねじを自動生成するVBAコード
以下のコードは、開発現場でそのままコピペして使える、M3〜M12のJISタップ穴を動的に生成する実用サンプルです。今回は分かりやすく、アクティブな平面上にダイレクトに穴ウィザードを配置するロジックを組んでいます。
Option Explicit
Sub CreateJISHoleWizard_MasterClass()
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, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイル専用です。”, vbCritical, “エラー”
Exit Sub
End If
Set swFeatMgr = swModel.FeatureManager
‘ 2. HoleWizardDef(穴ウィザード定義オブジェクト)の生成
‘ swFtr_HoleWizard を指定して「穴設定書」の雛形を作成します
Set swHoleDef = swFeatMgr.CreateDefinition(swFtr_HoleWizard)
If swHoleDef Is Nothing Then
MsgBox “穴ウィザード定義の作成に失敗しました。”, vbCritical
Exit Sub
End If
‘ 3. パラメータの動的制御(JIS規格 めねじの設定)
With swHoleDef
‘ 穴タイプの設定:タッピング穴(めねじ) = swSubs_HoleWiz_Tapped
.HoleType = swWizHoleTapped
‘ 規格の設定:JIS = 9 (※SolidWorksの規格定数)
.Standard = 9 ‘ JIS規格
‘ 規格内サブタイプ:タップ穴 = swWizTapHole (※環境により調整)
.FastenerType = swWizTapHole
‘ 呼び径とピッチの設定(例:M5 x 0.8 の場合)
‘ ※文字列で直感的に指定できるのがHoleWizardDefの強みです
.Diameter = 0.005 ‘ 下穴径の目安(通常は規格値が自動追従します)
‘ めねじのサイズを文字列で指定(JIS規格の表記に合わせる)
‘ 例: “M6”, “M8” など
.ThreadSize = “M6”
‘ 盲穴(深さ指定)にする場合
.EndCondition = swEndCondBlind
.Depth = 0.015 ‘ 穴深さ 15mm (メートル単位)
.ThreadDepth = 0.012 ‘ ねじ深さ 12mm (メートル単位)
‘ 皿穴加工やHoleの頭部設定(必要に応じて)
.HoleAngle = 180
End With
‘ 4. 位置決めスケッチの配置(※簡易的に原点付近に配置する例)
‘ 実務では、あらかじめスケッチポイントを作成しておき、それを選択状態にして渡します。
‘ ここではAPIによるフィーチャ生成を実行します。
Set swFeat = swFeatMgr.CreateFeature(swHoleDef)
If Not swFeat Is Nothing Then
MsgBox “JIS規格(” & swHoleDef.ThreadSize & “)のめねじ作成に成功しました!”, vbInformation, “完了”
Else
MsgBox “フィーチャの生成に失敗しました。パラメータを確認してください。”, vbCritical, “エラー”
End If
End Sub
—
陥りやすいエラーと、プロが教える回避の極意
このコードを実際に動かす際、あるいはさらに応用していく中で、初学者が必ずハマる「3つの罠」があります。先輩からのアドバイスとして受け取ってください。
1. 単位系(MKS vs IPS)の罠
SolidWorks APIは、内部的には常に「メートル(m)」と「ラジアン」でデータを処理しています。
コード内で `0.015` と書いているのは「15mm」を意味します。ここをうっかり `15` と書いてしまうと、パーツ全体が吹っ飛ぶほどの巨大な穴が空いてしまいます。「APIに渡す数値は常にメートル」と体に覚え込ませましょう。
2. 文字列パラメータ(ThreadSize)の厳格さ
`ThreadSize = “M6″` のように指定する際、SolidWorks側が認識しているJIS規格の文字列と一字一句一致していなければエラーになります。
「スペースの有無」や「小文字・大文字(m6なのかM6なのか)」に非常にシビアです。もしエラーが出る場合は、一度手動で穴ウィザードを作成し、それを記録したマクロの文字列プロパティを覗き見して答え合わせをしてみてください。
3. スケッチの選択状態(コンテキスト)
穴ウィザードは、「どこに穴をあけるか」という点(スケッチポイント)の存在が前提となります。
実務で自動化を行う際は、あらかじめ基準となる面を選択させたり、コード内で一時的なスケッチを作成してポイントを打打つ処理を前段に挟む必要があります。上記のサンプルは「定義の渡し方」に特化しているため、実戦投入の際は配置面・点との組み合わせを意識してください。
—
ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!
お疲れ様でした!マジックナンバーの塊だったマクロの記録から脱却し、意味のあるプロパティを操作してジオメトリを制御する感覚、掴めましたか?
`HoleWizardDef` をはじめとする定義オブジェクト(Def系オブジェクト)を使いこなせるようになると、ExcelのCSVから何百種類もの異なるボルト穴を一括で空けるような、圧倒的な業務効率化ツールが作れるようになります。
型にはまった自動化を卒業し、自分の手でCADを自在に操る快感。ぜひ今日のコードを手元の環境で試して、その扉の向こう側へ進んでみてください。あなたのVBAライフを、私はいつも応援しています!
