> ## Documentation Index
> Fetch the complete documentation index at: https://docs.speckle.systems/llms.txt
> Use this file to discover all available pages before exploring further.

# Compare parametric design options from Grasshopper

> Mark Data Objects as design options, attach numeric properties, publish to Speckle, and explore all variants side-by-side in a dashboard with 3D views and a parallel coordinates chart.

Use this guide when a Grasshopper script produces multiple versions of the same design — different heights, configurations, densities, or any other parameter — and each version has numeric properties you want to compare. It covers marking Data Objects as design options, structuring metrics, publishing to Speckle, and reading results in a dashboard.

<Note>
  This guide assumes familiarity with the **Data Object** and **Send** components in Grasshopper. If
  you are new to Speckle in Grasshopper, start with the [Grasshopper
  connector](/connectors/grasshopper/grasshopper) and [Data
  Objects](/connectors/grasshopper/grasshopper-objects) guides.
</Note>

## Tag design options in Grasshopper

<Steps>
  <Step title="Create a Data Object for each design variant">
    Use a **Data Object** component for each variant. Connect the variant's geometry to the **Geometries** input and set a descriptive **Name** (e.g. `"Option A"`, `"Variant · H2.0 · N4"`).

    Each variant appears as a named object on the canvas.
  </Step>

  <Step title="Mark the Data Object as a design option">
    Right-click the **Data Object** component and select **Mark as Design Option**.

    The component displays a **Design Option** label to confirm it is enabled.

    <Note>
      This sets the `isDesignOption` flag on the object automatically. Data Objects without this flag are ignored by the widget.
    </Note>

    <Frame>
      <img src="https://mintcdn.com/speckle/BGTO1TERQpivDJUd/images/workflows/design-explorer-mark-as-design-option.png?fit=max&auto=format&n=BGTO1TERQpivDJUd&q=85&s=86a5c8456b043a8050415f55c5b4ee78" alt="Grasshopper Data Object component right-click menu showing Mark as Design Option" width="1620" height="540" data-path="images/workflows/design-explorer-mark-as-design-option.png" />
    </Frame>
  </Step>

  <Step title="Add numeric properties as performance metrics">
    In the **Properties** input, add numeric values that describe each variant's performance or characteristics. Properties shared across **all** design option objects become the chart axes — any property present on some options but not others is excluded from the parallel coordinates chart.

    Group related values under a parent key. The widget flattens nested properties using `::` as a separator and uses the last segment as the axis label.

    For example, this structure:

    ```
    cost
      material: 42000
      fabrication: 8500
    performance
      score: 87
      efficiency: 0.74
    geometry
      height_m: 2.0
      panel_count: 4
    ```

    produces chart axes labelled **material**, **fabrication**, **score**, **efficiency**, **height\_m**, and **panel\_count**. Keep leaf names short — they appear as axis labels and in the properties panel.

    The component preview shows all property keys and values alongside the Design Option label.
  </Step>
</Steps>

## Publish to Speckle

<Steps>
  <Step title="Connect the list to a Send component">
    Connect the merged list to a **Send** component. Set the project and a model name that reflects the study (e.g. `facade-study`, `tower-options`).

    The Send component preview shows the correct object count.
  </Step>

  <Step title="Publish and verify">
    Click **Publish**. Open the model in the Speckle web viewer and confirm each variant appears as a separate selectable object with its properties visible in the properties panel.

    All variants are published and ready to connect to a dashboard.
  </Step>
</Steps>

## Add the widget to a dashboard

<Steps>
  <Step title="Open or create a dashboard">
    From your Speckle workspace, open **Intelligence** and create a new dashboard, or open an existing one in edit mode.

    The dashboard editor opens with the widget panel visible on the left.
  </Step>

  <Step title="Drag a Design Explorer widget onto the canvas">
    In the widget panel, open the **Grasshopper** group and drag a **Design Explorer** widget onto the canvas.

    An empty Design Explorer widget appears on the canvas.
  </Step>

  <Step title="Connect to your Grasshopper model">
    Click the widget to open its sidebar. Under **Data sources**, click **Add data source** and select the project and model you published to.

    The widget loads and displays a thumbnail card for each design option.
  </Step>
</Steps>

## Read the results

The widget shows three views simultaneously.

### Parallel coordinates chart

One line per option runs across all metric axes. Hover a line to highlight the matching tile in the grid. Click a line to open that option in detail view. The chart makes trade-offs visible: options that score well on one axis often score worse on another.

### Grid

The grid shows a thumbnail card for each option. Thumbnails are captured automatically from the live 3D model — no screenshots needed. Use the **Sort by** dropdown to rank cards by any metric.

<Frame>
  <img src="https://mintcdn.com/speckle/BGTO1TERQpivDJUd/images/workflows/design-explorer-grid-view.png?fit=max&auto=format&n=BGTO1TERQpivDJUd&q=85&s=d64e1cdebad4409c42b6036f9d6a70cf" alt="Design Explorer grid view showing thumbnail cards with rank badges and sort dropdown" width="1620" height="1080" data-path="images/workflows/design-explorer-grid-view.png" />
