この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:1
ページ更新者:atom
更新日時:2026-06-29 12:05:01

タイトル: Speckleオブジェクトモデル
SEOタイトル: Speckleオブジェクトモデル|Base・動的プロパティ・detach・ハッシュと重複排除

この記事の要点
  • Speckle のデータはすべて Base オブジェクトを基底とした構造化データである
  • Base は動的にプロパティを追加でき、型は speckle_type で識別される
  • 大きな子要素は detach(分離)して別オブジェクトとして保存し、参照でつなぐ
  • 各オブジェクトは内容から決まるハッシュ(id)を持ち、同一内容は重複排除される
  • このモデルにより、Revit のファミリなどツール固有の要素を共通形式で表現できる

この記事は Speckle が扱うデータの中身、すなわちオブジェクトモデルを解説します。アーキテクチャ でいう「Version が指すオブジェクトツリー」の中身にあたります。

Base オブジェクト

Speckle のデータモデルの基底は Base というオブジェクトです。点・線・壁・部屋・パラメータの集合など、Speckle が扱うあらゆるデータは Base を継承(あるいは Base そのもの)として表現されます。SDK 上では Base クラスのインスタンスとして生成・操作します。

Base は「プロパティの入れ物」であり、子に別の Base を持たせることでツリー状にデータを組み立てられます。ルートとなる Base から子要素へとたどることで、モデル全体が表現されます。

動的プロパティと speckle_type

Base の特徴は、あらかじめ決められた固定のフィールドだけでなく、動的にプロパティを追加できる点です。たとえば壁オブジェクトに「材質」「高さ」「Revit のパラメータ群」などを自由に持たせられます。

各オブジェクトには speckle_type というプロパティがあり、これがそのオブジェクトの種類を表す識別子になります。たとえば幾何の点や線、あるいは各コネクタが定義する要素型などが、この speckle_type で区別されます。受け取る側は speckle_type を手がかりに、適切なネイティブ要素へ変換します。

概念意味
Baseすべてのオブジェクトの基底クラス
動的プロパティ実行時に自由に追加できる属性
speckle_typeオブジェクトの種類を表す型識別子
id内容から計算されるハッシュ(一意な指紋)

detach(分離)と参照

1つのモデルには大量の要素が含まれます。これを1つの巨大なオブジェクトとして丸ごと保存すると、少し変えただけでも全体を再保存することになり非効率です。そこで Speckle は detach(デタッチ=分離) という仕組みを持ちます。

  • 大きな子要素や繰り返し使われる要素を、親オブジェクトの中に埋め込むのではなく、独立したオブジェクトとして別保存します。
  • 親は、その子を「参照(id を指すポインタ)」として持ちます。
  • これにより、変わっていない部分は再保存されず、変わった部分のオブジェクトだけが新規に保存されます。

SDK では、プロパティ名の付け方や属性指定によって detach するかどうかを制御できます。大量要素を扱う実装では、適切に detach することで転送量とストレージを節約できます。

ハッシュとデータ重複排除

各オブジェクトの id は、そのオブジェクトの内容から計算されるハッシュです。内容が同じであれば同じ id になり、内容が変われば別の id になります。Git のオブジェクトが内容ハッシュで管理されるのと同じ発想です。

この性質により、データの重複排除(dedup) が自然に行えます。たとえば100個の同じ建具を送っても、内容が同一なら実体は1つだけ保存され、それを100箇所から参照する形になります。バージョンを重ねても、変わっていないオブジェクトは再送・再保存されないため、ストレージと転送が効率化されます。これが アーキテクチャ で触れたバージョン管理の効率の裏側にあります。

シリアライズ

Base オブジェクトのツリーは、保存・転送のために シリアライズ(直列化)されます。Speckle ではオブジェクトツリーを分解し、各オブジェクトをハッシュ付きの単位に変換してサーバへ送ります。受け取り側は、ルートの id から参照をたどって子オブジェクトを取得し、ツリーを復元(デシリアライズ)します。

この「分解して送り、参照でつなぎ直す」仕組みが、detach・ハッシュ・重複排除と組み合わさることで、大規模モデルを効率よく扱えるようになっています。

ツール固有要素とのマッピング概念

各ツールには固有の要素概念があります。たとえば Revit には ファミリ(部材の型と実体)という独自の仕組みがあります。コネクタは、こうしたツール固有の要素を Base オブジェクトへ変換し、speckle_type と動的プロパティに情報を載せます。

  • Revit のファミリインスタンスは、形状(ジオメトリ)と多数のパラメータを持つ Base オブジェクトとして表現されます。
  • パラメータ(寸法・材質・分類など)は動的プロパティとして保持されます。
  • 受け取る側のツールに同じ概念がなければ、形状とメタデータとして可能な範囲で再現されます。

つまり Speckle のオブジェクトモデルは、特定ツールに依存しない「最大公約数的な構造化データ」を目指したものです。だからこそ コネクタ ごとに、ネイティブ要素と Base の間でどうマッピングするかが重要になります。次は実際の接続役である コネクタ を見ていきましょう。