# Project format version 3

A `.plan` file is UTF-8 JSON. It describes the building with stable IDs, real-world positions in millimeters, and the names the editor uses, so a person or an AI can read it and change one element without touching the others. Editor preferences and undo history are kept in their own sections, apart from the building.

<!-- prettier-ignore -->
```json
{
  "format": "Simple House Planner",
  "version": 3,
  "id": "2f6c1a8e-3b0d-4c55-9a71-0e1f2d3c4b5a",
  "floors": [
    {
      "name": "Ground floor",
      "height": 2600,
      "elements": [
        {"id":"wall1","type":"Wall","from":[0,0],"to":[8000,0],"thickness":240,"material":"Brick"},
        {"id":"wall2","type":"Wall","from":[8000,0],"to":[8000,6000],"thickness":240,"material":"Brick"},
        {"id":"wall3","type":"Wall","from":[8000,6000],"to":[0,6000],"thickness":240,"material":"Brick"},
        {"id":"wall4","type":"Wall","from":[0,6000],"to":[0,0],"thickness":240,"material":"Brick"},
        {"id":"wall5","type":"Wall","from":[4500,0],"to":[4500,6000],"thickness":115},
        {"id":"door6","type":"Door","wall":"wall1","offset":1000,"width":1000,"height":2100},
        {"id":"door7","type":"Door","wall":"wall5","offset":4350,"width":900,"height":2100,"hingeAtEnd":true},
        {"id":"window8","type":"Window","wall":"wall1","offset":2450,"width":1500,"height":1200,"sill":900},
        {"id":"room9","type":"Room","name":"Living","at":[2250,3000]},
        {"id":"room10","type":"Room","name":"Bedroom","at":[6250,3000]}
      ]
    }
  ],
  "cameras": []
}
```

## Conventions

- Lengths, positions and heights are millimeters. The plan's x axis points right and its y axis points up.
- `rotation` is in degrees, counterclockwise, and 0 means the element's length runs along +y. At 0 a furnishing's back, or a bed's head, faces +y.
- Every element has an `id` made of its type prefix and a number that is unique in the project: `wall`, `door`, `window`, `room`, `roof`, `stair`, `spiral` (spiral stair), `builtin` (built-in), `platform`, `shape`, `railing`, `pillar`, `furnishing`, `label`, `arrow`, `guide` (measurement guide), `surface`, `boundary`, `fence`, `spot`, `breakline`, `run` (a duct or cable tray) and `section`. A reference always names an ID.
- Optional fields are written only when they differ from their default, and the decoder applies the same defaults. Unknown fields are rejected, with the element ID in the message.
- `floors` lists floors from the bottom up. `groups` (lists of element IDs that move together) and `hidden` (element IDs hidden in the editor) appear on a floor only when they are not empty.
- A floor's optional `underlay` is a plan image to trace over: `{"image": "data:image/jpeg;base64,…", "at": [x, y], "width": 10000, "opacity": 0.5}`. `at` is the image center and `width` its width on the plan; the height follows the image. Exports leave it out.

## Elements

