Viewer & analysis

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.

@speckle/viewer extensions in the scene view
  • 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.

Where the loading bar's range goes
  • 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

Interleaved events from both phasesReported fraction, clamped monotonic
The shares are 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.

Try it: property rules
  • Where
2 of 6records match. Total volume:1.1 12 ft³
Recordcategorylevelvolume
No match: Basic Wall 200mmWallsLevel 14.2 m³
No match: Basic Wall 300mmWallsLevel 26.9 m³
No match: Floor slabFloorsLevel 218.5 m³
Matches: Concrete columnColumnsLevel 11.1 m³
Matches: Steel column, importedColumnsLevel 212 ft³
No match: Single doorDoorsLevel 1missing
Sample data, not a real model. Rules combine with AND, and a rule without a usable value is ignored until it has one.

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.