diff --git a/docs/raw/요구_1008_4/검토_B05_3D_메시변형.md b/docs/raw/요구_1008_4/검토_B05_3D_메시변형.md new file mode 100644 index 000000000..15cea6a26 --- /dev/null +++ b/docs/raw/요구_1008_4/검토_B05_3D_메시변형.md @@ -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`) 폐기. diff --git a/docs/raw/요구_1008_4/분석_정함.md b/docs/raw/요구_1008_4/분석_정함.md new file mode 100644 index 000000000..e66cab865 --- /dev/null +++ b/docs/raw/요구_1008_4/분석_정함.md @@ -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`) | 혼자 | diff --git a/docs/raw/요구_1008_4/조사_A_M02.md b/docs/raw/요구_1008_4/조사_A_M02.md new file mode 100644 index 000000000..05447759a --- /dev/null +++ b/docs/raw/요구_1008_4/조사_A_M02.md @@ -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 도면」 이름표가 맞는지 · 아래 알약 막대로 옮기고 이름표 지울지 · 「도면에 없음」 줄 자동 정리. diff --git a/docs/raw/요구_1008_4/조사_C_B05B06화면.md b/docs/raw/요구_1008_4/조사_C_B05B06화면.md new file mode 100644 index 000000000..139253578 --- /dev/null +++ b/docs/raw/요구_1008_4/조사_C_B05B06화면.md @@ -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 | 자체 겉틀 · 제목 `` | 겉틀 유지 권장 · 제목줄만 `ui-modal__top` 꼴 | +| RC:64 · 82 | ✕ 닫기 · 재기 상자 ✕(`__measure-close`) | createButton ghost(UE:43 · UM:34 와 같게) | +| RL:124-125 | 곡선 지우기 토글 · ✕ | createButton ghost sm | +| RL:128-139 | 반지름 · 곡선 길이 `