/* 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)); })();