Skip to main content

Overview

When receiving data from BIM authoring tools (Revit, Rhino, ArchiCAD, etc.) via Speckle Connectors, you encounter rich, deeply nested structures with application-specific semantics.
Prerequisites: This guide builds on traversal techniques. If you’re new to navigating Speckle object graphs, start with Traversing Objects to learn the foundational patterns used throughout this guide.
In Object Model v3, the Python SDK provides:
  • Generic container objects: DataObject, BlenderObject, QgisObject
  • Geometry primitives: Mesh, Point, Line, etc.
  • Organizational proxies: LevelProxy, GroupProxy, ColorProxy
BIM semantics come from the properties dictionary on these objects, not from typed classes.

Characteristics of BIM Data

Deep Nesting: BIM data often has nested structures with properties and sub-objects:
Understanding v3 Object Types: In v3, there are no typed BIM classes like Wall or Column. Everything is a generic container:
Check properties, not types:
Reference-Based Architecture: Large nested objects are stored separately:

Pattern 1: Revit Parameters

Revit objects have rich parameter collections organized by category. Understanding Revit Parameter Structure:
Extracting Revit Parameters:
Filtering by Parameter Value:
Converting Parameters to DataFrame:
Extracting All Display Geometry:
Finding Atomic Displayable Objects: Extract all objects with displayValue - these are the atomic, viewer-selectable BIM elements:
Computing Bounding Box from Display:

Pattern 3: EncodedValue (Rhino-Specific)

Rhino objects may include native binary data for Rhino-to-Rhino workflows. Understanding EncodedValue:
Checking for EncodedValue:
encodedValue is primarily for Rhino-to-Rhino workflows. For other platforms, use displayValue instead.

Pattern 4: Instance and Definition

Complex models use instance/definition patterns for efficiency (like Revit families or Rhino blocks).
Instance Definitions Location: Instance definitions are stored in the instanceDefinitionProxies collection on the root object, not nested in the hierarchy. You need to build an applicationId index to resolve instance references, similar to how level proxies work (see Pattern 5).
Understanding Instances: Instance objects reference their definition by applicationId:
Extracting Instances and Definitions:

Pattern 5: Level and Location Data with Proxy Collections

BIM models use proxy collections at the root level to organize objects by levels, colors, groups, and materials. Understanding this pattern is essential for working with BIM hierarchies. Key Insight: Proxies enable multiple overlapping organizational hierarchies. A single wall can simultaneously belong to:
  • A building level (architectural hierarchy)
  • A functional group (organizational grouping)
  • A layer (CAD hierarchy)
  • A material assignment (material hierarchy)
  • An instance type (blocks/families)
This models real-world CAD/BIM organization where groups, layers, levels, and blocks all coexist without forcing objects into a single parent-child hierarchy.
See Also: For a comprehensive explanation of proxification, why overlapping hierarchies matter, and intersection queries across multiple organizational systems, see Proxification.
The Proxy Pattern Workflow:
  1. Proxies live at root level - Look for levelProxies, colorProxies, etc. on the root object
  2. Proxies contain applicationId lists - Each proxy has an objects array of applicationId strings
  3. Build an applicationId index - Map applicationIds to actual objects in the elements[] hierarchy
  4. Resolve references - Match proxy applicationIds against your index to find actual objects
  5. Reverse lookup for object level - To find an object’s level, search which proxy’s list contains its applicationId
This is a two-step lookup process, not direct nesting!
Understanding Proxy Collections: Proxy collections are stored as properties at the root object level:
  • levelProxies - Building levels/storeys organization
  • colorProxies - Color-based grouping
  • groupProxies - Named groups
  • renderMaterialProxies - Material assignments
  • instanceDefinitionProxies - Instance/definition relationships
Key Concept: These are reference collections, not nested hierarchies. They contain lists of applicationId strings that point to objects in the elements[] hierarchy. LevelProxy Structure:
Finding LevelProxy Collections at Root:
Resolving Objects by applicationId: The challenge: LevelProxy contains applicationId strings, but you need to find the actual objects in the elements[] hierarchy.
Grouping Objects by Level: Combine proxy collections with applicationId index to organize objects:
Complete Proxy Pattern Helper: A comprehensive helper for working with all proxy types:
Finding an Object’s Level: To find which level an object belongs to, you need to reverse lookup from the proxy collections:

Pattern 6: Material Quantities

Revit objects can contain detailed material quantity takeoffs stored in properties["Material Quantities"]. These quantities exist only on individual objects - there is no pre-aggregated total at the model level. To get project-wide material totals, you need to traverse all objects and aggregate their material quantities. Understanding Material Quantities: Each object with materials contains a Material Quantities dictionary with material breakdowns:
Extracting Material Quantities from Individual Objects:
Aggregating Model-Wide Material Totals: To get total material quantities across the entire model version, traverse all objects and aggregate:
Converting to DataFrame for Analysis:

Complete Example: BIM Building Analysis

Best Practices

Always check if properties exist before accessing:
Parameters can be dict or Base objects:
Don’t rely on encodedValue for cross-platform work:
Don’t re-extract parameters repeatedly:

Summary

Complex BIM data requires:
  • Defensive coding - Check before accessing
  • Parameter extraction - Understand the nested structure
  • DisplayValue usage - For cross-platform visualization
  • Traversal patterns - Find objects in deep hierarchies
  • Level awareness - Group by building levels
  • Instance handling - Understand instance/definition patterns
These patterns work across Revit, Rhino, ArchiCAD, and other BIM tools.

Next Steps

Display Values

Deep dive into display values and cross-platform visualization

Extracting Display Values

How to extract geometry from proxified display values and instances

Data Traversal

Advanced traversal techniques for any structure

Simple Data Patterns

Working with simpler data structures
Last modified on July 18, 2026