【SolidWorks VBA極限活用】ConfigurationManager.AddConfiguration2が奏でる、派生コンフィギュレーション階層自動生成の真髄
こんにちは。開発プロジェクトの現場において、数千点に及ぶアセンブリやマスターパーツのバリエーション管理に頭を悩ませてきたエンジニアなら、一度はこう考えたことがあるはずだ。
「なぜ、手動でポチポチとコンフィギュレーションを追加し、親子の依存関係を構築しなければならないのか?」
型番違い、サイズ違い、オプション違い。これらをExcelなどの外部データソースから一括で、しかも「親コンフィギュレーションに追従する派生(Derived)構造」を維持したまま自動生成できなければ、真の設計自動化とは言えない。
今回は、SolidWorks APIの心臓部である `ConfigurationManager.AddConfiguration2` を用いて、堅牢かつ高速に階層的コンフィギュレーションを自動展開する実践的アプローチを伝授する。ネットの片隅に転がっているような表面的・断片的なコードではない。実務の現場で生き残る、泥臭さと美しさを兼ね備えたプロダクションコードの全貌を公開しよう。
—
1. なぜ「生のAddConfiguration2」だけでは実務で破綻するのか?
多くの初学者は、APIドキュメントを眺めてこう書く。
‘ 【アンチパターン】文脈を無視した単発の追加
swModel.ConfigurationManager.AddConfiguration2 “ChildConfig”, “ParentConfig”, “”, “”, 0, 0, True
これでは実務の現場で確実に破綻する。理由は以下の3点だ。
1. 暗黙のアクティブ状態依存: SolidWorksのAPIは「現在どのコンフィギュレーションがアクティブか」に結果が左右されやすい。これを意識せずにコードを書くと、意図しない親に対して子が生えてしまう。
2. エラーハンドリングの欠如: 既に同名のコンフィギュレーションが存在する場合の重複エラーや、親が存在しない場合の致命傷をスルーしている。
3. リビルドと画面描画のコスト: ループ内で毎回画面がチラつき、処理速度が劇的に低下する(いわゆる「画面描画の呪い」)。
プロのエンジニアであれば、「事前検証」「トランザクション的な状態管理」「描画の一時停止(App.UserControl)」を完全に制御下に置くべきだ。
—
2. 堅牢な階層自動生成のアーキテクチャ
今回構築するマクロの設計思想は以下の通りである。
- データ駆動: 処理のマスターデータ(親と子の関係性)を配列または外部定義から受け取る。
- 安全性(Idempotency): 既存のコンフィギュレーション名と衝突した場合のスキップ、または安全な上書きロジックを担保する。
- パフォーマンス最適化: 処理開始時にSolidWorksの画面描画と自動リビルドを抑制し、処理完了後に一括で整合性を取る。
匠の知見:AddConfiguration2 の引数の罠
`AddConfiguration2` のシグネチャを正確に理解しているだろうか?
configName as String, _
comment as String, _
altName as String, _
useAlternateName as Boolean, _
option as Long, _
derivedFrom as String, _
dsnFlag as Boolean
特に重要なのが第6引数の `derivedFrom` だ。ここに親となるコンフィギュレーションの正確な名前を文字列で渡すことで、初めて「派生コンフィギュレーション」としての親子関係が結ばれる。ここを空欄にすると、フラットな独立コンフィギュレーションが生成されてしまい、後々の寸法連動や抑制状態の継承で痛い目を見る。
—
3. 【プロダクションコード】階層的コンフィギュレーション一括生成マクロ
以下のコードは、実務の現場ですぐに組み込める完全版のVBAモジュールである。エラー処理、画面描画のロック、そして親子関係の構築が美しく統合されている。
Option Explicit
‘ ==============================================================================
‘ 処理名: 階層的コンフィギュレーション一括自動生成プロシージャ
‘ 概要: マスターパーツに対し、指定した親・子関係を持つコンフィギュレーション群を
‘ 安全かつ高速に一括生成する。
‘ ==============================================================================
Sub AutoGenerateConfigurations()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConfigMgr As SldWorks.ConfigurationManager
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. ドキュメントが開かれているか、かつパーツ/アセンブリかチェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocPART And swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはパーツまたはアセンブリでのみ実行可能です。”, vbExclamation, “対象外”
Exit Sub
End If
Set swConfigMgr = swModel.ConfigurationManager
‘ 2. パフォーマンス最大化のための環境設定(画面描画・自動リビルドの停止)
Dim longstatus As Long
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayUpdateWhileDragging, False
swModel.FeatureManager.EnableUpdate = False
On Error GoTo ErrorHandler
‘ 3. 生成するコンフィギュレーション定義の準備
‘ ※実務ではここでExcelやDBから動的に配列を構築してください。
‘ 構造: 0=コンフィギュレーション名, 1=説明, 2=親コンフィギュレーション名(空欄ならルート)
Dim configData(3, 2) As String
‘ — 親世代の定義 —
configData(0, 0) = “Standard_TypeA”: configData(0, 1) = “標準仕様 A”, configData(0, 2) = “”
configData(1, 0) = “Standard_TypeB”: configData(1, 1) = “標準仕様 B”, configData(1, 2) = “”
‘ — 子世代(派生)の定義 —
configData(2, 0) = “Standard_TypeA_Opt1”: configData(2, 1) = “仕様A オプション1”, configData(2, 2) = “Standard_TypeA”
configData(3, 0) = “Standard_TypeA_Opt2”: configData(3, 1) = “仕様A オプション2”, configData(3, 2) = “Standard_TypeA”
Dim i As Long
Dim configName As String
Dim comment As String
Dim parentName As String
Dim resultConfig As SldWorks.Configuration
‘ 4. トランザクション処理ループ
For i = LBound(configData, 1) To UBound(configData, 1)
configName = configData(i, 0)
comment = configData(i, 1)
parentName = configData(i, 2)
‘ 既存チェック(同名が存在する場合はスキップして堅牢性を担保)
If Not ConfigurationExists(swModel, configName) Then
‘ AddConfiguration2の引数設計:
‘ AddConfiguration2(ConfigName, Comment, AltName, UseAltName, Option, DerivedFrom, DsnFlag)
‘ ※Option: swAddConfigOption_Default (0)
If parentName = “” Then
‘ ルート(親)コンフィギュレーションの作成
Set resultConfig = swConfigMgr.AddConfiguration2( _
configName, _
comment, _
“”, _
False, _
0, _
“”, _
True)
Else
‘ 派生(子)コンフィギュレーションの作成(親を指定)
Set resultConfig = swConfigMgr.AddConfiguration2( _
configName, _
comment, _
“”, _
False, _
0, _
parentName, _
True)
End If
If resultConfig Is Nothing Then
Debug.Print “警告: コンフィギュレーションの作成に失敗しました -> ” & configName
Else
Debug.Print “成功: ” & configName & ” (親: ” & IIf(parentName = “”, “なし”, parentName) & “)”
End If
Else
Debug.Print “スキップ: 既に存在します -> ” & configName
End If
Next i
‘ 5. 変更をモデルに反映
swModel.ForceRebuild3 False
MsgBox “すべてのコンフィギュレーションの階層生成が完了しました。”, vbInformation, “完了”
GoTo Finally
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
Finally:
‘ 6. 環境設定の復元(絶対に忘れてはならない後処理)
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayUpdateWhileDragging, True
swModel.FeatureManager.EnableUpdate = True
swModel.GraphicsRedraw2
End Sub
‘ ==============================================================================
‘ 補助関数: 指定したコンフィギュレーションが既に存在するか判定する
‘ ==============================================================================
Private Function ConfigurationExists(swModel As ModelDoc2, configName As String) As Boolean
Dim vConfigs As Variant
Dim i As Long
vConfigs = swModel.GetConfigurationNames
ConfigurationExists = False
For i = LBound(vConfigs) To UBound(vConfigs)
If vConfigs(i) = configName Then
ConfigurationExists = True
Exit Function
End If
Next i
End Function
—
4. 現場で活きるエンジニアリングの勘所
このコードを実運用に組み込む際、さらにプロフェッショナルな視点として以下の2点を意識してほしい。
① データベース・CSV連携への拡張
上記のコードでは配列(`configData`)でハードコーディングしているが、実務ではこれを外部CSVファイルやPDM/MESデータベースからのSQLクエリ結果に置き換えるべきである。
「マスター図面を起動 → 外部CSVをADODB等で読み込み → ループで一括生成」というパイプラインを構築すれば、設計変更時のリードタイムを数時間から「数秒」へと劇的に短縮できる。
② 派生コンフィギュレーションの恩恵と注意点
派生コンフィギュレーションを使用する最大のメリットは、「親の形状変更が子に自動伝播する」点にある。しかし、逆に「子で独自の形状(カット特徴の追加など)を持たせたい」場合、親の変更が干渉することがある。
マクロで自動生成した後に、特定のプロパティや寸法を書き換えるロジック(`swModel.Parameter` や `CustomPropertyManager` の操作)を追撃戦として実装しておくと、自動化の精度はさらに次元が上がる。
—
最後に:自動化とは「手間を省くこと」ではなく「エンジニアを解放すること」だ
単にボタン一つでコンフィギュレーションが増えるだけでは、本当の効率化とは言えない。
「人間が手作業で行うと必ず発生するヒューマンエラー(親の指定ミス、命名規則の崩壊、不要なリビルドによるフリーズ)」をAPIの力で完全にハネ除け、システムとして美しく完結させること。それこそが、我々エンジニアが目指すべき設計自動化の姿である。
今回のコードをベースに、あなたの現場のワークフローに合わせた最強の自動化ツールを組み上げてほしい。健闘を祈る。
