【テクニカル・上級編】【実務効率化】社内標準のカラーパレットとRGB値をパーツモデルのデフォルト色として一括適用するマクロ – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks外観パイプラインの掌握:VBAによる社内標準カラーパレットのグラフィック層直接注入

設計品質の平準化において、モデルの「色」は単なる意匠ではない。それは加工分類、材質識別、あるいは公差域の視覚的シグナルであり、設計意図を製造工程へ誤解なく伝えるためのセマンティックなメタデータである。

しかし現場では、設計者ごとに微妙に異なるRGB値の手動設定、あるいはモデル階層(Face / Feature / Body / Part)ごとに乱立した外観オーバーライドによって、データストアとしてのCADモデルが汚染され続けている。

本稿では、GUIを介した曖昧な色設定を排し、SolidWorks APIのグラフィック・プロパティ層を直叩きすることで、社内標準カラーパレットを一括適用する全自動VBAマクロを構築する。レガシーコードを踏襲しただけのスクリプトとは一線を画す、メモリ管理とレンダリングスタックの挙動まで見据えた極限の実装仕様を解説する。

1. SolidWorksにおける外観(Appearance)の階層構造とAPIの深層

SolidWorksのグラフィックエンジンは、非常に厳格な外観の「優先順位(Hierarchy)」を持つ。下位から上位へとオーバーライドされる描画パイプラインの構造は以下の通りだ。

[Part Defaults] → [Body] → [Feature] → [Face] → [Component (Assembly)]
(低優先度) (高優先度)

多くの無知なスクリプトは、フィーチャや面に個別の外観(`RenderMaterial`)を上書き付与することで色を変えようとする。これはモデルのファイルサイズを無駄に膨張させ、アセンブリ展開時の再描画(Rebuild)パフォーマンスを著しく低下させる悪手である。

真のアーキテクトが取るべきアプローチは、パーツモデルのデフォルト・マテリアルプロパティ(Part Level Default Material Properties)をダイレクトに書き換えることだ。これにより、フィーチャ構造を汚染することなく、モデル全体の基底色を一元管理できる。

これを実現するのが `IModelDocExtension::SetMaterialPropertyValues2` である。このメソッドは、0.0〜1.0に正規化されたDouble型配列を取り、内部のシェーディングエンジンに即座に数値をパラメータとして注入する。

2. 極限まで最適化された堅牢なVBAコード構造

以下のコードは、社内標準のカラーパレット定義、RGBからSolidWorks内部浮動小数点への正規化変換、ビュー更新のロック、および厳密なCOMオブジェクトのライフサイクル管理を完全に網羅したプロダクション用モジュールである。

‘===============================================================================
‘ Module: Mod_StandardColorManager
‘ Description: 社内標準カラーパレットの一括適用および外観パイプライン制御
‘ Author: Chief Automation Architect
‘===============================================================================
Option Explicit

‘ — Windows API: 高精度描画クロック取得(パフォーマンス計測用) —
If VBA7 Then
Private Declare PtrSafe Function QueryPerformanceCounter Lib “kernel32” (lpPerformanceCount As Currency) As Long
Private Declare PtrSafe Function QueryPerformanceFrequency Lib “kernel32” (lpFrequency As Currency) As Long
Else
Private Declare Function QueryPerformanceCounter Lib “kernel32” (lpPerformanceCount As Currency) As Long
Private Declare Function QueryPerformanceFrequency Lib “kernel32” (lpFrequency As Currency) As Long
End If

‘ — 社内標準カラー定義構造体 —
Public Type RGBColorSpec
R As Byte
G As Byte
B As Byte
Name As String
End Type

‘ — SolidWorks API Constants —
Private Const swDocPART As Long = 1
Private Const swInConfigurationOpts_e_swThisConfiguration As Long = 1

