speckle-impl-rhino-grasshopper
Quick Reference
Platform Requirements
| Requirement |
Value |
| Rhino versions |
7, 8 (8.9+ recommended) |
| OS |
Windows only |
| Connector bundle |
Rhino + Grasshopper (single installer) |
| Authentication |
Via Speckle Desktop Service |
Rhino Data Schema
File > Layer > Sublayer > Objects
Object Types in Rhino
| Type |
Description |
Speckle Mapping |
| Geometry Objects |
Point, Line, Mesh, Brep — standalone primitives |
Geometry Objects (no properties, no displayValue) |
| Block Instances |
References to block definitions with transform |
Instance Objects (definitionId + 4x4 transform) |
| Data Objects |
Objects with attached user data |
DataObject (properties + displayValue) |
Proxy Types Used by Rhino
| Proxy |
Purpose |
| RenderMaterial |
Color (RGB), opacity, metallic, roughness |
| Color |
Hex color assignments (#RRGGBB) |
| Group |
Functional grouping of objects |
| Definition |
Block geometry stored once, reused by instances |
Critical Warnings
NEVER attempt to create native BIM elements (Revit walls, beams, columns) from Grasshopper. Grasshopper can ONLY create Geometry Objects, Block Objects, and Data Objects. When loaded into Revit, these ALWAYS become Direct Shapes.
NEVER expect parallel projection views to publish. Rhino and Grasshopper ONLY publish perspective named views. Parallel projections are silently excluded.
NEVER rely on Grasshopper parameter GUIDs for change tracking. Grasshopper generates new GUIDs on every solve cycle, breaking Speckle's change tracking. ALWAYS use passthrough nodes to mutate existing loaded objects.
ALWAYS use Rhino 8.9+ when working with Rhino 8. Earlier 8.x versions have known framework issues with the Speckle connector.
Rhino Connector
Publishing from Rhino
The Rhino connector publishes the following content:
| Content Type |
Details |
| Geometry |
All visible geometry types (Point, Line, Curve, Mesh, Brep, Surface, Extrusion) |
| Hatches |
Pattern fills |
| Text |
Text objects and annotations |
| Blocks |
Block definitions and instances |
| User strings |
Custom key-value properties attached to objects |
| Named views |
Perspective views only (parallel projections excluded) |
| Layers |
Full layer hierarchy preserved as Collections |
Each published object includes: name, color, render material, and user strings.
Publishing Settings
| Setting |
Effect |
| Layer filter |
Publish only objects on selected layers |
| Visualization properties |
Include vertex normals, colors, texture coordinates (increases file size) |
Loading into Rhino
| Data |
Behavior |
| Geometry |
Loads as native Rhino geometry (Point, Curve, Mesh, Brep) |
| Text |
Loads as text objects |
| Blocks |
Loads as block definitions + instances |
| Render materials |
Preserved and applied |
| Colors |
Preserved and applied |
| Names |
Preserved as object names |
| Custom properties |
Loaded as user strings |
| Named views |
Created automatically (NEVER overwrites existing views with same name) |
User Strings Round-Trip
User strings are the mechanism for custom property transfer in Rhino:
- Publish: User strings attached to Rhino objects appear in
properties on the Speckle server.
- Load: Properties from Speckle objects are written back as user strings on received Rhino geometry.
This round-trip works for Rhino-to-Rhino workflows. Properties from other connectors (Revit parameters, Tekla report data) also load as user strings in Rhino.
Grasshopper Connector
Component Inventory
Authentication and Configuration
| Component |
Purpose |
Notes |
| Sign-In |
Account authentication |
Required before any publish/load |
| Speckle Model URL |
Project/model selection |
Right-click to switch accounts |
Publishing Workflow
| Component |
Purpose |
Notes |
| Create Collection |
Organize objects into hierarchical collections |
Maps to Rhino layers. Supports nesting via TAB+pipe. Empty inputs excluded automatically. |
| Publish |
Send Collection + Model URL to server |
Requires a Collection and a Model URL input |
| Create Properties |
Create key-value property dictionaries |
Supports: strings, numbers, booleans, vectors, planes, lists, nested properties |
| Speckle Properties Passthrough |
Alternative property creation |
Three modes: Merge (default), Remove, Replace |
Loading Workflow
| Component |
Purpose |
Notes |
| Load |
Fetch model from server |
Latest version by default, or specific version |
| Query Objects |
Retrieve flattened list of all objects |
Expandable outputs filter by geometry type |
| Collection Selector |
Display full sub-collection paths |
Search patterns: ? (single char), < (starts with), > (ends with), ; (multiple patterns) |
| Expand Collection |
Traverse hierarchy one level at a time |
Use iteratively for deep hierarchies |
| Deconstruct |
Access individual object fields |
Returns field names, values, and types |
Object Manipulation
| Component |
Purpose |
Notes |
| Speckle Geometry Passthrough |
Add metadata to geometry |
Accepts native GH geometry or existing Speckle Geometry. Adds: Name, Properties, Color, Material |
| Block Definition Passthrough |
Create block definitions |
Input: geometry list. Output: reusable definition |
| Block Instance Passthrough |
Create block instances |
Input: definition + transform matrix |
| Data Object Passthrough |
Create Data Objects |
Input: geometry list + properties dictionary |
| Filter Objects |
Filter loaded objects |
Filter by: name, property keys, material name, Application ID, Speckle ID |
Three Object Types in Grasshopper
1. Geometry Objects
- Single selectable elements
- Cast native Grasshopper geometry directly (Point, Curve, Mesh, Brep, Surface)
- Baking preserves: layer path, name, color, material, properties as user strings
- Use Speckle Geometry Passthrough to attach metadata
2. Block Objects
- Definitions: Geometry collections created via Block Definition Passthrough
- Instances: Placement references created via Block Instance Passthrough (definition + transform)
- Mirror native Rhino block structure
- ALWAYS create the definition first, then create instances that reference it
3. Data Objects
- Groups of geometries with rich property dictionaries
- Used for BIM/structural/civil workflows received from Revit, Navisworks, IFC, Archicad, Civil 3D, Tekla, ETABS
- Cast to single geometry ONLY when containing exactly one piece of geometry
- NEVER cast a Data Object with multiple geometries to a single geometry — this silently drops geometry
Collection Nesting
Create nested collections using TAB+pipe naming:
Collection "Architecture"
├── Sub-collection "Walls" (name: "Architecture | Walls")
├── Sub-collection "Floors" (name: "Architecture | Floors")
└── Sub-collection "Roofs" (name: "Architecture | Roofs")
The pipe character (|) preceded by TAB creates hierarchy levels. ALWAYS use this pattern for organizing published data from Grasshopper.
Property Creation
Use Create Properties to build property dictionaries:
Key inputs: "height", "material", "load_bearing"
Value inputs: 3.5, "concrete", true
Supported value types: strings, numbers, booleans, vectors, planes, lists, nested property dictionaries.
ALWAYS attach properties via Create Properties or Speckle Properties Passthrough BEFORE publishing. Properties cannot be added after publish.
Block Handling
Publishing Blocks from Rhino
- Block definitions are stored as Definition proxies at the root Collection level
- Each block instance becomes an Instance Object with
definitionId + 4x4 transform matrix
- The definition geometry is stored once; instances reference it (deduplication)
Creating Blocks in Grasshopper
Step 1: Create geometry list → Block Definition Passthrough → definition
Step 2: definition + transform → Block Instance Passthrough → instance
Step 3: instance → Create Collection → Publish
Loading Blocks
- Blocks load as native Rhino block definitions + instances
- Nested blocks are supported (definitions referencing other definitions)
- Transform matrices are applied on load to position instances
Change Tracking in Grasshopper
The Problem
Grasshopper parameters generate new GUIDs on every solve cycle. Speckle uses applicationId for change tracking. New GUIDs mean Speckle treats every solve as entirely new objects — no updates, only additions.
The Solution
- Create objects once and publish
- Load the published model back into Grasshopper
- Use passthrough nodes to mutate the loaded objects (preserves
applicationId)
- Publish the mutated objects
This preserves applicationId across versions, enabling proper change tracking and version comparison.
For New Models
ALWAYS follow this sequence for models that will be updated over time:
- Create initial geometry and properties
- Publish to Speckle
- Load the published version back
- Use passthrough nodes for ALL subsequent modifications
- Re-publish
Reusable Components
Teams can create standardized User Objects (.ghuser files) with predefined:
- Naming conventions
- Property structures
- Collection hierarchies
- Publishing configurations
Distribute .ghuser files to team members for consistent project delivery across Grasshopper definitions.
Cross-Connector Behavior
Rhino to Revit
- Rhino geometry → Revit Direct Shapes (ALWAYS)
- User strings → NOT imported into Revit (Revit does not load custom properties)
- Blocks → Direct Shapes or Families (with "Receive Blocks as Families" setting in Revit)
- Named views → 3D views in Revit
Revit to Rhino
- RevitObjects → Geometry with properties as user strings
- Revit parameters → Rhino user strings (readable, editable)
- Material quantities → User string properties
- Level associations → User string properties
Grasshopper to Revit
- Geometry Objects → Direct Shapes
- Block Objects → Direct Shapes or Families
- Data Objects → Direct Shapes
- NEVER native BIM elements — this is a fundamental limitation
Reference Links
- references/methods.md — Grasshopper component signatures and Rhino connector API
- references/examples.md — Working workflow examples for publish, load, and round-trip
- references/anti-patterns.md — What NOT to do, with WHY explanations
Official Sources
1---2name: speckle-impl-rhino-grasshopper3description: Use when sending geometry from Rhino or Grasshopper to Speckle, or receiving Speckle data into Rhino. Prevents missing user strings on receive, broken block handling, and attempting to create native BIM objects from Grasshopper (which is impossible). Covers Rhino 7/8 connector (geometry, hatches, text, blocks, user strings, named views, layers), Grasshopper 15+ components (Sign-In, Publish, Load, Query, Filter, Create Collection/Properties/Data Object), 3 object types, and block handling. Keywords: speckle rhino, grasshopper, rhino connector, GH component, block, user strings, layers, publish, load, query, filter, send from Rhino, Grasshopper to Speckle.4license: MIT5---67# speckle-impl-rhino-grasshopper89## Quick Reference1011### Platform Requirements1213| Requirement | Value |14|-------------|-------|15| Rhino versions | 7, 8 (8.9+ recommended) |16| OS | Windows only |17| Connector bundle | Rhino + Grasshopper (single installer) |18| Authentication | Via Speckle Desktop Service |1920### Rhino Data Schema2122```23File > Layer > Sublayer > Objects24```2526### Object Types in Rhino2728| Type | Description | Speckle Mapping |29|------|-------------|-----------------|30| Geometry Objects | Point, Line, Mesh, Brep — standalone primitives | Geometry Objects (no `properties`, no `displayValue`) |31| Block Instances | References to block definitions with transform | Instance Objects (`definitionId` + 4x4 `transform`) |32| Data Objects | Objects with attached user data | DataObject (`properties` + `displayValue`) |3334### Proxy Types Used by Rhino3536| Proxy | Purpose |37|-------|---------|38| RenderMaterial | Color (RGB), opacity, metallic, roughness |39| Color | Hex color assignments (#RRGGBB) |40| Group | Functional grouping of objects |41| Definition | Block geometry stored once, reused by instances |4243### Critical Warnings4445**NEVER** attempt to create native BIM elements (Revit walls, beams, columns) from Grasshopper. Grasshopper can ONLY create Geometry Objects, Block Objects, and Data Objects. When loaded into Revit, these ALWAYS become Direct Shapes.4647**NEVER** expect parallel projection views to publish. Rhino and Grasshopper ONLY publish perspective named views. Parallel projections are silently excluded.4849**NEVER** rely on Grasshopper parameter GUIDs for change tracking. Grasshopper generates new GUIDs on every solve cycle, breaking Speckle's change tracking. ALWAYS use passthrough nodes to mutate existing loaded objects.5051**ALWAYS** use Rhino 8.9+ when working with Rhino 8. Earlier 8.x versions have known framework issues with the Speckle connector.5253---5455## Rhino Connector5657### Publishing from Rhino5859The Rhino connector publishes the following content:6061| Content Type | Details |62|--------------|---------|63| Geometry | All visible geometry types (Point, Line, Curve, Mesh, Brep, Surface, Extrusion) |64| Hatches | Pattern fills |65| Text | Text objects and annotations |66| Blocks | Block definitions and instances |67| User strings | Custom key-value properties attached to objects |68| Named views | Perspective views only (parallel projections excluded) |69| Layers | Full layer hierarchy preserved as Collections |7071Each published object includes: name, color, render material, and user strings.7273### Publishing Settings7475| Setting | Effect |76|---------|--------|77| Layer filter | Publish only objects on selected layers |78| Visualization properties | Include vertex normals, colors, texture coordinates (increases file size) |7980### Loading into Rhino8182| Data | Behavior |83|------|----------|84| Geometry | Loads as native Rhino geometry (Point, Curve, Mesh, Brep) |85| Text | Loads as text objects |86| Blocks | Loads as block definitions + instances |87| Render materials | Preserved and applied |88| Colors | Preserved and applied |89| Names | Preserved as object names |90| Custom properties | Loaded as user strings |91| Named views | Created automatically (NEVER overwrites existing views with same name) |9293### User Strings Round-Trip9495User strings are the mechanism for custom property transfer in Rhino:96971. **Publish**: User strings attached to Rhino objects appear in `properties` on the Speckle server.982. **Load**: Properties from Speckle objects are written back as user strings on received Rhino geometry.99100This round-trip works for Rhino-to-Rhino workflows. Properties from other connectors (Revit parameters, Tekla report data) also load as user strings in Rhino.101102---103104## Grasshopper Connector105106### Component Inventory107108#### Authentication and Configuration109110| Component | Purpose | Notes |111|-----------|---------|-------|112| **Sign-In** | Account authentication | Required before any publish/load |113| **Speckle Model URL** | Project/model selection | Right-click to switch accounts |114115#### Publishing Workflow116117| Component | Purpose | Notes |118|-----------|---------|-------|119| **Create Collection** | Organize objects into hierarchical collections | Maps to Rhino layers. Supports nesting via TAB+pipe. Empty inputs excluded automatically. |120| **Publish** | Send Collection + Model URL to server | Requires a Collection and a Model URL input |121| **Create Properties** | Create key-value property dictionaries | Supports: strings, numbers, booleans, vectors, planes, lists, nested properties |122| **Speckle Properties Passthrough** | Alternative property creation | Three modes: Merge (default), Remove, Replace |123124#### Loading Workflow125126| Component | Purpose | Notes |127|-----------|---------|-------|128| **Load** | Fetch model from server | Latest version by default, or specific version |129| **Query Objects** | Retrieve flattened list of all objects | Expandable outputs filter by geometry type |130| **Collection Selector** | Display full sub-collection paths | Search patterns: `?` (single char), `<` (starts with), `>` (ends with), `;` (multiple patterns) |131| **Expand Collection** | Traverse hierarchy one level at a time | Use iteratively for deep hierarchies |132| **Deconstruct** | Access individual object fields | Returns field names, values, and types |133134#### Object Manipulation135136| Component | Purpose | Notes |137|-----------|---------|-------|138| **Speckle Geometry Passthrough** | Add metadata to geometry | Accepts native GH geometry or existing Speckle Geometry. Adds: Name, Properties, Color, Material |139| **Block Definition Passthrough** | Create block definitions | Input: geometry list. Output: reusable definition |140| **Block Instance Passthrough** | Create block instances | Input: definition + transform matrix |141| **Data Object Passthrough** | Create Data Objects | Input: geometry list + properties dictionary |142| **Filter Objects** | Filter loaded objects | Filter by: name, property keys, material name, Application ID, Speckle ID |143144### Three Object Types in Grasshopper145146#### 1. Geometry Objects147148- Single selectable elements149- Cast native Grasshopper geometry directly (Point, Curve, Mesh, Brep, Surface)150- Baking preserves: layer path, name, color, material, properties as user strings151- Use **Speckle Geometry Passthrough** to attach metadata152153#### 2. Block Objects154155- **Definitions**: Geometry collections created via Block Definition Passthrough156- **Instances**: Placement references created via Block Instance Passthrough (definition + transform)157- Mirror native Rhino block structure158- ALWAYS create the definition first, then create instances that reference it159160#### 3. Data Objects161162- Groups of geometries with rich property dictionaries163- Used for BIM/structural/civil workflows received from Revit, Navisworks, IFC, Archicad, Civil 3D, Tekla, ETABS164- Cast to single geometry ONLY when containing exactly one piece of geometry165- NEVER cast a Data Object with multiple geometries to a single geometry — this silently drops geometry166167### Collection Nesting168169Create nested collections using TAB+pipe naming:170171```172Collection "Architecture"173 ├── Sub-collection "Walls" (name: "Architecture | Walls")174 ├── Sub-collection "Floors" (name: "Architecture | Floors")175 └── Sub-collection "Roofs" (name: "Architecture | Roofs")176```177178The pipe character (`|`) preceded by TAB creates hierarchy levels. ALWAYS use this pattern for organizing published data from Grasshopper.179180### Property Creation181182Use **Create Properties** to build property dictionaries:183184```185Key inputs: "height", "material", "load_bearing"186Value inputs: 3.5, "concrete", true187```188189Supported value types: strings, numbers, booleans, vectors, planes, lists, nested property dictionaries.190191ALWAYS attach properties via **Create Properties** or **Speckle Properties Passthrough** BEFORE publishing. Properties cannot be added after publish.192193---194195## Block Handling196197### Publishing Blocks from Rhino1981991. Block definitions are stored as **Definition proxies** at the root Collection level2002. Each block instance becomes an **Instance Object** with `definitionId` + 4x4 `transform` matrix2013. The definition geometry is stored once; instances reference it (deduplication)202203### Creating Blocks in Grasshopper204205```206Step 1: Create geometry list → Block Definition Passthrough → definition207Step 2: definition + transform → Block Instance Passthrough → instance208Step 3: instance → Create Collection → Publish209```210211### Loading Blocks212213- Blocks load as native Rhino block definitions + instances214- Nested blocks are supported (definitions referencing other definitions)215- Transform matrices are applied on load to position instances216217---218219## Change Tracking in Grasshopper220221### The Problem222223Grasshopper parameters generate new GUIDs on every solve cycle. Speckle uses `applicationId` for change tracking. New GUIDs mean Speckle treats every solve as entirely new objects — no updates, only additions.224225### The Solution2262271. Create objects once and publish2282. Load the published model back into Grasshopper2293. Use **passthrough nodes** to mutate the loaded objects (preserves `applicationId`)2304. Publish the mutated objects231232This preserves `applicationId` across versions, enabling proper change tracking and version comparison.233234### For New Models235236ALWAYS follow this sequence for models that will be updated over time:2372381. Create initial geometry and properties2392. Publish to Speckle2403. Load the published version back2414. Use passthrough nodes for ALL subsequent modifications2425. Re-publish243244---245246## Reusable Components247248Teams can create standardized **User Objects** (`.ghuser` files) with predefined:249- Naming conventions250- Property structures251- Collection hierarchies252- Publishing configurations253254Distribute `.ghuser` files to team members for consistent project delivery across Grasshopper definitions.255256---257258## Cross-Connector Behavior259260### Rhino to Revit261262- Rhino geometry → Revit Direct Shapes (ALWAYS)263- User strings → NOT imported into Revit (Revit does not load custom properties)264- Blocks → Direct Shapes or Families (with "Receive Blocks as Families" setting in Revit)265- Named views → 3D views in Revit266267### Revit to Rhino268269- RevitObjects → Geometry with properties as user strings270- Revit parameters → Rhino user strings (readable, editable)271- Material quantities → User string properties272- Level associations → User string properties273274### Grasshopper to Revit275276- Geometry Objects → Direct Shapes277- Block Objects → Direct Shapes or Families278- Data Objects → Direct Shapes279- NEVER native BIM elements — this is a fundamental limitation280281---282283## Reference Links284285- [references/methods.md](references/methods.md) — Grasshopper component signatures and Rhino connector API286- [references/examples.md](references/examples.md) — Working workflow examples for publish, load, and round-trip287- [references/anti-patterns.md](references/anti-patterns.md) — What NOT to do, with WHY explanations288289### Official Sources290291- https://docs.speckle.systems/connectors/rhino/rhino.md292- https://docs.speckle.systems/connectors/grasshopper/grasshopper.md293- https://docs.speckle.systems/connectors/grasshopper/grasshopper-objects.md294- https://docs.speckle.systems/connectors/grasshopper/grasshopper-collections.md295- https://docs.speckle.systems/connectors/grasshopper/grasshopper-properties.md296- https://docs.speckle.systems/connectors/grasshopper/grasshopper-recommendations.md297- https://docs.speckle.systems/developers/data-schema/connectors/rhino-schema.md