【入門編】【形状検証・検査】IMeasure.CalculateMassPropertiesによる自動質量算出と設計上限値超過時の警告アラート – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAで品質管理を自動化! masspropertiesで設計上限値超過を即検知する技

こんにちは! SolidWorks VBAで業務自動化の道を歩み始めた皆さん、ようこそ!

「マクロの記録」は便利だけど、ちょっとしたアレンジをしようとすると、もうお手上げ…なんて経験、ありませんか? 今回は、そんなあなたを「脱・記録マクロ」へと導く、とっておきのテクニックをご紹介します。

SolidWorks VBAを使いこなせば、設計プロセスに革新をもたらすことができます。特に、パーツの質量管理は、製品のコストや性能に直結する重要な要素ですよね。今回は、 IMeasure.CalculateMassProperties という強力なAPIを使って、パーツの体積、表面積、重心、そして質量を自動で取得し、さらに、あらかじめ設定した設計上限値を超えた場合に、自動で設計者に警告を発する、そんな「品質管理マクロ」の作成に挑戦しましょう!

このマクロをマスターすれば、設計ミスによる手戻りを減らし、より高品質な製品開発に貢献できるはずです。さあ、一緒にSolidWorks VBAの奥深い世界へ踏み込みましょう!

なぜ質量管理が重要なのか?

設計者として、私たちは常に「どうすればより良い製品を作れるか?」を考えています。その中で、質量は非常に重要なファクターです。

  • コスト削減: 軽量化は材料費の削減に直結します。
  • 性能向上: 自動車や航空機などでは、軽量化が燃費や運動性能の向上に大きく貢献します。
  • 安全性: 重量制限のある製品(例えば、運搬機器や医療機器)では、質量管理は安全性の確保に不可欠です。
  • 組立性: 重量がありすぎると、現場での組み立て作業が困難になることもあります。

このように、質量は設計の初期段階から考慮すべき、非常に戦略的な要素なのです。

質量を自動で取得する! `IMeasure.CalculateMassProperties` のご紹介

SolidWorks APIには、パーツの物理プロパティを取得するための強力な機能が備わっています。その中でも、今回主役となるのが `IMeasure.CalculateMassProperties` です。

このメソッドを使うと、モデルの質量、体積、表面積、重心位置などを、プログラムから簡単に取得できます。まるで、設計者が手動で「プロパティ」ダイアログを開いて確認する手間を、一瞬で自動化してくれるイメージです。

そもそも「API」って何?

API(Application Programming Interface)とは、ソフトウェア同士が情報をやり取りするための「窓口」のようなものです。SolidWorks VBAでは、SolidWorksというソフトウェアが提供する様々な機能(例えば、ジオメトリを作成したり、プロパティを取得したり)を、VBAプログラムから呼び出すためのインターフェースとしてAPIを利用します。

「マクロの記録」は、このAPIの呼び出しを自動で生成してくれる便利な機能ですが、複雑な処理や条件分岐などを実現するには、APIを直接理解し、VBAコードで記述していく必要があります。

`IMeasure.CalculateMassProperties` の仕組み

`IMeasure.CalculateMassProperties` は、パーツモデルの質量特性を計算し、その結果を `IMassProperties` オブジェクトとして返します。この `IMassProperties` オブジェクトには、以下のようなプロパティが含まれています。

  • `Mass`: モデルの質量
  • `Volume`: モデルの体積
  • `SurfaceArea`: モデルの表面積
  • `CenterOfMass`: モデルの重心位置 (3次元座標)

これらの情報を取得することで、私たちの質量管理マクロは、設計されたパーツが規定の重量を超えていないかを自動でチェックできるようになるのです。

いざ、実装! VBAコードで質量を自動取得してみよう

それでは、実際にVBAコードを書いてみましょう。

まず、SolidWorksのVBAエディタを開く方法はご存知でしょうか?
`ツール` > `マクロ` > `編集` で、新しいマクロを作成したり、既存のマクロを編集したりできます。

新しい標準モジュールを作成し、以下のコードを貼り付けてみてください。

Option Explicit

Sub CalculateAndCheckMass()

‘ SolidWorks アプリケーションオブジェクトを取得
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks

‘ アクティブなドキュメントを取得
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc

‘ ドキュメントがパーツファイル (.sldprt) かどうかを確認
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbExclamation
Exit Sub
End If

‘ ファイルタイプをチェック (パーツファイルであることを確認)
If Not swModel.GetType = swDocPART Then
MsgBox “このマクロはパーツファイル (.sldprt) でのみ実行できます。”, vbExclamation
Exit Sub
End If

‘ IMeasureインターフェースを取得
Dim swMeasure As SldWorks.Measure
Set swMeasure = swApp.GetMeasure