‘——————————————————————————-
‘ Main Entry Point: 社内標準カラーの一括適用
‘——————————————————————————-
Public Sub ApplyCorporateStandardColor()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModelExt As SldWorks.ModelDocExtension
Dim swPart As SldWorks.PartDoc

‘ パフォーマンス計測開始
Dim tStart As Currency, tEnd As Currency, freq As Currency
QueryPerformanceFrequency freq
QueryPerformanceCounter tStart

On Error GoTo ErrorHandler

‘ SolidWorksインスタンスの捕捉
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub

‘ アクティブドキュメントの取得と厳格な型チェック
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation, “Execution Halted”
GoTo CleanUp
End If

If swModel.GetType <> swDocPART Then
MsgBox “本マクロはパーツドキュメント(.prtdot / .sldprt)専用です。”, vbCritical, “Type Mismatch”
GoTo CleanUp
End If

Set swPart = swModel
Set swModelExt = swModel.Extension

‘ ————————————————————————-
‘ 描画エンジンおよびUIイベントのサスペンド(パフォーマンス極大化)
‘ ————————————————————————-
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swUpdateViewOnceRebuildRefersToPart, False

‘ 社内標準カラーの選択(実務では設定ファイルやフォームから動的取得)
Dim targetColor As RGBColorSpec
targetColor = GetCorporateColorPalette(“SAFETY_BLUE”)

‘ ————————————————————————-
‘ マテリアルプロパティ配列の構築
‘ [0-2]: RGB (0.0 to 1.0)
‘ [3]: Ambient (環境光), [4]: Diffuse (拡散反射), [5]: Specular (鏡面反射)
‘ [6]: Shininess (光沢度), [7]: Transparency (透明度), [8]: Emission (自己発光)
‘ ————————————————————————-
Dim propArray(8) As Double
propArray(0) = CDbl(targetColor.R) / 255# ‘ Red
propArray(1) = CDbl(targetColor.G) / 255# ‘ Green
propArray(2) = CDbl(targetColor.B) / 255# ‘ Blue
propArray(3) = 0.4 ‘ Ambient
propArray(4) = 0.7 ‘ Diffuse
propArray(5) = 0.3 ‘ Specular
propArray(6) = 0.5 ‘ Shininess
propArray(7) = 0# ‘ Transparency (0 = 不透明)
propArray(8) = 0# ‘ Emission

‘ ————————————————————————-
‘ グラフィック層へのダイレクトコミット
‘ ————————————————————————-
Dim boolStatus As Boolean
boolStatus = swModelExt.SetMaterialPropertyValues2( _
propArray, _
swInConfigurationOpts_e_swThisConfiguration, _
Nothing)

If Not boolStatus Then
Err.Raise vbObjectError + 5100, “ApplyColor”, “SetMaterialPropertyValues2 の書き込みに失敗しました。”
End If

‘ 外観の変更をグラフィックキャッシュに完全反映
swModel.GraphicsRedraw2

