From 83397548c505b1c6e8867280fce95a09f22e075a Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 8 Oct 2026 15:54:52 +0900 Subject: [PATCH] =?UTF-8?q?chore(plan):=20100~111=EC=9E=A5=203=EC=B0=A8=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=20=EC=A1=B0=EC=82=AC=20=EB=84=B7=20=C2=B7=20?= =?UTF-8?q?=EB=B6=84=EC=84=9D=20=EC=A0=95=ED=95=A8(10-8=20=EB=B0=A4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LLCk2y5xE8YGVgjbTntWsY --- docs/raw/요구_1008_3/분석_정함.md | 58 ++++++++++ docs/raw/요구_1008_3/조사_A_M01M02일위대가.md | 86 ++++++++++++++ docs/raw/요구_1008_3/조사_B_M02면적도면.md | 68 +++++++++++ docs/raw/요구_1008_3/조사_C_B06횡단.md | 108 ++++++++++++++++++ docs/raw/요구_1008_3/조사_D_B07B08.md | 64 +++++++++++ 5 files changed, 384 insertions(+) create mode 100644 docs/raw/요구_1008_3/분석_정함.md create mode 100644 docs/raw/요구_1008_3/조사_A_M01M02일위대가.md create mode 100644 docs/raw/요구_1008_3/조사_B_M02면적도면.md create mode 100644 docs/raw/요구_1008_3/조사_C_B06횡단.md create mode 100644 docs/raw/요구_1008_3/조사_D_B07B08.md diff --git a/docs/raw/요구_1008_3/분석_정함.md b/docs/raw/요구_1008_3/분석_정함.md new file mode 100644 index 000000000..ef92dee29 --- /dev/null +++ b/docs/raw/요구_1008_3/분석_정함.md @@ -0,0 +1,58 @@ +# 3차 요구 분석 · 정함 (10-8 밤) + +근거 — `사용자요구_1008_3.md` · 조사 A(M01 · M02 일위대가) · B(M02 면적 ↔ 도면) · C(B06) · D(B07 · B08) — 파일:줄은 조사 문서에. +사방댐 도면 재요청 = 99-3 에서 고침(곡선 펴기 허용오차) · 저장된 도면은 원본으로 다시 불러와야 바뀜 → 장 없음. + +## 장 · 창 + +| 장 | 내용 | 창 | 모델 | +|---|---|---|---| +| 100 | M01 단가산출 상세 맨 아래 좌우 떨림 | sub2 | Sonnet high | +| 101 | M02 구조물 조합 표 — 일위대가 합계 칸 색 · 열 고름 중간선 | sub2 | Sonnet high | +| 102 | M02 일위대가 상세 — 손잡이 · 단추 배치 · 줄 통째 끌기 · 구분 열 품셈 글 | sub3 | Opus high | +| 103 | M02 일위대가 자재목록 — 로직 자재 기본 · 바꾸기 · 추가분만 삭제 | sub1 | Opus high | +| 104 | M02 면적 → 도면 — 행열 넣기 · 지우기 뒤 보낸 범위 따라감 · 같은 범위 겹침 · 색 · 이름표 고름 · 보내기 취소 | 데스크탑 메인 | Sonnet high | +| 105 | M02 도면 → 면적 · 상세 이동 — 칸 크기 기본 · 넣을 자리 · 도면 상세에서도 · 카드 도면 탭 · 상세 이동 단추 · 「더하기」 글 | 데스크탑 보조 | Opus high | +| 106 | B05 · B06 노면공 고름 = 범위 안 횡단 모두 강조 · 「기슭막이」 → 「흙막이」 글 | sub8 | Sonnet high | +| 107 | B06 세월교 — 유입 · 유출 따로 · 원지반 제약 삭제 · 유입 날개벽 수평 여유 | sub4 | Opus high | +| 108 | B06 조정창 제목 · 단추만 · 끌기 대각 + 걸음 맞춤 · 박스 끝 고름 범위 | sub7 | Opus high | +| 109 | B07 배수유역도 종류 · 드롭다운 공용 꼴 · IP 표 차례 · 용지도 라벨 | sub6 | Opus high | +| 110 | B08 수리 판정 — 하상경사 이음 | sub5 | Opus high | +| 111 | M02 엑셀 엔진 늦게 불러오기(정적 import 15곳) — 101~105 합친 뒤 | sub5 | Sonnet high | + +## 정함 (브레인) + +- 100 — 원인 = 오른쪽 패널이 본문 칸 아래로 28px 삐져나와 스크롤 막대가 생겼다 사라지는 고리 · (A) 넓은 화면도 `.m01-logic__main` overflow visible(좁은 화면 규칙과 같게) · 맨 아래 떨림 0 을 창 높이 셋 · 확대 100/125% 에서 수치로 · 한 층 위에서 고리가 다시 생기면 (B) `followView` +48 지움. +- 101-1 — 「(기준)」 글 지우고 칸 색으로: 붉음(기준 단가가 안 나오는 돈 줄 · 단가 없는 자재 하나라도) > 노랑(수량 없는 줄 · 자재 하나라도) > 초록(모두 반영) · 담은 것 없으면 색 없음 · 값은 지금 규칙(반영합 · 없으면 기준합) · 칸 툴팁에 까닭(「수량 없는 줄 n」 등) · 돈 아닌 로직 줄은 판정에서 뺌 · 기존 계산 칸 노랑 · 설계값 초록과 구분되는 진하기. +- 101-2 — 머리 칸 · 합계 칸 사이 겹친 테두리 없앰(CSS) · 머리를 고르면 그 열 합계 칸도 늘 같이(지금은 합계 칸을 한 번 눌러야 따라옴). +- 102 — 손잡이 = 줄 맨 왼쪽(차례 칸 앞) · 단추 칸 = [▲ 위 · ▼ 아래][옵션][삭제] · 옵션 · 삭제는 2행 높이 · 클래스 이름 그대로 · 줄 통째 끌기 = 6px 넘게 움직여야 끌기(B05 선례) · 끈 뒤 누름 한 번 무시(열림 · 닫힘 안 바뀜) · 열린 줄은 하위 줄째 옮김 · 단추 · 입력칸에서는 끌기 시작 안 함 · 구분 열 품셈 글 = 단가산출 줄만(출처 첫 낱말 건설품셈 · 산림품셈). +- 103 — ⬜ 물음 4. +- 104 — 보낸 범위 기준을 면적 문서 이름정의(`도면_T1` 꼴)로 · 저장 때 서버가 이름을 지금 범위로 풂 · 옛 연결은 적힌 범위로 · 범위가 통째로 지워지면 연결 끊고 알림 · 셀 밀기 · 당기기에도 알약 따라감 · 조건부 서식 · 유효성 범위도 행열 넣기 · 지우기에 따라감 · 같은 범위 두 번 = 허용 · 이름표 옆으로 비킴 · 표마다 색 · 이름표 누르면 그 범위 고름 + 테두리 강조 · [보내기 취소] = 연결만 끊음(도면 표는 남음 · 지우기는 도면에서) · 도면 놓기를 CAD Esc 로 그만두면 기다림 풂. +- 105 — 도면 → 면적: 칸 크기 · 글 크기 기본 · 받은 뒤 [새 시트] / [고른 칸부터](덮어쓰면 물음) · 도면 상세에도 [면적산출로 보내기] → 같은 열 면적 상세로 옮겨 가 같은 창(저장은 사용자 [저장]) · 카드 도면 미리보기 = 공용 탭 줄(고르기만) · 카드 저장은 문서 전체(지금 탭 장이 1장을 덮던 흠) · 면적 패널 도면도 탭 · 상세 이동 단추 = 제목과 ? 사이 [도면][일위대가][면적산출] 셋 · 지금 것 눌림 · 뒤로 단추와 같은 보임 조건 · 「칸 더하기」 · 「시트 더하기」 → 「추가」(30-1). +- 106 — 노면공 고름 = 시작~종료 측점 안 횡단 카드 모두 테두리 강조(가장 가까운 카드는 지금처럼 고름) · 구간형 구조물 모두 같은 규칙 · 「기슭막이」 글 = B05 · B06 화면(로케일 · 툴팁 · 정의 label) 만 「흙막이」 · 저장 값 · 키 그대로(값 「기슭막이」는 보일 때만 「흙막이」) · 사방 자료(M02 집계표 경로 · 지식 · 도움말 · 사방 견본) 그대로 · ⬜ 물음 3. +- 107 — 세월교 이동 연계 원인 둘 다 고침: ① 관 1 m 맞춤(80-2)은 기본 자리 기준으로만(사용자 이동은 반대쪽을 안 밈 · 수량 L 은 지금처럼 올림) ② 측벽 · 흙막이 동시 고름 금지(하나 고르면 다른 것 풂) · 원지반 제약 ⬜ 물음 1 · 날개벽 수평 여유 ⬜ 물음 5 · 「측벽 높이(자동)」 줄은 유입 · 유출 모두 지움(저장된 손 값은 남고 ↺ 로 지움) · 끝 마감선(절토 · 성토부선) · 91-4 암 무릎 · 수평공간이 지반에서 끊김은 토공 선이라 남김 · 박스는 화면에서 원지반을 바꾼 사본으로 본체 · 끝 · 날개 · 흙막이 자리가 그대로인지 수치 확인. +- 108 — 조정창(횡단도 안)은 제목 · 단추만: 읽기 줄 · 줄 이름 · 머리줄 ↺ 집수정 단추 지움 · 끄는 중 미리보기 글은 남김 · 좌측 사본(dock)은 그대로 · 끌기 = 두 축 동시 · 놓을 때 패널 걸음으로 맞춤(벽 · 집수정 · 세월교 = 수평 · 1:1.2 사면 두 칸 · 박스 = 길이 · 표고) · 미리보기 = 맞춘 자리 · 한계에 걸리면 가장 가까운 허용 자리 · 박스 끝 고름 = 박스 끝~에이프런 바깥(저판 밑~상판 위) · 본체 = 두 끝 사이 · 날개벽 없는 끝 = 박스 끝 바깥 얇은 띠. +- 109 — 유역도 = 미리 정한 종류(양식 「유역도」 1/6,000 한 장 · 조각 고르기 없음) · × 로 지우고 「새 종류」의 양식 고르기로 다시 만듦 · 옛 확정 유역도는 [업데이트] 다시(93-2 용지도와 같음) · 드롭다운 = 평면도 칸 select 를 공용 `createSelectField` 로 · IP 표 = 첫 줄 맨 위 · 왼 → 오 · 위 → 아래 · 묶음은 왼쪽 아래 기준 그대로 · 용지도 라벨 글 1.8 → 3.6(2배 · 상수 하나로) · 라벨 상자 밑 선(등고선 · 필지 · 읍면동 · 시군구 · 계류) 잘라 냄(IP 표 `_clip` 꼴 · 테마 · DXF 모두 맞음 · 흰 채움 대신). +- 110 — ⬜ 물음 2 · 저장된 측점도 바뀌게 연결값(linked)으로 실음 · 96 「하상경사 안 이음」 주석 · 시험 고침 · 세월교 · 물넘이 판정은 계산 구조상 늘 O K(이번엔 그대로 · 보고만). +- 111 — 101~105 가 M02 파일을 고치므로 그 장들 합친 뒤 · test_spreadsheet_size 「M02 만 늦게 불러옴」 통과. + +## ⬜ 사용자 물음 + +1. (107) 세월교 기본 바닥 높이 — Ⓐ 노면 − (관경 + 최소 토피)(원지반 안 봄 · 박스 「노면 − 복토」와 같은 꼴 · 깊은 계류면 ▲▼ 로 내림 · 추천) / Ⓑ 처음 놓을 때 하상값을 굳혀 저장. +2. (110) 하상경사 원천 — 관 = B06 실제 관 경사(관 바닥 두 끝 높이 차 ÷ 거리) · 박스 = B06 횡단 원지반 두 끝 경사(박스 본체는 늘 수평) · 0 % 이하면 빈칸(손 입력) — 추천. +3. (106) 계류 · 사방 독립 구조물 「기슭막이」(D 군)는 진짜 사방 구조물이라 그대로 둠 — 추천(바꾸면 C 군 「흙막이」와 이름 겹침). +4. (103) 자재목록 — 로직 자재는 [바꾸기]만(삭제 없음) · 금액은 이미 로직 단가 안이라 합에 다시 안 더함(보기만) · 수량은 로직을 따름(알약 없음) · 하위 로직 안 자재는 이번엔 안 보임(엔진이 맨 위 층만 고름) · 입력(관경 등)을 바꾸면 그 입력에 걸린 고름은 기본으로 · 로직 자재와 같은 품목을 사용자가 또 추가하는 것은 막음 — 추천. +5. (107) 유입 날개벽 수평 여유 — 흙막이 수평공간과 같은 칸 · 기본 1 m · 면적 밖(날개벽 끝선과 같음) — 추천. + +## 파일 겹침 · 차례 + +| 파일 | 창 | 차례 | +|---|---|---| +| `M02_MasterTemplete_Labor_Rows.ts` · `Labor_Detail.ts` · `Labor.css` | sub3(102 · logicTable) · sub1(103 · matTable) | 다른 함수 자리 · 늦게 올리는 쪽이 받아 합침 | +| `M02_MasterTemplete_UI_Main.ts` | 데스크탑 보조(105 머리 줄) · 데스크탑 메인(104 점선 :286-305) | 다른 자리 | +| `A00_Common/spreadsheet/spreadsheet_links.ts` | 데스크탑 메인(104) | 혼자 | +| `B06_Section_UI_Cross_Ford_Panel.ts` | sub4(107 높이 줄) · sub7(108 읽기 줄 · 끌기 놓기) | sub4 먼저 올림 → sub7 은 받은 뒤 고침 | +| `B06_Section_UI_Cross_Structure_Panel.ts` | sub7(108) · sub8(106 툴팁 410-417) | 다른 자리 | +| `B06_Section_UI_Cross_View.ts` | sub8(106 강조 81-85 · 273) · sub4(107 동시 고름 224-245) | 다른 자리 | +| `B06_Section_Structure_Layouts.ts` · `Server_Calc_Prebuild.py` | sub5(110 관 경사 키) | 혼자 | +| M02 화면 파일 15곳 import | sub5(111) | 101~105 합친 뒤 | diff --git a/docs/raw/요구_1008_3/조사_A_M01M02일위대가.md b/docs/raw/요구_1008_3/조사_A_M01M02일위대가.md new file mode 100644 index 000000000..b95cd042b --- /dev/null +++ b/docs/raw/요구_1008_3/조사_A_M01M02일위대가.md @@ -0,0 +1,86 @@ +# 조사 A — M01 떨림 · M02 일위대가 화면 (10-8 밤 · 읽기 전용 조사 에이전트) + +경로는 프로젝트 루트 기준 · 「추정」 = 코드로 확인 못 한 판단. + +## 1. M01 단가산출 상세: 맨 아래에서 좌우 떨림 +현재(코드로 고리 확인 · 화면 재현 안 함 · 근거 강함) +- 끝까지 내리면 오른쪽 패널이 본문 칸 아래로 28px 삐져나옴 → 그 칸에 세로 스크롤 막대 → 본문 폭 약 15px 줄고 글 다시 줄바꿈 → 패널 높이 다시 잡는 쪽(`followView`)이 막대 생긴 칸을 스크롤 칸으로 잡음 → 패널 줄어 삐져나옴 없어지면 막대 사라짐 → 처음 상태 · 매 프레임 되풀이. +- 근거: 패널을 행 바닥보다 최대 48px 아래까지 `translateY`(`ui_template/ui_template_side_panels.ts:211-216` · followView 쓰는 곳은 M01 하나 `:172-173` · M02 둘은 `follow:false`) · 패널 행은 `main.m01-logic__main` 마지막 자식(`M01_MasterData_UI_LogicLab.ts:568-571`) · 그 칸 `overflow:auto` · 높이 미정 · 아래 여백 0(`M01_MasterData_UI_Logic_Style.css:37-44`) · 부모 `.m01-logic{height:100%}` 도 auto 로 풀림(`:7-17`) · 문서 끝 = 행 바닥 + 28px(12 + 16 `M01_MasterData_UI_Style.css:27-33` · M01 바닥글 없음 `A00_Common/main.ts:26-38`) · transform 상자도 스크롤 넘침에 듦 · `scroller()` 는 지금 넘치는 칸만 잡음(`scrollHeight > clientHeight+1` `:178-184`) → 패널 바닥 한계가 창 바닥과 행 바닥 사이를 오감 · ResizeObserver(패널 `:225` · 행 `:199-203`)가 `place()` 다시 부름. +- 폭 900px 이하에서는 이미 `overflow:visible`(`:24-35`) — 떨림 없음(추정). +고칠 자리(둘 중 하나) +- (A) CSS 한 줄: 넓은 화면도 `.m01-logic__main` `overflow: visible`(좁은 화면 규칙 `:31-34` 과 같아짐) · 51-1 기대(끝에서 패널 높이 = 창 높이 − 머리띠) 그대로. +- (B) JS: `side_panels.ts:213,215` `+ 48` 지움 · 끝에서 패널 28px 짧아짐 → `resources/tester/ui_checks/51-1_오른쪽패널_높이.js:4` 기대 고침. +위험: (A) 패널 바닥이 바깥 `.ui-workflow-layout__main{overflow:auto}`(`ui_template/ui_template_workflow_layout.css:132-137`) 바닥과 딱 맞음 — 반올림 1px 넘치면 한 층 위에서 같은 고리 → 화면 확인 · 넓은 자식이 들어오면 가로 넘침 · `test_ui_side_panels.py:59` 무관. +확인법: 끝까지 내린 채 `.m01-logic__main` `scrollHeight − clientHeight` 가 0 과 28 사이를 오가는지. +크기: 작음. + +## 2. 구조물 조합 「일위대가 합계」 칸 색 +현재 +- 서버 `_labor_sum`(`M02_MasterTemplete/M02_MasterTemplete_Store.py:240-249`): 반영합 계가 0 아니면 그 값 · 아니면 기준합 계 + `합계기준` · 담은로직 없으면 빈 칸 · 화면 `laborSumText` 가 「(기준)」(`M02_MasterTemplete_Structure.ts:77-82`) · 연결 `UI_Main.ts:363` → `ui_template/sheet/ui_template_sheet_render.ts:182-201,274-276`(글만). +- 흠: 수량 일부만 있으면 부분 반영합이 그냥 돈으로 보여 완료처럼 보임 · 모든 줄이 실패하면 「0 (기준)」. +판정 자료(labor 문서 `계산값` `M02_Labor_Doc.py:309-331 settle`): `줄[]` = `기준`(돈 묶음 또는 None) · `까닭` · `결과`(돈 아닌 로직) · `수량` · `수량출처`(손 · 칸 · 없음) · `반영` · `자재[]` = `기준단가`(없으면 「단가 없음」 `:334-349`) · `수량` · `수량출처` · `반영`. +규칙안: 로직 · 자재 모두 0 → 색 없음 · 붉음 = 기준 None + 까닭 있는 줄 또는 기준단가 None 자재 하나라도(「돈 아닌 로직」 줄 · `결과` 줄 뺌) · 노랑 = 수량 없는 돈 줄이나 자재 하나라도 · 초록 = 모두 반영. +고칠 자리: 서버 `Store.py:240-249` 에 `합계상태`(`합계기준` 은 시험 때문에 남김) · 화면 자료 `Api_Fetch.ts:184-192` 꼴 필드 · `Structure.ts:77-82` 상태 함수 · `UI_Main.ts:363` 갈고리 · 표 `ui_template_sheet.ts:62-63,95` · `render.ts:47-48` + masterRow 합계 칸 `is-sum-ok|short|error` · CSS `ui_template_sheet.css:148-152` 곁. +재사용: 색 토큰 꼴 `ui_template_sheet.css:98-108`(success · warning · danger 섞기). +위험: 합계 칸에도 열 꼴 색(보라 `is-hand` 등 `render.ts:95-99,144-149`) 붙음 → 합계 칸에선 뺌 · 기존 노랑(계산 칸) · 초록(설계값 칸)과 뜻 다름 → 진하기로 구분 · `test_m02_combo_table.py:82` 가 `.ui-sheet--combo .ui-sheet__meta td` 글 금지 → 다른 셀렉터 · 합계 규칙 시험 `:96-116` · 저장된 계산값은 M01 단가 바뀌어도 다시 저장 전까지 옛 값(86-3 과 같음). +크기: 중간. + +## 3. 열 고름 때 머리–합계 칸 사이 「중간선」 +- 현재: 가장 깊은 머리 칸 `th.is-head-picked` 와 합계 칸 `td.is-selected` 가 각자 2px 테두리(outline · offset −2px)(`ui_template/sheet/ui_template_sheet.css:133-142`) · 칸 아래 1px 선(`:56-68`) → 두 상자 안쪽 변(2 + 1 + 2px)이 가로 띠 = 「중간선」(추정) · 머리 칸은 머리 맨 아래까지(`ui_template_sheet_header.ts:5`) · 합계 칸이 같이 칠해지는 건 합계 칸을 한 번 누른 뒤뿐(머리 누르면 앞 줄 열쇠 그대로 `ui_template_sheet.ts:335` · `selectColumn` · 방향키는 단위 줄 열쇠 `KEY_UNIT` — 조합 표엔 그 줄 없음 `:229,441-442`). +- 고칠 자리(CSS 만): `.ui-sheet--combo .ui-sheet__table:has(td.is-selected) th.is-head-picked` outline 없애고 inset box-shadow 세 면(아래 없음) + 아래 테두리 투명 · 같은 표 `td.is-selected` 세 면(위 없음). +- 재사용: `:has()` 이미 씀(`M02_MasterTemplete_Structure.css:41-59`). +- 위험: 틀고정 `.is-frozen` box-shadow(`:87-91`) 덮어씀 → 합쳐 적음 · 줄 열쇠를 합계 줄(KEY_SUM)로 바꾸는 법은 피함(F2/Enter 머리 이름 고침이 `sel.r === KEY_UNIT` 에 묶임 `ui_template_sheet.ts:269` · 시험 `test_m02_combo_table.py:64-69`). +- 크기: 작음. + +## 4. 단가산출 로직 줄: 손잡이 · 단추 배치 +- 현재: 끝 열 `m02-labrow__tools` 2행 — 위 [⠿ ▲ ▼](`.m02-labrow__order`) · 아래 [옵션|수정][삭제](`ui-btn-group`) · 코드 `M02_MasterTemplete_Labor_Rows.ts:340-356`(손잡이) · `:396-436`(단추 칸) · CSS `M02_MasterTemplete_Labor.css:89-125`(세로 flex · 화살표 20px). +- 고칠 자리: 손잡이 → 차례 칸(`Labor_Rows.ts:362` `m02-labrow__no`) 앞(옵션 줄 · 하위 줄 · 합계 줄에도 같은 칸 → 열 수 그대로) · 단추 칸 → 가로 [▲/▼ 세로 둘][옵션][삭제] · `.m02-labrow__order` 세로 · 묶음 단추 `align-self:stretch` 로 2행 높이. +- 위험: 클래스 이름을 시험 · 시나리오가 묶음(`test_m02_card_shell.py:157` · `ui_checks/51-14_순서칸_2행_옵션수정.js:38,43` · `47-5_일위대가_줄_고름.js:110`) → 이름 그대로 · 배치만 · 같은 표를 상세 · 카드(`ItemCards.ts:313-319`) · 서고(`Labor_RefEdit.ts:94`) 셋이 씀 · 좁은 칸 카드 꼴(`Labor.css:280-399`) 확인. +- 크기: 작음. + +## 5. 로직 줄 통째 끌기 (열림/닫힘과 구분) +- 현재: 줄 누름 = 고름 토글(`Labor_Rows.ts:439` → `Labor_Detail.ts:326-331` · 같은 줄 다시 누르면 닫힘) · 하위 줄 `subRows :242-295` · 끌기는 손잡이만 HTML5 끌어놓기(`:340-356,440-454` · 모듈 변수 `dragFrom :152`) · 줄 자체는 draggable 아님(85-3 에서 별칭 입력칸 글 고르기 지키려고). +- 재사용(선례): `B05_Profile/B05_Profile_UI_Profile_Wheel.ts:29-33,117-177`(문턱 6px — 4px 은 손떨림으로 지적받음 · 끌기 시작을 막는 부품 목록 · 문턱 넘은 뒤에만 포인터 잡기 · 끈 뒤 click 한 번 삼킴(capture · once + 다음 프레임에 걷음)) · `ui_template/ui_template_overlay_drag.ts:7-9,23,144,172`(「제목 누름 = 접기 토글」 위에 4px 끌기 — 같은 문제를 푼 공용 선례) · `M02_MasterTemplete_TreePanel_Drag.ts` 는 HTML5 draggable 이라 줄 안 입력칸 있는 이번엔 안 맞음. +- 고칠 자리: `logicTable`(`Labor_Rows.ts:439-454`) — 로직 줄 · 옵션 줄 · 하위 줄에 포인터 끌기 · 막을 것 `button, input, a, [data-labor-qty-open]` · 놓을 줄 `elementFromPoint` → `closest("tr[data-labor-logic],tr[data-labor-opt]")` · 표시 `is-dragover`(`Labor.css:115-117`) · 놓으면 `move` → `reorder`(`Labor_Detail.ts:319-323`) · 손잡이도 같은 길로. +- 위험: 끈 뒤 click 안 삼키면 놓자마자 열림/닫힘 바뀜 · 고칠 때마다 표 통째 다시 그림(`Labor_Detail.ts:183-200`) → 끄는 동안엔 안 그림 · 고른 줄은 키로 따라가 순서 바뀌어도 유지(`:110-111`). +- 크기: 중간. + +## 6. 일위대가 자재목록: 로직 자재가 기본 · 사용자 추가분만 삭제 +현재 +- `자재[]` 에는 사용자가 [자재 추가]로 넣은 것만(`Labor_Detail.ts:432-445` · `M02_Material_Pick.ts` 는 조건 없는 전체 찾기) · [삭제] `:342-345` · 서버 검사(MT 키 존재 · 같은 자재 두 번 금지) `M02_Labor_Doc.py:122-141` · 사용자 자재 금액(기준단가 × 수량)은 재료비로 기준합 · 반영합에 듦(`:324-330`) · 면적 알약 「자재|MT」도 만듦(`:228-242`). +- 로직 자재 = 호표 `종류:"재료"` 줄 · 마스터 로직 1469개 중 275개에 729줄(요소: 조건 묶음 678 · 직접 키 51 · 조건에 `{입력}` 든 줄 32줄 / 19개 로직) · 이 금액은 엔진이 로직 재료비 안에서 이미 셈. +- M02 에서는 품목 못 고름 — `run_line`(`M02_Labor_Doc.py:388-400`)이 `고름` 없이 돌아 늘 대표 줄 · [옵션] 모달에도 자재 고르기 없음 · 입력값(예 관경)이 조건 규격을 바꿀 뿐. +- 엔진에는 길 있음: `고름 = {호표 차례: MT키}`(`resources/master_data/scripts/master_pick.py:29,34-40`) · 맨 위 층 줄에만(`master_formula.py:616` `n if depth == 0`) · 답 줄마다 `품목{키,이름,규격,단위,값칸}`(`master_pick.py:130-150`) — 이미 `계산값.줄[].줄[]` 에 실림. +- 프로젝트 쪽은 이미 씀: `고른자재.json`(`M02_Item_Snapshot.py:50`) → `M02_Item_Prices.py:301 choosing` · 사본 만들 때 씨앗은 빈 것(`M02_Item_Snapshot.py:116`). +고칠 자리(안) +- 문서 꼴 `담은로직[].고름?: {호표 차례: MT키}` — `clean :112-121` 에 넣음(안 넣으면 저장 때 지워짐) · 화면 `normalizeLabor`(`Labor_Api.ts:161-170`) · `LaborRow`(`:124-134`). +- 계산: `run_line` 을 `mf.mp.choosing(고름)` 으로 감쌈 · 로직 자재 줄(차례 · 이름 · 단위 · 조건 · 품목 · 단가 · 수량 · 까닭) 함께 내보냄 · `calc :375` 에서 넘김. +- 화면: `matTable`(`Labor_Rows.ts:530-615`) 두 갈래 — 로직 자재 [바꾸기]만(삭제 없음) · 추가 자재 [삭제] · `Labor_Detail.ts:201-211` 에서 그림. +- 프로젝트 사본: `build_snapshot`(`M02_Item_Snapshot.py:112-116`) 씨앗을 문서의 고름으로. +재사용: M01 시험 계산 `materialRows`(`M01_MasterData/M01_MasterData_UI_Logic_CalcPick.ts:59-104` · 재료 줄마다 「잡힌 품목 + 고르기」 · 조건으로 찾기 씨앗) · `openPickTable`(`M01_MasterData_UI_Logic_PickTable.ts:44`) · `material_price`(가격 다섯) · 검사 `_check_picks`(`M02_Item_Copy.py:147-156`) · 재적용 때 보존 `_kept_picks`(`:210-226`). +위험: 이중 계산 — 로직 자재 금액은 로직 재료비 안에 있음 → 합 · 알약 · `settle` 짝(`Labor_Calc.ts` 거울 시험)에 넣으면 안 됨 · 하위 로직(종류 로직 1075줄) 안 자재는 못 고름 · `{입력}` 조건 줄은 입력 바꾸면 고른 품목과 어긋남 · 같은 MT 를 사용자가 또 추가하면 두 번 셈 · 단가승격(`M02_Labor_Ref.py:395-407`) · 서고도 같은 계산 길 → 범위 정함 · 원본 로직 파일은 읽기만. +크기: 큼. + +## 7. 구분 열 아래 「산림품셈 · 건설품셈」 +- 현재: 구분 칸 `kindOf` 글만(`Labor_Rows.ts:43-48,363`) · CSS `Labor.css:168-171`. +- 자료: `ItemLogic.출처`(`Api_Fetch.ts:342-351` ← `M02_Labor_Inputs.py:66-91`) 상세 · 보기 갈래 모두 `data.logics` 에 이미 · 출처 첫 낱말 「건설품셈」 1139 · 「산림품셈」 330. +- 고칠 자리: `:363` 칸에 `` 하나(정규식 `/^(건설|산림)품셈/` 맞을 때만) + CSS(block · 작은 글) · 좁은 칸 꼴 `Labor.css:321-325`. +- 재사용: `M01_MasterData_UI_LogicLab_Source.ts:76-77 bookOf`(내보내지 않음 · 「건설/산림」만) — 정규식 한 줄이 더 짧음. +- 위험: 참조 줄(단가승격 · 일위조합) · 자체 로직은 출처 없거나 달라 빈칸. +- 크기: 작음. + +## 8. 도면 · 일위대가 · 면적산출 상세 사이 이동 단추 +- 현재: 머리 줄 `M02_MasterTemplete_UI_Main.ts:146-157` = [← 뒤로][제목 h2 18px(`UI_Style.css:81-88`)][?][slot][다시 읽기][저장] · 보임 조건 `bar() :235-242` · 뒤로 단추는 `sel.kind in NUMBER_FIELD`(`:61-65` · 도면 · 면적 · 일위대가)일 때 · 같은 열 다른 상세 여는 길 = `confirmLeave()` 뒤 `open({...sel, kind})`(선례 goArea `:406-409` · 뒤로 `:593-603` · 카드 [수정] `:268-270`). +- 고칠 자리: 제목과 `helpSlot`(?) 사이 [도면][일위대가][면적산출] 묶음 · 보임 조건 = 뒤로 단추와 같게 · 누르면 위 길. +- 재사용: `ui-btn-group`(`ui_template/ui_template_general_layout.css:51-56`) · 눌림 꼴 `M02_MasterTemplete_Structure.css:293`(`aria-pressed`) · 86-1 세 단추 물음(`confirmLeave`). +- 위험: 면적에서 「도면으로 보내기」 대기 중이면 물음(정상) · 프로젝트 층 상세에 단추가 보이면 그 열 문서가 없을 때 오류 화면(추정) · 머리 줄 좁으면 다음 줄로. +- 크기: 작음. + +## 미결 (조사 에이전트 제시) +1. (1) (A) CSS 로 패널 끝까지 꽉 vs (B) JS 로 +48 없애 끝에서 28px 짧게. +2. (2) 노랑 칸 값 = 기준합 vs 부분 반영합 · 「(기준)」 글 지울지 · 붉음 기준(한 줄이라도 기준 실패 vs 합 전체 안 나올 때만) · 로직 안 재료 「값 없음」 줄도 붉음인지 · 자재만 있고 로직 없는 열 판정. +3. (3) 머리 고르면 합계 칸도 늘 같이 칠할지(지금은 합계 칸을 한 번 눌러야 따라옴). +4. (5) 끌기 문턱 B05 와 같은 6px · 길게 누름 없이 거리만으로 구분. +5. (6) 로직 자재 줄 금액은 보기만 · 합에서 뺌 · 로직 자재에도 면적 알약 · 하위 로직 안 자재 · 입력 바뀌면 고른 품목 지움 · 같은 MT 사용자 재추가 막음 · 프로젝트 사본 · 단가승격까지. +6. (7) 단가승격 · 일위조합 줄에도 책 이름. +7. (8) 단추 셋 다 두고 지금 것 눌림 vs 다른 둘만 · 프로젝트 층에도. diff --git a/docs/raw/요구_1008_3/조사_B_M02면적도면.md b/docs/raw/요구_1008_3/조사_B_M02면적도면.md new file mode 100644 index 000000000..2917a79e6 --- /dev/null +++ b/docs/raw/요구_1008_3/조사_B_M02면적도면.md @@ -0,0 +1,68 @@ +# 조사 B — M02 면적산출 ↔ 도면 (10-8 밤 · 읽기 전용 조사 에이전트) + +R = 프로젝트 루트 · SS = `A00_Common\spreadsheet` · M02 = `M02_MasterTemplete` · CAD = `B07_DesignDetail\openwebcad\src` + +## 1. 행·열 넣기/지우기 뒤 지정 범위가 따라가는지 +현재 동작 +- 따라가는 것 (행·열 전체 명령 `insertDelete`, SS/spreadsheet_commands.ts:257-350) — 칸 값 · 식(`shiftForCommand` :128-132 · `shiftSpan` refshift.ts:39-56) · 메모 · 병합 · 이름정의(:307-312) · 행열 정보 · 필터 · 틀고정 · 알약 `연결`(`applyLinked` → `shiftLinks` spreadsheet_links.ts:96-130 · 지운 칸의 알약은 빠짐). +- ① 보낸 범위는 안 따라감 — 「도면으로 보내기 안 됨」의 원인. + - `연결표[].범위`는 도면 파일에만 있고 면적 문서에는 없음. + - 점선은 화면을 열 때 한 번 읽은 고정 글(UI_Main.ts:286-293 → `sentRanges` AreaToDrawing.ts:132-145 → links.ts:415-422). + - 면적 [저장] 때 서버 `refresh_drawing`(M02_Area_Table.py:44-86 · 옛 범위 :57-60)이 옛 주소의 칸으로 도면 표를 다시 씀(Store.py:173-175 · Router_Layers.py:371-372). + - 도면을 열 때 `checkStale`(AreaToDrawing.ts:260-291)도 옛 범위로 견줌. +- ② 셀 삽입/삭제 「밀기·당기기」는 「칸」 명령으로 손수 옮김(spreadsheet_insert_dialog.ts:7-11, 58-112) — 알약 연결 · 상대참조 · 병합 · 이름 · 보낸 범위가 제자리에 남음 → 알약이 다른 칸 값을 읽어 일위대가 수량 틀어짐. 잘라 붙이기(`옮기기`) · 정렬도 알약을 안 옮김(applyLinked 는 행열 명령만 봄 :117). +- ③ 조건부 서식 · 유효성(드롭다운) 범위: `remapCondFmtRanges`(condfmt.ts:103) · `remapValidationRanges`(validation.ts:67) 있으나 부르는 곳 없음. +- ④ 드문 경우: 알약 모듈 늦게 불러옴(spreadsheet.ts:169-178) — 다 받기 전 행을 넣으면 연결이 안 옮겨짐. + +재현: 면적 B2:C3 → [도면으로 보내기] → 도면 T1 놓고 [저장] → 면적 다시 열면 점선 T1 = B2:C3 → 1행 위 행 넣음 → 값은 B3:C4 · 점선은 B2:C3 그대로 → [저장] → 도면 T1 첫 줄 빈칸 · 끝 줄 빠짐 · 서버가 `값`도 새로 적어 「값 바뀜」 알림 안 뜸. + +고칠 자리 +- ①(권장·추정) 보낸 범위의 기준을 면적 문서 안에 — 시트 `이름정의`(예 `도면_T1`) · 연결표 줄에는 이름 · `areaTable`(common_util/common_util_spreadsheet_node.ts:65-71)이 이름을 지금 범위로 풂 · `refresh_drawing` 이 연결표 범위도 갱신 · 점선은 `placeDots` 가 이름정의로 풂. 대안(점선만 옮기고 면적 저장 때 도면 파일도 씀)은 두 파일 저장 · 되돌리기 짝 없어 비권장. +- ② insert_dialog 밀기 때 `연결`도 같이 옮김(시트 통째 묶음) · `applyLinked` 에 `옮기기` 갈래. +- ③ `insertDelete` :343 근처에서 두 remap 함수를 `shiftRange`(:295-300)로 부름. +재사용: 이름정의가 이미 따라감 · `restoreChanged`(:118-125) · `shiftSpan`. +위험: 보낼 때 면적 문서를 또 고침(지금 보내기 전 저장 물음 AreaToDrawing.ts:219-223 → 한 번 더 저장 또는 서버가 적음 · 판 바뀜) · 옛 연결표(이름 없음)는 범위로 폴백 · 사용자가 「범위 이름」 창에서 지울 수 있음 · ③ commands 는 기본 번들이라 condfmt · validation 을 끌어오면 크기 예산(test_spreadsheet_size) 걸림 → 5줄 정도 옮겨 적는 편이 안전. +크기: ① 중간 · ② 작음~중간 · ③ 작음 + +## 2. 구조물 조합 카드 도면 미리보기에 탭 +- 현재: `mountStructure`(M02_MasterTemplete_DrawingCard.ts:67-101)는 `mountDrawingTemplate(doc.도면)` 1장 + 「장 n」 배지(:91-99) · 카드 저장도 `도면`만(:140-145) · 부르는 곳 ItemCards.ts:454-461. +- 고칠 자리: DrawingCard.ts 에서 `mountStructureSheets`(M02_MasterTemplete_Drawing.ts:418-544 · 이미 `cad_host_tabs` 탭 줄 · 장 도번 · 받아 두기) 로 · 배지 지움 · 저장 `{...doc, ...await handle.getDoc()}`. +- 재사용: CSS `.m02-drawing > .cad-tabs`(Drawing.css:110) · 보기만이면 탭 기능 없음(:442) · 1장이면 줄 숨김(:488). +- 위험: ① CAD Ctrl+S `onSave(drawing)` 인자 = 지금 탭의 장(DrawingCard.ts:155) — 2장 보다 저장하면 1장 `도면`을 덮어씀 → getDoc() ② 고치기 갈래면 [+] · 지우기 · 끌기까지 켜짐(:442 readOnly 로만 가름) — 고르기만이면 옵션 하나 ③ 카드 높이 늚 ④ test_m02_drawing_card.py:6 「도면만」 단정 고침 ⑤ 면적 패널 도면(AreaDrawing.ts:99)도 1장만 — 같이 바꾸면 다른 장에서도 보냄. +- 크기: 작음 + +## 3. 같은 범위 두 번 보내기 · 색 · 하이라이트 · 범위 지정 취소 +현재 +- 놓는 길: `send`(AreaToDrawing.ts:217-247) → `onDrawing`(:307-330 · 새 T번호 `nextId` :250-257) → `placeTable`(Drawing.ts:525-528) → CAD `startPlaceTable`(integration/aislo-table-bridge.ts:41-55) → PLACETABLE(tools/annotate/place-table-tool.ts:39-49) · 표가 커서를 따라오고 누른 자리 = 왼쪽 위 · 겹침 피하기 · 자리 제안 없음 · 같은 범위 다시 보내도 막거나 묻지 않음. +- 「라벨」: 도면 쪽 표에는 이름표 없음(TableEntity 는 `style.연결`만 :37-38) → 라벨 = 면적 시트의 점선 + 이름표 「T1 도면」(links.ts:444-454 · links.css:254-273)으로 봄(추정) · 같은 범위가 둘이면 테두리 · 이름표가 같은 자리에 겹쳐 뒤의 것만 보임 · 색은 모두 `--color-accent` · `pointer-events:none` 이라 못 누름 · 마우스 올리면 title 만(:465-469). +- 범위 지정 취소: 「범위 고르기 상태」 없음 — `range` 는 시트에서 고를 때마다 갈아 끼움(UI_Main.ts:305 → AreaToDrawing.ts:294 · 처음 A1) · 보낸 범위를 지우는 길 = 도면에서 표 지우고 도면 [저장](`withLinks` :331-346) 하나뿐 · 면적 쪽 단추 없음 · 놓기 기다림 `waiting`(:325)은 CAD Esc 로 그만둬도 참으로 남음 → 떠날 때 괜히 「저장 안 한 고침」 물음. +고칠 자리 +- links.ts `placeDots` + links.css — 같은 범위(왼쪽 위 같은 것)를 묶어 i째 이름표를 옆으로 밀고 테두리를 i×3px 안쪽으로 · 색은 `linkHues`(spreadsheet_link_color.ts:24 · 키 = 이름)로 `--ss-link-h` · 이름표만 누를 수 있게 · 누르면 그 테두리 `.is-picked` + `selectSpan`(spreadsheet_selection.ts:89)으로 범위 고름. +- 이름표 메뉴 [보내기 취소] = 연결표 줄 빼기(구조물 문서 저장) · 도면 표는 남고 연결만 끊김(:339-340). +재사용: [연결 모두 해제] 꼴(links.ts:196-204) · `createMapContextMenu`. +위험: 면적 화면에서 도면 파일을 씀(판 409) · test_m02_area_marks.py:28-29 · ui_checks/50-1_알약_강조_표시.js 고침. +크기: 겹침 · 색 · 하이라이트 작음 · 취소 중간 + +## 4. 도면 → 면적산출 +현재: 면적 상세 오른쪽 도면 패널에만 — [면적산출로 보내기](AreaDrawing.ts:70-86) → CAD `integration/aislo-table-export.ts:40-49,78-83` → `helpers/table-from-drawing.ts`(표 엔티티 :96-97 · 선 격자 :326-327 · 글만 있으면 폭 · 높이 빈 배열 :357-358) → AreaPanel.ts:100-102 → `importDrawingTable`(AreaFromDrawing.ts:98-111) · `tableToSheet`(:63-89)가 크기를 도면에서(열 폭 = mm×0.54(2~60) · 행 높이 = mm×72/25.4 pt(12~100)) · 글자 서식 안 넣음 · `addSheet` 로 새 시트 「도면에서 n」(spreadsheet.ts:313-346). +- 칸 크기 · 글자 크기 기본값: `tableToSheet` :76-87 지우면 끝 · 글자 크기는 지금도 기본 — 크게 보였다면 행 높이 탓(추정 · 화면 확인) · test_m02_area_from_drawing.py:88-89 고침 · 작음. +- 위치 고르기: 받은 뒤 작은 창 [새 시트] / [지금 시트 고른 칸부터] · 뒤쪽은 공개 손잡이(`SpreadsheetHandle` :73-90)에 새 함수 하나 · 재사용 `parseClipboard`(spreadsheet_clipboard.ts:394 · HTML 표 colspan/rowspan = 병합) + `pasteBlock`(:464 내부 함수) · 앞에 DrawingTable → `` 글 바꾸는 작은 함수 · 위험: 기존 칸 덮어쓰기(물음) · 알약 이은 칸 덮음 · 중간. +- 도면 상세에서도: 구조물 도면 상세(UI_Main.ts:430-449)에 단추 없음 · CAD 명령 TOAREA(commands/commands.file.ts:91-98)는 부모 창에 표 자료를 보내지만 듣는 곳이 AreaDrawing 하나뿐(cad_host.ts:17-34 도 모름) → 도면 상세 · B07 에서는 조용히 버려짐 · 고칠 자리 = 상세 머리 칸 단추 + 메시지 듣기 → 받은 표 들고 같은 열 면적 상세 엶 → 시트 선 뒤 `importDrawingTable` · 재사용 AreaToDrawing 「`pending` → `open` → `onArea`」 반대 방향 · 상수 AreaDrawing.ts:23-24 · 위험: 도면 미저장 고침이면 confirmLeave · 읽기 · 프로젝트 층 면적 막음 · 작음~중간. + +## 5. 관련 시험 (`resources\tester\`) +- 스프레드시트: spreadsheet/test_spreadsheet_engine.py(+helper_spreadsheet_engine.cjs:390,450) · spreadsheet/test_spreadsheet_d_input.py(+helper_spreadsheet_d.cjs:168) · test_spreadsheet_set_link.py · spreadsheet/test_stage2_insert_dialog.ts · test_stage3_names.ts · test_stage3_condfmt.ts · test_stage3_validation.ts · test_stage4_menu_items.ts · test_spreadsheet_size.py · harness_links.ts/html +- M02: test_m02_area_to_drawing.py · test_m02_area_table.py · test_m02_area_marks.py · test_m02_area_from_drawing.py · test_m02_area_panel.py · test_m02_drawing_area.py · test_m02_drawing_card.py · test_m02_drawing_sheets.py · test_cad_host_tabs.py +- CAD: cad/table.test.ts · cad/table-export.test.ts · cad/table-from-drawing.test.ts · CAD/integration/aislo-table-bridge.test.ts +- 화면: ui_checks/50-1_보낸범위_읽기.js · 50-1_알약_강조_표시.js · 83-3_도면_면적.js · 83-3_새시트_되돌리기.js · 47-6_면적_도면패널.js · 43-6_도면표_선색.js +- 빈 곳: 행열 넣기 뒤 연결표 범위 · 셀 밀기 · 잘라 붙이기 뒤 알약 · 조건부 · 유효성 범위 옮김 시험 없음. + +## 미결 (조사 에이전트 제시) +1. 보낸 범위 따라가기: 면적 문서 이름정의(권장) vs 연결표만 옮김 · 범위가 통째로 지워지면 연결 끊고 알릴지. +2. 셀 밀기 · 잘라 붙이기 · 정렬 때도 알약 연결이 엑셀처럼 따라갈지. +3. 「라벨」 = 면적 시트 이름표가 맞는지 · 도면 표에도 T번호 이름표 · 표마다 다른 선 색. +4. 이름표 누름 = 시트 범위 고르기만 vs 오른쪽 도면 패널 표까지 강조. +5. 「범위 지정 취소」 뜻: 보낸 범위 연결 끊기(도면 표 남김? 지움?) vs 놓기 기다림 그만두기. +6. 같은 범위 두 번: 허용 + 색만 다르게 vs 「이미 T1」 물음. +7. 위치 고르기: 새 시트 / 지금 시트 고른 칸 / 다른 시트 · 덮어쓰기 물음. +8. 카드 탭: 고르기만 vs 더하기 · 지우기까지. +9. 도면 상세에서 보낸 뒤 면적 화면으로 옮겨 갈지 vs 서버가 바로 새 시트 저장. diff --git a/docs/raw/요구_1008_3/조사_C_B06횡단.md b/docs/raw/요구_1008_3/조사_C_B06횡단.md new file mode 100644 index 000000000..178fc907a --- /dev/null +++ b/docs/raw/요구_1008_3/조사_C_B06횡단.md @@ -0,0 +1,108 @@ +# 조사 C — B06 횡단 구조물 조작 (10-8 밤 · 읽기 전용 조사 에이전트) + +파일 약칭 (프로젝트 루트 아래) +- `B06_Section\B06_Section_UI_Cross_` + FG `Ford_Geom.ts` · FD `Ford.ts` · FP `Ford_Panel.ts` · BG `Body_Guard.ts` · BX `Box_Geom.ts` · BD `Box.ts` · BP `Box_Panel.ts` · SP `Structure_Panel.ts` · PB `Panel_Base.ts` · CG `Culvert_Geom.ts` · BS `Culvert_Basin.ts` · EX `Culvert_Extra.ts` · TI `Culvert_Tiers.ts` · SC `Structure_Cut.ts` · CV `View.ts` · VB `View_Bodies.ts` · VS `View_Structure.ts` · CU `Culvert.ts` +- `B06_Section\B06_Section_` + SV `UI_Section_View.ts` · SVP `UI_Section_View_Profile.ts` · SPN `UI_Page_Structures_Panel.ts` · FC `UI_Page_Ford_Controls.ts` · STC `UI_Page_Station_Controls.ts` · AD `UI_Adjust_Dock.ts` · CSS `UI_Style_Cross.css` · CSA `UI_Style_Cross_Areas.css` · CTL `UI_Style_Cross_Controls.css` · EC `Engine_Culvert.py` +- GD `A00_Common\design\design_structure_guard.ts` · FS `A00_Common\design\design_structure_ford.ts` · DSEL `A00_Common\design\design_selection.ts` · DVC `A00_Common\design\design_view_cross.ts` · CS `common_util\common_util_culvert_sets.ts` · LB `ui_template\ui_template_locale_b2.ts` · DJ `resources\master_template\구조물정의.json` · T `resources\tester\` + +## 1. 노면공(콘크리트 포장) 고르면 범위 안 횡단 전체 강조 +- 현재: 목록 고름 → SPN:198-209 `onSelect` → `focusChainage(structureAnchorM)`(기준 = 시작 측점 `B05_Profile\B05_Profile_Api_Structures.ts:280`) · DVC:119-126 이 가장 가까운 카드 한 장만 `--selected` · 알약 고름도 같은 길(SVP:201-213 → SV:486 → SVP:266-269) · 범위 안 다른 카드 표시 없음(SVP:280-283 은 알약만) · 포장층(`B06_Section_UI_Cross_Design_Surface.ts:71-107`) 못 고름. +- 79-6 선례: 카드 테두리 `--selected`(CSS:167-170) · `--link-owner`(CSS:172-176) · 토글 CV:264-273 · 카드 전부 다시 칠하는 루프 SV:189-198 `syncRevetHighlights`(클래스만 · 다시 그리지 않음). +- 고칠 자리: SV `setStructureMarks`(493)에서 목록 보관 · `selectMark`(486)에서 카드 돌며 클래스 · CV:81-85 `CrossCardElement` 에 범위 강조 함수 · 카드 새로 만들 때 다시 칠함(CV:273 꼴) · CSS 한 규칙. +- 재사용: DSEL:65-74 `coversChainage` · `section.pavement[].start_m/end_m`(`common_util\common_util_structure_pavement.ts:21-31`). +- 위험: 노면공 저장 `chainage_m = start`(87-1) → 판정은 start/end · refreshCard 때 클래스 사라지지 않게. +- 크기: 작음. + +## 2. 횡단도 안 조정창 — 제목과 단추만 +- 지금 보이는 것 + - 벽 · 흙막이 · 집수정(SP): 머리줄 제목 · ↺「집수정 기본값」(집수정일 때만 SP:460-462) · ✕ · 끄는 중 미리보기 글(SP:159-164) · 줄 이름 「이동(좌우·사면 상하)」(SP:172 · LB:274) · 「집수정 위치」(SP:268) · 십자 단추 · 유출일 때만 ≡(SP:218). + - 세월교(FP): 제목 「세월교 유입 측벽」 · 읽기 줄 「높이 1.50m (자동)」「좌우 0.0m · 상하 0.0m」「바닥판 3.20m」(FP:64-71 · 152-155) · 줄 이름 「이동」(FP:99). + - 박스(BP): 제목 「BOX암거 좌측 끝」 · 읽기 줄 「구체 길이 …m (이 측 +…)」「표고 +0.0m」「구체 물매 1:… / 구체 수평」(BP:59-66 · 127-132) · 줄 이름 「길이 ◀▶ · 표고 ▲▼」(BP:74). +- 지울 것(오버레이만 · `opts.dock` 아닐 때): FP:67-71 · BP:62-66 읽기 줄 · 줄 이름(PB:29-39 `makeRow` 라벨 — CTL 에 `.b06-structure-panel:not(--dock) .b06-structure-panel__label` 숨김 한 규칙) · 머리줄 ↺ 집수정 단추(십자 가운데 ↺ 와 같은 동작). +- 위험: 같은 함수가 좌측 사본(dock)도 만듦 · 세월교 사본은 `wall-height` 줄을 폼으로 옮김(AD:67-72) · `T\test_b06_adjust_single_form.py:36-45` 가 오버레이 입력칸 0개 · 사본 줄 목록 고정. +- 크기: 작음. + +## 3. 세월교 유입 · 유출 이동이 서로 묶임 +- 원인 ①(확실) 관 1 m 맞춤: BG:145-170 `fordPipeFit` → CG:189-191 · 두 본체 끝 사이 관 길이(흙막이 안으로 든 길이 `through` BG:132-134 포함 · 높이 = 바닥판 상면)를 올림 · 모자란 만큼 흙막이 하나(유출 먼저 · 없으면 유입)의 x 를 밀어냄 · 한쪽 흙막이 + 다른 쪽 날개벽/없음: ㄴ측벽 0.1 m 옮기면(FC:177-189 → BG:76-95 본체 끝 따라감) 반대쪽 흙막이가 최대 1 m 튐 · 양쪽 흙막이: 한쪽 높이가 표준경사 표 단계를 넘거나 전면 경사 칸 바꾸면 → `through` 바뀜 → 유출 x 움직임. +- 원인 ②(추정 · 화면 재현 필요) 동시 선택: 한 카드에서 세월교 측벽과 흙막이를 동시에 고를 수 있음 · CV:224-245 `toggleRevet` 은 본체 선택 안 풂 · VB:101-113 `toggleFord` 는 벽 선택 안 풂 · SPN:600-697 감싸기도 서로 안 풂 · 두 창이 모두 방향키 · 끌기 붙임(FP:131-145 · SP:504-510) · 끌기 판정도 켜진 도형 전부(PB:90 · 119-128) → 방향키 한 번 · 끌기 한 번에 양쪽 같이 움직임. +- 따로 움직이게: ① `fordPipeFit` 기준을 기본 자리로 고정(본체 끝을 `DEFAULT_FORD_ADJUST` 와 자동 높이로 따로 계산) 또는 자동 맞춤 지움(길이 표기 L 은 BG:271 이 이미 올림) ② 선택 배타 — `toggleRevet` 에서 `bodies.clearSelection()` · `toggleFord/Box` 에서 벽 선택 해제. +- 위험: 80-2 사용자 확정 「관 1 m 단위」와 부딪힘 · `T\test_80_ford_pipe.py` 기대값 바뀜. +- 크기: 작음. + +## 4. 끌기 — 대각선 자유 + 패널 걸음으로 맞춤 +- 현재: PB:139-156 `|dx|≥|dy|` 면 가로만 · 아니면 세로만(한 축) · 걸음 반올림은 이미(PB:143-144) · 미리보기 순수 평행이동(PB:145-147) · 계약 주석 「둘 중 하나만 0 이 아님」(PB:97-98). +- 축의 뜻이 다름: 벽 · 집수정 · 세월교 ▲▼ = 1:1.2 대각 d(수평 성분)(`B06_Section_UI_Cross_Culvert_Solve.ts:340-349` · BS:193-196) — 지금은 세로 끌기를 d 로 넣어 미리보기(세로)와 결과(대각) 어긋남 · 박스는 ▲▼ = 순수 표고 · ◀▶ = 구체 길이. +- 걸음 값: SP:103 `STEP_M` 1.0(관 기준벽 · 세월교 흙막이) · SP:108 `OWN_STEP_M` 0.1(독립 · 다단) · SP:110 `BASIN_STEP_M` 0.1 · SP:170 `moveStepOf` ← VS:150-151 `fineMove` · FP:53 0.1 · BP:50 0.1 · 놓을 때 SP:483-497 · FP:137-145 · BP:112-120. +- 고칠 자리: PB 가 두 축을 동시에 넘김(수평 m · 표고 m) · 대각형 창: d = −1.2·Δz 를 걸음 반올림 · x = Δ수평 − o·d 를 걸음 반올림 · 박스 창: 길이 · 표고 각각 반올림 · 미리보기는 반올림된 자리 · 반영은 update 한 번. +- 위험: 한계에 잘리면 놓은 자리와 결과 다름(STC:194 ±10 m · FC:185 좌우 ≥0 · Solve:341 minX) · 되받는 곳 STC:271. +- 크기: 중간. + +## 5. 박스 유입 · 유출 고름 강조가 본체까지 넘어감 +- 현재(BD:175-195): 본체 판정면 = 가운데 1/3 · 끝 판정면 = `band(가운데 ± 1/3 지점, 에이프런 끝 또는 박스 끝)` → 본체 바깥 1/3 까지 덮음 · 강조는 판정면 자체를 칠함(CSA:304-312). +- 선례(세월교 89-2 FD:159-205): 본체 = 전체 사각형 · 측벽 = ㄴ 을 감싸는 가상 ㅁ 을 위에 얹음. +- 고칠 자리(BD): 끝 판정면 = 박스 끝(`side.offset`)부터 에이프런 바깥(`apron[1]`)까지 · 높이 저판 밑~상판 위 · 본체 판정면 = 두 끝 사이 전체. +- 위험: 날개벽 없음 · 흙막이 쪽은 끝 판정 폭 0 — 흙막이 쪽은 벽 판정면(CU:342-354)이 대신 · 80-3 흙막이 따라 늘어난 본체(BG:225-235)는 `side.offset` 바깥. +- 크기: 작음. + +## 6. (재요청) 세월교 하단부가 아직 원지반에 묶임 +- 묶인 뿌리(하나): FG:152-159 `bedElevation` = 두 노견 사이 원지반 최저점 → FG:169 `autoHeight` → FG:170(손 값 없으면 이 값) → FG:172-175 바닥판 상면 → 측벽 높이 · 바닥판 · 관 높이(FG:266-287) 전부 따라감. +- 91-2 가 한 것: 손으로 넣은 높이(heightM)만 고정(AD:67-72 · FP:78-96 · 157-158) · 자동 값은 여전히 원지반 따라감 · `T\test_91_ground_free.py:32-34` 가 「자동은 하상을 따라감」을 고정 · 분석_정함(1차) 「처음 놓을 때 하상값 · 원지반이 바뀌어도 안 따라감」과 어긋남 → 사용자 「반영 안 됨」의 까닭. +- 같이 묶여 따라오는 것: 흙막이 기본 높이 · 바닥 BG:83-101 · 관이 흙막이 안으로 든 길이 BG:132-134 · 1 m 맞춤 높이 BG:156-169 · 유입 수평공간 시작 높이 BG:277-290 · 3D `B05_Profile\B05_Profile_UI_Corridor_Structures.ts:204-212` · 서버 면적 `B06_Section\B06_Section_Structure_Layouts.ts:119-125`. +- 끝 마감선(원지반 읽음 · 91 판정 ⑥에서 남김): BS:326-342(FG:183 groundAt) 묻히면 절토선 · 뜨면 성토부선 시작점 · FG:203-210 → EX:217-255 원지반까지 1:1.2 성토부선. +- 기본값 안: Ⓐ 노면 − (관경 + 토피) — FG:107-109 `minWallHeight` 를 자동값으로 · FG:152-159 지움 · 박스 BX:134 「노면 − 복토」와 같은 꼴 · 원지반 참조 0 · Ⓑ 처음 놓을 때 하상값을 heightM 으로 굳혀 저장(1차 분석의 원래 뜻 · 저장 시점 필요). +- 위험: 깊은 계곡에서 바닥판이 하상 위로 뜸 · 끝 성토부선 길어짐 · 절성토 면적 · B08 수량 바뀜 · 기대값 바뀌는 시험 test_91 · test_65 · test_79 · test_80 · test_73_4 · `test_ford_wall_vertical.mjs` · 「노면」 = 월류로 내린 설계선(FG:111-125). +- 크기: Ⓐ 코드 작음 · 시험 포함 중간. + +## 7. 세월교 유입 날개벽: 「측벽 높이(자동)」 지우고 「수평 여유」 +- 지금 칸: 91-2 줄 AD:67 · 72(날개벽 칸 → `WALL_HEIGHT_ROW`) · FP:78-96 · 129 · 157-158 · 유입 · 유출 날개벽(그리고 「없음」) 칸 둘 다에 뜸. +- 89-3 수평공간 칸: GD:85-101 `bodyGuardItems` berm · 구조 「흙막이」일 때만(키 `inlet_revet_berm_m` · 기본 "1") · 쓰는 곳 FS:38 · 박스 공유(`A00_Common\design\design_structure_box.ts:53`) · 세트 짝 CS:239-240 ↔ EC:350(흙막이일 때만 값) · 기하 TI:109-110 → EX:388-389 `bermCut`(EX:59-92 · export 안 됨). +- 날개벽 끝 지금 모양: BS:326-342 묻히면 바로 절토 · 수평 구간 없음 · 89 정함 「날개벽 · 없음은 그대로」. +- 줄 자리: ① AD:72 날개벽 칸 → null(유입만이면 wingInlet 만) · FP heightRow 삭제 ② GD berm map 에 「날개벽」(세월교만 · 인자 하나) ③ 세트에 유입 berm 칸 — CS `fordSet`(359-399) · EC `_ford_set`(428) · `B06_Section\B06_Section_Api_Types.ts:268` FordSet ④ FG:176-199 `buildBasin` 에 berm · BS:335-336 묻힘 쪽을 `bermCut` 으로(EX export) ⑤ DJ 이름 줄 `inlet.berm`(3399 · 3474) 세월교에도 맞는지. +- 위험: 시험 test_91:43-46 · `test_65_ford_defaults.py:167-173`(`WALL_HEIGHT_ROW`) · `test_b06_adjust_single_form.py:44` · `test_b06_culvert_sets_mirror.py` · `test_b06_ford_set.py` · `test_52_4_structure_spec_ford.py` · 날개벽 끝선은 면적 밖(FG:305-312 트림) → 수평 여유도 면적 안 들어감 · 저장된 heightM 손 값은 칸 없이 남고 ↺ 로만 지워짐. +- 크기: 중간. + +## 8. 박스 · 세월교에서 원지반 · 암 경계가 아직 영향 주는 곳 (91 이후) + +| 자리 | 무엇을 바꾸나 | 지우면 | +|---|---|---| +| FG:152-159 · 169-170 | 세월교 자동 바닥 높이(측벽 · 바닥판 · 관) | 노면 기준 기본값 필요(6) | +| BG:83-101 · 132-134 · 156-169 · 277-290 | 세월교 흙막이 기본 높이 · 관 든 길이 · 1 m 맞춤 x · 수평공간 시작 높이(첫 줄 따라감) | 첫 줄 고치면 같이 풀림 | +| BS:326-342 · FG:203-210 · EX:217-255 | 세월교 ㄴ 끝: 묻힘/뜸 → 절토선 또는 1:1.2 성토부선(원지반까지) | 끝선 없어짐(91 ⑥ 에서 남김) | +| BX:171-187 | 박스 끝(에이프런) 절 · 성토선 | 위와 같음 | +| EX:79-80 | 흙막이 유입 수평공간이 원지반 만나면 끊겨 칸 값보다 짧아짐 | 칸 길이 그대로 · 선이 지반 아래로 | +| EX:384-404 · TI:96 | 흙막이 유출 끝: 뜨면 성토부선 · 묻히면 바로 절토 | 연결선 | +| SC:25-37 · 46-88 | 위 절토선 암 무릎 · 경사(경계 = 원지반 + `rock_boundary_offset_m` · 암 1:0.4) — 91-4 | 경사 하나로(91-4 되돌림) | +| BX:213-217 · 232 → BD:96-100 | 박스 저판 툴팁 「계류 하상보다 …m」 | 표시만 | +| CG:238-265 · 450-454 → CU:199-201 | 흙막이 툴팁 「바닥 원지반 이격」 | 표시만 | +| CG:272-286 | 관 세트 유출 목표점(사면 끝) · 길이 ≤0.5 m 면 세트 null | 극단만 | +| `B05_Profile\B05_Profile_Engine_Sections_Core.py:439-448` | 유입/유출 좌 · 우 = 원지반 평균 높은 쪽(B05 3D 램프로 바꿀 수 있음) | 판정 없어지면 좌측 폴백 | + +이미 끊긴 것: 다단 자동 자리(EX:294-299) · 전면 기울기 지형 판정(`common_util\common_util_masonry_slope.ts:41-45`) · 박스 본체 높이(BX:134) · 박스 흙막이 높이(BG:70). + +## 9. 「기슭막이」 → 「흙막이」 (B05 · B06 화면) +- 바꿀 글: 로케일 LB:244-304(`B06_Cross_Revet_Select / _Label / _Reset / _Inlet / _Outlet / _Own / _Extra` · `B06_Cross_Extra_Count` · `B06_Cross_Struct_Revet` · `B06_Cross_Revet_Limit_Inward / _Outward`) · LB:348 FillSlope_Tip · B06 툴팁 CU:127 · 134 · 151 · 195 · 224-225 · 347 · `B06_Section_UI_Cross_Revetment.ts:342 · 356` · `B06_Section_UI_Cross_Card_Chrome.ts:74-75` · SP:410 · 413 · 417 · B05 `B05_Profile_UI_Drainage_Facility.ts:415`(「추가 기슭막이」) · 531-532(「기슭막이 (좌)」) · 333(자동 표시값이 값 글 그대로 보이는지 — 추정) · `B05_Profile_UI_Drainage_Facility_Fields.ts:28 · 238 · 240` · `B05_Profile_UI_Page_Helpers.ts:235` · DJ pipe 옵션 label 「유입/유출 기슭막이 …」(163-269) · 「기슭막이 기초」(pipe 280 · box 320) · D 계류 · 사방 `revetment` 이름 「기슭막이」(2424) · 이름표 `structure=기슭막이 → 흙막이`(3320 · 3336)는 이미 됨. +- 그대로 둘 것(저장 값 · 키): `inlet_type/outlet_type` 값 「기슭막이」(CS:188 · CG:363 · Facility.ts:290 · 304 · 318 · 364 · 571 · 624 · DJ choices) · `revet_*` 키 · `REVET_*` 상수 · CSS `culvert-revet` · `design_structure_pipe.ts:22` SOIL · DJ `구조물정의_이력\판_*.json`. +- 사방과 가르기: 바꾸는 범위 = B05/B06 화면 글(로케일 · 툴팁 · DJ label)뿐 · 사방 자료는 그대로 — M02 사용자 자료 경로 「기슭막이 메쌓기…」(`resources\master_template\table\구조물집계표.json` · `구조물집계표조합.json`) · `resources\knowledge\original\구조물도\기슭막이\` · `resources\help\B05\구조물_기슭막이.md` · `resources\data_masonry\revetment_sabang_*`. +- 위험: `T\ui_checks\53-1_횡단_고르기.js:244 · 309 · 426 · 431 · 461` 툴팁 글 정규식 · `T\test_b05_revetment_sabang_basis.py:53` 「기슭막이 높이 없음 — 근입만 그림」 · ui_checks 52-1 · 54-1 · 54-10 · 54-11. +- 크기: 중간(글 약 40곳). + +## 10. 관련 시험 (T 아래) +- 1: 없음(새로) · 참고 `test_b05_b06_selection_single.py` · `ui_checks\53-1_횡단_고르기.js` +- 2: `test_b06_adjust_single_form.py`(+ `helper_b06_adjust_single_form.cjs`) +- 3: `test_80_ford_pipe.py` · `test_73_4_body_guard.py` · `test_79_guard_shape.py`(각 helper `.cjs`) +- 4 · 5: 없음(새로) +- 6: `test_91_ground_free.py`(+ `helper_91_ground_free.cjs`) · `test_65_ford_defaults.py`(+ `helper_65_ford_box.cjs`) · test_79 · test_80 · test_73_4 · `test_ford_wall_vertical.mjs` · `test_ford_surface_drop.py` · `test_b06_pavement_and_ford.py` +- 7: test_91 · test_65 · `test_b06_adjust_single_form.py` · `test_52_4_structure_spec_ford.py`(+ `helper_52_4_ford.cjs`) · `test_b06_ford_set.py` · `test_b06_culvert_sets_mirror.py` · `test_b06_culvert_set.py` +- 8: test_91 · test_79 · `test_b06_wall_shape_unified.py` +- 9: 위 9 위험 파일 + `test_b05_structures_registry_policy.py`(choices 값 확인 · 값 안 바꾸면 통과) + +## 미결 (조사 에이전트 제시) +1. 노면공 강조: 카드 테두리만 vs 포장층도 · 쇄석 포설 같은 다른 구간형도 같게. +2. 조정창 끄는 중 미리보기 글 「◀ 1.0m」 남길지 · 박스 창 제목 좌/우 → 유입/유출. +3. 관 1 m 자동 맞춤(80-2): 기준만 고정해 유지 vs 지움. +4. 끌어 놓은 자리가 한계에 걸리면 가장 가까운 허용 자리 vs 원래 자리. +5. 날개벽 없는 박스 끝: 못 고르게 vs 얇은 띠로라도. +6. 세월교 기본 바닥: Ⓐ 노면 − (관경 + 토피) vs Ⓑ 처음 하상값 굳혀 저장 · 바닥판이 하상 위로 뜰 때 끝 성토부선 그대로. +7. 수평 여유: 유출 날개벽 · 「없음」 칸 측벽 높이 줄도 지울지 · 저장 키 `inlet_revet_berm_m` 공유 vs 새 키 · 면적에 넣을지 · 박스 날개벽에도. +8. 끝 연결선(성토부선 · 절토선) · 91-4 암 무릎 · 수평공간이 원지반에서 끊기는 것(EX:79-80)도 지울 「제약」인지. +9. D 계류 · 사방 독립 「기슭막이」(revetment) 이름도 바꿀지 — 바꾸면 C군 「흙막이」(soil_guard)와 이름 겹침 · 사방기술교본 근거 문구와 어긋남. diff --git a/docs/raw/요구_1008_3/조사_D_B07B08.md b/docs/raw/요구_1008_3/조사_D_B07B08.md new file mode 100644 index 000000000..c6ba7ab02 --- /dev/null +++ b/docs/raw/요구_1008_3/조사_D_B07B08.md @@ -0,0 +1,64 @@ +# 조사 D — B07 상세 설계 · B08 수리 판정 (10-8 밤 · 읽기 전용 조사 에이전트) + +경로는 프로젝트 루트 기준 · 「추정」 = 코드로 확인 못 한 판단. + +## 1. 배수유역도를 종류로 (B07) +현재 +- 유역도는 종류가 아니라 서버 목록의 고정 항목(`Router_Support.py:155-174` · plan_kind="watershed" :167-172) · 화면도 따로 거름(`UI_Panels.ts:92`) · × 단추는 `kind==="plan"` 일 때만(`UI_PlanKinds.ts:176-187`). +- 여는 길 `Router.py:325-330` · 그리기 `Router_Support.py:408 · 464-483` → `build_watershed_drawing`(`Engine_Cad_Basin.py:278-438` · 1/6,000 · 오른쪽 정보표 · 도면명 「유역도」). +- 종류 체계는 축척 모름 — 조각 19개 `PIECES`(`Engine_Cad_PlanKinds.py:48-69`) · 기본 종류 다섯 `DEFAULT_KINDS`(:79-103) 모두 1/1,200 장 나눔(`plan_kind_items` `Router_Support_Plan.py:492-510`) · 이름 검사 `_checked`(:151-158)는 조각 1개 이상 요구. +고칠 자리 — 종류 파일에 `layout` 한 칸("watershed" = 1/6,000 한 장 · 정보표 · 유역도 양식 · 없으면 지금처럼 1/1,200 장 나눔) +- `PlanKinds.py`: `DEFAULT_KINDS` 에 `{"id":"watershed","name":"배수유역도","layout":"watershed"}`. +- `Router_Support_Plan.py`: `list_kinds` · `_checked`(layout watershed 면 조각 없어도 통과) · `plan_kind_items`(한 장) · `plan_kind_source`(layout watershed 면 `watershed_source`) · 이미 종류 파일이 있는 프로젝트에는 한 번만 더함(`_add_landuse_once` :84-106 꼴). +- `Router_Support.py`: 고정 항목 · WATERSHED 갈래 지우고 PLAN 갈래에서 layout 으로 나눔. +- `Router.py`: WATERSHED 갈래 지움 · PLAN 갈래(:346-355)가 이미 배수 자료(drainage context)를 읽음. +- 화면: `UI_Panels.ts:92` 거르기 · `UI_PlanKinds.ts:176` 가드 풀면 × 저절로 · 「새 종류」에 양식 고르기 드롭다운(2 공용 부품). +재사용 — `build_watershed_drawing` 그대로 · 자료 `watershed_source`(`Router_Support_Basin.py:491-553`) · 지우기 `delete_kind`(:199-206). +위험 — 도면 id `watershed` → `plan_watershed`(옛 확정본 안 쓰임 · 93-2 용지도와 같은 상황) · 목록 자리가 평면도 묶음 안으로 옮겨져 도면번호 바뀜 · `update_kind` 는 `plan_…` id 확정만 풂(:189-193) · 지운 뒤 다시 살아나지 않게 표시 파일(용지도와 같은 방식). +크기 — 미리 정한 종류(조각 고르기 없음): 중간 · 유역 조각까지 체크: 큼. + +## 2. 평면도 컨테이너 드롭다운 → 공용 양식 +- 현재: 종류 고르기 = 공용 클래스 없는 날 `