bimtex
The format

Furniture and assets

You place it. The library dimensions it. And a grid of twelve tables is one line.

A sofa needs a type and a position. Nothing else.

{"t":"furniture","id":"sofa","type":"sofa","level":"g","x":1,"y":1.2}

That compiles to a sofa 1.79 × 0.70 m, because the registry knows what a sofa is. You did not type those numbers, so they cannot be wrong, and every sofa in every model is the same sofa.

The defaults are researched, and writing w, d or height replaces them wholesale — including the part you were not thinking about. A bed's height is the top of its headboard, not the mattress; a sink's is the top of the tap, not the counter. Write a dimension when you measured the real thing. A number typed to look precise is worse than none, because it silently overrides one somebody checked.

Repetition is one line

{"t":"furniture","id":"tables","type":"dining-table","level":"g","x":9.2,"y":4.2,"cols":4,"rows":3,"gapX":1.5,"gapY":1.6}

That is twelve tables. gapX and gapY are clear distances between pieces, not centres, so you can read them off a seating layout.

The array expands before validation, into tables/r1c1, tables/r1c2 and so on, which means all twelve are individually checkable — but you never did twelve coordinate calculations, and moving the grid is still editing one line.

When you need more than a grid

A module holds a group of entities; an instance stamps it somewhere. 11-workplace-floor declares one four-desk cluster and stamps it sixteen times:

{"t":"module","id":"cluster","entities":[{"t":"furniture","id":"desk-nw","type":"desk","x":0,"y":0}]}
{"t":"instance","id":"cluster-w1","module":"cluster","level":"l1","x":5.2,"y":11.2}

Instances namespace what they contain, so that stamp produces cluster-w1/desk-nw. Across that whole model, twelve authored furniture lines become 935 solids.

What bites

An unknown type is a warning, not an error. furniture/no-symbol means the piece drew as a plain box because nothing in the registry matched the name. The plan still prints, and it prints a rectangle where you asked for a range.

Expanded ids carry the prefix. Do not expect to reference desk-nw from outside the module — downstream it is cluster-w1/desk-nw.

Where to go next