Viewer & analysis
The viewer
The scene view wraps @speckle/viewer and wires up its extensions: camera control, selection, section planes with outlines, measurements, filtering, explode, diff and view modes.
- CameraControllerOrbit and zoom, camera bookmarks, and the synchronised cameras of comparison mode.API reference
- SelectionExtensionPicking objects in the scene to inspect them.API reference
- SectionToolSection planes through the model.API reference
- SectionOutlinesOutlines where a section plane cuts geometry.API reference
- MeasurementsExtensionPoint-to-point, perpendicular, area and point measurements.API reference
- FilteringExtensionIsolating and colouring the records a property rule matches.API reference
- ExplodeExtensionPulling objects apart to see inside the model.No Speckle reference page
- DiffExtensionVisual differences between versions.API reference
- ViewModesRendered, solid, pen, arctic and shaded display, with edges as an option.API reference
Display modes map the toolbar's labels onto the current ViewModes API — rendered, rendered with edges, solid, pen, arctic and shaded. Edges are now an option on a mode rather than a separate pipeline, which is the kind of upstream change a thin wrapper has to absorb. Measurement supports point-to-point, perpendicular, area and point.
Loading progress
A small thing that took disproportionate care: the loading bar. Downloading objects is only the first half of the wait — the render tree is built afterwards, node by node, and takes comparable time. The bar splits its range between the two phases, roughly 55% for the download and 42% for the build, leaving the last sliver for the GPU upload, which reports nothing. Progress events from the two phases interleave, so the reported fraction is clamped monotonic: a progress bar must never run backwards.
- 55% Download objectsReported by the object loader
- 42% Build render treeNode by node, after the download
- 3% GPU uploadReports nothing, so its sliver is held back
A progress bar must never run backwards
DOWNLOAD_SHARE and BUILD_SHARE in components/viewer/load-object.ts.Comparing versions
Comparison mode puts two versions side by side and synchronises their cameras, with camera bookmarks for returning to a framing. It is Clone's take on what Speckle's own web app calls comparing versions.
Model intelligence
Rather than an inspector that shows one object at a time, model properties are treated as a dataset. You add rules — equals, contains, greater than, less than, missing — which combine with AND, and the matching records can be isolated in 3D, coloured by a property with a legend, paginated through as a table, or summed for a numeric property.
- Where
| Record | category | level | volume |
|---|---|---|---|
| No match: Basic Wall 200mm | Walls | Level 1 | 4.2 m³ |
| No match: Basic Wall 300mm | Walls | Level 2 | 6.9 m³ |
| No match: Floor slab | Floors | Level 2 | 18.5 m³ |
| Matches: Concrete column | Columns | Level 1 | 1.1 m³ |
| Matches: Steel column, imported | Columns | Level 2 | 12 ft³ |
| No match: Single door | Doors | Level 1 | missing |
Filtering runs against the normalised dataset cached in TanStack Query, keyed by user, project, model and version, so adding a rule costs no network requests. Isolating and colouring in the scene go through the viewer's FilteringExtension. Totals are separated by unit and never added across mismatched ones. Records with no renderable geometry can still be inspected, and legacy fallback records may include collections and other non-geometric objects — they are labelled records, not element counts.