103 lines
3.4 KiB
JavaScript
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));
|
|
})();
|