chore(plan): 113~122장 4차 요구 조사 다섯 · B05 3D 검토 · 분석 정함(10-8 저녁)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LLCk2y5xE8YGVgjbTntWsY
This commit is contained in:
2026-10-08 18:15:04 +09:00
co-authored by Claude Opus 5.5
parent 77e01c043b
commit 5f64633df3
6 changed files with 370 additions and 0 deletions
@@ -0,0 +1,78 @@
# 검토 — B05 3D 「스케치 · 서피스 대신 메시 변형」 (10-8 저녁 · 읽기 전용 검토 에이전트 · 구현 안 함)
요구: 3D 업데이트 형상이 탑스케치 + 새 서피스로 만들어져 파편화 · 절성토와 구조물 연결이 이상함 → 서피스 · 스케치 로직을 지우고 메시를 찌그러뜨려(변형해) 잇는 안 검토 · 구조물 서피스 형상은 손대지 않음.
**한 줄 결론** — 가능 · 권장. 지형 메시 정점의 높이(z)만 설계면으로 옮기는 clamp 변형 + 노면부 리본 유지 + 구조물 평면 외곽 구멍. 단 「스케치 전부 삭제」는 문자 그대로는 안 됨(구조물 평면 외곽은 지형 자르는 마스크로 남김). 3D 형상은 수량 계산에 안 쓰임(B08 토적 = B06 단면 평균단면적법).
경로 약칭: `_X.ts` = `B05_Profile\B05_Profile_UI_Corridor_X.ts` · 본체 = `B05_Profile_UI_Corridor.ts` · 뷰어 = `B05_Profile_UI_Viewer_Corridor.ts`.
## 1. 지금 3D 갱신 흐름
[3D 업데이트](`A00_Common\design\design_view_profile.ts:271`) → `refreshCorridor`(본체:241) → `buildCorridor`(`_Build.ts:165`) → 뷰어 `set`(뷰어:271).
| # | 단계 | 위치 |
|---|---|---|
| 1 | 측점 분류(차도 · 노견 · 측구 · 절성토 조각 · 열 수 3/3/5/20/48 · 비탈 끝 탐색) | `_Station.ts:237` · `:23-34` · `:196` |
| 2 | 구조물 솔리드(배수관 세트 · BOX · 세월교 · 스윕 1 m) | `_Structures.ts:271` · `:138` |
| 3 | 0.2 m 행 루프 — 조각 보간 → 비탈을 노면 끝에 얹음 → 두 측점 지반 섞은 선과 교차해 자름 | `_Build.ts:277-503` · `:452-475` · `_Station.ts:520,538` |
| 4 | 종류별 리본(성토는 원지반 z 함께) | `_Build.ts:524-573` |
| 5 | 바깥 윤곽 · 시종점 마구리 | `_Build.ts:575-592` |
| 6 | 탑스케치 — 구조물 세트마다 상단 +5 m 평면 커브 7종 | `_Plan.ts:391-629` · `_Plan_Footprint.ts:194,255,292` |
| 7 | 성토면 셀 마스크 지우기 · 걸친 셀 직선 자르기 · 잘린 윤곽 · 측벽판 | `_Cut.ts:448-620` |
| 8 | 새 서피스(패치 리본) — B06 실루엣 1 m 걸음 복사 · 행별 지반 자르기 · 날개 확장 · 바닥판 천장 | `_Carve.ts:239-494` · `_Carve_Wing.ts` |
| 9 | 패치 반대 클립(세월교 · BOX만) | `_Build.ts:615-618` |
| 10 | (뷰어) 절성토 바깥 열 z 만 지형에 붙임 | 뷰어:180-215 |
| 11 | (뷰어) 패치 바깥 끝 수직 스커트 | 뷰어:222 · `_Skirt.ts:84` |
| 12 | Three 메시화 | `_Mesh.ts:378-538` |
| 13 | 지형 자르기(±80 m 밴드 사본 · 윤곽 띠 재분할 · 잘린 자리 안 원지반 되살림) | `_Clip.ts:388,434` · `_Region.ts:243,371` · `_Split.ts:14` |
1~9 단계는 서버 사전생성도 같은 코드를 Node 로(`B05_Profile\B05_Profile_Corridor_Node.ts:42` · 저장본 17~18.6 MB 본체:72-73). 지형 = B04 미리보기 GLB(DTM 1.0 m · 스무딩 0.5 m 격자 · 정점 50만 넘으면 듬성 · `B04_PreProcess_Engine_SheetSurface.py:123-139`).
## 2. 파편화 · 연결 이상의 원인
- (a) 해상도 넷(리본 0.2 m × 약 6 cm · 패치 1 m 행 · 구조물 링 1 m · 지형 0.5~1 m)이 구조물 자리에서 만나 정점 공유 없이 선으로만 맞댐 · 지우는 쪽 · 채우는 쪽이 같은 고리를 다른 격자로 자르고 못 자른 셀은 면적 50 % 로 통째 지우거나 남김(`_Cut.ts:525-528,552-557`) → 계단 · 틈 · 겹침.
- (b) 기슭막이 패치는 반대 클립 대상 아님(`_Carve.ts:382` · `_Cut.ts:485`) → 구멍 경계 · 패치 경계 어긋남(추정).
- (c) 패치는 소유 측점 단면 한 장을 종단 높이만 옮겨 복사 · 구간 끝 테이퍼 없어 수직 측벽판이 막음(`_Cut.ts:420-439` · 08-27 사용자 결정).
- (d) 스커트 조건(가운데 행 낙차 0.5 m 이하 · 3 m 넘는 마디 건너뜀)으로 판이 띄엄띄엄(`_Skirt.ts:27,44,120-124`).
- (e) 되살린 원지반 때문에 구조물 자리 안에 원지반 · 패치 · 측벽 · 솔리드가 다른 높이로 섞임(`_Clip.ts:388-422`).
- (f) 비탈 끝을 실제 지형이 아니라 두 측점 단면 지반 섞은 선으로 자름 · 화면 지형엔 바깥 열만 붙임 → 측점 사이 계곡에서 안쪽 열이 파고들거나 뜸(추정).
- (g) 비탈과 구조물이 3D 로 만나는 선을 어디서도 계산 안 함 · 자르는 경계는 +5 m 평면 커브 평면 좌표뿐(`_Plan.ts:66` · `_Cut.ts:28`) → 비탈이 벽 앞에서 끊기거나 벽을 뚫음.
- (h) 절토 ↔ 성토 바뀌는 행마다 조각 버려 리본 끊김(`_Build.ts:468-470,528-571`).
- (i) 측점 사이를 열 대 열(호길이 재샘플)로 이음 → 소단 유무 다른 두 측점 사이 비탈 비틀림(추정 · 변형 방식에서도 남음).
## 3. 「메시 변형」 해석 · 가능성
- 해석: 패치 · 측벽 · 스커트 · 조각 삼각형 · 평면 스케치를 만들지 않고 지형 메시 정점의 높이(z)만 설계면으로 옮김 · 평면 위치(XY) 고정 → 삼각형 뒤집힘 없음 · 구조물 솔리드 그대로 · 그 평면 외곽에서 지형을 잘라 맞댐(솔리드 면이 이음을 가림).
- 정점 규칙: 노면부 바깥에서 `z' = clamp(지형 z, 성토선 z, 절토선 z)` · 측점 단면 밖은 마지막 구배로 늘림(`_Station.ts:569-596` 규칙과 같음) → 비탈 끝 · 절성토 전환이 정점마다 저절로 · 윤곽 · 자르기 · 붙이기 불필요.
- 필요한 자료(모두 있음): `classifyStation`(`_Station.ts:237`) · 행 프레임 · 종단(`_Frames.ts:137,162,179` · 테이퍼 제어점 `:31`) · 구조물 외곽(`_Plan_Footprint.ts:137-243` · BOX 아령 외곽 포함 → 마스크 고리) · 구조물 구간 설계 단면(`_Station_Structure.ts:62,377` 상부 포락선).
- 알고리즘: ① 정점 → (누가거리 · 편거리) 역투영(0.2 m 행 중심 격자 색인 · 헤어핀은 편거리 작은 행) ② 측점 사이 보간(지금처럼 앵커 기준 상대 단면) ③ 경계 고정 — 차도 · 노견 · 측구는 리본 유지 · 지형을 노면부 바깥선에서 자르고(`clipGeometry` `_Clip.ts:178`) 경계 정점 z = 앵커 z ④ 구조물 마스크 — 풋프린트 고리 안 삼각형 지움(`PlanLoopRegion` `_Region.ts:313`) · BOX · 세월교 날개 안쪽 유로 · 에이프런 「성토 금지」 고리 ⑤ 사본에만(토글 OFF 원본 복원 · 밴드 사본 정점 버퍼 공유 `_Split.ts:112` → 빌드마다 원래 z 되돌림) ⑥ 색 · 빗금 = 높이 변화 부호 · (누가거리 · 편거리) 좌표.
- 구조물 서피스 보존: `_Structures*.ts` 전부 · `_Mesh.ts:270-375,496-536` 안 고침 · 마스크는 솔리드 링 읽기만.
- 지울 수 있는 것(약 2,600줄+): `_Plan.ts` 전체 · `_Plan_Footprint.ts:245-348`(137-243 은 마스크로 남김) · `_Cut.ts` 전체 · `_Carve.ts` · `_Carve_Wing.ts` · `_Union.ts` · `_Skirt.ts` · 뷰어:175-237 · `_Clip.ts:372-422` · `_Region.ts:365-404` · `_Build.ts:72,90 · 452-475 · 593-626`(79-152 는 등간격만 · 477-501 은 노면부 끝으로 축소) · `_Mesh.ts:38-74,159-190,411-485` · `_Build_Types.ts:19-56,59-75,91-98` · `_Envelope.ts:40-67,281-298,310-327`(버전 올림) · 죽은 코드 `_Station.ts:91-101,325-406,484` · 디버그 훅.
- 남길 것: `_Station.ts` 분류 · 상대 비탈 · `_Frames.ts` · `_Station_Structure.ts` · `_Structures*.ts` · `_Split.ts` · `_Terrain.ts` · `_Clip.ts:178-338` · `_Region.ts:79-363` · 본체 캐시 · 해시 · 노면부 리본.
## 4. 위험 · 비용
- 해상도: 지형 격자 0.5~1 m(넓으면 2 m+) → 비탈 끝 톱니 · 1 m 소단 뭉개짐 · 벽 두께 0.3~0.5 m 보다 격자가 커 구조물 둘레 국소 세분 필요할 수 있음(추정) · 노면 · 측구는 리본 필수.
- 높이장(z=f(x,y))이라 수직 벽 · 역경사 못 그림(솔리드가 덮는 자리만 허용) · 길쭉한 삼각형 음영 거침.
- 한쪽 비탈 종류가 없는 행(성토 측점 사이 지형이 솟은 곳) → 이웃 측점 단면 빌리는 규칙 필요(추정).
- 역투영 모호(반경 < 비탈 폭 곡선 안쪽 · 헤어핀) — 지금도 반경 제한으로 막는 문제.
- 성능: 도달폭 안 정점만 · 색인 한 번 → 수백 ms(추정) · 법선은 새로 만들지 않음(감기 방향 뒤집혀 검게 된 전례 `_Clip.ts:323-325`).
- 서버 사전생성: Node 엔 지형 메시가 없어 변형은 브라우저에서만 · 저장본 크게 줄어듦(추정) · 버전 올리면 옛 저장본 전부 다시 빌드.
- 화면: 절성토 색 · 빗금이 지형 삼각형 단위라 발끝 선 흐림 · 측점에서 3D 단면이 B06 과 조금 다를 수 있음(B06 = 횡단 샘플 지반 · 3D = 메시 지반).
- 수량 영향 없음(B08 토적 = B06 단면적 평균단면적법 `B08_Quantity_Engine_Earthwork.py:1,23` · B07 · B08 에서 코리도 참조 0).
- 시험: 깨짐 = `test_b05_corridor_separation.py:130-139` · `test_b05_corridor_envelope_flags.py:58-114` · `test_b05_cut_merged_loop.py` · `test_b05_patch_skirt.py` · 유지 = corridor_spline · switching · structures_order · router · prune · prebuild · hash_probe · 새로 = 정점 규칙 + 마스크 합성 격자 시험 1건.
- 이력: 실루엣으로 비탈 갈아 끼우기는 08-25 사용자 지시로 꺼짐 · 08-27 「부활」 기각(실패 원인 = 고정 열 리본 접기) — 이번 안은 높이장 clamp 라 그 원인과 다름(추정).
## 5. 단계 계획 (전체 크기 큼 · 삭제 약 2,600줄 · 추가 400~700줄 추정)
1. 변형 코어(중간) — 새 파일 하나(예 `_Deform.ts`) 역투영 색인 · 정점 규칙 · `_Build.ts` 는 비탈 안 자르고 행별 앵커 · 상대 단면만 · 지형은 노면부 끝에서 자르고 경계 z 맞춤 · 옛 경로와 플래그로 나란히 두고 화면 비교 · 시험 1건.
2. 구조물 마스크(중간~큼) — 풋프린트 · 아령 외곽 구멍 · 날개 안쪽 성토 금지 고리 · 구조물 구간은 실루엣 상부 포락선 + 제어점 테이퍼 · 4세트(84.30 · 149.73 · 200.92 · 275.71) 실측 비교.
3. 옛 로직 삭제(중간 · 기계적) — 3 절 표대로 · 버전 올림 · Node 사전생성 축소 · 시험 4건 정리.
## 하지 말 것
지형 정점 XY 이동 · 노면 · 측구를 지형 변형으로 · `_Structures*.ts` · `_Mesh.ts` 구조물 부분 수정 · 지형 원본 geometry 직접 수정 · 「스케치 전부 삭제」 문자 그대로 · 옛 경로와 비교 없이 한 번에 삭제 · `STRUCTURE_SILHOUETTE_OVERRIDE` 부활.
## ⬜ 사용자가 정할 것
1. 변형 대상: 지형 GLB 직접(권장) vs 코리도 정렬 띠 격자.
2. 구조물 구간 끝: 이웃 측점까지 테이퍼 vs 지금 같은 단차(측벽을 지우면 08-27 결정 다시).
3. BOX 「구체 밖은 원지반」(08-27 확정) 유지(clamp 로 자동 유지 가능).
4. 날개벽 안쪽 유로 · 에이프런 정밀도(솔리드에 묻히는 근사 허용 범위).
5. 서버 사전생성 → 브라우저 계산 · 저장본 축소 동의.
6. 절성토 빗금 유지(발끝 선 흐림 감수) vs 색만.
7. 측점 사이 지반 기준: 지형 메시(화면과 일치) vs 횡단 샘플(B06 과 일치).
8. 평면 스케치 디버그 훅(`__corridorPlanCurves`) 폐기.
+51
View File
@@ -0,0 +1,51 @@
# 4차 요구 분석 · 정함 (10-8 저녁)
근거 — `사용자요구_1008_4.md` · 조사 A(M02) · C(B05 · B06 화면) · D1(B07) · D2(B08) · 검토 `검토_B05_3D_메시변형.md` — 파일:줄은 조사 문서에.
사용자 지시 — 계획서 작성 후 바로 작업 진행(자리 비움) · 작업 전 깃 싱크(모으기 끝) · 화면 검증은 사용자(코더는 시험 · typecheck · build).
## 장 · 창
| 장 | 내용 | 창 | 모델 |
|---|---|---|---|
| 113 | M02 일위대가 옵션 줄 병합 · 상세 머리 이동 단추 숨김 · 크기 | sub3 | Opus high |
| 114 | M02 면적 옛 연결 이름 매기기 · 셀 밀기 이름 따라감 · 카드 저장 연결표 · 「도면 연결」 알약(상태 · 지우기) | sub2 | Opus high |
| 115 | B05 3D 메시 변형 — 검토만(구현 안 함 · ⬜ 사용자 결정 뒤 1단계) | — | — |
| 116 | B05 종단 우클릭 → [추가]까지 끝난 상태 | sub8 | Opus high |
| 117 | B05 계획노선 편집 안쪽 공용 양식 | 데스크탑 메인 | Sonnet high |
| 118 | B06 관 고름 강조 + 좌측 「관」 컨테이너 | sub4 | Opus high |
| 119 | B07 평면도 축척 고르기 | sub6 | Opus high |
| 120 | B08 구조물 집계표 — 횡단배수 다른 구조물 · 열 폭 절반 | sub7 | Opus high |
| 121 | B08 총괄자재 · 콘크리트소요자재 · 자재수량 집계표 | sub1 | Opus high |
| 122 | B08 좌측 패널 컨테이너 · 배관 1본 길이 · 연암/경암 비율 | sub5 | Opus high |
## 정함 (브레인 · 사용자 자리 비움 — 돌아와서 고칠 수 있음)
- 113 — 옵션 줄 = 구분 · 이름 · 별칭 병합 칸(colspan 3)에 옵션 글 · 나머지 칸(차례 · 수량산출 · 단위 · 금액 넷 · 순서 칸)은 위 줄에서 두 줄 병합(rowspan 2) · 옵션 없는 로직은 한 줄 그대로 · 클래스 이름 그대로 · 이동 단추 = 지금 페이지 단추 숨김 · [도면][일위대가][면적산출] · 머리 [?] = [다시 읽기]와 같은 크기 · 꼴(카드 [?]는 작게 그대로).
- 114 — 원인 = 사용자 자료 연결 13줄 중 11줄이 이름 없는 옛 연결(104 전) → 적힌 범위로 폴백 → 행 넣어도 안 따라감 · 고침: 면적 상세 열 때 화면이 이름 없는 보낸 범위마다 `도면_{연결}` 이름정의를 책에 넣음(고침 표시 안 켬) · 면적 [저장] 때 서버가 그 이름을 연결표 줄에 적음(112 「저장 때 기록」 그대로) · 셀 밀기 · 당기기에도 보낸 범위 이름 따라감 · 카드 도면 저장에서도 표 없는 연결표 줄 뺌 · 아래 알약 막대에 도면 알약(「T1 도면 E7:J17」 · 상태 = 도면에 표 있음/없음 · 값 맞음/다름 · × = [보내기 취소] · 누르면 범위 고름) · 시트 위 이름표는 그대로 · 이미 어긋난 옛 연결은 사용자가 점선 보고 다시 보냄.
- 115 — 검토 결론: 지형 높이(z)만 설계면으로 옮기는 clamp 변형 + 노면부 리본 유지 + 구조물 평면 외곽 구멍 · 「스케치 전부 삭제」 그대로는 안 됨(구조물 외곽 = 마스크) · 수량 영향 없음 · 큼(삭제 약 2,600줄) · 사용자 결정 여덟(검토 문서 ⬜) 뒤 1단계(플래그로 나란히 · 화면 비교)부터.
- 116 — 사용자 말대로 「[추가]까지 끝난 상태」: 필수 빈칸 없는 종류는 우클릭 측점에 바로 추가(캐시 · [저장]은 사용자) + 그 항목을 좌측 패널에서 고른 채 · 패널 열고 「구조물 배치」 폄 · 필수 빈칸이 남는 종류 · 확인창이 뜨는 노면공은 폼만 채우고 패널 폄 · 이전 고름의 그룹 잇기 · 집계 항목 비움(새 항목에 옛 잇기 실리는 흠) · 08-18 「즉시 추가 폐지」를 사용자 새 지시로 바꿈.
- 117 — 큰 자체 창(계획노선 편집)은 그대로 · 안쪽 날 요소만 공용(조사 C 2 표) · [계획노선 편집] 단추도 공용 · 시험이 집는 `data-act` · `data-logic` · 클래스 남김 · B06 보기에 칸 새로 세우지 않음(요구 밖).
- 118 — 관 판정면(벽 판정면 아래) · 누르면 관 두 겹 강조 + 좌측 「관」 컨테이너 강조 · 스크롤 · 조정창 없음(세월교 본체 꼴) · 107-1 동시 고름 금지 그대로 · B05 3D 에서 관 고름이 B06 으로 이어짐.
- 119 — 축척 목록 1/600 · 1/1,000 · 1/1,200(기본 · 법정 별표2) — 근거 조사 D1 1 · 종류마다 축척 · 「새 종류」 · 업데이트에서 고름(공용 select) · 유역도 양식은 1/6,000 고정(잠금 표시) · 축척 바꾸면 장 수 · 도면 id · 번호 바뀜 받아들임 · 축척은 함수 인자로(ContextVar 금지).
- 120 — B08 구조물 집계표 「횡단배수」에 BOX(본체 m — B06 새 키 `box_length_m` 를 110 길로 · 날개벽 개소) · 세월교(월류 폭 m · 개소 · 날개벽 개소) · 물넘이(월류 폭 m · H 별) · B05 개거 · 노출형 횡단수로 · 맹암거(개소) · 흙막이 · 돌붙임 열은 관 · 박스 · 세월교 공용(실무 꼴) · 세월교 흙막이 높이는 「미입력」 열 · 같은 측점 박스 + 관 키 겹침 막음 · 열 폭 = 맨 아래 단 글만 재서 최소 44 · 최대 100 + B08 범위에서 머리 줄바꿈 허용(말줄임으로 못 읽는 일 없게).
- 121 — 실무 엑셀 꼴 그대로 세 표(구조물 탭 아래 · 공용 표) · 「값을 받는 도구」 먼저: 구조물 수량 C = 구조물 집계표(98 · 120) · 파형강관 · 커플링 = 98 total · 단위수량(구조물 × 자재) = 사용자 입력(기본 빈칸 · ⬜ 원천) · ㎥당 배합 = 원문 값 기본(산림품셈 12-1-3 QF000353 · 모르터 건축 9-1-1 · 골재 kg→㎥ 단위중량 CC000337 · 근거 없는 무근 312 은 빈칸) · 할증률 = 품셈 1-3-1 기본(관급 파형강관 0) · 합계 = 올림(실무 꼴) · 모든 칸 사용자 고침 · 조작 중 브라우저 계산(TS · 파이썬 짝 · 거울 시험) · [저장] 때 서버 정본 · 옛 결정 「배합 분해는 B09 일위대가 몫」은 사용자 새 지시(세 표 구현)로 바꿈 — 일위대가 「재료배합 계상 안 함」과 두 번 세지 않게 표 머리에 「구조물 수량 기준(일위대가와 별개)」 표시.
- 122 — 좌측 패널 컨테이너 셋(구조물 · 토공 · 수리집수면적표 · 접이 · B07 꼴) + 아래 [저장] 줄 · 구조물 › 배관 1본 길이(기본 8 m · 저장 = 프로젝트 층 M02 표 변수 `파형강관_1본_m` 한 벌 · 좁은 저장 길) · 토공 › 연암 % · 경암 %(기본 90 · 10 · 한쪽 고치면 다른 쪽 100 − 값 · 0~100 · 저장 = `project_settings.json › quantity › rock_ratios_pct`) · 토공집계표 연암 · 경암 = 암 × 비율 · 토적표 「절토 › 연암」 열 → 연암 · 경암 두 열 · 조작 중 브라우저 계산(커플링 = 올림(L ÷ 1본) − 1 · 암 나눔 — TS · 파이썬 짝 · 거울 시험) · [저장] 때 서버 · 수리 컨테이너는 빈 칸(다음 옵션 자리) · 암 환산계수 C 는 그대로(⬜).
## ⬜ 사용자가 돌아와서 정할 것
1. (115) B05 3D 검토 결정 여덟 — `검토_B05_3D_메시변형.md` 끝.
2. (121) 자재 단위수량 원천(M02 일위대가 자재 / 지식DB 실무 원단위 / 손 입력 유지) · 배합 기준((A)(B)(C) · 25/40 mm) · 할증률(품셈 1-3-1 vs 실무 · 모르터 중복 할증).
3. (122) 연암 · 경암 비율이 암 환산계수 C(보정량 · 유토곡선)까지 바꿀지.
4. 시스템 층 item3_3 면적 알약 7개(G8~G20)가 사용자 화면 저장(74ab07bc9)에서 빠짐 — 의도였는지.
## 파일 겹침 · 차례
| 파일 | 창 | 차례 |
|---|---|---|
| `M02_MasterTemplete_UI_Main.ts` | sub3(113 머리 ? 크기 252 근처) · sub2(114 열 때 이름 298-305) | 다른 자리 |
| `B08_Quantity_Router_Summary.py` | sub7(120 구조물 갈래) · sub5(122 관마다 길이 응답 한 칸) · sub1(121 `_summary` 읽기만) | sub5 는 응답 한 칸만 · 늦게 올리는 쪽이 받아 합침 |
| `B08_Quantity_UI_Summary.ts` | sub7(120 열 · 폭) · sub5(122 커플링 실시간 갈고리) | 다른 자리 |
| `B08_Quantity_UI_Page.ts` | sub5(122 좌측 패널) · sub1(121 새 탭) | 다른 자리 |
| `common_util/common_util_project_settings.py` | sub5(122 암 비율) · sub1(121 단위수량 · 배합 · 할증) | 다른 키 |
| `main.py` | sub1(121 새 라우터) · sub5(122 옵션 길) | 등록 한 줄씩 · 겹치면 브레인이 맞춤 |
| `B06_Section_Structure_Layouts.ts` · `Server_Calc_Prebuild.py` · `Schema.py` | sub7(120 `box_length_m`) | 혼자 |
+56
View File
@@ -0,0 +1,56 @@
# 조사 A — M02 4차 (10-8 저녁 · 읽기 전용 조사 에이전트)
M02 = `M02_MasterTemplete/` · SS = `A00_Common/spreadsheet/` · 「추정」 = 코드로 확인 못 한 판단.
## 1. 일위대가 로직 표: 옵션 줄을 구분 · 이름 · 별칭 병합 칸으로
- 현재 열: [차례(⠿+번호)][구분(+품셈)][이름][별칭 입력][수량산출 2줄][결과 단위][노무비][재료비][경비][계][순서 칸(▲▼ · 옵션|수정 · 삭제)](`Labor_Rows.ts:352-441` · 머리 `:490-499`) · 옵션 줄 = `[차례 빈칸][옵션 글 colspan=9][순서 칸 빈칸]`(`:40-41` SPAN · `:444-460`) · CSS `Labor.css:160-198`(한 줄 말줄임 · 위 줄 아래선 없앰 · hover · 고름 한 덩이 · 고른 줄 왼쪽 띠) · 좁은 칸 grid `:313-446`(옵션 `:421-431`) · 같은 표 = 상세 · 카드(`ItemCards.ts:313-319`) · 서고(`Labor_RefEdit.ts:94`)는 `Labor_Detail.ts:192-210` · 면적 패널 보기 `Labor_View.ts:91`.
- 해석(추정): 옵션 줄 높이 그대로 · 옵션 글은 구분 · 이름 · 별칭 3칸만 · 차례 · 수량산출 · 단위 · 금액 넷 · 순서 칸은 위 줄에서 rowspan=2 로 내려와 옵션 줄 자리까지 → 항목마다 약 한 줄 줄어듦.
- 고칠 자리: `Labor_Rows.ts` 옵션 글 있을 때만 위 줄 칸 일곱 + 순서 칸 `rowspan:"2"` · 옵션 줄은 `td.m02-labrow__opt colspan=3` 하나 · SPAN 3 · `Labor.css` :176-178 아래선 규칙은 구분 · 이름 · 별칭만 · :184-187 hover 에 `.m02-labrow__row:has(+ .m02-labrow__optrow:hover)` · :195-198 옵션 줄 첫 칸 띠 지움 · :134-136 끌기 아래선을 위 줄 rowspan 칸에도 · 좁은 칸 grid 는 rowspan 무시(그대로).
- 재사용: 끌기 묶음은 `tr[data-labor-logic]` 다음 형제들(`Labor_RowDrag.ts:36-40` · 칸 구조 무관).
- 시험: `ui_checks/44-6_일위대가_표.js:7,61`(opt.colspan 기대 8 · 코드는 이미 9 → 3) · `ui_checks/45-7_일위대가_표_줄.js:29-61`(rowspan 모름 → 고침) · 47-5 · `test_m02_card_shell.py:157` · `test_m02_labor_rowdrag.py:66-85` 통과 추정.
- 위험: 하위 줄(`:243-296`)이 옵션 줄 뒤 → rowspan 2 고정 · 옵션 없는 로직은 rowspan 없음(섞임) · 상세 · 카드 · 서고 · 좁은 칸 · 밝음 · 어두움.
- 크기: 작음~중간.
## 2. 상세 머리 이동 단추: 지금 페이지 숨김 · [다시 열기]와 같은 꼴
- 현재: 머리 `[back][title][nav.root][helpSlot][slot][reload][save]`(`UI_Main.ts:156-169`) · [다시 열기] = `createButton({label:L("M02_Reload"), variant:"ghost"})` 보통 크기(`UI_Main.ts:137` · 글 `ui_template_locale_m2.ts:34`) · 이동 단추 `createDetailNav`(`DetailNav.ts:33-43`) `size:"sm"`(:35) · 지금 페이지 `aria-pressed`(:50-54) + 강조 CSS(`UI_Style.css:245-253`) · 보임 조건 = 뒤로 단추(`UI_Main.ts:250`) · ? = `helpParts`(`CardShell.ts:163-195` · :167 ghost sm · `m02-struct__help`) 카드 ? 와 공용 · 머리엔 `UI_Main.ts:251-253`.
- 고칠 자리: `DetailNav.ts:35` `size:"sm"` 지움 · :50-54 → `button.hidden = on` · `UI_Style.css:250-253` 눌림 규칙 지움 · ? 는 머리에서만 키움(`UI_Main.ts:252` 뒤 `help.button.classList.remove("ui-btn--sm")` · 카드 ? 는 작게).
- 시험: `test_m02_detail_nav.py:101-112` pressed → hidden · :127 aria-pressed CSS 단정 지움 · `test_m02_structure_panel.py:218-221` 통과 · ⚠ `test_m02_layer_screen.py:307-311` 은 정규식에 `nav.root` 가 없어 105-4 뒤 이미 깨짐(같이 고침).
- 위험: 단추 커져 좁은 창 머리 줄바꿈 늚 · 크기: 작음.
## 3. (재요청) 행/열 넣기 · 지우기 뒤 범위 유지 · 「도면으로 보내기 안 됨」
실제 자료(연결표 있는 구조물 전부 · 회사 층 · 프로젝트 사본은 연결표 0)
| 층 · 열 | 연결표 줄 | 이름 있는 줄 | 면적 이름정의 |
|---|---|---|---|
| 시스템 item3_2 / item3_3 / item3_3_2 | 각 1 (E7:J13 / E7:J17 / B2:H8) | 0 | 없음 |
| 개인(회사1 · 사용자10) item1 · item1_2(2장) · item2(s2) · item3 · item3_2 · item3_3 | 각 1 | 0 | 없음 |
| 개인(회사1 · 사용자3) item3_3 | 3 (T2 E7:J17 · T1 E8:I14 · T3 E7:J17) | 2 (T1 · T3) | 도면_T1 · 도면_T3 |
| 개인(회사1 · 사용자3) item3_3_2 | 1 (T1 E7:J13) | 0 | 없음 |
13줄 중 이름 있는 줄 2(104 합친 뒤 16:46~17:28 보낸 것) · 112 뒤(17:38~) 새로 보낸 연결은 자료에 없음.
원인(그럴듯한 차례)
1. 옛 연결(이름 없음)은 설계상 적힌 범위로 폴백 — 점선(`links.ts:182-191`) · 저장(`refresh_drawing` `M02_Area_Table.py:139-149`) · 도면 열 때 비교(`checkStale` `AreaToDrawing.ts:289-300`) 모두 고정 범위 → 행 넣어도 안 따라감 · 이름은 「도면 저장 때 파일에 없던 새 줄」에만(`fresh_names` `Area_Table.py:47-58`) · `withLinks`(`AreaToDrawing.ts:377-394`)는 옛 줄을 이름 없이 다시 적음 → 옛 줄은 영영 이름 없음 · 시험이 못박음(`test_m02_area_table.py:303-307`) · 사용자3 item3_3 은 T2(이름 없음) · T3(이름 있음)이 같은 범위라 행 넣으면 테두리 둘이 갈라짐.
2. 셀 삽입/삭제(밀기 · 당기기)는 이름을 안 옮김 — 칸 메뉴 「셀 삽입 ▸」(`spreadsheet_menu_items.ts:200-229`) · Ctrl+Shift+= 창(`spreadsheet_actions_run.ts:33-44`)이 칸 명령(`spreadsheet_insert_dialog.ts:54-101`) — 알약만 옮기고(104-2) 이름 · 병합 · 식 참조 · 조건부서식 제자리 · 잘라 붙이기(`spreadsheet_commands.ts:365-421`)도 이름 · 알약 안 옮김.
3. 놓고 도면 [저장] 안 하면 연결 · 이름 안 생김(112 의도 `Store.py:174-191` · 사용자에겐 「보내기 안 됨」으로 보일 수 있음 · 추정).
4. 카드 도면 저장은 `withLinks` 를 안 거침(`DrawingCard.ts:133-138`) → 카드에서 표를 지워도 연결표 줄이 남아 점선 계속.
5. 알약 모듈 늦게 로드 전 행 넣으면 알약 안 옮겨짐(`spreadsheet.ts:169-181,198-205` · 드묾).
- 행열 통째 길은 문제없음(머리 우클릭 · 「행/열 삽입 ▸」 · 통째 고른 단축키 → `insertDelete` `spreadsheet_commands.ts:259-359` · `applyLinked` `links.ts:131-145` — 칸 · 식 · 메모 · 병합 · 이름 · 조건부/유효성 · 알약 모두).
- 개인 · 회사 층 길 끊긴 곳 없음(보내기 owner `AreaToDrawing.ts:101-104` · 저장 `owned()` `Api_Fetch.ts:74-84` → `_store_save` `Router_Layers.py:341-347,393-399` · 프로젝트 층은 보내기 단추 없음 `AreaToDrawing.ts:340`) · Node 번들 17:38:48 새로 만들어짐.
- 참고(추정): 시스템 item3_3 알약 7개(G8~G20)가 74ab07bc9(사용자 화면 저장)에서 통째로 빠짐 · 칸 값 그대로 · 일위대가 수량 「칸」→「없음」 · 행열 길로는 안 생기는 꼴 · 일위대가 로직을 바꾼 뒤 고아 알약을 [×] · [연결 모두 해제]로 푼 것으로 보임.
고칠 자리: 원인 1(권장) — 면적 상세 열 때 화면이 이름 없는 표시범위마다 `도면_{연결}` 이름정의를 책에 넣고 그 이름으로 점선(`UI_Main.ts:298-305` · `sentRanges` 가 `연결` 도 넘김) · 고침 표시 안 켬 · 면적 [저장] 때 서버 `refresh_drawing` 이 책에 그 이름이 있으면 줄에 `이름` 적음(112 「저장 때 기록」 그대로) · `test_m02_area_table.py:303-307` 뒤집음 · 대안 `define_names`(`Area_Table.py:61-88`)로 모든 층 한 번에 굳히는 도구 / 원인 2 — `insert_dialog.ts` `dispatchShift`(:84-101)에서 이름정의도 `shiftLinks`(:57-82) 규칙으로 / 원인 4 — 카드 저장에서도 표 없는 연결표 줄 뺌(`withLinks` 몸 재사용).
위험: 행 넣고 이미 저장한 옛 연결은 적힌 범위가 벌써 어긋났을 수 있음 → 굳히기 전 사용자가 점선 확인.
재현: 사용자3 item3_3 면적 → 6행 「위에 1행 삽입」 → T3 점선 E8:J18 · T2 E7:J17 그대로 → [저장] → 도면 T2 표 첫 줄 빔 · 끝 줄 빠짐 / T3 범위 안 「셀 삽입 ▸ 아래로 밀기」 → 값만 내려가고 T3 점선 그대로.
크기: 원인 1 중간 · 원인 2 작음~중간 · 원인 4 작음.
## 4. 면적 상세 「도면 연결」: 연결 여부 보이고 지우기
- 현재(「도면 연결」 = 시트 위 보낸 범위 표시로 추정): 점선 테두리 + 왼쪽 위 이름표 `ss-link-range__tag` 「T1 도면」(`links.ts:489-534` · CSS `spreadsheet_links.css:255-285` — 10px 글 · 위만 둥근 네모라 라벨처럼) · 자료 = 같은 열 도면 연결표(`sentRanges` `AreaToDrawing.ts:145-163` · 글 `:85-86`) · 누르면 범위 고름 + 테두리 강조(`:508-514`) · 지우기는 숨어 있음(우클릭 [보내기 취소] `:515-531` = 112 길 · 저장 때 `apply_cancels` · `refresh_drawing(unlink)` `Area_Table.py:91-109,118-138`) · 안 보이는 것: 도면에 그 표가 실제로 있나(연결표 줄만 봄) · 값이 맞나(도면 상세 열 때 `checkStale` 알림에서만) · 아래 알약 막대(`renderBar` `links.ts:360-412`)엔 일위대가 알약만.
- 고칠 자리: `sentRanges` — 이미 읽는 구조물 문서로 「표 있음」(`sheetsOf` · `isTable` · `linkOf` `:124-134`) · 값 맞음 — 지금 책으로 `areaTable`(`spreadsheet_area_table.ts:55`) → `sameValues`(`:136`)(112-1 `AreaDrawing.ts:117-128` 꼴) · `links.ts` `표시범위` 에 `상태`(`:64-71`) · `renderBar` 에 도면 알약(글 「T1 도면 E7:J17」+ 상태 · 색 = 테두리 · × = `mark.취소` · 누르면 범위 고름).
- 재사용: `pill()`(`links.ts:256-338`) + `.ss-link` · `.is-linked` · `.ss-link__x`(`spreadsheet_links.css:13-60,231-246`) · 상태 `createTag(label, variant)`(`ui_template_elements.ts:217` · `ui-tag--success|warning|danger`) · 취소 112 `cancel` · `withCancels`(`AreaToDrawing.ts:326-331`).
- 위험: 옛 연결은 값 비교도 고정 범위(3 원인 1 먼저) · 값 비교 150ms 모음 · 시험 `test_m02_area_marks.py:32-35` · `test_m02_area_to_drawing.py` · `ui_checks/50-1_*.js`.
- 크기: 중간.
## 미결 (조사 에이전트 제시)
1. (1) 해석 — 옵션 글은 구분 · 이름 · 별칭 병합 칸 · 오른쪽 칸은 위 줄과 두 줄 병합 · 차례 칸도 두 줄 병합.
2. (2) 카드 ? 도 키울지.
3. (3) 옛 연결 굳히기: 면적 열 때 화면 + 저장 때 서버(권장) vs 한 번 도구 · 이미 어긋난 옛 연결은 다시 보낼지.
4. (3) 셀 밀기 · 당기기 · 잘라 붙이기에도 보낸 범위 · 병합 · 조건부서식이 따라가야 하는지.
5. (3) 시스템 item3_3 알약 7개 빠짐이 의도였는지.
6. (4) 「도면 연결」 = 「T1 도면」 이름표가 맞는지 · 아래 알약 막대로 옮기고 이름표 지울지 · 「도면에 없음」 줄 자동 정리.
@@ -0,0 +1,59 @@
# 조사 C — B05 · B06 화면 (10-8 저녁 · 읽기 전용 조사 에이전트)
약칭: B5 = `B05_Profile\B05_Profile_UI_` + PS `Profile_Structures.ts` · SPa `Structures_Panel.ts` · SE `Structures_Panel_Events.ts` · SC `Structures_Panel_Commit.ts` · SF `Structures_Form.ts` · PR `Panel_Route.ts` · PSec `Panel_Sections.ts` · PF `Panel_Fields.ts` · RC `RouteEdit_Chrome.ts` · RL `RouteEdit_Label.ts` · RR `RouteEdit_Recommend.ts` · RP `RouteEdit_Recommend_Profile.ts` / B6 = `B06_Section\B06_Section_UI_` + CU `Cross_Culvert.ts` · CV `Cross_View.ts` · FD `Cross_Ford.ts` · BD `Cross_Box.ts` · VB `Cross_View_Bodies.ts` · SP `Cross_Structure_Panel.ts` · AD `Adjust_Dock.ts` · SPN `Page_Structures_Panel.ts` · STC `Page_Station_Controls.ts` · PK `Page_Structure_Pick.ts` · CSA `Style_Cross_Areas.css` · CTL `Style_Cross_Controls.css` / UE `ui_template\ui_template_elements.ts` · UM `ui_template_modal.ts` · UT `ui_template_data_table.ts` · T `resources\tester\`
## 1. 종단도 우클릭 → 구조물 종류 고름
현재
- 우클릭 메뉴 PS:82-120 — 구조물 6px 안이면 [삭제] · 빈 자리면 구조물군 → 종류 2단 메뉴(PS:32-44).
- 세 길이 한 벌 폼 `addAt`(SPa:635-668)으로 모임 — B05 종단 `B05_Profile_UI_Profile_Render.ts:315` → `A00_Common\design\design_view_profile.ts:188` · B06 종단 `B06_Section_UI_Section_View_Menu.ts:130` → `design_view_cross.ts:346` → SPN:493 · 3D `B05_Profile_UI_Viewer_Menu.ts:86` → `B05_Profile_UI_Page_Structures.ts:360`.
- `addAt` 은 바로 추가 안 함(SPa:638 · 08-18 「즉시 추가 폐지」) — 군 · 종류 고름 · 기준 측점 채움(구간형이면 종료 = 측점 + 15 m) · 옵션 잠금 풂(`positionConfirmed=true`) · 등록부 기본값 · A군 임시 배치(SPa:295-311) · 첫 필수 칸 포커스.
- 좌측 [추가]는 폼 여는 단추가 아니라 확정 단추 하나(SF:124 → SE:140 → SC:246-406) · [추가] 뒤 `loadForm(null)`(SC:404)로 측점 비고 군 · 종류만 남음 · 새 항목은 목록에만(고르지 않음).
빈틈(추정)
- `addAt` 이 `onReveal` 을 안 부름(selectById SPa:624 · selectPipeByChainage SPa:601 은 부름) → 좌측 패널이 닫혀 있으면 안 열림 · 접힌 「구조물 배치」(SF:78)도 안 폄.
- 이전 고름의 집계 항목 · 그룹 잇기를 안 비움(그룹 잇기 값이 render 로 안 지워짐 `B05_Profile_UI_Structures_Groups.ts:69 · 192`) → 새 항목에 옛 잇기가 실릴 수 있음 · `onListRelease` 도 안 부름(새로 놓기 `startNew` SE:41-48 은 다 함).
고칠 자리: SPa `addAt` 한 곳(세 길 공용) — (가) 「[추가]까지 끝난 상태」: 필수 빈칸 없으면 `commit()` 후 새 항목 고른 채(임시 id `withLocalIds` Page_Structures.ts:232-247 → `selectById` · A군은 `selectPipeByChainage`) · 필수 빈칸 남는 종류는 폼만 / (나) 지금 흐름 + `onReveal` · 접힘 풂 · `startNew` 식 리셋만.
재사용: `startNew` · `commit` · `selectById` · `callbacks.onReveal`(design_page.ts:136).
주의: (가)는 08-18 사용자 결정을 뒤집음 · 노면공 확정 때 확인창(`B05_Profile_UI_Structures_Pavement.ts:54 · 72`) · A군 확정 = 배수유역 재계산 · 구간형 기본 15 m 그대로 저장.
크기: (나) 작음 · (가) 중간.
## 2. 「계획노선」 칸 [계획노선 편집] 안쪽 공용 양식
현재: 단추(PR:22-27) = 날 `button.b05-route__btn`(이 클래스 CSS 0건) · 「계획노선」 칸은 `views:["profile"]`(PSec:31)라 B06 보기엔 없음 · 누르면 `openRouteEditModal`(`B05_Profile_UI_RouteEdit.ts:98`) = 화면 전체 덮는 자체 모달(공용 모달 아님) · 안의 [노선 추천]은 공용 `openModal`(RR:163).
| 자리 | 날 요소 | 공용 부품 |
|---|---|---|
| PR:22-27 | [계획노선 편집] 단추 | PF `button()`(86 · createButton ghost) |
| RC:37-42 | 자체 겉틀 · 제목 `<strong>` | 겉틀 유지 권장 · 제목줄만 `ui-modal__top` 꼴 |
| RC:64 · 82 | ✕ 닫기 · 재기 상자 ✕(`__measure-close`) | createButton ghost(UE:43 · UM:34 와 같게) |
| RL:124-125 | 곡선 지우기 토글 · ✕ | createButton ghost sm |
| RL:128-139 | 반지름 · 곡선 길이 `<label><input number>` | createInputField(UE:87 · compact) 또는 PF numberField(94) |
| RL:131 · 137 · 141 | [고정] ×3 | PF `toggleButton`(117 · glass · is-active) |
| RR:186 | 갈래 알약(role=radio) | createButton variant `pill` |
| RR:199 · 203 | 비중 숫자칸 · 잠금 | createInputField compact · toggleButton |
| RR:212-220 | 기준 · 목표 기울기 | createInputField compact |
| RP:131-133 | 후보 비교 날 `<table>` | `renderDataTableHtml`(UT:148) |
| RR:201 | range 슬라이더 | 공용 없음 → 그대로(추정) |
- 이미 공용 꼴: RC:45-62 · 75-78 · RR:181 · 221(`ui-btn` 문자열).
- B05 좌측 패널 꼴 예: PF `button` · `toggleButton` · `numberField` · `B05_Profile_UI_Structures_Fields.ts` `field()`(13) · `select()`(31) · `.b05-route__field`(`B05_Profile_UI_Style.css:285-330` 전역).
고칠 자리: PR · RC · RL · RR · RP + 쓸모없어지는 CSS(`B05_Profile_UI_Style_RouteEdit.css` 52 · 287 · 347-410 · `B05_Profile_UI_Style_RouteRecommend.css` 170-220 · 344-404 · 426-502).
주의: 시험이 `data-act` · `data-logic` · `.b05-routeedit__measure-close` · `.b05-routeedit__cross*` 를 집음 → 남김 · createInputField 에 step 옵션 없음(만든 뒤 넣음) · RL:160-162 이벤트 막기 유지.
크기: 중간.
## 3. B06 배관 횡단도 — 관 고르면 강조 + 좌측 컨테이너 강조
현재: 관 못 고름(그림 + 툴팁뿐 CU:314-335 · 판정면은 벽 CU:342-354 · 집수정 357-370) · 관 누르면 카드 클릭(CV:172)으로 번져 카드만 골라짐 · 고름 키 `RevetKey`(CU:58)에 관 없음 · 3D 가 내는 `pipe` 키(`B05_Profile_UI_Viewer_Structure_Pick.ts:18`)도 B06 이 버림(PK:27 · 75) · 좌측 「관」 컨테이너(`fieldset[data-spec-container="pipe"]` `design_structure_pipe.ts:37`) 강조 길 없음(AD:153-217 은 유입 · 유출 · 추가 · 본체만 · SPN `keyOf` 619-623 도 inlet · outlet · soil_add 만).
다른 구조물 강조 꼴: 흙막이 벽 = CU 판정면 → CV:225 `toggleRevet` → 고름 저장(STC:267-274) → `.b06-chart__culvert-revet.is-active`(CSA:284) + 좌측 `fieldset.is-active`(AD:207-216 · CTL:403-411) · 세월교 본체(66-1 · 89-2) = 사각형 판정면(FD:159-183) → `toggleFord("body")`(VB:101) → 바닥판 + 관 두 겹 is-active(FD:220) · `.b06-chart__culvert-pipe.is-active` 규칙 이미 있음(CSA:423-429) · 조정창 안 띄움(Ford_Panel.ts:159-160) · 좌측 ford/body 상자만 강조 + 스크롤(AD:156-167) · 박스(108-3) = 판정면 자체 강조(BD:203-227 · CSA:307) · 79-6 = 카드 테두리 `--link-owner`(CV:265-273).
107-1 동시 고름 금지: CV:216 · CV:239 · STC:269-272 에 이미 있음 → 관을 같은 고름 저장소에 태우면 그대로 적용.
고칠 자리(세월교 본체 66-1 꼴): ① CU 관 판정면을 벽보다 먼저 얹어 벽이 이기게 · `onSelectRevet("pipe")` · setter(374-378)에서 관 두 겹 is-active ② 키: `RevetKey`(24파일 148곳)는 그대로 · 고름 전용 타입 `RevetKey | "pipe"` 를 고름 함수(select · selectedFor · highlightFor · toggleRevet · applyRevetHighlight)에만 ③ SP `show("pipe")` = 조정창 숨김 + `dataset.side="pipe"` ④ AD side "pipe" → `fieldset[data-spec-container="pipe"]` is-active + 스크롤 ⑤ SPN `keyOf` 에 "pipe" ⑥ (선택) PK:27 pipe → 3D 관 고름이 B06 에 이어짐.
주의: 연동 카드 `wallStandsAt(...,"pipe")` · 링크 카드(CV:551) · 독립 흙막이 카드엔 관 없음 · 세월교 · 박스 측점 관은 세월교 오버레이가 그림(배관 오버레이 관 숨김 확인 — hidden_pipe 추정) · 조정창 `adjustFor` 등이 "pipe" 로 안 불리게.
크기: 중간.
## 4. 관련 시험 (T 아래)
- 1: 직접 시험 없음(새로) · 참고 `ui_checks\52-8_종단_계류_숨김.js` · `test_b05_new_structure_defaults.py` · `ui_checks\54-38_군바꿈_횡단강조.js` · `test_design_page_single.py:82` · `test_b05_b06_selection_single.py`
- 2: `test_b05_routeedit_initial.py:174-208` · ui_checks 44-1b · 48-1 · 44-2 · 48-2 · 64-1 · `test_modal_top_and_add_word.py:37` · `test_b05_curve_radius_floor.py` · `test_b05_routeedit_{view,pick,lock,cross_width,frame_mirror,initial_roundtrip}.py`
- 3: `test_107_ford_free.py:52` · `test_108_drag_box_hit.py` · `test_79_guard_shape.py` · `test_revet_link_level.mjs` · `test_54_29_pick_same_panel.py` · ui_checks 53-1 · 54-3 · 54-1 · 52-1
## 미결 (조사 에이전트 제시)
1. 우클릭: (가) 곧바로 추가하고 그 항목 고른 채 vs (나) 지금처럼 폼만 채우고 패널 펴 줌 · (가)면 필수 빈칸 남는 종류 · 노면공 확인창은 폼만.
2. 계획노선 편집 창: 큰 자체 창 유지 + 안쪽만 공용 vs 공용 모달 · B06 보기에도 「계획노선」 칸.
3. 관 고름: 조정창 없이 「관」 상자만 강조(세월교 본체 꼴 · 권장) vs 유입 · 유출 칸도.
4. B05 3D 관 고름 → B06 관 강조로 이을지.
+66
View File
@@ -0,0 +1,66 @@
# 조사 D1 — B07 축척 고르기 · 횡단배수 집계표 (10-8 저녁 · 읽기 전용 조사 에이전트)
경로는 프로젝트 루트 기준 · 「추정」 = 코드로 확인 못 한 판단.
## 1. 평면도 생성 · 업데이트에 축척 고르기 (B07)
현재
- 축척 상수 하나: `DRAWING_SCALE_PLAN = 1200`(`config/config_system.py:185-187`) · 유역도 `DRAWING_SCALE_BASIN = 6000`(:184) · 종이 mm 환산 `MM = 1000/1200`(`B07_DesignDetail_Engine_Cad_Plan.py:39-40`)이 모듈 상수라 import 때 굳음.
- 종류 파일 = `{name, pieces, order, layout}`(축척 칸 없음 `B07_DesignDetail_Router_Support_Plan.py:94-100`) · 양식 plan · watershed 둘(:73-74 · :172-183) · 기본 종류 `Engine_Cad_PlanKinds.py:79-105` · 조각 19개 `PIECES` :48-69.
- 장 나눔 `plan_chunks`(`Engine_Cad_Plan.py:96-132`)가 `_chunk_span_m`(:90-93) — 작도칸 `plan_area_mm`(:81-87) ≈ 701×477 mm → 한 장 1/1,200 약 841×573 m · 1/1,000 701×477 m · 1/600 421×286 m · 목록 `plan_kind_items`(`Router_Support_Plan.py:523-551`)는 plan_chunks 한 번(:525) · 유역도 한 장(:528-536).
- 1200 직접 쓰는 곳: `_chunk_route`(`Router_Support_Basin.py:398-413`) · `_sheet_box`(:381-395) · `map_background` 는 scale 인자 있음(:235-272 · 부르는 쪽 `Router_Support_Plan.py:401-406` 만 1200).
- 그림 `build_plan_kind_drawing`(`Engine_Cad_PlanKinds.py:529-603`) — paper() :538-539 · 실거리 환산 :449-450 · 471 · 485 · 축척 글 「S = 1/1,200」 :570-581 · 도곽 축척 칸 `scale_fields` :587(`Engine_Template.py:461-475` · A3 는 분모 ×2) · 도곽 fit=False 1:1 · 넘치면 경고(`Engine_Template.py:478-525`).
- 종이 mm → 실거리(축척 따라야 함): IP 표 `Engine_Cad_IpTable.py:24 · 156-169 · 189` · 필지 라벨 `Router_Support_Landuse.py:21 · 144-145 · 196-197`.
- 글 크기는 종이 mm 상수(축척 무관 `PlanKinds.py:132-138` · `Plan.py:55-63` · `IpTable.py:29-31`) · 실거리 상수(비탈 눈금 2 m `PlanKinds.py:133` · 대피소 라벨 8 m `Router_Support_Plan.py:76` · R 라벨 4 m `PlanKinds.py:352` · 라벨 버퍼 5 m · 틈 2 m `Landuse.py:34-35`)는 축척 따라 종이 간격 바뀜.
- 업데이트 `update_kind`(`Router_Support_Plan.py:198-222`) — 이름 · 조각만 · 확정 풀어 다시 그림(:213-221 · 축척 바꿔도 이 길 맞음) · 라우터 `PlanKindRequest`(`Router_PlanKinds.py:34-38`) · PUT(:93-103) · 화면 `kindForm`(`UI_PlanKinds.ts:62-119` · 양식 고르기 :74-79 · 있는 종류면 양식 잠금 :98-99) · API `Api_Fetch.ts:179-232`.
- 도면번호 = 목록 차례(`Router_Support.py:169 · 173-189`) — 장 수 바뀌면 뒤 번호 밀림 · id `plan_x` ↔ `plan_x_n`.
- DXF 는 종이 mm 그대로 · 축척 머리 없음(`Engine_Frame_Export.py:219-235`) → 고칠 것 없음.
고칠 자리
- `config_system.py`: `DRAWING_SCALE_PLAN_CHOICES = (600, 1000, 1200)` · 기본 1200.
- `Router_Support_Plan.py`: `_document` · `list_kinds` scale 읽기(없거나 목록 밖이면 1200) · `_checked` · `add_kind` · `update_kind` scale 인자 · `build_pieces` → `_chunk_route` · `_sheet_box` · `map_background` · landuse · ip_table 로 넘김 · `plan_kind_source` 반환 `scale` · `plan_kind_items` 축척별 plan_chunks.
- 기본 인자(= 지금 값): `Engine_Cad_Plan.py` `_chunk_span_m` · `plan_chunks` `scale=DRAWING_SCALE_PLAN` · `Router_Support_Basin.py` `_sheet_box` · `_chunk_route` · `build_plan_kind_drawing` `scale` · IpTable · Landuse `mm=MM` · `Router_Support.py:459-461` 이 `stored_design["scale"]`.
- 라우터 `PlanKindRequest.scale` · `_state`(`Router_PlanKinds.py:51-57`)에 `scales` 목록(화면 목록 출처 한 곳) · 화면 `kindForm` 에 `createSelectField` 「축척」(새 종류 · 업데이트 · 유역도 양식이면 1/6,000 잠금 표시) · `Api_Fetch` 몸통 scale.
재사용: `map_background` scale 인자 · `createSelectField` · `update_kind` 확정 풀기 · `scale_fields` · 후보 `DRAWING_SCALE_MASSHAUL_H_CANDIDATES`(「도면 관행 축척」 `config_system.py:168-180`).
위험: ContextVar 로 넘기면 안 됨(`plan_kind_source` 와 `_read_drawing` 이 따로 `to_thread` `Router.py:345-355`) → 인자로 · `plan_pieces/{장}/` 은 쓰기만 하는 캐시(해 없음) · 1/600 이면 장 수 약 2배 · 1/2,500 보다 큰 분모면 2 m 비탈 눈금 빽빽 · 옛 길 `plan_source` · `build_plan_drawing` · `build_lidar_plan_drawing` 은 호출처 없음(그대로) · 시험이 종류 dict 통째 비교(`test_b07_plan_kinds.py:245-250 · 373-378 · 387-394 · 406`).
지식DB 축척 근거
- 1/1,200(법정): 시행규칙 별표2 「평면도는 종단도면 상단에 축척 1/1,200」 — `resources/knowledge/original/법률/산림자원의 조성 및 관리에 관한 법률 시행규칙/별표/별표2_산림관리기반시설의 설계 및 시설기준(제5조제1항 관련).md:60` · `technical_info/01_임도/02_상세설계/설계제원_총괄.md:116` · `resources/knowledge/03_미결_및_확인사항.md:42`.
- 1/1,000: 교재 「축척 1/1,000 또는 1/1,200」 — `original/산림과임업기술(임도)/2. 임도/5. 설계.md:24`(종단 수평은 평면도 축척과 같게 :205) · 오솔길 1/1,000 방위표(`original/경쟁사 프로그램/오솔길 분석/20_분석/02_도면양식/02_임도양식.md:92`).
- 1/600: 용지도 「1/600 또는 법정도면의 축척」(`5. 설계.md:290`).
- 1/5,000: 지형도 · 유역면적(`3. 임도계획.md:67` · `technical_info/01_임도/01_계획노선/임도계획_기본설계.md:50`) · 1/6,000 유역도는 사용자 확정 납품 기준(지식DB 근거 없음 `config_system.py:160-164`) · 1/25,000 · 1/50,000 위치도(`5. 설계.md:309`).
크기: 중간(서버 약 8파일 · 함수 약 12개 인자 · 화면 1칸 · 시험 셋 고침 · 새 시험 하나).
## 2. 횡단배수 다른 구조물 + 열 폭 절반
어느 표: B07 엔 횡단배수 · 집계 코드 없음(grep 0) · B07 수량표는 횡단 절성토 표(`Engine_Cad_Table.py`) → B08 「구조물 집계표」(98장)로 봄(추정).
현재
- 서버 `pipe_summary`(`B08_Quantity/B08_Quantity_Router_Summary.py:153-291`) 배관만 — raw 옵션 `facility == "pipe"`(:166-170) · `type_id != "pipe"` 건너뜀(:174) · 열 id 접두 `pipe:`(:124) · 차례 흙막이 0 · 돌붙임 1 · 관 공 2(:201 · 250 · 273) · 머리 글 정의 `종류.pipe.이름`(:294-296) · 98 결정 「이번은 배관만」.
- 화면(`B08_Quantity_UI_Summary.ts`) 배관만 서버 열(:201-205) · 박스 · 세월교 · 물넘이 · B05 개거 등은 조합 열(머리 1단 + 이름 · 칸 빈칸 `Summary_Data.ts:63-85` · UI :127-134) · 「관 공」 열만 맨 윗 머리가 관 조합 경로(:87-93).
- 횡단배수 그룹(`resources/master_template/구조물정의.json:5-6` 군 A): pipe_points = pipe · box_culvert(:293) · ford_pavement(:472) · ford_bridge(:539) / structures.json = cross_drain_exposed(:674) · open_ditch(:691) · cross_underdrain(:708).
같은 꼴로 펼치는 법(머리 = 구조물 · 형식 · 규격 3단 + 단위)
- BOX암거: 본체 [BOX암거, 가로×세로(`box_culvert.body.size=…`), 본체] m — 본체 길이 정본 없음 → B06 새 키 `box_length_m`(두 끝 offset 차)을 110 하상경사와 같은 길(`B06_Section_Structure_Layouts.ts:226-230` · `STRUCTURE_ROW_KEYS` :153-162 ↔ `B06_Section_Server_Calc_Prebuild.py:63-71` ↔ `B06_Section_Schema.py:186-190`) · 날개벽 [BOX암거, 날개벽, 유입/유출] 개소(`wing_in/out` · 옛 「있음」 정규화 `design_structure_box.ts:103-109`).
- 세월교: [세월교, Φ{D}×{n}련, 월류 폭] m = `ford_width_m` + 개소(추정 · 실무 견본 없음) · 날개벽 개소(`design_structure_ford.ts:84-96`) · 관 길이는 B06 기하에만(`B06_Section_UI_Cross_Ford_Geom.ts:266-290`).
- 물넘이 포장: [물넘이 포장, -, H={ford_height_m}] m = `ford_width_m`(실무 2공구 「물넘이 포장 H=1.0 m」 `docs/raw/요구_1008_2/조사_M_B08집계표_배관.md:19`).
- 흙막이 · 돌붙임은 기존 `pipe:revet|형태|H` · `pipe:chute|붙임` 열에 더함(실무 표는 기슭막이 열 공용) — 켜짐 키가 종류마다 다름(관 `{side}_type == 기슭막이` :231-235 · 박스 `wing_in/out == 흙막이` · 세월교 `{side}_type == 흙막이`) · 선택 흙막이 · 도수로(soil_add · chute_add)는 이미 처리(`M02_MasterTemplete/M02_Table_Fill_Spec.py:26-32`).
- B05 개거 · 노출형 횡단수로 · 맹암거: 옵션 거의 없어 개소 1(선택).
고칠 자리: `B08_Quantity_Router_Summary.py`(종류별 갈래 · 열 id 접두 · 이름 · 정렬 · 알림) · `B08_Quantity_UI_Summary.ts`(:202-205 서버가 펼친 facility 모두 조합 열에서 뺌 · :87-110 맨 윗 머리 = 그 열 조합 경로 · 서버가 열에 `top`) · 선택: 물넘이 도수로 칸(`design_structure_ford_pavement.ts:36-47`)을 `CHUTE_ITEMS`(`design_structure_guard.ts:124-146`)로.
재사용: `_Sheet`(:107-146) · `fill.collect_items` · `_revet_length`(:98-104) · `fill._label` · `soil_tiers_from_designs` · `_combo`.
위험: 흙막이 빈 높이 규칙 종류마다 다름(관 = 관경 최소 :244-245 · 박스 = 박스 높이 · 세월교 = 본체 끝 높이(기하에만 · 정본 없음) → 세월교는 「미입력」 열) · 옛 값 정규화 서버 사본 = TS 짝 두 벌 · 세월교 필수 컨테이너 잇기(gford · gfordin · gfordout)가 마스터 정의 그룹에 없음(raw `group_items` 에서) · 같은 측점 박스 + 관이면 `pipe@측점` 키 겹침 · `test_98` :172-179 · :223 고침.
크기: BOX · 세월교 · 물넘이(있는 키만) 중간(서버 약 100줄 · TS 약 20줄) · BOX 본체 길이 새 키 작음~중간 · 세월교 관 길이 중간(추정).
열 폭 절반
- 현재: `widthOf = min(200, max(96, 글자수×13+24))`(`UI_Summary.ts:54`) · 배관 열은 위 단 글까지 포함 가장 긴 글(:107 — 위 단은 여러 열에 걸쳐 불필요) · 측점 96(:126) · 조합 열은 이름 길이(:133) · 공용 표는 받은 폭 그대로(`ui_template_data_table.ts:59-61 · 165 · 178` · 말줄임 · 여백 8px · 글 12px `ui_template_data_table.css:46-56`).
- 고칠 자리: `UI_Summary.ts` 만 — 맨 아래 단 글만 잼 · 글자 폭 한글 12px · 그 밖 7px 추정 +16 · 최소 44 · 최대 100 → 「m」 96→44 · 「관매설」 96→52 · 「H=2.0」 96→51 · 측점 96→56 · B09 도 쓰는 공용 표 · CSS 안 건드림.
- 위험: 위 단 머리 칸엔 title 없음(`ui_template_data_table.ts:96` · 맨 아래 단만 :102) → 한 열짜리 위 단 글 말줄임이면 못 읽음 → B08 범위 CSS 로 머리만 줄바꿈 허용 또는 그 열만 쓰는 위 단 글을 폭 계산에.
- 크기: 작음.
## 3. 관련 시험 (`resources/tester/`)
- 축척: `test_b07_plan_kinds.py` · `test_b07_landuse_parcel_info.py`(`MM` import :17 · :58) · `test_b07_masshaul_basin.py` · `test_b07_frame_export_table.py` · `test_b07_dxf_clip.py`
- 집계표: `test_98_b08_pipe_summary.py` · `test_61_1_b08_summary_table.py` · `test_61_2_b08_structure_sheets.py` · `test_ui_data_table.py`(+`helper_ui_data_table.cjs`) · `test_m02_table_fill.py` · `test_structures_summary_snapshot.py`
- BOX 본체 길이 새 키: `test_b06_pipe_length.py` · `test_b06_design_key_split.py` · `test_110_b08_bed_slope.py`
- 물넘이 도수로 칸: `test_52_3_structure_spec_ford_pavement.py` · `test_52_17_single_container.py` · `test_65_ford_defaults.py`
## 미결 (조사 에이전트 제시)
1. 축척 목록 1/600 · 1/1,000 · 1/1,200(기본) · 유역도 1/5,000 · 1/6,000 고르기 · 용지(A1) 고르기는 밖.
2. 축척 바꾸면 장 수 · 도면 id · 도면번호 바뀜 · 단추 이름에 축척.
3. 「수량 집계표」 = B08 구조물 집계표가 맞는지(추정).
4. 펼칠 범위: BOX · 세월교 · 물넘이만 vs B05 개거 · 노출형 횡단수로 · 맹암거(개소)까지.
5. 단위 · 머리: BOX 본체 m(B06 새 키) · 날개벽 개소 · 세월교 월류 폭 m · 개소 · 관 연장 · 물넘이 월류 폭 m(H별).
6. 흙막이 · 돌붙임 열 공용(실무 꼴) vs 구조물별.
7. 열 폭: 좁힌 머리 줄바꿈 vs 말줄임.
+60
View File
@@ -0,0 +1,60 @@
# 조사 D2 — B08 집계표 셋 · 좌측 패널 옵션 (10-8 저녁 · 읽기 전용 조사 에이전트)
엑셀은 랩탑에 있음 — `resources/knowledge/original/실무문서/2024년 간선임도(기번3-울진.대흥)(2공구)/수량산출/4.2 수량산출(2공구).xlsx`(29시트 · openpyxl read_only · 식 · 값 둘 다).
## 1. 실무 집계표 셋
- 보이는 시트(12): 표지 · 구조물집계표 · 총괄자재수량집계표(A1:H27) · 콘크리트소요자재집계표(A1:I11) · 자재수량집계표(A1:AD68) · 구조물토공 · 토적집계표 · 사토운반본선 · 수리집수면적유역도 · 측점 시트 셋 / 숨긴 17(목차 · 설계설명서 · 혼합석부설 면적산출서 → 자재 C32 · 확폭 · 사방공종 집계표 · 폐목 · 운반거리이정표 등).
- 끌어오는 차례: 구조물집계표 16행(계) → 자재수량집계표(× 단위수량 · 66행 계) → 콘크리트소요(I66 · R66 × ㎥당 배합) → 총괄(+ 할증 · 올림).
- 자재수량집계표: 머리 3단(자재 › 규격 › 단위) · 앞 5열 = 구분 · 규격 · 수량 · 단위 · 구분(단위수량/수량) · 자재 열 25개 — 레미콘 25-24-15 · 25-21-80 · 25-18-80 · 콘크리트(기계) ㎥ · 이형철근 D13~D25 kg · 파형강관 Φ800 · 1000 · 1200 m · 모르터 1:3 · 돌(채집) L3:35 · 45 · 고임돌 · 막자갈 · 혼합골재 ㎥ · 호안블럭 · 와이어메쉬 · 떼 ㎡ · 수로관 400C 본 · 스틸그레이팅 EA · 돌(구입) L3:35 · 45 ton · 구조물집계표 열 하나 = 두 줄(「단위수량」 손 상수 · 「수 량」 = `$C × 단위수량`) · A~D 칸은 `구조물집계표!{열}1 · 3 · 16 · 4` · 구조물 30종 6~65행 · 66행 = `SUMIF(E,"수 량")` · 68행 채집석 공제 274.66 은 토적집계표!H32 가 사토에서 뺌 · 예 기슭막이 찰 H=2.0 m당 = 레미콘 0.31 · 콘크리트(기계) 0.42 · 모르터 0.019 · 돌(구입) L3:45 1.92 ton · 고임돌 0.31 · 막자갈 0.75.
- 콘크리트소요자재집계표: 머리 2단(시멘트 · 모래 · 자갈 각 「㎥당」 · 「수량」) · 수량 = ㎥당 × C · 줄 = 콘크리트 Φ25 · Φ40 · Φ40 무근(C 빈칸 · 자재!I66 27.73 · 빈칸 · 시멘트 346 · 323 · 312 kg · 모래 0.51 · 0.48 · 0.46 ㎥ · 자갈 0.59 · 0.65 · 0.70 ㎥) · 모르터 1:2 · 1:3(빈칸 · 자재!R66 1.162 · 시멘트 680 · 510 · 모래 0.98 · 1.10) · 계 시멘트 9,549 kg · 모래 14.59 · 자갈 18.02.
- 총괄자재수량집계표: 열 = 구분 · 규격 · 단위 · 수량 · 할증 · 합계 · 비고 · 합계 = `ROUNDUP(E×(1+F),0)`(레미콘 25-18 · 철근만 ROUND 2 · 3자리) · 줄 = 모래 · 자갈 ㎥(콘크리트소요 G11 · I11 · 할증 6 · 4 % · 14.59→16 · 18.02→19) · 막자갈 · 혼합석(4 · 2 %) · 레미콘 25-24-80 · 25-21-80 · 25-18-80(1 · 2 · 2 % · 31→31.62) · 이형철근 D13 · D16 · D19 ton(자재 ÷ 1000 · 3 %) · 와이어메쉬 · 떼 ㎡(없음 · 10 %) · 시멘트 40kg/대(콘크리트소요 E11 ÷ 40 · 2 % · 238.7→244) · 파형강관 Φ800 · 1000 · 1200 m(없음 · 84 · 16 · 22) · 커플링밴드 개(구조물집계표 AL16 · AP16 · AR16 · 9 · 2 · 3) · 깬돌 L3=35 · 45 TON(15 · 39).
- 실무 엑셀 흠(추정): 번호 「4」 둘 · 6 · 7 차례 뒤바뀜 · A64 이름 「관공(Φ1500)」인데 값은 Φ1200 열 · 머리 25-24-15 와 총괄 25-24-80 다름 · 공구마다 꼴 다름(1공구는 「총괄집계 · 수량집계표 · 콘크리트자재」 · 자재표에 터파기 · 되메우기 · 잔토 열 `(1공구)/_분석_수량산출.md:15 · 61-89`).
우리 자료로 채우기
| 칸 | 우리 쪽 원천 | 지금 |
|---|---|---|
| 파형강관 m · 커플링 개 | 98 `GET /quantity/summary` total(`pipe:len|Φ` · `pipe:cp|Φ`) | 바로 됨 |
| 기슭막이 · 돌붙임 · 관보호공 수량 C | 같은 98 total | 배관에 딸린 것만 |
| 그 밖 구조물 수량 | B08 집계표 조합 열(칸 빈칸 `UI_Summary.ts:137-141`) | 없음 |
| 단위수량(원단위) | 후보 ① M02 일위대가 `자재[]` + 로직 재료 줄(`M02_Labor_Doc.py:381-469` 추정) ② 지식DB 실무 원단위(`_종합비교/04_임도구조물_원단위.md` · `_원단위라이브러리_울진소광.md`) ③ 옛 엔진(`tmp/old_code/…UnitQuantity*.py` · 「옛 코드 안 가져옴」 `UI_Page.ts:8`) | 원천 정해야 함 |
| ㎥당 배합 | M01 표 QF000353(산림품셈 12-1-3 주⑤ · 40 mm (B) = 시멘트 323 · 모래 775 · 자갈 1101 kg — 실무와 시멘트 같음) · 로직 GF000156 · 모르터 건축 9-1-1(1:2 = 680 kg/0.98 ㎥ · 1:3 = 510/1.10) | 있음 · 골재 kg→㎥ 단위중량(CC000337) 환산 필요 · 무근 312 kg 근거 없음 |
| 할증률 | 지식DB `수량산출_일반.md:52-73`(품셈 1-3-1) · 실무 관측 `_종합비교/04…md` | 데이터 파일 없음 |
- 고칠 자리: 서버 단독 새 길(예 `GET /api/projects/{id}/quantity/materials` · 새 `B08_Quantity_Router_Material.py` · `main.py:649-651` 옆) · 98 `_summary`(`Router_Summary.py:294-296`) 결과를 수량으로 · 화면 새 `B08_Quantity_UI_Material.ts` · 분기 `UI_Page.ts:75-76`(보조 탭 목록 :36-41).
- 재사용: 공용 표 `createDataTable`(다단 머리 group · 합계 줄 total · 고정 열 frozen · setRows) · 줄 방향 세로 병합 없음(빈칸).
- 위험: 옛 결정 ㉢ 「배합 분해는 B09 일위대가 몫 · 둘 다 쪼개면 시멘트 두 배」(`old …Engine_UnitQuantity.py:13-17`)와 콘크리트소요자재집계표가 부딪힘 · 옛 엔진 「할증은 자재총괄 한 곳」 · 모르터 배합표 「재료량은 할증 포함」인데 실무는 시멘트 계에 2 % 또 붙임(중복) · 1공구 모래 할증 10 % 는 현행 품셈 상한 넘음.
- 크기: 큼(원단위 원천이 몸통) · 첫 걸음으로 총괄 › 파형강관 · 커플링 줄만이면 작음.
## 2. B08 좌측 패널
- 현재: B08 은 `leftPanel` 안 넘김(`UI_Page.ts:124-133`) → 좌측엔 [?] 줄만(`ui_template_workflow_layout.ts:194-195`) · 메인 탭 = 구조물 · 토공 · 수리집수면적표(`UI_Page.ts:27-31`).
- 고칠 자리: `UI_Page.ts` 좌측 패널 = 컨테이너 셋 + 맨 끝 `.ui-sidebar-actions` 줄(패널 스크롤 칸 · 단추 줄 · [?] 자리가 이 줄 기준 `ui_template_overlay.ts:116-136`) · locale b4 글.
- 재사용: 컨테이너 = `section.ui-collapsible.ui-sidebar-section.ui-sidebar-card` + `h3.ui-collapsible__title` + `attachCollapsible`(B07 `B07_DesignDetail_UI_Panels.ts:129-148` 꼴 · B05 칸 모양 = 공용 `.ui-sidebar-card` `ui_template_overlay.css:406-416`) · 입력 = `createInputField({type:"number", compact:true})`(`ui_template_elements.ts:63-127` 「좌측 패널용」) · B05 와 똑같이 보이려면 `numberField`(`B05_Profile_UI_Panel_Fields.ts:94-105`) · 2열 줄(`B05_Profile_UI_Panel_Settings.ts:127-134`) — B05 전용 CSS(`B05_Profile_UI_Style.css:286-331`) · 공용 2열 줄 없음.
- 위험: `createSectionFrame`(`design_panel.ts:75-97`)은 B05/B06 전용 · test_61_2 가 `UI_Page.ts` 안 `"sheet"` 글이면 실패(:15).
- 크기: 작음(~40줄).
### 2-1 구조물 › 배관 1본 길이(기본 8 m)
- 현재: `one_pipe_length`(`Router_Summary.py:71-78`)가 프로젝트 층 M02 표 `변수.파형강관_1본_m` · 없으면 시스템 층 8(`master_template/table/구조물집계표.json:15-21`) · 커플링 = 올림(L ÷ 1본) − 1(:81-85) · 이 변수 고치는 화면 없음 · 읽는 곳 B08 하나.
- 같은 자리 쓰기(권장 · 추정): 새 좁은 길(예 `PUT /api/projects/{id}/quantity/options`) — 서버가 `read_template` → 변수 한 칸 → `write_template(check_version=True)`(`M02_Template_Layers.py:156-167 · 233-251`) · 프로젝트 사본은 프로젝트 만들 때 깔림(`seed_project` :372-392) · M02 통째 저장 길(`M02_MasterTemplete_Router_Layers.py:317-375`)은 무거움.
- B08 설정 파일 안: 값 두 벌 · M02 표 식 `[$파형강관_1본_m]` 이 못 봄 · 98 결정과 어긋남.
- 저장 · 실시간: 조작은 캐시(`b_page_state.ts:46` 에 `b08-options` · 선례 `b08-hydro` :167-168) · [저장]은 좌측 패널 단추 줄 · 실시간 (가) 미리보기 요청 `?one_m=` + 최신 응답만(수리 탭 `UI_Hydro.ts:10 · 126 · 173-181`) (나) TS · 파이썬 짝(한 줄 식 + 거울 시험 · 같은 측점 관은 길이 더해 한 칸 `Router_Summary.py:131-133` → 관마다 길이를 응답에 실어야).
- 위험: M02 [초기화](`reset_project` :407-431) · 다른 층 [적용]이면 1본 길이도 되돌아감 · 실무 2공구는 6 m(`INT(R/6.00000001)`).
- 크기: 중간.
### 2-2 토공 › 암 비율 연암 : 경암(기본 90 : 10 · 합 100)
- 현재: 토적표 「절토 › 연암」 열은 이름만 연암 · 실제 암 전체(`UI_Earthwork.ts:86-91`) · 토공집계표 연암 · 경암은 측점 `cut_rock_kind` 로 나눔(`Engine_Earthwork.py:303-307` · `Engine_Earthwork_Summary.py:70-79`) · B06 은 암을 늘 `ripping_rock` 하나로 저장 · 비율은 「설계내역에서 설계자가」(`B06_Section_UI_Cross_Design.ts:69-81`) → 지금 경암 0 · 연암 = 암 전체.
- 곱할 자리: `summary_rows` 연암 · 경암 네 줄(`Engine_Earthwork_Summary.py:72 · 74 · 77 · 79`) → `cut_rock_volume_m3 × r` · `× (1−r)`(측구 터파기도) · 비율은 `Router_Earthwork.py:47-54` 에서 · 실무 토적집계표도 `G10 = H10*I10` · `I11 = 1−I10`(2공구 0.5 · 1공구 20 : 80).
- 저장: 이미 있는 `project_settings.json › quantity › rock_ratios_pct`(`common_util_project_settings.py:85-87` · 기본 암 갈래 세트 geochang5 에 연암 · 경암 :57-64) · 쓰기 `save_section(…, replace_keys=("rock_ratios_pct",))`(:222-248 · 부르는 곳 · HTTP 길 없음 · 옛 `old …Router_Earthwork_Settings.py` 참고) · 기본 90 : 10 은 파일에 안 쓰고 읽을 때 채움(:20-22).
- 실시간: 토공 응답에 암 합계(`totals.cut_rock_volume_m3`) 있음 → 곱하기만 · 미리보기 `?soft_pct=` vs TS · 파이썬 짝 · 두 칸 input 이벤트로 다른 칸 = 100 − 값(0~100).
- 위험: `mixed_conversion_factors`(:330-353)가 비율 · 시공법 둘 다 있으면 암 환산계수 C 가중 · B06 유토곡선도 씀(`B06_Section_Server_Calc_Prebuild.py:101 · 269`) · 지금은 시공법 비어 영향 없음 · 연암 · 경암 따로 반올림 → 암 계와 ±1 ㎥ · 시험 test_69:185-187(연암 48 · 경암 0) · :203-213(머리 글) · test_rock_mixed_conversion.py:66 은 지금 라우터와 이미 어긋나 보임.
- 크기: 중간.
## 3. 시험
B08: test_61_1 · test_61_2 · test_61_3 · test_69_b08_earthwork_tabs · test_b08_earthwork_table · test_98_b08_pipe_summary(1본 :194-210) · test_62_2 · test_69_b08_hydro_site · test_73_1 · test_73_11 · test_96 · test_110 / 공용: test_ui_data_table(+ helper) · test_ui_side_panels · test_session_keys_registered · test_rock_mixed_conversion · test_m02_template_layers(:364 변수 지킴) · test_m02_table_fill.
## 미결 (조사 에이전트 제시)
1. 자재 원단위 원천: M02 일위대가 자재 / 실무 라이브러리 고정표 / 옛 엔진.
2. 시멘트 · 모래 · 자갈 분해 자리(옛 결정 「B09 일위대가 몫」 충돌 · 「재료배합 계상 안 함」 짝).
3. 할증률: 품셈 1-3-1 vs 실무 · 모르터 중복 할증 · 관급 파형강관 할증 없음.
4. 배합 기준 (A)(B)(C) · 25/40 mm · 무근 312 kg 근거.
5. 1본 길이 저장: M02 표 변수(한 벌 · M02 초기화 때 같이 되돌아감) vs B08 설정 파일.
6. 비율이 환산계수까지 바꿀지(연암 = 리핑 · 경암 = 발파 고정?).
7. 토적표 「절토 › 연암」 열 → 연암 · 경암 두 열.
8. 좌측 패널: 컨테이너 셋 늘 보임 vs 지금 탭만 · 실시간 = 미리보기 vs 짝 · [저장] 자리.
9. 「등」 범위: 구조물토공 · 혼합석부설 면적산출서.
10. 원문 「연암 90, 연암 10」 = 경암 10 오타(추정).