# Zeplan : format de description d'un plan

Ce format décrit un logement (appartement, maison, studio) en quelques dizaines de lignes de JSON.
Zeplan en fait un vrai projet : murs partagés entre les pièces, façades porteuses, portes et
fenêtres posées sur le bon mur, surfaces, meubles, vue 3D.

## Repère et règles

- Les longueurs sont en **mètres**. `x` va vers l'est (la droite), `y` vers le sud (le bas). Le nord est en haut.
- Chaque pièce est un **rectangle** : `x`, `y` (son coin nord-ouest), `width` (sur x) et `depth` (sur y).
- Les pièces se touchent **bord à bord**, sans se chevaucher et sans laisser de vide entre elles : deux
  pièces voisines partagent un côté (au moins 60 cm en commun pour y mettre une porte).
- Une pièce en L se décrit par deux rectangles voisins reliés par une porte de type `passage`.
- Ne comptez pas l'épaisseur des murs : les dimensions sont prises dans l'axe des murs.
- Vérifiez vos additions : la largeur totale d'une rangée de pièces doit être la même d'une rangée à l'autre.

## Structure

```json
{
  "name": "Appartement T2",
  "levels": [
    {
      "name": "Rez-de-chaussée",
      "ceilingHeight": 2.5,
      "rooms": [
        {"id": "sejour", "name": "Séjour", "type": "living", "x": 0, "y": 0, "width": 5, "depth": 4},
        {"id": "cuisine", "name": "Cuisine", "type": "kitchen", "x": 5, "y": 0, "width": 3, "depth": 4},
        {"id": "chambre", "name": "Chambre", "type": "bedroom", "x": 0, "y": 4, "width": 4, "depth": 3.5},
        {"id": "sdb", "name": "Salle de bain", "type": "bathroom", "x": 4, "y": 4, "width": 2, "depth": 3.5},
        {"id": "entree", "name": "Entrée", "type": "hall", "x": 6, "y": 4, "width": 2, "depth": 3.5}
      ],
      "doors": [
        {"between": ["sejour", "cuisine"], "kind": "passage", "width": 1.2},
        {"between": ["sejour", "chambre"]},
        {"between": ["chambre", "sdb"]},
        {"between": ["cuisine", "entree"]},
        {"between": ["entree", "outside"], "side": "south"}
      ],
      "windows": [
        {"room": "sejour", "side": "north", "kind": "bay", "width": 2.4},
        {"room": "chambre", "side": "west"},
        {"room": "cuisine", "side": "east", "position": 0.3}
      ],
      "furniture": [
        {"item": "sofa3", "room": "sejour", "x": 2.5, "y": 3.4, "rotation": 180},
        {"item": "bed2", "room": "chambre", "x": 2, "y": 1.1}
      ]
    }
  ],
  "roof": {"kind": "gable", "pitch": 30},
  "outdoor": {"plotMargin": 8, "zones": [{"kind": "terrace", "x": 0, "y": -3, "width": 5, "depth": 3}]}
}
```

## Champs

**Plan** : `name` (obligatoire), `levels` (1 à 6, du rez-de-chaussée vers le haut), `roof`, `outdoor`,
`facadePaint` (couleur des façades : `white`, `linen`, `sand`, `ochre`, `terracotta`, `sage`, `forest`, `sky`,
`navy`, `blush`, `mustard`, `grey`, `charcoal`).

**Niveau** : `name`, `ceilingHeight` (2 à 5, 2.5 par défaut), `rooms` (1 à 60), `doors`, `windows`, `furniture`.
Les niveaux se superposent : gardez la même emprise et les mêmes coordonnées d'un niveau à l'autre.

**Pièce** : `id` (court, unique dans le niveau), `name`, `type`, `x`, `y`, `width`, `depth` (0,6 à 60), `floor`.
- `type` : `living` séjour, `kitchen` cuisine, `dining` salle à manger, `bedroom` chambre, `bathroom` salle de bain,
  `toilet` WC, `hall` entrée ou couloir, `office` bureau, `laundry` buanderie, `storage` cellier, `garage`,
  `terrace` terrasse, `balcony` balcon. Une terrasse ou un balcon est à l'air libre : ses bords extérieurs
  sont des garde-corps d'un mètre, et le toit ne le couvre pas. Un balcon se place à l'étage, contre la façade,
  en débord de l'emprise du rez-de-chaussée, relié à une pièce par une porte-fenêtre (`slidingDoor` ou `door`).
