fix(skills): placing-editor-models nach dem Formatwechsel repariert

vergeLampPoints() und der Schlüssel roads existieren seit Teil 2 nicht mehr:
site-data.mjs importierte einen fehlenden Export (ESM-Link-Fehler, das
Skript starb vor der ersten Zeile) und las c.roads/c.centerlines;
render-site.py griff auf c["roads"] zu (KeyError). Beide lesen jetzt
chunkLampPoints(c) sowie die drei neuen Schichten carriageway, sidewalk
und lots (zusammen die frühere Korridorfläche); render-site.py bekommt
dafür eine eigene Vierfarb-Darstellung inklusive bridges.

Verifiziert mit einem echten Ausschnitt (1414..1564 | 1042.5..1092.5,
12 Chunks I5-L7): site-data.mjs liefert carriageway/sidewalk/lots/bridges
mit echten Werten, 4 Laternen und 3 Palmen im Fenster; render-site.py
zeichnet daraus ein plausibles Vergleichsbild ohne Absturz.
This commit is contained in:
knso committed 2026-09-18 06:15:55 +02:00
1 parent 0ad6eee71f
commit 736dcbc1ad
2 files changed
+27 -12

No files matched your search

@@ -2,13 +2,20 @@
//
// node .claude/skills/placing-editor-models/scripts/site-data.mjs <x0> <x1> <y0> <y1> <ausgabe.json>
//
// Enthält Land, Flächen (park/sand/urban), Straßen, Gebäude, Palmen und die Laternen, wie PropLayer sie
// setzt (vergeLampPoints(lampPoints(...)) je Chunk — Laternen stehen bis 16 m neben ihrer Mittellinie,
// deshalb werden auch die Nachbarchunks des Ausschnitts gelesen). render-site.py zeichnet daraus das
// Vergleichsbild; die Grenzen für Straßenrand, Felder usw. lassen sich direkt aus dem JSON ablesen.
// Enthält Land, Flächen (park/sand/urban), den Straßenkorridor, Gebäude, Palmen und die Laternen,
// wie PropLayer sie setzt (chunkLampPoints() je Chunk — Laternen stehen bis 16 m neben ihrer
// Mittellinie, deshalb werden auch die Nachbarchunks des Ausschnitts gelesen). render-site.py
// zeichnet daraus das Vergleichsbild; die Grenzen für Straßenrand, Felder usw. lassen sich direkt
// aus dem JSON ablesen.
//
// Der Straßenkorridor — bis Teil 2 ein einziger Schlüssel `roads` — steht seit dem Formatwechsel in
// drei Schichten: `carriageway` (Fahrbahn, 15 cm tiefer), `sidewalk` (Gehweg) und `lots`
// (Restflächen wie Parkplätze und Vorplätze). Zusammen sind sie genau die Fläche, die früher
// `roads` war; sie bleiben hier getrennt, weil ein Ort neben einem Gehweg anders liegt als neben
// einer Fahrbahn.
import { readFileSync, writeFileSync } from "node:fs";
import { CHUNKS_PER_SIDE, CHUNK_SIZE, SLICE, chunkName } from "../../../../src/world/coords.js";
import { lampPoints, vergeLampPoints } from "../../../../src/world/props.js";
import { chunkLampPoints } from "../../../../src/world/props.js";
const [x0, x1, y0, y1] = process.argv.slice(2, 6).map(Number);
const out = process.argv[6];
@@ -35,11 +42,14 @@ for (let i = clamp(iOf(x0) - 1); i <= clamp(iOf(x1) + 1); i++) {
key: `${i}_${j}`, name: chunkName(i, j),
land: c.land.map(rings),
surfaces: (c.surfaces ?? []).map((s) => ({ kind: s.kind, rings: rings(s.poly) })),
roads: c.roads.map((r) => ({ bridge: r.bridge, rings: rings(r.poly) })),
carriageway: (c.carriageway ?? []).map((r) => ({ rings: rings(r.poly) })),
sidewalk: (c.sidewalk ?? []).map((s) => ({ rings: rings(s.poly) })),
lots: (c.lots ?? []).map((l) => ({ rings: rings(l.poly) })),
bridges: (c.bridges ?? []).map((b) => ({ rings: rings(b.poly) })),
buildings: c.buildings.map((b) => ({ height: b.height, rings: rings(b.poly) })),
});
for (const [u, v] of c.palms ?? []) palms.push(world(u, v));
for (const p of vergeLampPoints(lampPoints(c.centerlines ?? []), c.roads ?? [])) lamps.push(world(p.x, p.z));
for (const p of chunkLampPoints(c)) lamps.push(world(p.x, p.z));
}
}