【実務・中級編】【コンフィギュレーション連携】ConfigurationManager.AddConfiguration2を用いた派生コンフィギュレーションの階層的自動生成 – SolidWorks VBA解析バイブル

スポンサーリンク

【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の力で完全にハネ除け、システムとして美しく完結させること。それこそが、我々エンジニアが目指すべき設計自動化の姿である。

今回のコードをベースに、あなたの現場のワークフローに合わせた最強の自動化ツールを組み上げてほしい。健闘を祈る。

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