| Type               | Fields                                      | Optional (default)                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Wall`             | `from`, `to`, `thickness`                   | `height` (the floor height) or `heights` `[from, to]` for a sloped top; `material` (`Generic`); `finish` and `color` (none); `fromMiter`, `toMiter` (1); `curve` (0); `faces` (none); `coverings` (none)                                                                                                                                                                                                                                                                                        |
| `Door`             | `wall`, `offset`, `width`, `height`         | `kind`: `standard`, `glass`, `sliding`, `pocket`, `barn`, `bifold`, `garage` or `open` (`standard`); `elevation` (0); `head` (`flat`); `hingeAtEnd`, `opensOutward`, `panelsFlipped`, `dimensionFlipped` (false); `open` (0); `frameColor` (by kind)                                                                                                                                                                                                                                            |
| `Window`           | `wall`, `offset`, `width`, `height`, `sill` | `kind`: `standard`, `silled` or `casement` (`standard`); `sillDepth` (40, silled windows); `head` (`flat`); `hingeAtEnd`, `opensOutward`, `dimensionFlipped` (false); `open` (0); `frameColor` (`#f4f2ee`)                                                                                                                                                                                                                                                                                      |
| `Room`             | `name`, `at`                                | `size` (16 pt label), `rotation` (0), `floorFinish` (`oak-planks`), `floorColor` (`#c9ab84`), `wallFinish` (`paint`), `wallColor` (`#f3f1ec`), `storeys` (1), `opacity` (1)                                                                                                                                                                                                                                                                                                                     |
| `Roof`             | `from`, `to`, `width`, `eaveHeight`         | `shape`: `Gable`, `Hip`, `Shed` or `Flat` (`Gable`); `pitch` (35); `overhang` (400); `finish` (`clay-tiles`); `color` (`#8c5a46`); `gutters` (true); `rafters` (false); `parapet` (0); `followWalls` (true); `trimColor` (`#f2f0eb`); `gableFinish` and `gableColor` (none); `glazedGables` (false)                                                                                                                                                                                             |
| `Stair`            | `from`, `to`, `width`, `height`             | `steps` (computed from the step limits); `reversed` (false); `style` (`solid`); `curve` (0); `elevation` (0); `railing` (`none`); `treads`, `stringers`, `beam` and `balustrade` (by style)                                                                                                                                                                                                                                                                                                     |
| `SpiralStair`      | `at`, `width`, `length`, `height`           | `rotation` (0); `turn` (360); `steps` (computed from the height); `clockwise` (false); `style` (`column`); `elevation` (0); `railing` (`none`); `treads`, `column`, `stringers` and `balustrade`                                                                                                                                                                                                                                                                                                |
| `BuiltIn`          | `style`, `from`, `to`                       | `depth`, `height` and `elevation` (by style); `finish` (none), `color` (by style) and `worktop` (none); `fromMiter`, `toMiter` (1)                                                                                                                                                                                                                                                                                                                                                              |
| `Railing`          | `from`, `to`, `width`, `height`             | `posts` (computed from the spacing limits); `material`; `finish` (none) and `color` (`#8a8f94`)                                                                                                                                                                                                                                                                                                                                                                                                 |
| `Pillar`           | `at`, `width`, `length`                     | `rotation` (0), `height` (the floor height), `material`, `finish` and `color` (none)                                                                                                                                                                                                                                                                                                                                                                                                            |
| `Furnishing`       | `item`, `at`, `width`, `length`, `height`   | `rotation` (0), `elevation` (0); `draft` (none); a lamp's `lumens`, then `kelvin` (2700) and `on` (true); `paint` (the item's); `finishes` (none)                                                                                                                                                                                                                                                                                                                                               |
| `Label`            | `text`, `at`                                | `size` (16 pt), `rotation` (0), `opacity` (1)                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `Arrow`            | `from`, `to`                                | `width` (10), `tipSize` (60), `solidTip` (true), `opacity` (1)                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `MeasurementGuide` | `from`, `to`                                | —                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `Surface`          | `kind`, `at`, `width`, `length`             | `outline` in place of `at`, `width` and `length`, with `curves` (all 0); `rotation` (0); water's `water` (`lake`); a lawn's `grassLength` (110) and `grassDensity` (10); a bed's and a planter's `plants` (`["flowers"]`) and `edging` (bed `stone`, planter `steel`); `height` and `finish` (by kind); the `level` (0) of a patio, deck, driveway, terrace, sunken seating, court or pool; a pool's `depth` (1500); sunken seating's `depth` (700); water's `level` (-1500) and `depth` (2500) |
| `Platform`         | `kind`, `at`, `width`, `length`             | `outline` in place of `at`, `width` and `length`; `rotation` (0); `elevation`, `railing`, `supports` and `finish` (by kind)                                                                                                                                                                                                                                                                                                                                                                     |
| `Shape`            | `at`, `parts`                               | `name` (`Shape`); `rotation` (0); `elevation` (0); `draft` (none); `size` (the parts' own size)                                                                                                                                                                                                                                                                                                                                                                                                 |
| `Fence`            | `style`, `from`, `to`                       | `width` and `height` (by style)                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `Boundary`         | `from`, `to`                                | —                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `Run`              | `kind`, `from`, `to`, `elevation`           | `width` and `height` (by kind); `drop` (0)                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `Spot`             | `at`, `level`                               | —                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `Breakline`        | `from`, `to`, `levels`                      | —                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `Section`          | `from`, `to`, `name`                        | —                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |

- A finish is a key from the finish library in `src/core/finishes.json`: a room's `floorFinish` needs a floor finish, its `wallFinish` a wall finish, and a roof's `finish` a roof finish. A surface shows the texture of its finish; a tinted finish such as `paint` takes the surface's color as well. A wall's or pillar's `finish` covers its faces outside rooms; without one they show the construction `material`. Its `color` is allowed only with a tinted finish, which shows its default paint without it.
- A wall's `faces` finish its whole left or right face, looking from `from` to `to`, in place of the finish of the room that face looks into or of the wall's outside, as for an accent wall: `{"left": {"finish": "paint", "color": "#3f5a4c"}}`. Each `finish` is a wall finish, and its `color` is allowed only with a tinted finish.
- A wall's `coverings` put finishes over parts of its faces, such as tiles up to 1200 in a bathroom, a splashback, an accent wall or a stone plinth: `[{"side": "left", "from": 0, "to": 3000, "bottom": 0, "top": 1200, "finish": "subway-tiles"}]`. `side` is the face `left` or `right` of the line from `from` to `to` of the wall; `from` (0) and `to` are millimeters along the wall, and `bottom` (0) and `top` heights above the floor. `finish` is any finish of the library, and `color` tints a tinted finish. A later covering lies over an earlier one where they overlap, coverings lie over the wall's `faces`, and doors and windows stay open through them.
- A wall's `curve` bends it into a circular arc whose middle lies that far from the straight line between its ends, to the left looking from `from` to `to`, or to the right when negative; it is at most the distance between the ends. The wall's length, and its doors' and windows' offsets and widths, run along the arc, and its ends join other walls along the arc's direction there.
- A door or window sits in the wall named by `wall`. `offset` is the distance along that wall from its `from` point to the opening's center, and `width` is the opening's size along the wall. A window's `sill` and a door's `elevation` are heights above the floor. `head` shapes its top: `flat`, `round` (a round arch that rises half the width), `segment` (a shallow arch that rises a sixth of the width) or `pointed` (a pointed arch that rises three quarters of the width); `height` is the height of the crown, and the sides of an arched opening stand at least 100 high. On a curved wall a door or window follows the curve. `frameColor` is a `#rrggbb` color for its frame, sashes, lining and casings: white paint (`#f4f2ee`) unless it is a sliding or glazed door, whose frame is aluminum (`#4b4f54`). A `glass` door is a hinged glass leaf in a metal frame, without casings, and a `standard` door in a `Glass` wall is glazed the same way. `open` is how far a door or window stands open, in degrees: the leaf of a `standard` or `glass` door turns on its hinges up to 180 to the side it swings to, the panels of a `bifold` door fold up to 90, and the sashes of a window turn up to 90 on the side of their hinges, a casement's to the side its swing shows and the others' into the room. For a `sliding`, `pocket`, `barn` or `garage` door, `open` is the share of its travel in percent, up to 100: a sliding door's panel slides past the other one the way the plan's arrow points, a pocket door's leaf slides into its pocket, a barn door's leaf along its rail, and a garage door's panels run up the opening and on inward under its head. Open doorways have no `open`.
- A room is the area enclosed by walls around its `at` point, where its name label stands; its outline and area follow the walls. `storeys`, a whole number from 1 to 20, is how many floors the room rises through: a room 2 storeys high opens the floor above over its area as a void, whose slab and room floors leave it out, and whose rooms do not count it in their areas.
- A roof's ridge runs from `from` to `to`, and `width` is its span across the ridge, without overhang. `eaveHeight` is measured from the floor. Roofs on one floor meet: within the walls under one roof, which its rectangle less its overhang marks, any other roof of the floor that lies lower is left out, so a dormer or a wing opens the roof it rises through and meets it in valleys; where two roofs lie in one plane, the one that comes first in the floor stays. `gutters` hangs gutters along the eaves with downpipes that run back to the wall and down onto what lies below them: another roof, a platform, an upper floor's slab where it reaches out past the floor above, or the ground, sloped or not. `rafters` shows a pitched roof's rafter tails under its eaves in place of a fascia board; a flat roof has none. `parapet` is the height of a wall round a flat roof's edge, with a coping on top; only a flat roof has one, and a roof with a parapet has no gutters. `followWalls` makes a flat roof trace the outer faces of the walls and pillars under its rectangle, pushed out by its overhang, so it follows curved and angled plans and stays open over courtyards, the areas that walls enclose and that hold no room; a flat roof with no walls under it keeps its rectangle, and only a flat roof has the field. `trimColor` colors the fascia and barge boards, gutters, downpipes and coping, and the frames of glazed gables. A gable or shed roof closes its gable ends between the eaves and the roof; a wall of its floor under a gable end that is taller than the eaves rises into the gable to the roof and closes it there itself, with its own finish, glass, doors and windows. `gableFinish` is a wall finish for the rest of the gable ends, and `gableColor` tints a tinted one; without a finish the gables take the outside finish of most of the floor's walls. `glazedGables` fills them with glass in frames, with mullions at most 1500 apart. Only a gable or shed roof has these three fields. A flat roof may also take the `gravel`, `grass` or `concrete` finish.
- A stair climbs from `from` to `to`; `reversed` swaps the direction it climbs. It rises from `elevation` to `height`, both above the floor, so a stair to the floor above rises the floor's height and the 200 of the slab, and one to a terrace or a deck ends at its top; both may be negative for a stair that starts below the floor, as down to a jetty. `style` is `solid` (a block down to the floor), `stringers` (treads between two side boards, with open risers), `floating` (treads alone, as if fixed into a wall) or `spine` (treads on one beam down the middle). Stairs may overlap other elements. `railing` puts a balustrade with a handrail above the noses of the treads on the `left` or `right` side as seen walking up, or on `both`. Stairs joined end to end are the flights of one stair: they share one rise, from the first flight's `elevation` to the highest `height`, and meet at a landing, which fills the corner where they turn and is as deep as the wider flight is wide where they run in line. The railings run on round the landings. A stair's `curve` bends it into a circular arc as it does a wall: its middle lies that far from the straight line between its ends, to the left looking from `from` to `to`, or to the right when negative. Its treads are winders that narrow toward the inside of the curve and are all as deep along its walking line down the middle; a curved flight runs on into the flights joined to its ends without a landing where they meet in line, so a curved flight between two straight ones turns them on winders. Where a stair arrives at the edge of a platform at the platform's height, at its top or at its foot, or a stair from the floor below arrives at a platform at the floor's level, the platform's railing leaves a gap as wide as the stair.
- A spiral stair turns around a center column at `at`; `width` and `length` are its outer sizes, so it is round when they are equal and oval when they differ. It starts on its −y side at rotation 0 and turns `turn` degrees counterclockwise, or clockwise, to reach `height`, rising from `elevation`; its steps rise about 190 mm each unless `steps` sets how many treads it has. Its `railing` is `none` or `outer`, along its outer edge. Its `style` is `column` (wedge treads on the center column), `solid` (solid steps stacked round the column, each reaching 150 below the step under it) or `stringers` (treads between two stringers that wind up along its inner and outer edges).
- A stair's parts each say what they are made of, `material`, which is `Wood` (oak), `Steel`, `Glass`, `Concrete` or `Stone` (travertine), and their sizes; a part is written with only what differs from its defaults, and only on a stair that has it: `treads` (`Wood`; `thickness` 50 on stringers, 80 floating, 60 on a center beam or a spiral stair, and none on a solid stair or solid spiral stair, whose treads are its body), `stringers` (`Wood`, `width` 50 and `depth` 280, on a stair on stringers; `Steel`, 20 and 300, on a spiral stair on stringers), `beam` (`Wood`, `width` 160 and `depth` 220, on a stair on a center beam), `column` (`Steel`, `diameter` 120, a spiral stair's, where its treads start) and `balustrade` (`Steel`, `height` 900, the top of its handrail above the noses of the treads, on a stair with a railing): `"treads": {"material": "Glass", "thickness": 40}, "stringers": {"material": "Steel", "width": 15, "depth": 300}`. A balustrade of steel or wood is a handrail on balusters, one of glass a steel handrail on frameless panes, and one of concrete or stone a solid wall up to the handrail's height.
- A surface is an outdoor area on the ground, a rectangle of `width` and `length` centered on `at` and turned `rotation`, or any polygon given as its `outline`, a list of its corners in order, `[[x, y], …]`, with three corners or more that does not cross itself. `curves` then lists, for each corner, how far the edge from it to the next corner bulges out at its middle, in millimeters: 0 for a straight edge, negative for one that bulges in, and at most the edge's length, so that an outline makes curved paths, round beds, kidney pools, and lakes and rivers with winding shores. An outlined surface's `rotation` turns the box that fits around it. A road, a sports court, sunken seating and a pool with a vanishing edge keep to a rectangle, and a pool of any outline has its coping inside its outline. `kind` is `lawn`, `path`, `driveway`, `road`, `sidewalk`, `patio`, `deck`, `gravel`, `bed`, `planter`, `terrace`, `sunken`, `court` or `pool`. `height` is its top above the floor level, and `finish` is a ground finish; both default to the kind's (lawn: `grass`, 10; path: `cobblestones`, 30; driveway: `asphalt`, 30; road: `asphalt`, 20; sidewalk: `concrete`, 150; patio: `stone-slabs`, 50; deck: `decking`, 300; gravel: `gravel`, 20; bed: `soil`, 80; planter: `soil`, 450; terrace: `travertine`, 450; sunken: `stone-slabs`, 50; court: `asphalt`, 30; pool: `stone-slabs`, 50). A court is painted for basketball: an apron over all of it, a playing area 1000 inside its edges with keys and lines; one 26000 or longer is a full court, and a shorter one a half court from the end that faces −y at rotation 0. A road runs from its first end to its second, with white lines 300 inside its sides and, when it is at least 4500 wide, a dashed line down its middle; a road's `curve` (0) bends it into an arc whose middle lies that far to the left of the straight line from its first end to its second, negative to the right, as for a wall. Roads join where an end of one lies on another, at a corner, a T or a shared end, and where their centerlines cross: the curbs round the corners there with a radius of 6000, a road that ends on another's end rounds the outside of the bend, the edge lines follow the curbs round into the other road, and the dashed lines stop 1000 short of it; a sidewalk's raised sides are its curbs. A planter is a raised bed, and a terrace a raised paved area with solid sides. A lawn's grass grows `grassLength` (110) long, in millimeters from 10 to 2000, as a mown lawn or a meadow, with `grassDensity` (10) tufts of blades on a square meter, from 1 to 100; wild grass around the house grows as the default lawn. A bed and a planter hold `plants` (`["flowers"]`), the plants that grow mixed in it, each about its own spacing from the next, from `flowers`, `shrub`, `agave`, `bamboo` and `cactus`, or `[]` for bare soil, and its `edging` is `none`, `stone` (120 wide, 50 above the soil), `brick` (110, 60), `steel` (corten, 20, 30) or `timber` (40, 80); a bed's edging is `stone` and a planter's `steel` unless given. Grass and plants sway in the breeze in the 3D view. Sunken seating is a pit `depth` (700) deep inside a coping 300 wide, with a bench 450 high and 450 deep round its walls and three steps down at the end that faces −y at rotation 0. A higher surface covers a lower one where they overlap. A pool's finish is its coping, 300 mm wide around the water, and `depth` (1500) is how deep the water is; only a pool, sunken seating and water have a depth. A pool with `infinity` set to `true` has a vanishing edge at its end that faces +y at rotation 0: no coping there, but a wall 150 wide whose top lies just under the water, which runs over it and down its outer face.
- A built-in is fitted furniture centered on the line from `from` to `to`; `depth` is its size across that line and `elevation` the height of its underside above the floor. `style` is `counter` (base cabinets with a worktop, 600 deep, 900 high), `upper` (wall cabinets, 350 deep, 720 high, from 1450), `tall` (tall cabinets such as a pantry, 600 × 2200), `closet` (a built-in wardrobe, 600 × 2300), `shelves` (350 × 2000), `bench` (a bench seat, 450 × 450) or `desk` (600 × 750). Built-ins of one style that meet end to end join like walls. A built-in opens to the side of its line that no wall stands against. Built-ins may overlap each other and furnishings, such as a sink in a counter. A built-in's fronts and sides, and a shelf unit's boards, show its `finish`, any finish of the library, or else its `color`, a `#rrggbb` paint, which also tints a tinted finish; without either they show the style's own color: `#ece8e1` for counters, tall cabinets, benches and a desk's legs, `#f1eee8` for wall cabinets, `#d9c7ad` for closets and `#c9a982` for shelves. `worktop` is the finish of the top of a counter or a desk, or of a bench's seat, which otherwise show `#6f6a64`, `#c9a982` and `#7d8b96`.
- A platform is a rectangle of `width` and `length` centered on `at` and turned `rotation`, or any polygon given as its `outline`, a list of its corners in order, `[[x, y], …]`, such as an L-shaped deck or one that wraps round a corner of the house; the outline has three corners or more and does not cross itself. It is a deck raised above its floor: `kind` is `balcony` (top at the floor, glass railing, no supports, `stone-slabs`), `deck` (a deck on posts, top 800 above the floor, bars, posts, `decking`), `walkway` (1200, bars, posts, `decking`) or `pier` (400, no railing, piles, `decking`). `elevation` is the height of its top above the floor, negative for a platform below the floor such as a jetty down at the water, and its deck is 200 deep. `railing` is `none`, `bars` (steel posts, rails and balusters) or `glass` (frameless panes under a slim steel cap), 1000 high along every part of its edge that no wall, pillar or other platform at its height runs along, where no stair arrives, and, for a platform at its floor's level, no pool. `supports` is `none`, `posts`, `piles` or `caissons`; they stand inside its corners and along its edges, under beams that run round it inside its edges, at most 2400 apart (caissons 5000), and reach down to the ground: piles go 600 into it, and caissons, concrete piers 1000 across under deep concrete edge beams for platforms held out from a slope, go 3000 into it. `finish` is a ground finish.
- A shape is any form made of `parts`, such as a pagoda, a kiosk, a water tower or a sculpture. Its parts are measured in the shape's own frame, from `at`: x across, y along and z up from `elevation`, turned `rotation` degrees. `elevation` may be negative, to sink a shape into the ground. `size` is `[width, length, height]` of the box around the parts; when it differs from the parts' own size the parts stretch to fill it. A shape has 1 to 2000 parts with at most 200000 points in all, and draws in the plan as its parts seen from above.
- A part is `{"solid": …}` with the solid's fields and, all optional, `name`; `at` (`[0, 0, 0]`); `rotation` (`[0, 0, 0]`, degrees about x, then y, then z, around `at`); `finish`, any key of the finish library, and `color`, a `#rrggbb` color that tints a tinted finish or, without a finish, colors the part plainly; and `look`, how a part without a finish takes the light: `matte` (the default), `metal`, `glass`, `water` or `glow`. The solids are:
  - `box`: `size` `[x, y, z]`, standing on `at`.
  - `pyramid`: `size` `[x, y]` of its base and `height`; `top` (`[0, 0]`) is the size of a flat top, so a pyramid with a top is a frustum.
  - `cylinder`: `radius` and `height`; `top` (the `radius`) is the radius at the top, 0 for a cone; `segments` (32) is the number of sides. A radius is a number or `[x, y]` for an oval.
  - `sphere`: `radius`, a number or `[x, y, z]`, around `at`; `segments` (32).
  - `prism`: `outline`, a list of `[x, y]` points, lifted `height`; `holes` (none) are outlines cut through it.
  - `lathe`: `profile`, a list of `[radius, z]` points, turned round the z axis; `segments` (32). A profile that ends at radius 0 is closed there.
  - `loft`: `sections`, a list of `{"outline": [[x, y], …], "z": …}` with the same number of points each, joined from the lowest up.
  - `mesh`: `vertices`, a list of `[x, y, z]`, and `faces`, lists of vertex indices, each counterclockwise seen from outside.
