An X+1 instrument ↗

Urban morphometrics · CAD ingestion · refusal by design

Closed beta · by request

An X+1 research instrument

Measuring only what the drawing can prove.

See what it refuses ↓

30.04°N · 31.24°E

Rhino 8 · GeoJSON · SHP · DXF · GeoPackage

Scroll ↓

01

The problem

A production masterplan is not a dataset.

A delivered drawing is a record of how it was made, not a description of what it shows. These are the conditions every one of them arrives in, and each of them silently changes the answer.

Blocks

Most of the geometry lives inside block definitions, nested several deep. Iterating the document the obvious way returns a small fraction of what is in the file.

Layer 0

Content drawn on layer 0 inside a block takes the layer of the instance, not the definition — so one block reads as a different thing everywhere it is placed.

Xrefs

Bound references bring the same outline in several times, from several revisions, disagreeing about where it is. One of them is authoritative and nothing says which.

Setbacks

A parcel and the setback ring inside it are the same size and often the same layer. Told apart by containment and shape, they are coverage; confused, they are a fiction.

02

What it measures

Every measure states what it will not claim.

A refusal outranks a pleasant number. If the drawing cannot support a figure, that is the finding — and it comes with what would unblock it.

01

Solid & void

Refuses A site-wide ground space index when too few plots carry a drawn building for the figure to describe the site. A setback envelope is what may be built, and is never averaged into what is.

02

Grain & frontage

Refuses Street frontage when the kerbs and the parcel lines were drawn as the same line — a plot cannot face street along 90% of its own perimeter.

03

Street width & hierarchy

Refuses A width measured to anything but a facing kerb. Crossings below 1.5 m are one kerb drawn twice and are dropped, not reported.

04

Network & centrality

Refuses Centrality on a network in pieces. Connectivity is judged on the share of network length in the largest piece, because a 20 m stub has as many ends as a kilometre of boulevard.

05

Streetscape & enclosure

Refuses Enclosure when the sightlines hit nothing. A ray that runs its full length reports the ray, not the street, so the censoring is measured and the median is labelled a lower bound.

06

Access & ped-shed

Refuses A walking distance on a network that does not reach the plots, and reports how far from it they sit — a network can be perfectly connected and still serve nothing.

A number the drawing cannot support is worse than no number.
03

Method

Rhino reads the drawing. Everything after it is ordinary science.

Block expansion, layer-0 inheritance and duplicate reconciliation are not portable, so they stay in Rhino. From the GeoJSON handoff onward it is momepy, OSMnx, cityseer and GeoPandas — measures that are published, cited and somebody else's to maintain.

0.0%

Gap between our own measures and the libraries' over the same geometry. Where the two disagreed, the disagreement was investigated before either number was believed.

291

Tests, on fixtures whose answers can be checked on paper. A 3×3 lattice is nine blocks of 400 m perimeter; identical plots have a Gini of zero.

100%

Local. Rhino and the analysis both run on your machine, and the viewer reads a report in the browser without transmitting it. A shared analysis is a file you send, not a file you upload.

04

The viewer

Your report, read in the browser.

Any UrbanQ report opens in the viewer — your drawing, your project, your numbers. Drop the file on the page and it draws the plan, colours it by any measure the report carries, and lists the findings with what each one refuses.

01

It reads your file

How The measures on offer come from the report you open. A project with no street network simply has no frontage view, rather than a view that colours everything grey.

02

Nothing leaves the browser

How The file is read on the page. No upload, no account, no server — open it from disk and it works the same.

03

Brush, pin, export

How Drag across any distribution to select a range and the plan answers. Click a plot to pin its measures. Take the table out as CSV.

Open the viewer ↗

05

Get it

Run it on your own drawing.

# a beta invite includes the repository; then $ cd urbanq && uv sync --extra analysis # start the listener inside Rhino 8, then $ python -m urbanq_server.analysis.run reports/geojson

Request the Rhino MCP beta ↗ Open a report ↗

UrbanQ is in closed beta and is not distributed publicly. Ask for a beta invite and the repository comes with it. The report viewer above needs none of this — it reads a file in your browser.

Requirements

  • Rhino 8CPython 3 ScriptEditor
  • Python3.10 or newer
  • Analysis stackGeoPandas · momepy · OSMnx · cityseer
  • DrawingDWG, DXF, SHP, GeoPackage or GeoJSON
  • AccessClosed beta, by request

Reading

  • Boeing, orientation entropy (2019)
  • Simons, cityseer (2023)
  • Berghauser Pont, Spacematrix
  • Benedikt, isovists (1979)