Press hall laid out 60/40 for Duplex systems (special pressings first)
Deploy test site / deploy (push) Successful in 46s

User (October 2026): "the factory should have more space for duplex
setups than classic, we will mainly focus on special prints and not mono
colours plan it to be 60/40 duplex classic".

- Press hall (~870 m2) planned 60/40 by floor: four Duplex bays along the
  visitor corridor and six Classic positions in the second row (440 + 300
  = ~740 m2 at 110 / 50 m2), the rest open for mould carts and staging;
  the launch plant fills one of each, growth adds Duplex systems first.
  Replaces "room for ten more Classics".
- Full hall: 8 semi-automatic presses + 6 Classics, 57/43 by press count,
  ~1,250 to 1,410 records/h gross, ~3.6 to 4.7M a year on the scale.md
  basis (was 4.7 to 5.8M for 2 Duplex + 11 Classics); ~2.1 to 2.5 t/h
  steam and up to ~1.8 MW cooling, still a utility phase of its own.
  By hourly output the six automatic Classics still press more than the
  eight semi-automatic presses (estimate).
- pressing-line.md, scale.md (capacity table, utilities), site-candidates
  .md, crane-workshop-tours.md, roadmap.md, README (the FreeCAD Payap
  model still draws the earlier layout; noted, not redrawn).
- Calculator: preset "Full hall 60/40 (4 D + 6 C)", fleet ladder Duplex
  first (1+1, 2+1, 3+2, 4+3, 4+6) plus the same floor Classic-led (2+11)
  and Duplex-only (7+0) for comparison; plant view reserves 4 Duplex
  bays and 6 Classic positions.
- Business plan draft 0.2 rebuilt (capacity table row, plot fit, layout).

Checks: renderer 720 checks pass (node budget 2,700 for the Duplex-heavy
stress preset, 60 fps), calculator regression 0 fails, level selector and
page checks clean at 390 / 1024 / 1440 px dark and light; PDF 47 pages
with a filled table of contents.
This commit is contained in:
grabowski committed 2026-10-16 20:09:56 +07:00
1 parent 4beda7f27a
commit d8b2c1e2db
11 files changed
+71 -40

No files matched your search

