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.