‘ 質量特性を計算するためのオブジェクトを宣言
Dim swMassProperties As SldWorks.MassProperties
‘ CalculateMassProperties メソッドは、計算結果を MassProperties オブジェクトに格納します
‘ このメソッドは、直接 MassProperties オブジェクトを返すのではなく、
‘ 既存の MassProperties オブジェクトを引数として渡し、そこに結果を格納する形になります。
‘ そのため、最初に MassProperties オブジェクトを初期化しておく必要があります。
Set swMassProperties = swMeasure.CalculateMassProperties(swModel)

‘ 計算された質量特性を取得
Dim dMass As Double
Dim dVolume As Double
Dim dSurfaceArea As Double
Dim vCenterOfMass As Variant ‘ 重心位置は3要素の配列 (X, Y, Z)

‘ MassProperties オブジェクトから各プロパティの値を取得
dMass = swMassProperties.Mass
dVolume = swMassProperties.Volume
dSurfaceArea = swMassProperties.SurfaceArea
vCenterOfMass = swMassProperties.CenterOfMass

‘ — ここからが設計上限値チェックのロジック —

‘ 例:設計上限重量を 10 kg (10000 g) と設定
Const DESIGN_MAX_WEIGHT_GRAMS As Double = 10000.0

‘ 質量特性の単位系を確認し、必要に応じて変換する
‘ SolidWorks のデフォルトの単位系によっては、質量がグラム (g) ではなくキログラム (kg) やポンド (lb) で返される場合があります。
‘ ここでは、単純化のために、取得した質量がグラム単位であると仮定します。
‘ より堅牢なコードにするには、swModel.Extension.GetUserPreferenceDouble(swUserPreferenceDoubleValue_e.swUnitsMass)
‘ などを使用して、現在の単位系を取得し、適切な変換を行う必要があります。

Dim message As String
message = “パーツの質量特性:” & vbCrLf & _
“質量: ” & Format(dMass, “#,

0.000″) & ” g” & vbCrLf & _

“体積: ” & Format(dVolume, “#,

0.000″) & ” mm³” & vbCrLf & _

“表面積: ” & Format(dSurfaceArea, “#,

0.000″) & ” mm²” & vbCrLf & _

“重心位置: (” & Format(vCenterOfMass(0), “#,

0.000″) & “, ” & _

Format(vCenterOfMass(1), “#,

0.000″) & “, ” & _

Format(vCenterOfMass(2), “#,

0.000″) & “)”

‘ 設計上限値を超えているかチェック
If dMass > DESIGN_MAX_WEIGHT_GRAMS Then
message = message & vbCrLf & vbCrLf & _
“警告: 設計上限重量 (” & Format(DESIGN_MAX_WEIGHT_GRAMS, “#,

0.000″) & ” g) を超過しています!” & vbCrLf & _

“現在の質量: ” & Format(dMass, “#,

0.000″) & ” g”

MsgBox message, vbCritical, “重量超過アラート”
Else
‘ 上限値以下の場合
MsgBox message, vbInformation, “質量特性確認”
End If

‘ オブジェクトを解放 (VBAでは明示的な解放は必須ではないが、良い習慣)
Set swMassProperties = Nothing
Set swMeasure = Nothing
Set swModel = Nothing
Set swApp = Nothing

End Sub

コードを読み解く:各行の意味を丁寧に解説

さあ、このコードが何をしているのか、一つずつ見ていきましょう。

1. `Option Explicit`:
これは非常に重要な宣言です。変数を宣言せずに使用しようとするとエラーになるため、タイプミスによるバグを防ぐのに役立ちます。常にコードの先頭に記述する習慣をつけましょう。

2. `Sub CalculateAndCheckMass()`:
VBAでは、`Sub` と `End Sub` で囲まれた部分が実行可能なプロシージャ(サブルーチン)になります。これは、このマクロの名前を `CalculateAndCheckMass` と定義しています。

3. `Dim swApp As SldWorks.SldWorks`:
`Dim` は変数を宣言するためのキーワードです。ここでは、`swApp` という名前で `SldWorks.SldWorks` 型の変数を宣言しています。これは、実行中のSolidWorksアプリケーションそのものを指し示すオブジェクトです。

4. `Set swApp = Application.SldWorks`:
`Set` キーワードは、オブジェクト型の変数を初期化(代入)する際に使用します。ここでは、`swApp` 変数に、現在実行されているSolidWorksアプリケーションへの参照を代入しています。

5. `Dim swModel As SldWorks.ModelDoc2`:
`swModel` という名前で、SolidWorksのドキュメント(パーツ、アセンブリ、図面)を表す `SldWorks.ModelDoc2` 型の変数を宣言しています。

6. `Set swModel = swApp.ActiveDoc`:
現在、SolidWorksでアクティブになっているドキュメント(一番手前に表示されているドキュメント)への参照を `swModel` 変数に代入しています。

