chore(plan): 10-10 둘째 묶음 요구 원문 · 조사 T · U · W · X · Y · Z · ZA(175~183장)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LLCk2y5xE8YGVgjbTntWsY
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
# 사용자 요구 10-10 둘째 묶음 (원문 · 번호만 붙임)
|
||||
|
||||
지시: 신규 계획서 작업 및 코드 작업.
|
||||
|
||||
## M02 일위대가 사전조합
|
||||
1. 구조물조합의 일위대가와 동일하게 자재목록도 있어야함. 공통양식이니 코드 재활용
|
||||
|
||||
## B05 3D
|
||||
2. 성토의 스무딩처리가 깨지는 경우가 더 심해짐
|
||||
3. 흑백지형을 기본값을 false로
|
||||
4. 등고선도 기본값을 false로
|
||||
5. 예전로직으로 3D에 측점의 노란색 선 끝단에 주황색 구슬을 선택하여 측구의 방향을 선택하는 기능이 있었음. 3D에서 구슬 삭제
|
||||
|
||||
## B05/06
|
||||
6. 좌측패널의 구조물 조합 연결여부 색상선택은 반영은 잘되었고 연결이 안된 항목은 경고성으로 노란색 계열로 반영
|
||||
7. 오류 확인및 원인 파악(흙막이휴 횡단도 형상 반영 문제)
|
||||
8. 동물이동형도 체크박스에서 드롭다운 메뉴로 변경 (항목값. 유 / 무)
|
||||
9. 구조물 리스트를 선택하는 기능 노면공 선택을 누르면 구조물선택은 되나 박스형상을 잡도록 변경하고 횡단도 컨테이너 선택을 안해도됨.
|
||||
10. 횡단도 컨테이너 선택시 종단에 측점 세로선 하이라이트 연동이 안됨. 하이라이트 기능 제대로 확인할 것.
|
||||
11. 사면안정군의 종류들이 기준측점 상단의 범위를 알려주는데 필요없음
|
||||
12. 소단은 옵션값 중 높이는 필요없음. 형상필요. 성토사면에 도로에서 높이 1m를 기준으로 성토사면에 수평선을 긋고 하단부에 성토를 이으면 됨. 이때 소단의 Y값을 위치를 제어할수 있어야하면 도로보다 높을 수 없음
|
||||
13. 사면안정군의 옹벽과 흙막이의 경우 단이 존재할수 있음. 기존 유출 컨테이너를 보면 양식 있음. 재활용
|
||||
|
||||
## B06 횡단도
|
||||
14. 횡단도에서 선의 길이를 알려주는 기능에서 정보창이 줌인아웃 버튼의 좌측에 배치
|
||||
15. 횡단도의 측구여부와 좌우 방향을 선택하는 버튼의 비활성화 여부 확인(확인만 코드 요청아님)
|
||||
16. 횡단도 내부의 측구관련 정보들이 많은데 조금 컴팩트하게 표현할수 있는 방법이 없는지 제안 및 반영
|
||||
17. 횡단도의 상세 모달창에서 팬동작으로 그래프 전체가 움직임. 축은 고정하고 내부 내용이 동작해야함. 그리고 하단 테이블의 글자를 더 큰글자로 변경, 항목이름의 셀은 색상 다른게
|
||||
18. 횡단도의 상세 모달창에서 각 항목의 열이나 행을 추가하는 기능을 부여하고 각 셀에대한 특정항목을 값을 그래프에서 선택할 수 있는 기능을 부여. 선택은 면적과 길이가 될것같고 이때 마우스 우클릭을 하여 값 재 지정을 할수 있게 해줘.
|
||||
|
||||
## B07 상세설계
|
||||
19. 횡단도의 격자에 배치를 옮기기 위해 선을 선택할때 원지반선이 안잡힘. 추가로 레이어(도면층을 활용하여 해당도면에 측점을 한번에 잡을 수 있게 반영)
|
||||
20. 횡단도의 붉은색 격사선을 하이드쇼할수 있는 버튼을 횡단도 컨테이너 내부에 존재
|
||||
21. 횡단도의 테이블을 현재값을 1로 두고 테이블과 텍스트의 크기를 스케일 조절할 수 있게 반영, 기본값 1
|
||||
|
||||
## B09 원가검토
|
||||
22. 일위대가표와 단가산출근거에서 구현한 호표별 보기는 이름을 박스보기로 변경하고 접었다 펼 필요는 없음(접으면 목록표와 동일함으로). 그리고 목록표에서 행을 선택할때는 해당 호표를 외곽선을 붉은 색 하이라이트로 구현해줘. 테이블 보기도 역시 해당 호표의 제목이 아니라 영역이 하이라이트 되어야함.
|
||||
23. 설계내역서에 행을 추가하는 항목이 완료되었는데 이방식은 레벨구분이 없음. 레벨을 구분하고 생성할수 있도록 들여쓰기와 폰트로 구분 사이즈로 구분하여 표기하였으면함. 중요한점은 각 행에대해 레벨이 구분되어야하면 레벨에 따라 상위로 숫자들도 합계되는 구조임. 여기에 단가산출과 일위대가를 연결할 수 있어야함. 마우스 우클릭이과 버튼으로
|
||||
24. 재료비목록표는 연결되어 있는 일위대가에 대한 내용이 들어와야하는데 지금 어떤값이 들어왔는지 이해가 안됨.
|
||||
25. 자재단가대비표에 들어오는 견적에는 면이 필요없으며, 다른 항목의 면은 출처로 변경(값은 유지), 견적서는 견적 하위로 이동
|
||||
26. 자재단가대비표에 적용 열은 사용자가 수기입력이 아니라 적용단가 셀을 선택하면 드롭다운 메뉴로 항목들을 보여주고 선택을 하면 그값을 보여주면 됨. 이때 적용된 값은 하이라이트 표시, 기본값은 최저단가로 반영
|
||||
27. 관급에 대한 현재 구현 여부를 조사만해서 알려줘. 별도의 아티팩트로 보여주면 됨
|
||||
28. 지제단가대비표에는 수량열이 빠지는게 맞음.
|
||||
29. 원가검토 페이지의 상위탭과 하위탭의 구성을 하려고 함. 양식은 B08의 페이지 구성을 보면됨.
|
||||
30. 원가검토 페이지의 탭구성, 일위대가(일위대가목록표, 일위대가표), 단가산출(단가산출근거목록표, 단가산출근거), 중기(중기목록표, 중기사용료, 중기시간금액집계표, 경비목록표, 경비수량금액집계표), 재료(재료비목록표, 자재단가목록표, 재료비수량금액집계표), 노무(노무비목록표, 노무비수량금액집계표)<<<지정안된 항목들은 상위탭임.
|
||||
@@ -0,0 +1,91 @@
|
||||
# 조사 T — M02 사전조합 자재목록 · B05/B06 패널(연결 라벨 노랑 · 동물이동형 드롭다운 · 노면공 박스 · 측점선 연동 · 사면안정 범위) (10-10 · 읽기 전용 조사 에이전트)
|
||||
|
||||
원문 = `docs/raw/요구_1010_2/사용자요구_1010_2.md` 1 · 6 · 8 · 9 · 10 · 11번.
|
||||
|
||||
| 약칭 | 파일 |
|
||||
|---|---|
|
||||
| LD · ROWS · LM · MP | `M02_MasterTemplete/M02_MasterTemplete_Labor_Detail.ts` · `…_Labor_Rows.ts` · `…_Labor_LogicMats.ts` · `M02_Material_Pick.ts` |
|
||||
| LR · LDOC · LRT · ISRC | `M02_MasterTemplete/M02_Labor_Ref.py` · `M02_Labor_Doc.py` · `M02_Labor_Router.py` · `M02_Item_Source.py` |
|
||||
| B8M · B9L | `B08_Quantity/B08_Quantity_Router_Material.py` · `B09_Estimation/B09_Estimation_Labor_Source.py` |
|
||||
| SR · SS · TH | `B05_Profile/B05_Profile_UI_Structures_Summary_Row.ts` · `B05_Profile/B05_Profile_UI_Style_Structures.css` · `ui_template/ui_template_theme.css` |
|
||||
| PIPE · SPC · SF · DEF | `A00_Common/design/design_structure_pipe.ts` · `…/design_structure_spec.ts` · `…/design_structure_form.ts` · `resources/master_template/구조물정의.json` |
|
||||
| SV · SVT · SVP · SPN | `B06_Section/B06_Section_UI_Section_View.ts` · `…_Section_View_Types.ts` · `…_Section_View_Profile.ts` · `…_UI_Page_Structures_Panel.ts` |
|
||||
| DVC · DP · PST · CSX | `A00_Common/design/design_view_cross.ts` · `A00_Common/design/design_profile.ts` · `B05_Profile/B05_Profile_UI_Profile_Structures.ts` · `B06_Section/B06_Section_UI_Style_Cross.css` |
|
||||
| FORM · PNL5 · PT · MARKS | `B05_Profile/B05_Profile_UI_Structures_Form.ts` · `…_Structures_Panel.ts` · `…_Structures_Panel_Types.ts` · `…_Structures_Marks.ts` |
|
||||
| T | `resources/tester/` |
|
||||
|
||||
## 0. 코드 지도
|
||||
|
||||
| 요구 | 손댈 층 | 계산 자리(5장) | 저장 |
|
||||
|---|---|---|---|
|
||||
| T1 사전조합 자재목록 | LD(문 셋 지움) · LR · B8M · B9L · ISRC | 화면 = 서버 calc 답 그대로 · 사전조합 1 단위 값 · B08 · B09 펼침 = ③ 서버 단독 | 사전조합 문서 `{층}/precombo/SC-*.json` 에 `자재` · 줄 `고름` · `자재표시` 새로 남김 |
|
||||
| T6 미연결 라벨 노랑 | SS 한 규칙 | 화면만 | 없음 |
|
||||
| T8 동물이동형 드롭다운 | PIPE 한 칸 · SPC · SF 지우기 | 저장만(읽는 곳 없음) | `pipe_points.json` `options.inlet_basin_animal` 키 · 값("true"/"false") 그대로 |
|
||||
| T9 노면공 박스 | SV · SPN · SVT · DVC 한 줄 | 화면만 | 세션 고름만(카드 고름 안 적음) |
|
||||
| T10 카드 → 종단 측점선 | DP 두 줄(줄 수 그대로) · SVP 두 곳 | 화면만 | 없음 |
|
||||
| T11 사면안정 범위 | PNL5 한 줄(줄 수 그대로) | 화면만 | 없음 |
|
||||
|
||||
## T1. M02 일위대가 사전조합 — 구조물 조합 일위대가와 같은 자재목록
|
||||
- 현재: 사전조합 편집 = 일위대가 상세와 **같은 부품** `mountLaborDetail` 의 서고 모드(MAIN:416-420 · `mode: "precombo"`). 자재목록(로직 자재 줄 LM + 사용자 자재 줄 + [자재 추가] MP + 세 칸 자재구분 · 별도계상 · 운반비 168장)은 이미 한 벌(`matTable` ROWS)인데 서고 모드에서만 막음: LD:644(`lib ? [] : [section(Labor_Mats…)]`) · LD:237(로직 자재 세 칸 `mark: lib ? undefined`) · LD:671-677(`getDoc` 이 `자재` 지움). 셈 길은 이미 같음 — 사전조합도 `/labor/{SC키}/calc`(LRT:41-55 · `labor.clean` → `labor.calc` 가 `자재` 를 셈 LDOC:439-481).
|
||||
- 서버가 버리는 자리: 저장 `clean_doc` → `_combo_lines`(LR:134-147 · 199-219)가 줄에서 `참조 · 로직 · 입력값 · 켜쌓기율 · 수량 · 메모` 만 남김 → `고름`(로직 자재 [바꾸기]) · `자재표시`(세 칸) · 문서 `자재` 가 저장 때 사라짐.
|
||||
- 값이 안 닿는 자리(자재를 담아도 아무 데도 안 셈): ① 사전조합 1 단위 값 `Expand._combo`(LR:420-455 · 안 줄 기준 × 손 수량만 · 구조물 일위대가의 참조 줄 값 · 목록 기준금액이 이것) ② B08 참조 줄 재료 `_ref_mats`(B8M:57-96 · 160-3) ③ B09 겹 대가 블록 `precombo`(B9L:208-239 · 자재 줄 없음 · 조합 블록은 B9L:265-268 이 자재 줄 냄) ④ 프로젝트 사본 단가 묶음(ISRC:157-163 · 구조물 `자재` · `고름` 코드만 모음 · 굳힌 참조사본 안 사전조합 자재는 안 모음 → 사본 셈 단가 없음).
|
||||
- 고칠 자리:
|
||||
- 화면(LD · 지우기만): 644 의 `lib ?` 조건 · 237 의 `lib ? undefined :` · 676 `delete out.자재`. [자재 추가] · 수량 모달(서고는 손만 LD:329) · 같은 품목 막음은 그대로 탐.
|
||||
- 저장(LR:199-219): 줄에 `고름` · `자재표시` 남김(`labor.clean` 이 이미 검사) · `clean_doc` 에 `자재 = labor.clean({자재}).자재`(개인 `PM` 검사 · 로직 자재 같은 품목 400 = LDOC:605-613 `server` 길 재사용).
|
||||
- 값(③ 서버 단독 · 파이썬만): LR `_combo` 끝에 사용자 자재 행 = `labor.material_price(self.whole, 코드, 단위)` × 손 수량 → `{재료비, 계}`(LDOC:399-403 `settle` 꼴) · B8M `_ref_mats` 에 문서 `자재` 를 `(재료 줄, 손)` 으로 더함(`logic_mat` 이 코드로 이름 · 규격 맞춤) · B9L `precombo` 줄에 `kind: "material"`(B9L:265-268 꼴) · ISRC:160-163 에 굳힌 사전조합 `자재` · `고름` 코드 더함.
|
||||
- 재사용: 자재 표 · 세 칸 · 고르기 = 구조물 일위대가 그대로(LD · ROWS · LM · MK · MP) · 자재 단가 `material_price` · 참조사본 굳힘 `frozen`(LR:465-480 · 문서째 굳으니 `자재` 도 따라감).
|
||||
- 시험: T test_m02_labor_mat_marks:128(`mark: lib ? undefined` 단정 고침) · test_m02_card_shell:85-86(무변 확인) · test_m02_labor_ref(사전조합 저장 꼴 · 값 = 로직 + 자재) · test_160_3_b08_unmatched_total(참조 줄 재료 + 사전조합 자재) · test_145_2_b09_labor_calc(겹 대가 자재 줄) · test_m02_precombo_class · 새 시험(저장 왕복 `자재` · `고름` 남음 · `_combo` 재료비 = 단가 × 손 · 빈 수량 안 셈).
|
||||
- 위험: 구조물 일위대가의 자재목록은 참조 줄(사전조합) 안 자재를 지금도 안 보임(로직 자재 줄 = 로직 줄만 · 이번 밖 · 기록) · 사본 단가 묶음에 코드가 빠지면 B09 단가 빈칸 · LD 692줄(지우기만 · 늘리지 말 것).
|
||||
- 크기: 중간~큼(화면 작음 · 서버 네 자리).
|
||||
- ⬜ 범위: (가) 화면 · 저장 · 사전조합 값 · B08 · B09 · 사본 묶음 한 번에 / (나) 화면 · 저장 · M02 값까지(B08 · B09 · 묶음은 다음 장) — 추천 (가)(담은 자재가 아래에서 조용히 빠지지 않게).
|
||||
- ⬜ 사전조합 사용자 자재 수량 기본: (가) 빈칸 = 안 셈(일위대가 자재와 같음) / (나) 손 1(사전조합 로직 줄 51-6 과 같음) — 추천 (가).
|
||||
|
||||
## T6. 구조물 조합 라벨 — 미연결 = 노란 경고 배경
|
||||
- 현재: 라벨 = SR 한 벌(B05 폼 FORM:149 · 옵션 그룹 `B05_Profile_UI_Structures_Groups.ts`:190 · 명세 폼 SF:272 — M02 는 안 씀). 연결 = `is-assigned`(SR:58) → SS:450-454 초록 배경 + 테두리(173-1). 미연결 = 클래스 없음 · 「미지정」 글 · 공용 입력 칸 바탕.
|
||||
- 토큰: `--color-warning` 있음(TH:39 밝음 `#b8860b` · TH:322 어두움 `#e0b64a`). 같은 꼴 선례 `A00_Common/spreadsheet/spreadsheet.css`:206(`color-mix(warning 15%, surface-raised)`).
|
||||
- 고칠 자리: SS:454 뒤 한 규칙 `.b05-structure__summary-name:not(.is-assigned)` = `border-color: var(--color-warning)` · `background: color-mix(in srgb, var(--color-warning) 18%, var(--color-surface))`(173-1 과 대칭 · 글자색 없음). TS 안 고침.
|
||||
- 시험: T test_173_1_summary_assigned_bg 에 함수 하나(미연결 규칙 · warning · surface · color 없음) · test_b05_structures_form_summary(무변).
|
||||
- 위험: 숨은 줄(`[hidden]` SS:440)은 안 보임 · 하단 목록 줄 미지정 표시는 요구 밖.
|
||||
- 크기: 작음.
|
||||
|
||||
## T8. 집수정 「동물이동형」 체크박스 → 드롭다운(유 / 무)
|
||||
- 현재: 칸 = PIPE:73-80(`kind: "bool"` · `default: "true"` · 집수정 갈래 키 `inlet_basin_animal`) · 그리기 = SF:147-153(공용 체크박스 · `.value` = "true"/"false") · 꼴 정의 SPC:35-36 · 체크박스 import SF:44 · 폼 키 목록 MRG:31. `bool` 꼴을 쓰는 칸은 이것 하나 · 읽는 곳 없음(저장만).
|
||||
- 고칠 자리: PIPE:77 `kind: "select"` + `choices: [{ value: "true", label: "유" }, { value: "false", label: "무" }]`(default "true" 그대로). 그러면 SF:147-153 · SF:44 · SPC:35-36 의 `bool` 은 죽은 갈래 → 지움. DEF 이름 표에 `inlet.animal=true: 유` · `inlet.animal=false: 무`(DEF:3335 옆 · M02 이름 표 `nameTable` SPC:249 와 맞춤 · 없어도 보기 글은 명세 글).
|
||||
- 빈 값 = 유: `inlet` 은 필수 상자 → 빈 고르기 칸은 그릴 때 기본값을 **실제 값으로 적음**(SF:224-232 · 54-43) → 옛 관 · 자동 관도 「유」로 보이고 다음 [저장]에 "true" 가 적힘. 173-7 「빈 값 저장 안 함」만 바뀜(무해 · 읽는 곳 없음). 흙막이로 바꾸면 갈래 밖 → 비움(SF:206-212 · MRG 키 목록 그대로).
|
||||
- 재사용: 명세 select · `by` 갈래 · 필수 상자 기본 채움(그대로).
|
||||
- 시험: T test_173_7_inlet_animal + helper_173_7_inlet_animal.cjs 고침(select · 빈 값 = "true" 적힘 · 무 = "false" · 흙막이 칸 없음) · test_52_structure_spec_pipe · test_b05_facility_options_merge(무변).
|
||||
- 위험: 없음(서버 · B07 · B08 안 읽음 · `bool` 지워도 M02 `OptionForm` "bool"(`M02_SO_Def_Model.ts`:9)은 다른 꼴 · 무관).
|
||||
- 크기: 작음.
|
||||
- ⬜ 저장 값: (가) 키 · 값 그대로("true"/"false" · 보기 글만 유/무 · 이주 없음) / (나) 값을 "유"/"무" 로 — 추천 (가).
|
||||
|
||||
## T9. 목록 · 알약에서 노면공 고름 = 박스 형상 · 카드 하나 고르기 없음
|
||||
- 지금 흐름(목록 누름): 공용 폼 `onSelect` → SPN:210-224 → `focusChainage(focusOf)`(SPN:220 · 범위 안 기준점에 가까운 카드 하나를 **고름** = `--selected` 진한 빨강 테두리 · 세션 · 측점 리스너) → `markStructure(id)` → SV `selectMark`(SV:577-584) → `applySpan`(SV:254-262).
|
||||
- 「박스 형상」 판정: 다른 구간형(옹벽 · 흙막이 · 사토장) 고름 = 범위 안 카드 **전부** `b06-cross-card--span` 테두리(SV:260 · CSX:231-234 옅은 빨강 2px · 106-1). 노면공(G군)만 152-5 에서 테두리를 빼고 포장층 강조만(`span && !pave` SV:260 · `highlightPavement` `B06_Section_UI_Cross_Design_Surface.ts`:70-86). → 「박스」 = 이 범위 카드 테두리.
|
||||
- 고칠 자리: ① SV:260 `span && !pave` → `span`(포장층 강조 SV:261 은 둠) ② SPN:220 — 노면공(`!coverable(structure)` SPN:163)이면 카드를 고르지 않고 보이게만: SV 핸들에 `revealSpan(chainageM)` 하나(옛 고른 카드는 리스너 없이 풂 = `selectedStationId = null` · `markCard` · `profile.showCard(null)` · 그 카드로 `revealCard`(SV:208)) · SVT:44 옆 한 줄 · DVC:189-191 옆 deps 한 줄 · SPN deps 한 줄. 리스너(`setStationSelectListener` DVC:381)를 거치면 `showAtChainage(null)` 이 폼을 닫음 → 꼭 리스너 없이.
|
||||
- 그대로 둠: 범위 안 카드 누름 = 노면공 유지(165-1 · SPN:551-560) · 재누름 유지(167-3 SV:288-298) · 알약 누름(SVP:204-212 → `selectStructure`)도 같은 `onSelect` 길.
|
||||
- 시험: T test_106_span_highlight_wording:34(`span && !pave` 단정 고침) · test_165_pavement_flow(step1 · step5 카드 40 → 없음 · test_배선 `focusChainage` 단정) + helper_165 · test_152_5_pavement_pick(무변 확인) · 새 시험(노면공 고름 = `--span` 범위 카드 수 · `--selected` 0 · 폼 · 알약 유지).
|
||||
- 위험: SV 614줄(+ ~12) · DVC 680줄(+1 · 늘리지 말 것 — 가능하면 SPN 이 이미 받는 deps 만) · 카드 고름이 없으니 [상세] · 조정창 등 카드 대상 동작은 카드를 눌러야 함.
|
||||
- 크기: 중간.
|
||||
- ⬜ (가) 노면공 = 범위 카드 전부 테두리 + 포장층 강조 · 카드 하나 고르기 없음(첫 카드로 스크롤만) / (나) 테두리만 더하고 가까운 카드 고름은 그대로 — 추천 (가).
|
||||
|
||||
## T10. 횡단 카드 고름 → 종단 측점 세로선 하이라이트가 안 따라옴
|
||||
- 연동 길: 카드 누름 → SV `selectStation`(SV:288) → `applySelection`(SV:279-286) → `profile.showCard`(SVP:270-285 → `setSelectedStation(station_id)` DP:576-581 · 측점선 켬) → 그 **뒤** 측점 리스너(DVC:381-405) → `sectionView.selectMark(mark, false)`(DVC:398) → SVP `selectMark`(SVP:266-269) → `profile.setSelectedStructure(mark)`(DP:626-631).
|
||||
- 원인(코드 판정): DP:629-630 `keep = 구조물 ≠ null && 그 측점 구조물 === 구조물` · 아니면 `selectedStationId = stationIdAtStructure(구조물)`. 일반 카드는 mark = null → 측점선 = null(**방금 켠 선을 지움**) · 덮는 구조물(벽 · 노면공) 카드도 측점선 없는 구조물(PST:173-184 · 관만 선이 있음) → null. 152-5(4ae7ee25c)가 DVC:398 의 `if (mark)` 를 빼면서 모든 일반 카드에서 지움 · SPN:214(`markStructure(null)`)와 SVP:283(`setSelectedStructure(markedId)`)도 같은 함수로 지움. 관 카드만 mark = `pipe-…` → 관 측점선이라 맞음. 반대 길(종단 측점 누름 → 카드)도 같은 리스너를 타서 누른 선이 곧 꺼짐. 측점 키 · 반올림은 무관(카드 · 종단 같은 `station_id` · 관 맞춤 0.51 m SVP:276-279).
|
||||
- 고칠 자리(모든 B06 길이 지나는 한 곳): DP:626 `setSelectedStructure(structureId, keepStation = false)` · DP:630 `selectedStationId = keep ? selectedStationId : (stationIdAtStructure(structureId) ?? (keepStation ? selectedStationId : null))`(줄 수 그대로 · 698줄) · SVP:268 · SVP:283 에 `true`(B06 = 카드가 측점선 주인). B05(`design_view_profile.ts`:132 · 331)는 기본값 → 지금 그대로.
|
||||
- 재사용: 판단을 순수 함수로 PST(184줄)에 빼면(`stationAfterPick(지금, 구조물, keep, 선)`) Node 시험 가능 · DP 는 부름만.
|
||||
- 시험: 새 시험(일반 카드 → 측점선 유지 · 벽 카드 유지 · 관 카드 = 관 선 · B05 목록 비관 구조물 = 선 끔 그대로) · test_165_pavement_flow · test_b05_b06_selection_single(무변 확인).
|
||||
- 위험: DP 698줄 — 줄 늘리지 말 것 · 목록 해제는 `releaseCard` → `showCard(null)` 이 선을 끔(유지 확인).
|
||||
- 크기: 작음.
|
||||
|
||||
## T11. 사면안정군 「기준측점 위 범위」 — 필요 없음
|
||||
- 코드 판정: 「기준 측점 위 범위」 = 좌측 폼 **「측점 범위」 줄**(FORM:98-108 · 위치 줄 첫 칸 = 시작 · **기준 측점** · 종료 칸 위). 켜는 조건 `hasComputedRange`(PT:242-252 · 구간형 + B05 `length_m` 옵션) → PNL5:156-169 가 `시작 ~ 종료` 를 계산해 보임. 해당 종류(DEF 기준): C 사면안정 6(retaining_wall · masonry_wet · masonry_dry · soil_guard · boulder_masonry · berm) + B ditch_berm + E refuge · work_yard · guardrail. B05 · B06 같은 폼 한 벌.
|
||||
- 종단도 확인: 사면안정 전용 범위 그림 없음 — 범위 띠는 알약 레인(MARKS:171-186 · **모든** 구간형 B · C · E · F · G · 09-07 사용자 지시로 늘 보임 · 기준측점 알약 줄 가운데)뿐 → 이번에 안 건드림 추천.
|
||||
- 고칠 자리: PNL5:159 `const computed = hasComputedRange(currentType()) && currentType()?.group !== "C";`(줄 수 그대로 · 699줄). `hasComputedRange` 자체는 시작 · 종료 칸 숨김에도 쓰므로 안 고침.
|
||||
- 시험: 새 소스 시험(PNL5 `rangeWrap.hidden` 조건에 C군 거름) · test_b05_structures_registry_policy · test_54_6_slope_container(무변).
|
||||
- 위험: C군은 폼에서 범위를 볼 곳이 없어짐(하단 목록 측점 · 알약 띠 · 벌룬엔 남음) · PNL5 699줄 — 한 줄도 늘리지 말 것.
|
||||
- 크기: 작음.
|
||||
- ⬜ 지울 자리: (가) 좌측 폼 「측점 범위」 줄 — C군만 / (나) 그 줄 전부(B 소단배수로 · E 대피소 · 작업장 · 가드레일도) / (다) 종단 알약 레인 띠 중 C군 — 추천 (가).
|
||||
|
||||
## 고칠 파일 · 겹침
|
||||
- 700 위험: LD 692(T1 지우기만) · DP 698(T10 줄 수 그대로) · PNL5 699(T11 줄 수 그대로) · DVC 680(T9 +1) · SV 614(T9 + ~12) · SS 628(T6 +5).
|
||||
- 겹침: T9 · T10 = SV · SVP · DVC 같은 고름 길(한 사람이 차례로 · T10 먼저 — T9 의 `showCard(null)` 이 T10 유지 규칙에 기댐) · T6 · T8 = 좌측 패널 같은 폼(파일 다름) · T1 은 M02 · B08 · B09 서버(다른 창과 안 겹침).
|
||||
@@ -0,0 +1,72 @@
|
||||
# 조사 U — B05 3D(성토 깨짐 · 흑백 · 등고선 기본값 · 측구 방향 구슬) (요구 1010_2 2~5번 · 읽기 전용 조사 에이전트)
|
||||
|
||||
약칭 `B05_Profile/B05_Profile_` + LO `UI_Corridor_Loft.ts` · LT `UI_Corridor_Loft_Toe.ts` · TIN `UI_Corridor_Tin.ts` · SH `UI_Corridor_Loft_Shade.ts` · VC `UI_Viewer_Corridor.ts` · VW `UI_Viewer.ts` · PV `UI_Panel_View.ts` · PF `UI_Panel_Fields.ts` · PN `UI_Panel.ts` · MK `UI_Markers.ts` · PS `UI_Page_Stations.ts` · PH `UI_Page_Helpers.ts` · PA `UI_Page_Actions.ts` · AF `Api_Fetch.ts` · RL `Router_Lifecycle.py` · RC `Router_Confirm.py` · SC `Schema.py` / DVP `A00_Common/design/design_view_profile.ts` · DS `A00_Common/design/design_save.ts` · CD `B06_Section/B06_Section_UI_Cross_Design.ts` · CC `B06_Section/B06_Section_UI_Cross_Card_Chrome.ts` · B6C `B06_Section/B06_Section_Router_Confirm.py` · T `resources/tester/`
|
||||
|
||||
## 0. 코드 지도
|
||||
|
||||
| 요구 | 손댈 층 | 계산 자리(5장) | 저장 |
|
||||
|---|---|---|---|
|
||||
| U2 성토 깨짐 | TIN 한 상수 + LO 덩이 끝 줄이기 ~10줄 | 브라우저 단독 3D 표시(VC:199 → LO) · 서버 Node(`B05_Profile_Corridor_Node.ts`)는 노면 리본만 · 사면 망은 저장 안 함 → 짝 · 스냅샷 없음 | 없음 |
|
||||
| U3 흑백 기본 false | PV:71 · VW:390 | 화면만 | 없음(세션 · 사용자 설정 키 없음) |
|
||||
| U4 등고선 기본 false | PV:65 · VW:184-185 | 화면만 | 없음 |
|
||||
| U5 구슬 삭제 | MK + DVP 처리기(⬜ 세션 · 서버 사슬) | 화면만 | 세션 `uphill` → 확정 `uphill_overrides`(⬜ 남김 / 지움) |
|
||||
|
||||
## U2. 성토 스무딩 깨짐 — 172 뒤 심해짐
|
||||
- 어떻게 쟀나: 조사 P 입력 그대로(226 · d22 · `aislo_3d_probe/input_*.json` · storage `dtm_classification_smooth_preview.glb` · 읽기만) · 지금 TS 와 `cea89e945~1` TS(git show → 메모리)를 Node 로 그대로 돌리고 안은 메모리에서만 끼움 · 스크래치 `probe_u.cjs` · 저장소 변경 0.
|
||||
- 172 가 바꾼 것(cea89e945):
|
||||
- LO:341-355 성토 행 드레이프 보정량을 노선 따라 가우스 σ 3 m(LT:45-69 · `only` 행만 셈) · 측점 행 되돌림(LT:73-99 `pinBack`) · 원래와 차 ±0.5 m 한도 = `toeOff`.
|
||||
- LO:425-427 비탈 끝 점 높이 = 지형 + toeOff(전 = 지형 그대로).
|
||||
- LO:376 측점 앞 0.2 m 덧행 없앰 · LT smoothToe 는 같은 동작으로 함수만 꺼냄.
|
||||
- 원인(판정): **비탈 끝이 지형에서 뜨거나 잠겨 바깥 지형과 잇는 띠가 가파른 턱 · 홈이 됨** — 성토 면 안쪽 주름은 줄었으나 비탈 끝 가장자리가 깨짐.
|
||||
- 성토 비탈 끝 둘레 점 |높이 − 지형| 중앙 0 → 0.26 · p90 0 → 0.5 m · 성토 행 25 / 22 % 가 한도 0.5 m 에 걸림.
|
||||
- 잇는 삼각형 = 설계 구역 밖 · 지형 색 · 면 법선(TIN:287-311 · SH:40-48) · 비탈 끝에서 가장 가까운 지형 정점(DTM 1.08 m 격자 · 0~1 m 거리)까지 바로 이음 — 지형 정점은 둘레 1 mm 안 것만 뺌(TIN:42 · 92) → 0.5 m 턱이 0.5 m 안팎 거리 = 45° 넘는 벽 · 홈.
|
||||
- 성토 ↔ 절토 바뀜 — 성토 덩이 끝 행 toeOff 14 / 14 곳 다 0.5 m(한도) · 이웃 절토 비탈 끝은 지형 그대로 → 둘레가 0.2~0.4 m 사이에서 0.5 m 뜀(톱니).
|
||||
- 성토 면 정점 중 지형보다 0.2 m 넘게 낮은 것 3,792 → 5,662 / 3,442 → 4,649(비탈 끝 홈).
|
||||
- 아닌 것: 덧행 없앰 — 되살려도 가장자리 수치 그대로 · 면 안쪽은 오히려 나빠짐(10° 넘음 90 → 106 / 88 → 103) · 제약 실패 3 / 2 그대로 · 삼각형 뒤집힘 없음(평면 들로네 · 감기 맞춤 TIN:292-295) · 구멍 없음.
|
||||
- 측정(per 100 m · 226 / d22):
|
||||
|
||||
| 안 | 잇는 띠 60° 넘음 | 성토 ↔ 잇는 띠 꺾임 45° 넘음 | 면 안쪽 10° 넘음 | 둘레 성토↔절토 뜀 0.2 m 넘음(곳) |
|
||||
|---|---|---|---|---|
|
||||
| 172 전 | 17 / 10 | 18 / 18 | 149 / 132 | 0 / 0 |
|
||||
| 지금(172) | **76 / 67** | **51 / 42** | 90 / 88 | 11 / 14 |
|
||||
| ㉮ 되돌림(git revert) | 17 / 10 | 18 / 18 | 149 / 132 | 0 / 0 |
|
||||
| ㉯ 한도 0.25 m | 48 / 43 | 40 / 35 | 107 / 96 | 11 / 14 |
|
||||
| ㉰ 비탈 끝 = 지형 · 면만 고름 | 17 / 10 | 32 / 31 | 139 / 137 | 0 / 0 |
|
||||
| ㉱ 잇는 띠 넓힘 1.5 m | 11 / 10 | 12 / 14 | 90 / 88 | 11 / 14 |
|
||||
| **㉱ + 덩이 끝 3 m 줄이기** | **11 / 9** | **11 / 13** | **93 / 89** | **0 / 0** |
|
||||
|
||||
- ㉰ = 턱이 성토 면 마지막 칸으로 옮겨 갈 뿐(둘레 꺾임 20° 넘음 35 → 47 / 30 → 43).
|
||||
- ㉱ 2 m 는 1.5 m 와 비슷(60° 넘음 10 / 9) · 1 m 는 14 / 9 · 계산 약 1.0 s 그대로 · 제약 실패 3 → 2 / 2.
|
||||
- 고칠 자리:
|
||||
- ㉱ TIN:92 지형 정점 「안」 판정 거리 `ON_BOUNDARY_M`(1 mm) → 새 상수 `SEAM_M` 1.5 m(정점 판정만 · 변 판정 TIN:150 은 그대로) → 비탈 끝 1.5 m 안 지형 정점을 빼서 잇는 삼각형이 1.5~2.5 m 로 길어짐(0.5 m 턱 ≈ 15~18°).
|
||||
- 덩이 끝 줄이기 LO:351-355 뒤 — 성토 아닌 행에서 누가거리 3 m 안 toeOff 를 smoothstep 으로 0 까지 줄이고 liftOf 도 같은 만큼 되돌림(~10 줄 · LO 665 → 약 675 줄).
|
||||
- 덤(선택): LT:73-99 pinBack 이 고정 행(측점)을 성토 덩이 넘어 다른 덩이 측점까지 이음 → 짧은 덩이(20 m · 측점 1 개) 한도 걸림 59 % · 74 % · 덩이 끝 줄이기로 대부분 덮임.
|
||||
- 시험: T test_172_1 · test_115_10 · test_135_3 · test_b05_corridor_*(그대로) · test_115_8 `lostVerts == 0` — T helper_115_8_corridor_loft.cjs:277 이 1 mm 기준 → SEAM_M 로 같이 고침(1.5 m 안 빠짐은 의도) · `npm run typecheck` · 새 시험(물결 지형 성토 · 비탈 끝 아래 사인 진폭 1 m): 잇는 삼각형 경사 p99 < 45° · 덩이 끝 toeOff = 0 · 틈 0 · 제약 실패 0.
|
||||
- 위험: 비탈 끝 바깥 1.5 m 안 지형 굴곡이 긴 삼각형으로 펴짐(절토 둘레 · 구조물 구멍 둘레도 같은 규칙 · 절토 잇는 띠 45° 넘음 91 → 79 로 오히려 고름) · 사진 색은 버린 삼각형에서 보간(TIN:263-274)이라 그 띠 색이 흐려짐 · 3D 참고용이라 수량 무관.
|
||||
- 크기: 작음(TIN 2 줄 + LO ~10 줄 + 시험 도우미 1 줄).
|
||||
- ⬜ 고칠 방향: (가) ㉱ + 덩이 끝 줄이기(172 주름 줄임 유지 · 가장자리는 172 전보다 고름) / (나) ㉮ 되돌림(가장자리 예전 · 주름 다시 181 per 100 m) / (다) ㉯ 한도 0.25 m(한 줄 · 반만 나음) — 추천 (가).
|
||||
- ⬜ 띠 넓이: 1.5 m / 2 m — 추천 1.5 m.
|
||||
|
||||
## U3 · U4. 흑백 지형 · 등고선 기본값 false
|
||||
- 현재: 단추 처음 상태 = PV:65 `toggleButton("등고선", true, …)` · PV:71 `toggleButton("흑백 지형", true, …)`. `toggleButton`(PF:117-135)은 처음 상태를 칠하기만 하고 콜백을 안 부름 → 뷰어 처음 값이 따로: 흑백 VW:390 `let surfaceGrayscale = true` · 등고선 VW:184-185 그룹(visible 설정 없음 = 보임). 콜백 연결 DVP:262 · 266.
|
||||
- 덮는 저장: 없음 — 두 단추 상태는 sessionStorage · localStorage · 사용자 설정에 안 적음(검색 0) · 다시 들어오면 늘 코드 기본값.
|
||||
- 고칠 자리: PV:65 · 71 `true → false` + VW:390 `false` + VW:185 뒤 `contours.visible = false` — 두 쪽 같이(한쪽만이면 단추는 꺼짐인데 화면은 켜짐). 주석 PV:69-70 · VW:389(「기본 켜짐 08-23 확정」) 고침 · PN:45 주석(「기본 꺼짐」)은 이번에 맞게 됨.
|
||||
- 이어지는 것: 흑백 끔 = 지형 무지개 고도색 · 예상형상 청록 · 자주는 keepColor 라 그대로(VW:411) · 등고선은 적재 때 그대로 만들고(VW:483) 숨기기만.
|
||||
- 시험: T test_135_2_grayscale(기본값 단정 없음 → 그대로) · 새 소스 시험(PV 두 단추 false · VW 처음 값 false · contours.visible = false).
|
||||
- 위험: 08-23 사용자 확정(흑백 기본 = 예상형상 색이 고도색에 안 묻힘)을 뒤집음 — 이번 요구가 명시라 따름.
|
||||
- 크기: 아주 작음(4 줄 + 주석).
|
||||
|
||||
## U5. 3D 측점 노란 띠 끝 주황 구슬(측구 방향 고르기) 삭제
|
||||
- 현재:
|
||||
- 그리기 MK:467-491 — 측점마다 띠 좌 · 우 끝에 구(반지름 0.55 · 상단측 주황 0xf97316 · 반대 회색 MK:57-59) + 투명 맞힘 구(1.1). 띠 = 반폭 × 1.5(MK:427).
|
||||
- 클릭 MK:556-563 — `selectObject` 가 `uphillStationId` 를 측점 선택보다 먼저 봄 → DVP:359-377 그 측을 세션 `uphill` 키에 적고(PH:238-268) 띠 다시 그림(PS:63-64 = 구 색).
|
||||
- 저장 — B05 [저장]·[확정] PA:69-73 `uphill_overrides` · B06 저장 DS:20 · 102 → AF:269-280 → RL:69-90 → RC:43-73 종단 정본 `uphill_side`(source user) + RC:75-170 저장 횡단 설계 `section_mode`(편절 left_cut ↔ right_cut) · `ditch_side` 다시 계산.
|
||||
- B06 에서 되나: **반만** — B06 좌 · 우 단추(CD:396-405)는 양절 · 양성에서만 켜짐(CD:352 `needsDitch` · 편절은 꺼짐 + 「양측 절토·양측 성토만」 안내) · 단면 유형 pill 은 읽기 전용(CC:107-111). → 편절 측점의 절토 · 측구 쪽 뒤집기는 지금 3D 구슬이 유일한 길. 양절 · 양성은 B06 단추로 되고 B6C:369-385 가 정본 `uphill_side` 로 되돌려 적음.
|
||||
- 고칠 자리(최소): MK:467-491 구 · 맞힘 구 · MK:556-563 분기 · MK:127 · 613-615 `onUphillPick` · MK:57-59 색 · MK:35-36 `uphill_side` 칸 · 주석 MK:426 · 459-460 · 530 / DVP:359-377 처리기 · PS:20-21 · 63-64(구 색 전용).
|
||||
- 함께 죽는 것(⬜): 세션 `uphill` 사슬 — DVP:208-212 · 392 · 531-532 · 540 · PH:238-268 · PA:33-35 · 69-73 · AF:250-251 · 269-280 · DS:20 · 102 / 서버 SC:257-260 · 280-281 · RL:69-90 · RC:75-170(`sync_uphill_overrides_into_designs`).
|
||||
- 남김: RC:43-73 `_merge_uphill_overrides_into_longitudinal`(B6C:369-385 가 씀) · `uphill_side` 데이터(구조물 유입측 `_UI_Corridor_Station_Structure.ts`:258 · `_UI_Corridor_Structures_Box.ts`:114 · B06 기본 단면 유형 CD:335).
|
||||
- 시험: 최소안 = 새 소스 시험(MK 에 측점 구 · `uphillStationId` 없음 · DVP 에 onUphillPick 없음) + test_design_store_save · test_b06_save_channels · test_b05_b06_save_roundtrip 그대로 통과(사슬 남김). 사슬까지 지우면 test_design_store_save.py:51 · 61 · 72-73 · test_b06_save_channels.py:27 · 73 · 84 · 100 · test_b05_b06_save_roundtrip.py:373 · 420-424 고침.
|
||||
- 위험: 편절 방향을 사용자가 바꿀 길이 없어짐(자동 판정 = 지형 높은 쪽 `B05_Profile_Engine_Sections_Core.py`:443-448 만) · 지난 세션에 남은 `uphill` 값은 최소안이면 다음 저장 때 한 번 더 나감(무해).
|
||||
- 크기: 최소안 작음(MK 약 −35 줄 · DVP −19 줄 · PS −3 줄) · 사슬까지 중간(파일 10 개 · 시험 3 개).
|
||||
- ⬜ 지우는 범위: (가) 3D 구슬 · 클릭 · 처리기만(세션 · 서버 사슬은 빈 채로 둠) / (나) 사슬까지 다 지움 — 추천 (가)(편절 뒤집기 자리를 정한 뒤 (나)).
|
||||
- ⬜ 편절 방향 뒤집기 자리: (가) 없앰(자동 판정만) / (나) B06 좌 · 우 단추를 편절에도 켜서 `section_mode` 를 바꿈(CD:353-366 emit 이 mode 를 같이 보냄 · 서버 재계산은 기존 [저장] 길) — 추천: 사용자 확인(요구 15 단추 확인과 묶음).
|
||||
@@ -0,0 +1,99 @@
|
||||
# 조사 W — B06 횡단도(치수 칸 자리 · 측구 단추 비활성 · 측구 줄 줄임 · [상세] 축 고정 · 표 손질) (10-10 · 읽기 전용 조사 에이전트)
|
||||
|
||||
약칭 `B06_Section/B06_Section_` + CV `UI_Cross_View.ts` · CTL `UI_Style_Cross_Controls.css` · CSX `UI_Style_Cross.css` · CSA `UI_Style_Cross_Areas.css` · CA `UI_Cross_Areas.ts` · CD `UI_Cross_Design.ts` · DP `UI_Cross_Design_Pick.ts` · CHR `UI_Cross_Card_Chrome.ts` · DT `UI_Cross_Detail.ts` · DTP `UI_Cross_Detail_Pick.ts` · CSD `UI_Style_Cross_Detail.css` · AX `UI_Cross_Axes.ts` · FR `UI_Cross_View_Frame.ts` · VZ `UI_Cross_View_Zoom.ts` · VM `UI_Cross_View_Metrics.ts` · SV `UI_Section_View.ts` · SVT `UI_Section_View_Types.ts` · DSY `UI_Page_Design_Sync.ts` · PER `UI_Page_Persist.ts` · CR `Cross_Refresh.ts` · AT `Api_Types.ts` · AF `Api_Fetch.ts` · SCH `Schema.py` · RD `Router_Design.py` · RCT `Router_CrossTable.py` / ZP `A00_Common/b_svg_zoom_pan.ts` · DVC `A00_Common/design/design_view_cross.ts` · BPS `A00_Common/b_page_state.ts` · CCD `common_util/common_util_cross_design.ts` · CT `B07_DesignDetail/B07_DesignDetail_Engine_Cad_Table.py` · RS `B07_DesignDetail/B07_DesignDetail_Router_Support.py` · CQ `B07_DesignDetail/B07_DesignDetail_Engine_Cross_Quantity.py` · LB2 `ui_template/ui_template_locale_b2.ts` · CM `ui_template/ui_template_context_menu.ts` · DTB `ui_template/ui_template_data_table.css` · BE `B09_Estimation/B09_Estimation_UI_Tabs_Bill_Edit.ts` · T `resources/tester/`
|
||||
|
||||
## 0. 코드 지도
|
||||
|
||||
| 요구 | 손댈 층 | 계산 자리(5장) | 저장 |
|
||||
|---|---|---|---|
|
||||
| W14 치수 칸 = 줌 단추 왼쪽 | CTL 한 덩이 지움 | 화면만 | 없음 |
|
||||
| W15 측구 · 좌우 단추 비활성 | 확인만(코드 없음) | — | — |
|
||||
| W16 측구 줄 줄임 | CSX · CD(· LB2 · CHR) | 화면만 | 없음 |
|
||||
| W17 [상세] 축 고정 · 표 글자 · 이름 칸 색 | DT · SV · SVT · DSY · CSD | 화면만(카드 축 함수 AX 재사용) | 없음 |
|
||||
| W18 [상세] 행 · 열 더함 · 그래프 고르기 · 우클릭 | DT(+ 새 파일) · PER · CR ↔ RD 짝 목록 · SCH · AT(· RS) | 면적 = ③ 서버 단독(설계 면적 칸) · 길이 = ⬜ | 횡단 설계 patch 새 칸(`structure_note` 꼴) |
|
||||
|
||||
## W14. 선 길이 정보창 → 줌 [+ − ⤢] 왼쪽
|
||||
- 현재: 보라 선을 누르면 치수 칸(`b06-cross-card__line-dims` · DP:329-331 · 글 두 줄 = 길이 · 수평 / 높이 · 구배 DP:216-224)이 줌 막대 맨 앞에 붙음(CV:676-677 `zoomBar.prepend(linePick.label)`) — 막대는 그림 칸 오른쪽 위 absolute(CTL:214-224). **그림 칸 폭 ≤ 620 px 이면 막대에서 떼어 면적표 아래 오른쪽으로 내림**(151-1 · CTL:242-259 `@container (max-width: 620px)` · top = 표 높이 변수). 카드 폭(조사 O 추정) 1열 1232 · 2열 608 · 3열(기본) 400 → **1열만 단추 왼쪽 · 2열부터 표 아래**.
|
||||
- 겹침 셈(추정 · CROSS_PAD left 58): 치수 칸 ≈ 176 px(0.75rem · 「사면길이 12.34m · 수평 10.12m」) + 단추 66 px. 2열(608) = 막대 왼끝 ≈ 362 · 면적표 끝 ≈ 311 → **안 겹침**. 3열(400) = 막대 왼끝 ≈ 144 · 면적표 58~283 → 선을 고른 동안 표 오른쪽 ≈ 140 px(RR · BR · 계 칸) 가림.
|
||||
- 고칠 자리: CTL:242-259 의 line-dims 두 규칙(absolute 내림 · `+ .zoom-btn` 왼선)과 막대 `overflow: visible` 지움 → 모든 폭에서 막대 안 왼쪽(지금 1열 꼴). (⬜ (나)면) CSA 에 `.b06-cross-card__chart-wrap:has(.b06-cross-card__line-dims:not([hidden])) .b06-cross-card__areas { opacity: … }` 한 규칙.
|
||||
- 재사용: 지금 1열 꼴 그대로(DOM 손 안 댐 · CV 690줄 안 늘림).
|
||||
- 시험: T test_137_design_pick:107-115(좁은 카드 내림 단정 → 「@container 안에 line-dims 없음」으로 고침) · test_173_areas_detail(표 높이 변수 무변 확인) · test_139_6_line_shift(무변).
|
||||
- 위험: 3열 이상에서 고름 동안 면적표 일부 가림(막대 바탕 88% 불투명 · z-index 2) · `--b06-areas-height` 를 쓰는 다른 곳(CTL:10 · 15 조정창 자리)은 그대로.
|
||||
- 크기: 작음(CSS 지우기만).
|
||||
- ⬜ 3열 이상 겹침: (가) 그대로 가림(고름 동안만) / (나) 가림 + 그동안 면적표 흐림(CSS 한 규칙) / (다) 2열까지만 왼쪽(문턱 620 → 560) · 3열 이상은 지금처럼 표 아래 — 추천 (가)(기본 3열에서 요구대로 보임 · 지우기만).
|
||||
|
||||
## W15. 측구 여부 · 좌우 방향 단추 비활성 — 확인 결과
|
||||
- 단추 = 카드 「측구 줄」(CD:396-467 · CHR:157-163). 비활성 = `button.disabled` + 듣개 안 닮(CD:164-166 · 198-200) + 묶음 `b06-design__seg--disabled`(흐림 0.4 · 손가락 금지 CSX:536-542) + 사유 툴팁.
|
||||
- 단면유형(`section_mode`)은 지형 자동 판정(RD:351 `default_section_modes`) · **카드에 바꾸는 단추 없음**(MODE_OPTIONS = 이름표만 CD:83-94 · 알약 CHR:108-112).
|
||||
|
||||
| 단추 | 비활성 조건(코드) | 툴팁 | 검증_랩탑메인 73 측점(DB SELECT) |
|
||||
|---|---|---|---|
|
||||
| 좌 · 우(노면 경사 = 측구 쪽) | 편측 성토(`left_cut` · `right_cut`) — `!needsDitch()` CD:352 · 404 | 「양측 절토·양측 성토 단면에서만…」 LB2:456-459 | right_cut **66 = 비활성**(「우」 보라 켜진 채 흐림) · both_cut 6 · both_fill 1 = 활성 |
|
||||
| 측구(켬/끔) | 양측 성토(`both_fill`) — `!hasDitch` CD:390 · 417 | 「측구가 있는 단면(양성 제외)…」 LB2:467-470 | both_fill **1 = 비활성** · 72 활성 |
|
||||
| (참고) 측구형식 일반/L형 | 암 아님 · 양성 · 측구 끔 CD:389 · 429 | LB2:463-466 · 471-474 | 73 모두 암 → both_fill 1 만 비활성 |
|
||||
| (참고) 복합/단경사 | 암 아님 · 양성 CD:442 | LB2:463-466 | both_fill 1 만 비활성 |
|
||||
|
||||
- 비활성이 **아닌** 까닭(코드 판정): 확정 장 · 잠금 · 저장 상태 · B05 연동 — 없음(조작 함수 늘 넘김 DVC:317-321 · 받는 쪽 막기 없음 DSY:60-108). 편측의 쪽은 절토 쪽 자동(CCD:234-239 짝 `_resolve_ditch_side`) — 설계 규칙.
|
||||
- 사용자 눈에 비활성처럼 보일 까닭: ① 편측(90%)은 좌우가 흐린 채 늘 보임(E-6 「상시 노출 · 흐리게」 규칙) ② 측구 켬 · 끔 단추 글이 같은 「측구」(LB2:454-455) — 끔 = 회색 글 · 바탕색(CSX:551-559)이라 비활성과 구별 약함 ③ 좁은 카드에선 측구 단추가 「⋯」 안으로 옮겨짐(CD:451 · 476-503 · 숨김이지 비활성 아님) ④ 단면유형 알약은 좌 · 우 편측 모두 「편측 성토」(LB2:423-424) — 쪽은 흐린 좌우 단추로만 읽힘 ⑤ 요구 5(B05 3D 구슬 삭제) 뒤 쪽 고르기 = 이 단추뿐.
|
||||
|
||||
## W16. 측구 줄 컴팩트
|
||||
- 현재: 한 줄 고정 · 넘치면 뒤에서부터 「⋯」(CSX:465-473 · 간격 16 px · CD:451-503). 차례 = [좌|우] [측구] [측구형식 일반|L형] [복합경사] [⋯] [상세](CD:467). 폭 ≈ 445 px(추정) > 3열 카드 400 → 복합경사 · 측구형식이 ⋯ 로 숨음(추정). 편측 66 측점은 흐린 좌우가 자리만 차지.
|
||||
- 안:
|
||||
- (가) **비활성은 숨김** — CSX:536 규칙을 `display: none` 으로 · 「측구형식」 글 지움(CD:422 legend 빈 글 · 툴팁으로) · 알약에 쪽 더함(「편측 성토(우)」 · LB2:423-424 두 줄 또는 CHR:110 한 줄). 편측 암 = [측구] [일반|L형] [복합경사] [상세] ≈ 280 px → 3열에서 ⋯ 없음. 장: 가장 작음 · W15 혼동 없앰. 단: E-6 뒤집음(사용자 확정 필요).
|
||||
- (나) **측구 한 단추로 묶음** — [측구 우·일반 ▾] 하나 → 누르면 작은 판(⋯ 판 꼴 `details` CSX:475-521 재사용)에 켬/끔 · 좌/우 · 일반/L형(비활성 그대로 흐림 · 툴팁). 줄 = [측구 우·일반 ▾] [복합경사] [상세]. 장: 늘 한 칸 · 쪽 · 형식 글로 남음. 단: 바꾸려면 두 번 누름 · CD 새 판 ~40줄(527 → ~565) · 넘침 목록 고침.
|
||||
- (다) **글 · 간격만 줄임** — 「복합경사/단경사」 → 「복합/단」 · 「측구형식」 지움 · 간격 16 → 8 px. 장: 뜻 그대로. 단: 60~80 px 만 줄고(추정) 흐린 단추 그대로.
|
||||
- 재사용: 넘침 정리(CD:470-516 · 숨긴 칸 폭 0 이라 그대로 동작) · ⋯ 판 CSS.
|
||||
- 시험: T 새 CSS · 소스 시험(비활성 규칙 · legend · 알약 글) · 측구 줄을 단정하는 기존 시험 없음(T grep — test_b06_cut_slope_user_input 은 바닥 줄만).
|
||||
- 위험: (가) 비활성 사유 툴팁이 안 보임(숨김) · 좌측 사본 · B05 화면에 같은 클래스 없음(grep) · 알약 글 길어져 머리 줄 넘침.
|
||||
- 크기: (가) 작음 · (나) 중간 · (다) 작음.
|
||||
- ⬜ 줄이는 길: 추천 (가)(편측이 대부분이라 효과 큼 · W15 와 한 번에 풀림) — E-6 「상시 노출」 폐기 동의 필요.
|
||||
|
||||
## W17. [상세] 모달 — 축 고정 팬 · 줌 · 표 글자 · 이름 칸 색
|
||||
- 현재 그림 구조: 카드 svg = 바탕 rect → **축 층** `g.b06-chart__axes`(CV:370-382 · 줌 바뀔 때마다 보이는 범위로 눈금 다시 그림 AX:44-131) → clip 그룹(고정) 안 **도형 층** `g.b06-chart__plot-layer`(CV:384-399) → 축선 · 축 이름(FR:60-81 · svg 직속). 카드 줌은 도형 층에만 transform + 축 다시 그림 + 십자 크기 되돌림(CV:628-640 · FR:83-89).
|
||||
- 모달: 카드 함수로 칸 크기 새로 그림 → **복제**(DT:167-184 · 듣개 · 축 함수 잃음) → `attachDetailZoom` 이 **자식 전부를 g 하나로 감쌈**(DT:124-148 · 164-1 「축 · 눈금째 한 장」) → 팬 · 줌 모두 축 · 눈금 · 축선 · clip 까지 같이 움직임. 줌도 같은 원리(ZP:89-92 · 124-131 둘 다 같은 layer transform).
|
||||
- 고칠 자리:
|
||||
- SV:550-567 `detailChart` → svg 와 함께 축 옵션 반환(`crossPlotFromBase(fitPlotBase(base, h), h)` VM:84-115 → pixelsPerMeter · maxOffset · displayMax · elevationMid · exaggeration) · SVT:41 · DT:40 타입 한 줄 · DSY:52 그대로 통과.
|
||||
- DT `attachDetailZoom`: 감싸기 지우고 layer = 복제의 `g.b06-chart__plot-layer` · `createCrossAxes(복제 g.b06-chart__axes, 옵션)` → onChange 에서 축 다시 그림 + 십자 `g.b06-chart__center` 크기 되돌림(FR:83-89 식 3줄). clip 은 고정이라 도형이 축 밖으로 안 넘침. 1배 팬 범위(content 3배 DT:143) 그대로.
|
||||
- CSD:56-79 표: 글자 `--text-caption`(12px) → `--text-body-sm`(14px) · 이름 칸 `th` 바탕 = 데이터 표 머리색 `color-mix(in srgb, var(--color-accent) 6%, var(--color-surface))`(DTB:10) · 글 본문색. 빈 칸 규칙 CSD:101-105 `background: none` 이 이름 칸 바탕까지 지움 → `td[data-key][data-empty]` 로 좁힘(이름 칸은 글만 회색).
|
||||
- 재사용: 카드 축 함수 AX 한 벌 · 공용 줌 ZP 무변 · 데이터 표 머리색 공식.
|
||||
- 시험: T test_164_detail_zoom(`wrapped` 단정 → 「도형 층에만 transform · 축 층 transform 없음 · 팬 뒤 눈금 글 바뀜」 · helper_164 가짜 svg 에 두 층) · test_173_areas_detail · helper_173_detail_fit(반환 꼴 바뀜) · test_150_detail_pick · test_138_cross_detail(무변 확인) · 새 CSS 단정(14px · th 바탕 · 빈 칸 td 한정).
|
||||
- 위험: SV 614줄 + ~6 · 표 커져 그림 칸 줄어듦(스크롤 없음 150-2 · 8줄 × ~4 px ≈ 32 px) · 강조 hover(0,3,0) · 고름(0,2,0)은 th 바탕(0,1,1)보다 셈 → 그대로 이김.
|
||||
- 크기: 중간.
|
||||
- ⬜ 표 글자: (가) 14px / (나) 16px(`--text-body` · 그림 칸 ≈ 60 px 더 줄어듦) — 추천 (가).
|
||||
|
||||
## W18. [상세] 표 — 행 · 열 더함 · 칸 값 그래프에서 고르기 · 우클릭 재지정
|
||||
- 현재 표: B07 납품 양식 고정(머리 넷 쌍 + 본문 6줄 × 좌 · 중 · 우 CT:25-55) · 값 = 서버 `cross_quantity_sheet`(RCT:44-60 → RS:262-302 `_quantity_table` → CQ:102-128 `derived_cells` · 면적 = 설계 칸 그대로 CQ:47-57 · 사면 계열 = 설계선 유도 CQ:81-89) · **표시 전용 · 저장 없음**(RCT:5 · DT:257-282 열 때 POST). 칸 누름 = 그림 강조만(DTP:17-36 · 47-70). B07 도면 표 높이 = 줄 수 × 5 mm(CT:363-366) → 장 배치가 씀.
|
||||
- 그래프에서 고를 수 있는 것(복제 svg · 듣개 없음 → `cad` 에 위임 듣개 하나):
|
||||
- 면적 = 면적 띠 다각형 `g.b06-chart__area--{cut_soil|cut_rock|fill}`(CA:224-227) · 사토장 `.b06-chart__spoil-fill` → 출처 = 띠 키 → 값 = 설계 면적 칸(CQ AREA_KEYS 와 같은 키 → **서버가 [저장] 때 그대로 다시 읽음 · ③**).
|
||||
- 길이 = 보라 판정 선 `.b06-chart__design-hit`(DP:314-321 · 직선 조각) → 화면 → m 환산 = `data-px-per-m` · `data-exaggeration`(CV:360-361) + 십자 x(0)(DTP:51-54 같은 꼴) → 길이 = `pieceMeasure`(DP:198-213 재사용). 원지반선 · 구조물 벽은 판정 선 없음(지금 못 고름).
|
||||
- CSD:129-133 이 모달 판정 선 손가락을 지워 둠 → 고르기 상태에서만 되살림.
|
||||
- 우클릭: 공용 `createMapContextMenu`(CM:82 · 한 번에 하나 규칙) — BE:227-231 꼴(document.body · 화면 고정 자리). 칸 메뉴 = 「그래프에서 고르기(면적)」「…(길이)」「자동값으로」「행 더함 · 열 더함 · 이 행/열 지움」 → 고르기 상태에서 그림 누름 = 그 칸 값.
|
||||
- 저장(정본 규칙 — 그림 = 횡단 설계가 낳은 값 → **횡단 설계 patch**): 새 칸 `detail_table`(예 `{rows:[{label, cells:[{src:"area", key} | {src:"length", from, to} | {text}]}], overrides:{표키: src}}`) · `structure_note` 길 그대로 — 세션 초안 `readState/writeState("detail-table")`(BPS:447-470 · DT:50-76 꼴) → [저장] PER:390-395 옆 → SCH:200-201 옆 필드 → 재계산에도 살림 목록 **짝 둘** RD:155-156 · CR:90-91 → 타입 AT:472-473 · 618-619. 자동저장 없음.
|
||||
- 고칠 자리: DT 320줄 → 표 손질 · 고르기 · 메뉴는 새 파일(`UI_Cross_Detail_Table.ts` 가칭) · DT 는 부르기만. (⬜ 덮어쓰기까지면) RS:292-302 `_quantity_table` 에 overrides 반영 한 곳(모달 · B07 도면 둘 다 이 함수 → 한 벌).
|
||||
- 재사용: 공용 우클릭 메뉴 · `pieceMeasure` · DTP 판정 꼴 · 세션 초안 꼴 · 모달 · (안 (다)) M02 면적산출 시트 + 칸 잇기(`M02_MasterTemplete_AreaCellPick.ts` · `_AreaLink.ts` · `A00_Common/spreadsheet/spreadsheet_link_set.ts`).
|
||||
- 시험: T 새 Node 시험(면적 출처 → 설계 칸 값 · 길이 = 두 끝 hypot · 우클릭 항목 · 세션 초안 → patch) · 새 pytest(RD ↔ CR 살림 목록 거울 · SCH 새 필드 · RCT 표 응답) · test_150_detail_pick · test_138_cross_detail · test_164_detail_zoom(무변 확인).
|
||||
- 위험: 길이 출처를 두 끝 m 로 두면 설계선이 바뀐 뒤 어긋남(서버 검산에서 설계선 위 아님 → 값 비우고 「다시 고름」) · 판정 선 조각은 벽 가림을 뺀 「보이는 조각」(DP:127 · 174 · 브라우저 그림에 묶임 → 서버가 같은 조각을 못 만듦) · B07 표에 찍으면 표 높이 · 폭 · 장 배치 · 셀 id(uuid5 CT:3) 영향 · AT 620줄(+ ~10) · 짝 목록 한쪽만 고치면 재계산 때 칸 사라짐.
|
||||
- 크기: 큼.
|
||||
- ⬜ 행 · 열의 자리: (가) 모달 전용 「추가 표」(납품 양식 표 아래 · B07 도면엔 안 찍힘) / (나) 납품 양식 표 자체를 늘림(B07 도면까지 · CT 표 그리기 · 장 배치 고침) / (다) 공용 스프레드시트를 모달에 끼움(행열 · 메뉴 · 잇기 다 있음 · 측점마다 책 저장 = patch 큼) — 추천 (가).
|
||||
- ⬜ 「열 · 행 추가」의 뜻: 그룹(깍기 · 측구 …) 안에 줄 더함 / 맨 끝에 새 항목 줄 · 새 열(비고 등) — 원문 모호 · 사용자 확인.
|
||||
- ⬜ 기존 칸(깍기 토사 등)도 그래프 값으로 덮나: (가) 더한 칸만 / (나) 기존 칸 덮어쓰기 + 「자동값으로」 되돌림(RS 한 곳) — 추천 (나)(우클릭 재지정 원문과 맞음).
|
||||
- ⬜ 길이 출처 검산: (가) 두 끝 m 저장 · 서버가 설계선 위인지 확인 후 hypot / (나) 값만 저장(5장 「브라우저 값 받아 적지 않음」 어긋남) — 추천 (가).
|
||||
|
||||
## 고칠 파일 목록
|
||||
|
||||
| 파일 | 줄 수 | 700 위험 | 요구 |
|
||||
|---|---|---|---|
|
||||
| `B06_Section/B06_Section_UI_Style_Cross_Controls.css` | 471 | 없음(− ~15) | W14 |
|
||||
| `B06_Section/B06_Section_UI_Style_Cross.css` | 628 | 낮음(± 2) | W16 |
|
||||
| `B06_Section/B06_Section_UI_Cross_Design.ts` | 527 | 없음((가) ± 2 · (나) + ~40) | W16 |
|
||||
| `B06_Section/B06_Section_UI_Cross_Card_Chrome.ts` · `ui_template/ui_template_locale_b2.ts` | 193 · — | 없음 | W16(알약 쪽) |
|
||||
| `B06_Section/B06_Section_UI_Cross_Detail.ts` | 320 | 없음(+ ~15 · 표 손질은 새 파일) | W17 · W18 |
|
||||
| `B06_Section/B06_Section_UI_Section_View.ts` | 614 | 중간(+ ~6) | W17 |
|
||||
| `B06_Section/B06_Section_UI_Section_View_Types.ts` · `_UI_Page_Design_Sync.ts` | 62 · 236 | 없음 | W17 |
|
||||
| `B06_Section/B06_Section_UI_Style_Cross_Detail.css` | 133 | 없음(+ ~8) | W17 · W18 |
|
||||
| 새 `B06_Section/B06_Section_UI_Cross_Detail_Table.ts`(가칭) | 0 | 새 파일 | W18 |
|
||||
| `B06_Section/B06_Section_UI_Page_Persist.ts` · `_Cross_Refresh.ts` · `_Api_Types.ts` | 462 · 407 · 620 | 낮음(AT + ~10) | W18 |
|
||||
| `B06_Section/B06_Section_Schema.py` · `_Router_Design.py` · (⬜) `B07_DesignDetail/B07_DesignDetail_Router_Support.py` | 353 · 618 · 615 | 낮음 | W18 |
|
||||
|
||||
- 안 고침: `B06_Section/B06_Section_UI_Cross_View.ts`(690줄 — W14 · W17 모두 손 안 댐) · `A00_Common/b_svg_zoom_pan.ts`(공용 · 무변) · `A00_Common/design/design_view_cross.ts`(680줄).
|
||||
- 겹침: W17 · W18 = 같은 모달 파일(DT · CSD) · 같은 시험(test_150 · 138 · 164) → 한 창이 차례로 · W15 · W16 = 같은 측구 줄(W16 (가)가 W15 혼동을 풂).
|
||||
@@ -0,0 +1,98 @@
|
||||
# 조사 X — B07 횡단 장 원지반 고르기 · 측점 한 벌 고르기 · 붉은 칸 보이기 · 표 배율 (10-10 · 읽기 전용 조사 에이전트)
|
||||
|
||||
사용자 원문 = `사용자요구_1010_2.md` 19 · 20 · 21번. 지난 기록 = 169-2(격자선 인쇄 · 넘친 칸 붉은 틀) · 174-1(칸 아래 가운데 표 → 글 → 그림 · 배치 판 5 · b5442ccc4).
|
||||
|
||||
| 약칭 | 파일 |
|
||||
|---|---|
|
||||
| Sheet | `B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py` |
|
||||
| Cad · Table | `B07_DesignDetail/B07_DesignDetail_Engine_Cad.py` · `…_Engine_Cad_Table.py` |
|
||||
| Support · Router | `B07_DesignDetail/B07_DesignDetail_Router_Support.py` · `…_Router.py` |
|
||||
| Page · Panels · Fetch | `B07_DesignDetail/B07_DesignDetail_UI_Page.ts` · `…_UI_Panels.ts` · `…_Api_Fetch.ts` |
|
||||
| Struct · Overlay | `B07_DesignDetail/B07_DesignDetail_UI_Cad_Structures.ts` · `…_Cross_Overlay.ts` |
|
||||
| owc | `B07_DesignDetail/openwebcad/src` |
|
||||
| host | `ui_template/cad_host/cad_host.ts` |
|
||||
|
||||
## 0. 코드 지도
|
||||
|
||||
| 항목 | 위치 | 역할 |
|
||||
|---|---|---|
|
||||
| 장 도면층 목록 | `Sheet:235-242`(원지반 `locked=True` `:236` · 도각 `:241`) | 장 레이어 선언 |
|
||||
| 측점 도면층 목록 | `Cad:624-631`(원지반 잠금 `:625`) | 측점 한 장 · 장 블록 공통 |
|
||||
| 측점 블록 만들기 | `Sheet:185-215` → `Cad:488-632` `build_cross_drawing` | 원지반 · 계획선 · 암 · 글 · 표 엔티티 |
|
||||
| 쌓기(174) | `Cad:545-550`(표 + 글 + 8 mm) · `:572-584`(글 · 표) · `:586-593`(틀) | 표 아래선 = 칸 아래 + `CELL_TABLE_PAD_MM`(`Sheet:52`) |
|
||||
| 넘침 판정 | `Sheet:209-213` | 틀이 칸 밖이면 `overflow_cells` |
|
||||
| 칸 격자선 | `Sheet:153-172` | 도각 층 `b08-frame` · 색 `#8ea0b5`(`Cad:34`) · 인쇄 · DXF 나감 |
|
||||
| 가이드(붉은 틀) | `Router:141-144` → `Page:335-340` → `owc/integration/guide-area.ts:105-125`(붉은 `#ff5252` `:28 · 122-123`) | CAD 겹판 · 저장 · DXF 안 섞임 |
|
||||
| 고르기 걸름(잠금) | `owc/state.ts:220-221`(집기) · `:355-362`(밝힘) · `:365-371`(선택) · `owc/tools/select-tool.helpers.ts:141-160`(사각형) · `owc/helpers/calculate-angle-guides-and-snap-points.ts:33`(스냅) | 잠금 층 객체는 어느 길로도 안 잡힘 |
|
||||
| 그룹 | `owc/helpers/entity-groups.ts:7-22` · `select-tool.helpers.ts:82-97` · 싣기 `owc/helpers/import-export-handlers/import-entities-from-json.ts:81-85` · 저장 `export-entities-to-json.ts:17-20` · 리본 GROUP · UNGROUP `owc/ribbon/ribbon.config.ts:116` | 한 개 집으면 같은 `groupId` 전부 선택 |
|
||||
| 층 선택 단추 | `owc/components/LayerManager.tsx:35-38 · 133` | 층의 객체 전부 선택 |
|
||||
| 화면 덧그림 | `Struct:63-97` · `Overlay:30-36 · 524-544` | 장의 설계선 · 구조물을 화면이 다시 그림(새 id · `groupId` 없음) |
|
||||
| 표 크기 상수 | `Table:88-90`(폭 108 · 행 5 · 글 2.0) · 제목 글 ×1.15 `:183` · 글 줄 3.0 `:323` · 글 크기 `:351` · `cross_table_width/height` `:360-367` | 종이 mm |
|
||||
| 배치 저장 | `Support:102`(판 5) · `:119-150`(읽기 · 검사 · 쓰기) · `Router:553-599` · `Fetch:182-185` | `cross_layout.json` = {default, sheets} |
|
||||
| 배치 칸 화면 | `Panels:182-232` · 자리 `Page:155-197`(「모든 장」 `:194`) · 횡단도 묶음 맨 아래 `Panels:149` | 「배치 열 · 행 · [이 장] · [모든 장]」 |
|
||||
|
||||
## 19. 원지반선 안 잡힘 · 측점 한 벌 고르기
|
||||
|
||||
현재: 장의 원지반 층 `b08-ground` = 잠금(`Sheet:236` · `Cad:625`) · 계획선 · 구조물 · 암 · 수량표 층은 안 잠김 · 도각(격자선 포함) 잠김. 엔티티에 `groupId` 없음 · 블록 없음 · 측점 구분은 id 씨앗(`{장id}:{측점}` `Sheet:188`)뿐.
|
||||
원인(확정): 잠금 층은 집기 · 사각형 · 밝힘 · 선택 · 스냅 다섯 길에서 모두 빠짐(0 지도 「고르기 걸름」) — 원지반이 처음부터 「배경」으로 잠겨 나옴(측점 한 장 시절 규칙 · `owc/state.ts:216-219 · 356-357` 주석). 코드 흠 아님 — 장에서 옮기기가 생기며 맞지 않게 된 설정.
|
||||
고칠 자리:
|
||||
- 원지반 잠금 풀기 — `Sheet:236` · `Cad:625` 의 `locked=True` 지움(횡단만 · 종단 `Engine_Cad_Long.py:671` 그대로).
|
||||
- 측점 한 벌 = `groupId` — `Sheet:214` 곁에서 그 측점 엔티티 전부(원지반 · 계획선 · 암 · 글 · 표)에 `groupId = uuid5(…, f"{seed_id}:group")` · `cross_placements` 에 `group_id` 실음.
|
||||
- 화면 덧그림도 같은 묶음 — `Struct:25-35` `CrossPlacement.group_id?` · `:80-83` 새 엔티티에 `groupId` 붙임(안 붙이면 설계선 · 구조물만 빠짐).
|
||||
- 격자선 · 도각 · 넘침 틀은 묶지 않음.
|
||||
재사용: openwebcad 그룹 고르기 · 저장 · 싣기 그대로(새 CAD 코드 없음) · UNGROUP 리본 단추 · `uuid5` 씨앗 꼴.
|
||||
시험: 새 `test_19x_b07_cross_group.py` — 장 2 × 2 에서 측점마다 `groupId` 하나 · 측점끼리 다름 · 격자선 · 도각엔 없음 · 원지반 층 `isLocked` 거짓 · placement `group_id` = 엔티티 값. `test_174` · `test_169_drawing_area_guide` · `test_b07_cross_sheet_pad` 그대로 통과 추정. 화면 덧그림은 `npm run typecheck`.
|
||||
위험: 그룹이면 선 하나만 집기 불가(Ctrl · Shift 클릭도 그룹 확장 `select-tool.helpers.ts:91-97`) → 낱개 손질은 UNGROUP 뒤. 원지반이 마우스에 밝아지고 지워질 수 있음(09-01 「배경은 안 밝힘」 규칙을 횡단만 걷음). 확정 장은 저장본 층 · 그룹 그대로 — [수정](다시 만듦 `Page` reopen → `invalidateDesignDrawing`) 때 새 꼴. CAD 고침 없음 → 빌드 불필요 · 백엔드 재시작.
|
||||
크기: 작음(파이썬 약 8줄 · 화면 약 4줄).
|
||||
⬜ 19-1 측점 한 벌 묶는 법 — (a) `groupId`(종류 층 그대로 · DXF 층 이름 그대로 · 한 번 클릭 = 한 벌) / (b) 측점별 층(「No.3」 · 층 관리 선택 단추로 한 벌 · 대신 종류 층 사라짐 → DXF 층 이름 · 덧그림 설계선 걷기 `Struct:89` · 수량표 고침 막기 `owc/integration/aislo-drawing-bridge.ts:121 · 157` 이 층 id 에 기대어 깨짐) — 추천 (a)(원문 「도면층」은 한 벌 고르기 뜻으로 읽음).
|
||||
⬜ 19-2 배치 판 — 올림(6 · 확정 장 전부 「옛 배치」 안내) / 그대로(배치 자리 같음 · [수정] 때 새 꼴) — 추천 그대로.
|
||||
|
||||
## 20. 붉은 칸 틀 보이기 / 숨기기
|
||||
|
||||
현재: 「붉은 격자선」 = 넘친 칸 틀(`guide.marks` · `#ff5252` 2 px · `guide-area.ts:122-123`) — 4 × 4 칸(192.5 × 130 mm)에 표(108 × 40) + 글 + 8 mm 를 빼면 그림 높이 약 77 mm(실 7.7 m)라 칸 다수가 붉게 칠해져 격자처럼 보임(추정). CAD 겹판이라 저장 · DXF 에 안 섞임(`guide-area.ts:8`). 인쇄되는 칸 격자선은 회청색 `#8ea0b5` · 도각 층(`Sheet:169`) — 붉은 선 아님. 끄는 단추 없음 · 가이드는 싣기 때 한 번만 받음(`owc/integration/aislo-drawing-bridge.ts:243`).
|
||||
고칠 자리:
|
||||
- `owc/integration/guide-area.ts` — 모듈 값 `marksVisible`(싣기 때 지우지 않음) · `drawGuide` 의 붉은 틀 줄 `:122-123` 을 그 값으로 거름 · 다시 그리기 불필요(rAF 상시 `owc/main.tsx:128`).
|
||||
- `owc/integration/aislo-drawing-bridge.ts:204-205` — 새 메시지 `aislo:b08:guide-marks {visible}` 한 줄(영역 메시지 꼴).
|
||||
- `host:37-38 · 362` — `setGuideMarks(visible)` (`setGuideArea` 꼴 · `postAfterLoad`).
|
||||
- `Panels:182-232` — 배치 칸 줄 끝에 ghost 단추 「붉은 칸 숨기기 / 보이기」(장일 때만 켬) · `Page:188-196` 에서 누름 → `cad.setGuideMarks` · 값은 모듈 변수(`reopenCrossSheet` 꼴 `Page:89`)로 다시 세운 화면에도 이어 줌.
|
||||
재사용: 배치 칸 단추 `action` 꼴(`Panels:204-223`) · 영역 메시지 길 · 넘침 토스트(`Page:338-340` · 숨김이면 토스트도 뺄지 ⬜).
|
||||
시험: `guide-area.test.ts` 에 「숨김 뒤 setGuide 해도 숨김 유지」 · `helper_153_b07_cross_layout.cjs` + `test_153_1` 에 단추 있음 · 장 아니면 꺼짐 · 누름 콜백 · `npm run typecheck`.
|
||||
위험: 공용 `host` 고침 → M02 · B08 영향 없음(새 메서드만) · 알릴 일. `Page` 600줄(700 안).
|
||||
빌드: CAD 고침 → `npm --prefix B07_DesignDetail/openwebcad run build` + 리로드.
|
||||
크기: 작음(CAD 약 8줄 · 화면 약 15줄).
|
||||
⬜ 20-1 단추가 끄는 것 — (a) 붉은 넘침 틀만 / (b) 붉은 틀 + 파란 점선 작도 영역 / (c) 인쇄되는 회청 칸선까지(칸선을 새 층 「칸 격자」로 떼어 층 끄기 · DXF 는 층 숨김을 안 봄 `Engine_Frame_Export.py:219-235` 이라 그대로 나감) — 추천 (a).
|
||||
⬜ 20-2 자리 — 좌측 「횡단도」 묶음 안 배치 칸 줄(추천 · 원문 「횡단도 컨테이너 내부」) / CAD 리본.
|
||||
|
||||
## 21. 표 · 글 배율(기본 1)
|
||||
|
||||
현재: 표 = 폭 108 · 행 5 × 8행(40) · 글 2.0(`Table:88-90`) · 제목 ×1.15(`:183`) · 표 위 글 줄 3.0 · 글 2.0(`:323 · 351`) · 고정 상수. 그림 속 구조물 글자는 화면 `Overlay:36` 2.0. 배율 칸 · 저장 자리 없음.
|
||||
고칠 자리:
|
||||
- `Table` — `_cross_table_entities` · `_cross_note_entities` · `cross_note_height` · `cross_table_width` · `cross_table_height` 에 곁값 `scale=1.0`(폭 · 행 높이 · 글 · 줄 높이 곱함).
|
||||
- `Cad:488-500` `build_cross_drawing(table_scale=1.0)` → 쌓기 `:549` · 표 `:578-584` · 틀 `:589-590` 에 같은 값 — 174 쌓기(표 아래선 고정 · 글 · 8 mm · 그림 위로)와 넘침 판정(`Sheet:210-213` 이 틀로 셈)이 **자동으로 같이 다시 셈**. 8 mm 간격 · `CELL_TABLE_PAD_MM` 은 그대로.
|
||||
- `Sheet:124-150` 장 dict 에 `table_scale`(배치에서) · `:197-208` 넘김 · `section_block_size :67-101`(시험 전용)도 같은 곁값.
|
||||
- `Support:119-136` `checked_cross_layout` 이 `table_scale` 지킴(지금은 모르는 칸을 버림) · 범위 검사 · `Router:553-557` 요청 칸 · `Fetch:182-185` 타입.
|
||||
- `Panels:182-232` 숫자 칸 「표 배율」(step 0.1 · 기본 1) · `Page:194` [모든 장] 저장이 `{default, sheets: {}}` 로 배율을 지우지 않게 펼쳐 넣음.
|
||||
재사용: `cross_layout.json` 한 파일 · 배치 칸 입력 꼴(`createInputField compact`) · 저장 → 화면 다시 세우기 길(`Page:173-187`).
|
||||
시험: `test_174` 늘림 — 배율 1.5 에서 표 폭 162 · 높이 60 · 행 안 표 아랫선 같음 · 그림 아래 = 표(+글) 위 8 mm · 표가 칸보다 넓으면 `overflow_cells` · 배율 1 = 지금과 같은 수. `test_140:122`(배치 기본 dict 통째 비교) 기대값 고침. `test_153_1` 칸 하나 더.
|
||||
위험: 확정 장은 저장본 크기 그대로(배치 바꿈은 담긴 측점이 바뀐 장만 풂 `Support:138-150`). 배율 ≥ 약 1.78 이면 4 × 4 칸 폭 넘침. `Cad` 632줄 · `Support` 615줄 · `Router` 599줄(700 안). 백엔드 재시작 · CAD 빌드 불필요.
|
||||
크기: 중간 아래(파이썬 약 30줄 · 화면 약 12줄).
|
||||
⬜ 21-1 값 하나 / 둘 — 표 · 글 한 배율(추천) / 표 · 글 따로.
|
||||
⬜ 21-2 범위 · 단위 — 장 전부 한 값(추천) / 장마다 · 범위 0.5~2.0(추천).
|
||||
⬜ 21-3 「텍스트」 — 표 + 표 위 글만(추천 · 서버 한 곳) / 그림 속 구조물 글자도(`Overlay:36` 에 placement 로 배율 실음).
|
||||
⬜ 21-4 확정 장 — 그대로 + 안내(manifest 에 배율 적고 다르면 「옛 배치」 꼴 · 추천) / 배율 바꾸면 확정 장 전부 풂.
|
||||
|
||||
## 고칠 파일 목록
|
||||
|
||||
- `B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py` — 원지반 잠금 풂 · groupId · 배율 넘김
|
||||
- `B07_DesignDetail/B07_DesignDetail_Engine_Cad.py` — 원지반 잠금 풂 · `table_scale`
|
||||
- `B07_DesignDetail/B07_DesignDetail_Engine_Cad_Table.py` — 크기 함수 배율
|
||||
- `B07_DesignDetail/B07_DesignDetail_Router_Support.py` · `B07_DesignDetail_Router.py` · `B07_DesignDetail_Api_Fetch.ts` — `table_scale` 저장
|
||||
- `B07_DesignDetail/B07_DesignDetail_UI_Cad_Structures.ts` — 덧그림 groupId
|
||||
- `B07_DesignDetail/B07_DesignDetail_UI_Panels.ts` · `B07_DesignDetail_UI_Page.ts` — 붉은 칸 단추 · 배율 칸
|
||||
- `ui_template/cad_host/cad_host.ts` — `setGuideMarks`
|
||||
- `B07_DesignDetail/openwebcad/src/integration/guide-area.ts` · `aislo-drawing-bridge.ts` — 붉은 틀 보이기 값 · 메시지(CAD build)
|
||||
- 시험: 새 `test_19x_b07_cross_group.py` · `test_174_b07_cross_cell_stack.py` · `test_140_b07_cross_grid.py` · `test_153_1_b07_cross_layout.py`(+ helper) · `guide-area.test.ts`
|
||||
|
||||
## 추천 차례
|
||||
|
||||
19(파이썬만 · 작음) → 21(파이썬 + 배치 칸) → 20(CAD 빌드 한 번) · 20 · 21 단추 · 칸은 같은 배치 칸 줄에 한 번에.
|
||||
@@ -0,0 +1,156 @@
|
||||
# 조사 Y — B09 탭 두 층 · 박스보기 · 설계내역서 손 줄 레벨 (10-10 둘째 · 요구 22 · 23 · 29 · 30 · 읽기 전용 조사 에이전트)
|
||||
|
||||
| 약칭 | 뜻 |
|
||||
|---|---|
|
||||
| `B09/` | `B09_Estimation/B09_Estimation_` |
|
||||
| `B08/` | `B08_Quantity/B08_Quantity_` |
|
||||
| `ui/` | `ui_template/ui_template_` |
|
||||
| 손 줄 | 166-2 설계내역서 사용자 줄(`user.bill.rows` · 키 `hand:…`) |
|
||||
| 「추정」 | 화면 실측 없이 코드 · CSS 셈으로 낸 판단 |
|
||||
|
||||
## 0. 코드 지도
|
||||
|
||||
| 자리 | 파일:줄 | 줄 수 |
|
||||
|---|---|---|
|
||||
| 탭 키 · 이름 · 차례(평평한 한 줄 19) | `B09/UI_Tabs.ts:13-32 · 35-55` | 168 |
|
||||
| 탭 줄 그리기 · 이동 · 묶음 탭 갈래 | `B09/UI_Shell.ts:151 · 182-254` | 332 |
|
||||
| 탭 줄 CSS(sm 단추 · gap 4) | `B09/UI_Page.css:20-26` | 45 |
|
||||
| B08 위 탭(md) · 보조 탭(sm) · 빈 보조 줄 | `B08/UI_Page.ts:30-44 · 56-83 · 90-100 · 118-134` · `B08/UI_Page.css:14-25` | 154 · 62 |
|
||||
| 묶음 보기 단추 · 카드 · 표 갈래 | `B09/UI_Tabs_Groups.ts:31-35 · 165-207` | 207 |
|
||||
| 공용 묶음 카드(요약 접기 · 강조) | `ui/group_cards.ts:71-80 · 187-247` · `.css:79-85 · 131-134` | 249 · 153 |
|
||||
| 공용 표 강조 한 줄(`focusRow`) | `ui/data_table.ts:288-292` · `.css:148-152` | 294 · 174 |
|
||||
| 설계내역서 표 · 손질 · 우클릭 | `B09/UI_Tabs_Bill.ts:23-81` · `B09/UI_Tabs_Bill_Edit.ts:72-242` | 81 · 242 |
|
||||
| 설계내역서 셈(짝) | `B09/Calc_Bill.ts:28-43 · 237-266` ↔ `B09/Calc_Bill.py:33-52 · 246-275` | 299 · 310 |
|
||||
| 손 줄 저장 다듬기 | `B09/Store.py:111-138` | 208 |
|
||||
|
||||
## Y29 · Y30. 원가검토 탭 = 상위 · 하위 두 층
|
||||
|
||||
### 현재 탭 19 + 새 자리
|
||||
|
||||
| 차례 | 키 | 지금 이름 | 짜는 파일:줄 | 새 상위 · 하위 차례 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | `check` | 연결 점검 | `B09/UI_Tabs.ts:139` | 상위 단독 |
|
||||
| 2 | `cost` | 공사원가계산서 | `B09/UI_Tabs_Total.ts:245` | 상위 단독 |
|
||||
| 3 | `total` | 총괄설계내역서 | `B09/UI_Tabs_Total.ts:81` | 상위 단독 |
|
||||
| 4 | `bill` | 설계내역서 | `B09/UI_Tabs_Bill.ts:23` | 상위 단독 |
|
||||
| 5 | `dg_list` | 일위대가목록표 | `B09/UI_Tabs_Labor.ts:45` | 일위대가 ① |
|
||||
| 6 | `dg` | 일위대가표 | `B09/UI_Tabs_Labor.ts:78` | 일위대가 ② |
|
||||
| 7 | `sg_list` | 단가산출근거목록표 | `B09/UI_Tabs_Sangeun.ts:39` | 단가산출 ① |
|
||||
| 8 | `sg` | 단가산출근거 | `B09/UI_Tabs_Sangeun.ts:76` | 단가산출 ② |
|
||||
| 9 | `basis` | 환율및기초자료 | `B09/UI_Tabs_Base.ts:63` | 상위 단독(사용자 목록에 없음) |
|
||||
| 10 | `machine` | 중기목록표 | `B09/UI_Tabs_Base.ts:237` | 중기 ① |
|
||||
| 11 | `machine_blocks` | 중기사용료 | `B09/UI_Tabs_Base.ts:263` | 중기 ② |
|
||||
| 12 | `material` | 재료비목록표 | `B09/UI_Tabs_Base.ts:210` | 재료 ① |
|
||||
| 13 | `labor` | 노무비목록표 | `B09/UI_Tabs_Base.ts:45` | 노무 ① |
|
||||
| 14 | `expense` | 경비목록표 | `B09/UI_Tabs_Base.ts:52` | 중기 ④ |
|
||||
| 15 | `compare` | 자재단가대비표 | `B09/UI_Tabs_Base.ts:116` | 재료 ②(사용자 글 「자재단가목록표」) |
|
||||
| 16 | `sum_material` | 재료비수량금액집계표 | `B09/UI_Tabs_Summary.ts:57` | 재료 ③ |
|
||||
| 17 | `sum_labor` | 노무비수량금액집계표 | `B09/UI_Tabs_Summary.ts:58` | 노무 ② |
|
||||
| 18 | `sum_expense` | 경비수량금액집계표 | `B09/UI_Tabs_Summary.ts:59` | 중기 ⑤(166-5 · 자원 0 → 안내 한 줄) |
|
||||
| 19 | `sum_machine` | 중기시간금액집계표 | `B09/UI_Tabs_Summary.ts:61` | 중기 ③ |
|
||||
|
||||
- 새 상위 10 = 연결 점검 · 공사원가계산서 · 총괄설계내역서 · 설계내역서 · 일위대가 · 단가산출 · 환율및기초자료 · 중기 · 재료 · 노무(지금 차례 그대로 묶음 첫 자리).
|
||||
- 이름 짝 — 다른 것은 「자재단가목록표」 ↔ `compare` 「자재단가대비표」 하나. 사용자 25 · 26 · 28번 글은 「대비표」.
|
||||
- 없는 탭 — 없음. 중기시간금액집계표 · 경비수량금액집계표 · 노무비수량금액집계표 · 재료비수량금액집계표 넷 모두 있음(`B09/UI_Shell.ts:82-85`).
|
||||
- 하위 차례가 엑셀 평평 차례와 다른 곳 = 중기(경비목록표 · 집계표 둘이 중기 뒤로) · 재료(대비표가 재료비목록표 뒤).
|
||||
|
||||
### B08 양식(본뜰 꼴)
|
||||
|
||||
- 위 탭 = `createButton` 기본 md(`B08/UI_Page.ts:122-126` · size 없음) · 보조 탭 = sm 줄 `div.b08-quantity__tabs`(`:57-75`) · 보조 탭 없는 탭 = 보이지 않는 sm 단추 한 줄로 높이만 채움(170-4 · `:90-100` · CSS `:22-25`) → 탭 바꿀 때 몸통이 안 튐.
|
||||
- CSS = `.b08-quantity__tabs` gap 8 · 아래 8 · 밑줄 1px(`B08/UI_Page.css:14-20`) — B08 파일 안 클래스 · `ui/` 공용 탭 양식은 없음(`tablist` 쓰는 곳 = B08 · B09 · M02 DF · `ui/cad_host/cad_host_tabs.ts`(CAD 장 탭 · 결 다름)).
|
||||
- B09 지금 = 한 줄 sm 19개(`B09/UI_Shell.ts:184-197`) · gap 4(`B09/UI_Page.css:23`).
|
||||
|
||||
### 고칠 자리
|
||||
|
||||
- `B09/UI_Tabs.ts` — `TABS`(엑셀 차례 · 탭 이름 · 표 caption · 연결 점검 「탭」 칸)는 그대로 · 새 `TAB_GROUPS: [상위 키, 이름, 하위 TabId[]][]` + `groupOf(tab)` 더함(+20줄).
|
||||
- `B09/UI_Shell.ts:184-197` — 위 줄 = 상위 10(md) · 아래 줄 = 고른 상위의 하위(sm) · 하위 하나뿐인 상위 = 빈 보조 줄(B08 170-4 꼴) · 위 탭 누름 = 그 묶음에서 마지막 본 하위(이 화면 안 Map) 없으면 첫 하위 · `show(tab, focus)` 는 TabId 그대로 받아 상위를 `groupOf` 로 정함 → 이동(`goto` `:205-207` · 연결 점검 줄 · 목록표 → 상세)이 묶음을 넘어도 그대로.
|
||||
- `B09/UI_Page.css:20-26` — 위 줄 gap 8(B08 값) · 보조 줄 · 빈 줄 규칙 둘(B08 css 본뜸 · +10줄).
|
||||
|
||||
### 재사용 · 기억 영향
|
||||
|
||||
- `createButton` md · sm · `role=tab` · `aria-selected` · `data-b09-tab`(그대로 하위 키 · 상위엔 `data-b09-group`).
|
||||
- 탭 기억 — 지금 없음: `current = "check"`(`B09/UI_Shell.ts:151`) · 해시 · sessionStorage 안 씀(`location.hash` 는 라우터만 `A00_Common/router.ts:122`) → 들어올 때마다 「연결 점검」. 두 층으로 바꿔도 같음.
|
||||
- 보기 기억 `b09-group-view` · `b09-group-cols`(`A00_Common/b_page_state.ts:70-71`)는 하위 키(dg · machine_blocks · sg) 그대로 → 영향 없음.
|
||||
|
||||
### 시험 · 위험 · 크기
|
||||
|
||||
- 시험 — `test_144_b09_skeleton.py:44-49`(`TABS` 엑셀 차례 · 안 바꾸면 통과) · 새 판정(상위 10 차례 · 하위 묶음 = 사용자 30번 차례 · 19 키 빠짐 · 겹침 없음 · `groupOf` · 묶음 넘는 이동 = 상위 켜짐 · 단독 상위 = 빈 보조 줄).
|
||||
- 위험 — 위 탭 md 10개 + 보조 줄 = 탭 머리 높이 ≈ +36px(추정 · sm 줄 하나 더) · 「연결 점검」 「탭」 칸은 하위 이름만(상위 안 보임).
|
||||
- 크기 — TS +45 · CSS +10 · Shell 332 → 360.
|
||||
- ⬜ Y30-a 「자재단가목록표」 = `compare` 이름을 바꿈? — 추천 그대로 「자재단가대비표」(엑셀 탭 이름 · test_144 · 25 · 26 · 28번 글).
|
||||
- ⬜ Y30-b 「환율및기초자료」 자리 — 추천 지금 차례(단가산출과 중기 사이 상위 단독).
|
||||
- ⬜ Y30-c 위 탭 다시 누름 = 마지막 본 하위(가 · 추천 · 저장 안 함) / 늘 첫 하위(나 · B08 꼴).
|
||||
|
||||
## Y22. 「호표별 보기」 → 「박스보기」 · 접기 없앰 · 목록표 고른 호표 = 붉은 외곽선
|
||||
|
||||
### 현재
|
||||
|
||||
- 단추 글 = `viewLabel`(`B09/UI_Tabs_Groups.ts:32-33` · 「호표별 보기」 ↔ 「표로 보기」) · 묶음 탭 = dg · machine_blocks · sg(`:27`).
|
||||
- 접기 = 묶음 12 넘으면 요약 보기(`ui/group_cards.ts:71 · 80 · 187-189 · 218-225 · 236-237` · CSS `.is-closed` `:79-85`) · 공용 카드 쓰는 곳 = B09 하나(`B09/UI_Tabs_Groups.ts:192`).
|
||||
- 목록표 → 상세 — 일위대가목록표 `link` = `{tab: "dg", key: 블록 id}`(`B09/UI_Tabs_Labor.ts:68`) · 산근목록표 = `{tab: "sg", key}`(`B09/UI_Tabs_Sangeun.ts:61`) · 중기목록표 → 중기사용료도 같은 꼴(`B09/UI_Tabs_Base.ts:253`) → `show(tab, key)`(`B09/UI_Shell.ts:205-207`) → focus = 블록 머리 줄 번호(`B09/UI_Tabs_Groups.ts:189`).
|
||||
- 박스 강조 지금 = 머리 띠 한 줄만 `is-focus`(accent 8% 바탕 · `ui/group_cards.ts:241-247` · CSS `:131-134`).
|
||||
- 표 강조 지금 = 머리 줄 한 줄 `focusRow`(accent 밑줄 2px · `ui/data_table.ts:288-292` · CSS `:148-152`) · 표는 줄 28px 창 그리기(`ui/data_table.ts:239`) → 줄 class 는 `rowClass` 로만 오래 감.
|
||||
|
||||
### 고칠 자리
|
||||
|
||||
- `B09/UI_Tabs_Groups.ts:33` — 「호표별 보기」 → 「박스보기」.
|
||||
- `ui/group_cards.ts` — 요약 보기 지움(`GROUP_SUMMARY_OVER` · `isSummary` · `is-closed` · [모두 펼침 · 접기] · 머리 누름 펼침) · 이동해 온 키 = 그 박스(`article`)에 `is-pick`(몸 줄이면 그 줄 `is-focus` 도 유지) · CSS = B06 고름 꼴 `border-color: var(--color-danger); box-shadow: 0 0 0 2px var(--color-danger)`(`B06_Section/B06_Section_UI_Style_Cross.css:219-222`) · `.is-closed` 규칙 지움.
|
||||
- 표 보기 — `B09/UI_Tabs_Groups.ts:204-205` · `B09/UI_Shell.ts:208` `makeTable(extra?)` 에 줄 class 곁값 → 고른 블록(키 `|` 앞머리 같은 줄 구간) = `is-pick` + 첫 줄 `is-pick-top` · 끝 줄(합계 · 총계) `is-pick-end` · CSS(`B09/UI_Page.css`) = 안쪽 그림자 4면 danger 2px(첫 칸 왼 · 끝 칸 오른 · 위 · 아래) · 머리 줄 accent 밑줄은 `is-pick` 안에서 덮음 · 스크롤 = `focusRow(머리)` 그대로.
|
||||
- 공용 표(`ui/data_table.ts`)는 안 고침(`rowClass` 곁값으로 끝남).
|
||||
|
||||
### 재사용 · 시험 · 위험 · 크기
|
||||
|
||||
- 재사용 — `--color-danger`(밝음 #c0392b · 어두움 #e8695a · `ui/theme.css:40 · 323`) · 164-2 「표 강조 = 붉은 한 벌」 · B06 카드 고름 CSS · `rowIndex` · 묶음 키 규칙(`B09/UI_Tabs_Groups.ts:136`).
|
||||
- 시험 — `test_157_2_b09_sangeun_views.py:69` · `test_171_3_b09_group_tabs.py:165`(글 「박스보기」) · `test_171_2_group_cards.py:42-50 · 114-136`(요약 판정 → 「13 묶음도 접힘 없음 · 머리 누름 = 이동 없음 · 고른 박스 `is-pick`」) · 새 판정(표 보기 블록 구간 class · 첫 · 끝 줄 · 다른 블록 없음).
|
||||
- 위험 — 묶음이 많은 탭(산근 수십) = 다 펼쳐져 길어짐(요구대로 · 박스 찾기는 목록표 누름 → 스크롤) · OS 어두움 자동 블록엔 danger 어두운 값 없음(R12 공용 빈틈 · 범위 밖).
|
||||
- 크기 — 공용 TS −25 +6 · CSS −7 +4 · Groups +12 · Shell +3 · B09 CSS +12.
|
||||
- ⬜ Y22-a 글 = 「박스보기」(사용자 글 그대로 · 추천) / 「박스 보기」 · 맞은편 「표로 보기」 유지.
|
||||
|
||||
## Y23. 설계내역서 손 줄 레벨 · 상위 합계 · 연결(우클릭 + 단추)
|
||||
|
||||
### 현재
|
||||
|
||||
- 줄 꼴 = 제목(`kind: "title"` · 고정 공종 나무 14 `B09/Calc_Bill.ts:28-43`) · 항목(`kind: "item"`) 둘뿐 · 레벨 칸 없음 · 공종 번호 깊이 = 2(1 → 1.1) · 합계 = 항목이 자기 공종 + 부모 하나에 더함(`B09/Calc_Bill.ts:240-249` ↔ `.py:250-260`) · 짝 맞음(⚠ 머리 주석 · 거울 `test_166_2_b09_bill_hand.py:125-135` 전체 같음 판정).
|
||||
- 화면 레벨 표시 = 항목 이름 앞 빈칸 둘뿐(`B09/UI_Tabs_Bill.ts:28`) · 제목 굵게 없음(`rowClass` = `is-hand` 만 `:74`) · 1 토공사 · 1.1 준비공이 같은 꼴.
|
||||
- 손 줄 저장 = `user.bill.rows[] {key hand:… · section · after · name · spec · unit · qty · ref}`(`B09/UI_Tabs_Bill_Edit.ts:7 · 87` · 다듬기 `B09/Store.py:111-138` · 저장 `user_values.json`) · 자리 = `after` 줄 뒤(`B09/Calc_Bill.ts:147-152`) · 손 줄은 늘 항목(수량 × 단가).
|
||||
- 연결 = 우클릭 [연결 ▸ 일위대가 호표 · 단가산출 호표 · M01 로직](`B09/UI_Tabs_Bill_Edit.ts:194-206`) · 고르기 창 = `openModal` + 공용 `createFindList`(`:116-151`) · 로직 = M02 `openLogicPicker` + `openLaborInput`(`:154-183`) — 이미 있음 · 단추는 없음.
|
||||
- 다른 고르기 창 — B08 [선택] = `openItemPicker`(구조물 조합 고름 · `B08/UI_Link.ts:46`) · 호표가 아니라 조합 → 이번엔 안 맞음.
|
||||
|
||||
### 고칠 자리
|
||||
|
||||
- 저장 꼴 — 손 줄 곁값 둘: `kind`(`"group"` = 묶음 줄 · 없음 = 항목) · `parent`(묶음 손 줄 키 · 없음 = 공종 바로 아래). 묶음 줄 = 수량 · 연결 없음(이름만).
|
||||
- 셈(짝 ① · `B09/Calc_Bill.ts` ↔ `.py` 함께) — 묶음 줄 = `itemRow` 안 거침(「연결 없음」 거짓 목록 안 생김) · 금액 = 자손 항목 합 + 「빈 줄 n」 · 공종 합(`:240-249`)은 항목(잎)만 → 원가계산서 `sums` 그대로 · 줄마다 `level` 내보냄(1 = 1 토공사 · 2 = 1.1 · 3 = 그 안 항목 · 손 묶음 + 1 …) · `parent` 못 찾으면 공종 바로 아래(옛 저장도 그대로 읽힘).
|
||||
- `B09/Store.py:122-130` — `kind` · `parent`(`hand:` 시작만) 남김 · 묶음 줄 `qty` · `ref` = None.
|
||||
- `B09/UI_Tabs_Bill_Edit.ts` — 우클릭 더함: [아래에 하위 줄 추가](묶음 줄 · 자리 = 마지막 자손 뒤) · [묶음 줄로 · 항목으로] · [들여쓰기 → · 내어쓰기 ←](= `parent` 바꿈) · 지울 때 자식은 지운 줄 부모로(`:92-99` `after` 꼴).
|
||||
- `B09/UI_Tabs_Bill.ts` — 이름 앞 빈칸 대신 `rowClass` = `is-lv{n}`(+ `is-hand`) · CSS(`B09/UI_Page.css`) Lv1 = 16px 굵게 · Lv2 = 14px 굵게 · Lv3 = 14px · Lv4+ = 13px · 첫 칸 들여쓰기 1em × (레벨 − 1) · 묶음 손 줄 = 굵게.
|
||||
- 단추 — 손 줄 「비고」 칸 앞 새 좁은 칸 「연결」(글 「연결 ▾」 · 연결됨 = 호표 번호) · 누름(`onCell`) = 우클릭과 같은 [연결 ▸] 메뉴를 그 칸 자리에 엶(`ctxMenu.open` · 칸 `getBoundingClientRect`) · 이 칸은 `link` null(이동 안 함).
|
||||
|
||||
### 재사용 · 계산 자리
|
||||
|
||||
- `pickHopyo`(dg · sg 목록 · `createFindList`) · `openLogicPicker` · `openLaborInput` · 공용 우클릭 메뉴(`ui/context_menu.ts:130` `open(x, y, items)` · 겹 메뉴) · `rowClass` 여러 class(빈칸으로 이음 · `ui/data_table.ts:164`) · 집계표는 `kind !== "item"` 건너뜀(`B09/Summary.py:53`) → 묶음 줄 안전 · 산근 손 로직(`B09/Sangeun.py:477-489`)은 `ref.tab == "logic"` 만 → 묶음 줄 안 걸림.
|
||||
- 계산 자리 = ① 파이썬 · TS 짝(이미 짝 · 조작 중 브라우저 · [저장] 때 서버 정본) · 서버 단독 아님(조작 즉시 합계 보여야 함) · 새 계산 없음 — 합 규칙만 더함.
|
||||
|
||||
### 시험 · 위험 · 크기
|
||||
|
||||
- 시험 — `test_166_2_b09_bill_hand.py`(자리 · 거울 · 저장 다듬기) 손봄 + 새 판정(묶음 줄 합 = 자손 합 · 겹 묶음 · 공종 합 · `sums` 안 바뀜 · 빈 줄 n · 부모 없음 = 공종 아래 · 옛 꼴 그대로 · `level` 값 · TS 거울 · 다듬기 `kind` · `parent`) · `test_145_3_b09_bill.py`(rows 에 `level` 더해짐 → 판정 손봄 여부 확인) · `test_145_5`(집계표 · 묶음 줄 빼고 셈).
|
||||
- 위험 — ① 표가 줄 28px 고정 창 그리기 → 글자 16px 넘으면 줄 높이 어긋남(16px 까지) ② 1 토공사 굵게 · 크게로 지금 화면 꼴이 다 바뀜 ③ `after` 차례와 `parent` 가 어긋나면(자식이 부모 앞) 합은 맞고 들여쓰기만 이상 → 끼울 때 마지막 자손 뒤 규칙 ④ 둘 짝 한쪽만 고치면 거울 깨짐.
|
||||
- 크기 — Calc_Bill ts 299 → 335 · py 310 → 350 · Bill_Edit 242 → 300 · Bill 81 → 95 · Store +5 · CSS +12.
|
||||
- ⬜ Y23-a 저장 꼴 = `parent` 키(가 · 추천 · 차례가 흔들려도 합 맞음) / `level` 수(나 · 엑셀 윤곽 꼴 · 차례로 부모 짐작).
|
||||
- ⬜ Y23-b 손 줄로 새 1단 공종(예 「5 부대공」) 허용? — 추천 안 함(고정 공종 안에서만 · 원가계산서 직접비 1~4 합 규칙 그대로) · 필요하면 직접비에 넣을지 따로 정함.
|
||||
- ⬜ Y23-c 손 묶음 깊이 한도 — 추천 2(묶음 안 묶음까지 · Lv5) · 글자 13px 바닥.
|
||||
- ⬜ Y23-d 자동 줄(B08 수량 줄)도 손 묶음 아래로 옮김? — 추천 안 함(자동 줄은 공종 고정 · 손 줄만).
|
||||
|
||||
## 고칠 파일 목록
|
||||
|
||||
| 파일 | 지금 | 뒤(추정) | 700 | 요구 |
|
||||
|---|---|---|---|---|
|
||||
| `B09_Estimation/B09_Estimation_UI_Tabs.ts` | 168 | 190 | 없음 | 29 · 30 |
|
||||
| `B09_Estimation/B09_Estimation_UI_Shell.ts` | 332 | 365 | 없음 | 29 · 30 · 22 |
|
||||
| `B09_Estimation/B09_Estimation_UI_Page.css` | 45 | 80 | 없음 | 29 · 30 · 22 · 23 |
|
||||
| `B09_Estimation/B09_Estimation_UI_Tabs_Groups.ts` | 207 | 220 | 없음 | 22 |
|
||||
| `ui_template/ui_template_group_cards.ts` · `.css` | 249 · 153 | 230 · 150 | 없음 | 22 |
|
||||
| `B09_Estimation/B09_Estimation_Calc_Bill.ts` · `.py` | 299 · 310 | 335 · 350 | 없음 | 23(짝) |
|
||||
| `B09_Estimation/B09_Estimation_Store.py` | 208 | 213 | 없음 | 23 |
|
||||
| `B09_Estimation/B09_Estimation_UI_Tabs_Bill_Edit.ts` | 242 | 300 | 없음 | 23 |
|
||||
| `B09_Estimation/B09_Estimation_UI_Tabs_Bill.ts` | 81 | 95 | 없음 | 23 |
|
||||
| 시험 — `test_144_b09_skeleton` · `test_157_2` · `test_171_2` · `test_171_3` · `test_166_2` · `test_145_3` · `test_145_5` + 새 시험 | — | — | — | 22 · 23 · 29 · 30 |
|
||||
@@ -0,0 +1,78 @@
|
||||
# 조사 ZA — 관급(관급자재) 구현 여부
|
||||
|
||||
요구 27 · 조사만(코드 안 고침) · 기준 = 지금 `main_laptop_1` 작업 트리 · 상태 = 됨 / 일부 / 없음.
|
||||
|
||||
## 1. 한눈 결론
|
||||
|
||||
- **원가 계산 끝단은 됨** — 관급자재대 = 순자재대 + 조달수수료 → 천원 올림 · 도급공사비 밖 · 총공사비에 더함 · 일반관리비 · 이윤 · 부가세 밑수에서 빠짐 · 안전관리비 A/B 비교까지 실무 엑셀(기번3) 숫자와 같음.
|
||||
- **관급 표시는 B09 자재단가대비표 한 곳뿐** — 「관급 · 별도」 칸 누름으로 바꿈 · 기본 관급은 파형강관 하나.
|
||||
- **M02 자재구분(관급 · 사급)은 저장 · 화면만** — B09 가 안 읽음 → 마스터 · 사본에서 「관급」으로 골라도 원가에 안 이어짐.
|
||||
- **같은 자재가 두 줄(B08 총괄 줄 · 일위대가 안 자재 줄)** — 관급 표시를 따로 해야 함 · 한쪽만 하면 두 번 셈 또는 사라짐 · 커플링밴드는 기본 관급 아님 → 내역서에서 빠짐.
|
||||
- **엑셀 내보내기 없음** · 조달수수료율 기본값 없음(빈칸이면 관급자재대 · 총공사비가 빈칸).
|
||||
|
||||
## 2. 흐름 단계 표
|
||||
|
||||
| 단계 | 상태 | 지금 어떻게 | 근거 파일:줄 | 빈틈 |
|
||||
|---|---|---|---|---|
|
||||
| M02 자재구분 칸 | 일부 | 일위대가 자재 줄 · 로직 자재 줄에 「관급 · 사급」 드롭다운 · 빈 칸 = 사급(162-1) · 금액 무관 | M02_Labor_Doc.py:49-54 · :222-224 · M02_MasterTemplete_Labor_Api.ts:143 · :150-151 · M02_MasterTemplete_Labor_MatMarks.ts:3 | 저장만 · `mark_of` 를 시험 말고 부르는 곳 없음 |
|
||||
| 프로젝트 사본(구조물) 자재구분 | 일부 | 사본 일위대가에 그대로 실림(검증 프로젝트에 「관급」 표시 실제 있음 · 아래 5) | storage …/d2245e3b…/templates/structures/pipe@263.21/일위대가.json | B09 가 안 읽음 |
|
||||
| M01 자재품목 「관급」 | 됨(단가 출처) | 조달청 관급 단가 열(30,711 줄 중 11,278 줄 값) · 고르기 창에 「관급」 꼬리표 | M01_MasterData_Store.py:490 · :503 · M01_MasterData_UI_Pick.ts:85 | 이건 「관급 가격」 출처 · 「누가 사나」 표시와 다른 뜻 |
|
||||
| B05 · B06 배관 | 없음 | 관 배치 · 관경만 · 관급 개념 없음 | (해당 코드 없음) | 필요 없음 — B09 기본값이 맡음 |
|
||||
| B08 구조물 집계표 | 없음 | 관급 표시 칸 없음 · 커플링 열은 B09 내역서 구조물 줄에서 뺌(「관급자재대라」) | B09_Estimation_Bill_Items.py:8 · :47 | 뺀 커플링이 관급자재대에도 안 들어감(아래 B09 기본값) |
|
||||
| B08 자재 탭(총괄) | 일부 | 파형강관 · 커플링 할증 0(관급 뜻) · 관급 표시 칸 없음 · 안내 글만 | B08_Quantity_Material_Calc.py:99 · :119 · :349-354 · B08_Quantity_UI_Material.ts:55 | 표시는 B09 에서 |
|
||||
| B09 자재단가대비표 「관급 · 별도」 | 됨 | 칸 누름 = 없음 → 관급 → 별도 · 사용자 값 저장(user_values.materials[키].supply) | B09_Estimation_UI_Tabs_Base.ts:108 · :155 · B09_Estimation_Calc_Base.py:38 · :161 · B09_Estimation_Store.py:151-152 | — |
|
||||
| B09 기본 관급 | 일부 | B08 총괄 `pipe_` 줄만 관급 기본 | B09_Estimation_Prices.py:231-232 | 커플링밴드(M01 이름도 「(관급)」) · 시멘트 · 모래 등 기본 없음 · M02 표시 안 씀 |
|
||||
| B09 재료비목록표 관급 칸 | 됨 | 「관급 · 별도」 열 보임 · 총액 = 수량 × 적용 단가 | B09_Estimation_Calc_Base.py:181-189 · B09_Estimation_UI_Tabs_Base.ts:224 | B08 파형강관 줄은 M01 짝 없음 → 관급 단가 수기 입력 |
|
||||
| 일위대가(대가) 안 관급 자재 | 됨 | 관급 · 별도 표시 자재 = 대가 안 0원(두 번 안 셈) | B09_Estimation_Calc_Labor.py:46-47 | 수량 없는 MT 줄이면 관급자재대에도 안 감 → 사라짐 |
|
||||
| 단가산출근거(산근) 안 관급 자재 | 없음 | 표시와 무관하게 적용 단가 그대로 셈 | B09_Estimation_Sangeun.py:155 · :414 | 대가와 규칙 어긋남 |
|
||||
| 설계내역서 관급자재대 단락 | 됨 | 「관급」 표시 + B08 수량 있는 자재 → 관급자재대(제외금액) · 조달수수료 줄 · 순공사비 계에서 뺌 | B09_Estimation_Calc_Bill.py:47-50 · :98-118 · :217-245 · B09_Estimation_UI_Tabs_Bill.ts:48 | 수량 원천 = B08 총괄 줄뿐 |
|
||||
| 조달수수료 | 일부 | ROUNDDOWN(순자재대 × 율 ÷ 100, 0) · 율 = 사용자 칸(빈칸 시작) | B09_Estimation_Calc_Bill.py:221-245 · B09_Estimation_Calc_Total.py:68-70 · :206-210 | 화면 안내 「빈칸 = 0」(UI_Tabs_Total.ts:203) 인데 셈은 빈칸 → 관급자재대 · 총공사비 빈칸 |
|
||||
| 원가계산서 · 총괄 관급자재대 | 됨 | ROUNDUP(순자재대 + 수수료, −3) · 도급공사비 밖 · 총공사비 = 도급 + 관급 | B09_Estimation_Calc_Total.py:204-211 · B09_Estimation_UI_Tabs_Total.ts:169-176 · :241 | — |
|
||||
| 일반관리비 · 이윤 · 부가세 | 됨 | 밑수에 관급 없음(순공사원가 · 다 − 재료비 · 공급가액) | B09_Estimation_Calc_Total.py:196-203 | — |
|
||||
| 산업안전보건관리비 | 됨 | A = (재료비 + 직노 + 관급 ÷ 1.1) × 율 + 기초액 · B = ((재료비 + 직노) × 율 + 기초액) × 1.2 · 작은 쪽 | B09_Estimation_Calc_Total.py:59-60 · :146-150 · :186-192 | — |
|
||||
| 추정가격(요율 구간) | 일부 | 손 입력 칸만 | B09_Estimation_UI_Tabs_Total.ts:32 · :131 | 「관급 빼고」 안내 · 자동 후보 없음 |
|
||||
| 견적가(자재 견적) | 됨(관급 무관) | 대비표 「견적」 열 · 관급 자재도 같은 칸으로 단가 | B09_Estimation_Calc_Base.py:150-158 | — |
|
||||
| 엑셀 내보내기 | 없음 | B09 엑셀 내보내기 코드 없음 | (해당 코드 없음) | 관급 포함 전체 없음 |
|
||||
| 옛 자리(안 씀) | — | 프로젝트 설정 `material_supply` · 화면 글 키 넷(관급·사급 탭) — 옛 코드는 tmp/old_code 로 감 | common_util_project_settings.py:100-108 · ui_template_locale_b2.ts:857-863 · :912 · :918 | 정리 거리 |
|
||||
|
||||
## 3. 기준 대조
|
||||
|
||||
| 기준(근거 문서) | 지금 구현 | 판정 |
|
||||
|---|---|---|
|
||||
| 관급자재대 = 총원가 밖 별도 · 총공사비에 합함 — 지식DB 원가계산_체계.md:30 · :40-41 · 산림과임업기술(임도) 5. 설계.md:558 · :581 | Calc_Total.py:204-211 | 맞음 |
|
||||
| 일반관리비 · 이윤 · 부가세에 관급 안 듦 — 예정가격작성기준 원가 구성 · 원가계산_체계.md 트리 | Calc_Total.py:196-203 | 맞음 |
|
||||
| 안전관리비 = 관급 포함 값 · 관급 뺀 값 × 1.2 중 작은 값 이상 — 건설업 산업안전보건관리비 계상 및 사용기준 현행_20250212.md:18 · :44 · 제비율 적용기준 현행_20260413.md:125 | Calc_Total.py:186-192 · ÷ 1.1 은 실무 엑셀 꼴(관급가 부가세 포함) · M01 요율 규칙 메모와 같음 | 맞음(÷ 1.1 = 실무 근거) |
|
||||
| 조달수수료 = 순자재대 × 율 원 버림 · 관급자재대 천원 올림 — 조달수수료 고시 현행_20250701.md(단가계약 0.54 %) · 단수처리_규칙.md:28 · :30 | Calc_Bill.py:222 · Calc_Total.py:205-210 · 기번3 69,474,220 + 375,160 → 69,850,000 같음(PLAN 145-3) | 맞음 · 율 기본값은 사용자 협의 거리 |
|
||||
| 관급 자재 = 내역 단가 0원 · 관급자재대로 따로 — 자재단가_적용.md:32 | 대가 맞음(Calc_Labor.py:46-47) · 산근 다름(Sangeun.py:414) | 일부 |
|
||||
| 관급 · 사급 구분 = 발주기관 결정 · 프로그램은 자재별 표시 받아 두 갈래 집계 — 자재단가_적용.md:36 | B09 대비표 칸 됨 · M02 표시 안 이어짐 · 같은 자재 두 줄 | 일부 |
|
||||
| 관급 흔한 품목 = 시멘트 · 모래 · 자갈 · 깬돌 · 파쇄암 · 파형강관(일부) — 자재단가_적용.md:32 · 원가_기초데이터_원천.md:166 | 기본 관급 = 파형강관만 · 커플링밴드 빠짐 | 다름(기본값 좁음 · 확정은 사용자 몫) |
|
||||
| 추정가격 = 관급자재 부분 뺀 금액 — 국가계약법 시행령 현행_20260603.md:69(제7조 1호) · 지방계약법 시행령 현행_20260603.md:87 | 손 입력만 · 안내 없음 | 일부 |
|
||||
| 공사손해보험료 = (총공사원가 + 관급) × 율 — 예정가격작성기준 현행_20260825.md:219 | 비목 자체 없음 | 없음(임도 실무 엑셀 비목 밖 · 참고) |
|
||||
| 관급자재 관리비(경비 세비목) — 예정가격작성기준 현행_20260825.md:202 | 없음 | 없음(실무 엑셀 밖 · 참고) |
|
||||
| 산재 · 고용 적용 = (도급 + 관급) 부가세 빼고 2천만 원 이상 — 제비율 적용기준 현행_20260413.md:104 | 문턱 검사 없음 | 없음(작은 공사만 해당) |
|
||||
|
||||
## 4. 빈틈 목록과 고칠 거리
|
||||
|
||||
| # | 빈틈 | 고칠 거리 | 크기 |
|
||||
|---|---|---|---|
|
||||
| 1 | 같은 자재가 B08 총괄 줄(`b08:cement`)과 대가 안 MT 줄(`MT004188`)로 따로 — 관급 표시를 한쪽만 하면 두 번 셈(대가 정가 + 관급자재대) 또는 사라짐(대가 0원 · 관급자재대 줄 없음) | 관급 표시를 자재 한 벌로 묶음(총괄 줄 ↔ MT 짝) · 또는 관급 수량 = 대가 역전개 총수량(Summary.py:50 이미 셈) | 중 |
|
||||
| 2 | M02 · 사본 「자재구분 관급」이 B09 에 안 이어짐 | B09 입력 짤 때(Prices.build_inputs) 사본 자재표시 「관급」 → 그 자재 기본 supply 관급 · 두 사본이 다르게 고른 자재 규칙은 사용자 협의 | 중 |
|
||||
| 3 | 산근 안 관급 자재 정가 셈 | 대가와 같은 규칙(관급 · 별도 = 0원) · 파이썬 한 곳(서버 단독) | 소 |
|
||||
| 4 | 커플링밴드 기본 관급 아님 → 구조물 줄에서도 빠지고 관급자재대에도 안 감 | Prices.py:232 기본 관급에 `coupling_` 더함 | 소 |
|
||||
| 5 | 조달수수료율 빈칸 = 안내는 0 · 셈은 빈칸 | 안내 글을 셈에 맞추거나 빈칸 = 0 처리 · 기본 0.54 % 여부는 사용자 협의 | 소 |
|
||||
| 6 | B08 파형강관 · 커플링 줄 M01 짝 없음 → 관급 단가 수기 입력 | B08 총괄 줄 ↔ M01 「파형강관 · 커플링밴드(관급)」 규격 짝 → 관급 단가 자동 | 중 |
|
||||
| 7 | 추정가격 손 입력 · 관급 제외 안내 없음 | 칸 안내 한 줄(「관급 · 부가세 뺀 금액」) · 자동 후보(공급가액)는 나중 | 소 |
|
||||
| 8 | 엑셀 내보내기 없음 | B09 탭 전체 내보내기(관급자재대 단락 · 총괄 줄 포함) — 별도 일감 | 대 |
|
||||
| 9 | 안 쓰는 옛 자리 | `material_supply` 설정 칸 · 화면 글 키 넷 정리 | 소 |
|
||||
| 10 | 공사손해보험료 · 관급자재 관리비 · 산재 · 고용 2천만 원 문턱 | 실무 엑셀에 없으면 둘 필요 없음 · 필요 여부 사용자 확인만 | 참고 |
|
||||
|
||||
## 5. 검증 자료 확인(읽기만)
|
||||
|
||||
- storage 검증 프로젝트 `d2245e3b…` 사본 `pipe@263.21` 일위대가 — 콘크리트 로직 자재 시멘트(MT004188) · 모래(MT003816) = 「관급」 표시 · B09 는 이 표시 안 봄.
|
||||
- 모든 프로젝트에 B09 `user_values.json` 없음 → B09 「관급 · 별도」 칸을 저장한 이력 없음 · `price_book.json` 은 한 곳(MT 6 줄 · 관급 단가 빈칸).
|
||||
- 시스템 임시 폴더 스크립트(순수 셈 함수만 부름) 결과:
|
||||
- 파형강관 Φ1000 8 m(기본 관급 · 단가 100,000) → 관급자재대 단락 800,000 · 순공사비 계 0(빠짐 맞음).
|
||||
- 커플링밴드(표시 없음 · 수량 2) → 설계내역서 어디에도 없음.
|
||||
- 시멘트 MT(관급 표시 · B08 수량 없음) → 대가 단가 0원 · 관급자재대 줄도 없음(사라짐).
|
||||
- 조달수수료율 빈칸 → 관급자재대 빈칸 · 율 0.54 % → 800,000 + 4,320 → 805,000(천원 올림).
|
||||
- 엑셀 대조(PLAN 145-3 · 145-4 검증완료) — 관급 69,474,220 + 0.54 % 375,160 → 69,850,000 · 도급 1,132,029,000 + 관급 = 총공사비 1,201,879,000 · 안전 A 16,586,996 · B 18,494,700 같은 값.
|
||||
@@ -0,0 +1,135 @@
|
||||
# 조사 Z — B09 재료비목록표 줄 출처 · 자재단가대비표 열 · 적용 드롭다운 · 수량 열 (10-10 둘째 · 24 · 25 · 26 · 28 · 읽기 전용 조사 에이전트)
|
||||
|
||||
| 줄임 | 뜻 |
|
||||
|---|---|
|
||||
| `B09/` | `B09_Estimation/B09_Estimation_` |
|
||||
| `ui/` | `ui_template/ui_template_` |
|
||||
| 대비표 | 탭 `compare` 「자재단가대비표」(`B09/UI_Tabs.ts:50`) = 사용자 글 「지제단가대비표」 · 「자재단가목록표」(30번) |
|
||||
| 목록표 | 탭 `material` 「재료비목록표」(`B09/UI_Tabs.ts:47`) |
|
||||
| 사본 | 프로젝트에 연결된 구조물 조합 사본(`linked_snapshots`) |
|
||||
| 실측 | 스크래치 스크립트(시스템 임시 폴더) · storage 읽기 + DB SELECT(B08 총괄) · 저장 안 함 |
|
||||
|
||||
## 0. 코드 지도
|
||||
|
||||
| 자리 | 파일:줄 | 줄 수 |
|
||||
|---|---|---|
|
||||
| 수요 키 = 사본 로직을 돌릴 때 `get` 가로채기 | `B09/Linked.py:178-207` · `:210-220` | 73 |
|
||||
| 설계내역서 수기 줄 수요(같은 꼴) | `B09/Sangeun.py:496-517` | 563 |
|
||||
| 수요 → 자재 줄 · B08 총괄 줄 덧붙임 · MT 같으면 수량만 | `B09/Prices.py:134-172` · `:213-235` · `:238-268`(합침 :252-259) | 268 |
|
||||
| GET 길 · 수요 · 입력 · 셈 | `B09/Router.py:84-89` · `:92-117` | 147 |
|
||||
| 대가 블록 — 조합 자재 줄(MT 코드) | `B09/Labor_Source.py:265-269` | 340 |
|
||||
| 대가 재료 줄 단가 = 목록표 키 찾기 | `B09/Calc_Labor.py:44-47` | 210 |
|
||||
| 대비표 셈(최저 · pick › applied › 최저) · 목록표 셈 | `B09/Calc_Base.py:133-178` · `:181-189` ↔ `.ts:119-158` · `:160-171`(거울 `test_144` · `test_166_4`) | 335 · 309 |
|
||||
| 대비표 · 목록표 화면 | `B09/UI_Tabs_Base.ts:108-208` · `:210-235` | 326 |
|
||||
| 사용자 값 다듬기 `materials{applied · supply · quote · quote_page · pick}` | `B09/Store.py:144-160` | 208 |
|
||||
| 집계표 역전개(설계내역서 × 호표) · 「목록표에 없음」 | `B09/Summary.py:47-66` · `:73-92` · `:158-160` | 160 |
|
||||
| 자재대 · 관급자재대 항목(수량 = 입력 qty) | `B09/Calc_Bill.py:98-118` ↔ `.ts:88-` | 310 · 299 |
|
||||
| 공용 표(줄 class 만 · 칸 class 없음) | `ui/data_table.ts:40-63` · `:129-178` · `:201-226` | 294 |
|
||||
| 표 짜기 곁값 · Shell 표 만들기 · 칸 풍선 듣기 | `B09/UI_Tabs.ts:75-92` · `B09/UI_Shell.ts:207-238` | 168 · 332 |
|
||||
| 공용 우클릭 메뉴 · B09 공유 한 벌 | `ui/context_menu.ts:23 · 71` · `B09/UI_Tabs_Bill_Edit.ts:222-242` | 181 · 242 |
|
||||
|
||||
## Z24. 재료비목록표 = 연결된 일위대가의 재료 줄
|
||||
|
||||
### 현재 — 줄 넷 갈래
|
||||
|
||||
| 갈래 | 출처(파일:줄) | 수량 | 단가 |
|
||||
|---|---|---|---|
|
||||
| ① 사본 로직이 **건드린** MT · MO | `Linked.py:187-196`(`snapshot.get` 가로채기 = 고르기 후보 훑기까지) | 빈칸 | M01 출처 → 최저 |
|
||||
| ② 기계 연료(경유 · 휘발유) | `Prices.py:155-165` | 빈칸 | 유가 |
|
||||
| ③ B08 총괄자재 줄 `b08:키`(파형강관 · 커플링 · 사본 자재 · 로직 재료) | `Prices.py:213-235` | B08 합계(할증 뒤) | 빈칸(출처 없음) |
|
||||
| ④ ③ 키가 ① 의 MT 와 같음 | `Prices.py:255-259` | B08 합계를 얹음 | M01 |
|
||||
|
||||
- 수량 · 총액 = 166-3 꼴(`Calc_Base.py:181-189`) — B08 줄만 수량 · M01 줄만 단가 → 두 쪽이 엇갈려 총액이 거의 다 빈칸.
|
||||
- 비고 칸 = `origin`(「M01」 · 「B08」 · 「유가」 · `UI_Tabs_Base.ts:225`) — 어느 대가 · 산근이 쓰는지 안 보임.
|
||||
|
||||
### 실측(세 프로젝트)
|
||||
|
||||
| 프로젝트 | 줄 | 대가 · 산근 · 중기가 씀 | 아무도 안 씀 | B08 줄(단가 빈칸) | 수량 있는 줄 |
|
||||
|---|---|---|---|---|---|
|
||||
| 검증_랩탑메인 226fc805(사본 1) | 6 | 3(잡석 · 경유 · 휘발유) | 0 | 3 — 파형강관 Φ1200 7 · 커플링 0 · **합판 b08:MT000053 7** | 3 |
|
||||
| 검증_sub1 7e420ed6(사본 14) | 125 | 10 | **110** | 5 — 파형강관 둘 · 커플링 둘 · **부직포 b08:MT023984** | 5 |
|
||||
| 엄상준_검증 d2245e3b(사본 10) | 141 | 17 | **117** | 7 — 파형강관 둘 · 커플링 둘 · 채움 콘크리트 · **레미콘 b08:MT004253 · 부직포 b08:MT023984** | 9 |
|
||||
|
||||
- 안 쓰는 줄 = 같은 이름 지역 갈래가 줄줄이(합판(내수) 서울~제주 19 · 시멘트 전국~제주 · 외송각재 · 어닐링철선) — 쓰인 줄은 그중 하나.
|
||||
|
||||
### 원인
|
||||
|
||||
1. **후보 줄까지 수요** — `Linked.used_keys`(`Linked.py:187-196`) · `Sangeun.hand_resource_keys`(`:505-514`)가 로직 실행 중 `get` 을 부른 키를 모두 담음 → 재료 고르기(`mf.mp.priced` · `Sangeun.py:401`)가 훑은 후보까지 들어옴(머리 주석 `Linked.py:6-7` 「고르기 후보 전부는 안 씀」과 어긋남 · 추정 = 실측 지역 갈래 꼴).
|
||||
2. **사본 일위대가 자재 줄 빠짐** — 조합 자재(`Labor_Source.py:265-269` · 사본 `자재` 코드)는 로직이 아니라 수요에 안 듦 → 대가 재료 줄 키 `MT000053` 이 목록표에 없음 → 대가 단가 빈칸(`Calc_Labor.py:45-47`) · 집계표 「목록표에 없음」(`Summary.py:89`) · 같은 자재가 B08 줄 `b08:MT000053`(단가 없음)으로만 보임(조사 ZA 「같은 자재 두 줄」과 같은 뿌리).
|
||||
3. **수량 원천이 B08 하나** — 산근 · 대가가 쓰는 자재는 수량 빈칸.
|
||||
|
||||
### 고칠 자리
|
||||
|
||||
- 원인 2 — `Linked.used_keys` 끝에 사본 `doc["자재"]` 코드 더함(`M02_Item_Source.py:161` 꼴 · +3줄) → MT 줄 = M01 단가 · B08 합계는 `Prices.py:255-259` 가 그 줄에 얹음(두 줄 → 한 줄).
|
||||
- 원인 1 — `Router.payload`(`:101-106`) 두 번 셈: 1차 셈 → 쓰는 키 = 호표 구성 재료 키(`Summary.hopyo_lines` · 빈 키 뺌) ∪ 연료 키 ∪ B08 줄 ∪ 관급 · 별도 표시 줄 → `inputs["materials"]` 거름 → 2차 셈(+12줄 · 거르기 함수 `Summary.py` +8줄). 화면 짝은 거른 입력을 그대로 받음(TS 안 고침). 실측 셈 0.6 초(엄상준) → 두 번 ≈ 1.2 초.
|
||||
- 비고 → 「쓰는 곳」(대가 n호표 · 산근 n호표 · 중기 · 내역 자재대) — `UI_Tabs_Base.ts:210-235` 에서 `sheets.daega_blocks` · `sg` · `machine_blocks` 줄 `ref.key` · 설계내역서 자재 항목을 키로 모음(표시 잇기 · 셈 아님 · +20줄) · 안내 글(:232) 고침.
|
||||
- 수량 — ⬜ 24-a 따라.
|
||||
|
||||
- 재사용 — 산근 목록 「쓰는 구조물」 꼴(`Sangeun.py:292-295` · `UI_Tabs_Sangeun.ts:42`) · `hopyo_lines` · 줄 누름 → 대비표 이동(`UI_Tabs_Base.ts:233`).
|
||||
- 시험 — `test_166_3`(B08 줄 · MT 합침 판정 손봄) · `test_144_b09_skeleton.py:107`(compare 키 차례) · 새 시험(후보 줄 거름 · 사본 자재 MT 가 수요에 듦 · 대가 재료 줄 단가 채워짐 · 쓰는 곳 글) · `test_145_2` · `test_145_5` 통과 확인.
|
||||
- 위험 — ① 두 번 셈 = GET · PUT 느려짐(1초 남짓) ② 대비표 번호(no)가 바뀜 → 내역 자재 항목 비고 「자재 n」(`Calc_Bill.py:113`)도 따라 바뀜(같은 셈이라 어긋남 없음) ③ 산근 재료 줄 키 빈칸(sub1 · 엄상준에 있음 · 고르기 못 한 줄)은 그대로 빈칸 ④ 단가 책(`price_book.json`)엔 후보 줄이 남음(쓰지 않음 · 무해).
|
||||
- 크기 — py 25줄 · TS 25줄 · 시험 손봄 둘 + 새 시험 하나.
|
||||
- ⬜ 24-a 수량 열 — ① 지금(B08 합계 · 산근 재료 빈칸) ② 역전개 총수량(재료비수량금액집계표와 같은 값 · 1차 셈 집계를 입력 `material_qty` 로 넣어 2차 · Calc_Base 짝 `material_sheet` 수량 원천만 바꿈 · 거울) ③ 수량 · 총액 열 뺌(엑셀 꼴 · 수량 × 단가 = 재료비수량금액집계표) — 추천 ②(모든 줄이 일위대가 사슬 한 원천 · 166-3 총액 열 유지 · B08 합계는 할증 포함이라 값이 다를 수 있음 → 안내 글).
|
||||
- ⬜ 24-b B08 줄(파형강관 · 커플링 · 로직 재료) — 남김(내역 자재대 · 관급 원천) 추천.
|
||||
|
||||
## Z25. 대비표 — 견적 「면」 뺌 · 다른 출처 「면」 → 「출처」 · 견적서 → 견적 아래
|
||||
|
||||
### 지금 열(`UI_Tabs_Base.ts:146-157`)
|
||||
|
||||
| 차례 | 머리 1 | 머리 2 | 값 |
|
||||
|---|---|---|---|
|
||||
| 1~4 | — | 번호 · 품명 · 규격 · 단위(앞 2 고정) | |
|
||||
| 5~16 | 관급 · 물가정보 · 물가자료 · 유통물가 · 거래가격 · 유가 | 단가 · **면** | `prices[s]` · `pages[s]`(M01 면수 · 유가 = 기준일 · 관급 면 = 늘 빈칸 `Prices.py:90`) |
|
||||
| 17~18 | 견적 | 단가(수기) · **면**(수기 `quote_page`) | |
|
||||
| 19 | — | 최저 | |
|
||||
| 20~21 | 적용 | 적용 단가(수기) · 출처(누름 = 돌림) | |
|
||||
| 22 · 23 | — | 관급 · 별도 · **견적서**(「n 파일」 누름 = 모달) | |
|
||||
|
||||
- 고칠 자리 — `UI_Tabs_Base.ts:151` 를 갈래로: 견적 밖 = `[money(p:s, "단가", [s]), text(g:s, "출처", 64, [s])]` · 견적 = `[money(p:견적, "단가", ["견적"]), text("files", "견적서", 72, ["견적"])]` · `:156` 견적서 열 지움 · `:161` editable 에서 `g:견적` 뺌 · `:166-170` 면 고침 갈래 지움 · 안내 글(:160) 고침. 머리 두 줄 묶음 = 공용 `group`(`ui/data_table.ts:96-124`) 그대로.
|
||||
- 재사용 — 공용 열 묶음 · 견적서 모달(`UI_Tabs_Base_Quote.ts`) · `onCell` files 갈래(:185-194) 그대로.
|
||||
- 시험 — `test_171_1_manual_input_label.py:17`(안내 글 「견적 단가 · 면 = 수기 입력」 판정 → 새 글) + 새 판정(열 키 · 머리 이름 · 견적 아래 files).
|
||||
- 위험 — 적용 묶음에도 「출처」(applied_from)가 있어 머리 글이 겹침(묶음 머리로 구분됨) · 셈 · 저장 안 고침(`quote_page` 는 저장에 남음 · `test_166_4:26 · 59-63`).
|
||||
- 크기 — TS 10줄.
|
||||
- ⬜ 25-a 늘 빈 관급 「출처」 열 — 그대로 둠(지시 = 값 유지) 추천 · 빼면 열 하나 줄음.
|
||||
|
||||
## Z26. 적용 단가 = 칸 누름 드롭다운 · 고른 출처 칸 강조 · 기본 최저
|
||||
|
||||
- 현재 — 적용 단가 = 수기 칸(`UI_Tabs_Base.ts:161 · 171-178` → `applied` · `pick` 지움) · 출처 칸 누름 = 값 있는 출처 돌림(`:110-114 · 195-200` → `pick`) · 저장 `user_values.json` `materials[키]{applied · pick}`(`Store.py:149-158` · `pick` ∈ SOURCES 만) · 셈 차례 pick › applied › 최저(`Calc_Base.py:153-158` ↔ `.ts:134-139` · 거울 짝) · 최저 = 0 · 빈칸 뺀 최소 · 같으면 앞 칸 · 견적 포함(`Calc_Base.py:133-140` ↔ `.ts:119-`) → **기본 최저는 이미 됨**.
|
||||
- 공용 표 빈틈 — 칸마다 class 없음(줄 `rowClass` 만 · `ui/data_table.ts:62 · 169-171`) · 칸 누름 콜백에 자리(좌표) 없음(`B09/UI_Shell.ts:219-222`) · 고르는 칸 꼴 없음(글 칸만 `:145-151`).
|
||||
- 고칠 자리
|
||||
- `ui/data_table.ts` — 곁값 `cellClass?: (줄, 열 키) => string | null` 하나(옵션 :40-63 · `rowHtml` td class :169-171 · 넘김 :213-221 · +6줄 · 안 주면 그대로).
|
||||
- `B09/UI_Tabs.ts:75-92` — `TabTable.cellClass` · `choices?: (줄, 열 키) => MapContextMenuItem[]` 두 칸.
|
||||
- `B09/UI_Shell.ts:207-238` — `cellClass` 넘김 · `choices` 있으면 표 root click 듣기(칸 풍선 듣기 :229-237 꼴 · 칸 `getBoundingClientRect` 아래에 메뉴) · 메뉴 = `B09/UI_Tabs_Bill_Edit.ts:222-232` 공유 한 벌을 내보내 씀(`openMenuAt(x, y, items)` · +6줄).
|
||||
- `B09/UI_Tabs_Base.ts` buildCompare — `applied` editable 뺌 · `choices`(applied 칸) = 값 > 0 출처마다 「물가정보 12,000 · 최저」 + 견적 + 「최저(자동)」 · 고름 = `pick` 넣고 `applied` 지움 · 「최저(자동)」 = 둘 다 지움 · `cellClass` = `p:{pick ?? 최저 출처}` 칸 `is-picked` · 출처 칸 돌림(:195-200 · `nextPick`) 지움.
|
||||
- `B09/UI_Page.css` — `.b09-estimation td.is-picked` 바탕 = `color-mix(var(--color-accent) …)`(`ui/data_table.css:9` 토큰 꼴 · 테마 따라감).
|
||||
- 셈 · 저장 — 안 고침(짝 그대로 · 옛 `applied` 값도 그대로 읽음 · 드롭다운 「최저(자동)」이 지움).
|
||||
- 재사용 — 공용 우클릭 메뉴(한 번에 하나 · 바깥 누름 닫힘) · 공용 열 묶음 · `setUser` 즉시 다시 셈(네트워크 없음).
|
||||
- 시험 — `test_144` · `test_166_4`(셈 그대로 통과) + 새 시험(공용 표 `renderDataTableHtml` cellClass 칸 class · 안 주면 글 같음 · buildCompare choices 항목 · 고름 → pick · 자동 → 지움 · 강조 칸 = pick ?? 최저 출처 · applied 칸 editable 아님).
|
||||
- 위험 — ① 출처 없는 줄(B08 파형강관 · 커플링 · 로직 재료 · 번호판)은 견적 칸으로만 단가를 넣음 → 안내 글에 적음 ② `ui/data_table.ts` 공용(다른 페이지 영향 없음 · 옵션만) ③ 메뉴는 click 으로 열림 — 공용 닫힘은 pointerdown 캡처라 순서 맞음.
|
||||
- 크기 — TS 45줄 · CSS 4줄 · 시험 하나.
|
||||
- ⬜ 26-a 수기 적용 단가 — 없앰(견적 = 유일한 수기 출처) 추천 · 남기려면 드롭다운에 「수기 입력…」 항목.
|
||||
- ⬜ 26-b 「출처」 칸 누름 돌림 — 없앰(드롭다운 하나) 추천.
|
||||
|
||||
## Z28. 대비표 수량 열
|
||||
|
||||
- 현재 — 대비표 화면에 **수량 열 없음**(`UI_Tabs_Base.ts:146-157` · 모든 갈래 같음). `qty` 는 셈 줄에만 — 대비표 줄 `qty`(`Calc_Base.py:175` ↔ `.ts:155`) → 목록표 수량 · 총액(`Calc_Base.py:183-188` ↔ `.ts:160-171`) · 자재대 항목 수량은 입력에서 따로(`Calc_Bill.py:100` ↔ `.ts:89-90`). 엑셀 내보내기 없음 · 합계 줄 없음(대비표).
|
||||
- 고칠 자리 — 화면은 할 일 없음. 셈 정리를 원하면 `material_sheet` 가 입력 qty 를 직접 읽게(짝 둘 · 거울 · `test_166_3`) — 보이는 변화 없음.
|
||||
- 위험 — 없음.
|
||||
- 크기 — 0(정리 시 py · TS 각 3줄).
|
||||
- ⬜ 28-a 사용자가 본 「수량」 = 목록표 수량 열(166-3)일 수 있음 — 대비표는 그대로 · 목록표는 Z24-a 로 정함 추천.
|
||||
|
||||
## 고칠 파일 목록
|
||||
|
||||
| 파일 | 지금 줄 | 고친 뒤(추정) | 700 위험 | 요구 |
|
||||
|---|---|---|---|---|
|
||||
| `B09_Estimation/B09_Estimation_Linked.py` | 73 | 76 | 없음 | Z24 |
|
||||
| `B09_Estimation/B09_Estimation_Router.py` | 147 | 160 | 없음 | Z24 |
|
||||
| `B09_Estimation/B09_Estimation_Summary.py` | 160 | 168 | 없음 | Z24 |
|
||||
| `B09_Estimation/B09_Estimation_Calc_Base.py` · `.ts` | 335 · 309 | 339 · 313 | 없음 | Z24-a ②(거울) |
|
||||
| `B09_Estimation/B09_Estimation_UI_Tabs_Base.ts` | 326 | 365 | 없음 | Z24 · Z25 · Z26 |
|
||||
| `B09_Estimation/B09_Estimation_UI_Tabs.ts` | 168 | 172 | 없음 | Z26 |
|
||||
| `B09_Estimation/B09_Estimation_UI_Shell.ts` | 332 | 345 | 없음 | Z26(조사 Y 탭 묶음과 겹침) |
|
||||
| `B09_Estimation/B09_Estimation_UI_Tabs_Bill_Edit.ts` | 242 | 248 | 없음 | Z26 |
|
||||
| `B09_Estimation/B09_Estimation_UI_Page.css` | 45 | 49 | 없음 | Z26 |
|
||||
| `ui_template/ui_template_data_table.ts` | 294 | 300 | 없음 | Z26(공용) |
|
||||
| 시험 — `test_166_3` · `test_144_b09_skeleton` · `test_171_1` 손봄 + 새 시험 둘(Z24 · Z25/26) | — | — | — | |
|
||||
Reference in New Issue
Block a user