【実務・中級編】【初心者必見】単位系(ミリメートル・インチ)の混同を防ぐためのSwApp.SetUserPreferenceIntegerValue活用術 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極限活用術】単位系崩壊の悪夢を防げ!SwApp.SetUserPreferenceIntegerValueによる鉄壁のドキュメント制御

開発プロジェクトの現場において、マクロや自動化スクリプトが引き起こす最大の悲劇の一つが「単位系の混同(ミリメートルとインチのズレ)」だ。

「昨日まで完璧に動いていた部品生成マクロが、別のPCで実行した途端に米粒のような小ささになった」
「図面から読み込んだ数値そのままにAPIへ突っ込んだら、数千倍の怪物のようなジオメトリが生成され、SolidWorksがフリーズした」

こうしたトラブルに直面したことはないだろうか。犯人は、SolidWorksの環境設定(オプション)に隠されている。
今回は、VBAからAPIを叩いてパーツファイルを生成する際、この単位系に起因するバグを根絶し、いかなる環境下でも意図した通りのジオメトリを生成するための「極限の知見」を伝授する。

なぜ「単位系の混同」は起きるのか?(APIの罠)

多くの初学者は、`SldWorks.NewDocument` メソッドでテンプレートを指定してパーツを開けば安心だと考える。しかし、それは大きな勘違いだ。

SolidWorksのAPIは、背後で「アクティブなドキュメントのシステムオプション」「ユーザー設定(UserPreference)」を強く参照する。
例えば、ユーザーが前回の作業で「インチ(IPS)」をデフォルトにしていた場合、コード側で `100` という数値を渡したとき、APIはそれを「100インチ(約2,540mm)」として解釈してしまう。

コード内で `100` と書いたとき、それがミリメートルなのかインチなのかは、SolidWorks側の設定次第でガラリと変わるのだ。この暗黙のコンテキスト依存こそが、マクロの移植性や堅牢性を著しく損なう元凶である。

愚かな実装 vs 賢明な設計

  • 非効率な設計: ユーザーのPC環境(オプション設定)に依存し、運任せで数値を流し込む。環境が変われば即座にバグる。
  • プロフェッショナルな設計: マクロの実行開始時に、API経由で強制的にドキュメントの単位系をターゲット(例:MMGS)に固定し、その上で安全に数値を流し込む。

解決の切り札:`SwApp.SetUserPreferenceIntegerValue`

この問題をコード側で完全にコントロールするために使用するのが、`SldWorks` オブジェクトの `SetUserPreferenceIntegerValue` メソッドだ。

このメソッドを用いることで、VBAから直接SolidWorksのシステムオプション(単位系など)を書き換えることができる。中でも、単位系の切り替えにおいて強力な武器となるのが `swUnitSystem` に関連する列挙体である。

主要な単位系パラメータ

  • `swUseSystemOfUnits` : 使用する単位系そのものを指定する。
  • 設定可能な主な値(System of Units):
  • `0` = 英ユニット (IPS – インチ、ポンド、秒)
  • `1` = メートル法 (MKS – メートル、キログラム、秒)
  • `2` = ミリメートル法 (MMGS – ミリメートル、グラム、秒)
  • `3` = センチメートル法 (CGS – センチメートル、グラム、秒)

これらをAPI経由で事前に明示的に指定することで、環境依存のバグを完全にシャットアウトできる。

【プロダクションコード】単位系を完全固定する堅牢なパーツ生成テンプレート

実務の現場でそのままコピペして使用できる、極めて堅牢性の高いVBAコードを提供する。
このコードは、新規パーツドキュメントを作成した直後に、強制的に「MMGS(ミリメートル・グラム・秒)」へ単位系を固定し、安全にベースとなるボス・押し出しフィーチャを生成する一連の流れを実装している。

‘ ==============================================================================
‘ 業務自動化モジュール: 単位系固定型パーツ生成エンジンのひな形
‘ 開発者: チーフアーキテクト
‘ 概要: 環境依存の単位ズレを防ぎ、常にミリメートル単位でジオメトリを構築する
‘ ==============================================================================
Option Explicit

Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim templatePath As String
Dim longstatus As Long
Dim longwarnings As Long

‘ 1. SldWorksアプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If

‘ 2. ユーザー定義テンプレートのパス取得(環境に応じた標準パーツテンプレート)
templatePath = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)

