case study

Deck-Leg As-Built QA

Reality CapturePoint CloudDimensional ControlR / QuartoPlotly

When an offshore structure is fabricated, the as-built geometry never matches the drawing exactly. This tool turns laser-scan points into an answer: where is each deck leg really, how does that compare to where it was designed to be, and is the difference within tolerance? Drag the model below to rotate it — orange is as-built, blue dashed is as-designed.

Dimensional check vs. design

Leg elevation (Z) summary

Synthetic demonstration data — the coordinates are fabricated and represent no real platform or client. The method is exactly what runs on real surveys.

What it does

On a real job, a terrestrial laser scanner captures millions of points across a platform. To locate a single deck leg I sample several points around its base, then reduce them to the numbers a fabricator actually needs:

How it's built

The production tool is a Quarto document in R: scan coordinates go in, a few small functions compute the elevation statistics and 3D distances, and Plotly renders an interactive 3D model the team can spin around. Because it regenerates from the data, re-running it on an updated scan reproduces the whole report instantly — the same reproducible-deliverable philosophy behind my nozzle QA and regression work. The 3D model above is the genuine article: R's plotly package renders by bundling Plotly.js, so the viewer here uses that same engine and trace structure — it loads on click to keep the page fast.

The heart of it is small enough to read. Each leg's scan points get reduced to a recommended elevation, and a plain Euclidean helper handles the leg-to-leg distances:

R — deck-leg elevation & distance
# For each deck leg, reduce its cluster of scan points
# to the numbers a fabricator actually needs.
calculate_deckleg_z <- function(points_matrix, leg_name = "Deck Leg") {
  z_coords <- points_matrix[, 3]        # Z is the 3rd column (feet)

  z_min <- min(z_coords)
  z_max <- max(z_coords)
  z_avg <- mean(z_coords)               # recommended set-out elevation

  invisible(list(
    z_min_ft = z_min, z_max_ft = z_max, z_avg_ft = z_avg,
    z_min_in = z_min * 12,               # also report in inches
    z_avg_in = z_avg * 12
  ))
}

# 3D distance between two leg coordinates, used for the
# as-built vs. as-designed dimensional checks.
calc_distance <- function(p1, p2) {
  sqrt(sum((p1 - p2)^2))
}

Excerpt from the production Quarto document (the interactive table above runs the same logic in JavaScript).

← Back to projects