</Frame>

### Detail view

Click any tile or chart line to open detail view for that option:

* **Properties panel** (left): all metrics as key-value pairs
* **3D viewer** (centre): the selected option's geometry in isolation, with fit-to-view and orthographic toggle
* **Filmstrip** (right): the full ranked list for switching between options without returning to the grid

Click the option name in the header bar to return to the grid.

<Frame>
  <img src="https://mintcdn.com/speckle/BGTO1TERQpivDJUd/images/workflows/design-explorer-detail-view.png?fit=max&auto=format&n=BGTO1TERQpivDJUd&q=85&s=d06637b816d33eea4ee1163f987ab0d1" alt="Design Explorer detail view with properties panel, 3D viewer, and options list" width="1620" height="1080" data-path="images/workflows/design-explorer-detail-view.png" />
</Frame>

<Tip>
  In detail view, the divider between the 3D viewer and the options list is draggable. Drag it to
  give more space to whichever panel you need.
</Tip>

## FAQ

<AccordionGroup>
  <Accordion title="Why does the widget say 'Design Explorer requires a Grasshopper data source'?">
    The widget checks the source application of the connected model and expects Grasshopper.
    Re-publish the model from Grasshopper, or connect a data source that was. If you are producing
    design options from somewhere else, see [Under the hood](#under-the-hood).
  </Accordion>

  <Accordion title="Why does the widget say 'No design options found'?">
    Check that each Data Object has been marked as a design option via the right-click menu (**Mark
    as Design Option**). Also confirm the objects are at the top level of the model, not nested
    inside Collections.
  </Accordion>

  <Accordion title="Why are some of my properties missing from the chart?">
    Only properties that are present on **all** design option objects appear as chart axes. If a
    property is missing on even one object, it is excluded. Check that every Data Object has the
    same set of numeric property keys.
  </Accordion>

  <Accordion title="What happens to thumbnails when I reload the page?">
    Thumbnails are recaptured from the live model on each load. They are not stored between
    sessions. Cards are interactive immediately; thumbnails fill in progressively in the background.
  </Accordion>
</AccordionGroup>

## Under the hood

<AccordionGroup>
  <Accordion title="What does 'Mark as Design Option' actually do?">
    Nothing exotic — it writes a property. The menu item sets a boolean at the dotted path
    `DesignOption.isDesignOption` on the Data Object, which lands on the wire as:

    ```json theme={null}
    "properties": {
      "DesignOption": { "isDesignOption": true },
      "cost": { "material": 42000 }
    }
    ```

    The marker is excluded from the metrics, so it never appears as a chart axis.

    See [`SpeckleDataObjectPassthrough.cs#L208-L213`](https://github.com/specklesystems/speckle-sharp-connectors/blob/dd065202c03a1bade2c720cce1943172389397a6/Connectors/Rhino/Speckle.Connectors.GrasshopperShared/Components/Objects/SpeckleDataObjectPassthrough.cs#L208-L213) (pinned at `dd06520`).
  </Accordion>

  <Accordion title="Can I produce design options from Python or another connector?">
    Not officially — but nothing about the marker is Grasshopper-specific, and the only thing
    stopping you is a source-application check on the widget.

    Build the Data Objects with the marker in their properties, then set the version's
    source application so the widget accepts the model:

    ```python theme={null}
    from specklepy.objects.data import DataObject
    from specklepy.core.api.inputs.version_inputs import CreateVersionInput

    element = DataObject(
        name="Option A",
        properties={
            "DesignOption": {"isDesignOption": True},
            "cost": {"material": 42000},
        },
        displayValue=[geometry],
    )

    version_input = CreateVersionInput(
        project_id=project.id,
        model_id=model_id,
        object_id=object_id,
        message="Design study",
    )
    version_input.source_application = "grasshopper"
    ```

    Two things to watch that the Grasshopper component handles for you:

    * The widget isolates the marked object itself, not its children. All geometry for a variant
      must sit on that object's `displayValue`.
    * Every marked object needs the same numeric property keys, or the odd ones out are dropped
      from the chart.

    <Warning>
      This is unsupported and misreports how the version was produced. It works, but treat it as a
      hack rather than an integration: the source-application check may be relaxed or replaced, and
      this workaround will not be preserved deliberately. If you are relying on it, say so on the
      [forum](https://speckle.community) — a real use case is what would justify supporting design
      options outside Grasshopper properly.
    </Warning>
  </Accordion>
</AccordionGroup>

## See also

* [Grasshopper connector](/connectors/grasshopper/grasshopper)
* [Data Objects in Grasshopper](/connectors/grasshopper/grasshopper-objects)
* [Intelligence Dashboards](/analytics/intelligence-dashboards)
