0011 — Count symbols from the vector content, not from pixels

Status: Proposed · 2026-08-25

Context

Selecting a symbol once and counting every instance of it across a set is the largest single time saving available in a takeoff. It is the feature every competitor advertises, and the one an estimator asks for first: how many of these are there?

Every tool that offers it reaches for computer vision. Bluebeam's VisualSearch, and the AI symbol detection layered on it, work on the rendered page; the open-source projects in this space use YOLO. That is a reasonable choice if you treat a drawing as pixels.

We do not. The same instinct that reads the sheet register out of title blocks rather than filenames applies here: a construction PDF is usually vector, and the structure is right there.

What a repeated symbol actually is

A vector producer does not re-emit a symbol's geometry at each position. It emits the geometry once, in the symbol's own local coordinates, and places each instance with a transform. So:

That makes counting a matching problem over local geometry, with the matrix carrying placement — not a recognition problem over pixels.

Evidence

Spiked in scripts/symbol-spike/, which is committed so the claim can be re-run rather than taken on trust. A synthetic plan is printed to PDF through Chromium — an independent producer, not this repository emitting its own operators, which is the only way to test whether the technique survives somebody else's serialisation.

The plan deliberately contains the cases expected to break it. Result:

Symbol Instances Recovered
Door — leaf, swing, jamb 6 all, as one symbol of three paths, at 0°, 90°, 180°, 270° and two mirrored
Duplex receptacle 14 all, as one symbol of two paths
Grid bubble 8 all
Non-repeating linework correctly singletons

31 placed groups resolved to 6 distinct symbols. Nothing was unreadable. Recovered spacings were exactly 0.75 of the source's, which is the 96-to-72 unit conversion — so the positions are right, not merely self-consistent.

This disproved the concern recorded when the idea was first written down. Rotation and mirroring were expected to defeat matching. They do not, and the reason is the useful part: the geometry never rotates, the matrix does.

Decision

Count symbols by matching local path geometry, grouped by shared transform, with computer vision reserved for scanned sheets.

Why this over a model

Consequences

Accepted

Open, and blocking acceptance

Chromium is a real producer, but it is not a CAD exporter. Whether AutoCAD, Revit and the plot drivers in common use serialise symbols the same way is unverified, and it is the question this ADR turns on. If they re-emit geometry per instance with per-instance rounding, exact matching degrades badly and the design needs rethinking rather than tuning.

Confirming it requires a CAD-exported set. Under the house rules a customer or third-party drawing must never enter this repository, and that is not negotiable for a convenience. The honest options are to obtain a genuinely public-domain or openly-licensed drawing set whose provenance can be recorded in THIRD_PARTY_NOTICES.md, or to have somebody run the spike against their own drawings and report the counts without the file ever being committed.

Until that is answered this ADR stays Proposed, and no feature is built on it.

Alternatives considered