discontinuedPackage jet_cad_floor_plan has been discontinued and replaced by jet_cad_2d_plan.

editor library

Classes

ArcShape
A counter-clockwise arc from start through sweep (radians).
AttachedEnd
A wall end point (spec 11 D2, decision 4): wall wall's end k (0 its start, 1 its end) on side, looking from the wall's start to its end. It stores no coordinate: its point is read from the wall (wallEndPoint), and the dimension group's transform never touches it (decision 12).
BoxParams
The demo parametric object's parameters (spec 06 D13), in mm.
BoxTool
Spec 06 D13: two opposite corners, world-axis aligned, committed as a parametric box — a group at the lower-left corner carrying BoxParams. The expander generates its lines. Fill does not apply.
BoxType
A rectangle whose outline loses what lies strictly inside any overlapping box: overlapping boxes read as one outline, the wall clean-up preview (spec 06 D13).
CircleShape
DerivedFlag
A flag computed from other state: value is compute's answer at the moment it is read, and listeners hear when that answer changes.
DimEnd
One end of a dimension (spec 11 D2, decision 1): a wall end point it follows, or a fixed point. Value-equal, exactly (stored values, CLAUDE.md).
DimensionGrips
A dimension's grips (spec 11 D13), through the render layer's object grip seam. Every coordinate is world, and every grip is a stretch grip, so it is hit and dragged only while components and geometry are allowed (07 OG5). The ordinals (R-26):
DimensionParams
A dimension's parameters (spec 11 D2), in its group's local space:
DimensionTool
Spec 11 D12: the Dimension tool (I). A PlacementTool of three clicks per dimension (decision 9), not chained (R-25): after the commit it waits for a new first click, as 10's Separator tool.
DimensionType
The dimension (spec 11 D3, D7).
DocumentToolbar
The toolbar at the left of the top bar (spec 12a D7): one icon button per command of the table (D6), keyed toolbar-<id>, with the command's tooltip, disabled while the command is. The file commands come first, then a gap, then Undo and Redo. A bare shell has no file commands and shows Undo and Redo only. DocumentToolbar.groups lays out any run of groups the same way (host embedding API spec C-2): a gap between two groups that both show a button.
End
One wall end seen from its joint, looking outward along the wall: a points away from the end's point into the wall's body.
ExportChoice
The dialog's answer: the format and, for a PNG, the resolution. A PDF keeps the last resolution chosen, so switching back to PNG shows it.
ExportFontCache
The font's bytes, read on first use and then held for the app's lifetime (spec 13 D7: "once per app"). A failed read is not held: the next bytes reads again.
FaceRun
A straight piece of a wall face a symbol can stand against, in world space (spec 09c D3).
FixedEnd
A fixed point (spec 11 D2, R-1) in the dimension group's local space, so it moves and rotates with the group (decision 12).
Free
No joint: the end is square at its own endpoint.
FurnitureShape
One drawn shape of a symbol.
FurnitureSymbol
One symbol of the library.
GhostMatrix
The ghost's reused matrix (spec 09b D6, 09c D5): the placement transform P is handed in by the tool, which computes it on pointer, key, camera and re-arm events (spec 09c D12); its linear part is written only when one of its six doubles differs from the last (update); a paint (forOrigin) writes only the translation less the rebase origin.
HostFrame
A host wall seen from its own group-local space (spec 08 D7).
InstanceStyle
The instance fields a placement imposes on the symbol's BYBLOCK contents. The defaults are InstanceNode's own.
Joint
How one wall end is capped (spec 07 D4).
LayerPanel
The Layers section (spec 12b D9): a collapsible list of every layer of document, one LayerRow each, with + and delete below.
LayerPanelState
LayerPicker
Spec 12b D12: the Selection section's layer menu. It shows the selection's common layer (layerOfKey), or the strings' mixed; choosing a layer dispatches layerMoveCommand's one command, built from the document and the selection as they are at the choice, not at the last build.
LayerRow
One layer of the Layers panel (spec 12b D9): the current-layer mark, the eye, the lock, the colour swatch and its menu, and the name, which a double-click turns into an inline field.
LineShape
NodeJoint
The end meets other ends at a node (spec 07 D4.2, D5).
ObjectGrips
The shell's one object grip provider (spec 08 D16): it dispatches by the type that names the group's object (_of).
OpeningGrips
An opening's slide grip (spec 08 D16, D15), through the render layer's object grip seam.
OpeningParams
An opening's parameters (spec 08 D6), in mm.
OpeningSettings
An opening tool's settings (spec 08 D14, Ruling 08-17): the width of the next opening, in mm. The shell owns one per kind; the Selection panel's Opening section edits the active tool's.
OpeningTool
Spec 08 D14: the Door (D), Window (N) and Gap (G) tools, one class and three instances. A PlacementTool whose first click commits one opening; the tool stays active, so a run of doors is a run of clicks, and Escape (with nothing pending, ever) returns to the select tool.
OpeningType
The opening (spec 08 D1, D10): its own root-level group, at the identity like a wall, referencing its host.
PagePanel
The smallest panel that lets a human change the page (spec D12). Every control executes one SetComponentCommand; the panel rebuilds from the notifier, so undo moves the controls back. 12 replaces this.
PagePanelState
Public for the shell's settle (spec 12a D2): resyncScale.
PagePrinter
Hands a finished PDF to a print dialog.
PaletteEntry
One palette row and its shortcut (spec 05 D5).
PanelFieldFocusNode
The focus node of a text field in the shell's right-hand panels: the Selection panel's fields and the Page panel's scale.
PlaceSource
What traceRoomAmong traces among (spec 10 D7): the live walls and separators, by place box. RoomInputs (the document adapter) and placeSourceInView (the view's) implement it.
PlannerShell
Owns the index, the camera and -- since 03 -- the outline cache and the grip cache for the document's lifetime; since 05, the tools and the Fill toggle. It lays out the chrome slots.
PlannerTextKeys
Slice 4, Task 7 finding 1: the text fields inside the view keep their keys from a host's bindings above it, in both modes.
PlannerView
The rulers around the drawing area: a RulerFrame whose child is a CameraGestureDetector over the page chrome, the DraftCanvas and the selection overlay, with -- since 05 -- the text tool's inline field painted above it. Without rulers (the selection mode) the drawing area stands alone.
PolylineShape
A polyline through points (x, y pairs); closed repeats the first point.
PrintingPagePrinter
The platform's print dialog through the printing package: the system dialog on macOS, the browser's on the web.
RoomGrips
A room's label grip (spec 10 D21, S-10, R-22, R-26), through the render layer's object grip seam. Every step is in a named frame: _w world, _l the room group's local space.
RoomInput
One input to the tracer (spec 10 D4): a wall's uncut band, closed, or a separator's segment, open, in world, tagged with its source handle.
RoomInputs
The trace inputs of a whole document, for the Room and Separator tools and the separator grips (spec 10 D4, D19-D21; Ruling 10-11): the document adapter. The shell owns one instance and hands it to all three.
RoomOccupied
The Room tool's notice (spec 10 D19; spec 14d L5): the hovered face already holds the room named name.
RoomParams
A room's parameters (spec 10 D2), in the room group's local space, mm.
RoomTool
Spec 10 D19: the Room tool (M). A PlacementTool whose one click commits one room; it stays active, and Escape (with nothing pending, ever) returns to the select tool.
RoomType
The room (spec 10 D2, D9-D11, D14-D16, D22).
SeatingComponent
How many people a servable symbol seats (spec 14 S1, R-1, R-2).
SeedInWall
The seed lies inside source's band, or within roomTrace.linear of one of its edges or of its separator's segment. When several inputs hold the seed, source is the lowest handle among them (Ruling 10-7).
SelectionPanel
Spec 06 D13, 07 D11, 08 D16 and 10 D21: the right panel's parametric sections.
SeparatorGrips
A separator's end grips (spec 10 D21, D20), through the render layer's object grip seam.
SeparatorParams
A room separator's parameters (spec 10 D3): both ends in group-local space, in mm. A free two-point line that splits a face as a zero-thickness wall would.
SeparatorTool
Spec 10 D20: the Separator tool (S). A PlacementTool of two clicks per separator, not chained (R-20): after the second click it waits for a new first click. Escape cancels a pending start, then returns to the select tool.
SeparatorType
The room separator (spec 10 D3): one dashed open polyline, and an input to rooms (its world segment, D4).
ShellCommand
One command of the shell (spec 12a D6): New, Open, Open sample, Save, Save As, Export, Print (spec 13 D8, D9), Undo, Redo.
ShellShortcutGuard
Spec 05 D9 and Ruling 05-8.
SymbolBox
The local box of a symbol: left = minX, right = maxX, front = minY, back = maxY in the definition's coordinates.
SymbolComponent
A symbol's identity and display data, attached to a definition's handle (spec 09 D3, R-2): a stable key (lower-case dotted, e.g. bed.double), the display name, a category, tags and an integer version. The same key and version is reused by a placement, a different version is copied beside it (decision 8).
SymbolEntry
One symbol of a library: its identity (the SymbolComponent fields), its definition and a snapshot of its leaves, ascending by handle so draw order is preserved when a placement copies them (spec D6).
SymbolLibrary
A validated set of SymbolEntrys, in definition-handle order.
SymbolLibraryFailed
The load ended in error: a missing asset, bytes the codec cannot read, a SymbolLibraryError, or any other throw.
SymbolLibraryLoader
Loads the symbol libraries once and holds their SymbolLibraryState.
SymbolLibraryLoading
The bytes are being read or decoded (also the state before the first load and during a retry).
SymbolLibraryReady
The library was read and validated.
SymbolLibrarySource
One library the loader reads (spec 14 V-4): a name its errors use and a reader of its bytes. A host adds its own beside the planner's furnitureSymbolSource.
SymbolLibraryState
Where the app's one load of the bundled symbol library stands.
SymbolMoveResolver
The shell's MoveResolver (D8) over its faces and its library.
SymbolPanel
Spec 09b D7: the Symbols tab.
SymbolPlaceTool
Spec 09b D6: places the armed symbol on release.
TableDiagnosticCodes
The codes TableSurvey.diagnostics raises.
TableInfo
One table (T1, T15).
TableLabelEdit
An edit and the derived commands it makes necessary: inner applies, then, per touched handle in touched's order, a table whose label no longer matches tableLabelStamp for its transform is re-stamped (T12), by exact == on the stored values. A deleted table's host data is not among them: RemoveNodeCommand takes it (node-components D-1). All or nothing; undo restores the stamps and the edit. Created only by TableLabelSystem, once per execute.
TableLabelSystem
Stacks on the dispatcher's one expander slot (spec 06 D2, 14a F-1): install keeps the expander it found (the parametric system's, or none) and wraps what that one returns; dispose puts it back.
TableSurvey
The tables and the servable instances that are not tables, in one pass.
Tee
The end butts through's near face (spec 07 D4.1).
TextEntryOverlay
Spec 05 D9: the inline field for TextTool.
Tint
tintOf's answer: which form of D9's fallback chain the tint takes, its ring, and the holes the keyhole could not bridge.
ToolPalette
Spec 05 D5, D13: the tools and the Fill toggle, in the left panel.
Traced
The seed's face (spec 10 D5, D6): its outer ring and its holes, the inputs that carry each of their edges, and their areas.
TraceResult
What traceRoom found for a seed.
Unbounded
No bounded face holds the seed: the walls and separators do not close around it.
WallBands
The walls' bands, cached for the tools that look for a wall under the pointer on every move (spec 07 D11; spec 08 D14, Ruling 08-11): the Wall tool, which joins a band it is clicked in, and the Door, Window and Gap tools, which find their host with hostAt. The shell owns one instance and hands it to all four.
WallFaces
The shell-owned cache of the face runs and their neighbours (spec 09c D3, D4, S-8), shared by the placement tool (D6) and the move resolver (D8).
WallGrips
A wall's end grips (spec 07 D11), through the render layer's object grip seam.
WallParams
A wall's parameters (spec 07 D2): both centreline endpoints in group-local space, the thickness and the justification, in mm.
WallSettings
The Wall tool's settings (spec 07 D11): what the next wall is drawn with. The shell owns them; the Selection panel's Wall section edits them while the tool is active.
WallTool
Spec 07 D11, Ruling 07-1: a chain of walls, like AutoCAD's LINE.
WallType
The wall (spec 07 D3, D4, D12): a region (the outline and its fill) and the centreline, regenerated from its own parameters and its wall neighbours'.
WorldWall
A wall in world space: what every joint computation reads (spec 07 D4).

