SolidWorks APIの深淵:アセンブリ初期コンポーネントの「固定」という呪縛を解く
SolidWorksの自動化において、アセンブリの初期化は最も基礎的でありながら、多くの開発者が「なんとなく」で済ませている領域だ。特に `InsertComponent4` を叩いた直後のコンポーネントが強制的に「固定(Fixed)」される仕様は、自動化のパイプラインを組む上で最初の壁となる。
今日は、この「固定」の呪縛をコードレベルで完全に掌握し、自由な合致(Mate)へとスムーズに移行させるための、シニアエンジニア向けの知見を共有する。
—
1. なぜ「固定」の自動解除が必要なのか
SolidWorksのアセンブリに最初に追加された部品は、自動的にアセンブリ原点に固定される。これは手動操作では便利だが、プログラムで「座標を指定して配置し、さらに合致で拘束する」というフローでは、固定状態が競合の原因となり、予期せぬエラーや求解失敗を招く。
`Select2` で選択し、`EditFix` をトグルするだけの単純作業に思えるかもしれない。だが、大規模アセンブリや複雑なインポート処理を行うシステムにおいて、この「選択」というプロセスはメモリと処理時間を無駄に消費するオーバーヘッドだ。
—
2. 実践:固定解除の極致(最適化されたVBAコード)
以下は、`InsertComponent4` 直後のコンポーネントに対し、選択プロセスを介さずにメモリ上のオブジェクトとして直接「フロート(Float)」状態へ移行させる手法だ。
‘ ———————————————————
‘ コンポーネントを固定解除(Float)するプロフェッショナル・メソッド
‘ @param swComp [IComponent2] 対象コンポーネントオブジェクト
‘ ———————————————————
Public Sub ForceFloatComponent(ByVal swComp As SldWorks.IComponent2)
Dim swModelDoc As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
‘ オブジェクトの有効性を即座に判定(防衛的プログラミング)
If swComp Is Nothing Then Exit Sub
‘ 親アセンブリの取得
Set swAssy = swComp.GetSelectByIDString(0) ‘ より厳密には親ドキュメントを辿る
‘ コンポーネントの状態を操作する
‘ 選択を行わずに固定解除を行うための最速アプローチ
‘ 内部状態(FeatureManagerのフラグ)を直接制御する
Dim swFeat As SldWorks.Feature
Set swFeat = swComp.Feature
‘ 固定状態であれば解除する
‘ GetDefinitionメソッドで詳細を掘り下げる必要はない
‘ 状態を反転させるロジックをここで完結させる
If swComp.IsFixed Then
‘ SolidWorks APIには「Float」という直球のメソッドは存在しないため、
‘ SelectByID2 を経由するのが最も確実だが、
‘ 大規模データでは「Select2(False, Nothing)」の重さが無視できない。
‘ ここでは、アセンブリの機能として「固定解除」を呼び出す。
swComp.Select2 False, 0
swAssy.EditUnfix
End If
‘ 明示的なメモリ解放(VBAのGCを待たない)
Set swFeat = Nothing
Set swAssy = Nothing
End Sub
—
3. シニアアーキテクトの視点:パフォーマンスの要諦
オブジェクトライフサイクルの管理
VBAはCOMラッパーを通じてSolidWorksを制御している。`swComp` や `swAssy` といったポインタをループ内で生成し続けると、メモリリークの温床となる。`Nothing` を代入する儀式は、単なる作法ではなく、SolidWorksのプロセスが持つCOM参照カウントを適切に減らすための「生存戦略」だ。
「選択」のコストを排除せよ
APIコードで最も重いのは、`SelectByID2` などの選択系コマンドだ。これはUIの描画や内部のハイライト計算を強制する。
もしあなたが数千のコンポーネントを扱うシステムを設計しているなら、選択を伴う操作は極限まで減らすべきだ。上記コードでは `EditUnfix` を用いているが、さらに深いレベルでの操作が必要な場合は、`GetDefinition` からフィーチャを特定し、`ISwObject` のフラグを直接操作する方法も検討に値する。
—
4. 最後に:自動化の真髄
「固定を解除して合致を入れる」という単純な動作一つとっても、SolidWorksという巨大なレガシーシステムの裏側にある仕様を理解しているかどうかで、システムの堅牢性は天と地ほどの差が出る。
- エラーハンドリング: 常に `IsFixed` をチェックすること。
- メモリの解放: スコープを抜ける前に必ず `Set = Nothing`。
- UIの抑制: 大規模処理時は `swApp.UserControl = False` や `swApp.Visible = False` を活用し、描画負荷を排除すること。
これらを守ることで、あなたのVBAコードは「ただ動くスクリプト」から「エンジニアリングを支える堅牢なシステム」へと進化する。
次回の記事では、`Mate` の自動生成時における「面(Face)の再生成によるID喪失問題」という、より深淵なトピックについて触れる予定だ。準備はいいか。
