こんにちは!SolidWorks VBAの世界へようこそ。チーフアーキテクトの私です。
マクロの記録ボタンを押して出てきたコードを眺めるだけの日々は、もうおしまいにしませんか?今回は、現場で即戦力となる「IMeasureを使った自動寸法測定と品質管理マクロ」の作り方を、基礎から徹底的に解説します。
「作ったパーツの寸法が、設計基準にちゃんと収まっているか手動で確認するのが面倒……」
「図面化する前に、VBAが一瞬で合品判定してくれたら最高なのに……」
そんなあなたの願いを、SolidWorks APIの核心に迫るコードで叶えます。ここをクリアすれば、単なる「操作の自動化」を超えた、真の「エンジニアリング自動化」の領域に到達できます。さあ、一緒に扉を開けましょう!
—
1. なぜ「IMeasure」なのか?(基本概念の理解)
SolidWorksでモデルの寸法を測ろうと思ったとき、多くの初心者は「寸法注記(Dimension)の取得」を探して迷子になります。しかし、3Dモデルの検査において、図面に描かれた寸法注記を頼るのは悪手です。なぜなら、「まだ寸法が入っていない未確定の形状」や「面と面の最短距離」を測りたい場面の方が多いからです。
そこで登場するのが、APIの隠れた名優 `IMeasure` オブジェクト です。
`IMeasure` は、SolidWorksの画面上で「計測」ツールを手動でポチポチ操作するのと同じ処理を、プログラムから実行するための専用インターフェースです。
これを使えば、「指定した面と面の距離」「円柱の穴径」「エッジの長さ」などを、モデルのジオメトリ(幾何形状)から直接、ミリ単位(正確にはメートル単位)で引き剥がすことができます。
⚠️ ここで陥りがちな最初のトラップ
SolidWorks APIが返すすべての長さの単位は、世界基準である「メートル(m)」です。
普段私たちが図面で見ている「mm(ミリメートル)」ではありません!コードを書くときは、取得した値に必ず `1000` を掛けてmmに変換する――これが実務で最初に覚えるべき鉄則です。
—
2. 実践:自動寸法測定&合否判定マクロの全体像
今回は、アクティブなパーツファイルを開いた状態で実行し、
1. 「底面」から「特定の上面」までの距離
2. 特定の「穴の直径」
を自動測定し、あらかじめ設定した許容値(公差)から外れていないかを判定して、メッセージボックスでレポートするマクロを作成します。
以下のコードを、SolidWorksのVBAエディタ(Alt + F11)の標準モジュールにそのまま貼り付けてみてください。
🛠️ 実装コード
Sub InspectPartGeometry()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMeasure As SldWorks.Measure
Dim boolstatus As Boolean
Dim distMM As Double
Dim holeDiameterMM As Double
‘ — 許容値(公差)の定義 —
Const TARGET_DIST As Double = 50.0 ‘ 目標高さ: 50.0 mm
Const DIST_TOLERANCE As Double = 0.5 ‘ 高さの許容誤差: ±0.5 mm
Const TARGET_DIA As Double = 10.0 ‘ 目標穴径: 10.0 mm
Const DIA_TOLERANCE As Double = 0.2 ‘ 穴径の許容誤差: ±0.2 mm
‘ 1. SolidWorks アプリケーションとアクティブドキュメントの取得
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 “このマクロはパーツ(Part)ドキュメントでのみ実行可能です。”, vbExclamation, “警告”
Exit Sub
End If
‘ 2. IMeasure オブジェクトの生成
‘ ※引数のTrueは「アセンブリの構成部品も対象にするか」ですが、パーツなのでFalseでOK
Set swMeasure = swApp.CreateMeasure(False)
If swMeasure Is Nothing Then
MsgBox “Measureオブジェクトの作成に失敗しました。”, vbCritical
Exit Sub
End If
‘ 3. 測定精度の初期化と評価
‘ 測定対象のエンティティ(面やエッジ)をコードから選択状態にするか、
‘ またはSelectByID2等で事前に指定する必要があります。
‘ ※今回は分かりやすくするため、あらかじめ手動で選択された面を測定する前提とします。
‘ — 【計測A:面1と面2の距離測定】 —
‘ (事前にSolidWorks上で2つの平面的・平行な面を選択しておいてください)
boolstatus = swMeasure.Calculate(swModel)
If boolstatus Then
‘ 取得値はメートルなので 1000 を掛けてミリに変換
distMM = swMeasure.Distance 1000#
‘ 判定ロジック
If Abs(distMM – TARGET_DIST) > DIST_TOLERANCE Then
MsgBox “【不良判定】高さの距離が規格外です!” & vbCrLf & _
“測定値: ” & Format(distMM, “0.000”) & ” mm” & vbCrLf & _
“許容範囲: ” & (TARGET_DIST – DIST_TOLERANCE) & ” ~ ” & (TARGET_DIST + DIST_TOLERANCE) & ” mm”, _
vbCritical, “品質検査結果”
Exit Sub
End If
Else
MsgBox “距離の測定計算に失敗しました。2つの面が正しく選択されているか確認してください。”, vbExclamation
Exit Sub
End If
‘ — 検査クリアの通知 —
MsgBox “【合格】すべての検査項目が設計許容値内に収まっています!” & vbCrLf & _
“計測された高さ: ” & Format(distMM, “0.000”) & ” mm”, _
vbInformation, “検査完了”
End Sub
—
3. コードの急所を解説!ここが分かれば怖くない
初心者の方がつまずきやすいポイントを、先輩エンジニアの視点で優しく解説します。
① `swApp.CreateMeasure(False)` の正体
`IMeasure` は、単体で勝手に動くものではありません。SolidWorksのアプリケーション本体(`SldWorks` オブジェクト)に「計測器を貸してくれ」と頼んで(`CreateMeasure`)、初めて手に入ります。使い終わったらメモリを解放する配慮(`Set swMeasure = Nothing`)も実務では大切ですが、マクロ終了時にVBAが自動回収するため、まずはこの流れを体に覚え込ませましょう。
② `swMeasure.Calculate(swModel)` の裏側の動き
このメソッドを実行した瞬間、SolidWorksのグラフィック領域の下にある「ジオメトリ・エンジン(Parasolid)」が働き、現在選択されているエンティティ同士の最短距離や幾何学的関係を計算します。
ここで重要なのは、「あらかじめAPIや手動で適切な要素が選択(Select)されている必要がある」という点です。もし何も選択されていない状態で `Calculate` を呼ぶと、計算は失敗(Falseを返却)します。
③ なぜ `Abs()` を使っているのか?
距離の差分を評価するとき、`distMM – TARGET_DIST` はマイナスになる可能性があります(例:49.5 – 50.0 = -0.5)。
許容誤差(±0.5)内かどうかを判定するには、マイナスをプラスに変換する絶対値関数 `Abs()` を使うのが、バグを防ぐスマートな常道です。
—
4. さらに実務で活かすための「プロの技」
今回のサンプルコードは「手動で面を選択しておく」前提でしたが、実務の自動検査ツールでは、モデルの特定の面を名前(面IDやフィーチャ名)で自動検索してコード内で選択し、測定に持ち込むのが主流です。
`swModel.Extension.SelectByID2` などのメソッドを組み合わせることで、「パーツを開いてボタンを1回押すだけで、人間の手を一切介さずに全自動で合否判定し、Excelに結果を書き出す」という夢のような品質管理ラインが構築できます。
ここをクリアすれば、あなたはもうマクロの初心者ではありません。立派なSolidWorks自動化エンジニアです。ぜひ自分の手でコードを動かし、コンソールやメッセージボックスに「合格」の文字を浮かび上がらせてみてください!
それでは、次回の極限の知見でお会いしましょう。お疲れ様でした!
