feat(757-1): 그리기 칸 긋기 단추 걷음 · 방식 넷 켬끔 = 긋기 시작 · 끝

- 분할 고르기 부품에 풂 꼴(clearable) · 부품 모음 견본에 더함
- 방식 칸(map_draw_kind)에 켬끔 꼴(onActive · setActive) — 켬 = 긋기 시작 · 고른 방식 다시 누름 = 긋기 끝 · 긋는 중 다른 방식 = 방식만 바뀜
- D03 · B05 그리기 칸 [긋기] 단추 걷음 · 긋기가 Enter · Esc · 붙어 끝나도 칸 켬 맞춤 · 노드 판은 그대로
- 시험 757_1 새로

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-02 23:03:15 +09:00
co-authored by Claude Sonnet 5.5
parent 1288e21e55
commit 011046c2a2
7 changed files with 78 additions and 27 deletions
+4 -6
View File
@@ -3,7 +3,7 @@
* D03 손 긋기 겹 · 그리기 칸(PLAN 562-3 · 580 · 요구서 389 3장 8~10 · 440 3~7) — 점을 찍어 직선으로 이음.
*
* 우클릭 메뉴(591-2 · `D03_PlanAnalysis_UI_Points`) = 이 자리에서 시작 — 빈 땅도 새 본선(지점 없이 긋기).
* [긋기] 하나 — 첫 누름 자리로 시작: 지점 = 새 본선(측점 No.0 = 긋기 시작한 지점) ·
* 긋기 방식 칸 켬 = 긋기 시작 · 끔(고른 방식 다시 누름) = 긋기 끝(589-9) — 첫 누름 자리로 시작: 지점 = 새 본선(측점 No.0 = 긋기 시작한 지점) ·
* 선이 이미 놓인 지점 = 그 점의 갈래 · 선 꼬리 = 이어 긋기 · 갈래 없는 선 머리 = 뒤집어 이어 긋고 끝낼 때
* 되돌림 · 선 위 · 꺾임점 = 갈래. 다른 지점 · 다른 선 둘레(SNAP_PX)에 오면 거기 붙고 그 점에서 끝 —
* 머리가 다른 선 꼬리에 닿으면 한 선으로 잇고 · 꺾임점에 닿으면 그 점의 갈래 · 본선 꼬리가 다른 구역에
@@ -160,12 +160,10 @@ export function createPlanDraw(params: PlanDrawParams): PlanDraw {
const kindFields = createDrawKindFields({
value: { kind, lengthM, slopePct },
onChange: (value) => ({ kind, lengthM, slopePct } = value),
// 방식을 켬 = 긋기 시작 · 고른 방식을 다시 눌러 끔 = 긋기 끝(589-9) · 긋는 중 다른 방식 = 방식만 바뀜
onActive: (on) => on !== (mode === "draw") && setMode(on ? "draw" : "idle"),
});
const drawPanel = createDrawPanel({
kind: kindFields,
page: params.page,
onDraw: () => setMode(mode === "draw" ? "idle" : "draw"),
});
const drawPanel = createDrawPanel({ kind: kindFields, page: params.page });
const panel = drawPanel.root;
function panelState(): void {
@@ -1,6 +1,6 @@
/* =============================================================================
* D03_PlanAnalysis_UI_DrawPanel.ts
* D03 좌측 「그리기」 칸 몸(PLAN 599-1 · 599-4 · 요구 463-10 · 22) — [긋기] · 구간 나눔 마커 · 긋기 방식 칸.
* D03 좌측 「그리기」 칸 몸(PLAN 599-1 · 599-4 · 요구 463-10 · 22) — 긋기 방식 칸(켬 = 긋기 시작 · 끔 = 긋기 끝) · 구간 나눔 마커.
*
* 방식 칸 `createDrawKindFields` = 공용 `A00_Common/map/map_draw_kind`(626-3) — 그리기 칸 · 노드 판(598-4) ·
* B05 평면 예정노선 그리기가 같은 부품을 씀(여기서 다시 내보냄).
@@ -27,23 +27,16 @@ export {
export interface DrawPanel {
root: HTMLElement;
/** 단추 글 · 막힘 — 긋는 중 · 고칠 수 있음 · 마커 놓을 선 있음. */
/** 방식 칸 켬 맞춤 · 막힘 — 긋는 중 · 고칠 수 있음 · 마커 놓을 선 있음. */
state: (state: { drawing: boolean; editable: boolean; canMark: boolean }) => void;
}
/** 좌측 「그리기」 칸 — [긋기] · 구간 나눔 마커(끌기) · 방식 칸. */
/** 좌측 「그리기」 칸 — 방식 칸(켬끔 꼴) · 구간 나눔 마커(끌기). */
export function createDrawPanel(opts: {
kind: DrawKindFields;
onDraw: () => void;
/** 기능 표 페이지 — 구간 나눔 마커 단추 = 「years」 사용일 때만. */
page: PlanPage;
}): DrawPanel {
const drawButton = createButton({
label: "긋기",
variant: "filled",
size: 28,
onClick: opts.onDraw,
});
const markButton = createButton({
label: "구간 나눔",
variant: "ghost",
@@ -60,16 +53,16 @@ export function createDrawPanel(opts: {
});
const row = document.createElement("div");
row.className = "d03-plan__row";
row.append(drawButton, markButton);
row.append(markButton);
row.hidden = markButton.hidden; // 마커 단추 없는 쪽(B05)은 줄도 없음
const root = document.createElement("div");
root.className = "d03-plan__draw";
root.append(row, opts.kind.root);
root.append(opts.kind.root, row);
return {
root,
state({ drawing, editable, canMark }) {
drawButton.querySelector(".ui-btn__label")!.textContent = drawing ? "긋기 끝" : "긋기";
drawButton.disabled = !editable;
drawButton.setAttribute("aria-pressed", String(drawing));
opts.kind.setActive(drawing);
opts.kind.setDisabled(!editable);
markButton.disabled = !editable || drawing || !canMark;
root.dataset.mode = drawing ? "draw" : "idle";
},
+1 -1
View File
@@ -220,7 +220,7 @@ export function createPlanMap(events: PlanMapEvents): PlanMap {
label: "평면 도구",
hint: {
lines: [
"[긋기] 뒤 지점 · 선 끝 · 선 위 누름 = 시작",
"긋기 방식을 켠 뒤 지점 · 선 끝 · 선 위 누름 = 시작",
"누름 = 점 찍기 · 다른 구역에 닿으면 그 점의 갈래로 끝",
"Enter = 긋기 끝",
"Esc = 긋기 취소",