diff --git a/D03_PlanAnalysis/D03_PlanAnalysis_UI_Page.ts b/D03_PlanAnalysis/D03_PlanAnalysis_UI_Page.ts index f0a8d59f2..a3c8746c4 100644 --- a/D03_PlanAnalysis/D03_PlanAnalysis_UI_Page.ts +++ b/D03_PlanAnalysis/D03_PlanAnalysis_UI_Page.ts @@ -107,7 +107,6 @@ export async function renderD03PlanAnalysis(root: HTMLElement): Promise { let redoStack: Snap[] = []; let surface: PlanSurface | null = null; let have: [number, number, number, number] | null = null; - let margin = 0; // 서버 받기 여유(m) let viewCore: Vertex[] = []; // 지도 보기 가운데 상자 두 귀(넓으면 빈 것) let viewTimer = 0; let lastTried = ""; // 같은 받기를 거듭하지 않음 @@ -306,21 +305,18 @@ export async function renderD03PlanAnalysis(root: HTMLElement): Promise { marks.pins, ]; - /** 점들이 받은 범위 안인가 — `pad` = 둘레 여유(m). */ - const inside = (list: Vertex[], pad: number): boolean => + /** 점들이 받은 범위 안인가. */ + const inside = (list: Vertex[]): boolean => !!have && - list.every( - ([x, y]) => - x - pad >= have![0] && x + pad <= have![2] && y - pad >= have![1] && y + pad <= have![3], - ); - const outside = (): boolean => !!have && !inside([...points, ...allVertices()], 0); + list.every(([x, y]) => x >= have![0] && x <= have![2] && y >= have![1] && y <= have![3]); + const outside = (): boolean => !!have && !inside([...points, ...allVertices()]); - /** 조용히 받기(요구 453) — 지점 · 선(+ 여유) · 지도 보기 가운데가 받은 범위 밖이면 이어 받음 · + /** 조용히 받기(요구 453) — 지점 · 선 · 지도 보기 가운데가 받은 범위 밖이면 이어 받음 · * 단추 · 막는 창 없음 · 실패 = [다시 받기] · 같은 요청은 한 번만. */ async function ensureCovered(): Promise { if (!ready || !editable || busy || failed || !epsg || !root.isConnected) return; const need = [...points, ...allVertices()]; - if (have && inside(need, margin) && inside(viewCore, 0)) return; + if (inside(need) && inside(viewCore)) return; // 받을 때 서버가 여유를 더함 const extra = [...need, ...viewCore]; const key = JSON.stringify([have, extra]); if (key === lastTried) return; @@ -411,7 +407,7 @@ export async function renderD03PlanAnalysis(root: HTMLElement): Promise { try { surface = await fetchPlanSurface(projectId); const extent = await fetchTerrainExtent(projectId, null, []); - [have, margin] = [extent.have_m, extent.margin_m]; + have = extent.have_m; } catch (error) { showToast(`지형면을 읽지 못했습니다 — ${errorText(error)}`, "error"); } diff --git a/D03_PlanAnalysis/D03_PlanAnalysis_UI_Points.ts b/D03_PlanAnalysis/D03_PlanAnalysis_UI_Points.ts index 210242e52..3cb3b662f 100644 --- a/D03_PlanAnalysis/D03_PlanAnalysis_UI_Points.ts +++ b/D03_PlanAnalysis/D03_PlanAnalysis_UI_Points.ts @@ -111,7 +111,8 @@ export function createPlanPoints(params: PlanPointsParams): PlanPoints { if (draw.mode() === "draw" && draw.stroke()) items.push(["긋기 끝", () => draw.setMode("idle")]); else if (pin !== null) { - items.push([`${name(pin)}에서 긋기 시작`, () => draw.startAt(px, py, map)]); + const [sx, sy] = map.toScreen(params.points()[pin]); // 핀 머리를 눌러도 지점 자리에서 + items.push([`${name(pin)}에서 긋기 시작`, () => draw.startAt(sx, sy, map)]); items.push([`${name(pin)} 지우기`, () => remove(pin)]); } else { const label = {