Revit's four room finish parameters and the finish construction itself are the same decision written twice — and they drift apart. Room Studio holds the decision once, as a named mapping set: read the construction and write the parameters, or build the construction from the room. Analyse says which rooms have drifted; one Apply corrects them.
Floor Finish says one thing, the floor that is actually there says another — and nobody knows which one the fit-out drawings believed.
Room Studio has two halves. The mapping set holds the finish standard — that is the input. Analyse reads every room against it and Apply corrects the drift — that is the output. Here is the loop, top to bottom.
Tap Input or Output to isolate a half — the other collapses.
A set pairs your project's types with finish values, in both directions. Name it, duplicate it per phase or per client — and export it whole.
Mapping sets pair your project types with finish values in both directions. They are named — Fit-out GB, Shell only — duplicable, and exported and imported as one JSON that carries the rows, the options and the rules together, ready for another machine or the next project.
Ordered rules read the bounding element — its type name, or any parameter — and write any of the four room finish parameters: a fixed text, or whatever a parameter of the element says, so one rule can carry a whole keynote catalogue. The same rule names the type to build. Order is priority per element: the first rule that matches a wall decides that wall — and two rules matching two different walls both write, joined by the set's separator.
| # | Active | Rule | Looks at | Writes | Builds | Reads | Found | |
|---|---|---|---|---|---|---|---|---|
| 1 | Active | Blockwork means paint | Wall | Wall: Paint, emulsion · Base: Skirting, MDF | Wall: GYP Lining 62.5 | Family type | 38 el · 14 rooms | |
| 2 | Active | Wet rooms tile | Wall | Wall: {Keynote} | Wall: Tile Lining 40 | Function | 12 el · 6 rooms | |
| 3 | Active | Structural slab → screed | Floor | Floor: Vinyl, sheet | Floor: Screed + Vinyl 65 | Family type | 61 el · 61 rooms |
Conditions read a parameter of the bounding element — or Family type, its type name — and compare it against values ticked from a list the last scan actually found: is one of, is none of, contains, is empty. Nothing is typed, so a renamed wall type cannot rot into a rule that quietly matches nothing. Any condition or all of them. Four rows write the four room parameters; one row per ticked category names the type Apply creates.
Tick a room parameter and give it a value. Leave “from parameter” empty to write the text; fill it to write whatever THAT parameter of the element says.
Ignored: this rule writes whatever “Keynote” says on the element. Clear that box to write a fixed text instead.
One row per category ticked above. Leave a type empty and this rule builds nothing for it — writing parameters still works. Roof has no row: the studio never builds a roof.
| Order | Active | Read on the element | Compared how | Values in the model |
|---|---|---|---|---|
| 1 | Active | Function | is one of | 3 values · Sanitary… |
7 value(s) the last scan found on the elements this rule looks at. Tick every one that counts.
Walls are read by ray, at two heights — 500 mm catches the dado, 2000 mm the paint above it — so the scan reports the lining standing in front of the structure, and the real wall above a low upstand, not the blockwork behind them. Every correction is reported, never silent. Floors and ceilings come from a ray grid over the room; a roof answers for the ceiling only where the room has none. What the scan cannot resolve, it counts — it never drops it quietly.
Parameters and Modelling are two screens over the same table and the same set. On Parameters, Apply writes Floor · Ceiling · Wall · Base Finish and builds nothing. On Modelling it builds floors, ceilings and linings and writes no parameter. Half the columns and the whole options rail follow the screen — reading options with the scan, building options with the build. A practice that wants the schedule filled and no new geometry never has to opt out of anything.
Up to date fades back. Unmapped points at the set, not the room. A room the scan could not judge is never passed off as clean.
Nothing is written until you press Apply — and then it is one named transaction, in the order a builder would work.
Floors first, to the structural boundary, running through door thresholds — interior absorbs, exterior absorbs, or wall centre, per door. Linings seated on the new floor's top. Ceilings from the re-read, lining-bounded boundary, so the ceiling-versus-lining clash cannot exist. Parameters written last, honouring every value you edited in the table. All of it one named transaction — and the window stays open and rescans.
| Room | Level | Scan found | Floor finish | Ceiling finish | Wall finish | Base finish | ||
|---|---|---|---|---|---|---|---|---|
| 1.04 — Office | L01 | W: GYP Lining 62.5 · F: Screed + Vinyl 65 · C: — | Vinyl, sheet | Plasterboard, painted | Paint, emulsion | Skirting, MDF | ||
| 1.07 — Meeting | L01 | W: Blockwork 140 · F: Screed + Vinyl 65 · C: — | Vinyl, sheet | Plasterboard, painted | Paint, emulsion | Skirting, MDF | ||
| 2.02 — Ward | L02 | W: Tile Lining 40 · F: Screed · ! | Vinyl, sheet | Plasterboard, hygienic | Tile, ceramic | Cove, vinyl | ||
| 2.09 — Plant | L02 | W: Precast 200 · F: — · C: — |
The chips carry the bucket counts and are the filter: click one and the table shows only that bucket. Analyse opens the first bucket that has rooms in it, so a scope with nothing outdated never lands on an empty table. The header tick touches only what the filter left standing, never a hidden row. A value typed into one cell of a multi-row selection carries to the rest of that selection, and nowhere else.
| Room | Level | Scan found | Floor finish | Ceiling finish | Wall finish | Base finish | ||
|---|---|---|---|---|---|---|---|---|
| 1.07 — Meeting | L01 | W: Blockwork 140 · F: Screed + Vinyl 65 · C: — | Vinyl, sheet | Plasterboard, painted | Paint, emulsion | Skirting, MDF | ||
| 1.11 — Consulting | L01 | W: Blockwork 140 · F: Screed + Vinyl 65 · C: — | Vinyl, sheet | Plasterboard, painted | Paint, emulsion | Skirting, MDF | ||
| 2.02 — Ward | L02 | W: Tile Lining 40 · F: Screed · ! | Vinyl, sheet | Plasterboard, hygienic | Tile, ceramic | Cove, vinyl | ||
| 2.06 — Treatment | L02 | W: Blockwork 140 · F: Screed + Vinyl 65 · C: — | Vinyl, sheet | Plasterboard, hygienic | Tile, ceramic | Cove, vinyl |
Three write modes — leave alone, refresh ours, overwrite — with every overwrite visible before it happens. And when a typed value disagrees with what the model says, a per-room chip flips the direction: model wins rewrites the parameter, parameter wins retypes the studio's own construction in place, so tags and annotations survive.
| Room | Level | Scan found | Floor finish | Ceiling finish | Wall finish | Base finish | Direction | ||
|---|---|---|---|---|---|---|---|---|---|
| 1.07 — Meeting | L01 | W: GYP Lining 62.5 · F: Screed + Vinyl 65 · C: — | Vinyl, sheet | Plasterboard, painted | Paint, emulsion | Skirting, MDF | model → params |
Provenance lives in extensible storage, never in Comments. Finishes modelled by hand that match the rules are adopted quietly; the right-type-wrong-geometry ones — a lining stopped short of the rule's height, a floor at the wrong offset — are put to you once: accept them as they are, bring them in line, or leave them alone. The answer sticks in the model, so nobody is asked twice.
Every Apply ends in a count of what it touched: values written, elements built, elements updated in place, and what was skipped. Skipped is broken down by cause, because in a workshared model “owned by others” is a phone call, “in groups” is a decision, and a failure is neither. The breakdown goes further — lining pieces, door gaps left open, threshold patches, doors whose facing could not be read. Cancel mid-run and the whole transaction rolls back.
Room Studio ships on the Data panel of the BIMIO tab — open it beside your model, Analyse, and see which rooms have drifted. Revit 2024–2027, full trial, no card.
Blockwork 140 → GYP Lining 62.5 (500 mm)