【深淵なるSolidWorks API】フレキシブルサブアセンブリをプログラムで支配する技術
SolidWorks APIを扱うエンジニア諸君。特に、複雑な機構を扱うアセンブリの自動化に挑む者たちへ。
アセンブリにおける「フレキシブル(Flexible)」設定は、多くの初心者にとってUI上のチェックボックスに過ぎない。しかし、我々のようなシステムアーキテクトにとって、それは「サブアセンブリの自由度を動的に再定義し、拘束条件の数式エンジンを再構築する」という、極めて重厚なシステム処理に他ならない。
なぜこの処理で多くのマクロが「謎の挙動」を示すのか。その正体は、SolidWorksのドキュメント構造における「コンポーネントの参照状態の不一致」と「再計算プロセスのデッドロック」にある。本稿では、この深淵を制御するための実践的な知見を共有する。
—
1. フレキシブル化の真実: Component2.SetSuppression2 との決別
多くのエンジニアが陥る罠は、`SetSuppression2`や単なるプロパティ操作で解決しようとすることだ。フレキシブル設定の切り替えは、単なる状態変化ではなく、SolidWorks内部の「コンポーネント構成情報の強制更新」を伴う。
これを確実に行うには、`IComponent2::SetFlexible` を使用する。しかし、単に叩けばいいというものではない。処理前後の「アセンブリの再ビルド要求」と「オブジェクト参照の再取得」が必須だ。
実装の極意:プロテクトされた制御コード
以下のコードは、対象コンポーネントが正しく更新されることを保証する、実務ベースの標準ルーチンである。
‘ @brief サブアセンブリのフレキシブル状態を動的に制御する
‘ @param swComp IComponent2: 対象のサブアセンブリコンポーネント
‘ @param isFlexible Boolean: True=フレキシブル, False=剛体(Rigid)
Public Sub SetComponentFlexibility(ByRef swComp As SldWorks.Component2, ByVal isFlexible As Boolean)
Dim swModel As SldWorks.ModelDoc2
Set swModel = swComp.GetModelDoc2
‘ 1. オブジェクトの有効性チェック(メモリ上のゴミを掴まない)
If swComp Is Nothing Then Exit Sub
‘ 2. フレキシブル設定の適用
‘ ※戻り値(Boolean)で成功可否を判定せよ。失敗時は再帰的解決が必要
If Not swComp.SetFlexible(isFlexible) Then
Err.Raise vbObjectError + 1001, “AssemblyManager”, “コンポーネントの柔軟性変更に失敗しました。”
End If
‘ 3. 重要:この直後に再ビルドを強制する
‘ ForceRebuild3(False) はメモリ上の構成情報を強制同期させる
Dim swAssy As SldWorks.AssemblyDoc
Set swAssy = swComp.GetParent.GetModelDoc2
swAssy.ForceRebuild3 False
‘ 4. メモリ管理:明示的解放(VBAにおいては重要)
Set swAssy = Nothing
Set swModel = Nothing
End Sub
—
2. メモリ最適化と「ドキュメントのライフサイクル」
大規模アセンブリにおいてこの操作を繰り返すと、APIの呼び出しコストよりも「COM参照の蓄積によるメモリリーク」がボトルネックとなる。
- 循環参照の回避: `GetComponent` や `GetChildren` で取得したコンポーネントは、必ずスコープ終了時に `Nothing` でクリアせよ。
- イベントドリブンへの移行: 大量のアセンブリを操作する場合、`ForceRebuild`をループ内で多用してはならない。Windows APIの `Sleep` を挟むのではなく、`IModelDocExtension::Rebuild` を適切に使用し、再計算キューを最適化する戦略が求められる。
—
3. レガシー環境での注意点:名前解決の脆弱性
SolidWorksのバージョンが混在する環境や、ネットワークドライブ上のファイルを参照するレガシーシステムでは、`GetModelDoc2` が `Nothing` を返すケースが多発する。これは、コンポーネントがメモリ上にロードされていない(軽量構成)ことが原因だ。
解決策:
‘ コンポーネントがメモリにロードされているか確認し、無ければ開く
If swComp.GetModelDoc2 Is Nothing Then
swComp.Select4 False, Nothing, False
swAssy.EditPart ‘ 一時的に編集モードにしてロードを強制する
swAssy.EditAssembly
End If
—
4. チーフアーキテクトからの提言
フレキシブル設定を制御するシステムは、「機構の論理的整合性」と密接に関係している。もし、フレキシブル化した瞬間に合致エラー(Mate Error)が多発するようなら、それはコードの問題ではなく、アセンブリ構築時の「拘束順序」に問題がある。
APIを使って自動化する際、我々は単なるスクリプトを書いているのではない。SolidWorksが内部で計算している物理演算のグラフ構造をプログラムから書き換えているのだという自覚を持て。
- デバッグの極意: 変更前後の `IMateFeature` の状態を `GetStatus` でログに出力し、どの拘束が「未解決(Unsatisfied)」になるかを追跡せよ。
このレベルの自動化を習得すれば、数千部品のアセンブリであっても、機構解析のシナリオを秒単位で切り替えるような「真の自動化システム」が構築できるはずだ。
諸君、コードを書け。ただし、SolidWorksの魂(カーネル)に敬意を払いながら。