Enums

DimKind
What a dimension measures along (spec 11 D6, decision 2): the true distance between its two points, or their distance along its group's local x (horizontal) or local y (vertical) (decision 17).
ExportFormat
What an export writes (spec 13 D8).
FaceSide
Which of a wall's two faces a run lies on: the wall's frame's (local) sides (HostFrame.n is the left normal), not the world's. Under a mirrored group the frame's left face is on the world's right.
HingeEnd
Which jamb a door hangs on, seen along the host from start to end (spec 08 D6).
Justification
Which side of the centreline a wall's body lies on, looking from start to end (spec 07 D2).
OpeningKind
What an opening is (spec 08 D6), fixed at creation.
SwingSide
Which face of the host a door's leaf swings out of, looking from start to end (spec 08 D6; 07 D2's left and right).
TableNumberProblem
Why a text is not a table number (T4), as a value a UI words (spec 14d L6).
WallSide
Which of a wall end's three points (spec 11 D4, decision 4): the left face, the centreline or the right face, looking from the wall's start to its end.

Constants

againstWallTag → const String
The tag a symbol stands against a wall by (spec 09c D2): it attaches to a wall's face when placed near one.
bathroom → const String
bedRoom → const String
dimAttach → const Tolerance
Every attach decision of a dimension (spec 11 D10): a candidate is a wall end point within linear mm of the resolved point, Euclidean, and decision 19's parallel band is angular wide. Absolute, in mm, like wallJoin: the snapped point is the stored local ring mapped to world, the attach point is computed in world, and they differ by rounding only, worst 4.3e-7 mm at +1e9 mm turned 23° in own groups (the spike's Q3a). Nothing a person draws is 1e-5 mm apart. Stored values are still compared with exact ==.
dimFormat → const Tolerance
Every rounding and reading decision of a dimension's value and text (spec 11 D8, D9): a value within linear mm (one wallJoin.linear) of a rounding half is on it and rounds up, and a unit direction whose |x| is at most angular is vertical.
dining → const String
familyTagPrefix → const String
The prefix of a symbol's size-family tag, family:<id> (spec 09c D2, D9). A symbol carries one at most (R03d).
furnitureSymbolSource → const SymbolLibrarySource
The planner's own furniture library, read through rootBundle.
kAttachRingPixels → const double
An attach ring's radius, screen pixels (spec 11 D12, R-24).
kCertificateMargin → const double
D7's certificate margin, mm (R-7): 10⁶ × roomTrace.linear, far above any rounding, so no vertex merge or split reaches across it.
kDashedLinetypeRecord → const LinetypeRecord
The DASHED linetype a separator draws with (spec 10 D3, R-4; Ruling 10-14), on ReservedHandles.dashedLinetype.
kDimExtGapPaperMm → const double
g, from the measured point to the extension line's start, paper mm (D7).
kDimExtOvershootPaperMm → const double
v, the extension line past the dimension line, paper mm (D7).
kDimLineweight → const int
The five LINEs' lineweight, 0.25 mm (spec 11 D7, decision 20; R-31: it survives the rasteriser at a display's device pixel ratio).
kDimMaxValueMm → const double
The largest value, mm, a dimension lays out (spec 11 D9, D15): 1e15 mm, 1e9 km. Above it layoutDimension gives null and the dimension is dimension.broken, as for a value that is not finite.
kDimSlashPaperMm → const double
A slash's whole length, paper mm (D7).
kDimTextGapPaperMm → const double
From the dimension line to the text's bottom, paper mm (D8, R-12).
kDimTextPaperMm → const double
The text's cap height, paper mm (spec 11 D8, R-10).
kExportFontAsset → const String
The bundled font's asset key: the package's lib/fonts/ file, declared under assets: in its pubspec.yaml, so every host has it. It lives under lib/ so a host can also declare the bare family Roboto from it (packages/jet_cad_floor_plan/fonts/Roboto-Regular.ttf), as apps/floor_planner does (spec 14 V-11, review F-1); either way ensureFloorPlanFonts registers Roboto from these bytes.
kExportFontLicenceAsset → const String
The font's licence text (declared under assets: in the package's pubspec.yaml).
kFloorPlanFontFamily → const String
The family documents name and the planner registers.
kFurnitureLibraryAsset → const String
The bundled library's asset key: the package's own asset (declared in its pubspec.yaml), read under its packages/ key (spec 14 V-10).
kGhostCrossPixels → const double
The half-size of the ghost's base-point cross, in screen pixels.
kGrowthStart → const double
D7's first growth radius, mm (R-7): a room is metres across, so one or two doublings find its walls.
kitchen → const String
kLayerColours → const List<int>
The colours a layer may be given (spec 12b decision 6): ACI 1-9. Their names are FloorPlanStrings.colourName's, in the UI's language.
kLayerListVisibleRows → const int
How many rows the list shows before it scrolls (spec 12b D9: "about six"), so the page panel below keeps its room.
kLayerRowHeight → const double
A row's height: the list's cap is a multiple of it.
kMaxScale → const double
kMinScale → const double
Zoom bounds for the product camera, in logical pixels per world unit (millimetre). Spec D4; checked against this document in startup_plan_test.dart.
kPageCommandIds → const Set<String>
The file commands that need the document's page (spec 13 D8, D9): the shell enables them only while it has one, besides idle.
kPlanHeight → const double
kPlanOriginX → const double
The flat's outer wall corner, and its outer size.
kPlanOriginY → const double
kPlanWidth → const double
kRoomAreaPaperMm → const double
The area label's height on paper, mm (spec 10 D11, decision 7).
kRoomColorTransparency → const int
A coloured room's tint transparency (plan colours spec PC-3): 204 of 255, alpha 51, 20 %.
kRoomLineOffset → const double
Each label line sits this many of its own heights above (the name) or below (the area) the anchor, in world directions (spec 10 D10): a gap of 0.2 · (h_name + h_area) between the two.
kRoomNamePaperMm → const double
The name label's height on paper, mm (spec 10 D11, decision 7).
kRoomReadMargin → const double
How far a room's read box reaches past its stored points and its seed, mm (spec 10 D16, R-7): twice D7's certificate margin, so rounding in the local-to-world map of the stored tint cannot put box(F) ⊕ m outside it.
kRoomTintColor → const DraftColor
The tint's colour (spec 10 D9, R-8): ACI 7, the foreground, black on White, Ivory and Grey paper and white on Blueprint, resolved at paint time. Explicit, not ByLayer, so a change to layer 0's colour does not recolour tints.
kRoomTintTransparency → const int
The tint's transparency (spec 10 D9, decision 28): 229 of 255, alpha 26, about 10%.
kRotationStepsPerDegree → const double
The Rotation field's display steps per degree: it shows a rotation rounded to a millionth of a degree, and a typed value within one step of the current rotation is the shown value committed again, not a turn. A property of the field's text, not a geometric tolerance.
kShellLetterKeys → const List<LogicalKeyboardKey>
The shell's single-letter tool shortcuts (spec 05 D5).
kSlit → const double
The width of the tint's slit to each hole, mm (spec 10 D9, R-11): the engine's triangulator refuses an exact keyhole, whose bridge is two coincident edges (the spike's Q5, M-slit).
kSymbolPlacementNeeds → const List<Capability>
The capabilities a placement needs (spec D6); the gallery is enabled only when the document allows all of them (D7).
kTableLabelMaxHeight → const double
The label's height on a top of 500 mm and more, in drawing units (T8).
kTableLabelTag → const String
The tag of the ATTRIB that holds a table's number (T2).
kTableLabelTopShare → const double
The share of the top's smaller side a label may take (T8).
kTableNumberMaxLength → const int
A number's longest length, in UTF-16 code units (T4).
kTextEntrySize → const Size
Ruling 05-11: the field's size. Its bottom-left sits at the insertion point's screen position.
kWallAttachPixels → const double
Spec 09c D4, D6: how near a wall face, in screen pixels, the raw pointer attaches a tagged symbol. Larger than the snap aperture: in placement the pointer is often the symbol's centre, far from its back.
kWallColor → const DraftColor
Every wall child's colour (spec 07 D3): a black band, fill, outline and centreline alike, on every paper. Concrete, not ByLayer. When 07 landed, layer 0's ACI 7 resolved to white (aciToRgb(7)) and a ByLayer band was paper-white. Since fix/post-07 the shell's resolver draws ACI 7 in a foreground that follows the paper, black on a light one and white on Blueprint, so ByLayer drafting follows the paper and a ByLayer wall would too. Walls stay black on the human's decision: a concrete colour does not depend on the resolver, so on Blueprint a wall is black while drafting is white.
kWallMaxThickness → const double
The thickest wall the Selection panel and the Wall tool accept, in mm: 1e7 (10 km), far past any floor plan (spec 07 D11, fix/post-11).
livingRoom → const String
mitreLimit → const double
A wedge corner farther than this many half-thicknesses of the thicker wall from the node is clamped (spec 07 D6).
office → const String
roomTrace → const Tolerance
Every geometric decision of the room tracer (spec 10 D5, R-6): two points within Tolerance.linear are one vertex, a segment no longer than it is dropped (and a separator no longer than it is degenerate, D3), and two directions within Tolerance.angular are parallel.
wallJoin → const Tolerance
Every "do these join" decision for walls (spec 07 D7): endpoint coincidence, a point on a centreline, parallel faces. Absolute, in mm.

Properties

debugDimensionGenerates ↔ int
Every DimensionType.generate call, summed (spec 11 D3). Never reset by the library.
getter/setter pair
debugLineTestPasses ↔ int
How many walls have passed attachCandidates' line test, ever. For tests only, which read the difference across a call (TL8: a hover inside a wall's band passes none); a plain counter, as 10's debugTracedSegments (the plan's Ruling 11-2).
getter/setter pair
debugRoomGenerates ↔ int
Every RoomType.generate call, summed (Ruling 10-19): RK2 prints its delta per edit as "rooms rebuilt". Never reset by the library.
getter/setter pair
debugTintFailedSteps ↔ Set<int>?
The tint steps (1 or 2) a room's tint builder treats as failing to triangulate (Ruling 10-16). Honest rooms reach D9's steps 2 and 3 (RG2 has both); the seam exists to exercise the room's local-frame triangulation guard (_storedTint), which no honest fixture reaches: RG2 and DG3 set it. Null in the library, which never sets it; tests restore it to null in tearDown.
getter/setter pair
debugTracedSegments ↔ int
The segments every traceRoom call has taken in (step 3 of spec 10 D5, after the short ones are dropped), summed: the tracer's cost for tests that pin it (D7's counter). Never reset by the library.
getter/setter pair
debugWallPointComputations ↔ int
How many times attachCandidates computed a wall's six points (one wallsInDocument and wallEndPoints each), ever. For tests only, which read the difference across calls (TL8: with a memo, a wall's points are computed once per generation); a plain counter, as debugLineTestPasses.
getter/setter pair
furnitureCatalog → List<FurnitureSymbol>
The catalog, in the order the library stores it: definition handles and leaf handles ascend in this order.
final
kDimTextAttrs → int
The value's justification: bottom-centre, so the text sits centred above the dimension line (spec 11 D7, decision 8).
final
kExportChords → List<SingleActivator>
Export: Meta+E, Ctrl+E (spec 13 D8).
final
kFileChords → List<SingleActivator>
Every file command's chord: what the app binds a second time above the Navigator, consume-only (spec 12a D6, U-3, R-10). Export's and Print's join them (spec 13 D8, R-8): with a dialog up, Ctrl+P must not reach the browser's own print.
final
kNewChords → List<SingleActivator>
New: Meta+N, Ctrl+N.
final
kOpenChords → List<SingleActivator>
Open: Meta+O, Ctrl+O.
final
kPrintChords → List<SingleActivator>
Print: Meta+P, Ctrl+P (spec 13 D9). Bare P is the Polyline tool's letter; the chord is not.
final
kRedoChords → List<SingleActivator>
Redo: Meta+Shift+Z, Ctrl+Shift+Z, and Ctrl+Y.
final
kRoomLabelAttrs → int
Both labels' justification, centre and middle (spec 10 D9, Ruling 10-14): TextJustifyH.centre, not DXF's other "middle".
final
kSaveAsChords → List<SingleActivator>
Save As: Meta+Shift+S, Ctrl+Shift+S.
final
kSaveChords → List<SingleActivator>
Save: Meta+S, Ctrl+S.
final
kTableLabelTextAttrs → int
textAttrs of every table label: centred on its anchor both ways, the width factor its own (bit 8), so a mirror can be undone by −1.
final
kUndoChords → List<SingleActivator>
Undo: Meta+Z, Ctrl+Z.
final
parametricCatalog → ParametricCatalog
The floor planner's parametric types (spec 07 D1, 08 D1, 10 D1, 11 D1): the Box, the Wall, the Opening, the room Separator, the Room and the Dimension. A box and a wall may be neighbours; each type's generate ignores the other's parameters. An opening is nobody's neighbour: it relates to its host wall by reference (08 D2). A separator and a room are nobody's neighbours either (their reach is empty, 10 D2, D3): walls and separators contribute places, and rooms read them (10 D16). A dimension is nobody's neighbour either (11 D3): it relates to the walls it measures by reference.
final

