アセンブリ構造のJSONシリアライゼーション:SolidWorksのバイナリ鎖を断ち切る設計論
CADエンジニアの諸君。君たちの現場では、いまだに「手作業でのアセンブリ構築」や「Excelリストを眺めながらの合致再定義」という、非生産的な儀式が行われていないか?
SolidWorksの`.SLDASM`は強力だが、それはブラックボックスの檻だ。WebシステムやグローバルなPLMとの疎結合を実現したいのであれば、CAD固有のバイナリから脱却し、アセンブリ構造を「データ」として再定義する必要がある。
今日は、アセンブリの階層構造、合致情報、そして絶対座標をJSONとして抽出し、再構築する「データ・コンストラクター」の設計思想を伝授する。
—
1. 物理構造の抽象化:JSONスキーマの設計
JSONへのシリアライゼーションにおいて、最も陥りやすい罠は「SolidWorksオブジェクトをそのままJSONに入れようとすること」だ。`IComponent2`や`IMateFeature`は、VBAのメモリ空間に居座る寄生体であり、そのままでは直列化できない。
必要なのは、以下の3層構造を持つDTO(Data Transfer Object)である。
- Node: コンポーネントのGUID(またはファイルパス)、変換行列(Transform)、相対パス。
- Constraint: 合致タイプ、対象エンティティの識別子(ID/Name)、オフセット値。
- Meta: BOM情報やカスタムプロパティ。
—
2. 実装の核心:再帰的トラバーサルによる抽出
アセンブリを走査する際、単なるループはメモリリークの温床となる。`IComponent2::GetChildren`を再帰的に呼び出す際は、必ずスコープ終了時に明示的な解放を行うこと。
以下のコードは、アセンブリの階層と行列情報を抽出するエンジンの心臓部だ。
‘ SolidWorksコンポーネントをJSON構造へ変換する中核ロジック
Public Sub ExportAssemblyStructure(comp As SldWorks.Component2, ByRef jsonBuilder As Object)
Dim children As Variant
Dim i As Long
‘ 座標変換行列(Transform)の取得
Dim transform As SldWorks.MathTransform
Set transform = comp.Transform2
‘ ここでJSONオブジェクトへデータをパッキングする(ScriptControlや自作クラスを使用)
‘ 注意:COMオブジェクトの参照は保持せず、値型(Double/String)に変換して保持すること
children = comp.GetChildren
If Not IsEmpty(children) Then
For i = LBound(children) To UBound(children)
ExportAssemblyStructure children(i), jsonBuilder
Next i
End If
‘ メモリ最適化:再帰のたびに不要なオブジェクト参照を破棄
Set transform = Nothing
End Sub
—
3. なぜ「合致(Mate)」の復元が困難なのか
合致の自動定義において、最大の障壁は「エンティティのID不変性」だ。SolidWorksの内部IDは、フィーチャーの順序変更や再構築で容易に変わる。
シニアエンジニアとして、私は以下の「属性タグ付け戦略」を推奨する。
1. タグ付け: コンポーネントを配置する際、`CustomProperty`または`Attribute`として一意のUUIDを書き込む。
2. エンティティ特定: 面やエッジに対しては、`GetEntityName`ではなく、ジオメトリの重心や法線ベクトルを算出し、誤差範囲内で特定するハッシュ関数を用いる。
3. JSON記述: `{“Type”: “Coincident”, “TargetA”: “UUID_001:Face_Top”, “TargetB”: “UUID_002:Face_Bottom”}` のように、UUIDベースで記述する。
—
4. 伝説的エンジニアの心得:メモリと安定性
VBA環境で巨大なアセンブリを扱うと、COMの解放漏れで`SldWorks.exe`が肥大化し、最終的にクラッシュする。以下の鉄則を守れ。
- `Nothing`の徹底: ループ内で生成した`MathUtility`や`MathTransform`は、必ずループの最後で`Set obj = Nothing`せよ。
- Windows APIの活用: `Sleep`関数等を用いて、SolidWorksの描画更新(Rebuild)を制御せよ。`swApp.DocumentVisible = False`でバックグラウンド処理を行うのは基本中の基本だ。
- JSONライブラリの選定: VBAでJSONを扱うなら、文字列連結ではなく、`ScriptControl`経由のJScript活用か、あるいはVBA専用の`VBA-JSON`ライブラリのソースを直接モジュールに組み込め。外部依存DLLを増やすのは、保守性の観点から「悪」だ。
—
結びに:CADは単なる「データの一形態」に過ぎない
アセンブリをJSONという汎用形式に昇華させることは、CADという閉じた世界を、真の「デジタルツイン」へと接続する第一歩だ。
WebアプリからJSONをPOSTし、SolidWorks側でそれを読み込み、`IMateController`や`IAssemblyDoc::AddComponent`を用いて自動構築する。このループが完成したとき、君たちの設計業務は「作業」から「データ定義」へと進化する。
これが、SolidWorks VBAを掌握した者にしか見えない景色だ。実装で詰まったら、自身のコードのメモリ配置と、エンティティ特定ロジックの「誤差」を疑え。CADは嘘をつかない。嘘をついているのは、常に人間の書いたロジックだ。
健闘を祈る。
