diff --git a/docs/fleet-calculator.html b/docs/fleet-calculator.html
index df1d7a9..b77af04 100644
--- a/docs/fleet-calculator.html
+++ b/docs/fleet-calculator.html
@@ -1261,14 +1261,19 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
lost: hall.lost + p2.lost };
}
+ // street lamps: site roads, gate and car park; the utility yard gets two on its back fence
+ // (earlier positions at y 99.6 stood in the middle of the yard in front of the boiler hall)
+ var LAMPS = [[116.5, 15], [116.5, 32], [132, 45], [146.6, 62], [101, 62], [56, 15], [13, 34], [45, 113.2], [88, 113.2], [8.5, 97]];
+
// ------------------------------------------------------------ PV placement
var PV_ROWS = [1, 3, 5, 7, 10, 12, 14, 16, 19, 21];
function pvFields(cfg, al) {
var f = [];
- f.push({ key: "roofW", x0: X(1), cols: 103, y0: FY, rows: PV_ROWS, z: function (y) { return roofZ(y - FY) + 0.12; } });
- f.push({ key: "roofE", x0: X(107.25), cols: 19, y0: FY, rows: PV_ROWS, z: function (y) { return roofZ(y - FY) + 0.12; } });
+ // the parking canopies carry PV first (construction RFQ: canopy PV), the factory roof takes the rest
f.push({ key: "cars", x0: 18.35, cols: 27, y0: 6, rows: [0.15, 2.45, 4.75], z: function (y) { return 2.9 + (y - 6) / 7 * 1.2 + 0.08; } });
f.push({ key: "scoot", x0: 20.35, cols: 13, y0: 26, rows: [0.4, 2.85], z: function (y) { return 2.45 + (y - 26) / 5.5 * 1.05 + 0.08; } });
+ f.push({ key: "roofW", x0: X(1), cols: 103, y0: FY, rows: PV_ROWS, z: function (y) { return roofZ(y - FY) + 0.12; } });
+ f.push({ key: "roofE", x0: X(107.25), cols: 19, y0: FY, rows: PV_ROWS, z: function (y) { return roofZ(y - FY) + 0.12; } });
if (al.p2show) f.push({ key: "p2", x0: P2.x0 + 1, cols: 40, y0: P2.y0, rows: [1, 3, 5, 7, 10, 12, 14, 16, 19, 21, 23],
z: function (y) { return FFL + P2.eave + (P2.high - P2.eave) * (y - P2.y0) / (P2.y1 - P2.y0) + 0.12; } });
return f;
@@ -1393,7 +1398,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
// buried conveying line from the silos to the colour store
g.push(linesS(P, [[43.5, 101.5, 43.5, 94]], 0.02, "iso-buried"));
// lamp light pools (visible at dusk)
- [[116.5, 15], [116.5, 32], [132, 45], [146.6, 62], [101, 62], [56, 15], [13, 34], [60, 99.6], [110, 99.6], [8.5, 97]].forEach(function (p) {
+ LAMPS.forEach(function (p) {
var s = P.s(p[0], p[1], 0);
g.push('');
});
@@ -1449,7 +1454,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
ph.open(S2.S[0], S2.S[1], [[1, 2.2, 0, 2.2]], "iso-door").open(S2.E[0], S2.E[1], [[0.6, 2.4, 1.6, 2.4]], "iso-louvre");
sc.inf("firewater", "Fire water tank and pump house", "9 m x 4 m tank, ~200 m3 usable (planning figure); pumps: duty electric, standby diesel, jockey (facility-security.md)");
// lamps
- [[116.5, 15], [116.5, 32], [132, 45], [146.6, 62], [101, 62], [56, 15], [13, 34], [60, 99.6], [110, 99.6], [8.5, 97]].forEach(function (p) { lamp(sc, p[0], p[1]); });
+ LAMPS.forEach(function (p) { lamp(sc, p[0], p[1]); });
// trees
var T = [], x, y;
for (y = 8; y <= 112; y += 13) T.push([2.6, y, 1.6 + hash(y) * 0.6]);
@@ -1464,25 +1469,25 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
sc.inf("site", "Site plot (schematic)", "Payap scenario layout on a placeholder plot; road assumed south (site-candidates.md)");
}
function parking(sc, cfg, pv) {
- // cars under the canopy (static), then the canopies with or without PV
+ // cars and scooters are drawn inside their canopy's sprite, before the posts and the roof,
+ // so the roof always covers them (as separate sprites the depth sort put some above the roof)
var cols = ["iso-car1", "iso-car2", "iso-car3", "iso-car4"];
- [0, 1, 3, 4, 6, 8, 9].forEach(function (b, i) {
- var x = 18 + 2.77 * b + 0.5, s = sc.sprite("parking");
- s.box(x, 6.6, x + 1.75, 11.2, 0.25, 1.05, cols[i % 4]).box(x + 0.15, 7.8, x + 1.6, 10.2, 1.05, 1.55, "iso-glassd");
- });
- var sco = sc.sprite("parking");
- for (var k = 0; k < 7; k++) sco.box(20.4 + 1.37 * k * 1.4, 26.9, 20.8 + 1.37 * k * 1.4, 28.1, 0.2, 1.0, cols[(k + 1) % 4]);
var cp = sc.sprite("canopy-cars");
+ [0, 1, 3, 4, 6, 8, 9].forEach(function (b, i) {
+ var x = 18 + 2.77 * b + 0.5;
+ cp.box(x, 6.6, x + 1.75, 11.2, 0.25, 1.05, cols[i % 4]).box(x + 0.15, 7.8, x + 1.6, 10.2, 1.05, 1.55, "iso-glassd");
+ });
[18.1, 31.85, 45.6].forEach(function (x) { cp.box(x - 0.13, 9.37, x + 0.13, 9.63, 0, 3.4, "iso-steel", { noTop: true }); });
cp.prism(rect(18, 6, 45.7, 13), [2.75, 2.75, 3.95, 3.95], [2.9, 2.9, 4.1, 4.1], "iso-canopy");
pvDraw(cp, pv.by.cars.F, pv.by.cars.panels);
var sp = sc.sprite("canopy-scooters");
+ for (var k = 0; k < 7; k++) sp.box(20.4 + 1.37 * k * 1.4, 26.9, 20.8 + 1.37 * k * 1.4, 28.1, 0.2, 1.0, cols[(k + 1) % 4]);
[20.1, 33.6].forEach(function (x) { sp.box(x - 0.12, 28.6, x + 0.12, 28.85, 0, 2.9, "iso-steel", { noTop: true }); });
sp.prism(rect(20, 26, 33.7, 31.5), [2.3, 2.3, 3.35, 3.35], [2.45, 2.45, 3.5, 3.5], "iso-canopy");
pvDraw(sp, pv.by.scoot.F, pv.by.scoot.panels);
var nc = pv.by.cars.panels.length, ns = pv.by.scoot.panels.length;
- sc.inf("canopy-cars", "Car canopy, 10 bays", "27.7 x 7.0 m at 4.1 m (construction RFQ)" + (nc ? "; " + nc + " PV modules (roof full)" : ""));
- sc.inf("canopy-scooters", "Scooter canopy, ~30 spaces", "13.7 x 5.5 m at 3.5 m (construction RFQ)" + (ns ? "; " + ns + " PV modules (roof full)" : ""));
+ sc.inf("canopy-cars", "Car canopy, 10 bays", "27.7 x 7.0 m at 4.1 m (construction RFQ)" + (nc ? "; " + nc + " PV modules (~" + fmt(nc * 0.45) + " kWp)" : ""));
+ sc.inf("canopy-scooters", "Scooter canopy, ~30 spaces", "13.7 x 5.5 m at 3.5 m (construction RFQ)" + (ns ? "; " + ns + " PV modules (~" + fmt(ns * 0.45) + " kWp)" : ""));
}
// ------------------------------------------------------------ factory
@@ -2031,7 +2036,8 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
sc.tag(27, 106, inside ? 5.2 : WH + 1, "Water treatment", 7, "wt");
}
// PVC silos and big-bag station
- var cols = ["iso-silok", "iso-silok", "iso-siloy", "iso-silor"];
+ // x ascending; from the default view (north-east) they read black, black, red, yellow (user, October 2026)
+ var cols = ["iso-siloy", "iso-silor", "iso-silok", "iso-silok"];
[37.5, 41.5, 45.5, 49.5].forEach(function (x, k) {
var s = sc.sprite("silos");
s.cyl(x, 103.6, 0.9, 0, 2.2, "iso-steel", { noTop: true });