7. エラーハンドリング(ドキュメントとファイルタイプのチェック):

If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbExclamation
Exit Sub
End If

If Not swModel.GetType = swDocPART Then
MsgBox “このマクロはパーツファイル (.sldprt) でのみ実行できます。”, vbExclamation
Exit Sub
End If

ここで、アクティブなドキュメントが存在するか、そしてそれがパーツファイル(`swDocPART`)であるかをチェックしています。もしドキュメントがなかったり、パーツファイルでなかったりした場合は、エラーメッセージを表示してマクロを終了させます。これにより、意図しないファイルでマクロが実行されるのを防ぎます。`vbExclamation` は、警告アイコン付きのメッセージボックスを表示するための定数です。

8. `Dim swMeasure As SldWorks.Measure`:
測定機能に関連するインターフェースである `SldWorks.Measure` 型の変数 `swMeasure` を宣言します。

9. `Set swMeasure = swApp.GetMeasure`:
SolidWorksアプリケーションから、測定機能(Measure)へのアクセスを取得し、`swMeasure` 変数に代入しています。

10. `Dim swMassProperties As SldWorks.MassProperties`:
計算された質量特性を格納するための `SldWorks.MassProperties` 型の変数を宣言します。

11. `Set swMassProperties = swMeasure.CalculateMassProperties(swModel)`:
ここが今回の主役! `swMeasure` オブジェクトの `CalculateMassProperties` メソッドを呼び出します。引数として `swModel`(対象となるパーツドキュメント)を渡すことで、そのモデルの質量特性が計算され、その結果が `swMassProperties` オブジェクトに格納されます。

12. `Dim dMass As Double`, `Dim dVolume As Double`, etc.:
計算された質量、体積、表面積を格納するための `Double` 型(浮動小数点数)の変数を宣言しています。`Variant` 型は、様々なデータ型を格納できる汎用的な型ですが、ここでは重心位置が3つの数値(X, Y, Z座標)の配列として返されるため、`Variant` を使用しています。

13. プロパティ値の取得:

dMass = swMassProperties.Mass
dVolume = swMassProperties.Volume
dSurfaceArea = swMassProperties.SurfaceArea
vCenterOfMass = swMassProperties.CenterOfMass

`swMassProperties` オブジェクトが持つ `.Mass`、`.Volume`、`.SurfaceArea`、`.CenterOfMass` といったプロパティから、計算された値をそれぞれの変数に代入しています。

14. 設計上限値の定義:

Const DESIGN_MAX_WEIGHT_GRAMS As Double = 10000.0

`Const` キーワードは、定数を宣言します。一度値を代入すると、後から変更することはできません。ここでは、設計上限重量を `10000.0`(グラム)と定義しています。この値は、必要に応じて自由に変更してください。

15. メッセージ文字列の構築:

message = “パーツの質量特性:” & vbCrLf & _
“質量: ” & Format(dMass, “#,

0.000″) & ” g” & vbCrLf & _

`vbCrLf` は改行コードです。取得した質量特性を、見やすく整形してメッセージボックスに表示するための文字列を作成しています。`Format` 関数は、数値を指定した書式(ここでは小数点以下3桁まで表示)で整形するのに便利です。

16. 設計上限値チェックと警告:

If dMass > DESIGN_MAX_WEIGHT_GRAMS Then
‘ 上限値を超えた場合の処理
message = message & vbCrLf & vbCrLf & _
“警告: 設計上限重量 (” & Format(DESIGN_MAX_WEIGHT_GRAMS, “#,

0.000″) & ” g) を超過しています!” & vbCrLf & _

“現在の質量: ” & Format(dMass, “#,

0.000″) & ” g”

MsgBox message, vbCritical, “重量超過アラート”
Else
‘ 上限値以下の場合の処理
MsgBox message, vbInformation, “質量特性確認”
End If

ここで、計算された質量 (`dMass`) が、定義した上限値 (`DESIGN_MAX_WEIGHT_GRAMS`) を超えているかを `If` 文で判定しています。

  • 超えている場合は、警告メッセージを追加し、`vbCritical`(エラーアイコン)付きのメッセージボックスで、より注意を促します。
  • 超えていない場合は、単に質量特性を表示します。`vbInformation` は情報アイコン付きのメッセージボックスです。

17. オブジェクトの解放:

Set swMassProperties = Nothing
Set swMeasure = Nothing
Set swModel = Nothing
Set swApp = Nothing

VBAでは、オブジェクト変数が不要になったら `Nothing` を代入して解放するのが、メモリ管理の観点から推奨されるプラクティスです。これにより、プログラムの実行中に不要なメモリが占有されるのを防ぎます。

実行方法