- A fence runs from `from` to `to` with posts at most 2400 mm apart. `style` is `rails` (posts and rails, 100 × 1200), `boards` (100 × 1800), `pickets` (80 × 1000), `panels` (60 × 1500) or `hedge` (600 × 1600); `width` is its thickness.
- A boundary is a line of the plot's outline; joined boundaries go around the plot. The 3D view shows each one as a concrete edge 150 wide and 40 high on the ground.
- A run is a straight length of building services from `from` to `to`, its underside `elevation` above the floor. `kind` is `round` (a round duct, 250 across, whose `width` is its diameter and which has no `height`), `rect` (a rectangular duct, 500 × 300) or `tray` (a cable tray 300 wide with sides 80 high). Runs of one kind join where their ends meet: two on an elbow, and three or more, or one that ends on the middle of another, on a tee, where the side of a cable tray opens into a tray that branches off it. A run that joins a smaller one narrows to its size on a reducer, and where one reaches above or below the other an upright piece joins them. `drop` turns the run down at its `to` end, that far below its underside, where a duct ends in a grille.
- A spot is a surveyed height of the ground: at `at` the existing ground lies `level` above the floor. Three or more spots on the bottom floor shape the terrain between them, and far from them the ground keeps the slope of the plane through them and levels out over a few hundred meters. A breakline is a line of the existing ground, such as the top or the toe of a bank or the bottom of a ditch, at `levels` `[from, to]` above the floor at its ends; the terrain is triangulated between the spots and the breaklines' ends with every breakline as an edge, so it runs straight along each breakline. Breaklines that cross are split where they cross, and ends that meet share one point. The proposed ground stays level under patios, decks, driveways, terraces, sunken seating, courts and pools, at each one's `level` above the floor (0), and under the house at the floor when the `grading` in `info` is `level`, and slopes away from them at 1 in 2; the other surfaces follow it. With `natural` grading the ground keeps its shape around the house, and the house's walls hold it back and reach down to it where it lies below the floor. Walls that enclose no area are retaining walls: the slopes stop at them, the proposed ground steps at their faces, and they reach down to the ground below the floor. A wall that reaches down shows its outside `finish`, or its `faces`, down to the ground, and a covering from its foot (`bottom` 0) reaches down with it. Where an upper floor reaches past the floors under it into ground that rises to its level, as on a house that steps down a hill, that part stands dug into the slope: the ground under it is cut down to the underside of its slab, no slope reaches in under it, its walls hold back the ground around it, and concrete reaches down from it to where the ground around falls lowest. Where the ground lies below an upper floor, the floor stays clear of it, as on a cantilever. An outdoor surface of an upper floor beyond the floors under it, other than water, stands on the ground where the existing ground under it rises to the underside of that floor's slab, as at the street level of a house that steps down a hill: it is a pad of the terrain at its floor's level, plus its own `level` for the kinds that have one, with slopes at 1 in 2 that meet it like those of the bottom floor's pads. A surface that lies around a floor under it stays on its floor.
- A section is a line that a section of the house cuts along, from `from` to `to`, looking to the left of that way: it shows everything beyond the line, cut where the line runs through walls, slabs, roofs, stairs and the ground, and spans the line's length. `name` names it, such as `A`. Sections cut every floor, whichever floor holds the line, and the plan of that floor shows the line with arrows the way it looks.
- A surface of kind `water` is a lake, river or sea, as `water` says: `lake` (the default), whose surface ripples in the breeze in the 3D view, `sea`, with swells and waves that roll across it, or `river`, which flows from its end that faces −y at rotation 0 toward its other end, along its banks, so that a river of any outline turns `rotation` toward the way it flows; the plan draws waves on a lake or the sea and arrows down a river. Its water lies `level` above the floor, usually below it; the ground under it sinks to `depth` below the water, shelving down from its edge at 1 in 2, and its shores slope up from the water at 1 in 2. Its `finish` covers the ground under the water. Water shapes the ground even without spots, on a site that is otherwise level with the floor.
- `item` is the key of a furnishing definition in the catalog, or of one of the project's own `items`.
- A furnishing or a shape with a `draft` floats, as a boat, a buoy or a raft does: where its middle lies over a lake, the sea or a river, its base lies `draft` millimeters under the water's surface, raised by its `elevation`; elsewhere it stands on the ground like any other.
- A furnishing's `paint` is a `#rrggbb` color for the paint of an item that has one, such as a car, in place of the item's own color.
- A furnishing's `finishes` dress the stuffs that its item's model is made of: `wood`, `fabric` (upholstery), `linen` (bedding and cushions), `ceramic`, `metal` and `rug`, each `{"finish": …, "color": …}` with a finish of the library, which the color tints when it is tinted, or a `#rrggbb` color alone: `{"wood": {"finish": "black-marble"}, "fabric": {"finish": "leather", "color": "#5b3a29"}}`. Items made of parts have no finishes.
- A railing shows its `finish`, any finish of the library, or else its `color`, a `#rrggbb` paint that also tints a tinted finish.
- A lamp is a furnishing with `lumens`, its light output. `kelvin` is the color temperature of its light, from 1000 to 10000, and `on: false` turns it off. The catalog's lamps carry these fields when placed; `kelvin` and `on` need `lumens`. DXF and DWG exports draw lamps on the layer `E-LITE`, and IFC exports write them as light fixtures with their lights, whether they are on or off.
- `material` is one of `Generic`, `Brick`, `Concrete Block`, `Ceramic`, `Concrete`, `Lumber`, `Metal`, `Plywood`, `Steel`, `Wood` and `Glass`. A `Glass` wall is a wall of glass, as for a partition or a glazed facade: a pane down its middle in a metal frame, with a mullion at least every 3000 mm and beside each opening.