Functions

addTableLabelCommand(DraftDocument doc, {required Handle instance, required Handle definition, required Transform2 placement, required String number}) → AddEntityCommand
The command that adds number as the label of instance, an instance of definition placed by placement (T13, T14). Allocates one handle.
attachCandidates(DraftDocument doc, SpatialIndex index, Vector2 q, {required bool objectSnap, required double thickest, Map<Handle, WallPoints>? points}) → List<AttachedEnd>
The attach candidates at world point q (spec 11 D10, R-16; decision 23; S-13): every (W, k, side) of a live wall W whose point (wallEndPoint, among every other live wall: wallsInDocument) lies within dimAttach.linear of q, Euclidean. Ascending by wall handle, then k, then side (left, centre, right).
attachToWall(List<FaceRun> runs, SymbolBox box, Vector2 p, double captureWorld, {required bool mirrored, required List<List<FaceNeighbour>> neighbours, required double edgeCaptureWorld, Handle? exclude, Transform2? keep}) → WallAttachment?
The one attachment rule (spec 09c D4): where a symbol whose local box is box stands against one of runs for the anchor point p (the raw pointer in placement, D6; the plain-moved back-centre in a move, D8), or null when no run takes it.
boxOfDefinition(DraftDocument doc, Handle definition) → SymbolBox?
The local box of the definition definition in doc, from its live leaves (the entities it owns); null when definition names no definition or none of its leaves draws.
boxOfEntry(SymbolEntry entry) → SymbolBox?
The local box of entry, computed on the first call and the same object on every later call for the same entry (spec D2: once per entry).
boxOfLeaves(Iterable<(EntityKind, GeometryPayload)> leaves) → SymbolBox?
The local box of leaves (each a kind and its payload, in the definition's coordinates), or null when none of them draws.
buildFurnitureLibrary() → DraftDocument
The furniture library: buildSymbolLibrary over furnitureCatalog.
buildSymbolLibrary(List<FurnitureSymbol> catalog) → DraftDocument
The document holding every symbol of catalog as a definition with its leaves (spec 14 V-3: any catalog, the furniture one or a host's). Deterministic: handles ascend in catalog order (a definition, then its leaves, then the next definition), so two builds encode to identical bytes. A servable symbol's definition also carries its SeatingComponent (spec 14 S2), set right after its SymbolComponent.
cap(End me, Joint joint) → Cap
The cap of me under joint.
capsOf(WorldWall w, List<WorldWall> others) → ({List<Vector2> endCap, bool fellBack, List<Vector2> startCap})?
outline's two caps kept apart (spec 08 D7), in world space: the end cap, from the wall's right face to its left face, and the start cap, from its left face to its right face — [...endCap, ...startCap] is outline's ring before it is simplified. When that ring is not simple and anticlockwise, both caps are the free caps and fellBack is true, as outline's fallback. Null for a degenerate wall (07 D2).
centrelinePieces(HostFrame f, List<(double, double)> merged) → List<List<Vector2>>
One open two-point centreline per piece piecesOf keeps, in the same order (spec 08 D9, decision 16): the start piece's from u = 0 (the stored start) to a₀, a middle piece's from bᵢ to aᵢ₊₁, the end piece's from bₙ to L (the stored end). A dropped piece has none.
changeSizeCommand(DraftDocument doc, Handle instance, SymbolEntry entry) → CompoundCommand?
The Change size step (D7, decision 9): instance takes entry's definition (reused or copied, definitionForEntry), its linear part kept and its translation chosen so the new box's back-left corner (left', back') lands where the old (left, back) was. Null when the instance already draws entry's key (re-picking the checked size is not a size change: it would copy a fresh definition over an older version or an edited one), or a box is missing.
classify(WorldWall self, int k, List<WorldWall> others) → Joint
The joint at self's end k among others, in this order (spec 07 D4):
countedTableNumber(String number) → int?
The value of number when it counts for nextTableNumber: 1 to 8 ASCII digits, leading zeros allowed ("07" is 7). Null otherwise.
cutsOf(HostFrame frame, List<(double, double)> stretches, List<(double, double)> openings) → ({List<Cut?> cuts, List<(double, double)> merged})
Where each of one host's openings cuts, and the host's merged cuts (spec 08 D8). openings are (centre, width) in ascending handle order; stretches and frame are the host's.
decideEnd(DraftDocument doc, List<AttachedEnd> candidates, {required DimKind kind, required Vector2 at, required Vector2 other, required Transform2 m}) → AttachedEnd?
The end a dimension stores for a point whose attach candidates are given (spec 11 D10's "The choice among candidates", R-17; decisions 19 and 22), or null when there are none (the end is fixed).
defaultPage({DecimalSeparator decimalSeparator = DecimalSeparator.point}) → PageComponent
The page a new document gets (spec 12a D4, S-3, T-11): A4 landscape at 1:50 in metres, every field at its default, with a fixed origin. The sheet is 297 × 210 paper mm, 14,850 × 10,500 world mm at 1:50, so this origin centres it on the world origin. Not centred on the extents, as the sample's page is: an empty document's extents have a NaN centre, which the page refuses.
definitionForEntry(DraftDocument doc, SymbolEntry entry) → ({List<DraftCommand> commands, Handle definition})
The definition a placement of entry in doc uses, and the commands that make it when it is a copy (none when one is reused): the one reuse-or-copy path, shared by placeSymbol and a size change (spec 09c D7, V-7). A definition is reused when it carries the entry's key and version, still exists, agrees on seating (spec 14 S2) and is leaf-equal to the entry; otherwise the definition is copied with fresh handles, allocated here. The entry's leaves are ascending by handle (R5-7).
distToSegment(Vector2 p, Vector2 a, Vector2 b) → double
The distance from p to the segment a–b.
documentSeparatorFor(FloorPlanStrings strings) → DecimalSeparator
The decimal separator a new plan takes in strings' language (N1): DecimalSeparator.comma when the language's panels print , (FloorPlanStrings.decimalSeparator), DecimalSeparator.point otherwise. Only a new plan reads it: nothing converts a plan that exists (N2).
drawnCapsOf(WorldWall w, List<WorldWall> others) → ({List<Vector2> endCap, bool fellBack, List<Vector2> startCap})?
w's caps as they are drawn (spec 11 D4, R-5): the caps whose points are the corners of the outline the wall stores, in world. Null for a degenerate wall (07 D2). Two steps, 07's two fallbacks:
edgeSnap(List<(double, double)> stretches, List<(double, double)> otherCuts, double u, double w, double aperture) → double?
Spec 08 D15's edge snap: the centre that puts one edge of an opening centred at u, w wide, on a candidate, or null.
endPointInView(ParametricView view, Handle self, DimEnd end) → Vector2?
The world point of end of dimension self in view (spec 11 D6), or null when the end is broken (D7): an attached end whose wall is not a live wall or whose k is outside {0, 1}, or a fixed end with a non-finite coordinate.
ensureDashedLinetype(DraftDocument doc) → void
Adds kDashedLinetypeRecord to doc's linetypes, outside the history (spec 10 D3): the sample plan and the test fixtures call it when they make a document. installParametric does not: on a loaded file it would change the document outside the history.
ensureFloorPlanFonts([AssetBundle? bundle]) → Future<void>
Registers family kFloorPlanFontFamily from the package's bundled Roboto (read from bundle, rootBundle when null). Once per process: every call after the first returns the first call's future, unless that one failed, in which case the next call tries again. A host awaits it before runApp (after WidgetsFlutterBinding.ensureInitialized()).
entryOfInstance(SymbolLibrary library, DraftDocument doc, Handle instance) → SymbolEntry?
instance's library entry (V-5): the exact key@version of its definition's SymbolComponent, else the key's highest version; null when the library has neither.
exportBytes(DraftDocument document, PageComponent page, ExportChoice choice, {required Future<Uint8List> fontBytes(), double tableColorOpacity = kTableColorOpacity}) → Future<Uint8List>
page of document as choice says: a vector PDF with fontBytes' font embedded (read only for a PDF), or a PNG at the chosen dpi; the separators omitted either way, and the coloured tables filled under the drawing at tableColorOpacity (plan colours spec PC-7).
exportOmitOwners(DraftDocument document) → Set<Handle>
The owners whose leaves do not plot (spec 13 D6, decision 11): every live separator of document, at the moment of the export.
exportPageOf(DraftDocument document) → PageComponent?
The page document's root carries, or null when it has none (spec 13 D8: the flow then returns without effect). Read from the document, never from the screen: the export plots the page, at its scale.
exportPdfBytes(DraftDocument document, PageComponent page, {required Uint8List fontBytes, double tableColorOpacity = kTableColorOpacity}) → Future<Uint8List>
page of document as a vector PDF with fontBytes' font embedded, the separators omitted, the coloured tables filled under the drawing at tableColorOpacity (plan colours spec PC-7): what Export → PDF writes and what Print hands to the printer (spec 13 D8, D9).
faceRunsAmong(WorldWall host, List<WorldWall> walls) → List<FaceRun>
host's face runs among walls (any walls; host itself, degenerate walls and walls that do not touch it are ignored), spec 09c D3. The left face's runs, then the right face's, each ascending along the frame's direction. Empty for a degenerate host.
faceRunsOf(DraftDocument doc, Handle wall, {bool accept(DraftDocument, Handle)?}) → List<FaceRun>
The face runs of wall wall of doc (spec 09c D3) through the document adapter (wallsInDocument: every other live wall can cut it). Empty when wall is not a live wall, is degenerate, or accept refuses it (the shell passes isUsableHost: a hidden or locked wall hosts nothing). accept is asked only for a live wall.
familyMembers(SymbolLibrary library, SymbolEntry entry) → List<SymbolEntry>
The members of entry's size family (V-5, V-4): every entry of library carrying its tag, from any source, one per key (its highest version), none servable, sorted by width then depth. Empty when entry has no family. Memoised per library and family: the panel rebuilds on every hover.
familyTagOf(SymbolEntry entry) → String?
entry's family: tag, or null.
firstLeafOf(DraftDocument doc, Handle owner, [Map<Handle, List<int>>? leavesByOwner]) → ({EntityKind kind, GeometryPayload payload})?
The lowest-handle leaf owner owns, or null. O(entities): at command or document-change rate, never per frame. With leavesByOwner (DraftDocument.leavesByOwner, shared by a caller asking for many owners in one pass), only owner's own leaves are visited.
formatArea(double mm2, DisplayUnit unit, {DecimalSeparator decimalSeparator = DecimalSeparator.point}) → String
The area label's string for mm2 mm² in the page's unit (spec 10 D11, decision 6): m² for millimetres, centimetres and metres, ft² for inches and feet-inches (304.8 × 304.8 mm² to the square foot, in double arithmetic); always two decimals, the page's decimalSeparator as the separator (spec Q0 T1), no grouping.
formatDimension(double mm, DisplayUnit unit, {DecimalSeparator decimalSeparator = DecimalSeparator.point}) → String
A dimension's text for a length of mm in the page's display unit (spec 11 D9, decision 7): no unit symbol, the page's decimalSeparator (spec Q0 T1; . in the examples below), no grouping, each unit at its plan precision:
ghostPathFor(SymbolEntry entry) → Path
The outline of entry's leaves in the symbol's local frame (the definition's coordinates, base point not subtracted), built on the first call and the same object on every later call for the same entry.
hostCutsInView(ParametricView view, Handle host) → HostCuts?
host's cuts through the view adapter: one computation, made by the wall for its pieces and by each of its openings for its symbol and its diagnostics, so all of them see the same decision. Memoised per view and host. Null when host has no openings, is not a live wall, or is degenerate (07 D2: no frame).
hostFrameInDocument(DraftDocument doc, Handle host) → HostFrame?
host's frame through the document adapter (wallsInDocument). Null when host is not a live wall or is degenerate.
hostFrameOf(WorldWall host, List<WorldWall> walls) → HostFrame?
host's frame (spec 08 D7), among walls (any walls; classify skips host itself, degenerate walls and walls that do not join it). Null for a degenerate host (07 D2).
identityGhostMatrix() → Float64List
A column-major 4×4 identity, the storage writeGhostMatrix expects.
installParametric(DraftDocument doc) → ParametricSystem
Builds and installs the document's parametric system.
intersect(Vector2 p, Vector2 a, Vector2 q, Vector2 b) → Vector2?
The intersection of p + u·a and q + v·b, or null when the directions are parallel within wallJoin.angular.
isControlCodeUnit(int u) → bool
Whether the UTF-16 code unit u is a control character: below U+0020 (C0, a line break among them) or U+007F to U+009F (DEL and C1). The one rule tableNumberProblem and the table data limits (tableDataProblem) share.
isLeafEqual(DraftDocument doc, Handle definition, SymbolEntry entry) → bool
Whether the definition definition in doc is leaf-equal to entry (spec 09c D10, W-11): what a placement checks before it reuses a definition found by key and version.
isLiveObject<T extends Component>(DraftDocument doc, Handle h) → bool
Whether h is a live T of doc: a live parametric object whose naming registration is exactly T's, as the engine's survey reads it (ParametricCatalog.names on parametricCatalog). A root-level group carrying two registered types (only a file makes one) is the later registration's object, and the earlier type's nowhere; a component on a nested group, an instance, a leaf or a handle with no node is no object's. T is matched exactly: a supertype names nothing.
isOpeningWidth(OpeningKind kind, double w) → bool
Whether w is a width the tools and the panel may give an opening of kind (spec 08 D6): finite and greater than wallJoin.linear, or than 4 × wallJoin.linear for a gap, whose threshold line is inset from each jamb (D10). A loaded opening may still hold any width.
isOrthonormal(Transform2 g) → bool
Whether g's linear part is orthonormal (spec 09c W-8, S-10): |a² + b² − 1|, |c² + d² − 1| and |ac + bd| each at most Tolerance.standard.linear. A mirror is orthonormal; a scale is not.
isParametricObject(DraftDocument doc, Handle h) → bool
Whether h is a live parametric object of one of the floor planner's registered types (parametricCatalog), by the engine's own rule (isLiveObject): a root-level group carrying a registered component.
isServableInstance(DraftDocument doc, Handle instance) → bool
instance's definition carries a SeatingComponent: a table (V-4, as TableSurvey reads it).
isSimpleCcw(List<Vector2> ring) → bool
Exact, like the triangulator: the signed area is positive and no two non-adjacent edges properly cross (spec 07 D6's invariant).
isSymbolInstance(DraftDocument doc, Handle handle) → bool
handle is a root-level instance whose definition carries a SymbolComponent (D7's rule, F-11's for a symbol).
isTable(DraftDocument doc, Handle handle) → bool
Whether handle is a live table of doc: a root-level servable instance (T1), the rule TableSurvey.of applies. O(1): no survey.
isUsableHost(DraftDocument doc, Handle wall) → bool
Whether wall wall of doc may host a new opening (spec 12b S-11): its object layer (objectLayer) is visible and unlocked. A tool acting on the wall under the pointer is selection-like, so a door is never placed on a wall the user cannot see or select. A missing record counts as visible and unlocked, as FilterEvaluator counts it. (Decision 8 is untouched: a hidden wall's existing openings still cut it.)
isValidPiece(List<Vector2> ring) → bool
Whether ring is a piece the engine stores (spec 08 D9; 07 D6's invariant, per piece): at least three vertices, simple and anticlockwise (isSimpleCcw), and, closed as the wall stores it, with a non-empty triangulation (triangulationFor: the very check the engine's planner makes on a generated region, so the app never generates one it refuses).
isWallThickness(double t) → bool
Whether t is a thickness a wall may be drawn or edited with (final review m1, fix/post-11): finite, greater than wallJoin.linear and at most kWallMaxThickness. A positive thickness at or below the floor is a band thinner than the join tolerance, and far from the origin its faces round onto each other; one above the ceiling can collapse the band (see kWallMaxThickness). The Selection panel rejects any other value, for a wall and for the Wall tool's settings, and the Wall tool does not commit with one. A loaded wall may still hold one (D2's degenerate wall is t <= 0; a thicker one still throws on the Wall tool's and the grips' regenerating edits, a known limit).
layerMoveCommand(DraftDocument doc, Iterable<SelectionKey> keys, Handle layer) → DraftCommand?
The one command that moves keys to layer (spec 12b D12), or null when every member is already on it. Read from doc as it is now.
layerOfKey(DraftDocument doc, SelectionKey key) → Handle?
Key key's layer as the picker shows it (spec 12b D12), or null for a plain group or a key that no longer resolves:
layerPickerBlocked(DraftDocument doc, Iterable<SelectionKey> keys, [FloorPlanStrings strings = const FloorPlanStringsEn()]) → String?
Why the picker is disabled for keys in doc, or null when it is enabled: a permission set without Capability.components (D11), or a plain group among the keys (D12). In strings' language (spec 14d); English by default, the constants above.
layersInPanelOrder(Iterable<LayerRecord> layers) → List<LayerRecord>
layers in the panel's order (spec 12b D10): layer 0 first, then the others by name under toLowerCase(), ties by handle. Independent of creation order, so stable across undo, save and load.
layerSwatchRgb(DraftColor color, int foreground) → int
The 0xRRGGBB a layer of color is drawn in, as the style resolver draws it: ACI 7 (and anything that is not a colour of its own) in the paper's foreground, another index through aciToRgb, a true colour as stored.
layoutDimension(Vector2 p0, Vector2 p1, DimKind kind, Transform2 m, double offset, PageComponent page) → DimLayout?
The layout of a dimension of kind from world p0 to world p1, in a group whose local-to-world transform is m, with offset its stored local offset, on page (spec 11 D6-D8; the plan's Ruling 11-3: the one layout every caller uses). All in world, computed relative to p0 (a far origin costs nothing beyond the points' own rounding):
layoutInDocument(DraftDocument doc, Handle host, {Map<Handle, WorldWall> moved = const {}}) → HostLayout?
host's layout (frame, obstacles, stretches) through the document adapter (wallsInDocument, with moved standing in for the walls it names). Null when host is not a live wall or is degenerate.
layoutInView(ParametricView view, Handle host) → HostLayout?
host's layout through the view adapter (wallsInView). Null when host is not a live wall or is degenerate.
layoutOf(WorldWall host, List<WorldWall> walls) → HostLayout?
host's layout among walls: one computation for the wall and for each of its openings. Null for a degenerate host.
liveObjectsOf<T extends Component>(DraftDocument doc) → List<Handle>
Every live T of doc (isLiveObject), ascending by handle value (ParametricCatalog.objectsOf on parametricCatalog). A fresh list.
loadExportFont([AssetBundle? bundle]) → Future<Uint8List>
Reads the bundled font's bytes from bundle (rootBundle when null).
lobes(List<Vector2> v, List<int> e) → List<(List<Vector2>, List<int>)>
Splits a closed ring at exactly repeated vertices into lobes, each with its edge labels (spec 07 D5.5). Exact: a stored-value comparison.
localOutlineOf(WorldWall self, List<WorldWall> neighbours) → ({bool fellBack, List<Handle>? hole, List<Vector2> ring})
self's outline in its group-local space among neighbours (spec 07 D4-D6; Ruling 10-8): what WallType stores and diagnoses, and what a room traces once it is taken back to world (spec 10 D4, R-5). One function, so the wall and both of the rooms' adapters compute one ring.
measuringDirection(DimKind kind, Vector2 p0, Vector2 p1, Transform2 m) → Vector2
The measuring direction u (spec 11 D6), a world unit vector, of a dimension of kind from world point p0 to world point p1 in a group whose local-to-world transform is m:
mergeCuts(List<(double, double)> cuts) → List<(double, double)>
The cuts of one wall merged (spec 08 D8, decision 6): sorted by start; a cut that starts within wallJoin.linear of the previous merged cut's end joins it, so two overlapping or touching openings make one gap and no sliver piece.
mirroredAbout(Transform2 t, SymbolBox box) → Transform2
t mirrored in its own frame about box's centre x (D7): the footprint does not move, a scale is kept.
mirrorSymbolCommand(DraftDocument doc, Handle instance) → CompoundCommand?
The Mirror step for instance (D7), or null when it has no box.
newDocument(TextMeasurer measurer, {DecimalSeparator decimalSeparator = DecimalSeparator.point}) → DraftDocument
The document New and launch open (spec 12a D4): prepareDocument, then defaultPage with decimalSeparator attached through the log (spec Q0 N1), then the history cleared, so a fresh document has Undo disabled and the host's save point finds it clean.
nextLayerName(CommandTarget target, [FloorPlanStrings strings = const FloorPlanStringsEn()]) → String
The name the panel's + gives a new layer (spec 12b D4, spec 14d L7): strings' Layer N, the smallest N ≥ 1 that no layer's name already takes in any built-in language (by toLowerCase(), the table's own folding) and that layerNameError accepts in target.
nextTableNumber(Iterable<String> numbers) → String
The next table number over the live tables' numbers (T5): max + 1 over the counted ones, written without leading zeros; "1" when none counts. When max + 1 would take nine digits, the smallest unused positive integer instead, so a placement never makes a duplicate or an invalid number.
nodeHub(List<End> ends) → Vector2
The node's reference point: the endpoint of its lowest (handle, end), the same bits for every member. Used only as the clamp reference and the feet's base, never inserted as a cap vertex (spec 07 D5.3).
nodeOwner(List<End> ends) → int
The index of the lowest (handle, end) among ends.
obstaclesOf(HostFrame frame, WorldWall host, List<WorldWall> walls) → List<Obstacle>
The obstacles walls make in host's band (spec 08 D7, decision 18), sorted by a, then b, then handle. frame is host's.
offsetFor(Vector2 q, Vector2 p0, Vector2 p1, DimKind kind, Transform2 m) → double
The placement function (spec 11 D6, R-7): the offset, in the group's local units, that puts a dimension of kind from world p0 to world p1 in a group whose local-to-world transform is m through world point q. With u = measuringDirection, n its left normal, the heights h0 = 0 and h1 (0 for aligned by definition, (p1 − p0) · n for a linear kind), hi/lo their max and min, hq = (q − p0) · n and s = m.scaleMagnitude:
openingsInDocument(DraftDocument doc, Handle host) → List<(Handle, OpeningParams)>
host's openings in doc: the live openings (the engine's object rule, asked through live_objects.dart) whose host is host, ascending by handle, with their parameters, as openingsInView reads them in a regeneration.
openingsInView(ParametricView view, Handle host) → List<(Handle, OpeningParams)>
host's openings in view: its referrers carrying OpeningParams whose host is host, ascending by handle, with their parameters.
outerContours(List<RoomInput> inputs, Vector2 origin) → List<List<Vector2>>
The outer contour of each connected component of the arrangement of inputs (spec 10 D19; the re-review's T-8 cache, adopted at execution), its points relative to origin: the component's most negative face cycle, the walk around its outside, as traceRoom's step 8 finds a hole's contour. A component with no area (a free separator, or a free tree of them) is kept too: its walk goes out and back along each edge, so the crossing number of any point off it is even.
outline(WorldWall w, List<WorldWall> others, {bool fallback = true}) → ({bool fellBack, List<Handle>? hole, List<Vector2> ring})
A wall's world outline: an anticlockwise ring, end cap then start cap (spec 07 D5, D6).
overlaps((double, double) x, (double, double) y) → bool
Whether two fitting cuts of one host overlap (spec 08 D8, for D17): each starts more than wallJoin.linear before the other ends. Touching is not overlap.
panelNumberText(double v) → String
v as the shell shows a stored number: in a Selection panel field, in the Page panel's scale field and in the status line's scale. The text is one the fields' parser (double.tryParse) reads back as exactly v, sign of zero included, so a commit of a shown value writes nothing. A whole number below 2^53 in magnitude shows without ".0" ("200"); anything else is Dart's shortest round-trip form ("0.1", "100000000000000000000.0", "1e+300", "-0.0").
piecesOf(HostFrame f, List<(double, double)> merged) → List<List<Vector2>>
The rings of f's band cut at merged (spec 08 D9), in u order, start piece first: each simple and anticlockwise in the host's local space. merged must not be empty.
placeBoxInView(ParametricView view, Handle h) → Aabb2?
h's place box through the view adapter: its input's box, or null.
placeCut(List<(double, double)> stretches, double c, double w) → Cut?
Where an opening centred at c with width w cuts (spec 08 D8), among stretches (sorted, as stretchesOf gives them):
placementTransform({required Vector2 at, required Vector2 basePoint, int? quarterTurns, (double, double)? rotation, bool mirrored = false}) → Transform2
translation(at) · rotation · scale(mirrored ? -1 : 1, 1) · translation(-basePoint): the definition's base point lands on at (spec F-2), and a mirror flips the local x axis whatever the rotation.
placeSourceInView(ParametricView view) → PlaceSource
What a room traces among inside generate and diagnose (spec 10 D7): the view's placedIn, roomInputInView, and U the union of placeBoxOf(h) over placedIn of the whole plane (Ruling 10-13), the engine having already turned a non-finite box into null. Memoised per view, U included.
placeSymbol(DraftDocument doc, SymbolEntry entry, {required Vector2 at, int quarterTurns = 0, bool mirrored = false, Transform2? transform, InstanceStyle style = const InstanceStyle(), bool numbered = true}) → CompoundCommand
The command that places entry in doc at at. Labelled Place <name>; it does not execute.
pointInRing(Vector2 p, List<Vector2> r) → bool
Whether p is inside ring r (no closing duplicate), by the crossing number.
pointInRingXY(double x, double y, List<Vector2> r) → bool
pointInRing of the point (x, y): the same test, taking no Vector2, so a caller that offsets the point allocates nothing.
poleOfInaccessibility(List<Vector2> ring, List<List<Vector2>> holes, {double precision = 10}) → ({double distance, Vector2 point})
The point of the face ring minus holes farthest from its boundary, to within precision mm (spec 10 D10, R-12), and its distance to that boundary.
prepareDocument(TextMeasurer measurer) → DraftDocument
A fresh document over measurer with the app's set-up and nothing else (spec 12a D4): the app's component types registered, once (registerAppComponents); the header's units millimetres (the header's own default is unitless); the DASHED linetype record at handle 6, outside the history (spec 10 D3). No page, no entity, no history.
printPageFormat(PageComponent page) → PdfPageFormat
page's paper in pt, as laid out (orientation applied): the size the print dialog opens on (spec 13 D9; without it the dialog opens on PdfPageFormat.standard).
readable(Vector2 u) → Vector2
u (a world unit direction) or its reverse, so text along it reads from the bottom or the right of the page (spec 11 D8, R-11): reversed when u.x < −dimFormat.angular, or when |u.x| ≤ dimFormat.angular and u.y < 0. Text angles land in (−90°, 90°], and exactly vertical, within the tolerance, reads upwards (+90°): a group turned −90° gives u = (6.1e-17, −1), which without it would read from the left.
registerAppComponents(ComponentRegistry r) → void
Registers every component type the app's documents carry (spec 12a D8, S-1): PageComponent, the parametric catalog's types, then SymbolComponent (spec 09 D1; not a parametric type), the SeatingComponent (spec 14 S1; not a parametric type either), and the host's FloorPlanTableData (host embedding API spec E-6) and FloorPlanTableColor (plan colours spec PC-4). The one registration New, the sample and Open use — pass it as DraftDocumentCodec.decode(…, registerComponents: registerAppComponents). Without the page's registration a file's page loads as preserve-unknown; without the catalog's, its walls, openings, rooms and dimensions do.
registerFontLicences([AssetBundle? bundle]) → void
Registers the font's licence with LicenseRegistry under the package name Roboto, its text read from bundle (rootBundle when null) when the licences are collected.
resetFloorPlanFontsForTest() → void
Forgets the registration, so the next ensureFloorPlanFonts registers again: a test seam (the registration is process-wide, and a test must not inherit another's pending future). The engine keeps any face already loaded.
restampedTableLabel(GeometryPayload payload, Transform2 placement) → GeometryPayload?
payload re-stamped for placement: anchor and height kept, rotation and width factor replaced. Null when they already match by exact == (stored values), so a translation writes nothing (T12).
roomInputInView(ParametricView view, Handle h) → RoomInput?
h's input through the view adapter (spec 10 D4): a wall's neighbours are view.neighbours(h) carrying WallParams, ascending. Memoised per view and handle. Null for a handle that is not a live wall or separator of the view, and for a degenerate one.
roomInputOf(Handle h, Component params, Transform2 toWorld, {List<WorldWall> walls = const []}) → RoomInput?
h's input to the tracer from its component params and its group's accumulated transform toWorld (spec 10 D4): the one function both adapters call.
rotatedTo(Transform2 t, Vector2 basePoint, double degrees) → Transform2
t turned so its Rotation reads degrees (any finite number, taken modulo 360), about the insertion point t · basePoint (D7): the linear part A becomes R(θ' − θ)·A, so a mirror and a file's scale are kept; an orthonormal result at a multiple of 90° is R(θ')·S from the exact table, S the mirror or the identity, -0.0 normalised.
rotateSymbolCommand(DraftDocument doc, Handle instance, double degrees) → CompoundCommand?
The Rotate step for instance (D7), or null when nothing changes.
rotateTableCommand(DraftDocument doc, Handle instance, int quarterTurns) → DraftCommand?
The command that turns instance by quarterTurns × 90° (positive is counter-clockwise, on the world and on the screen alike) about its definition's base point, or null when instance is not a live instance of a live definition. One TransformNodeCommand in a Rotate compound.
rotationDegreesOf(Transform2 t) → double
The Rotation row's value (D7): atan2(−c, d) in degrees, in [0, 360) -- the local y column's angle, so a mirror does not add 180°.
roundHalfUp(double mm, double quantumMm) → int
mm in whole quanta of quantumMm, round-half-up, the half decided robustly (spec 11 D9, R-13): with x = mm / quantum and n = floor(x), a value within dimFormat.linear mm of (n + 0.5) · quantum is on the half and gives n + 1; any other value gives round(x).
searchSymbols(List<SymbolEntry> entries, String query, [SymbolWords words = SymbolWords.english]) → List<SymbolGroup>
Filters entries by query and groups the survivors by category (by its English name, the library's own).
shoelace(List<Vector2> r) → double
The shoelace area of ring r (no closing duplicate), anticlockwise positive, summed from r[0].
showExportDialog(BuildContext context, ExportChoice initial) → Future<ExportChoice?>
Asks for the export's format and resolution, starting from initial. Null when cancelled (Cancel, Escape or a tap outside).
signedArea(List<Vector2> r) → double
The signed area of a closed ring, anticlockwise positive.
simplifyRing(List<Vector2> ring) → List<Vector2>
Removes exact consecutive duplicates and zero-width spikes a, b, a (spec 07 D6). Stored-value comparisons, so exact; zero area, so the tiling is unchanged. Without it the triangulator refuses a pinched outline.
startupPage(Aabb2 extents, {DecimalSeparator decimalSeparator = DecimalSeparator.point}) → PageComponent
The sample's page: A4 landscape at 1:50 in metres, centred on extents (spec D4), printing decimalSeparator (spec Q0 N1). A new document's page is defaultPage() (spec 12a D4).
startupPlan(FlutterTextMeasurer measurer, {FloorPlanStrings strings = const FloorPlanStringsEn()}) → DraftDocument
Builds the sample flat (File > Open sample, spec 12a D4) over measurer. DraftCanvas refuses a document whose measurer is not a FlutterTextMeasurer, so the caller supplies one it owns. Its rooms are named in strings' language (spec 14d L7), English by default, and its page prints that language's decimal separator (spec Q0 N1).
storedCentreOf(List<(double, double)> stretches, Cut cut, double w) → double
The centre to store for an opening of width w that is to cut at cut among stretches (spec 08 D14, D16: stored where it is drawn): cut.a + w/2, moved by the fewest ulps that make placeCut place it unclamped. (cut.a + w/2) − w/2 need not round back to cut.a, and a start one ulp outside [a, b − w] would be clamped (D8's exact comparison), so the opening would be opening.clamped from birth. Gives up after a few ulps and returns the last value tried: a stretch exactly w long whose b − w rounds below a holds no unclamped start at all.
stretchesOf(HostFrame frame, List<Obstacle> obstacles) → List<(double, double)>
The stretches of frame (spec 08 D7): its straight span minus the union of obstacles, sorted and disjoint. Subtracting compares computed values exactly, so each stretch's ends are the span's or an obstacle's own bits; only the final test, which drops a stretch no longer than wallJoin.linear, uses the tolerance.
strictlyInside(Vector2 p, WorldWall o) → bool
Whether p lies on o's centreline within wallJoin.linear and more than wallJoin.linear from both of its ends, measured along it (D4.1). Spec 08 D7's T obstacle reads it with the host as o.
sweep(End x, End y) → double
The anticlockwise sweep from x's direction to y's, in (0, 2π].
symbolIdOf(SymbolEntry entry) → String
The gallery's id of entry: "$key@$version" (spec D4), unambiguous when the library holds one key at two versions.
symbolOf(HostFrame f, OpeningParams o, Cut? cut, Transform2 toOwn) → List<Generated>
Opening o's symbol (spec 08 D10, D11), computed in its host's local space on the host's frame f and taken to the opening's own local space by toOwn, which is toWorld(self)⁻¹ · toWorld(host): host-local → world → own local. Every child is ByLayer, Generated's default.
symbolThumbnailDocument(SymbolEntry entry, TextMeasurer measurer) → DraftDocument
A thumbnail's document (spec D5): the placer's own output, so a thumbnail is what a placement makes. prepareDocument registers the app's components (so the SymbolComponent is accepted), then placeSymbol runs at the definition's base point, no turn, not mirrored: an identity transform.
tableDiagnostics(DraftDocument doc) → List<Diagnostic>
The numbering diagnostics of doc (T15).
tableLabelHeight(EntityKind kind, GeometryPayload top) → double
min(200, 0.4 × min(w, h)), where w × h is the local bounding box of the served top: the definition's first leaf (14s S4), a closed polyline or a circle. Any other kind gives the full height.
tableLabelPayload({required Vector2 anchor, required double height, required Transform2 placement}) → GeometryPayload
The label payload: anchor, [height, rotation, widthFactor] stamped for placement.
tableLabelRecord({required Handle handle, required Handle instance, required String number}) → EntityRecord
The label record of a table: owned by instance, on layer 0 (so it follows the instance's layer, spec 12b S-2), BYBLOCK style, the standard text style, tag TABLE, text number (T8).
tableLabelStamp(Transform2 placement) → ({double rotation, double widthFactor})
The rotation and width factor that make a label owned by an instance placed by placement read left to right, unmirrored, along world +x (T10). The only place this is computed.
tableNumberError(String raw) → String?
tableNumberProblem in English, or null.
tableNumberProblem(String raw) → TableNumberProblem?
Why raw, trimmed, is not a table number, or null when it is one (T4): non-empty, at most kTableNumberMaxLength code units, no control character (no line break).
tablesOf(DraftDocument doc) → List<TableInfo>
The live tables of doc (T15).
thickestWall(DraftDocument doc) → double
T (spec 11 D10): the largest world thickness of a live wall of doc, each wall's stored thickness times its group's scaleMagnitude (so a scaled group, file only, is covered); 0 with no live wall. One pass over the walls. A live wall is the engine's (the plan's Ruling 11-4, as amended by fix/live-object-rule: asked through live_objects.dart).
tintOf(List<Vector2> ring, List<List<Vector2>> holes, {bool accepts(int step, List<Vector2> points)?}) → Tint
The tint of the face ring minus holes (spec 10 D9), both anticlockwise as Traced gives them, in the trace's seed-relative frame (the caller subtracts the seed, and maps Tint.points to the room's local space after): so the bridges and the slit are decided on numbers the size of a building, not of the far origin.
traceRoom(Vector2 seed, List<RoomInput> inputs) → TraceResult
Finds the room around seed among inputs (spec 10 D5, D6):
traceRoomAmong(Vector2 seed, PlaceSource source) → TraceResult
The room around seed among every contributor source holds, tracing only those near its face (spec 10 D7). The result is, bit for bit, traceRoom(seed, every input) (LZ1):
trimSeparator(Vector2 a, Vector2 b, RoomInputs inputs, {required bool objectSnap}) → (Vector2, Vector2)?
The separator a person draws from a to b, in world, as it is stored (spec 10 D20, R-21; Ruling 10-9): the one function the Separator tool and the separator grips call.
wallEndPoint(WorldWall w, List<WorldWall> others, int k, WallSide side) → Vector2
Wall w's point at end k (0 its start, 1 its end) on side, among others, its wall neighbours (w itself and degenerate walls are ignored, as in classify) (spec 11 D4):
wallEndPoints(WorldWall w, List<WorldWall> others) → List<(int, WallSide, Vector2)>
All six of w's points (spec 11 D4), in (k, side) order: k = 0 then 1; left, centre, right.
wallsInDocument(DraftDocument doc, Handle host, {Map<Handle, WorldWall> moved = const {}}) → ({WorldWall host, List<WorldWall> walls})?
The walls the tools, the grips and the panel see around host (the document adapter, Ruling 08-8): host as a WorldWall, and every other live wall of doc (the engine's object rule, asked through live_objects.dart: a file's group that also carries a later-registered type is that type's object, not a wall), ascending by handle. The view adapter (wallsInView) sees only host's neighbours; classify, cap and obstaclesOf ignore a wall that does not join host, so the extra walls change nothing (HF7 pins that both give the same bits). Null when host is not a live wall.
wallsInView(ParametricView view, Handle host) → ({WorldWall host, List<WorldWall> walls})?
The walls a regeneration sees around host (the view adapter, Ruling 08-8): host as a WorldWall, and every neighbour of it in view carrying WallParams, as 07's outline reads them. Null when host is not a live wall.
wedge(List<End> ends, int w, Vector2 hub) → List<Vector2>
Wedge w, anticlockwise from end w to end w + 1: its points on the central polygon, in anticlockwise order (spec 07 D5.2, D6).
writeGhostMatrix(Float64List m, Transform2 p, Vector2 origin) → void
Writes translate(−origin) ∘ p into m, an identity-initialised column-major 4×4 (canvas.transform's layout): the linear part of p in [0] [1] [4] [5], its translation less origin in [12] [13]. Composed in doubles; the other ten entries are left as they are.

Typedefs

Cap = ({bool ownsHole, List<Vector2> points})
One end's cap, from its outgoing-left face to its outgoing-right face, and whether this end owns a crossing lobe that was dropped (spec 07 D5.6).
Cut = ({double a, double b, bool clamped})
One opening's cut (spec 08 D8): [a, b] along its host's centreline, and whether the clamp moved it off its stored interval.
DimLayout = ({(Vector2, Vector2) ext0, (Vector2, Vector2) ext1, Vector2 n, Vector2 q0, Vector2 q1, (Vector2, Vector2) slash0, (Vector2, Vector2) slash1, String text, double textAngle, Vector2 textAt, double textHeight, Vector2 u, double value})
One dimension's geometry in world (spec 11 D6-D8), from layoutDimension:
FaceNeighbour = ({double hi, Handle instance, double lo})
A placed symbol standing against a run (spec 09c D4's neighbours): the interval [lo, hi] its back edge covers along the run's t, measured from the run's a, and the instance's handle (so a move can leave its own instance out, D8).
HostCuts = ({List<Cut?> cuts, HostLayout layout, List<(double, double)> merged, List<Handle> openings})
Everything D7 and D8 decide for one host: its HostLayout, its openings (ascending), each one's cut (null: no fit, D8), and the merged cuts.
HostLayout = ({HostFrame frame, List<Obstacle> obstacles, List<(double, double)> stretches})
A host's frame, its obstacles and its stretches (spec 08 D7).
Obstacle = ({double a, double b, Handle wall})
An interval [a, b] of u that another wall's band occupies inside the host (spec 08 D7), and that wall.
ShellDeleteRegistrar = VoidCallback Function(bool delete())
Registers the shell's delete with its host (host embedding API spec C-3, as Slice 4's S-16 ruled): delete deletes the selection as the select tool's idle Delete does and answers whether it did. Returns the withdrawal, which the shell calls on dispose, as ShellSettleRegistrar's.
ShellIdleRegistrar = VoidCallback Function(bool delete())
Registers the shell's idle probe with its host (host embedding API spec S-4): true while no tool is part-way through a shape, so the host's own Undo and Redo wait as the shell's do. Returns the withdrawal, which the shell calls on dispose, as ShellSettleRegistrar's.
ShellSettleRegistrar = VoidCallback Function(VoidCallback settle)
Registers the shell's synchronous settle with its host (spec 12a D2, plan 12a P-4): the host calls settle before a flow reads or replaces the document. Returns the function that withdraws the registration; the shell calls it on dispose, and it withdraws only settle itself, since a swap builds the next shell before the old one is disposed.
ShellTableInspector = Widget? Function(BuildContext context, Handle instance)
The host's widget for the table instance the editor's selection is exactly (host embedding API spec C-6, S-18), or null for none.
ShellToolRegistrar = VoidCallback Function(bool select(FloorPlanTool tool))
Registers the shell's tool selector with its host (host embedding API spec C-3, S-6): select activates a tool when the shell's capabilities allow it and answers whether it did. Returns the withdrawal, which the shell calls on dispose, as ShellSettleRegistrar's.
SymbolGroup = ({String category, List<SymbolEntry> symbols})
The entries of one category that survive a search, in library order.
WallAttachment = ({Vector2 q, FaceRun run, Transform2 transform})
What attachToWall returns: the attached placement transform, the point q on the face the symbol's back-centre lands on (the snap marker's, D6), and the run it stands against.
WallPoints = List<(int, WallSide, Vector2)>
A wall's six attach points, (k, side, point), as wallEndPoints gives them among every other live wall.

Exceptions / Errors

SymbolLibraryError
A library the loader refuses. The message names the offending key or handle and the rule it broke.