feat(группировка): реальная съёмка/сброс/связь и заполнение борта

Дашборд «Группировка» наполняется из плана: режимы SURVEY/DROP → интервалы
съёмки и сброса с контуром и станцией, окна ЗРВ выделены в отдельную «связь»
(раньше показывались как сброс). Заполнение бортового накопителя считается
из объёмов маршрутов (volumeMb) с модельной ёмкостью 500 ГБ
(ONBOARD_CAPACITY_MB) — memAt по таймлайну, подсветка контура/линии сброса
на карте.
This commit is contained in:
Дмитрий Соловьев
2026-06-08 14:00:03 +03:00
parent 2c8b317c42
commit 5fa3ceaac9
5 changed files with 238 additions and 33 deletions
@@ -31,6 +31,7 @@ const MAP_C = {
gratText: "rgba(150,180,178,0.25)",
amber: "#d99a4e",
blue: "#5b9bd5",
link: "#6f8fae",
red: "#d9685f",
teal: "#5fb3a3",
night: "rgba(20,28,46,0.55)",
@@ -217,13 +218,32 @@ function MapView({ env, apiRef }) {
}
strokeTrack(ctx, seg, MAP_C.amber, dim ? 3 : 6, dim ? 0.3 : 0.85);
ctx.setLineDash([]);
tracePoly(ctx, s.proj, stt.roi.poly);
ctx.fillStyle = "rgba(217,154,78,0.16)"; ctx.fill();
ctx.strokeStyle = MAP_C.amber; ctx.lineWidth = 1.4; ctx.stroke();
// контур съёмки есть не у всех режимов плана — рисуем только когда задан
if (stt.roi && stt.roi.poly && stt.roi.poly.length) {
tracePoly(ctx, s.proj, stt.roi.poly);
ctx.fillStyle = "rgba(217,154,78,0.16)"; ctx.fill();
ctx.strokeStyle = MAP_C.amber; ctx.lineWidth = 1.4; ctx.stroke();
}
}
// link (связь с КА) — пунктир к станции на всём окне радиовидимости (ЗРВ),
// даже когда сброс не идёт. Тоньше/бледнее сброса; реальный сброс ляжет поверх.
if (env.sched) {
const lk = SIM.intervalAt((env.sched[sat.id] || {}).link, tMs);
if (lk && lk.lon != null && lk.lat != null) {
const lp = s.proj([lk.lon, lk.lat]);
if (lp) {
ctx.save();
ctx.setLineDash([3, 6]); ctx.lineDashOffset = -dash;
ctx.strokeStyle = hexA(MAP_C.link, dim ? 0.22 : 0.55); ctx.lineWidth = 1;
ctx.beginPath(); ctx.moveTo(pt[0], pt[1]); ctx.lineTo(lp[0], lp[1]); ctx.stroke();
ctx.restore();
}
}
}
// downlink (сброс) — animated dashed line to station
if (stt.state === "downlink") {
if (stt.state === "downlink" && stt.station && stt.station.lon != null && stt.station.lat != null) {
const sp = s.proj([stt.station.lon, stt.station.lat]);
if (sp) {
ctx.save();