## Other sections

- `id`: the project's UUID, which keeps identifiers in exports stable. A file without one receives a new UUID when it opens.
- `info`: facts for title blocks and exports, each optional: `title`, `client`, `address` and `author` (text), `north`, the degrees counterclockwise from the plan's +y axis to true north (0), `latitude` and `longitude`, both or neither, the site's place in degrees with north and east positive, which set the sun in the 3D view on the clock of the place's time zone, daylight saving time included, and `grading`, `level` (the default) or `natural`, how the ground meets the house on the bottom floor (see spots above), `ground`, the ground finish that covers the site in 3D, such as `grass` (the default), `sand`, `desert-sand`, `dry-earth`, `rock`, `forest-floor`, `moss` or `fallen-leaves`, or `none` for no ground at all, as for an apartment; wild grass grows around the house only on `grass`, and `winter`, what winter brings to everything outdoors in the 3D view and in presentation plans when the sun's date falls in winter: `frost` (the default), `snow` on every face that looks up, or `mild` for neither. On `sand`, `desert-sand` and `dry-earth` lawns are dry all year and neither snow nor frost falls, whatever `winter` says; `rock` follows `winter`, so a mountain site can be snowy. Ground steeper than about 32° shows `scree`, and steeper than about 45° `rock`, whatever the cover. `banks`, `scree` or `rock`, covers the slopes of cut and fill instead of the ground cover, and `surroundings`, a ground finish, covers the ground beyond a closed plot; wild grass grows only where grass covers the ground and it is not that steep. `contourInterval` is the height between the terrain's contour lines in millimeters, from 10 to 100000; without it the plan picks 250, 500, 1000, 2000, 5000 or 10000 so that no more than about twenty lines span the range of heights. Every fifth contour is drawn thicker and labelled with its height. `mapOrigin` is where the plan lies on the map: `[east, north, height]` in millimeters, the map coordinates of the plan's origin at the bottom floor's level; the map's north is true north, so the plan lies on the map turned by `north`. `mapSystem` names the map's coordinate system, such as `EPSG:25832`. Survey imports place their points by them, a DXF or DWG export adds the user coordinate system `Map` in which the bottom floor's plan has its map coordinates, and an IFC export writes an `IfcMapConversion` to an `IfcProjectedCRS` named by `mapSystem` and gives the site the map height of the plan's origin as its reference elevation, and `latitude` and `longitude` as its reference latitude and longitude.
- `brief`: the answers the person gave when they started the project, which an assistant reads before it changes the plan. These fields are required: `floors` (1 to 3), `bedrooms` (0 to 8), `bathrooms` (1 to 4), `area`, the living area in square meters (30 to 1000), `kitchen`, `open` or `separate`, `office` (true or false), `roof`, one of the roof shapes, `plot`, `[width, depth]` in millimeters with the width along the street, `street`, the compass side the street runs along (`north`, `north-east`, … `north-west`), `site`, `flat`, `slope`, `water` or `survey`, where a surveyed site takes its ground from the spot heights of a survey on the bottom floor, `slope`, the fall in percent, and `downhill`, the compass side the ground falls toward and the water lies on, `patio`, `pool`, `beds` and `fence` (true or false), and `notes`, wishes in the person's own words. These may be left out: `parking`, `garage` for a garage built onto the house or `carport` for a carport beside it, none without it; `basement` (true or false, false without it), a floor under the ground floor; and `roofTerrace` (true or false, false without it), a terrace on a flat roof or on the garage's roof.
- `items`: the project's own furnishing items, described below.
- `cameras`: saved 3D views `{"name", "mode": "orbit" | "walk", "eye": [x, y, elevation], "target": [x, y, elevation]}`.
- `editor`: the editor's `settings`, `view` (`zoom`, `pan`) and `ui` layout. Each part, and each setting inside `settings`, may be left out; what is left out takes the default.
- `history`: present in downloaded files; `undo` and `redo` hold earlier states of `floors` in the same shape, oldest first. Where the project's own items changed along the history, `items` holds two lists of the same lengths, `undo` and `redo`, with the `items` of each state in the same shape, or `null` for a state whose items are those of the state after it, or of the project for the last state of each list.

