diff --git a/docs/raw/요구_1010/사용자요구_1010.md b/docs/raw/요구_1010/사용자요구_1010.md new file mode 100644 index 000000000..cfeaff2af --- /dev/null +++ b/docs/raw/요구_1010/사용자요구_1010.md @@ -0,0 +1,28 @@ +# 사용자 요구 (2026-10-10 · 원문 그대로) + +계획서 = `PLAN.md` 168장부터 · 분석 = 같은 폴더 `분석_정함.md` · 조사 = 같은 폴더 `조사_*.md`. +사용자 지시 = 「위 내용에 대해 너가 조사를 하여 상세 계획서를 작성하고 코드작업을 진행해줘」 · 14 는 코드 고침 아님(표 보고). + +``` +1. B06의 구조물 조합 연결후 연결여부의 라벨창에 이름이 들어가는데 텍스트색상이 아니라 라벨 배경 색상을 변경해줘. +2. B06의 횡단면도의 좌측상단의 테이블(면적계산)이 가로 개수에 따라 변경되었으면 함. +3. B06의 횡단면도의 상세버튼으로 나오는 모달창에서 그림 영역의 테마에 맞춰 색상을 같이 변경(테마 양식 있음)하게 해주고 그림컨테이너 전체에 맞춰 사용되게 변경 +4. B06 좌측패널의 도수로/돌붙임의 내용에서 기본값은 구조:도수로, 두께:45 , 붙임형식의 이름은 '형태'로 변경하고 구조 뒤로:메붙임,면적:30 +5. B06 좌측패널의 구조물 조합 연결의 모달창에서 좌측영역의 트리를 마스터의 트리와 동일하게 변경, 해당 컨테이너의 폭도 동일하게 +6. B06 횡단보기설정의 횡단반폭값은 횡단도에 기본 보기값 만 변경하는 기능인데 오래걸리는 이유를 모르겠음. 확인 +7. B05의 3D에서 종단반향의 성토사면이 주름이지는데 이유는? 3D는 참고용 형상일 뿐임. 주름이 지면 품질이 떨어져보임. 개선검토 +8. B07의 횡단도 배열배치에서 입력된 배치 열 값에 따라 테이블을 배치하고 그안에 그림을 배치하게 변경(다시말하면 테이블은 수평수직이 정렬이 된상태임. 이때 넣을 영역을 사용자가 설정할수 있게 기능추가 이기능은 M02에 있는것같은데 없으면 구현, 영역의 범위는 사용잦가 드래그하여세팅하고 미세한 영역은 숫자를 변경하여 세팅)<< 기능은 도면의 실제 들어가는 영역을 지정하는 범위로 전체 도면영역의 공통사항으로 가이드 되는 선이 보였으며 하며 캐드를 사용하는 영역의 공통사항임. +9. B06의 집수정 항목에 신규 옵션값 추가, 항목명은 '동물이동형' 체크박스로 구현(양식 있음), 기본값은 true +10. B08의 구조물집계표의 행을 눌렀을때 나오는 3개의 가로 컨테이너의 순서는 항상 도면 > 일위대가 > 면적산출 순임. 현재 폭 비율은 유지. +11. B08의 구조물집계표의 행을 눌렀을때 나오는 컨테이너들의 버튼들중 뒤로와 저장은 상단 제목행으로 이동하고 버튼크기도 닫기버튼과 같은 크기로 변경 +12. B08의 구조물집계표의 행을 눌렀을때 나오는 모달창에서 연결정보를 알려주는 알약의 테두리는 색상으로 구분되게 변경 +13. B08의 구조물집계표 탭을 눌렀을때 아래 레이아웃이 변경됨. 자재 탭을 눌렀을때와 동일하게 변경<<내가 말하는건 하위탭들이 들어가는 공간을 구조물집계표 탭도 비워두라는 말임. +14. B08과 B09에서 프로젝트의 내용이아니라 구현을 위해 참고용으로 알려준 실무문서의 값들을 가져다가 사용한게 있는지 확인. << 코드수정 아니며 테이블로 어떤 페이지, 어떤탭, 어떤 셀 형태로 구현하고 짧게 테이블로 작성 +15. 손입력이라는 명칭은 프로그램 전역에서 수기 입력으로 변경 +16. 현재 B08/B09에서는 대부분 엑셀참고문서를 사용하여 테이블형식으로 이뤄져 잇음. 단가산출근거의 호표별 보기의 컨테이너 방식을 양식화하여 다른 곳에서도 사용했으면 하고 적용된 곳에서는 컨테이너 방식을 우선적용하고 테이블도 유지하게 해줘. 우선적용대상은 일위대가표로 여러행이 하나의 그룹으로 구성되어지는 탭들이 대상임. 단, 컨테이너 내부의 양식을 제대로 구현할것. 현재 컨테이너 양식에서 정보의 폰트의 크기가 뒤죽박죽이며 글자들의 간격이 넓어서 한눈에 안들어옴. 컨테이너 보기방식은 결국 가로방향으로 여러개를 지정하여 볼수 있게 하고 많아진 경우에는 요약보기 형태로 변경되어야함. +17. 위 내용에 대해 너가 조사를 하여 상세 계획서를 작성하고 코드작업을 진행해줘. +``` + +``` +추가 요청 M02의 구조물 조합에서 자재목록에서 운반비 관련 항목이 별도계상에 연동되어 되었음, 별도로 지정할수 있게 변경 +``` diff --git a/docs/raw/요구_1010/조사_O_B06화면.md b/docs/raw/요구_1010/조사_O_B06화면.md new file mode 100644 index 000000000..961d5664b --- /dev/null +++ b/docs/raw/요구_1010/조사_O_B06화면.md @@ -0,0 +1,142 @@ +# 조사 O — B06 화면(조합 라벨 · 면적표 · [상세] 모달 · 도수로 기본값 · 고르기 나무 · 반폭 · 동물이동형) (10-10 · 읽기 전용 조사 에이전트) + +약칭 `B06_Section/B06_Section_` + CA `UI_Cross_Areas.ts` · CSA `UI_Style_Cross_Areas.css` · CTL `UI_Style_Cross_Controls.css` · CSX `UI_Style_Cross.css` · COL `UI_Section_Columns.ts` · SV `UI_Section_View.ts` · SVT `UI_Section_View_Types.ts` · CV `UI_Cross_View.ts` · VM `UI_Cross_View_Metrics.ts` · DT `UI_Cross_Detail.ts` · CSD `UI_Style_Cross_Detail.css` · DSY `UI_Page_Design_Sync.ts` · PC `UI_Page_Common.ts` · PNL `UI_Page_Panel.ts` · FIT `UI_Cross_Fit.ts` · STC `UI_Page_Station_Controls.ts` · RTR `Router.py` · ECU `Engine_Culvert.py` / SR `B05_Profile/B05_Profile_UI_Structures_Summary_Row.ts` · SS `B05_Profile/B05_Profile_UI_Style_Structures.css` · MRG `B05_Profile/B05_Profile_UI_Drainage_Facility_Merge.ts` · GU `A00_Common/design/design_structure_guard.ts` · FPV `A00_Common/design/design_structure_ford_pavement.ts` · SPC `A00_Common/design/design_structure_spec.ts` · SF `A00_Common/design/design_structure_form.ts` · PIPE `A00_Common/design/design_structure_pipe.ts` · DVC `A00_Common/design/design_view_cross.ts` · ZP `A00_Common/b_svg_zoom_pan.ts` · CSET `common_util/common_util_culvert_sets.ts` · DEF `resources/master_template/구조물정의.json` · B8S `B08_Quantity/B08_Quantity_Router_Summary.py` · IP `ui_template/ui_template_item_picker.ts` · IPD `ui_template/ui_template_item_picker_data.ts` · IPC `ui_template/ui_template_item_picker.css` · TR `ui_template/ui_template_tree.ts` · TP `M02_MasterTemplete/M02_MasterTemplete_TreePanel.ts` · TPM `…_TreePanel_Model.ts` · RT `…_TreePanel_Roots.ts` · TPC `…_TreePanel.css` · T `resources/tester/` + +## 0. 코드 지도 + +| 요구 | 손댈 층 | 계산 자리(5장) | 저장 | +|---|---|---|---| +| O1 조합 라벨 배경 | SS 한 규칙 | 화면만 | 없음 | +| O2 면적표 크기 | CSA(+ CTL 변수) | 화면만(CSS 컨테이너 쿼리) | 없음 | +| O3 [상세] 테마 · 가득 | CSD · DT · SV · DSY | 화면만(카드와 같은 그리기 함수) | 없음 | +| O4 도수로 기본값 | GU · FPV · DEF 이름 3곳 (+ ⬜ CSET ↔ ECU 짝) | 짝이면 ① 거울 시험 | 옵션 키 그대로(`chute_add_{n}_*` · `ford_chute_{n}_*`) | +| O5 고르기 나무 | IP · IPD · IPC | 화면만 | 없음 | +| O6 반폭 느림 | DVC 한 줄 | 화면만 | 지금은 재생성이 작업본을 씀 → 안 씀 | +| O9 동물이동형 | SPC · SF · PIPE · MRG | 저장만(읽는 곳 없음) | pipe_points.json `options.inlet_basin_animal`(새 키 · 추천 이름) | + +## O1. 구조물 조합 연결 라벨 — 글자색 → 배경색 +- 현재: 연결 줄 = SR 한 벌(`buildSummaryRow` · 이름 칸 = 읽기 전용 input SR:36-41 · 연결되면 `is-assigned` SR:55-60). 부르는 곳 모두 이 줄(공용 명세 폼 SF:261-268 · 옵션 그룹 `B05_Profile_UI_Structures_Groups.ts`:190-191) → 규칙 하나가 B05 · B06 · M02 미리보기 전부. 연결 표시 = 글자색만 SS:450-453(`color-mix(success 65%, text)`). 미연결 = 「미지정」(`common_util_summary_item.ts`:84-86) · 칸 꾸밈 = 공용 입력 칸(`B05_Profile_UI_Style.css`:330-341 · 바탕 surface). +- 고칠 자리: SS:451-453 — 글자색 지우고 배경 + 테두리 성공색(본문색 글). 미연결은 그대로. +- 재사용(공용 양식): 성공 배경 꼴 `ui_template/sheet/ui_template_sheet.css`:112(101-1 「모두 반영」 초록 = `color-mix(success 26%, canvas)`) · 연결 알약 `A00_Common/spreadsheet/spreadsheet_links.css`:59-64(옅은 배경 + 테두리 · 글 본문색). 토큰 `--color-success`(`ui_template_theme.css`:38 · 어두움 321) — 두 테마 같은 규칙. 공용 `ui-tag--success`(`ui_template_elements_styles.ts`:182)는 보라 바탕 + 초록 글이라 안 맞음. +- 시험: T test_b05_structures_form_summary(클래스 그대로 · 통과 확인) · 새 CSS 소스 시험(`is-assigned` 에 background · border-color success · color 없음). +- 위험: 없음(목록 줄 `.b05-route__irregular-item.is-assigned span` SS:494-496 글자색은 그대로 — 요구 밖). +- 크기: 작음. + +## O2. 횡단 카드 왼쪽 위 면적표 — 열 수 따라 바뀜 +- 현재: 표 = CA:320-415(머리 ㎡ · EA · RR · BR · 계 + 절토 · 성토 · 사토장 줄). 크기 **고정** — CSA:14-27(absolute · left 58px · `font-size 0.72rem` · nowrap). 열 수(138-3 · 1~6 · 기본 3 · SV:126-143)는 카드 폭만 바꿈(SV:428-431 · COL 머리 「글자 크기는 그대로」). 카드는 넘침 숨김(CSX:42-43). +- 폭 셈(추정 · 칸 1232 px): 카드 = 1열 1232 · 2열 608 · 3열 400 · 4열 296 · 5열 234 · 6열 192 · 그림 칸 = 카드 − 78. 표 ≈ 250~280 px(0.72rem 고정폭 글 · 값 5~6자). → 3열에서 그림 칸 322 의 80% 덮음 · 4열부터 카드 밖으로 잘림 · 1~2열에선 작아 보임. +- 고칠 자리(CSS만): 카드 그림 칸 `.b06-cross-card__chart-wrap` 가 이미 inline-size 컨테이너(CTL:237-239 · 151-1 의 `@container (max-width: 620px)` CTL:242-257) → CSA 에 ⓐ 글자 = `clamp(0.6rem, 0.55rem + 0.7cqw, 0.9rem)`(400 px ≈ 지금 0.72rem · 1232 px 0.9rem · 192 px ≈ 0.63rem) · 칸 여백 비례 ⓑ 좁은 카드(`@container (max-width: 320px)` = 4열부터) EA · RR · BR 칸 접음(`th:nth-child(2..4)` · `td:nth-child(-n+4)` — 머리 · 본문 둘 다 2~4째) = 「계」만 ⓒ `--b06-areas-height`(CTL:10 · 15 · 249 · 설정하는 곳 없음 · 3.6rem 고정)를 같은 글자 크기 식으로 정의 — 조정창 · 보라 치수 글이 표를 안 덮게. +- 재사용: 151-1 컨테이너 쿼리 꼴(CTL:236-257) · 표 강조 규칙 그대로(CSA:84-101). +- 시험: T 새 CSS 소스 시험(clamp · 320 접기 · 변수) · test_138_cross_columns(무변) · test_137_design_pick · test_118_pipe_pick · test_152_4 · test_152_5 · test_b06_wall_drain_pipe(같은 CSS 문자열 단정 — 안 깨짐 확인). +- 위험: 접힌 4열 이상에서 EA · RR · BR 강조 단추 못 누름(계만) · 1~2열 글 커지면 사토장 넷째 줄까지 높이 늘어남(ⓒ로 막음). +- 크기: 작음. +- ⬜ 좁은 카드 처리: (가) 글자 비례 + 4열부터 「계」만(접기) / (나) 글자 · 여백 비례만(접기 없음 · 5~6열은 여전히 잘림) — 추천 (가). + +## O3. [상세] 모달 그림 — 테마 색 · 칸 가득 +- 현재: 그림 = 카드 SVG **복제**(DT:217-226) + 공용 줌 · 팬(164-1 · DT:120-145 · `--ratio` = viewBox 비율). 바탕 **어두움 고정** — CSD:31-61(토큰 12개 덮어씀 · `#111111`). 크기 = 비율 유지 맞춤 CSD:63-70(`width: min(100cqw, 100cqh × ratio)` · aspect-ratio) → 칸(큰 창 96vw × 남은 높이 · 비율 ≈ 3, 추정)보다 카드 비율(≈ 1~1.6)이 좁아 좌우 빈 띠. 공용 줌은 SVG 상자 비율 = viewBox 비율을 전제(ZP:159-170 · 197 — 상자만 늘리면 팬 · 커서 고정 어긋남). +- 고칠 자리: + - 테마: CSD:31-47 토큰 덮어쓰기 · `#111111` · `#f2f2f2` 지움 → 바탕 `var(--color-surface-raised)`(카드와 같음 · CSX:46) · 글 `var(--color-text)`. 붉은 강조(164-2 · CSD:124-146)는 토큰이라 그대로. + - 가득(⬜ (가)): 복제 대신 **모달 칸 크기로 새로 그림** — 카드 함수 `createCrossSectionCard`(CV:134-169)가 폭 · 강제 높이를 받음 · 강제 높이 > 자연 높이면 세로 범위를 늘려 채움(VM:83-100). SV 의 `buildCrossCard`(SV:346-375 · 연동 관 `culvertLinkFor` 등 인자 한 벌)를 폭 · 높이 받는 꼴로 넓혀 컨트롤러에 `detailChart(stationId, w, h)` 하나(SVT 에 한 줄) → DSY:47 host 에 실어 DT `paint()` 가 씀(카드 article 은 안 붙이고 svg 만). 자연 높이가 칸보다 크면 반폭을 그 비율만큼 넓힘(`crossPlotBase` · `naturalHeightAtWidth` VM:33-81 재사용 · 샘플 밖은 빈 자리). 칸 크기 변하면 ResizeObserver 로 다시 그림. CSD:63-70 → svg 100% × 100%. +- 재사용: 카드 그리기 한 벌(CV) · 공용 줌(ZP · 칸 = viewBox 라 정확) · `buildZoomControls`. +- 시험: T test_164_detail_zoom(CSS 단정 두 줄 test_164_detail_zoom:75-76 · `cad.replaceChildren(clone, …)` 단정 고침) · test_150_detail_pick · test_138_cross_detail · 새 시험(칸 W × H → 새 svg viewBox = W × H · 반폭 넓힘 식 · 어두운 토큰 없음). +- 위험: clip id `b06-cross-clip-{측점}`(CV:386)이 카드와 겹침(지금 복제도 같음) → 모달 쪽 id 바꿈 · 반폭이 넓어지면 카드와 보이는 가로 범위가 다름 · 칸 크기 바뀌면 줌 tx · ty 어긋남(다시 그릴 때 원복, 추정) · SV 592줄 + ~15. +- 크기: 테마 작음 · 가득 중간. +- ⬜ 가득 방식: (가) 모달 칸 크기로 새로 그림(빈 띠 없음 · 축 · 눈금 맞음 · 가로 범위 넓어질 수 있음) / (나) 복제 유지 + 칸을 그림 비율로 줄임(빈 띠는 없어지나 그림 크기 그대로 · 칸 전체는 아님) — 추천 (가). + +## O4. 도수로/돌붙임 칸 기본값 · 이름 · 차례 +- 현재 칸 정의(공용 · 배관 · 박스 · 세월교 셋이 씀): `CHUTE_ITEMS` GU:123-146 → `CHUTE_ADD`(GU:149-157 · 선택 상자 · 하나만 · 키 `chute_add_{n}_{id}`) — PIPE:92 · `design_structure_box.ts`:94 · `design_structure_ford.ts`:68. 물넘이 포장 상자 = FPV:28-47(구조 · 두께 두 칸만 · 키 `ford_chute_{n}_*`). 기본값 = 새 상자가 설 때 칸에 실제 값(`fresh` SF:297-298 · 고르기 칸도 됨). +- **이름은 정의 파일이 이김**: 화면 글 = `names["chute_add.bond"] ?? item.label`(SPC:238-239) · DEF `종류.{pipe · box_culvert · ford_bridge}.이름."chute_add.bond": "붙임 형식"`(DEF:3365 · 3432 · 3507) → TS 만 고치면 화면 그대로. +- 원문 풀이(코드 칸 이름): + +| 칸 id · 저장 키 | 지금 | 바뀜 | +|---|---|---| +| `structure` · `chute_add_{n}_structure` | 고르기(도수로 · 돌붙임) · 기본 없음(빈 보기) | 기본 **도수로** | +| `bond` · `chute_add_{n}_bond` | 이름 「붙임 형식」 · 3째 · 기본 없음 | 이름 **「형태」** · **구조 바로 뒤(2째)** · 기본 **메붙임**(「구조 뒤로 : 메붙임」 풀이 · ⬜) | +| `thickness` · `chute_add_{n}_thickness` | cm · 기본 30 | 기본 **45** | +| `area` · `chute_add_{n}_area` | ㎡(step 0.1) · 기본 없음 | 기본 **30 ㎡**(% 아님 · B8S:238-241 이 ㎡ 로 셈) | + + - 차례 = 구조 · 형태 · 두께 · 면적. 물넘이 포장 상자도 구조 도수로 · 두께 45(같은 칸 · 90-2 · FPV:35 주석). +- 고칠 자리: GU:124-146(차례 · label · default 넷) · FPV:38-45(default 둘) · DEF 이름 3곳 「형태」 · (⬜면) 두께 빈 값 대체 짝 `CHUTE_THICKNESS_CM` CSET:40 · 204 ↔ ECU:68 · 260(30 → 45). +- 재사용: 명세 `default`(54-36 꼴) · 흙막이 「형태」 이름(DEF `soil_add.form`). +- 시험: T test_65_ford_defaults:70-76(차례 · 기본 단정 고침) · test_52_structure_spec_pipe/box · test_52_4_structure_spec_ford · test_52_17_single_container · test_136_chute_form_cache · test_98_b08_pipe_summary · (⬜ 대체도 바꾸면) test_b06_culvert_set:220 · test_b06_culvert_sets_mirror. +- 위험: 면적 기본 30 = 구조를 돌붙임으로 바꾸면 B08 이 바로 30 ㎡ 셈(98-3 「빈칸이면 안 셈」 뜻 바뀜 · 도수로일 땐 안 셈 B8S:240-242) · DEF 를 손으로 고치면 M02 판 안 오름 · 물넘이 포장엔 형태 · 면적 칸이 없어 B8S `CHUTE_HEADS` ford_chute(B8S:224)가 늘 안 셈(이번 밖 · 기록만) · 이미 선 상자 값은 그대로(새 상자만). +- 크기: 작음. +- ⬜ 「구조 뒤로 : 메붙임」: (가) 형태 칸을 구조 바로 뒤로 옮기고 기본 메붙임 / (나) 차례 그대로 기본만 메붙임 — 추천 (가). +- ⬜ 두께 빈 값(옛 상자 · 지운 칸)이 그림에 쓰는 대체 30 cm: (가) 45 로 같이(짝 · 거울 시험) / (나) 새 상자 기본만 45 — 추천 (가). + +## O5. 구조물 조합 고르기 모달 나무 = M02 나무 · 폭 +- 현재: 모달 = IP(142-1 · 147-2) · 나무 자료 = `GET /m02/items?all=1` 줄 목록 → `buildTree` IPD:119-156 · 그리기 = 공용 `renderTree` · `createTreeRow`(TR:113-161 · IP:203-224). M02 = TP(층 하나 · `fetchTree` 폴더 + 항목 · TP:233-262 · 344) + 층 단추 셋 RT:49-90. +- 꼴 차이: + +| 꼴 | 고르기 모달(IP · IPD) | M02(TP · RT) | +|---|---|---| +| 맨 위 | 층 셋(마스터 · 회사 · 개인)이 나무 뿌리 줄 셋(IPD:120-128) | 층 단추 셋(`createLayerBar` · 하나만 고름) · 뿌리 줄 없음 · 그 층 폴더부터(TP:342-345) | +| 잎 글 | 경로 전체 이은 이름 `itemName`(IPD:72) | 마지막 마디 `leafName`(TPM:25) | +| 차례 | 서버 줄 차례 · 폴더 · 잎 섞임(IPD:130-150) | 폴더 먼저 · 잎 뒤(TP:235-247) | +| 빈 폴더 | 안 보임(항목 줄만 받음) | 보임(`view.폴더` TPM:53) | +| 숫자 | 층 · 폴더 줄 잎 수 · 잎 없음 | 폴더 줄 잎 수 · 잎 없음(같음) | +| 화살표 · 아이콘 · 들임 · 안내선 | 공용 줄 같음(TR) | 같음 | +| 처음 펼침 | 지금 항목 길 · 없으면 개인 뿌리(IP:243-252) | 열어 둔 것 · 고른 열 길 | +| 찾기 | 위 찾기 칸(IP:124 · 202) | 없음 | +| 상자 | 테두리 상자 · flex 1(IPC:20-30) | 테두리 없음 · 줄 `overflow-wrap: anywhere`(TPC:10-22) | +| 폭 | `minmax(220px, 3fr)` ≈ 1920 화면 450 px(IPC:4-10) | 좌측 패널 320 px(`--wf-left-panel-width` `ui_template_theme.css`:196) | +| 우클릭 | 개인 폴더 「새 항목」(IP:177-188) | 편집 메뉴 | + +- 고칠 자리(⬜ (가)): IP — 찾기 칸 아래 층 단추 셋(공용 `createButton` filled · ghost · RT:69-80 꼴 · 처음 = 지금 항목 층 · 없으면 개인 · 없으면 마스터) · 고른 층 뿌리의 자식만 그림(뿌리 줄 없음) · 개인 맨 위 「새 항목」 = 빈 자리 우클릭(M02 29-6 꼴) / IPD `buildTree` — 폴더 먼저 · 잎 글 = 경로 마지막 마디(툴팁 = 전체 이름 · 층 · 키) / IPC:4-10 왼쪽 열 = `var(--wf-left-panel-width)` · 나무 상자 = TPC 꼴. +- 재사용: 공용 `renderTree` · `createTreeRow` 그대로 · RT 단추 꼴(코드 import 는 안 함 — RT 는 세션 · 회사 권한에 묶임 · ui_template → M02 화면 의존 늘림). +- 시험: T 새 시험(IPD 는 import 없음 → Node 로 `buildTree`: 폴더 먼저 · 잎 글 · 층 거름) · test_modal_head_actions(IP 소스 단정) · test_item_picker_detail(소스 700줄 · 우클릭 자리) · test_156_2_picker_speed(무변). +- 위험: 층 하나만 보이면 찾기 결과가 다른 층에 있을 때 안 보임 → 찾는 동안은 층 단추에 맞은 수 표시(추정 필요) · 빈 폴더는 (가)로 못 보임(자료 길이 다름). +- 크기: 중간. +- ⬜ 같게 만드는 길: (가) 고르기 모달 안에서 M02 꼴로 바꿈(위 표대로 · 자료 · 찾기 · 「새 항목」 그대로) / (나) M02 `createTreePanel` 자체를 읽기 전용으로 끼움(빈 폴더까지 같음 · 층마다 나무 따로 받음 · 잎 → 줄 짝 맞춤 · 「새 항목」 다시 이음) — 추천 (가). + +## O6. 「횡단 보기 설정」 반폭 [적용]이 오래 걸림 +- 도는 것(정적 추적 · DVC:257-271): [적용](PNL:20-36) → ① `maxToeFitHalfWidth` 전 측점(FIT:333-335 · 0.1 m 훑기 · 가벼움) ② `ensureSampledWidth(max(요청, ①))`(PC:30-58) — 보유 샘플 폭(기본 20 m · `config/config_system_design.py`:251)을 넘으면 **서버 재생성**: 종 · 횡단 다시 뽑기 + DB 지우고 다시 씀 + 상세 다시 받기(RTR:383-440) · 화면 전체 잠금 ③ 측점 개별 반폭 전부 덮음(STC:667-675 · 세션만) ④ `renderSectionDetail` → 카드 전부 새로 만듦 + 종단도 · 유토곡선(SV:416-461 · 512-541). 설계선 재계산 · [저장]은 없음. +- 시간 드는 자리(추정): ② 가 원인. 사면이 샘플 끝까지 원지반과 못 만나는 측점(`slope_unclosed` `Engine_Design.py`:328-333 · 경고 줄 그 측점)이 하나라도 있으면 그 측점 `toeFitHalfWidth` = 설계선 끝(= 샘플 끝) + 외삽(최대 60 m) 올림 +1(FIT:57-63 · 284-330) → 늘 보유 폭 초과 → **요청값과 무관하게 누를 때마다 재생성**(수 초~십수 초 · 추정) · 벌어지는 지형이면 재생성 뒤에도 또 +1 m 씩 넘음(60 m 까지). ④ = 카드 73장 · 기하 3.2 ms/장(SV 주석 · 2026-09-06 프로파일) + DOM → 약 0.5~1.5 s(추정). 안내 글(`ui_template_locale_b2.ts`:495-498 「20m 넘는 값만 재생성」)과 코드가 다름. +- 까닭: ① 은 「카드가 자동 줌아웃할 지반 확보」(DVC:259 주석) 몫인데 자동 줌아웃은 79-2 로 없어짐(VM:115-128 `effectiveCardHalfWidth` = 그대로) → 남은 군더더기. +- 고칠 자리: DVC:261-262 — 목표 = 요청값만(① 뺌) → 20 m 안이면 재생성 없이 ③ · ④ 만. FIT `maxToeFitHalfWidth` 는 부르는 곳이 없어짐(지움 · 같은 파일 `toeFitHalfWidth` 는 다른 곳이 씀 확인 필요). +- viewBox 만 바꾸는 길: 반폭이 바뀌면 m당 px · 자연 높이 · 줄 높이가 함께 바뀌어(VM:33-64 · SV:440-452) viewBox 만으로는 줄 높이 안 맞음 · 공용 줌은 1배 밑 축소 없음(ZP:131) → 이번엔 ④ 한 번 다시 그림 유지(재생성만 없앰). +- 재사용: 카드 개별 ▶(STC:162)는 이미 요청값만 넘김 — 같은 규칙. +- 시험: T 새 시험(DVC 소스 — `applyCrossHalfWidth` 가 `maxToeFitHalfWidth` 안 부름 · 요청 ≤ 보유면 `regenerateSections` 안 감 · PC 꼴 Node 헬퍼) · 화면 확인 거리 = 경고 줄 있는 노선에서 [적용] 즉시. +- 위험: 사면 끝이 샘플 밖인 측점은 카드에서 잘린 채(지금도 79-2 로 줌아웃 없음 · 팬 · 경고 줄 있음) · 재생성이 작업본을 쓰던 길(5장 「[저장]에서만」 어긋남)이 줄어듦. +- 크기: 작음. +- ⬜ 보유 폭(20 m)보다 큰 요청값: (가) 지금처럼 그때만 재생성(안내 글 그대로) / (나) 재생성 안 함(샘플 밖 빈 자리 · 「보기만」 뜻 그대로) — 추천 (가). + +## O9. 집수정 칸 「동물이동형」 체크박스(기본 참) +- 현재 칸 정의: 배관 「관 보호공 (유입)」 필수 상자(PIPE:56-73) · 구조 = 집수정이면 갈래 칸(형태 `inlet_structure` · 높이 `inlet_basin_height_m` · `guardItems` `by` GU:33-75). 명세 칸 꼴에 **체크박스 없음**(SPC:35 `select | number | text | auto` · SF:125-171). 옛 키 `inlet_basin_form`(선택지에 「동물이동형」 · DEF:97-108)은 은퇴(PIPE:95) · 읽는 곳 없음. +- 고칠 자리: SPC:35 꼴 `check` 더함(writeOptions SPC:158-182 · readState 는 글 "true"/"false" 그대로 통과) · SF:125 `control()` 에 check 갈래(공용 `createCheckbox` · 빈 값이면 `item.default` 로 체크 · change 때 `.value` = "true"/"false" — 듣개 SF:242-244 가 `.value` 를 읽음) · PIPE:69-72 뒤 칸 `{ id: "animal", label: "동물이동형", kind: "check", default: "true", by 구조 = 집수정 → key "inlet_basin_animal" }` · MRG:26-34 배관 키 목록에 새 키(흙막이로 바꾸면 지워짐 · 거울 시험). +- 기본 참 = **빈 값 = 참**(키 없는 옛 관 · 자동 배치 관도 참 · 이주 없음) · 끄면 "false" 저장. +- 서버 통과: pipe_points.json `options` 는 dict 그대로 받음(`common_util/common_util_drainage_pipes.py`:345-360 · PUT `B04_PreProcess/B04_PreProcess_Router_Basins.py`:424-440 · 키 거름 없음) → 서버 손댈 곳 없음. +- B07 · B08: 지금 집수정 꼴을 읽는 곳 없음(B08 = 조합 연결로 셈 · B8S) → **저장만**. 근거 · 뒤 후보: 「집수정은 … 동물이동형을 원칙」(`resources/knowledge/original/임도기술교본/8. 배수공사/1. 암거(속도랑).md`:59 — 기본 참과 맞음) · 실무 「동물이동통로 돌집수정 ㄴ형 · ㄷ형」(`…/실무문서/_종합비교/04_임도구조물_원단위.md`:41). +- 재사용: 공용 체크박스 `ui_template/ui_template_checkbox.ts`(B07 `B07_DesignDetail_UI_PlanKinds.ts`:194-195 쓰는 꼴) · 명세 `by` 갈래. +- 시험: T test_52_structure_spec_pipe(집수정 갈래에만 · 흙막이 가림 · back 키) · test_b05_facility_options_merge(키 목록) · 새 시험(check 칸: 빈 값 = 체크 · 끄면 "false" · 다시 켜면 "true") · test_65_ford_defaults · test_b05_new_structure_defaults(무변). +- 위험: 공용 폼이라 M02 미리보기 · M02 이름 표(`nameTable` SPC:248)에도 칸이 섬 · 필수 상자 빈 칸 기본 채움은 고르기만(SF:215-223) → check 는 그리기에서 기본 해석 · 구조를 집수정으로 바꾸면 onEdit 가 "true" 를 실제로 적음(SF:198-204 · 무해). +- 크기: 중간(새 칸 꼴). + +## 고칠 파일 목록 + +| 파일 | 줄 수 | 700 위험 | 요구 | +|---|---|---|---| +| `B05_Profile/B05_Profile_UI_Style_Structures.css` | 627 | 낮음(± 2) | O1 | +| `B06_Section/B06_Section_UI_Style_Cross_Areas.css` | 523 | 낮음(+ ~25) | O2 | +| `B06_Section/B06_Section_UI_Style_Cross_Controls.css` | 471 | 없음(변수 정의만 · 선택) | O2 | +| `B06_Section/B06_Section_UI_Style_Cross_Detail.css` | 152 | 없음(− ~15) | O3 | +| `B06_Section/B06_Section_UI_Cross_Detail.ts` | 290 | 없음(+ ~30) | O3 | +| `B06_Section/B06_Section_UI_Section_View.ts` | 592 | 중간(+ ~15) | O3 | +| `B06_Section/B06_Section_UI_Section_View_Types.ts` | 60 | 없음 | O3 | +| `B06_Section/B06_Section_UI_Page_Design_Sync.ts` | 230 | 없음(+ 1) | O3 | +| `A00_Common/design/design_structure_guard.ts` | 157 | 없음 | O4 | +| `A00_Common/design/design_structure_ford_pavement.ts` | 52 | 없음 | O4 | +| `resources/master_template/구조물정의.json` | 3805(자료) | 해당 없음 | O4(이름 3곳) | +| `common_util/common_util_culvert_sets.ts` ↔ `B06_Section/B06_Section_Engine_Culvert.py` | 627 · 676 | 없음(상수 한 줄 · ⬜ (가) 때만) | O4 | +| `ui_template/ui_template_item_picker.ts` | 364 | 낮음(+ ~35) | O5 | +| `ui_template/ui_template_item_picker_data.ts` | 192 | 없음 | O5 | +| `ui_template/ui_template_item_picker.css` | 279 | 없음 | O5 | +| `A00_Common/design/design_view_cross.ts` | 684 | 높음 — 지우기만(− 2) · 늘리지 말 것 | O6 | +| `B06_Section/B06_Section_UI_Cross_Fit.ts` | 335 | 없음(지우기) | O6 | +| `A00_Common/design/design_structure_spec.ts` | 262 | 없음 | O9 | +| `A00_Common/design/design_structure_form.ts` | 369 | 없음(+ ~15) | O9 | +| `A00_Common/design/design_structure_pipe.ts` | 106 | 없음 | O9 | +| `B05_Profile/B05_Profile_UI_Drainage_Facility_Merge.ts` | 136 | 없음 | O9 | + +- 요구 겹침: O4 · O9 = 같은 명세 층(GU · PIPE · SPC · SF — 파일은 다름 · 공용 폼 함께) · O1 · O4 · O9 = 좌측 패널 같은 화면 · O2 · O3 = 횡단 카드 그림 칸(CSS 파일 다름) · 시험 test_65_ford_defaults(O4) · test_52_structure_spec_pipe(O4 · O9) 겹침. +- 안 고침: `B05_Profile/B05_Profile_UI_Drainage_Facility.ts`(694줄 — O9 에 필요 없음). diff --git a/docs/raw/요구_1010/조사_P_B05_3D주름.md b/docs/raw/요구_1010/조사_P_B05_3D주름.md new file mode 100644 index 000000000..8d78616c8 --- /dev/null +++ b/docs/raw/요구_1010/조사_P_B05_3D주름.md @@ -0,0 +1,74 @@ +# 조사 P — B05 3D 성토 사면 종단 주름 (요구 1010-7 · 읽기 전용) + +요약 — 주름의 주된 까닭 = 측점 사이 **비탈 끝 높이를 지형(DTM 1 m)에 그대로 붙이고 그 차를 사면 전체에 직선으로 나눔(드레이프)** → 비탈 끝 아래 지형 굴곡이 빗면 아래 방향 골 · 마루로 번짐. 둘째 = 측점마다 0.2 m 앞 덧격자 행 + 고정 측점 행 → 측점마다 꺾임. 추천 = 비탈 끝 높이 종단 고르기(지형 ±0.5 m 허용) + 측점 앞 덧행 없앰 → 큰 꺾임 약 46 % 줄어듦 · 측점 B06 오차 그대로. + +경로 약칭 `_X.ts` = `B05_Profile/B05_Profile_UI_Corridor_X.ts`. + +## 0. 어떻게 쟀나 +- 자료 = 226(`226fc805…` · 측점 70 · 20 m 간격 · 1,153 m · 성토 대부분 좌측) · d22(`d2245e3b…`) · 입력 = 10-8 뽑아 둔 `aislo_3d_probe/input_*.json` · 지형 = storage `dtm_classification_smooth_preview.glb`(격자 1.08 m) · 읽기만. +- 메인 폴더 TS 를 Node 로 그대로 돌리고 메모리에서만 훅을 끼워 내부 값(보정량 · Taubin 전후 격자)과 고칠 안을 흉내 냄 · 프로젝트 파일 변경 0 · 스크립트 = 스크래치 `probe_wrinkle.cjs`. +- 잣대 — 성토 사면만: + - 격자 꺾임 = 이웃 격자 행(약 1 m) 사이 사면 법선 각(u 0.2 · 0.4 · 0.6 · 0.8). + - 망 꺾임 = 실제 삼각형 이웃 면 각 · 공유 변이 **노선 가로**(빗면 아래 방향 = 종단 주름 선)인 것과 노선 세로인 것을 나눔. + - 측점 오차 = 측점 단면 B06 설계선 대비 망 높이 최대(성토 쪽) p90. + +## 1. 현재(파일:줄) +- `_Loft.ts:327-328` 행마다 보정량(lift) = 비탈 끝 자리 지형 − 단면 보간 비탈 끝 높이 · 고르기 없음(115-9 의 ±2 m 고르기 흔적 없음). +- `_Loft.ts:340` 사면 높이 = 단면 보간 + lift × u(노견 끝 0 → 비탈 끝 1 직선). +- `_Loft.ts:401-402` 비탈 끝 점 높이 = 지형 그대로(`groundAt`). +- `_Loft.ts:351-352` 보기 열쇠가 바뀌는 행의 앞 행도 격자 행으로 — 측점마다 열쇠가 바뀌어 측점 0.2 m 앞에 덧행(19.8 · 20.0 · 21.0 …). +- `_Loft.ts:483 · 496` 측점 행 점 · 단면 꼭짓점 · 비탈 끝 · 노견 끝 = Taubin 고정. +- `_Loft_Grid.ts:10-14 · 47-53` Taubin λ 0.5 · μ −0.53 · 10 번 · 이웃 같은 무게(간격 무시). +- `_Loft_Toe.ts:78` 가우스 σ 1.5 m 는 비탈 끝 **평면 거리**만 고름(높이 아님). +- `_Loft_Profile.ts:209-226` 측점 사이 = 단조 3차(PCHIP · C1) — 선형 아님. +- `_Loft_Shade.ts:230` 부드러운 법선(꺾임 30°) · `_Tin.ts:35 · 312` 성토 = 청록 단색. + +## 2. 까닭(측정 · 226 / d22) +| 단계(측점 사이 행) | 격자 꺾임 중앙 · p90 | +|---|---| +| 단면 보간만(드레이프 뺌) | 0.25 · 3.2° / 0.27 · 3.3° | +| + 드레이프 | 4.5 · 16.2° / 4.3 · 14.5° | +| + Taubin = 지금 | 3.0 · 9.8° / 2.7 · 8.5° | +| 측점 행(지금) | 6.0 · 18.2° / 5.4 · 15.3° | + +- ① 드레이프(주 원인) — 주름의 약 9 할. 측점 사이 |보정량| 중앙 0.52 · p90 1.9 · 최대 5.5 m / 0.46 · 1.9 · 6.8 m(측점은 0.02 / 0.01 m). 비탈 끝 지형 높이 2차 차분 p90 0.71 / 0.66 m/m². 행 꺾임 ↔ |Δ²보정량| 상관 0.49 / 0.42. 보정량 파장 — 전체 RMS 1.12 / 1.33 m · σ 2 m 고르기 뒤 남는 잔물결 0.30 / 0.27 m · σ 8 m 뒤 0.69 / 0.78 m(짧은 · 긴 파장 다 있음). +- ② 측점마다 꺾임 — 측점은 보정량 ≈ 0 · 측점 사이는 혹처럼 부풂 + 측점 앞 0.2 m 덧행을 같은 무게 Taubin 이 1 m 이웃과 똑같이 평균 → 측점 행 꺾임이 사이의 2 배. 덧행만 빼도 측점 행 중앙 6.0 → 3.7° / 5.4 → 3.9°. +- ③ 보조 — 노면 끝 선(리본) 자체가 측점에서 꺾임: 평면 각 변화 중앙 0.47° / 3.9°(사이 0.06°) · 경사 변화 0.34 / 0.30 %(사이 0.16 %) → 드레이프 빼도 측점 행 1.25 / 1.5°(사이 0.25°). +- 망 — 노선 가로 변 꺾임 중앙 1.62 · p90 10.2° / 1.52 · 10.0° vs 노선 세로 변 0.52 · 3.0° / 0.49 · 3.4° → 가로 변이 3 배 = 종단 주름 모양. 10° 넘는 가로 변 181 / 158 개 per 100 m · 자리 = 사면 가운데 41 / 37 % · 비탈 끝 띠(u > 0.85) 36 / 30 % · 성토↔절토 바뀜 13 / 15 % · 구조물 둘레 9 / 16 %. +- 도드라지는 까닭 — 원지형 이웃 면 꺾임 중앙 12° · p90 34° 로 훨씬 거칠지만 사진색 · 성토 면은 청록 단색 + 부드러운 음영 → 3~10° 꺾임도 밝고 어두운 띠로 보임. +- 아닌 것: + - 짝 맞춤 어긋남 — 같은 호길이 비율 기울기로 바꿔도 수치 같음(성토 단면 대부분 꺾임 없는 두 점). + - 측점 사이 선형 보간 — 실제는 단조 3차 · 보간만의 꺾임 0.25°. + - 비탈 폭 출렁 — 평면 거리 2차 차분 p90 0.10 m/m²(높이 환산 약 0.07) · 지형 높이의 1/10. + - 음영만 꺾임 — 이웃 음영 단차 중앙 0.01° · 형상 자체 꺾임. + - 평활화가 횡단만 — Taubin 은 앞뒤 행도 봄 · 다만 비탈 끝 · 꺾임 · 측점 행 고정이라 경계로 들어오는 굴곡을 못 지움 · 30 번으로 늘려도 p90 10.2 → 9.9°. + - 성토↔절토 끊음 — 큰 꺾임의 13~15 % · 평면도 규칙(의도) · 별개. + +## 3. 고칠 안(측정 흉내 · 226 / d22) +기준 = 노선 가로 변 꺾임 중앙 · p90 · 10° 넘음 per 100 m · 측점 오차 p90. 지금 = 1.62 · 10.2° · 181 · 0.17 m / 1.52 · 10.0° · 158 · 0.14 m. + +| 안 | 내용 | 크기 · 위험 | 기대 | +|---|---|---|---| +| 1 비탈 끝 높이 종단 고르기 | 보정량을 같은 종류(성토 · 절토) 행끼리 노선 따라 가우스 σ 3 m · 측점 행은 그대로(`_Loft_Toe.ts` smoothToe 의 측점 되돌림과 같은 방식) · 지형과 차 ±0.5 m 상한 · 비탈 끝 점 높이 = 고른 선 | `_Loft.ts` 25 줄 안팎 + `_Loft_Toe.ts` 고정 고르기 한 함수로 꺼냄 · 비탈 끝이 지형에서 최대 0.5 m(중앙 0.25 m) 뜸 → 바깥 지형과 잇는 삼각형에 작은 턱(지형이 거칠어 잘 안 보임) · 성토 금지 고리(`limited`)는 고른 높이 뒤에 그대로 | 0.62 · 6.3° · 107 · 0.17 / 0.57 · 5.9° · 98 · 0.15 · 세로 변 p90 3.0 → 1.7 / 3.4 → 1.9° · 계산 시간 같음(약 0.9 s) | +| 2 측점 앞 덧행 없앰 | 열쇠 바뀜이 측점 행에서면 앞 행 표시 안 함(측점 행이 두 짝 꼭짓점을 이미 담음) | `_Loft.ts:352` 한 줄 · 측점에서 꺾임선 잇기 확인 필요 | 단독 1.60 · 10.1° · 166 / 1.50 · 9.5° · 135 · **안 1 + 2 = 0.57 · 5.9° · 97 · 0.17 / 0.51 · 5.5° · 86 · 0.15** | +| 3 드레이프 비탈 끝 쪽 몰기 | lift × u³ | `_Loft.ts:340` 한 줄 · 비탈 아래 무릎(세로 변 p90 3.0 → 4.1 / 3.4 → 5.0°) | 0.90 · 9.2° · 159 / 0.98 · 9.5° · 148 · 측점 오차 최대 1.19 → 0.33 / 1.61 → 0.33 m | +| 4 Taubin 30 번 | 횟수만 | 한 줄 · 효과 미미 · 측점 행 꺾임 오히려 늚 | 1.46 · 9.9° · 173 / 1.26 · 9.8° · 155 | +| 5 사면 보정량 고르기 + 비탈 끝 2 m 띠 흡수 | 면은 고른 보정량 · 잔차는 띠에서만 | 띠에 세로 주름(세로 변 p90 5.1 / 5.9°) | 0.70 · 9.0° · 157 / 0.89 · 10.9° · 174(d22 악화) | + +- 비추천 — 행마다 비탈 끝을 지형과 다시 찾기(일정 구배 면) · 115-7 지느러미 · 빗살 재발 위험 · 측정 안 함. +- 손잡이 — σ 4 m · 상한 1.0 m 면 0.41 · 4.8° · 84 / 0.44 · 5.9° · 92(비탈 끝 1 m 까지 뜸). + +## 4. 추천 +안 1 + 안 2 — 작은 고침 둘 · 측점 단면 B06 그대로 · 큰 꺾임(10° 넘음) 181 → 97 / 158 → 86(약 −46 %) · 사면 가운데 격자 꺾임 중앙 3.0 → 1.2° / 2.7 → 1.1°. +- 허용치 제안(3D 참고용) — 측점 단면 B06 오차 변화 0 · 측점 사이 비탈 끝 높이 지형 ±0.5 m · 비탈 끝 평면 위치 그대로. +- 남는 흠(이번 범위 밖) — 측점 ±1 m 꺾임 p90 10.3 / 12.5°(노면 끝 리본 자체 측점 꺾임 = 코리도 빌드 몫) · 성토↔절토 바뀜 · 구조물 둘레(기존 33 %). + +## 5. 시험 +- 새 시험 `resources/tester/test_<장>_loft_wrinkle.py` + `helper_115_8_corridor_loft.cjs` 에 물결 지형 경우(평탄 노선 · 성토 · 비탈 끝 아래 지형 = 사인 물결 파장 6 m · 진폭 1 m): + - 사면 가운데(u 0.5) 종단 2차 차분 p90 절반 밑. + - 비탈 끝 |높이 − 지형| ≤ 0.5 m. + - 측점 단면 = B06(sectionErr < 1e-4). + - 측점 0.2 m 앞 격자 행 없음. + - 이음 틈 0 · 제약 실패 0. +- 그대로 통과 — `test_115_10_loft_smooth`(평탄 지형이라 drapeErr 0) · `test_115_8_corridor_loft` · `test_135_3_chute_solid` · `test_b05_corridor_*` · `npm run typecheck`. +- 실자료 — 226 / d22 위 잣대(가로 변 꺾임 · 10° 넘음 · 측점 오차 · 비탈 끝 뜸) 전후. diff --git a/docs/raw/요구_1010/조사_Q_B07배치영역.md b/docs/raw/요구_1010/조사_Q_B07배치영역.md new file mode 100644 index 000000000..5a109bcbd --- /dev/null +++ b/docs/raw/요구_1010/조사_Q_B07배치영역.md @@ -0,0 +1,97 @@ +# 조사 Q — B07 횡단 격자 표 배치 · 도면 그림 영역 지정(가이드 · 끌기 · 숫자) (10-10 · 읽기 전용 조사 에이전트) + +사용자 원문 = `사용자요구_1010.md` 8번. 지난 기록 = 140-3(열 × 행 칸 가운데) · 153-1(배치 칸 자리) · 조사 D 7절. + +## 1. 지금 횡단 장 배치 (Q1) + +- 칸 계산: `B07/Engine_Cad_Sheet.py:99-109` `grid_slots` = 그림칸(`usable_area`)을 열 × 행으로 똑같이 나눈 **칸 가운데 점만** 냄 · 차례 좌하단 → 위 → 오른쪽 열 · 장 나눔 `:119-145`(칸 수만큼 · 단면 크기 무관) · 장마다 열 × 행 `:112-116`. +- 그림 놓기: `:148-186` 단면 블록을 원점에 한 번 그려 bbox 를 잰 뒤 블록 가운데 = 칸 가운데로 다시 그림 · 1/100 그대로. +- 블록 테두리: `B07/Engine_Cad.py:576-591` = 블록마다 **자기 그림 + 1 mm** 사각형(`CROSS_BORDER_PAD_MM :428`) → 단면 크기마다 테두리 크기가 달라 줄 · 열이 안 맞아 보임(사용자 지적의 뿌리 · 추정). +- 칸 선(표): 없음 — 칸은 계산만 · 그리지 않음. 도각 = 고정 그림칸 `:188-198`. +- 칸 크기(A1 4 × 4): 그림칸 [42, 47, 812, 567] − 여백 2 % = 739.2 × 499.2 mm → 칸 184.8 × 124.8 mm. +- 넘침: 칸보다 큰 블록은 이웃 칸과 겹침(`Engine_Cad_Sheet.py:5` 「사용자 배치로 고침」) · 알림 없음. +- 배치 저장 · 화면: `cross_layout.json`(`Router_Support.py:101-145`) · GET · PUT `Router.py:552-585` · 칸 = `UI_Panels.ts:178-226` · 자리 `UI_Page.ts:153-193`. + +고칠 자리: +- `Engine_Cad_Sheet.py` — 장마다 칸 격자선(열 + 1 세로선 · 행 + 1 가로선)을 그림칸 위에 그림(도각 층 · 잠금 · 인쇄됨) · 블록 테두리는 끔 · 블록이 칸보다 크면 넘친 칸 수를 도면 dict 에 적음(`warnings`). +- `Engine_Cad.py` `build_cross_drawing` — 곁값 `border=True`(장에서만 False) · `cross_placements.frame`(블록 bbox) 은 그대로 둠 — 화면 덧그림이 그 틀로 자르고 서버 설계선을 걷어냄(`UI_Cad_Structures.ts:67 · 82-95`) · 칸으로 바꾸면 넘친 블록에서 설계선 겹침(추정). +- `Router_Support.py:101` `CROSS_SHEET_LAYOUT = 4` — 옛 판 확정 장은 「옛 배치」 안내(`:449`) 그대로 탐. +- 넘침 알림: 화면은 도면을 열 때 `warnings` 있으면 토스트 「n 칸 넘침 — 열 · 행 줄일 것」(`UI_Page.ts:333` 곁). +- 칸 안 정렬 = 가운데 그대로(140 확정). + +재사용: `grid_slots` 계산 · `polyline_entity` · `usable_area` · 「옛 배치」 안내. +시험: `test_140_b07_cross_grid.py:76-110`(블록 가운데 = 칸 가운데 · 도각 고정 — 그대로 통과 추정) · `test_b07_cross_sheet_pad.py:22`(측점 한 장 테두리 1 mm — 그대로) · `:72`(장 안 블록 틀 = placement frame — 그대로) · 새 시험(격자선 수 = 열 + 1 · 행 + 1 · 선 자리 = 칸 경계 · 장 안 블록 테두리 없음 · 큰 단면 → warnings 1). +위험: 칸 선이 도각 층이면 DXF 내보내기에도 나감(의도) · 판 4 로 확정 횡단 장 전부 「옛 배치」. +크기: 작음~중간(파이썬 약 40줄 · 화면 약 10줄). + +## 2. M02 에 그림 영역 지정 기능 (Q2) + +- 있음 — 숫자만. M02 「도면 양식」 편집 머리 줄 단추 「작도 영역 x0 · y0 · x1 · y1」 → 작은 창 칸 넷(왼쪽 x · 아래 y · 오른쪽 x · 위 y · 양식 좌표 mm) · 검사(빈칸 · 숫자 · 크기 순서) · `[저장]` 때 양식 문서 `drawing_area` 로 적음(`M02/Drawing.ts:108-110 · 182-239 · 333-344`). +- 자료: 양식 JSON 머리 칸 `drawing_area`(`resources/master_template/drawing/00_template_A1.json:4` = [42, 47, 812, 567] · `캐미팩토리.json:8900` 같은 값) · 층 = 시스템 · 회사 · 개인 · 프로젝트(M02 프로젝트 층 = B07 이 읽는 같은 파일 `{프로젝트}/templates/drawing/00_template_A1.json`). +- 서버: `B07/Engine_Template.py:120-134` `drawing_area()`(어긋나면 A1 기본) · `:353-359` `usable_area()` = 영역 − 여백 2 %(`_CONTENT_MARGIN :56`) · `:478-525` `frame_entities` 가 영역 가운데에 내용 가운데를 맞춤. +- 없는 것: CAD 안 가이드 선(영역 사각형이 화면에 안 보임) · 끌기 · B07 도각 편집(`cad_host_frame_edit.ts`)의 영역 칸(저장 때 옛 값을 이어 받기만 `Engine_Template.py:217-222`) · 구조물 도면은 영역 칸 없음(`noArea` · `M02/UI_Main.ts:461`). +- 시험 있음: `test_m02_drawing_area.py`(읽기 · 프로젝트 우선 · 어긋난 값 → 기본 · 저장 때 이어 받기). + +## 3. CAD 쓰는 곳 공통 (Q3) + +- 자료 꼴 = 하나: B07 엔진 전부(평면 `Engine_Cad_Plan.py:91` · 종단 `_Long.py:92` · 횡단 장 · 유역 `_Basin.py:111` · 토적 · 라이다 · 표준횡단 · 표지)가 `drawing_area()` · `usable_area()` 한 길을 씀 → 영역을 고치면 모든 도면 종류에 바로 먹음(새 저장 칸 불필요). B08 구조물도 · M02 구조물 도면 미리보기의 도각도 같은 양식(`M02/Router_Drawing.py:107-128` `structure_frame` · 시스템 양식 · 외곽 좌하단 0,0). +- 둘 자리 = 양식 머리 칸 `drawing_area` 그대로(프로젝트 설정 새로 안 만듦). +- 가이드 선 길: openwebcad 그리기 겹판 — `src/helpers/draw.ts:46-77` 가 엔티티 장면 뒤에 기준점 십자를 덧그리는 자리(`:53` · `draw-functions.ts:236-250`) 그대로 → 점선 사각형 + 횡단이면 칸 격자 · 엔티티가 아니라 저장 · DXF · 인쇄에 안 섞임. 상태는 `state.ts`(647줄 · 700 근처)에 넣지 않고 새 작은 파일(예 `src/integration/guide-area.ts` — 값 · 그리기 · 끌기). +- 싣기 길: 싣기 곁값(`cad_host.ts:64-83` `CadLoadExtra` · 브리지 `aislo-drawing-bridge.ts:51-75 · 234`)에 `guide {area, grid?, editable?}` 더함 · 싣지 않고 갈기 = 새 메시지(host → CAD) · 끌기 결과 = 새 메시지(CAD → host · `cad_host.ts:252-319` 곁). +- 도면 좌표 ↔ 양식 좌표: M02 양식 · B07 도각 편집은 1:1(영역 값 그대로) · B07 도면은 도각을 옮겨 붙임(`frame_entities :515-519`) → 서버가 도면의 도각 층 bbox ↔ 양식 bbox 로 영역을 도면 좌표로 바꿔 응답에 실음(`DesignDrawingResponse` `Schema.py:46-73` · `Router.py:355-365` 한 곳 · 확정본에도 먹음 · 추정: 가장자리 그림(로고)이 빠진 도각이면 bbox 어긋날 수 있음 → 시험으로 확인). +- 끌기: `src/integration/box-resize-drag.ts:59-` 모서리 잡기(9 px · 캡처 단계 mousedown) 꼴 그대로 → 영역 모서리 · 변 끌기 · 놓으면 0.1 mm 반올림해 host 로. +- 숫자 칸: M02 영역 칸(`Drawing.ts:182-239`)을 공용 `ui_template/cad_host/` 작은 부품으로 떼어 M02 양식 · B07 도각 편집 띠(`cad_host_frame_edit.ts` 단추 줄)에서 같이 씀 · 꼴 = 지금 넷(x0 · y0 · x1 · y1) 그대로(옛 문서 바꿈 없음). + +## 4. 저장 · 계산 · 빌드 · 차례 (Q4) + +- 저장: 양식 `drawing_area`(M02 층별 · B07 = 프로젝트 작업본) · 횡단 열 × 행 = `cross_layout.json` 그대로 · B07 도각 편집 저장 = `Router_Frame.py:222-245` 가 요청 도면의 `drawing_area` 를 받게(없으면 옛 값 이어 받기 · `save_project_template` 인자 하나). +- 계산: 배치 · 칸 · 넘침 = 서버 엔진 단독(③) · 화면은 가이드 그리기만 · 영역 바꿈 → 미확정 도면은 다음 열 때 새로 · 확정 도면은 저장본 그대로(도각 편집과 같은 규칙). +- 빌드: openwebcad 고침 → CAD build(`npm run build:b07-cad`) + 리로드 · 파이썬 → 백엔드 재시작. +- 차례: + - ① 가이드 선(모든 CAD 화면 · 보기 전용) + 숫자 칸 공용화(M02 양식 · B07 도각 편집) + 도각 편집 영역 저장 + 여백 정리(⬜1) — 중간. + - ② 끌기(도각 편집 · M02 양식 · ⬜3) — 작음~중간. + - ③ 횡단 격자 표(칸 선 · 테두리 끔 · 넘침 알림 · 판 4 · 가이드에 칸 격자 — 열 × 행은 화면이 이미 앎 `UI_Page.ts:160-175`) — 작음~중간. + - ④ 다른 도면 종류 = 엔진은 이미 공용이라 거의 0 · B08 구조물도 · M02 구조물 미리보기에 가이드만(`structure_frame` 응답에 영역 · `Drawing.ts` `frame` 곁) — 작음. + +## 시험 + +- 파이썬: `test_m02_drawing_area.py` 늘림(도각 편집 저장이 영역 받음 · 영역 → 도면 좌표 바꿈) · `test_140_b07_cross_grid.py` · `test_b07_cross_sheet_pad.py` · 새 격자 시험. +- CAD vitest: 새 `guide-area.test.ts`(끌기 셈 · 최소 크기 · 반올림) · 브리지 싣기 곁값. +- 화면 부품: `test_153_1_b07_cross_layout.py` 꼴 Node 헬퍼로 숫자 칸 ↔ 가이드 메시지 · `npm run typecheck`. + +## 위험 + +- 여백 2 % 를 빼면(⬜1) 옛 프로젝트 사본 [42, 47, 812, 567] 그림칸이 약 4 % 넓어짐 → 미확정 평면 · 종단 장 나눔 · 횡단 칸 크기 바뀜(확정본은 그대로). +- 영역을 줄이면 평면 · 종단 장 수가 늘어 장 번호 · 도면번호가 밀림(배치 바꿈과 같은 꼴 · 추정). +- `M02/Drawing.ts` 554줄 · `B07/UI_Page.ts` 592줄 · openwebcad `state.ts` 647줄 — 700 근처 · 새 부품으로 떼어 붙일 것. +- 공용 `cad_host.ts` · 브리지 고침 = 다른 창(M02 · B08) 영향 → 알릴 일. + +## ⬜ 물음 + +- ⬜1 여백 2 % — (a) 정한 영역 그대로(여백 0 · 시스템 A1 값을 지금 안쪽 [57.4, 57.4, 796.6, 556.6] 으로 바꿔 새 프로젝트 출력 그대로 · 가이드 선 = 숫자 = 실제 자리) / (b) 여백 유지(가이드는 안쪽 선 · 숫자와 선이 2 % 어긋남) — 추천 (a). +- ⬜2 칸 선 — (a) 인쇄되는 표 선(블록 테두리 대신 · 줄 · 열 맞음) / (b) 가이드만(인쇄 안 함 · 블록 테두리 그대로) — 추천 (a)(원문 「테이블 안에 그림」). +- ⬜3 끌기 자리 — (a) 도각 편집 · M02 양식만(양식 1:1 · 저장 길 있음 · 도면 화면은 보기만) / (b) 모든 도면 화면에서 끌어 프로젝트 도각 고침 — 추천 (a). + +## 추천 + +① → ③ → ② → ④ 차례 · 자료는 양식 `drawing_area` 한 칸 그대로 · 가이드는 CAD 겹판(저장 · 인쇄 제외) · 횡단은 칸 선 인쇄 + 블록 테두리 끔 + 넘침 알림. + +## 고칠 파일 목록 + +- `B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py` — 칸 격자선 · 넘침 warnings +- `B07_DesignDetail/B07_DesignDetail_Engine_Cad.py` — `build_cross_drawing` 테두리 곁값 +- `B07_DesignDetail/B07_DesignDetail_Engine_Template.py` — 여백(⬜1) · 영역 → 도면 좌표 · 저장 때 영역 받기 +- `B07_DesignDetail/B07_DesignDetail_Router_Support.py` — `CROSS_SHEET_LAYOUT = 4` +- `B07_DesignDetail/B07_DesignDetail_Router.py` · `B07_DesignDetail_Schema.py` — 도면 응답에 가이드 영역 · warnings +- `B07_DesignDetail/B07_DesignDetail_Router_Frame.py` — 도각 편집 GET · PUT 영역 +- `B07_DesignDetail/B07_DesignDetail_UI_Page.ts` — 싣기 곁값 guide(영역 + 횡단 격자) · 넘침 토스트 +- `ui_template/cad_host/cad_host.ts` — guide 곁값 · 갈기 · 끌기 받기 메시지 +- `ui_template/cad_host/cad_host_frame_edit.ts` — 영역 숫자 칸 +- `ui_template/cad_host/` 새 영역 칸 부품(M02 에서 뗌) +- `M02_MasterTemplete/M02_MasterTemplete_Drawing.ts` — 영역 칸 부품 쓰기 · 가이드 · 구조물 도각 가이드 +- `M02_MasterTemplete/M02_MasterTemplete_Router_Drawing.py` — `structure_frame` 응답에 영역 +- `resources/master_template/drawing/00_template_A1.json` — ⬜1 (a) 이면 영역 값 +- `B07_DesignDetail/openwebcad/src/integration/aislo-drawing-bridge.ts` — guide 곁값 · 메시지 +- `B07_DesignDetail/openwebcad/src/helpers/draw.ts` — 가이드 그리기 한 줄 +- `B07_DesignDetail/openwebcad/src/integration/` 새 `guide-area.ts`(+ 시험) +- 시험: `resources/tester/test_m02_drawing_area.py` · `test_140_b07_cross_grid.py` · 새 격자 · 가이드 시험 diff --git a/docs/raw/요구_1010/조사_R_B08모달탭컨테이너.md b/docs/raw/요구_1010/조사_R_B08모달탭컨테이너.md new file mode 100644 index 000000000..8e6f4508f --- /dev/null +++ b/docs/raw/요구_1010/조사_R_B08모달탭컨테이너.md @@ -0,0 +1,180 @@ +# 조사 R — B08 모달 카드 차례 · 머리 단추 · 칩 테두리 · 빈 보조 탭 줄 · 「수기 입력」 전역 · 묶음 컨테이너 공용 양식 (10-10 · 읽기 전용 조사 에이전트) + +줄임 = `B08/` → `B08_Quantity/B08_Quantity_` · `B09/` → `B09_Estimation/B09_Estimation_` · `M02/` → `M02_MasterTemplete/M02_MasterTemplete_` · `ui/` → `ui_template/ui_template_` · 「추정」 = 화면 실측 없이 코드 · CSS 셈으로 낸 판단. + +## R10. 모달 카드 차례 = 도면 › 일위대가 › 면적산출 · 폭 2 : 3 : 3 + +- 현재 — DOM 차례는 이미 도면 → 일위대가 → 면적산출(`M02/ItemCards.ts:337` `[info, laborCard, ...sheets]`) · 163-2 가 CSS 로 뒤집음 = `B08/UI_Drawing.css:42-50`(`3fr 3fr 2fr` + 도면 `:first-child { order: 3 }`). +- 고칠 자리 — `B08/UI_Drawing.css:44` → `minmax(0, 2fr) minmax(0, 3fr) minmax(0, 3fr)` · `:48-50` order 규칙 지움 · 머리 주석(:40-41) 고침. TS 손 안 댐. +- 재사용 — M02 격자 그대로(960px 아래 1열 · `:52-56` 유지 → 1열도 도면이 맨 위). +- 시험 — `test_156_1_b08_unlink.py:112-114`(옛 `3fr 3fr 2fr` · `order: 3` 판정 → 새 비율 · order 없음). +- 위험 — 없음(M02 화면은 B08 클래스 밖). +- 크기 — CSS 3줄. +- 추천 — 위 그대로. + +## R11. [← 뒤로] · [저장] → 모달 머리 · 크기 = [닫기] + +- 현재 — 단추는 편집 화면 안 줄(`ui/item_picker_edit.ts:64-65` · sm · `:69-85` `.ui-item-picker__edit-top`) · B08 은 `B08/UI_Drawing.ts:149-189` `openEdit` 가 모달 몸통을 이 화면으로 갈아 끼움 · `openModal`(`:190-239`)에 `actions` 안 넘김 · [닫기] = `createButton` ghost 기본 md(`ui/modal.ts:30-34`). +- 공용 모달 함정 — 머리 단추 칸은 mount 때 자식이 있을 때만 붙음(`ui/modal.ts:56`) → 나중에 여는 편집 화면은 그냥 넣으면 안 보임. +- 고칠 자리 + - `ui/item_picker_edit.ts:21-28 · 215` — `EditView` 에 `back` · `save` 두 칸 내보냄(2줄 · 고르기 모달은 안 씀 → 그대로). + - `B08/UI_Drawing.ts` — 빈 머리 칸 `div.ui-modal__actions`(hidden)를 `actions: [head]` 로 넘김(고르기 모달 147-2 `headButtons` 꼴 · `ui/item_picker.ts:310-349`) · 편집 열 때 `head.replaceChildren(view.back, view.save)` + `ui-btn--sm` 뗌(= md · [닫기]와 같은 크기) + 보임 · [뒤로] 콜백(`:170-177`) · 닫기 때 머리 비우고 숨김. 차례 = [← 뒤로] [저장] [닫기]. +- 재사용 — 147-1 `actions` 곁값 · 고르기 모달 머리 단추 꼴 · `[hidden]` 공용 규칙. +- 시험 — `test_163_b08_modal.py:31-42`(createEditView 판정 그대로 통과) + 새 판정 넷(`actions: [head]` · `view.back` · `view.save` · `ui-btn--sm` 뗌 · 뒤로 · 닫기에 머리 비움). +- 위험 — 공용 모달 `ui/modal.ts` 는 안 고침(다른 창 9곳 영향 없음) · 편집 화면 줄엔 제목 · 안내만 남음(빈칸 없음 · `edit-top` flex-wrap). +- 크기 — TS 15줄쯤. +- 추천 — B08 만(고르기 모달은 요구 밖 · 그대로). + +## R12. 「조합 연결」 칩 테두리 = 상태 색 + +- 현재 — 칩 클래스 = 연결 `b08-link__chip` · 미연결 `… is-missing`(`B08/UI_Link.ts:166`) · 테두리 = 기본 `--color-border` · 미연결만 `--color-danger`(`B08/UI_Drawing.css:77-89`) · 「마스터가 바뀜 · 고침 있음 · 원본 없어짐」은 칩 안 배지로만(`B08/UI_Link.ts:106-132` `paintCopyState` · 사본 목록을 뒤에서 받아 칠함) · 배지 경고 = `--color-warning`(`css:113-125`). +- 색 토큰(`ui/theme.css`) — 밝음 :38-43 · 어두움 `[data-theme="dark"]` :321-323. + + | 상태 | 클래스(새) | 테두리 토큰 | 밝음 | 어두움 | + |---|---|---|---|---| + | 연결됨 | `is-linked` | `--color-success` | #1f8a4c | #3fbb6f | + | 미연결 | `is-missing`(있음) | `--color-danger` | #c0392b | #e8695a | + | 마스터가 바뀜 | `is-changed` | `--color-warning` | #b8860b | #e0b64a | + | 고침 있음 | `is-edited` | `--color-info`(= royal-amethyst) | 보라 | #b99aff | + | 원본 없어짐 | `is-gone` | `--color-danger` + 점선 | 위 | 위 | + +- 고칠 자리 — `B08/UI_Link.ts:166` 연결 칩에 `is-linked` · `paintCopyState` 가 칩 클래스도 붙임(앞섬 = 없어짐 › 바뀜 › 고침 › 연결 · 인자에 칩 하나 더) · `B08/UI_Drawing.css:87` 뒤 규칙 넷. +- 재사용 — 배지 판정(`info.원본없음` · `마스터바뀜` · `고침`) 그대로 · 색은 테마 토큰만. +- 시험 — `test_163_b08_modal.py:20`(`'"b08-link__chip"'` 글 판정 → 새 클래스 글로 손봄) + 새 판정(상태 클래스 넷 · CSS 토큰 넷 · 앞섬 차례). +- 위험 — ① 처음엔 녹색 → 사본 목록 받은 뒤 바뀜(짧은 깜빡임) ② **OS 어두움 자동 블록**(`ui/theme.css:332-365`)엔 success · warning · danger 어두운 값이 없음 → 테마 저장 안 한 사용자는 밝은 색 그대로(공용 빈틈 · 이번 범위 밖 · 미연결 붉은 테두리도 같은 처지) ③ 1px 가 흐리면 2px. +- 크기 — TS 8줄 · CSS 15줄. +- 추천 — 위 표 그대로 · 1px. + +## R13. 구조물 집계표 탭에도 보조 탭 줄 자리 + +- 현재 — `B08/UI_Page.ts:86-94` `renderTab` — 자재(:56-83) · 토공(`B08/UI_Earthwork.ts:291-317`) · 수리(`B08/UI_Hydro.ts:112-125`)는 `div.b08-quantity__tabs`(sm 단추 줄 · padding-bottom 8 · 아래 줄 1px · `B08/UI_Page.css:14-20`)를 그림 · 구조물 집계표(:90)만 없음 → 탭 바꿀 때 카드가 27px쯤(sm 단추 18 + 8 + 1 · 추정) 위아래로 튐. +- 고칠 자리 — `B08/UI_Page.ts:90` 집계표 갈래 = 빈 `div.b08-quantity__tabs`(aria-hidden) + 몸통 div → `renderStructureSummary(몸통)`(그 함수의 `host.replaceWith` 다시 그림 길 그대로) · 높이 = 그 줄에 보이지 않는 sm 단추 하나(`visibility: hidden` · `tabindex -1`) — 토큰이 바뀌어도 자재 줄과 같은 높이 · CSS 한 규칙(`B08/UI_Page.css`). +- 재사용 — `.b08-quantity__tabs` · `createButton` sm. +- 시험 — `test_122_b08_options.py:138-160`(탭 id 판정 그대로) + 새 판정(집계표 갈래에 빈 보조 탭 줄). +- 위험 — 수리 탭은 보조 탭 줄이 md [저장]과 한 줄(`B08/UI_Hydro.css:5-11` · 32px + 아래 16) → 수리 탭은 여전히 높이가 다름(요구 밖 · 참고). +- 크기 — TS 8줄 · CSS 3줄. +- 추천 — 위 그대로. + +## R15. 「손입력」 → 「수기 입력」 전역 — 전수 표 + +범위 = git 추적 소스(ts · py · css · json · html · 시험 · 지식DB · old_code · docs 뺌) 362 줄 중 「손」 → 뜻 가름. 147-4 로 M02 화면 글(`M02/Labor_Text.ts:73 · 74 · 137 · 138` 「수기」 · 「수기 입력」)은 이미 바뀜. + +### 화면 글 — 바꿈(11 자리 · 9 파일) + +| 파일:줄 | 지금 글(어디 보임) | 바꿀 글 | 시험 | +|---|---|---|---| +| `A00_Common/design/design_structure_ford_calc.ts:30` | 「설계유량 없음 — 손 입력」(세월교 경사각도 칸 안내) | 「… 수기 입력」 | `test_52_4_structure_spec_ford.py:103` | +| `B08/UI_Material.ts:191` | 「2공구 엑셀 손값과 다름 — …」(자재 표 아래 알림) | 「2공구 엑셀 수기값과 다름」 | `test_160_4_b08_concrete_columns.py:44` | +| `B09/Calc_Bill.ts:111` + `B09/Calc_Bill.py:122`(거울 짝) | 「손 줄 — 연결 없음(우클릭 [연결])」(설계내역서 까닭) | 「수기 줄 — …」 둘 함께 | 거울 시험 `test_166_2_b09_bill_hand.py` | +| `B09/Labor_Source.py:263` | 「수량 없음 — 면적산출 알약 칸 · 손 수량을 넣음」(대가 줄 까닭) | 「… 수기 수량을 넣음」 | 없음(새 판정 권함) | +| `B09/Sangeun.py:486` | 「손 줄 {명칭}」(산근 「쓰는 곳」) | 「수기 줄 {명칭}」 | `test_166_2_b09_bill_hand.py:180` | +| `B09/UI_Tabs_Total.ts:194` | 열 이름 「손입력」(총괄설계내역서) | 「수기 입력」 | `test_145_4`(열 키 `hand` 만 봄 · 통과) | +| `B09/UI_Tabs_Total.ts:203` | 안내 「손입력 = 안전관리비 기초액 …」 | 「수기 입력 = …」 | 같음 | +| `B09/UI_Tabs_Base.ts:160` | 안내 「… 견적 단가 · 면 = 손입력 …」(자재단가대비표) | 「… = 수기 입력」 | 없음 | +| `ui/locale_b2.ts:976 · 978` | `B09_Estimation_Src_Manual` · `_Quantities` 「수량 원천: 손입력 …」 | 「수기 입력」 | 없음 · 쓰는 곳 없는 옛 키(추정) | + +### 저장 키 · 값 · 코드 이름 — 안 바꿈 + +- 수량 키 `{손: 수}` · 수량출처 값 `"손"` — `M02_MasterTemplete/M02_Labor_Doc.py:84 · 86(오류 글에 키 이름) · 87 · 367-368` · `M02_Labor_Ref.py:210 · 441` · `B08/Router_Material.py:95` · `B09/Labor_Source.py:220` · `M02/Labor_Api.ts:121` · `M02/Labor_Calc.ts:14 · 16 · 105 · 106` · `M02/Labor_Detail.ts:325 · 332 · 489 · 503` · `M02/Labor_QtyModal.ts:22 · 117` · `M02/Labor_Rows.ts:96 · 118`(화면엔 로케일 「수기」로 바꿔 보임) · `resources/master_template/labor/item3_2.json:74 · 493` · `item3_3.json:20 · 121` · `precombo/SC-000001.json:11 · 19`. +- 표 열 · 줄 깃 `손: true` — `M02_MasterTemplete/M02_Table_Fill.py:496 · 533 · 550 · 558 · 608` · `ui/sheet/ui_template_sheet_types.ts:43 · 54` · `_sheet_ops.ts:96` · `_sheet_render.ts:100`(`is-hand`). +- 영문 이름 `hand` · `is-hand` · `hand:` 줄 키 · `money("hand")` — 코드 이름 · 저장 키. + +### 주석 · docstring — 안 바꿈(목록만) + +`A00_Common/design/design_structure_box.ts:111` · `_ford_calc.ts:11` · `_ford_pavement.ts:5` · `_form.ts:7 · 60 · 155` · `_pipe_calc.ts:6` · `_road.ts:6` · `_spec.ts:7` · `B05_Profile/B05_Profile_UI_Structures_Balloon.ts:5` · `_Structures_Marks.ts:118` · `B08/Hydro_Defaults.py:105` · `B08/Material_Calc.py:21` · `B08/Router_Material.py:59` · `B08/UI_Hydro.ts:106` · `B08/UI_Material.ts:12 · 166` · `B09/Calc_Base.py:13 · 34` · `B09/Calc_Bill.py:16 · 145 · 157` · `B09/Calc_Bill.ts:12 · 134 · 146` · `B09/Calc_Total.py:22` · `B09/Labor_Source.py:7 · 14 · 209` · `B09/Router.py:69 · 77 · 85` · `B09/Sangeun.py:23 · 24 · 478 · 491 · 497 · 526 · 556` · `B09/Store.py:9 · 38 · 96 · 112` · `B09/UI_Page.css:114` · `B09/UI_Shell.ts:111 · 141 · 174` · `B09/UI_Tabs_Base.ts:8 · 177` · `B09/UI_Tabs_Bill.ts:7` · `B09/UI_Tabs_Bill_Edit.ts:3 · 7 · 47 · 50 · 63 · 91 · 153 · 185` · `B09/UI_Tabs_Total.ts:8 · 30 · 45` · `common_util/common_util_culvert_sets.ts:94` · `M02/AreaLink.ts:6` · `M02/Labor.css:459 · 483` · `M02/Labor_Api.ts:120` · `M02/Labor_Calc.ts:6 · 15 · 78 · 119` · `M02/Labor_Detail.ts:14 · 313 · 502` · `M02/Labor_QtyModal.ts:20 · 35 · 119` · `M02/Router_Layers.py:341` · `M02_Labor_Doc.py:8 · 9 · 64 · 366` · `M02_Labor_Ref.py:8 · 9 · 10 · 201` · `M02_Table_Fill.py:12 · 13 · 109 · 529 · 547 · 567 · 590 · 593` · `M02_Template_Migrate.py:6 · 69` · `ui/sheet/ui_template_sheet.css:3` · `_sheet.ts:15` · `_sheet_ops.ts:92` · `_sheet_render.ts:96` · `_sheet_types.ts:51`. + +### 뜻이 다른 「손」 — 안 바꿈 + +손료 · 공구손료(품셈 비목) · 손율(`ui/locale_b2.ts:765`) · 손잡이 · 손대다 · 손을 떼다 · 손수 · 손질 · 손보다 · 손 모양 커서 · 오른손 규칙 · 결손 · 맨손 · 손자 프로세스 — 약 210 줄. + +### 판단 자리 + +- 「손으로」(동사구 · 명칭 아님) 화면 글 셋 — `ui/locale_b2.ts:47` 「손으로 넣거나 옮기거나 지운 배관을 모두 버리고 …」(배관 자동 배치 되돌림 확인) · `A00_Common/spreadsheet/spreadsheet_shortcuts.ts:343 · 346` 「손으로 다시 계산」(F9 단축키 표). +- ⬜ R15-a — 「손으로」 셋도 바꿈(「직접」)? 추천 = 그대로(명칭 아님). +- 「손 줄」 → 「수기 줄」(M02 「수기 5 ㎥」 짧은 꼴 선례) · 「수기 입력 줄」보다 짧음. + +- 위험 — `B09/Calc_Bill` 거울 짝 한쪽만 바꾸면 거울 시험 깨짐 · `B08/UI_Material.ts:191` 은 R14(실무문서 값) 조사와 겹침 · `ui/locale_b2.ts` 이미 1,049 줄(700 넘음 · 기존 · 글 두 줄만). +- 크기 — 글만 11 자리 + 시험 글 3 자리. + +## R16. 묶음 탭 컨테이너 보기 = 공용 양식 + +### 지금 157-2 자리 + +- `B09/UI_Tabs_Sangeun_Cards.ts`(217 줄) — 보기 둘 · 단추(:187-217 `renderSgPanel`) · 기억(`localStorage` `b09-sg-view` · 기본 표 · :37-51) · 묶음(:62-74 `sgCards` = 줄 키 `호표키|…` 앞머리) · 그리기(:129-181 `cardsView` · `createCard` · 줄 = 7칸 grid) · 숫자 꼴(:90-102 열 소수 자리) · 누름 이동 · 이동해 온 줄 강조(:169-179). +- 잇기 — `B09/UI_Shell.ts:241-247` `tab === "sg"` 만 · CSS `B09/UI_Page.css:34-112`. + +### 지금 CSS 셈(추정 · 실측 아님) + +| 자리 | 글자 | 줄 높이 · 간격 | 출처 | +|---|---|---|---| +| 카드 머리(산근 n호표 · 명칭 · 합계) | 16px 굵게(상속) | 아래 8px | `B09/UI_Page.css:49-56` | +| 열 이름 줄 · 첫 머리 줄 | 12px 회색 | — | `:78-82` | +| 몸 줄 | 16px(상속) · line-height 1.5 | 줄 위아래 4px + **공용 카드 몸 gap 16px**(`ui/elements_styles.ts:167`) → 줄 피치 ≈ 48px | `:71-76` | +| 제목 줄(is-title) | 16px 굵게 | 위 4px 더 | `:84-87` | +| 카드 안 여백 | — | 24px(`--card-padding` · `ui/theme.css:185`) | `ui/elements_styles.ts:154-160` | +| 카드 사이 | — | 24px | `:43-47` | +| 줄 칸 폭 | 7em · 1fr · 7.5em × 4 · 10em | 고정 ≈ 752px + 글 → 좁은 카드 불가(가로 여러 개 막힘) | `:73` | +| 비교: 표 | 14px · line-height 1.3 | 줄 28px | `ui/data_table.css:28-34` · `ui/data_table.ts:239` | + +→ 「뒤죽박죽」 = 16 · 12 · 16 굵게 섞임 · 「넓음」 = 카드 몸 gap 16px 이 줄마다 끼어 줄 피치가 표의 1.7 배. + +### 공용으로 뗄 이름 + +- `ui_template/ui_template_group_cards.ts`(+ `.css`) — `createGroupView({ rows, columns, group, link, tip, focus, goto, makeTable, redraw, viewKey })` · 내보냄 = `groupOf`(줄 키 `|` 앞머리) · `readView` · `writeView` · 그리기. +- 탭 짜기 곁값 — `TabTable.group?: GroupSpec`(`B09/UI_Tabs.ts:75-92`) = `{ label: 열 키, detail: 열 키[], amount: 열 키, parts?: 열 키[] }` · 머리 = 묶음 첫 줄 · 계 = 끝 줄(셋 다 첫 줄 머리 · 끝 줄 합계 꼴). +- Shell — `:242` `tab === "sg"` → `spec.group` 있으면 공용 보기(탭 이름 하나 안 박음). +- `B09/UI_Tabs_Sangeun_Cards.ts` 지움(공용으로 옮김) · `B09/UI_Page.css:42-112` 카드 규칙 → 공용 CSS. +- 기억 — `A00_Common/b_page_state.ts` pref 등록 둘(`group-view` `{탭: 보기}` · `group-columns`) · `readStateRaw` · `writeStateRaw`(B06 「한 줄 카드 수」 138-3 `cross-columns` 꼴 · `B06_Section/B06_Section_UI_Section_View.ts:109 · 127-143`) · 옛 `b09-sg-view` 는 버림(보는 사람 취향만). + +### 적용 대상 탭 · 묶음 키 + +| 탭 | 짜기 | 묶음 키 | 머리(첫 줄) | 계(끝 줄) | 카드 줄 | +|---|---|---|---|---|---| +| 일위대가표 `dg`(우선) | `B09/UI_Tabs_Labor.ts:78-162` | `b.id`(`id` · `id|cite` · `id|n` · `id|합계`) | 「제 n 호표 명칭」 · 단위 · 꼴 | `sum` + 「빈 줄 n」 | 명칭 · 규격 · 수량 단위 · 합계 금액 · 비고 · 인용 줄 = 작은 글 | +| 중기사용료 `machine_blocks` | `B09/UI_Tabs_Base.ts:263-319` | `b.key`(`key|줄 이름` · `key|합계`) | 「제 n 호표 명칭」 · 규격 · 단위 | `sum` | 손료 · 운전사 · 연료 · 잡품 = 명칭 · 수량 단위 · 금액 | +| 단가산출근거 `sg`(옮김) | `B09/UI_Tabs_Sangeun.ts:76-168` | `b.key`(`key|머리n` · `key|n|part` · `key|총계`) | 산근 n호표 · 명칭 · 단위 · 머리 줄(작은 글) | 총계 `sum` | 공종 · 산출내역(작은 글 · 줄바꿈) · 금액 · 까닭 | + +- 대상 아님 — 목록표 둘 · 기초 · 중기목록 · 재료비 · 노무비 · 경비목록 · 자재단가대비표 · 집계표 넷(`B09/UI_Tabs_Summary.ts` = 자원 한 줄씩 · 묶음 없음) · 총괄 · 원가(한 줄씩) · 설계내역서(공종 묶음이나 수량 칸 고침 · 우클릭 메뉴 · 표 유지) · B08 전부(총괄 · 토공집계 = 「구분」 칸 병합뿐 · 자재수량집계표 = 두 줄 짝 행렬 · 모두 고칠 칸 있음 · 머리 · 계 블록 없음). + +### 안 양식(추천) + +- 글자 한 벌 = 14px(`--text-body-sm`) · line-height 1.35 · 작은 글(규격 · 산출내역 · 머리 줄)만 12px · 굵게 = 머리 · 계만 · 금액 오른쪽 tabular-nums. +- 간격 = 카드 몸 gap 0(공용 `createCard` 대신 `
` 상자 · 테두리 · 반경 · 바탕은 카드 토큰 그대로) · 줄 위아래 2px · 카드 안 여백 8px 12px → 줄 피치 ≈ 23px(지금의 절반 · 추정). +- 줄 칸 = `명칭 1fr | 수량 단위 auto | 금액 9ch` 세 칸 + 작은 글 둘째 줄 · 노 · 재 · 경 = 계 줄에만(줄 풍선에 셋). +- 가로 여러 개 = `grid-template-columns: repeat(N, minmax(0, 1fr))` · 열 수 칸 = 공용 숫자 칸(`createInputField` compact · 1~4 · 기본 2 · B06 138-3 꼴) · 좁으면 1열(container query). +- 요약 보기 = 카드마다 `
` — 접힘 = 머리 한 줄(호표 · 명칭 · 단위 · 합계 · 「빈 줄 n」 · 까닭 배지) · 펼침 = 줄 전부 · 묶음 > 12 이면 처음 모두 접힘 · 머리 줄 [모두 펼침 · 모두 접기] · 이동해 온 줄 = 그 카드 펼침 + 스크롤 + 강조. +- 기본 보기 = 컨테이너(셋 탭) · 표 단추 유지(`표로 보기` ↔ `호표별 보기`). + +- 재사용 — `sgCards` 묶음 · `formats` 숫자 꼴 · `formatCell` · 누름 · 강조 · `rowIndex` · `TabTable.link · tip · rowClass` · 기억 실패 때 기본값 꼴(`readSgView` 시험 그대로 옮김) · 네이티브 `
` · `createInputField`. +- 시험 — `test_157_2_b09_sangeun_views.py`(가져오는 파일 · 기본값 표 → 컨테이너 · `createCard(` 판정 손봄) + 새 시험(공용 묶음 = dg · machine_blocks · sg 키 · 머리 · 계 · 같은 줄 객체 · 접힘 기준 12 · 열 수 자름 1~4 · 기억 실패 = 컨테이너) · `test_155_b09_tabs` · `test_157_4` · `test_166_6` 통과 확인. +- 위험 — 다른 탭에서 넘어온 이동(내역 → 대가 블록 · 목록표 → 블록)이 컨테이너에 떨어짐 → 접힌 카드 열기 필요 · `ui_template/` 공용 폴더(OWNERS 5 · 다른 창과 겹치면 sync) · 산출내역 긴 글(테스트 200 자)은 둘째 줄 줄바꿈. +- 크기 — 새 TS ≈ 230 줄 · 새 CSS ≈ 100 줄 · 탭 셋 각 +8 · Shell +3 · `UI_Tabs.ts` +10 · `UI_Page.css` −70 · `Sangeun_Cards.ts` −217. +- ⬜ R16-a — 카드 줄 금액 = 합계만(노 · 재 · 경은 계 줄 · 풍선)(가) · 줄마다 노 · 재 · 경 넷(나) — 추천 (가)(넷이면 좁은 카드에서 다시 넘침 · 자세히는 표 보기). + +## 고칠 파일 목록 + +| 파일 | 지금 줄 | 고친 뒤(추정) | 700 위험 | 요구 · 겹침 | +|---|---|---|---|---| +| `B08_Quantity/B08_Quantity_UI_Drawing.css` | 125 | 140 | 없음 | R10 · R12 겹침 | +| `B08_Quantity/B08_Quantity_UI_Drawing.ts` | 240 | 255 | 없음 | R11 | +| `ui_template/ui_template_item_picker_edit.ts` | 216 | 218 | 없음 | R11 | +| `B08_Quantity/B08_Quantity_UI_Link.ts` | 215 | 223 | 없음 | R12 | +| `B08_Quantity/B08_Quantity_UI_Page.ts` | 143 | 151 | 없음 | R13 | +| `B08_Quantity/B08_Quantity_UI_Page.css` | 57 | 60 | 없음 | R13 | +| `A00_Common/design/design_structure_ford_calc.ts` | 31 | 31 | 없음 | R15 | +| `B08_Quantity/B08_Quantity_UI_Material.ts` | 420 | 420 | 없음 | R15 · R14 겹침 | +| `B09_Estimation/B09_Estimation_Calc_Bill.ts` · `.py` | 299 · 310 | 같음 | 없음 | R15(거울 짝) | +| `B09_Estimation/B09_Estimation_Labor_Source.py` | 340 | 같음 | 없음 | R15 | +| `B09_Estimation/B09_Estimation_Sangeun.py` | 563 | 같음 | 없음(가까움) | R15 | +| `B09_Estimation/B09_Estimation_UI_Tabs_Total.ts` | 285 | 같음 | 없음 | R15 | +| `B09_Estimation/B09_Estimation_UI_Tabs_Base.ts` | 319 | 328 | 없음 | R15 · R16 겹침 | +| `ui_template/ui_template_locale_b2.ts` | 1,049 | 같음 | 이미 넘음(기존) | R15 | +| `ui_template/ui_template_group_cards.ts` · `.css` | 새 | 230 · 100 | 없음 | R16 | +| `B09_Estimation/B09_Estimation_UI_Tabs.ts` | 168 | 178 | 없음 | R16 | +| `B09_Estimation/B09_Estimation_UI_Tabs_Labor.ts` | 162 | 170 | 없음 | R16 | +| `B09_Estimation/B09_Estimation_UI_Tabs_Sangeun.ts` | 168 | 176 | 없음 | R16 | +| `B09_Estimation/B09_Estimation_UI_Tabs_Sangeun_Cards.ts` | 217 | 지움 | — | R16 | +| `B09_Estimation/B09_Estimation_UI_Shell.ts` | 332 | 335 | 없음 | R16 | +| `B09_Estimation/B09_Estimation_UI_Page.css` | 117 | 47 | 없음 | R16 | +| `A00_Common/b_page_state.ts` | 526 | 528 | 없음 | R16 | +| 시험 — `test_156_1` · `test_163` · `test_122` · `test_52_4` · `test_160_4` · `test_166_2` · `test_157_2` + 새 시험 | — | — | — | R10 · R11 · R12 · R13 · R15 · R16 | diff --git a/docs/raw/요구_1010/조사_S_실무문서값.md b/docs/raw/요구_1010/조사_S_실무문서값.md new file mode 100644 index 000000000..1d46f976a --- /dev/null +++ b/docs/raw/요구_1010/조사_S_실무문서값.md @@ -0,0 +1,51 @@ +# 조사 S — B08 · B09 실무문서 값 사용 여부 + +원천 줄임: **2공구** = `2024년 간선임도(기번3-울진.대흥)(2공구)/수량산출/4.2 수량산출(2공구).xlsx` · **기번3** = `…(공통)/1. 설계원본/01 내역자료/2024년 간선임도사업(기번3).xlsx` · **거창** = `01.산불거창/01.내역서/00.25년_산불_거창(…)내역+수량.xlsx`. +성격: A 견본 상수로 계산에 들어감 · B 기본값(사용자 고침) · C 안내 · 비교 글만 · D 시험에서만 · 「꼴」 = 숫자 아닌 표 틀(줄 이름 · 차례 · 끝수 자리). +코드 자리의 TS 짝 = 같은 상수 거울(파이썬 줄 뒤 괄호). + +| 페이지 | 탭 | 표 · 칸(셀 형태) | 쓰는 값 | 원천(실무문서 파일 · 시트 · 칸) | 코드 자리(파일:줄) | 성격 | +|---|---|---|---|---|---|---| +| B08 | 자재 › 자재수량집계표 | 열 머리 3단(자재 · 규격 · 단위) 23 열 + 줄마다 단위수량 입력칸 | 레미콘 25-24-15 … 떼 ㎡ 이름 · 규격 · 단위 그대로 · 단위수량 값은 안 가져옴(빈칸 시작) · 사용자 값 있을 때만 열 보임(콘크리트(기계) · 모르터 1:3 은 늘) | 2공구 · 자재수량집계표 · F3:AD5 | B08_Quantity_Material_Calc.py:40 (.ts:92) · 늘 보임 :88 | A 꼴(이름 · 규격 · 단위 = 사본 자재 맞춤 기준) | +| B08 | 자재 › 콘크리트소요자재집계표 | 줄 5(Φ25 · Φ40 · Φ40 무근 · 1:2 · 1:3) × ㎥당 시멘트 · 모래 · 자갈 칸(고칠 수 있음) | 시멘트 346 · 323 · 680 · 510 kg = 엑셀과 같은 수(근거는 품셈 QF000353 · QC001347 로 적힘) · 모래 · 자갈 = 품셈 kg→㎥ 환산(엑셀 0.51 · 0.48 등과 다름) · 무근 312 kg 안 씀(빈칸) | 2공구 · 콘크리트소요자재집계표 · A5:I9 | B08_Quantity_Material_Calc.py:73 (.ts:119) | B | +| B08 | 자재 › 콘크리트소요 · 총괄 표 아래 | 알림 한 줄 「2공구 엑셀 손값과 다름 — …」 | 엑셀 배합(346 · 0.51 · 0.59 / 323 · 0.48 · 0.65 / 312 · 0.46 · 0.7 / 680 · 0.98 / 510 · 1.1) · 엑셀 할증(모래 6 · 자갈 4 · 시멘트 2 · 혼합석 2) | 2공구 · 콘크리트소요 D5:H9 · 총괄 F4:F7 · F18 | B08_Quantity_UI_Material.ts:167~191 | C(비교 글만 · 계산에 안 씀) | +| B08 | 자재 › 총괄자재수량집계표 | 줄(구분 · 규격 · 단위) + 할증 % 칸(고칠 수 있음) + 합계 끝수 | 줄 차례 · 이름(모래 … 깬돌 L3=45cm · 커플링밴드) · 할증 기본 막자갈 4 · 레미콘 1 · 2 · 2 · 철근 3 · 떼 10 · 깬돌 · 와이어메쉬 빈칸 = 엑셀 F 열과 같음(근거는 품셈 1-3-1 로 적힘) · 혼합석 4(엑셀 2) · 모래 · 자갈 · 시멘트 = 좌측 패널 12 · 5 · 3(품셈 · 엑셀 6 · 4 · 2 아님) | 2공구 · 총괄자재수량집계표 · A4:G27 | B08_Quantity_Material_Calc.py:104 (.ts:139) · 패널 :103 | B(할증) · A 꼴(줄 틀) | +| B08 | 자재 › 총괄 합계 | 끝수 규칙 | 레미콘 ROUND 2 · 철근 · 와이어메쉬 ROUND 3 · 시멘트 ROUND 0 · 그 밖 ROUNDUP 0 · kg→ton ÷1000 · 시멘트 ÷40 | 2공구 · 총괄 G 열 식 | B08_Quantity_Material_Calc.py:96 · :104~124 | A 꼴(규칙) | +| B08 | 자재 › 총괄 · 토공 › 토공집계표 | 「채집석 공제」 줄 · 잔토처리 칸 | 돌(채집) 둘 · 고임돌 · 막자갈 계 합을 잔토처리에서 뺌 | 2공구 · 자재수량집계표 Y68 · 토적집계표 H32 | B08_Quantity_Material_Calc.py:90 · B08_Quantity_Engine_Earthwork_Summary.py:128~129 | A 꼴(식) | +| B08 | 토공 › 토공집계표 | 줄 26(공종 · 종류 · 규격 · 단위 · 값) | 줄 이름 · 규격 글(기계(굴삭기) · 굴삭기 + 브레카 · 19 TON B/D · BH+DT+BH) · 값은 프로젝트 토적 | 거창 · 토공집계표 · C5:G37 | B08_Quantity_Engine_Earthwork_Summary.py:94~137 | A 꼴(B09 토공 짝 기준) | +| B08 | 토공 › 토공집계표 | 성토면다짐 · 초류종자살포 · 지장목제거 값 칸 | 거창 계수 0.8 · 0.5 · 0.8 — 값 빈칸 + 「비율 미정」 · 계수는 주석에만 | 거창 · 토공집계표 해당 줄 식 | B08_Quantity_Engine_Earthwork_Summary.py:109 · :131~135 | C(주석 · 안내만) | +| B08 | 토공 › 토적표 | 열 32칸 머리 | 절토 토사 · 암 · 측구 · 보정량 · 성토 · 유용토 · 면고르기 · 지장목 · 제근 · 노면정리 열 차례 | 거창 · 토적표 · 오솔길 1.BOM 36열 · 사용자 견본 | B08_Quantity_Engine_Earthwork.py:8 · B08_Quantity_UI_Earthwork.ts:126 | C 꼴(열 차례) | +| B08 | 구조물 집계표 | 열 머리 4단(구조물 · 형식 · 규격 · 단위) | 흙막이 · 돌붙임 · 관 공 › 관매설 · 커플링 · 관보호공 · 물넘이 포장 H= 꼴 · 머리 글은 M02 정의 이름 | 2공구 · 구조물집계표 · C1:AR4 | B08_Quantity_Router_Summary.py:1~24 · :398 | C 꼴 | +| B08 | 구조물 집계표 · 좌측 패널 | 커플링 열 · 「배관 1본 길이」 칸 | B08 은 프로젝트 층 값만(빈칸 시작) · M02 시스템 층 변수 `파형강관_1본_m` 8(출처 표기 없음 — 실무문서 값인지 확인 안 됨) | — | B08_Quantity_Router_Summary.py:121 · resources/master_template/table/구조물집계표.json:16 | B | +| B08 | 홍수량 › 관 장 | 할증 드롭다운(× 2.0 · × 1.5 · × 1.2) | 1.5 = 울진 2공구 견본 · 기본은 2.0(별표2) | 2공구 · 71+13 · 78+7 · 105+12 시트 | B08_Quantity_Hydro_Defaults.py:24 | B(선택지 하나 · 기본 아님) | +| B08 | 홍수량 › 박스 장 | 수심비 칸 · 단면 그림 | 수심비 0.8 = 빈칸(주석만) · 그림 물높이만 0.8 | 울진 산출서 | B08_Quantity_Hydro_Defaults.py:59~62 · B08_Quantity_UI_Hydro_Sheet.ts:195 | C | +| B08 | 자재 › 총괄 · 자재수량 | 알림 「2공구 열 맞춤 없음 n종」 · 칸 글 「2공구 맞춤 없음」 | 글만 | — | B08_Quantity_Router_Material.py:217 · B08_Quantity_UI_Material.ts:290 | C | +| B09 | 탭 줄 | 탭 19개 차례 | 공사원가계산서 … 중기시간금액집계표 | 기번3 · 시트 차례 | B09_Estimation_UI_Tabs.ts:35 | C 꼴 | +| B09 | 설계내역서 | 공종 제목 줄 14(1 토공사 · 1.1 준비공 … 4 자재대 · 관급자재대) | 공종 나무 고정 · 금액 합 묶음 기준 | 기번3 · 설계내역서 공종 줄(1공구 꼴) | B09_Estimation_Calc_Bill.py:33 (.ts:28) | A 꼴 | +| B09 | 설계내역서 › 토공사 | 항목 줄 17(명칭 · 단위) | 규준틀설치 종단 · 횡단 · 제근 · 절토(토사) … 노면정리 이름 · 단위 · 수량은 B08 · 단가 빈칸 | 기번3 · 설계내역서 토공사 줄 | B09_Estimation_Bill_Items.py:25 | A 꼴(B08 토공집계표 짝) | +| B09 | 설계내역서 › 운반공 | 항목 줄 6(명칭 · 단위) | 중기운반 · 기계운반 · 모래 · 자갈 · 시멘트 · 철근운반 · 수량 = B08 총괄 · 거리 · 단가 빈칸 | 기번3 · 설계내역서 운반공 줄 | B09_Estimation_Bill_Items.py:50 | A 꼴 | +| B09 | 총괄설계내역서 · 공사원가계산서 | 비목 줄 18 + 율 칸(고칠 수 있음) | 줄 차례 · 산식 글 = 엑셀 49~67 · 요율 값 = M01 2026 표 자동(엑셀 2024 요율 안 씀) · 현행 비목 5 = 줄만(빈칸) | 기번3 · 총괄설계내역서 49~67 | B09_Estimation_Calc_Total.py:33 · :46 · :54 (.ts:19 · :32 · :40) | A 꼴(줄) · B(율) | +| B09 | 총괄설계내역서 | 산업안전보건관리비 줄 | A = 관급 ÷ 1.1 포함 · B = 관급 빼고 × 1.2 · 작은 쪽 | 기번3 · 총괄 산업안전 줄 식(고시 식 겸) | B09_Estimation_Calc_Total.py:59~60 (.ts:45~46) | A | +| B09 | 전 탭 | 끝수 규칙 | 줄 ROUNDDOWN 1 · 비목 ROUNDDOWN 0 · 집계 ROUND 2 · 금액 ROUND 0 · 관급 ROUNDUP −3 · 작업량 Q ROUND 2 | 기번3 · 각 시트 식 자리 | B09_Estimation_Calc_Base.py:7~22 · Calc_Labor.py:14 · Sangeun.py:16 · Summary.py:12 · Calc_Total.py:18 | A 꼴(규칙) | +| B09 | 자재단가대비표 | 출처 칸 차례 · 최저 고름 | 조달 · 물가정보 · 물가자료 차례(같은 값이면 앞 칸) · 최저 = MIN · 견적 = M/N 열 | 기번3 · 자재단가대비표 O · P · M · N 열 | B09_Estimation_Calc_Base.py:35 (.ts:31) | A 꼴 | +| B09 | 자재단가대비표 | 관급 · 별도 표시 칸 | 파형강관 줄 = 관급 기본 | 기번3 · 설계내역서 관급자재대 246~252 꼴 | B09_Estimation_Prices.py:231~232 | B | +| B09 | 재료비 · 노무비 · 경비목록표 | 단가 줄 | 엑셀 단가 목록 안 깖 — 줄 = 수요 따라 M01 단가 | (엑셀 목록 안 씀) | B09_Estimation_Prices.py:6 | 해당 없음 | +| B09 | 공사원가계산서 · 총괄 | 손입력 칸 6(기초액 · 이윤 보정 · 부가세 조정 · 간접재료비 · 작업설 · 조달수수료율) | 칸 자리만 · 빈칸 시작 | 기번3 · 총괄 · 원가계산서 손입력 칸 | B09_Estimation_Store.py:39 | B 꼴 | +| B09 | 단가산출근거 · 집계표 | 겹 호표 깊이 한도 | 산근 깊이 4 · 역전개 한도 8(엑셀 최대 4 참고) | 기번3 · 대가 → 대가 → 산근 → 중기 | B09_Estimation_Sangeun.py:57 · Summary.py:24~25 | A | +| B09 | 단가산출근거 | 산출내역 한 칸 글 · 비고 「대가n」 · 「산근 n호표」 | 「보통인부 : 단가 * 수량 = 금액」 글 꼴 · 중기 노 · 재 · 경 세 줄 | 기번3 · 단가산출근거 · 일위대가목록표 | B09_Estimation_Sangeun_Text.py:1~17 · Calc_Labor.py:168 · UI_Tabs_Sangeun.ts:73 · :109 | C 꼴 | +| B09 | 총괄설계내역서 | 요율 안내 글 | 「2024 엑셀 요율과 연도 차로 다를 수 있음」 | — | B09_Estimation_UI_Tabs_Total.ts:202 | C | +| M02 | 일위대가 조합(실무문서) | 마스터 조합 37(담은 로직 목록) | 실무 호표 구성(봉화 B00005 · 울진대흥 B012 등) · 수량 없음 · 시스템 관리자만 → 사본으로 B08 단위수량 · B09 대가로 흐름 | 봉화 · 울진대흥 내역 호표 | resources/master_data/일위대가조합.json | B | +| M02 | 구조물 정의 › BOX암거 | 헌치 · 버림 두께 기본 | 0.2 · 0.1 m(교재 예제 근거 · 울진 기번3 구조도와 대조) | 기번3 · 5. 구조도(기번3).xlsx 2×2 | resources/master_template/구조물정의.json:373 · :383 | B | +| M02 | 구조물 정의 › 물넘이포장 | 포장 두께 칸 | 빈칸 · 안내에 「울진 20㎝」 | 울진 원단위 | resources/master_template/구조물정의.json:524 | C | +| M01 | 단가산출 로직 편집 | 재료 고르기 후보 목록 | 자재지역 「울진」 고정(후보 · 첫 후보 고름) | — | M01_MasterData/M01_MasterData_UI_Logic_Pick.ts:249 | A(M01 화면만) | +| 시험 | B08 | 픽스처 | 2공구 구조물집계표 계 · 단위수량 · 엑셀 배합 · 할증 6 · 4 · 2 · Y68 · 토적집계표 F32 · 사토운반본선 K19 | 2공구 | resources/tester/test_121 · 124 · 131 · 160_4 · 160_5 | D | +| 시험 | B08 홍수량 | 픽스처 | 울진 2공구 71+13(A 0.132 · L 480 · H 185 · R24 305.9 · D 1,200) · 울진 1공구 박스 B 3.0 · H 1.5 | 2공구 · 1공구 | resources/tester/test_62_2_b08_hydro_engine.py · test_73_11_b08_hydro_box_ford.py | D | +| 시험 | B09 | 픽스처 | 기번3 단가 · 대가 · 산근 6 · 7호표 · 내역 · 총괄 F48 · M49~M64(2024 요율) · N55 · 집계표 | 기번3 | resources/tester/test_144 · 145_1~5 · 155_5 · 166_1 | D | + +## 요약 다섯 줄 + +1. 엑셀 숫자를 그대로 계산 값으로 박은 곳 없음 — 단위수량 · 단가 · 요율 · 노임은 모두 빈칸 시작이거나 M01 · 품셈. +2. 엑셀과 같은 숫자가 기본값으로 든 곳 = B08 총괄 할증(막자갈 4 · 레미콘 1 · 2 · 철근 3 · 떼 10)과 콘크리트 시멘트 kg(346 · 323 · 680 · 510) — 근거는 품셈으로 적혔고 사용자가 고침(B). +3. 가장 많이 가져온 것 = 꼴 — B08 자재 23 열 · 총괄 줄 · 토공집계표 줄, B09 공종 나무 · 토공 · 운반 줄 · 총괄 비목 줄 · 탭 차례 · 끝수 규칙(A 꼴). +4. 엑셀 손값은 B08 「2공구 엑셀 손값과 다름」 알림 · 거창 계수 「비율 미정」 · 수심비 0.8 주석 · 요율 안내에만 남음(C) · 홍수량 할증 × 1.5 는 선택지 하나(B). +5. 엑셀 값 자체는 시험 픽스처(D)에 몰림 · 확인 거리 = M02 `파형강관_1본_m` 8 출처 · M01 로직 후보 지역 「울진」 고정.