- `floor` (facultatif, sinon celui du type) : `oak`, `walnut`, `whitewood`, `tile-light`, `tile-grey`, `tile-slate`,
  `tomette` (tomettes en terre cuite), `concrete`, `carpet`, `terrace`, `grass`.

**Porte** : `between` (deux `id` de pièces ; `"outside"` pour dehors, avec `side`), `kind`, `width`, `position`.
- `kind` : `door` (83 cm, par défaut), `slidingDoor`, `garageDoor` (240 cm), `passage` (ouverture sans porte).
- `side` : `north`, `south`, `east`, `west`, côté de la pièce où poser une porte vers l'extérieur.
- `position` : de 0 à 1 le long du mur commun (0.5 par défaut).

**Fenêtre** : `room`, `side`, `kind`, `width`, `height`, `sill` (hauteur d'allège), `position`.
- `kind` : `window` (120×125 cm, par défaut), `fixedWindow`, `frenchWindow` (porte-fenêtre), `bay` (baie vitrée
  240 cm), `roundWindow`, `archedWindow`. Posez les fenêtres sur les façades, pas sur un mur entre deux pièces.

**Meuble** : `item` (identifiant du catalogue ci-dessous), `room`, `x`, `y` (centre du meuble, en mètres depuis le
coin nord-ouest de **sa pièce**), `rotation` (degrés, sens horaire ; à 0 le dos du meuble est au nord, à 90 à l'est,
à 180 au sud, à 270 à l'ouest). Un meuble adossé à un mur a son dos contre ce mur : contre le mur sud, `rotation` 180.
Laissez au moins 70 cm de passage et ne posez rien devant une porte.
Un objet de jardin (arbre, fontaine, pergola) se donne **sans** `room` : `x` et `y` sont alors dans le repère du plan.
Les volets (`p-volets`, pour une fenêtre de 1,20 m) se posent sur la face extérieure du mur : dans le repère de la
pièce, à 13 cm hors du mur (par exemple `y: -0.13` sur le mur nord, `rotation` 180 ; `y` = profondeur + 0.13 sur le
mur sud, `rotation` 0), au même `x` que le milieu de la fenêtre.

**Toit** : `kind` (`flat`, `gable` deux pans, `hip` quatre pans, `custom` pans au choix), `pitch` (5 à 60 degrés),
`attic` (combles aménagés), `cover` (`brown`, `terracotta`, `slate`, `zinc`, `green`). Avec `custom`, `sides` donne la
pente de chaque côté qui porte un pan, les autres étant des pignons : `{"south": 20}` est une monopente qui monte vers
le nord, `{"north": 35, "south": 35, "east": 35}` un toit à trois pans.

**Extérieur** : `plotMargin` (mètres de jardin autour de la maison), `zones` : `kind` (`terrace`, `paving`, `driveway`,
`gravel`, `lawn`, `flowerbed`, `pool`), `x`, `y`, `width`, `depth`, dans le même repère que le rez-de-chaussée
(les coordonnées négatives sont permises).

**Personnages** (dans un niveau, `people`) : `kind` (`man`, `woman`, `child`), `room` (facultatif), `x`, `y`,
`activity` (`stand` immobile, `walk` il suit `path` aller et retour, `play` il court en rond en sautillant),
`path` (liste d'étapes `[x, y]`), `rotation`. Sans `room`, les coordonnées sont celles du plan (jardin). Dans la vue
3D les personnages sont animés.

**Clôtures** (`outdoor.fences`) : `kind` (`garden` mur de jardin, `stoneLow` muret, `fence` clôture bois, `wireFence`
grillage, `hedge` haie), `points` (liste de sommets `[x, y]` dans le repère du plan), `closed` (vrai pour refermer le
tracé), `gates` : `kind` (`gate` portail de 3 m, `wicket` portillon de 1 m), `x`, `y` (un point du tracé de la clôture).

**Relief** (`outdoor.relief`, il faut un terrain) : `x`, `y`, `radius` (1 à 30 m), `height` (jusqu'à 8 m pour une butte,
négative jusqu'à −4 m pour un creux). Le terrain reste plat près de la maison et sous les zones.

**Clips** (`clips`, à la racine) : trajets de caméra du mode cinématique, que l'app lit et exporte en vidéo MP4.
Soit un clip tout fait : `{"name": "Tour", "preset": "orbit", "seconds": 20}` (`orbit` tour de la maison, `flyover`
survol, `walkthrough` visite des pièces à hauteur d'yeux). Soit des points de vue : `"views": [{"eye": [x, y, hauteur],
"target": [x, y, hauteur], "seconds": 3}, …]`, au moins deux, la caméra passant de l'un à l'autre en douceur.

## Catalogue des meubles et objets

- **Salon** : `sofa3` Canapé 3 places (210×88 cm), `k-sofaLong` Canapé méridienne (196×164 cm), `k-sofaCorner` Canapé d'angle (196×196 cm), `k-designSofa` Canapé design (224×82 cm), `k-designSofaCorner` Canapé design d'angle (270×270 cm), `armchair` Fauteuil (90×75 cm), `k-relax` Fauteuil relax (90×124 cm), `k-designChair` Fauteuil design (110×62 cm), `k-ottoman` Pouf (88×90 cm), `coffee` Table basse (110×67 cm), `k-coffeeSquare` Table basse carrée (80×80 cm), `k-coffeeGlass` Table basse en verre (110×67 cm), `tv` Meuble TV (160×50 cm), `k-tvDoors` Meuble TV à portes (160×52 cm), `k-television` Téléviseur (120×22 cm), `k-tvVintage` Téléviseur rétro (82×54 cm), `shelf` Bibliothèque (90×56 cm), `k-bookcaseLow` Bibliothèque basse (90×56 cm), `k-bookcaseClosed` Bibliothèque fermée (90×56 cm), `k-bookcaseWide` Bibliothèque large (160×50 cm), `k-sideTable` Console (107×44 cm), `rug` Tapis (240×141 cm), `k-rugRound` Tapis rond (160×160 cm), `k-rugSquare` Tapis carré (160×163 cm), `k-doormat` Paillasson (86×47 cm), `plant` Plante (50×57 cm), `k-lampFloor` Lampadaire (30×35 cm), `k-lampFloorSquare` Lampadaire carré (24×24 cm), `k-speaker` Enceinte (30×30 cm)
- **Chambre** : `bed2` Lit double (170×200 cm), `bed1` Lit simple (100×197 cm), `k-bedBunk` Lits superposés (100×192 cm), `nightstand` Chevet (50×40 cm), `k-nightstandDrawer` Chevet à tiroir (50×41 cm), `wardrobe` Armoire (100×62 cm), `dresser` Commode (107×44 cm), `k-pillow` Coussin (46×18 cm), `k-bear` Ours en peluche (50×32 cm)
- **Cuisine** : `counter` Meuble bas (60×63 cm), `k-cabinetDrawer` Meuble bas à tiroirs (60×63 cm), `k-cabinetCorner` Meuble bas d'angle (65×65 cm), `k-cabinetUpper` Meuble haut (60×31 cm), `k-cabinetUpperDouble` Meuble haut double (60×31 cm), `sink` Évier (60×63 cm), `hob` Plaque de cuisson (60×63 cm), `k-stove` Cuisinière à gaz (60×63 cm), `k-hood` Hotte (60×40 cm), `fridge` Réfrigérateur (60×41 cm), `k-fridgeLarge` Réfrigérateur américain (90×70 cm), `k-fridgeSmall` Petit réfrigérateur (60×41 cm), `island` Bar (120×59 cm), `k-microwave` Micro-ondes (50×40 cm), `k-coffeeMachine` Machine à café (30×38 cm), `k-toaster` Grille-pain (30×16 cm), `k-blender` Blender (20×16 cm), `k-trashcan` Poubelle (35×39 cm)
- **Salle à manger** : `table` Table à manger (180×96 cm), `k-tableCloth` Table nappée (180×96 cm), `k-tableRound` Table ronde (120×139 cm), `k-tableGlass` Table en verre (180×96 cm), `k-tableCross` Table à pieds croisés (180×95 cm), `chair` Chaise (45×45 cm), `k-chairCushion` Chaise à coussin (45×45 cm), `k-chairRounded` Chaise arrondie (45×45 cm), `k-chairModern` Chaise moderne (45×45 cm), `k-stool` Tabouret de bar (42×36 cm), `k-stoolSquare` Tabouret carré (35×34 cm), `k-bench` Banc (100×50 cm), `k-benchCushion` Banc à coussin (100×50 cm)
- **Salle de bain** : `bath` Baignoire (170×80 cm), `shower` Douche (90×93 cm), `k-showerRound` Douche d'angle (90×90 cm), `basin` Lavabo (60×51 cm), `k-basinSquare` Meuble vasque (80×56 cm), `k-bathCabinet` Meuble de salle de bain (80×60 cm), `k-mirror` Miroir (60×29 cm), `toilet` WC (38×58 cm), `k-toiletSquare` WC carré (38×48 cm), `washer` Lave-linge (60×60 cm), `k-dryer` Sèche-linge (60×58 cm), `k-washerDryer` Colonne lave-linge et sèche-linge (60×60 cm)
- **Bureau** : `desk` Bureau (140×75 cm), `k-deskCorner` Bureau d'angle (180×180 cm), `officechair` Chaise de bureau (62×58 cm), `k-screen` Écran (60×16 cm), `k-laptop` Ordinateur portable (36×33 cm), `k-keyboard` Clavier (44×18 cm)
- **Décoration** : `k-books` Livres (30×19 cm), `k-lampTable` Lampe à poser (30×35 cm), `k-lampWall` Applique (45×30 cm), `k-lampCeiling` Suspension (24×24 cm), `k-ceilingFan` Ventilateur de plafond (120×139 cm), `k-coatRack` Portemanteau (55×55 cm), `k-coatRackWall` Patère (90×27 cm), `k-plantSmall` Petite plante (20×20 cm), `k-radio` Radio (40×12 cm), `k-boxClosed` Carton (42×42 cm), `k-boxOpen` Carton ouvert (74×42 cm), `p-volets` Volets (244×5 cm)
- **Structure** : `stairs` Escalier droit (365×158 cm), `k-stairsOpen` Escalier ajouré (365×158 cm), `k-stairsCorner` Escalier d'angle (355×285 cm), `post` Poteau (20×20 cm), `beam` Poutre (300×20 cm), `fireplace` Cheminée (120×50 cm)
- **Extérieur** : `k-tree` Arbre (280×242 cm), `k-treeOak` Chêne (320×370 cm), `k-treeDetailed` Grand arbre (400×360 cm), `k-treeFat` Arbre boule (260×225 cm), `k-treeTall` Peuplier (160×185 cm), `k-treeThin` Bouleau (240×217 cm), `k-treeSmall` Arbuste (100×115 cm), `k-treeCone` Cyprès (140×140 cm), `k-treeFall` Arbre d'automne (280×242 cm), `k-pine` Sapin (220×254 cm), `k-pineTall` Grand sapin (160×162 cm), `k-pineSmall` Petit sapin (130×130 cm), `k-palmTall` Palmier (300×300 cm), `k-palmShort` Petit palmier (220×220 cm), `k-bush` Buisson (100×100 cm), `k-bushLarge` Gros buisson (140×126 cm), `k-bushSmall` Petit buisson (70×61 cm), `k-bushDetailed` Massif d'arbustes (160×160 cm), `k-flowerRed` Fleurs rouges (40×46 cm), `k-flowerYellow` Fleurs jaunes (40×46 cm), `k-flowerPurple` Fleurs violettes (40×46 cm), `k-grass` Touffe d'herbe (60×60 cm), `k-rockLarge` Rocher (140×181 cm), `k-rockSmall` Pierre (50×50 cm), `k-rockFlat` Pas japonais (60×52 cm), `k-potLarge` Jardinière (90×78 cm), `k-potSmall` Pot (45×39 cm), `k-fence` Barrière basse (200×14 cm), `k-fencePlanks` Palissade basse (200×19 cm), `k-gate` Portillon (160×11 cm), `k-firepit` Foyer (110×105 cm), `k-stump` Souche (60×69 cm), `k-column` Colonne (50×50 cm), `p-olivier` Olivier (287×233 cm), `p-lavande` Lavande (62×59 cm), `p-jarre` Jarre en terre cuite (60×60 cm), `p-fontaine` Fontaine (180×180 cm), `p-pergola` Pergola (360×350 cm), `p-banc` Banc de pierre (160×46 cm), `p-table` Table bistrot (70×70 cm), `gardentable` Table de jardin (160×90 cm), `lounger` Bain de soleil (70×190 cm), `car` Voiture (180×430 cm)

## Conseils

- Dimensions courantes : chambre 9 à 14 m², séjour 20 à 35 m², cuisine 8 à 12 m², salle de bain 4 à 6 m²,
  WC 1 × 1,6 m, couloir 1 à 1,2 m de large.
- Chaque pièce doit avoir une porte. L'entrée donne dehors. Les pièces de vie ont une fenêtre.
- Le serveur vérifie le plan et renvoie ses surfaces et ses avertissements : corrigez et renvoyez si besoin.