QueryPerformanceCounter tEnd
Debug.Print “Execution Time: ” & Format$((tEnd – tStart) / freq 1000#, “0.000”) & ” ms”

MsgBox “社内標準カラー [” & targetColor.Name & “] を正常に適用しました。”, vbInformation, “Success”

CleanUp:
‘ ————————————————————————-
‘ COMオブジェクトの明示的解放(メモリリークの絶対的防止)
‘ ————————————————————————-
Set swPart = Nothing
Set swModelExt = Nothing
Set swModel = Nothing
Set swApp = Nothing
MemoryManagement.ForceGarbageCollection
Exit Sub

ErrorHandler:
MsgBox “Fatal Error [” & Err.Number & “]: ” & Err.Description, vbCritical, “Execution Failure”
Resume CleanUp
End Sub

‘——————————————————————————-
‘ 社内標準カラーパレット・リポジトリ
‘——————————————————————————-
Private Function GetCorporateColorPalette(ByVal colorCode As String) As RGBColorSpec
Dim colorSpec As RGBColorSpec
Select Case UCase$(colorCode)
Case “SAFETY_BLUE” ‘ 設計部署標準:構造体
colorSpec.R = 0: colorSpec.G = 102: colorSpec.B = 204: colorSpec.Name = “Safety Blue”
Case “SIGNAL_RED” ‘ 警告・干渉チェック部位
colorSpec.R = 220: colorSpec.G = 20: colorSpec.B = 60: colorSpec.Name = “Signal Red”
Case “MACHINING_GRAY”‘ 切削加工ベース面
colorSpec.R = 180: colorSpec.G = 180: colorSpec.B = 185: colorSpec.Name = “Machining Gray”
Case Else ‘ デフォルト:社内基底グレー
colorSpec.R = 200: colorSpec.G = 200: colorSpec.B = 200: colorSpec.Name = “Default Gray”
End Select
GetCorporateColorPalette = colorSpec
End Function

3. アーキテクチャの真髄:解説とチューニング

① 浮動小数点演算とカラーキャストの精度

VBAの整数演算からSolidWorks APIが要求する `Double`(倍精度浮動小数点数)への変換において、単なる `/ 255` を使用すると暗黙の型変換(Integer Division)や精度落下のリスクを伴う。
本コードでは `CDbl(val) / 255#` と明示的にリテラルをDouble指定(`#`)することで、色空間の丸め誤差を排除し、グラフィックカードのシェーダへ純粋な `0.0000000000000000` ~ `1.0000000000000000` の正規化値を引き渡している。

② 光学パラメータ(Ambient, Diffuse, Specular)の調整

単にRGBをセットするだけでは、CAD上のモデルは「塗りつぶされた平坦な粘土」のようになり、エッジや曲面の視認性が極端に低下する。
本実装では、製造現場での視認性を考慮し、以下の光学バランスを黄金比としてプリセットしている。

  • Ambient(環境光: 0.4): 影になる部分の黒潰れを防ぎ、形状の裏側を視認可能にする。
  • Diffuse(拡散反射: 0.7): 主光源からの光線に対する自然な発色度合い。
  • Specular(鏡面反射: 0.3)/ Shininess(光沢: 0.5): ハイライトを適度に絞り、曲面のR度合いを認識しやすくする。

③ レンダリングパイプラインのフリーズと再描画

無計画なAPI呼び出しは、1プロパティ変更ごとにSolidWorksのOpenGL描画バッファをフルフリッシュ(再描画)させ、画面のチラつき(Flashing)と処理オーバーヘッドを生む。
`swModel.GraphicsRedraw2` はすべての配列データが描画パイプラインにコミットされた後、最後に一度だけ呼び出すのが最速の作法である。

4. 運用・拡張への指針:レガシーからの脱却

本モジュールを社内インフラとして展開する場合、カラーコードをVBA内部にハードコーディングするのではなく、外部のJSON/INIファイル、あるいは社内PDM(SOLIDWORKS PDM)のデータカード変数と動的連携させるアーキテクチャへ拡張するのが理想的だ。

[ERP / PDM Data Card]
↓ (Material Code / Dept Code)
[VBA Macro Engine]
↓ (SetMaterialPropertyValues2)
[SolidWorks OpenGL Canvas]

また、COMオブジェクト(`SldWorks`, `ModelDoc2` 等)の解放漏れは、大量バッチ処理時にSolidWorksのプロセス(`SLDWORKS.exe`)を不調に陥らせ、最悪の場合はメモリリークによる強制終了を引き起こす。
コード内の `CleanUp` セクションで実施しているように、すべてのオブジェクト変数を明示的に `Nothing` へ帰属させる処理は、大規模自動化における絶対条件である。

極限まで無駄を削ぎ落としたこのベースコードを核とし、貴社のCAD運用仕様に合わせた堅牢な自動化エコシステムを構築していただきたい。

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