> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ploterr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tables and schedules

> Put a table of fixed text, or a door, window or room schedule that follows the model, on a sheet.

A sheet can hold a table. A `table` annotation holds fixed text. A `schedule` annotation lists the doors, the windows or the rooms of a building, or of one storey of it. Floorkit reads the model each time you export, so a schedule changes when the model changes.

## Before you start

You have a sheet from [Compose a sheet](https://docs.ploterr.com/floorkit/guides/compose-a-sheet.md). Positions and sizes are in millimetres on the page.

## Add a door schedule

```typescript theme={null}
import type { ScheduleAnnotation } from '@opengeometry/floorkit';

export const doorSchedule: ScheduleAnnotation = {
  id: 'door-schedule',
  kind: 'schedule',
  of: 'doors',
  buildingId: 'building',
  storeyId: 'ground',
  position: { x: 240, y: 20 },
  fontSize: 2.5,
};
```

The columns are the tag, the type, the width, the height, the sill and the storey. The tags are the same as the door tags of the plan: `D01`, `D02`, or the label of the door when it is a tag. Lengths are in millimetres.

A room schedule (`of: 'rooms'`) shows the number, the name, the area in square metres to 1 decimal, as the room label of the plan shows it, and the usage. To choose the columns, give `columns`, for example `[{ field: 'name' }, { field: 'area', title: 'm²' }]`.

## Add a table

```typescript theme={null}
import type { TableAnnotation } from '@opengeometry/floorkit';

export const legend: TableAnnotation = {
  id: 'legend',
  kind: 'table',
  position: { x: 240, y: 200 },
  columns: [
    { title: 'Code', widthMm: 15 },
    { title: 'Material', widthMm: 40 },
  ],
  rows: [
    ['C1', 'Concrete'],
    ['B1', 'Brick'],
  ],
  fontSize: 2.5,
};
```

Each row has one cell for each column.

## Rules

* A schedule that names a building or a storey that is not in the model is refused when the project opens, with the path of the field.
* The text is at least 1.8 mm high.
* Rows are in model order: the openings of each wall in wall order, then the free doors and windows, storey by storey. Rooms are in the order of the list, not sorted by number.
* Tags restart at `D01` and `W01` on each storey, as the plan tags do. A schedule of a whole building shows the same tag on several storeys; keep the `storey` column to tell them apart.
* A column with a `widthMm` keeps that width: a longer text runs past the cell, it is not cut.
* `exportProjectSheet` fills the schedules. A sheet editor shows a schedule only when its host gives `resolveSchedule` in the render dependencies; without it the schedule draws nothing.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.