Files
Aislo/resources/tester/helper_508_2_sheet_follow.cjs
T

103 lines
3.4 KiB
JavaScript

/* 508-2 ③ 노선 편집 — 놓은 뒤(잠잠) 노선 띠가 잘라 받은 도엽 범위 밖이면 지금 노선 범위로 다시 받아 바꿔 끼움.
* `fetchDrainageLayers` 는 가짜(부른 범위 기록 · 서버처럼 bbox + 600 m 를 clip_lonlat 로) · 잠잠 = 20 ms.
* 메타 = 509-1 헬퍼와 같음(1 m = 0.00001 도). 결과는 JSON 한 벌.
*/
const path = require("path");
const { makeLoader } = require("./helper_ts_stub_loader.cjs");
const ROOT = path.join(__dirname, "..", "..");
globalThis.window = globalThis;
const META = {
x_min: 0,
y_min: 0,
width_meters: 10000,
height_meters: 10000,
lon_min: 127,
lon_max: 127.1,
lat_min: 37,
lat_max: 37.1,
};
const lon = (x) => 127 + x * 1e-5;
const lat = (y) => 37 + y * 1e-5;
const clipOf = ([x0, y0, x1, y1]) => [lon(x0 - 600), lat(y0 - 600), lon(x1 + 600), lat(y1 + 600)];
const calls = [];
const STUBS = {
b_asset_cache: {},
B04_PreProcess_UI_MapRender: { createNormalizer: () => ({}) },
B04_PreProcess_UI_MapRender_Prepare: { prepareLayer: () => ({ features: [] }) },
B05_Profile_UI_Drainage_Parts: {
fetchDrainageLayers: async (_projectId, _progress, scope, bbox) => {
calls.push({ scope, bbox: bbox ?? null });
const rect = bbox.split(",").map(Number);
return { meta: META, layers: [["도엽_등고선", { features: [], clip_lonlat: clipOf(rect) }]] };
},
},
B05_Profile_UI_RouteEdit_Render: { CONTOUR_BAND_M: 300 },
design_calc_server: { QUIET_MS: 20 },
};
const { load } = makeLoader({ root: ROOT, stubs: STUBS });
const contour = load("B05_Profile", "B05_Profile_UI_RouteEdit_Contour.ts");
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
let line = [
[5000, 5000],
[5500, 5200],
];
// 저장 노선으로 자른 첫 도엽(509-1 서버와 같은 범위)
let sheets = {
meta: META,
layers: [["도엽_등고선", { features: [], clip_lonlat: clipOf([5000, 5000, 5500, 5200]) }]],
line: () => line,
};
const swaps = [];
(async () => {
const out = {};
out.bbox = contour.routeBboxParam([
[5012.3, 4987.1],
[5499.9, 5200.0],
]);
const follow = contour.createSheetFollow(
"p",
() => sheets,
async (next) => {
swaps.push(next.layers[0][1].clip_lonlat);
sheets = next;
},
);
// 범위 안 끌기 — 안 받음
line = line.map(([x, y]) => [x + 250, y - 250]);
follow.poke();
await sleep(60);
out.insideCalls = calls.length;
// 범위 밖으로 크게 끌며 여러 걸음 — 잠잠 뒤 한 번만 받음 · 지금 노선 범위
for (const dx of [400, 800, 1200]) {
line = [
[5000 + dx, 5000],
[5500 + dx, 5200],
];
follow.poke();
await sleep(5);
}
out.beforeQuiet = calls.length;
await sleep(60);
out.outsideCalls = calls.slice();
out.swaps = swaps.length;
out.swappedCovers = contour.sheetCoversBand(sheets.layers[0][1], META, line, 300);
out.lineKept = sheets.line === undefined ? false : sheets.line() === line;
// 새 범위 안에서 다시 놓음 — 안 받음
line = line.map(([x, y]) => [x + 100, y]);
follow.poke();
await sleep(60);
out.againCalls = calls.length;
// 여는 때(coveringSheets) — 덮으면 같은 것 그대로
out.coveringSame = (await contour.coveringSheets("p", sheets)) === sheets;
// 떠난 뒤 — 안 받음
line = line.map(([x, y]) => [x + 3000, y]);
follow.poke();
follow.dispose();
await sleep(60);
out.disposedCalls = calls.length;
console.log(JSON.stringify(out));
})();