### `items`

A project's own furnishing items, by key, which its furnishings use like catalog items. A key is lowercase letters, digits, `-` and `_`, starts with a letter or digit, and is not a key of the catalog. Each item has a `name`, an optional `category` (`Custom`) and `keywords` (none), an optional `mount`, `elevation`, `lumens`, `beam`, `up` and `kelvin`, and either `parts` or `children`. `mount` is `floor` (the default), `wall`, `ceiling` or `roof`: a new furnishing of a ceiling item hangs under the ceiling, one of a wall item snaps to walls in the editor, and one of a roof item stands on the highest roof of its floor under it, or on the floor where no roof is, and keeps to the roofs as it moves. `elevation` is the height of the underside of a new floor or wall furnishing (0), and of a roof furnishing above the roof; a ceiling item has none. `lumens` makes the item a lamp with that output, given off by its parts whose `look` is `glow`. Without a `beam` the light shines all round from the middle of those parts; `beam`, from 1 to 180 degrees, makes each glowing part a spotlight that shines in a cone of that angle along the part's own −z axis, which points down until the part turns, and at 180 a panel that lights the half space in front of it, as for an LED strip or a ceiling panel. `up`, from 1 to 179 degrees with a `beam` under 180, makes each glowing part also shine up in a cone of that angle along its own +z axis, as a shade open at its top and its bottom does; the light divides between the two cones by their size. `kelvin` is the color temperature that a new furnishing of the lamp takes (2700).

- `parts` are a shape's parts (see `Shape`). The item's size is the box around them, and at rotation 0 its back faces +y; a furnishing of the item stretches the parts to its own size.
- `children` combine other items, of the catalog or of the project, like a combined catalog item: `[{"furnishing": "chair", "x": 0, "y": 500, "angle": 180, "width": 450, "length": 500}]`, with `x`, `y` and `angle` (0), and `width` and `length` or `scale` (the item's own size), and `zIndex` (0), which orders the children in the plan.

```json
"items": {
  "ac-unit": {
    "name": "AC outdoor unit",
    "category": "Technical",
    "parts": [
      {"solid": "box", "size": [900, 350, 700], "color": "#e9ebec", "look": "metal"},
      {"solid": "cylinder", "at": [0, -176, 350], "rotation": [90, 0, 0], "radius": 260, "height": 4, "color": "#2b2f33"}
    ]
  }
}
```
