DOE single-storey generators¶
Status: Accepted (stage P2 of the DOE geometry design note; the owner, with PR #1, D-176) · Code:
src/Lod.Generators/Doe/Restaurant/,StoreRow/,RetailBox/,Supermarket/,Warehouse/, and their sharedSingleStorey/;src/Lod.Grasshopper/Components/DoeRestaurantComponents.cs,DoeStoreRowComponents.cs,DoeRetailBoxComponents.cs,DoeSupermarketComponents.cs,DoeWarehouseComponents.cs· Tests:tests/Lod.Generators.Tests/Doe/folders of the same names · Smoke spec:scripts/rhino-smoke/specs/doe-single-storey.py· Builds on: DOE layout records and the grid plan layout, DOE generator components, ADR-025
Stage P2 adds the five generators of the single-storey DOE reference types, six layout records in all. Each is a PlanGenerator (ADR-006) on
the grid of its record: its typed parameter record has a static Default read from the record, which reproduces the source plan, and its
layout is the record's storey on cuts that the S3 rule moves (GridAxis) or, for the strip mall, a row of stores built from runs. The presets
come as one DoeProgramMap keyed by program key (S4); a key of the plan without a preset is MissingPreset. Each generator lists the keys its
map needs (ProgramKeys, in ordinal order). The Grasshopper components are on the shared DOE component support of stage P1 (below).
Generators¶
| Generator | Record | Zones (program key) | Parameters | Gap |
|---|---|---|---|---|
RestaurantGenerator |
full-service-restaurant, quick-service-restaurant (Type) |
Dining along the south, Kitchen behind |
Length, DiningDepth, KitchenDepth |
G2 |
StoreRowGenerator |
strip-mall |
LGstore<n>, SMstore<n> (Strip mall - type 1, 2, 3) |
Depth, LargeStoreWidth, SmallStoreWidth, Stores (runs) |
none |
RetailBoxGenerator |
stand-alone-retail |
Point_Of_Sale, Front_Entry (Entry), Front_Retail (Retail) along the south; Core_Retail (Retail); Back_Space along the north |
Length, Depth, BackSpaceDepth, FrontDepth, EntryWidth |
none |
SupermarketGenerator |
supermarket |
Produce, Sales; Bakery, Deli along the east; DryStorage, Office along the north |
Length, Depth, StorageDepth, PreparationDepth |
none |
WarehouseGenerator |
warehouse |
Office (south-west corner), FineStorage (Fine), BulkStorage (Bulk) |
Length, Depth, OfficeDepth, FineStorageDepth |
G4 |
Every parameter record also has FloorHeight (the record's storey height by default) and OrientationDegrees (0), and every plan is one
storey on the ground. Zone IDs, names, and program keys are the record's; the space type of a zone is DoeSpaceTypes.Of(key).
Size and unit variation (S3)¶
S3 as amended in P1 (D-164). A band a size parameter sets keeps its length; it must be finite and at least GridAxis.MinimumFixedBand, 0.5 m,
per band, not per grid interval. The other intervals are flexible: they share a change of the plate length or depth in proportion to their slack
(length less 1 m, GridAxis.Resize through SingleStoreyRecord.Cuts), so they all reach 1 m (GridAxis.MinimumFlexibleInterval) at the
shortest valid plate. A value below a limit, or one that is not finite, is InvalidParameter, with a message that names the parameter: a band
below 0.5 m (… must be finite and at least 0.5 m), a band changed past its maximum, the plate less the other bands and the flexible intervals at
1 m (… exceeds its maximum … m), or a plate too short for its bands (… is shorter than the shortest valid … m).
| Generator | Along x | Along y |
|---|---|---|
| Restaurant | the plate, Length, a band |
dining room DiningDepth and kitchen KitchenDepth, bands; the plate depth is their sum |
| Strip mall | each store LargeStoreWidth or SmallStoreWidth, bands; the plate length is their sum |
the plate, Depth, a band |
| Stand-alone retail | point of sale and front retail flexible, either side of the entry EntryWidth (a band); their slack is equal, so the entry stays centred |
front band FrontDepth, one band whose entry takes its source half, core retail flexible, back space BackSpaceDepth, a band |
| Supermarket | produce and sales flexible, preparation band PreparationDepth (bakery, deli, office) |
bakery and deli flexible, storage band StorageDepth (dry storage, office) |
| Warehouse | office and the fine storage beside it, both flexible | office OfficeDepth, a band; the fine storage north of it up to FineStorageDepth, a band of at least 0.5 m; bulk storage flexible |
Limits and valid ranges at the other parameters' defaults (m; the factor of the default in brackets). These are validity limits under S3, not
plausibility: a plan inside them lays out, keeps its zones and adjacencies, and validates, but may be no building anyone would design. The warehouse,
for example, is valid down to a 2 m length with a 1 m office, and a strip mall store down to 0.5 m wide. FloorHeight is any positive value;
plates have no upper limit. Every size parameter of every record reaches at least ±20 % of its default, and its 0.5× and 2× are valid.
| Record | Parameter | Valid range |
|---|---|---|
| full-service restaurant | Length 22.6087, DiningDepth 16.4427, KitchenDepth 6.166 |
each ≥ 0.5 (0.02, 0.03, 0.08); no upper limit |
| quick-service restaurant | Length 15.2428, DiningDepth 7.6214, KitchenDepth 7.6214 |
each ≥ 0.5 (0.03, 0.07, 0.07); no upper limit |
| strip mall | Depth 22.86, LargeStoreWidth 15.24, SmallStoreWidth 7.62 |
each ≥ 0.5 (0.02, 0.03, 0.07); no upper limit; each run's count ≥ 1 |
| stand-alone retail | Length 54.27 |
≥ EntryWidth + 2 = 6 (0.11) |
Depth 42.27 |
≥ FrontDepth + BackSpaceDepth + 1 = 14 (0.33) |
|
BackSpaceDepth 7 |
0.5 (0.07) to Depth − FrontDepth − 1 = 35.27 (5.04) |
|
FrontDepth 6 |
0.5 (0.08) to Depth − BackSpaceDepth − 1 = 34.27 (5.71) |
|
EntryWidth 4 |
0.5 (0.13) to Length − 2 = 52.27 (13.07) |
|
| supermarket | Length 79.1901 |
≥ PreparationDepth + 2 = 11.8988 (0.15) |
Depth 52.7944 |
≥ StorageDepth + 2 = 10.975 (0.21) |
|
StorageDepth 8.975 |
0.5 (0.06) to Depth − 2 = 50.7944 (5.66) |
|
PreparationDepth 9.8988 |
0.5 (0.05) to Length − 2 = 77.1901 (7.80) |
|
| warehouse | Length 45.7178 |
≥ 2 (0.04) |
Depth 100.579 |
≥ FineStorageDepth + 1 = 31.4785 (0.31) |
|
OfficeDepth 9.1435 |
0.5 (0.05) to FineStorageDepth − 0.5 = 29.9785 (3.28) |
|
FineStorageDepth 30.4785 |
OfficeDepth + 0.5 = 9.6435 (0.32) to Depth − 1 = 99.579 (3.27) |
T5 tests every size parameter at 0.5×, 1×, and 2× of its default, each limit (the plan keeps its zones and adjacencies) and a value just beyond
it (InvalidParameter), and every band at 0.5 m and just below.
Two choices follow from T5, which asks every size parameter at 0.5×, 1×, and 2× of its default to give a valid plan (both accepted by the controller):
- The restaurant's depth parameter is the dining room's depth, not the plate's. With the plate depth fixed, twice the quick-service kitchen (15.24 m) would fill the whole 15.24 m plate. No rule asks the kitchen to be smaller than the dining room: the quick-service source has both 7.62 m deep.
- The warehouse's office size is its depth; along x the office and the fine storage beside it share a length change by their slack (24.91 and 18.81 m). An office of a fixed width (25.91 m) would not fit the half-length plate (22.86 m), nor twice that width the default plate.
Repeated units (strip mall). Stores lists runs of stores west to east, each StoreRun(Size, Tenancy, Count) with Count at least 1; the
order of the runs is the order of the stores, and each store takes the program key of its tenancy (StoreRowGenerator.ProgramKey). Large stores
are LGstore1, LGstore2, … and small ones SMstore1, … in row order, as the source names them. The default runs are the source's ten stores:
a large and a small store of type 1, three small stores of type 2, a large store and four small stores of type 3. An empty list, a null entry, a
count below 1, and an undefined size or tenancy are InvalidParameter.
Gaps (S7)¶
- G2 (restaurants): the source's pitched attic is not drawn; the zones reach a flat roof at their top, one floor height high.
- G4 (warehouse, D-161, D-162): in the source the office is lower than the storey, under a floor of the fine storage. The office is drawn to the storey height and the fine-storage floor above it is dropped (236.88 m²). The answer key marks the office and the fine storage with G4, so the harness excludes their quantities, and the floor area totals take the key's adjusted figures.
Provenance records the record (Record=<name>), the gaps that apply (Gaps=G2, Gaps=G4, or Gaps=none), the reference file with its SHA-256
(Source=<file> sha256:<hash>), and every parameter; the strip mall's runs are Stores=Large:Type1x1;Small:Type1x1;….
Acceptance¶
Every record, generated at its defaults, passes T1–T3 against its answer key through the comparison harness with the fixture programs (T1 takes
the storey's elevation and multiplier from the plan stacked once with Stack). T4 runs on the generators' path (D-163): one program per key from
the answer key's per-key glazing (HarnessFixtures.KeyGlazing, programGlazing), so the window area per orientation in total and per program
key is the source's within 1 %; no zone of the six records has a ratio that differs from its key's (glazingRatioDifferences is empty), so every
zone's window area is checked as well. T5 is above; for the strip mall's counts each run at 1 and at twice its default gives one zone per store,
each sharing walls with its row neighbours only. Every T5 plan validates, every zone's area follows the parameters, and the plan and every zone
part are one floor height high. T6 runs every simplifier and aggregator, canonical and at the integration suite's two rotated placements, and
snapshots each canonical plan (Snapshots/<record>-canonical.txt). The shared checks are in
tests/Lod.Generators.Tests/Doe/SingleStorey/SingleStoreyAcceptance.cs.
Grasshopper components¶
One component per record, as for the offices (doe-components.md), each on DoeGeneratorComponent with the inputs in its
order (counts, sizes, Floor Height, Orientation, Program Map, Preview Location), its record's defaults, and the outputs Plan (one
plan), Multipliers ([1]), and Program Keys.
| Component (nickname) | Inputs, with defaults | GUID |
|---|---|---|
| DOE Full-Service Restaurant (DoeFSR) | Length (22.6087), Dining Depth (16.4427), Kitchen Depth (6.166), Floor Height (3.0488), Orientation (0), Program Map, Preview Location | b4ca8365-a4dc-4af7-a6b5-0fc68cdb37a9 |
| DOE Quick-Service Restaurant (DoeQSR) | Length (15.2428), Dining Depth (7.6214), Kitchen Depth (7.6214), Floor Height (3.0488), Orientation (0), Program Map, Preview Location | cf72627b-3035-4f91-858c-f51772989c07 |
| DOE Strip Mall (DoeSMall) | Store Counts (1, 1, 3, 1, 4), Store Sizes (Large, Small, Small, Large, Small), Store Tenancies (1, 1, 2, 3, 3), Depth (22.86), Large Store Width (15.24), Small Store Width (7.62), Floor Height (5.18), Orientation (0), Program Map, Preview Location | 94be46f9-90c9-49ec-8104-8d572004856e |
| DOE Stand-alone Retail (DoeRet) | Length (54.27), Depth (42.27), Back Space Depth (7), Front Depth (6), Entry Width (4), Floor Height (6.096), Orientation (0), Program Map, Preview Location | 1bf76d74-0917-4acc-8d9c-e0eaa36adcbe |
| DOE Supermarket (DoeSMkt) | Length (79.1901), Depth (52.7944), Storage Depth (8.975), Preparation Depth (9.8988), Floor Height (6.096), Orientation (0), Program Map, Preview Location | 2f12351b-adfd-40aa-a763-be4394bd814b |
| DOE Warehouse (DoeWare) | Length (45.7178), Depth (100.579), Office Depth (9.1435), Fine Storage Depth (30.4785), Floor Height (8.534), Orientation (0), Program Map, Preview Location | 814d27a4-8483-4aba-bf78-2bf4daa62f46 |
The strip mall's three store lists (counts first, as the base orders them) give one item per run, west to east; StoreRowParameters.Runs turns
them into runs: lists of different lengths, a size other than Large or Small (read in any case, white space around it ignored, as BEMGen's
other enum-like inputs, D-120, D-121), and a tenancy other than 1, 2, or 3 are
InvalidParameter, and a count below 1 is the generator's. The strip mall lists all three tenancy keys in Program Keys, whatever the runs; a key
the runs do not use is unused.