【テクニカル・上級編】【上級プロ】アセンブリ構造のJSONシリアライゼーション:ツリー階層・合致・座標データを完全なJSONテキストとして書き出し・復元する独自エンジン – SolidWorks VBA解析バイブル

スポンサーリンク

アセンブリ構造の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は嘘をつかない。嘘をついているのは、常に人間の書いたロジックだ。

健闘を祈る。

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