+16 -12
View File
@@ -612,7 +612,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
<button type="button" data-p="levers">Investor levers (216M)</button>
<button type="button" data-p="lean">Lean: bought stampers, outsourced cutting</button>
<button type="button" data-p="five">Five-press fleet (second Duplex)</button>
<button type="button" data-p="full">Full hall, Classic-led (2 D + 11 C)</button>
<button type="button" data-p="full">Full hall 60/40 (4 D + 6 C)</button>
</div>
</header>
@@ -813,9 +813,10 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
<section class="card">
<h2>From small to fully equipped</h2>
<p class="note" style="margin-top:0">Fleets from the launch plant to a full Payap press hall (about 870 m²:
the two Duplex bays plus the Classic and ten more Classic positions, or the same floor
with more Duplex systems), at the current settings and plant configuration. Click a row to load it.</p>
<p class="note" style="margin-top:0">Fleets from the launch plant to a full Payap press hall (about 870 m²,
laid out 60/40 by floor for Duplex systems because the plant focuses on special pressings: four
Duplex bays and six Classic positions, ~740 m²), then the same floor filled Classic-led or with
Duplex systems only, for comparison, at the current settings and plant configuration. Click a row to load it.</p>
<div class="tscroll"><table id="ladT"></table></div>
</section>
@@ -1238,7 +1239,9 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
function X(fx) { return FX + fx; }
function Y(fy) { return FY + fy; }
// Press hall: 2 rows, 8 m deep. Slot lengths follow the calculator's floor
// figures (110 m2 per Duplex bay, 50 m2 per Classic, 870 m2 hall).
// figures (110 m2 per Duplex bay, 50 m2 per Classic, 870 m2 hall). Laid out 60/40 by floor
// for Duplex systems (special pressings first, October 2026): 4 Duplex bays + 6 Classic positions.
var HALL_D = 4, HALL_C = 6;
var HALL = { cap: 870, aD: 110, aC: 50 };
var HROWS = [{ x: X(40), y0: Y(3.6), y1: Y(11.6), len: 52 }, { x: X(47.8), y0: Y(12.4), y1: Y(20.4), len: 44.2 }];
var LTOT = 52 + 44.2, WD = HALL.aD / HALL.cap * LTOT, WC = HALL.aC / HALL.cap * LTOT;
@@ -1279,8 +1282,8 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
var D = cfg.duplex, Cn = cfg.classic, A = 0, Dh = 0, Ch = 0, i, items = [];
while (Dh < D && A + HALL.aD <= HALL.cap + 1e-9) { Dh++; A += HALL.aD; }
while (Ch < Cn && A + HALL.aC <= HALL.cap + 1e-9) { Ch++; A += HALL.aC; }
var eD = Math.max(0, 2 - Dh); while (eD > 0 && A + eD * HALL.aD > HALL.cap) eD--;
var eC = Math.max(0, 11 - Ch); while (eC > 0 && A + eD * HALL.aD + eC * HALL.aC > HALL.cap) eC--;
var eD = Math.max(0, HALL_D - Dh); while (eD > 0 && A + eD * HALL.aD > HALL.cap) eD--;
var eC = Math.max(0, HALL_C - Ch); while (eC > 0 && A + eD * HALL.aD + eC * HALL.aC > HALL.cap) eC--;
for (i = 0; i < Dh; i++) items.push({ t: "D", n: i + 1 });
for (i = 0; i < eD; i++) items.push({ t: "D", e: 1 });
for (i = 0; i < Ch; i++) items.push({ t: "C", n: i + 1 });
@@ -1562,7 +1565,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
sc.inf("factory", "Factory, 128 x 25 m",
"Production floor only (Payap scenario model): workshop, galvanics, stamper prep, PVC lab, colour store, press hall, finishing block; warehouse and dispatch behind the fire wall. Monopitch roof, low eave 7.0 m, high side 11.4 m.");
sc.inf("presshall", "Press hall, ~870 m2",
al.Dh + " Duplex system" + (al.Dh === 1 ? "" : "s") + " and " + al.Ch + " Classic" + (al.Ch === 1 ? "" : "s") + " in the hall; laid out for 2 Duplex bays + 11 Classic positions (Payap scenario model)" +
al.Dh + " Duplex system" + (al.Dh === 1 ? "" : "s") + " and " + al.Ch + " Classic" + (al.Ch === 1 ? "" : "s") + " in the hall; laid out 60/40 by floor for special pressings: 4 Duplex bays and 6 Classic positions, ~740 m2 (pressing-line.md)" +
(al.p2need ? "; " + (al.ovD + al.ovC) + " more in the phase 2 building" : ""));
sc.inf("galvanics", cfg.galvanics ? "Galvanics clean room (Pheenix Alpha line)" : "Galvanics room: stampers bought in",
cfg.galvanics ? "PASU, PPPU, PDPU, PMPB; one PDPU covers full-capacity demand, a second is redundancy (galvanics.md). Room-in-room under the crane, open to stamper prep." :
@@ -1680,7 +1683,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
fl.flat(pts, z + 0.015, "iso-slot iso-empty", id);
sc.inf(id, sl.t === "D" ? "Duplex bay (room reserved)" : "Classic position (reserved)",
sl.t === "D" ? "Growth option: room, utility modules and ring-main tees reserved, not in the investment (pressing-line.md)" :
"Floor kept for up to ten more Classics (option, not in the plan)");
"Classic position kept for growth (option, not in the investment); the hall is laid out 60/40 for Duplex systems (pressing-line.md)");
} else fl.flat(pts, z + 0.015, "iso-slot", sl.t === "D" ? "duplex-" + sl.n : "classic-" + sl.n);
if (!sl.e && sl.t === "D") {
var cx = (sl.x0 + sl.x1) / 2, cy = (sl.y0 + sl.y1) / 2;
@@ -3076,8 +3079,9 @@ function caseNow() {
return "";
}
const LADDER = [
["Launch plant", 1, 1], ["Second Duplex", 2, 1], ["Step 1", 2, 3], ["Step 2", 2, 5], ["Step 3", 2, 8],
["Full hall, Classic-led", 2, 11], ["Full hall, mixed", 4, 7], ["Full hall, specials-led", 6, 3],
// Duplex systems first: the hall is laid out 60/40 by floor for them (special pressings, October 2026)
["Launch plant", 1, 1], ["Second Duplex", 2, 1], ["Step 1", 3, 2], ["Step 2", 4, 3],
["Full hall 60/40", 4, 6], ["Same floor, Classic-led", 2, 11], ["Same floor, Duplex only", 7, 0],
];
// presets: fleet plus plant configuration; prices, case and assumptions stay as they are
const CFG0 = Object.fromEntries(CFGK.map(k => [k, S0[k]]));
@@ -3087,7 +3091,7 @@ const PRESETS = {
levers: { ...LAUNCH, solar: "ppa", metro: "launch", galvPrice: "oms", corridor: "later" },
lean: { ...LAUNCH, galv: "bought", cut: "out" },
five: { mode: "fleet", dFleet: 2, cFleet: 1, ...CFG0 },
full: { mode: "fleet", dFleet: 2, cFleet: 11, ...CFG0 },
full: { mode: "fleet", dFleet: 4, cFleet: 6, ...CFG0 },
};
let S = { ...S0 }, A = { ...A0 };