Core Data Model Invariants
Object Structure
Every Speckle object has:id(string, hash-based, immutable)speckle_type(string, type identifier)applicationId(string, source application identifier)units(string, unit system)
DataObject Structure
Geometry Storage
- Rule: All DataObject geometry is in
displayValuearray - Never: Geometry as direct properties of DataObject
- Always:
displayValueis an array (may be empty)
Proxy Structure
- Location: Proxies are at Root Collection level
- References: Use
applicationId, neverid - Resolution: Find proxy by
applicationId, checkreferencedIdsarray
Global Rules
- No nested DataObjects - DataObjects cannot contain other DataObjects
- Geometry in displayValue - All visual geometry is in
displayValue - Proxies at root - All proxies stored in Root Collection
- References use applicationId - Proxies reference by
applicationId - Hierarchy is Speckle-imposed - Collection structure created by connectors
Connector Patterns
BIM Connectors (Revit, ArchiCAD, Tekla, ETABS)
- Extend DataObject with connector-specific fields
- Organize by spatial hierarchy (Levels/Floors)
- Rich properties (parameters, quantities)
- Use Level proxies
CAD Connectors (Rhino, AutoCAD, Civil 3D)
- Support standalone geometry objects
- Organize by layers
- Use Instance/Definition pattern
- Include Color proxies
Common Proxy Types
RenderMaterial- Material assignmentsLevel- Level/floor associationsGroup- Group membershipsDefinition- Block/component definitionsColor- Color assignments (CAD)Section- Structural sections (ETABS)Material- Material definitions (ETABS)
Traversal Patterns
Pattern: Find All DataObjects
Pattern: Resolve Proxy References
Pattern: Extract Geometry
Type Detection
Check Object Type
Connector Detection
Property Access Patterns
Nested Property Access
Safe Attribute Access
Common Mistakes to Avoid
- Assuming displayValue exists - Always check
hasattr()and non-empty - Using id instead of applicationId - Proxies use
applicationId - Not recursing collections - Collections can be nested
- Ignoring units - Always check
unitsfield - Hardcoding connector types - Use
speckle_typedetection
Quick Reference
| Task | Pattern |
|---|---|
| Find all objects | Traverse collections, check speckle_type |
| Get geometry | Check displayValue array |
| Resolve material | Find RenderMaterial proxy, check referencedIds |
| Find by property | Traverse objects, access nested properties |
| Resolve instance | Find Definition proxy by definitionId, get value.displayValue |
| Get model info | Check Root Collection info field |
Data Model Quick Reference
DataObject Fields
id,speckle_type,applicationId(required)name,properties,displayValue,units(DataObject)- Connector-specific fields (varies)
Geometry Objects
id,speckle_type,units(required)- Geometry-specific fields (varies by type)
Proxy Objects
speckle_type,applicationId,name(required)value(resource data)referencedIds(array ofapplicationIdstrings)
Collection Objects
speckle_type= “Objects.Organization.Collection”elements(array of objects and collections)name(optional)
Related Documentation
- Object Schema - Detailed data model
- Connector Index - Connector details