bimtex
The format

Rooms and walls

A room is a label on an area. A wall is construction. They are two lists, and that is deliberate.

Get this straight first, because everything else follows from it:

A room does not have walls. It is a named area — a label, a use and a rectangle. Walls are a separate list, and only geometry joins them.

That sounds like extra work. It is the opposite. A wall between two rooms is one wall, authored once, rather than an edge two rooms have to agree about. An open-plan kitchen-diner is two rooms with nothing between them, which is what it is on site. And the checker can ask is this room reachable without first deciding which lines are its boundary.

Writing them

{"t":"room","id":"living","label":"Living","use":"living","level":"g","x":0.3,"y":0.3,"w":4.4,"d":4.4}
{"t":"wall","id":"north","level":"g","side":"north","type":"exterior","thickness":0.3}
{"t":"wall","id":"spine","level":"g","from":[4.85,0.3],"to":[4.85,4.7],"type":"partition","thickness":0.15}

There are two ways to place a wall and the choice matters.

side — for anything that follows the footprint. "side":"north" is the whole declaration. Where that wall starts and ends is arithmetic, and arithmetic is where mistakes live. Four of these close a building.

from / to — only when the run is a real decision. An interior spine, a wing wall, a screen. If you find yourself computing the coordinates of an exterior wall, you wanted side.

What the compiler does next

A wall run is not a solid yet. Openings punch their spans out of it first, and what survives — the pieces before, below, above and after each hole — is what every drawing consumes.

That single step is why a window is a gap in plan, an outline in elevation and a lintel in section without you drawing any of the three.

An attic makes two explicit opt-ins. "ceiling":"roof" clips a room's clear volume to the underside of the built-in pitched roof above it; "top":"roof" clips a wall into a raking or triangular head. Both require a gable, hip or shed roof rectangle covering the whole room or wall. A flat roof or data-authored formdef does not silently substitute: validation returns the blocking room/roof or wall/roof diagnostic.

What bites

use is doing more than labelling. It sets the occupant load factor on the egress sheet: floor area divided by a figure per use. Leave it off and the room does not fail — it quietly takes the fallback of 18.6 m² per person, and the number printed on A-501 is a guess wearing a decimal point.

Overlapping rooms are checked, but the two cases differ. One room fully inside another is room/overlap, a blocking error. A partial overlap is room/overlap-partial, a warning, and the message says why: it might be one open-plan zone, which is legitimate. Read it before you move anything.

room/unreachable is a warning, not a blocker. It means no exterior door reaches that room through the connectivity graph. It does not stop the drawing, because a drawing of a building you cannot enter is still a drawing — but on anything you intend to build it is the most serious warning in the set.

Where to go next