Skip to content

speckle-impl-rhino-grasshopper

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.

speckledata-exchange
Compatible agents:
  • Claude Code

View on GitHubmaster @ 2b2e72f14 GitHub stars1 forksupdated Mar 31, 2026

Original description (for the agent)

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.

speckle-impl-rhino-grasshopper

Quick Reference

Platform Requirements

RequirementValue
Rhino versions7, 8 (8.9+ recommended)
OSWindows only
Connector bundleRhino + Grasshopper (single installer)
AuthenticationVia Speckle Desktop Service

Rhino Data Schema

code
File > Layer > Sublayer > Objects

Object Types in Rhino

TypeDescriptionSpeckle Mapping
Geometry ObjectsPoint, Line, Mesh, Brep — standalone primitivesGeometry Objects (no properties, no displayValue)
Block InstancesReferences to block definitions with transformInstance Objects (definitionId + 4x4 transform)
Data ObjectsObjects with attached user dataDataObject (properties + displayValue)

Proxy Types Used by Rhino

ProxyPurpose
RenderMaterialColor (RGB), opacity, metallic, roughness
ColorHex color assignments (#RRGGBB)
GroupFunctional grouping of objects
DefinitionBlock 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 TypeDetails
GeometryAll visible geometry types (Point, Line, Curve, Mesh, Brep, Surface, Extrusion)
HatchesPattern fills
TextText objects and annotations
BlocksBlock definitions and instances
User stringsCustom key-value properties attached to objects
Named viewsPerspective views only (parallel projections excluded)
LayersFull layer hierarchy preserved as Collections

Each published object includes: name, color, render material, and user strings.

Publishing Settings

SettingEffect
Layer filterPublish only objects on selected layers
Visualization propertiesInclude vertex normals, colors, texture coordinates (increases file size)

Loading into Rhino

DataBehavior
GeometryLoads as native Rhino geometry (Point, Curve, Mesh, Brep)
TextLoads as text objects
BlocksLoads as block definitions + instances
Render materialsPreserved and applied
ColorsPreserved and applied
NamesPreserved as object names
Custom propertiesLoaded as user strings
Named viewsCreated automatically (NEVER overwrites existing views with same name)

User Strings Round-Trip

User strings are the mechanism for custom property transfer in Rhino:

  1. Publish: User strings attached to Rhino objects appear in properties on the Speckle server.
  2. 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

ComponentPurposeNotes
Sign-InAccount authenticationRequired before any publish/load
Speckle Model URLProject/model selectionRight-click to switch accounts

Publishing Workflow

ComponentPurposeNotes
Create CollectionOrganize objects into hierarchical collectionsMaps to Rhino layers. Supports nesting via TAB+pipe. Empty inputs excluded automatically.
PublishSend Collection + Model URL to serverRequires a Collection and a Model URL input
Create PropertiesCreate key-value property dictionariesSupports: strings, numbers, booleans, vectors, planes, lists, nested properties
Speckle Properties PassthroughAlternative property creationThree modes: Merge (default), Remove, Replace

Loading Workflow

ComponentPurposeNotes
LoadFetch model from serverLatest version by default, or specific version
Query ObjectsRetrieve flattened list of all objectsExpandable outputs filter by geometry type
Collection SelectorDisplay full sub-collection pathsSearch patterns: ? (single char), < (starts with), > (ends with), ; (multiple patterns)
Expand CollectionTraverse hierarchy one level at a timeUse iteratively for deep hierarchies
DeconstructAccess individual object fieldsReturns field names, values, and types

Object Manipulation

ComponentPurposeNotes
Speckle Geometry PassthroughAdd metadata to geometryAccepts native GH geometry or existing Speckle Geometry. Adds: Name, Properties, Color, Material
Block Definition PassthroughCreate block definitionsInput: geometry list. Output: reusable definition
Block Instance PassthroughCreate block instancesInput: definition + transform matrix
Data Object PassthroughCreate Data ObjectsInput: geometry list + properties dictionary
Filter ObjectsFilter loaded objectsFilter 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:

code
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:

code
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

  1. Block definitions are stored as Definition proxies at the root Collection level
  2. Each block instance becomes an Instance Object with definitionId + 4x4 transform matrix
  3. The definition geometry is stored once; instances reference it (deduplication)

Creating Blocks in Grasshopper

code
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

  1. Create objects once and publish
  2. Load the published model back into Grasshopper
  3. Use passthrough nodes to mutate the loaded objects (preserves applicationId)
  4. 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:

  1. Create initial geometry and properties
  2. Publish to Speckle
  3. Load the published version back
  4. Use passthrough nodes for ALL subsequent modifications
  5. 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

Official Sources