If templatePath = “” Then
‘ テンプレートが見つからない場合のフォールバック(標準パスの例)
templatePath = “C:\ProgramData\SolidWorks\SolidWorks 2023\templates\Part.prtprt”
End If

‘ 3. 新規パーツドキュメントの作成
Set swModel = swApp.NewDocument(templatePath, 0, 0, 0)

If swModel Is Nothing Then
MsgBox “パーツドキュメントの新規作成に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If

‘ ==============================================================================
‘ 4. 【最重要】単位系の強制固定(MMGS: ミリメートル・グラム・秒)
‘ ==============================================================================
‘ swUnitSystem_e.swUnitSystem_MMGS = 2
Dim result As Boolean
result = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swUseSystemOfUnits, 2)

If Not result Then
MsgBox “単位系(MMGS)の強制設定に失敗しました。”, vbExclamation, “警告”
End If

‘ ドキュメント自体の単位プロパティも確実に反映させるため、必要に応じてドキュメント単位も確認
‘ ※SolidWorks APIではシステムオプション変更がアクティブドキュメントに即時反映されます。

‘ ==============================================================================
‘ 5. ジオメトリ生成処理(例:100mm x 100mm のベースプレート作成)
‘ ==============================================================================

‘ フロント平面を選択してスケッチモードへ
Dim boolstatus As Boolean
boolstatus = swModel.Extension.SelectByID2(“フロント”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)

If boolstatus Then
swModel.SketchManager.InsertSketch True

‘ 矩形を描画 (中心矩形: X=0, Y=0 から 100mm x 100mm)
‘ ※ここで渡す数値は、直前でMMGSに固定したため「必ず100ミリメートル」として処理される
Dim skRect As Object
Set skRect = swModel.SketchManager.CreateCenterRectangle(0, 0, 0, 0.1, 0.1, 0) ‘ 内部処理単位はメートル(MKSベース)の場合があるため注意

‘ スケッチ終了
swModel.SketchManager.InsertSketch False

‘ ボス押し出しフィーチャ作成 (深さ 10mm = 0.01m)
‘ ※SolidWorks APIのフィーチャ作成メソッド(FeatureManager.FeatureExtrusion2など)の
‘ 引数寸法は、ドキュメントの単位系に関わらず「常にメートル(m)」で渡す必要がある点に注意せよ!
Dim swFeat As SldWorks.Feature
Set swFeat = swModel.FeatureManager.FeatureExtrusion2( _
True, 0, False, 0, 0, _
0.01, 0.01, False, False, _
False, False, 0, 0, _
False, False, False, False, _
True, True, True, _
0, 0, False)

If Not swFeat Is Nothing Then
Debug.Print “パーツ生成成功: 単位系制御完了”
End If
End If

‘ ビューの更新
swModel.ViewZoomtoFit2

End Sub

B2Bの開発現場におけるプロからのアドバイスとして、非常に重要な罠(トラップ)をもう一つ共有しておこう。

> 【API引数における単位の二重基準に注意せよ】
> `SetUserPreferenceIntegerValue` やスケッチマネージャの一部、あるいはExcelやデータベースから読み込んだ「設計値」を扱う際、環境の単位系(MMGSやIPS)が影響する領域と、
> `FeatureExtrusion2` などのフィーチャ生成メソッドの引数(奥行きやオフセット値など)のように、API内部で強制的に「メートル(m)」を要求する領域がある。

この「API内部の基本単位(メートル・ラジアン固定)」と「ユーザー設定(ミリ・インチ)」の境界線を正しく理解しているかどうかが、プロのエンジニアとアマチュアを分ける決定的な分岐点となる。

まとめ:データベース連携やファイル出力への応用

今回紹介した `SwApp.SetUserPreferenceIntegerValue` による単位系の明示的制御は、単なるバグ防止策にとどまらない。

社内の生産管理データベース(DB)やERP、あるいはExcelからCSV経由で数値をバルクインポートし、自動で3Dモデル群を大量生成する「完全無人化バッチ処理システム」において、入力データの解釈ミスを根絶するための絶対不可欠な防壁となる。

「動けばいい」という甘えたコードを捨て、いかなる環境、いかなるユーザーのPCであっても寸分狂わず動作する、プロフェッショナルで堅牢なマクロを構築してほしい。あなたの開発プロジェクトの品質が、一段上のステージへと引き上げられるはずだ。

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