規格の不一致は「設計の死」を招く。VBAでアセンブリの初期状態を強制統一せよ
設計現場において、「なぜか部品が浮いている」「単位系が混在していて質量計算が合わない」といったトラブルは、往々にして初期テンプレートの運用不備から生まれる。個人の手作業に依存した設定など、自動化の世界では無価値に等しい。
真のエンジニアは、ドキュメントのライフサイクルをコードで支配する。今回は、SolidWorksアセンブリ新規作成時に、単位系(MMGS/IPS)や精度、グリッド設定を強制的に上書きし、全社的なCAD品質を担保する「初期化アーキテクチャ」を伝授する。
—
なぜテンプレートに頼るだけでは不十分なのか
多くの設計者は「テンプレートファイル(.asmdot)さえ用意すればいい」と考える。だが、レガシー環境や共有PCでは、誰かが設定を上書き保存したり、外部から持ち込まれた不適切なファイルが紛れ込んだりする。
「環境を信じるな、システムで強制せよ」
これが堅牢な自動化の鉄則だ。APIを叩き、メモリ空間上でドキュメントのプロパティを強引に書き換える。これが唯一の「確実な手段」である。
—
実装コード:アセンブリ初期化の極意
以下は、新規アセンブリを作成し、その単位系と精度を即座に制御するスクリプトだ。`swApp.NewDocument`で作成した直後、何者にも邪魔させずに設定を流し込む。
‘ SolidWorks APIによるアセンブリ初期化スクリプト
Option Explicit
Sub InitializeAssemblyEnvironment()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim longstatus As Long
‘ SolidWorksプロセスの接続
Set swApp = Application.SldWorks
‘ 新規アセンブリを作成 (テンプレートパスは各社の規程に合わせて定義せよ)
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\templates\Assembly.asmdot”, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “テンプレートの読み込みに失敗しました。パスを確認してください。”, vbCritical
Exit Sub
End If
‘ 単位系をMMGS (ミリ、グラム、秒) に強制設定
‘ 0: IPS, 1: MMGS, 2: CGS
swModel.Extension.SetUserPreferenceInteger swUserPreferenceIntegerValue_e.swUnitsAssemblyLinear, 0, swLengthUnit_e.swMM
swModel.Extension.SetUserPreferenceInteger swUserPreferenceIntegerValue_e.swUnitsAssemblyMass, 0, swMassUnit_e.swGRAM
‘ 寸法精度を小数点以下3桁に固定
swModel.Extension.SetUserPreferenceInteger swUserPreferenceIntegerValue_e.swUnitsDecimalPlaces, 0, 3
‘ グリッド設定の強制(視認性ミスを排除)
swModel.Extension.SetUserPreferenceInteger swUserPreferenceIntegerValue_e.swGridMajorSpacing, 0, 100 ‘ 100mm間隔
‘ メモリ最適化とオブジェクトの解放
‘ 大規模アセンブリを扱う際、明示的なNothing代入はメモリリークを抑止する重要行程
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
シニアエンジニアが意識すべき「隠れた仕様」
1. `SetUserPreferenceInteger` の真価
このメソッドはUI上の設定を変更するだけでなく、ドキュメントのメタデータに直接作用する。重要なのは、設定変更後に一度も再保存していないドキュメントに対して、確実に変更を適用させる点にある。GUIの「ドキュメントプロパティ」を操作するより、APIによる直接的な書き込みの方が圧倒的に安定する。
2. オブジェクトライフサイクルの管理
VBAはガベージコレクションが脆弱だ。特にSolidWorksのCOMオブジェクトは、`Set`したまま放置するとメモリ上に無用なプロセスが残る(いわゆるゾンビプロセス)。大規模なアセンブリをループ処理する場合、この解放処理を怠ると、数時間でメモリ不足に陥る。
3. システム間連携の拡張性
今回はVBAで記述したが、この手法はVB.NETやC#(SolidWorks API SDK)への移植が容易である。さらに言えば、`swModel.Extension.CustomPropertyManager`を組み合わせることで、作成者名、図番、材質などのメタデータを、アセンブリ生成と同時にPDMへ同期させることも可能だ。これが、脱・個人作業の第一歩である。
—
最後に:自動化は「思想」である
ツールは単なる手段に過ぎない。重要なのは、設計者の思考をシステムに反映させることだ。
「単位系を統一する」という些細なルール一つ取っても、それを人の意識に頼るか、コードで強制するかで、数年後の設計データの品質は天と地ほどの差がつく。
まずはこのコードを読み込み、貴社の開発環境に組み込んでほしい。エラーが起きる場所があれば、それは貴社のプロセスに「不整合の種」がある証拠だ。それこそが、我々エンジニアが解くべき真の課題である。