1. SolidWorksで、質量をチェックしたいパーツファイルを開きます。
2. VBAエディタを開き、作成した `CalculateAndCheckMass` サブルーチンが存在することを確認します。
3. VBAエディタのツールバーにある「実行」ボタン(緑色の三角形)をクリックするか、F5キーを押します。
4. もし、マクロのセキュリティ設定でマクロの実行がブロックされている場合は、`ファイル` > `オプション` > `システムオプション` > `セキュリティ` でマクロのセキュリティレベルを調整するか、マクロを保存した場所を信頼できる場所に設定してください。

![VBAエディタの実行ボタン](https://example.com/images/vba_run_button.png)
(※画像はイメージです。実際にはSolidWorksのVBAエディタのスクリーンショットをご参照ください)

陥りやすいエラーと注意点

このマクロを実行する際に、いくつか注意しておきたい点や、よくあるエラーがあります。

  • 単位系の問題:

SolidWorksでは、ドキュメントごとに単位系が設定されています。`CalculateMassProperties` が返す質量、体積、表面積の単位は、そのドキュメントの単位系に依存します。
例えば、メートル法(mm、g、N)で設定されている場合、質量はグラム (g) で返されることが多いですが、インチ法(in、lb、lbf)の場合はポンド (lb) で返される可能性があります。
今回のコードでは、単純化のためにグラム (g) を想定していますが、実際の運用では、ドキュメントの単位系を正しく取得し、必要に応じて換算処理を加えることが非常に重要です。
【解決策】
`swModel.Extension.GetUserPreferenceDouble(swUserPreferenceDoubleValue_e.swUnitsMass)` のようなメソッドを使って、現在の質量単位を取得し、それに基づいて計算を調整しましょう。

  • アセンブリファイルでの実行:

このマクロはパーツファイル (.sldprt) 専用です。アセンブリファイル (.sldasm) で実行しようとすると、エラーメッセージが表示されて終了しますが、もしアセンブリ全体の質量を計算したい場合は、`swModel.GetConfigurationByName(“Default”).GetMassProperties()` のようなメソッドを別途検討する必要があります(ただし、こちらも単位系には注意が必要です)。

  • マテリアルの設定:

`CalculateMassProperties` は、パーツに設定されているマテリアル情報(密度など)に基づいて質量を計算します。もし、マテリアルが設定されていない、あるいは誤ったマテリアルが設定されている場合、質量計算の結果は不正確になります。
【解決策】
パーツファイルを開く前に、マテリアルが正しく設定されていることを確認する、あるいはマクロ内でマテリアルを設定する処理を追加することを検討しましょう。

  • ジオメトリの不整合:

非常に複雑なジオメトリや、閉じられていない(非ソリッドな)ボディがある場合、質量計算が正しく行われないことがあります。
【解決策】
`SOLIDWORKS Application` > `評価` > `解析` > `質量特性` から手動で計算してみて、エラーが出ないか確認してみてください。それでも問題がある場合は、ジオメトリの修正が必要です。

さらなる進化:VB.NETへの拡張

VBAは手軽ですが、より高度な処理や、他のアプリケーションとの連携を考えるなら、VB.NETでの開発も視野に入ってきます。VB.NETでは、SolidWorks APIへのアクセス方法も少し異なりますが、基本的な考え方は同じです。

もし、VB.NETでの開発に興味があれば、SolidWorks APIのVB.NET用ラッパーライブラリ(例: SolidWorks Interop Assemblies)を利用して、より効率的に開発を進めることができます。

まとめ:SolidWorks VBAで設計プロセスを強化しよう!

いかがでしたか? 今回は `IMeasure.CalculateMassProperties` を使って、パーツの質量を自動で取得し、設計上限値を超えた場合に警告を発するマクロを作成しました。

  • APIの基本: SolidWorks APIを使うことで、マクロの記録だけでは実現できない高度な処理が可能になります。
  • 質量管理の重要性: 設計初期段階での質量管理は、コスト、性能、安全性の向上に不可欠です。
  • `CalculateMassProperties` の活用: このメソッドを使えば、パーツの物理プロパティをプログラムから簡単に取得できます。
  • エラーハンドリングと単位系: 実際の運用では、エラー処理や単位系の考慮が重要になります。

このマクロは、あくまで基本的な一例です。ここからさらに、

  • 特定の構成部品の質量だけをチェックする
  • 複数のパーツの合計質量をチェックする
  • 質量に応じて材料を変更する提案を出す
  • 設計情報(ファイル名、設計者、日付など)をExcelファイルに記録する

といった、様々な機能を追加していくことができます。

SolidWorks VBAを使いこなすことは、あなたの設計業務を劇的に効率化し、より付加価値の高い仕事をするための強力な武器となります。今回学んだ知識を土台に、ぜひ色々なマクロに挑戦してみてください。「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ」と、自信を持って言えるようになるまで、一緒に歩んでいきましょう!

それでは、また次回の記事でお会いしましょう! Happy Automating!

タイトルとURLをコピーしました