chore(sync): 공유 docs 파일 담음 — 합류점과 맞춤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-06 17:00:53 +09:00
co-authored by Claude Opus 5.5
parent 7b65c016fa
commit 2294eae6e3
7 changed files with 626 additions and 0 deletions
@@ -0,0 +1,22 @@
# 구조물 표 09 — 사면안정 › 흙막이 · 옹벽 · 소단 (사용자 10-6 · 원문 그대로)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목
(필수)컨테이너 제목 : 흙막이
사면안정 흙막이 측점 No, + 측점거리 형태 돌 쌓기(찰), 돌 쌓기(메), 콘크리트, 돌망태, 통나무/목재틀, 바자
길이 수기입력
높이 수기입력 및 횡단도에서 제어
기준측점 전 수기입력(길이 + 기준측점 전/후에 따라 연동 계산)
기준측점 후 수기입력(길이 + 기준측점 전/후에 따라 연동 계산)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목
(필수)컨테이너 제목 : 옹벽
사면안정 옹벽 측점 No, + 측점거리 형태 콘크리트
길이 수기입력
높이 수기입력 및 횡단도에서 제어
기준측점 전 수기입력(길이 + 기준측점 전/후에 따라 연동 계산)
기준측점 후 수기입력(길이 + 기준측점 전/후에 따라 연동 계산)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목
(필수)컨테이너 제목 : 상세 내용
사면안정 소단 측점 No, + 측점거리 소단 폭 수기입력
소단 높이 수기입력
@@ -181,3 +181,146 @@ B05에서 3D 영역의 상단 버튼들 중 원근으로, 직교로 버튼의
(10-6 사용자 · 추가 요청)
- 페이지의 좌측 패널의 공통항목으로 들어온 버튼 세트의 버튼 크기가 조금 이상함. 점검
(10-6 사용자 · 답)
1. 공통 › 횡단도: 이 부분은 요청을 잊음. 생각나면 다시 말하겠음. 이슈 닫음
2. B05와 B06은 공간이 부족하여 분리되어있는 상태임. 공통양식으로 좌측 패널을 사용하는 이유이며 어느 페이지에서 수정하던 공유가 되고 해당 값에 의해 종단과 횡단이, 페이지 제어가 되어야함. 꼼꼼히 분석 후 일원화 방향으로 제안. 단, 현재의 좌측패널로 종횡단 제어가 되어야함. 불필요한 정보라면 삭제도 가능(특히 이전 B08의 수량산출로 넘어가는 정보들은 재정의 필요)
3. 반영
4. 일단 유지
5. 너의 편의대로 진행
(10-6 사용자)
추가된 구조물 조합 연결 램프에서 색상의 정의를 알려줘. 그런데 빨간색보다는 지정안된 항목은 회색이 좋아보임
다음 수정 B05/B06의 좌측 패널 컨테이너 중 경로 계산 설정 항목은 아주 예전의 자료로 이제는 필요 없어보이는데 관련 코드들이 사용하고 있는지 확인하고 없다면 일단 B05폴더에 Old 서브 폴더를 넣어줄것. 나중에 한번에 삭제예정
(10-6 사용자)
횡단배수 중 배관에서 관보호공의 유출 쪽에 단 추가 항목과 단 컨테이너 생성이 사라진것같음. 확인
(10-6 사용자)
한번에 하나씩 진행하겠음. 일단 B08 페이지는 지금도 구현했다가 삭제한 상황임. 로직이 많이 이상함. 그래서 다시 B05/B06부터 다시 시작임. 과거의 자료들 중 사용하는 로직과 사용하지 않는 로직들이 잇으니 조사해야함.
수정 요청
- 횡단 배수의 3개 필수 컨테이너는 정상으로 보임.
- 지금 반영하고 있는 추가 기슭막이 부분까지 반영하고 '관 길이 11m 좌우 바깥 1.3m 상하(사면) 자동 자리' 이런 쓸대없는 정보는 삭제
- 추가 기슭막이에 의해 신규 컨테이너가 생성되었으니 구조물리스트의 램프도 추가되어야함.
- 횡단도의 흙막이 위치변경에따라 관 길이가 결정되는데 이 값이 좌측 패널에서는 업데이트 안됨.
(10-6 사용자)
추가 흙막이 단 추가 확인 여기서 다시 개선.
횡단도에서 구조물을 선택했을때의 정보와 그만 리스트를 선택했을때 보이는 정보에서 내용차이는 없고 하이라이트 여부만 차이가 있어야함.
(10-6 사용자)
1. 추가 픍막이의 경우 하이라이트가 풀리는 경우가 있음.
2. 관보호공에 옵션 중 경사 옵션외 연동옵션도 있었던걸로 기억함. 연동이나 경사는 하나의 영역에 2개가 동시(버튼 폭 절반의 의미)에 보여주고 자동 연산에 따라 가능할 경우 활성화하고 사용자에게 연동할지, 경사를 반영할지를 받음.
3. 컨테이너 내부의 값을 변경하거나 선택하면 하이라이트 연동
4. 추가 흙막이는 사면 안정그룹의 흙막이와 옵션이 동일함. 일원화 작업(다시 말해 구조를 선택할 일이 없음. )
5. 사면 안정그룹의 종류 선택에서 흙막이, 옹벽, 소단만 남겨둘것.
(10-6 사용자)
다음으로 리스트 항목, 횡단도, 종단의 측점 세로선 들이 연동되어 있는데 여기서 선택된 항목에서 구조물 배치를 변경할 경우 동작할 경우 변경되어야하는 내용이 있음.
1. 기존에 지정된 항목을 보여준 상태에서 구조물 군을 변경하는 경우에는 신규추가의 의미로 리셋이 된 상태여야함. 동일 구조물군에서의 이동은 해당 항목으로 이동한다는 의미로 기본값을 적용한 상태로 변경되어야하면 다시 돌아갈경우 캐시를 물고 있는 상태로 이전 구조물의 설정값을 가지고 돌아갈수 있어야함. 단, 저장이나 확정을 누를 경우에는 캐시가 비워짐.
(10-6 사용자)
다음 수정
- 횡단도의 컨테이너 폭이 너무 커서 높이가 높아짐. 최대/최소 컨테이너가 폭을 조절하여 1.5행 정도가 보이게 조절하는 방법이 있는지 확인. 스케일을 망가뜨리면 안됨
- 종단 하단 패널 전체를 브라우져 창에서 별도로 동작하게 할수 있는지 확인
(10-6 사용자)
횡단 카드 폭과 종단 하단 패널(테이블, 유토곡선, 배수유역도 포함) 둘다 너의 제안대로 반영해줘. 반영해주면 내가 직접 검증하겠음
(10-6 사용자 · 배관 기본값)
관 컨테이너 관경 배수유역에 의해 자동설정 값, 사용자에 의해 변경 가능
관길이 횡단도의 관 보호공의 위치에 의해 결정, 사용자 변경 불가
관 보호공(공통) 구조 집수정
관 보호공(유입)_집수정 구조 집수정 일 경우
형태 L형
높이 1.5
관 보호공(유입)_흙막이 구조 흙 막이 일 경우
형태 돌 쌓기(찰)
길이 10
높이 1.5
기준측점 전 5
기준측점 후 5
관 보호공(유출)_흙막이 구조 흙막이 일 경우(구조 선택지 하나밖에 없음)
형태 돌 쌓기(찰)
길이 10
높이 1.5
기준측점 전 5
기준측점 후 5
추가 흙막이 단 0
연동 TRUE(활성화 될 경우)
경사 TRUE(활성화 될 경우)
추가 흑막이 구조 흙막이 일 경우(구조 선택지 하나밖에 없음)
형태 돌 쌓기(찰)
길이 10
높이 1.5
기준측점 전 5
기준측점 후 5
연동 TRUE(활성화 될 경우)
경사 TRUE(활성화 될 경우)
* 사면안정 구조물 군의 흙막이도 동일함, 일원화
* 연동과 경사는 공간이 부족하여 줄바꿈처리됨. 글자를 조금 줄여서 줄바꿈 안되게 반영하거나 글자 주변 여유를 조금 줄일것
(10-6 사용자)
횡단도의 노폭과 노견 확장에 대한 정보를 횡단도 중심에 있는데 이걸 아래로 X 축라벨 상단으로 빼는게 좋겠어.
(10-6 사용자)
구조물군 변경시에 횡단도 하이라이트 초기화 안됨
(10-6 사용자)
다음 배관과 흙막이의 선택지에 대한의견임. 선택 안함 항목들은 그냥 값이 없어야함. 기본 값이 아니라.
(10-6 사용자)
1. 관 보호공 유입에서 연동과 경사 옵션은 결국 종단방향의 길이가 있는 것들에만 들어가는 옵션이야.
2. 집수정 옵션에서 내공이라는 옵션이 나오는데 의미가 뭔지 모르겠음. 필요없는 정보로 보임.
(10-6 사용자)
3. 연동과 경사 버튼의 높이를 추가 흙막이의 + 버튼의 높이와 같게 이건 구조물 배치 컨테이너의 하위 컨테이너 내부의 항목들 공통임. 템플릿으로 만들어서 반영. 그렇다고 삭제, 리셋 버튼까지 바꿀필요는 없음.
(10-6 사용자)
기본값은 비워져 있을때 대체해서 넣어주는 값이아니라 그냥 프론트엔드에 그냥 값을 넣은 상태로 보여줬으면 해.
(10-6 사용자)
돌쌀기(메)의 경우 형상이 원지반에 붙어서 연장됨. 형상 정보에 대해 재정리 하겠음.
1. 관보호공의 흙막이, 사면보호의 흙막이, 옹벽, 추가 흙막이 등은 전부 같은 로직으로 형상을 횡단도에 그려지고 동작해야함
2. 관보호공의 흙막이는 배관에 연동되에 위치제어만 제약이 생김.(배관은 m 단위로 떨어져야 함으로)
3. 형태에 따라 다른건 내부 그림의 형태만 변경을 함.
4. 각각의 형태별로 원지반을 침투하는 리밋과 높이 리밋이 존재하는데 이부분은 삭제(사용자에게 선택권을 주겠음.)
5. 단 노면위로 올라오는건 방지.
(10-6 사용자)
빈칸은 그냥 빈칸이야. 별도의 안내는 필요없어. 기본 값 XX 라 흐린 글씨로 작성하지 말고 기본값을 사용자가 넣은 것 처럼. 기본값을 입력하면 된다는 말이야. 그리고 필수로 집수정이낭 흙막이처럼 필수로 필요한 정보에는 선택안함 선택지 자체가 없어야해.
(10-6 사용자)
기존 프로젝트에서 존재하는 예전 데이터 때문에 검증이 어려운것같은데 쉽게 데이터를 초기화하고 신규로직으로 적용되게 하는 방법은 없어?
B 방향이 맞겠네. 새 프로젝트를 만드는건 문제없어보여. 이때 개별 워크트리들이 검증할수 있는 프로젝트를 각각지정해주는게 좋겠어. 그리고 추가로 엄상준과 박동철 프로젝트도 같이 만들어줘. 같은회사 검증자 들이야. 이 사람들도 본인의 프로젝트로 검증할거야.
이전 프로젝트는 그냥 삭제해
전부 다 손대도 상관없음 프로젝트 전역 초기
(10-6 사용자)
그런데 이전 프로젝트를 삭제할때 대시보드에서 리스트가 나오는데 정리해줘.
(10-6 사용자)
내가 원지반 제약에의 구조물 형상 생성 및 제어 제약에 대해 락을 풀어달라고 했는데 반영이 안된것 같아. 확인해봐.
(10-6 사용자)
다음으로 종단 패널의 종단도에서 알약선택시 나오는 선택정보 창에서 내용은 옵션 제목은 필요없고 구분기호 하나 넣고 옵션값만 구조물 이름 행과 2행은 옵션값만으로 표현해도 됨
(10-6 사용자)
횡단도에서 형상의 제약조건이 어떤게 있는지 확인 좀 해줘. 배관과 흙막이, 옹벽관련 내용들만 일단 찾아줘.
(10-6 사용자)
다음으로 좌측 패널에서 서브 컨테이너의 항목을 선택/변경/생성 할 경우에 횡단도에서 선택한것처럼 이동되어야할것같아.
(10-6 사용자)
추가로 배관의 도수로/돌붙임의 경우에는 복수 값이 아니야. 생성이 되었다면 추가 버튼이 없어져야함.
(10-6 사용자)
1. 종단도의 구조물 알약의 이름이 구조물군의 종류 값과 매칭이 안됨. 같은 값을 보게 개선.
2. 종단도에서 배관이 선택한 상태에서 다른 지점에 옹벽을 추가하기 위해 마우스 오른쪽 버튼을 클릭후 사면안정을 눌렀더니 하위 리스트는 안보이고 리셋된 상태가 됨. 확인
(10-6 사용자)
1. 도수로 돌붙임에는 컨테이너 제목에 1과 2 같은 정보는 필요없어보임.
2. 구조물의 높이 선택에 따라 제약이 발생한 경우 토스트 메세지 발생. 이것도 흙막이, 집수정, 옹벽, 관 보호공에서 높이 제약을 풀어줘. 사용자가 선택하게 할거야. 이건 이전에 요청했던 내용이야.
(10-6 사용자)
다음부터는 이제 워크트리별로 작업영역을 지정해서 진행하자. 지금 프로그램 폴더기준으로 M02, B05/B06 구조물 배치 패널, B06 횡단도 형상 제어, B07 상세 설계, B08 수량산출 페이지에 대해 분리하여 워크트리를 나눠서 너가 지시했으면 해. 이 방식은 한시적으로만 운영할 생각임.
@@ -0,0 +1,91 @@
# 54-16 B05 · B06 자료 한 곳 확인 (조사 · 보고만)
- 기준 커밋 `2104cc359` · 검증 프로젝트 `sub8_검증`(`c81b21f8…`) · 노선 224
- 측정: 같은 창 안 넘김은 ORCA 탭 + `orca eval`. 도중 ORCA 탭이 통째로 새로 만들어져 세션 초안이 사라짐(앱 흠 아님) → 저장 · 새로고침 시나리오는 측정 전용 헤드리스 Chrome(같은 프로브 · 화면 안 띄움). ORCA 탭은 닫음
- 값 되돌림: 높이 2 · 관경 1000 · 60m 계획고 865.48 · 3+0 측구 일반 으로 저장해 되돌림 확인. 단 횡단 저장 때 서버가 면적을 다시 계산해 누가토량은 −13,417.5 → −12,843.4 로 바뀜(서버 정본 재계산 결과 · 되돌릴 값 아님)
## ① 자료마다 쥔 곳
세션 키 꼴 `aislo:{bucket}:{name}:{project}[:{route}]` (`A00_Common/b_page_state.ts:229-238`). 설계 가게(`design_store`)는 따로 값을 들지 않고 이 키를 바로 읽고 씀(`A00_Common/design/design_store.ts:133-153`) · 구독자 0.
| 자료 | 기준 자리 | 같이 쥔 곳(두 벌) | 쓰는 곳 | 읽는 곳 |
|---|---|---|---|---|
| 구조물 목록 | ss `draft:structures` | 종단 다리 `ownStructures` · 횡단 패널 `structures` · 한 벌 폼 `structures` · 한 벌 종단도 `structures` · 서버 `structures.json`(보일 때마다 다시 받음) · 가게 칸 `structures`(아무도 안 씀) | `B05_Profile/B05_Profile_Api_Structures.ts:305` ← `B05_Profile_UI_Page_Structures.ts:245` · `B06_Section/B06_Section_UI_Page_Structures_Panel.ts:177` | `B05_Profile_UI_Page_Structures.ts:331` · `B06_..._Structures_Panel.ts:345` · `B06_Section_Section_Store.ts:61` |
| 구조물 옵션 | 구조물 초안 안 `options` | 명세 폼 `state`(`A00_Common/design/design_structure_form.ts:278,286`) | 폼 commit | `B05_Profile_UI_Structures_Panel_Commit.ts:94` |
| 관 옵션 | 관 초안 안 `options` | 배수유역도 `facilityStore` · 횡단 캐시 culvert/ford/box 스펙 · ss `culvertopt` · ss `revetx`/`fordadjust`/`boxadjust` | 종단 `B05_Profile_UI_Drainage_Panel.ts:612` · 횡단 `B06_..._Structures_Panel.ts:277-284` · `B06_Section_UI_Page_Span_Control.ts:112` · `B06_Section_UI_Page_Ford_Controls.ts:204,398` | `design_view_cross.ts:623`(마운트 한 번) · 저장 `B06_Section_Api_Culvert_Options.ts:64` |
| 컨테이너 값 | 관 `options` 의 `soil_add_{n}_*` | ss `extrawall`(단 수) · ss `extraspan` + 캐시 `extra_spans` · ss `revetx` · 모듈 전역 `sectionsSource`/`extraCountSource`(나중에 선 보기가 이김) | `B06_Section_UI_Page_Station_Controls.ts:324` · `B06_Section_UI_Page_Span_Control.ts:78-80` · `B06_Section_UI_Page_Pipe_Options.ts:229` | `design_structure_spec.ts:112-140` · `design_view_cross.ts:298` · `design_structure_pipe_calc.ts:32,60` |
| 잇기 | 관 · 구조물 초안 `summary_item`/`group_items` | 배수유역도 `facilityStore` · ss `revetlink`(마운트 때 한 번) | `B05_Profile_UI_Drainage_Panel.ts:599-600` · `B06_..._Structures_Panel.ts:245-259` | `B05_Profile_UI_Structures_Panel_Commit.ts:114,198` |
| 관 지점 | ss `draft:pipes` | 배수유역도 `pipeEditor` + `facilityStore` · `shared.lastPipes` · 종단 보기 `lastPipes` · 횡단 패널 `pipeFacilities` · 한 벌 폼 `pipeFacilities` · 종단 다리 `pipeStations`/`pipeMarks` · 서버 `pipe_points.json` | `B05_Profile_Api_Pipes_Draft.ts:27` ← `Drainage_Panel.ts:397` · `B06_..._Structures_Panel.ts:430` | `Drainage_Panel.ts:404` · `B06_..._Structures_Panel.ts:350` · `B06_Section_Section_Store.ts:105` |
| 종단 계획선 | ss `draft:alignment-draft` | 모듈 전역 EditState Map(`B05_Profile_UI_Profile_Edit.ts:143,188`) · 한 벌 종단도 `store`/`base` | `B05_Profile_UI_Profile_Edit.ts:198` | `:97` · `B06_Section_UI_Page_Design_Sync.ts:132` |
| 횡단 설계 patch | 메모리 캐시 Map(`B06_Section/B06_Section_Section_Store.ts:178-201` · 두 보기 공유) | ss `result:section-detail` 사본(받을 때만 씀 · 고침 안 받음) · ss `crossdesign` · ss `rockb`/`cutslope`/`berm`/`crossw`/`inletstruct`/`basinadjust`/`std-cross` · 종단 보기 `currentSectionDetail` · 횡단 보기 `sectionDetail` | `B06_Section_Cross_Design_Session.ts:55` · `design_view_cross.ts:270-296,430` | `B06_Section_Cross_Refresh.ts:253`(재계산 때만) · `B06_Section_UI_Page_Persist.ts:377` · 마운트 `design_view_cross.ts:565-567,612` |
| 사토 | 구조물 목록 안 사토장 | 캐시 `design.spoil_fill_*` | 서버 저장 때만 `B06_Section_Server_Calc_Prebuild.py:197` | `B06_Section_Cross_Refresh.ts:316-327`(저장분 폭 그대로) |
| 선택 상태 | ss `draft:structure-pick` | 가게 `selection` + ss `draft:selection`(아무도 안 씀) · 횡단 `appliedPick` | `design_selection.ts:152,172` | `design_selection.ts:112` · `B05_Profile_UI_Structure_Pick_Session.ts:34` |
## ② 재현 (측정)
같은 창 안 넘김 · 저장 전
| 자료 | B05 바꿈 → B06 | B06 바꿈 → B05 |
|---|---|---|
| 구조물 옵션(돌쌓기 높이) | 맞음 — 폼 1.5 · 카드 H=1.5m | 맞음 — 1.8 |
| 관 옵션(관경) | 맞음 — 1200 | 맞음 — 800 |
| 종단 계획선(60m ▲) | 맞음 — 865.68 | 맞음 — 865.78 |
| 선택 | 맞음 — 같은 구조물 고름 | 맞음 |
| **누가토량(같은 초안)** | **어긋남 — B05 −13,478.3 · B06 −12,888.7** | 넘긴 뒤 B05 가 B06 값(−12,931.8)으로 바뀜 |
저장 · 새로고침 (B05: 높이 1.2 · 관경 1200 · ▲2 → B06: 측구 L형 · 관경 800 · 높이 1.0)
| 단계 | 높이 | 관경 | 60m 계획고 | 3+0 측구 | 누가토량 | 판정 |
|---|---|---|---|---|---|---|
| 새로고침 뒤 B05 (저장 전) | 1 | 800 | 865.68 | (B05 안 보임) | **−12,915.6** (직전 −12,931.8) | **옛 값** — L형 초안이 계산에 안 얹힘 |
| 새로고침 뒤 B05 에서 [저장] → 새 창 | 1 | 800 | 865.68 | **일반** | −13,494.6 | **옛 값** — 「편집 내용을 저장했습니다」인데 L형이 안 나감 |
| 같은 창 → B06 | 1 | 800 | 865.68 | **일반**(ss 엔 L형 초안 남음) | −13,494.6 | **옛 값** — 화면은 일반 · [저장]하면 L형이 나감(화면 ≠ 저장) |
| B06 에서 [저장] → 새 창 | 1 | 800 | 865.68 | L형 | −12,931.8 | 맞음 |
| B06 관경 1000 바꾸고 바로 [저장] → 새 창 | 1 | **800** | 865.68 | L형 | −12,931.8 | **옛 값** — `pipe-points` PUT 두 번 · 둘째(배수유역도 메모리 800)가 덮음 |
재지 않은 것(코드 읽기만): 컨테이너 값 · 잇기 · 사토
## ③ 원인
두 벌 (6)
| # | 자리 | 왜 |
|---|---|---|
| D1 | 관 목록 세 벌 — ss 초안 · 배수유역도 메모리 · 횡단 `pipeFacilities` | [저장]이 초안을 보낸 **뒤** 배수유역도 메모리를 한 번 더 PUT(`A00_Common/design/design_shared.ts:275-281` → `B05_Profile/B05_Profile_UI_Drainage_Panel.ts:636-642`) → 늦은 메모리가 새 값을 덮음 |
| D2 | 관 옵션 네 곳 — 관 초안 · 횡단 캐시 스펙 · `culvertopt` · `revetx`/`fordadjust`/`boxadjust` | 저장 차례상 `culvertopt` 가 관 초안 뒤에 나가 이김(`design_save.ts:217-222,282-285`) |
| D3 | 흙막이 단 수 두 벌 — ss `extrawall` · 관 `soil_add_{n}_*` | 컨테이너 수는 `extrawall` 을 따름 · 모듈 전역 `sectionsSource` 는 나중에 선 보기가 이김 |
| D4 | 구조물 목록 — ss 하나 + 메모리 셋 + 보일 때마다 서버 | 숨은 쪽은 보일 때 서버 + ss 로 다시 세움(`B05_Profile_UI_Page_Structures.ts:319-322` · `B06_..._Structures_Panel.ts:334-341`) |
| D5 | 종횡단 상세 — 메모리 캐시 · ss 사본 · 종단 `currentSectionDetail` · 횡단 `sectionDetail` | ss 사본은 제자리 고침을 안 받아 늘 옛 값 · 종단 쪽은 진입 때만 받음(`design_view_profile.ts:410,442`) |
| D6 | 가게 빈 칸 셋(`structures` · `sectionDetail` · `selection`) + `draft:selection` 키 | 실제 자리는 다른 키 — 「한 곳」이 겉모양뿐 · `subscribe` 구독자 0 |
다른 보기로 갈 때 덮음 · 안 얹음
- **카드 선택 초안이 재계산 길에서만 얹힘** — `crossDesignChoices` 를 읽는 곳은 `B06_Section/B06_Section_Cross_Refresh.ts:253`(계획고 재계산)과 저장(`B06_Section_UI_Page_Persist.ts:377`)뿐 → 새로고침 · 저장 뒤 카드는 서버 설계(일반)를 보이고 ss 엔 L형이 남음 (재현 2 · 3)
- **일반 [저장]은 횡단 보기가 섰을 때만 횡단 초안을 보냄** — 안 섰으면 `saveCachedCrossPatches` 가 캐시 메모리만(`B06_Section_Section_Store.ts:259`) · ss 초안(`crossdesign` · `rockb` 등) 빠짐 · 그래도 「저장했습니다」 (재현 3)
- 종단 보기 onShow 가 횡단 자료를 다시 안 읽음(`B05_Profile_UI_Page_Life.ts:30-35` · `design_view_profile.ts:548-551`) · `applyPipes(lastPipes)`(`:550`)가 끝나지 않은 메모리 목록을 폼에 실음
- 횡단 onShow 에 관 옵션 초안 다시 얹기 없음 — 마운트 때만(`design_view_cross.ts:623`)
- 종단 [저장] 뒤 캐시를 비워도(`B05_Profile_UI_Page_Actions.ts:154`) 숨은 횡단 `sectionDetail` 은 옛 객체 → `forwardPipeOptions`(`design_view_profile.ts:299`)가 버린 객체를 고침
- 관을 전부 지운 빈 초안 `[]` 을 「없음」으로 봐 서버 목록을 받음(`Drainage_Panel.ts:405-407`) → [저장]이 지운 관을 되살림
한쪽만 알림
- **구조물 · 관 바꿈이 횡단 면적에 다시 얹히는 길이 횡단 쪽에만** — `refreshDetailForStructures`(`design_view_cross.ts:143`) · 종단 보기에서 바꾸면 종단 누가토량이 옛 면적 (재현 1: 같은 초안 −13,478.3 대 −12,888.7)
- `toAll("onPipesChanged")`(`design_shared.ts:158-161`) — 횡단 쪽 묶음(`B06_Section_UI_Section_View_Profile.ts:179-216`)에 받는 칸 없음 → 실제로는 종단만 받음
- 「구조물 배치」 폼 알림은 지금 보기에만(`design_shared.ts:183`)
- 관 옵션 넘김 한 방향 — 종단 → 횡단 `forwardPipeOptions` · 횡단 → 종단은 초안 + 200ms 재읽기(`design_view_cross.ts:146`)뿐
- 숨은 종단 보기는 관 목록을 담기만(`design_view_profile.ts:153`) → 횡단에서 [저장]하면 옛 비정규 측점이 `uphill` 로 나감(`B05_Profile_UI_Page_Actions.ts:128-134`)
## ④ 한 곳으로 모을 갈래 (8 · 작은 것부터)
목표: 자료 하나 = 세션 키 하나(가게 칸 하나) · 두 보기는 읽기만 · 바꿈 알림 한 길 · 보기 넘길 때 서버로 덮지 않음 · [저장]은 세션 키를 그대로 보냄(5장 데이터 3층)
| 차례 | 갈래 | 크기 | 고치는 재현 |
|---|---|---|---|
| 1 | 저장 줄기 관 한 번 — 둘째 `side.savePipes()` PUT 을 빼고 초안 하나만(시설 되붙이기는 초안 쪽에서) · `design_shared.ts:275-281` | 작음 | 관경 바로 저장 옛 값 |
| 2 | 카드 선택 초안(`crossdesign` · `rockb` · `cutslope` 등)을 상세를 **불러올 때 한 번** 캐시에 얹음(`B06_Section_Section_Store.ts` load) — 재계산 길에만 두지 않음 | 작음~중간 | 새로고침 뒤 카드 일반 · B05 누가토량 어긋남 |
| 3 | 일반 [저장]이 보기와 무관하게 횡단 ss 초안을 늘 보냄(`saveCachedCrossPatches` 가 ss 초안 포함) | 작음~중간 | B05 [저장] L형 빠짐 |
| 4 | ss `result:section-detail` 사본 — 제자리 고침을 같이 쓰거나 지움 | 작음 | 새로고침 뒤 옛 사본 |
| 5 | 구조물 · 관 바꿈 → 횡단 상세 벽 · 면적 다시 얹기를 공용 한 길로(어느 보기에서 바꿔도) · 종단 `currentSectionDetail` 대신 `Section_Store` 캐시 하나만 읽음 | 중간 | 같은 초안 누가토량 두 값 |
| 6 | 관 목록 한 벌 — 배수유역도 메모리 · 횡단 `pipeFacilities` · `shared.lastPipes` 를 ss 초안 읽기 전용으로 · `onPipesChanged` 를 두 보기 모두 · 빈 초안 `[]` 도 초안으로 | 중간 | 관 지점 두 벌 |
| 7 | 관 옵션 한 자리 — `culvertopt` · `revetx` · `extrawall` 을 관 초안 `options` 로 모음 · 흙막이 단 수 한 벌 · 저장 차례 겹침 없앰 | 큼 | 관 옵션 네 곳 |
| 8 | 가게를 실제 한 창구로 — 자료마다 키 하나 · `subscribe` 알림으로 두 보기 다시 그림 · 빈 칸 정리 · 보기 onShow 서버 재조회는 초안 없을 때만 | 큼 | 두 벌 전반 |
@@ -0,0 +1,224 @@
# 54-21 B05 · B06 자료 일원화 제안 (조사 · 제안만)
- 기준 `976c9b281` · 바탕: 54-16(`docs/raw/조사/2026-10-06_54-16_자료_한곳.md`) · 54-5 · 이번 전수 조사 셋(좌측 패널 모든 칸 · 저장 줄기와 서버 파일 · 옛 B08 칸)
- 코드 안 고침 · 커밋 없음
## 요약
- 지금: 같은 자료가 세션 키 · 패널 메모리 · 보기 지역 변수 · 서버 다시 읽기에 여러 벌. 가게(`design_store`)는 이름뿐(구독자 0 · 빈 칸 셋). 쓰기 입구가 좌측 패널 · 카드 단추 · 종단도 ▲▼ · 알약 끌기 · 보기 onShow 로 흩어짐. [저장]은 보기마다 다른 함수가 돌고 관 지점 쓰기가 최대 세 번.
- 목표: **자료 하나 = 가게 칸 하나 = 세션 키 하나**. 좌측 패널(+ 종단 · 횡단 직접 조작)은 가게에만 씀 · 두 보기는 가게를 읽어 그림 · 알림 한 길 · 보기 넘김에 서버로 안 덮음 · [저장] = 가게 → 서버 한 줄기 → 서버 정본 재계산.
- 가게 칸 10 · 삭제 · 재정의 후보 16 묶음 · 단계 8(0~7).
## ① 지금 자료 지도
### 1-1 자료마다 쥔 곳 (두 벌 이상 굵게)
| 자료 | 세션 키 | 메모리 · 지역 변수 | 서버 정본 | 쓰는 입구 | 읽는 곳 |
|---|---|---|---|---|---|
| 구조물 목록 · 옵션 · 잇기(`summary_item` · `group_items`) | `draft:structures` P | **종단 다리 `ownStructures` · 횡단 패널 `structures` · 한 벌 폼 `structures` · 한 벌 종단도 `structures`** · 가게 칸 `structures`(빈 칸) | `B05_Profile/route/structures.json` (`revision` · `definition_version` · `migrated_legacy`) | 폼 commit(`B05_Profile_UI_Structures_Panel_Commit.ts:216-219`) · 알약 끌기 · 횡단 패널(`B06_Section_UI_Page_Structures_Panel.ts:177`) | 종단 알약 · 벽 그림(`B06_Section_Engine_Structures_Wall.py`) · 3D(`B05_Profile_UI_Corridor_Structures_Hash.ts`) · M02(`M02_Table_Fill.py:119-168`) |
| 관 지점 · 관 옵션 · 컨테이너 · 잇기 | `draft:pipes` P · **`culvertopt` R(관 옵션 사본)** | **배수유역도 `pipeEditor` + `facilityStore` · `shared.lastPipes` · 종단 보기 `lastPipes` · 횡단 `pipeFacilities` · 폼 `pipeFacilities` · 종단 다리 `pipeStations`** | `B04_PreProcess/<drainage>/edits/pipe_points.json` (판번호 없음 · `route_signature`) | 폼(B05 `B05_Profile_UI_Drainage_Panel.ts:593-600` · B06 `B06_..._Structures_Panel.ts:262-284`) · 구간 · 세월교 · BOX 조정(`Span_Control.ts` · `Ford_Controls.ts`) | 카드(`B06_Section_UI_Page_Pipe_Options.ts`) · 서버 `Engine_Culvert.py` · 3D · 최소토피 · M02 |
| 흙막이 높이 · 단 수 · 구간 · 유입 형태 | **관 `options` 와 `revetx.h` · `extrawall` · `extraspan` · `inletstruct` 두 벌** | 조정창 Map | 관 옵션 + DB `cross_sections.data.design`(`revet_adjust` · `extra_walls` · `extra_spans` · `inlet_structure`) | 폼 · 카드 조정 줄 | 그림은 ss 쪽만 봄(B06 을 거쳐야 반영) · M02 단 수는 DB `extra_walls` |
| 종단 계획선 | `draft:alignment-draft` R | EditState Map(`B05_Profile_UI_Profile_Edit.ts:143`) · 종단도 `store`/`base` | 종단 JSON `profile_alignment` + `design_profiles` · DB grade_summary | ▲▼ · 직선화 · 쉬프트 | 종단도 · 횡단 재계산 · 3D |
| 상단측 | `draft:uphill` P | 종단 Map | 종단 JSON `stations.uphill_side` + design `ditch_side` | 종단 3D | 측구측 |
| 횡단 설계 patch | **`crossdesign` · `rockb` · `cutslope` · `crossw` · `revetx` · `revetlink` · `basinadjust` · `fordadjust` · `boxadjust` · `berm` R — 열 개로 쪼개짐** | 조정창 Map · 상세 캐시 제자리 고침 | DB `cross_sections.data.design` | 카드 조정 줄 · [전체 측점 반영] | 카드 · 3D · B07 결과값 |
| 표준 횡단면 | `draft:std-cross` P · `result:std-cross-default` | — | `longitudinal_sections.data.options.standard_cross_section` | 표준 패널(B06 만 보임) | **B05 계산도 씀**(`B05_Profile_UI_Profile_Preview.ts:50`) · 서버 · B07 |
| 페이지 설정(시작 측점 · 설계속도 · 지형 · 최소고 강제 · 등고선 간격) | `result:profile-enforce-min-cover` 하나뿐 | **DOM · 메모리** | stage 2 params · stage 1 `contour_interval_m` | 종단 패널(B05 만) | 종단도 위반 · 편집 막기 · 서버 replan |
| 횡단 보기 반폭 | `draft:cross-display` R | — | DB `design.display_half_width_m` | 횡단 패널 | 카드 · B05 편집 창 미리보기 |
| 선택 | `draft:structure-pick` P · **`draft:selection`(빈 칸)** | 횡단 `appliedPick` | — | 목록 · 알약 · 카드 | 두 보기 |
| 보기 상태 | `pref:*` localStorage(+ 계정 ui-prefs) | 3D 토글 메모리 | `user_ui_prefs` | 손잡이 · 토글 | 각 패널 |
| 종횡단 상세(서버 결과) | `result:section-detail` R(**고침 안 받는 옛 사본**) | **`Section_Store` 캐시(공유) · 종단 `currentSectionDetail` · 횡단 `sectionDetail`** | DB `cross_sections` | 서버 · 재계산 제자리 고침 | 카드 · 3D · 유토곡선 |
| 사토 | 없음(구조물 목록 안 사토장) | — | 횡단 design `spoil_fill_*` | 저장 때 서버만(`B06_Section_Server_Calc_Prebuild.py:197`) | 카드(저장분 폭) |
### 1-2 저장 줄기 (지금)
| 차례 | 꺼내는 자리 | 창구 | 문제 |
|---|---|---|---|
| pipes ① | ss `pipes` | PUT pipe-points | — |
| pipes ② | **배수유역도 메모리** | 같은 PUT | 늦은 메모리가 ①을 덮음(54-16 재현) |
| structures | 종단 섰으면 다리 · 아니면 ss | PUT structures | — |
| alignment | 종단도 메모리 | PUT profile-alignment | 서버 재계산 함 |
| culvertOptions | ss `culvertopt` | **GET pipe-points 뒤 합쳐 PUT** | 관 쓰기 셋째 · 관 옵션을 또 덮음 |
| uphill | 종단 섰으면 메모리 · 아니면 ss | POST confirm | 저장 뒤 안 비움 |
| cross | **횡단 섰으면 ss 조정 키 전부 · 아니면 캐시 메모리만** | POST sections/save | 종단 보기 [저장]은 횡단 초안 · 표준값 빠짐(`B06_Section_Section_Store.ts:259,264`) · `berm` 은 서버 스키마에 칸 없어 버려짐 |
- 저장 뒤 비우는 키 넷뿐(`pipes` · `structures` · `alignment-draft` · `culvertopt`) · 나머지 횡단 초안 13개 · `uphill` 은 남아 다음 저장에 또 실림
- [저장] 밖 서버 쓰기: 등고선 [재적용] PUT · [3D 업데이트] · 종단 onHide 코리도 PUT · 반폭 [적용]이 `/regenerate`(DB 행 다시 넣음) · 종단 진입 `structures/migrate`
### 1-3 보기 넘김
| 보기 | 다시 받는 것 | 문제 |
|---|---|---|
| 종단 onShow | 구조물(서버 + ss) | 상세 · uphill 안 다시 읽음 · `applyPipes(lastPipes)` 가 메모리 옛 목록을 폼에 실음 |
| 종단 onHide | — | 코리도 PUT |
| 횡단 onShow | 구조물 · 관(서버 + ss) · 상세 · `reconcileStaleDesigns` | 매번 1.2초 멈춤(54-5 S2) · 관 옵션 초안 다시 얹기는 마운트 때만 |
### 1-4 한 보기에만 보이는데 두 보기가 쓰는 칸
- B06 만 보임: `phase:"detail"` 정의 칸 전부(C군 `form` · `foundation` · `face_role` · `face_slope_ratio` 등) · 표준 횡단면 전부(B05 계산이 씀) · 횡단 조정 줄 전부(3D 가 씀)
- B05 만 보임: 최소고 강제(횡단 종단도 편집 막기가 씀) · 시작 측점(메모리 · 새로고침하면 0)
- 칸은 없는데 계속 읽히는 키: `revet_foundation` · `pipe_kind` · 날개벽 치수 · BOX `wall/slab_thickness_m` · 물넘이 `ford_width/height/slope_pct` · 독립 기슭막이 `tiers` · `face_*` · `joint_spacing_m`
## ② 목표 모양
```
좌측 패널 칸 ─┐
종단도 ▲▼ · 알약 끌기 ─┼─▶ 가게.write(칸, 값) ─▶ 세션 키 하나 ─▶ 가게.notify(칸)
카드 조정 줄 ─┘ │
종단 보기 · 횡단 보기 · 3D · 좌측 패널 ◀┘ (읽어 그림)
[저장] ─▶ 가게 칸마다 수집 ─▶ 서버 한 줄기 ─▶ 서버 정본 재계산 ─▶ 성공한 칸 비움 · 상세 다시 받음
```
규칙
1. 가게 칸 = 자료 하나 · 세션 키 하나 · 칸마다 「저장 창구 · 저장 뒤 비움/남김」을 등록표 한 줄에 적음(`A00_Common/b_page_state.ts` 등록표 확장)
2. 쓰기는 `가게.write` 만 — 패널 · 카드 · 종단도 · 3D 모두. 날 `sessionStorage` · `readByKey` · `createSessionMap` 자리 없앰
3. 읽기는 가게만 — 보기 지역 변수 · 패널 배열은 가게를 읽는 계산값으로만(들고 있지 않음)
4. 알림 한 길 — `가게.subscribe(칸, 함수)` · 숨은 보기는 「더러움」 표시만 · 보일 때 한 번 그림(54-5 S2 의 매번 1.2초 대신)
5. 보기 넘김 = 그리기만 — 서버 재조회는 가게 칸이 비었을 때(처음 · 저장 뒤)만
6. 서버 결과(종횡단 상세)는 `Section_Store` 캐시 한 벌 · 두 보기 읽기만 · 세션 사본은 「불러온 원본」 용도로만(고침은 초안 칸이 들고 얹을 때 합침)
7. [저장] = 가게 칸 차례대로 한 번씩 · 보기 갈래 없음 · 관 쓰기 한 번 · 서버가 정본 재계산 · 성공 뒤 그 칸 비우고 상세 다시 받음
8. 계산 자리는 5장 그대로 — 조작 중 브라우저가 같은 코드로 즉시 · [저장] 은 서버 재계산(브라우저 값 받아 적지 않음)
가게 칸 (10)
| # | 칸 | 세션 키(새) | 범위 | 저장 창구 | 저장 뒤 |
|---|---|---|---|---|---|
| 1 | 구조물 | `draft:structures` (그대로) | P | PUT structures | 비움 |
| 2 | 관 지점 시설 | `draft:pipes` (그대로 · `culvertopt` 흡수 · 흙막이 높이 · 단 수 · 구간 · 유입 형태 흡수) | P | PUT pipe-points 한 번 | 비움 |
| 3 | 계획선 | `draft:alignment-draft` (그대로) | R | PUT profile-alignment | 비움 |
| 4 | 상단측 | `draft:uphill` (그대로) | P | POST confirm | **비움(지금 안 비움)** |
| 5 | 횡단 patch | `draft:cross-patch` R — `{측점: {ground_type · section_mode · ditch_* · paved · two_stage_slope · rock_boundary_offset_m · cut_slope_ratio_user · crossw · revet_nudge(x,d,m) · revet_link · basin · ford_wall · box_body}}` | R | POST sections/save | 비움 |
| 6 | 표준 횡단면 | `draft:std-cross` (그대로) | P | sections/save 본문 | 비움(서버 값으로 다시 씨앗) |
| 7 | 페이지 설정 | `draft:profile-settings` (새) — 시작 측점 · 설계속도 · 지형 · 최소고 강제 · 등고선 간격 · 횡단 보기 반폭 | P | 새 PUT 또는 confirm 본문 | 비움 |
| 8 | 선택 | `draft:structure-pick` (그대로) | P | 저장 안 함 | 남김 |
| 9 | 보기 상태 | `pref:*` localStorage (그대로) | 계정 | ui-prefs | — |
| 10 | 종횡단 상세(결과) | `result:section-detail` (그대로 · 읽기 전용 원본) | R | — | 저장 뒤 다시 받음 |
- 사토는 칸 없음 — 구조물(사토장) + 상세에서 나오는 파생 값
- 소단(`berm`)은 칸 없음 — 구조물(소단)에서 파생 · 서버도 구조물에서 직접 만듦(지금 서버가 버리는 흠 해소)
좌측 패널이 종횡단을 함께 제어
- 한 벌 폼이 두 보기에서 **같은 칸 묶음**을 보임 — `phase:"detail"` 칸 · 표준 횡단면 · 「횡단 조정」 줄을 B05 에서도 접힌 상자로(공간 문제는 접힘으로)
- 종단 전용(페이지 설정 · 계획노선)도 B06 에서 접힌 상자로 — 최소고 강제가 횡단 쪽 종단도 편집을 막는데 B06 에서 안 보이는 흠 해소
- 카드 조정 줄 · 종단도 ▲▼ · 알약 끌기는 그대로 두되 가게 칸 5 · 3 · 1 에 씀 → 좌측 패널 칸이 같은 값을 즉시 보임
## ③ 칸마다 판정
### 3-1 남김 · 합침
| 칸 | 판정 | 근거 |
|---|---|---|
| 구조물군 · 종류 · 측점 · 잇기(`summary_item` · `group_items`) | 남김 | 종단 알약 · 벽 · M02(`M02_Table_Fill.py:119-164`) |
| C군 높이 · 설치 측 · 단 수 · 올림 · 이동 · `form` · `foundation` · `face_role` · `face_slope_ratio` | 남김 · **두 보기 다 보임** | 벽 그림 · 터파기 · 3D |
| 관경 · 유입/유출 구조 · 흙막이 형태 · 길이 · 전 · 후 · 집수정 높이 | 남김 | `Engine_Culvert.py` · 카드 · 3D · B07 |
| 흙막이 높이 = 관 `options` + `revetx.h` | **합침 → 관 `options`** | 지금 그림은 `revetx.h` 만 봄 · B05 에서 고친 값이 B06 을 거쳐야 감 |
| 추가 흙막이 단 수 = `soil_add_{n}` 개수 + `extrawall` | **합침 → 관 `options` 의 `soil_add_{n}`** | 서버는 `extrawall` 만 · M02 는 DB `extra_walls` 단 수 |
| 단별 구간 = `soil_add_{n}_length/before/after` + `extraspan` | **합침 → 관 `options`** | 같은 값 두 자리 |
| 유입 형태 = `inlet_structure` + `inletstruct` | **합침 → 관 `options.inlet_structure`** | 옵션 키는 아무도 안 읽고 ss 만 그림에 감 |
| `culvertopt`(구간 · 세월교 · BOX 스펙) | **합침 → 칸 2(관 지점 시설)** | 지금 GET 뒤 다시 PUT · 새로고침 뒤 화면에 안 얹힘 |
| 돌쌓기 위치 조정 `revetx` x · d · m · 집수정 위치 · 세월교 측벽 · BOX 구체 · 잇기 해제 | 남김 → 칸 5(횡단 patch) | 카드에서 낳은 값 = 횡단 patch 주인 |
| `crossdesign` · `rockb` · `cutslope` · `crossw` | **합침 → 칸 5** | 지금 넷이 따로 · 재계산 때만 얹힘 |
| 표준 횡단면 9칸 | 남김 · **두 보기 다 보임** | B05 · B06 · 서버 · B07 |
| 표준 `cross_slope_pct.max` | **재정의** | 계산은 min 만 · B07 도면만 max 를 먼저 씀 → 도면 5% 대 계산 3% |
| 시작 측점 · 설계속도 · 지형 · 최소고 강제 · 등고선 간격 · 횡단 반폭 | 남김 → 칸 7 · [저장] 경유 | 지금 메모리 · result 통 · 즉시 PUT 으로 흩어짐 |
| 소단 길이 · 폭 · 간격 · 기울기 | 남김(구조물 옵션) · `berm` 키 없앰 | 서버가 구조물에서 직접 |
| 사토장 `capacity_m3` | 남김 | `B06_Section_Engine_SpoilFill.py:118` |
| 기타 `name` | 남김 | 목록 이름 |
| 구조물 메모 | 사용자 결정 | 읽는 곳 없음 · 사용자 메모 성격 |
### 3-2 삭제 · 재정의 후보 (16)
A. 지금 아무도 안 읽는 화면 칸
| # | 칸 | 근거 |
|---|---|---|
| A1 | 그룹 형상 `{gid}__{length,height,before,after}_m` | 주석 「계산 안 함」(`B05_Profile_UI_Structures_Groups.ts:13-14`) · 바인딩 0 |
| A2 | 물넘이 `ford_slope_deg` | 폼 · 병합만 |
| A3 | 콘크리트 포장 `pave_spec` · 포장 `height_m` | 서버는 측점만 읽음 |
| A4 | 토취장 `capacity_m3` · 맹암거 `culvert_height_m` · `culvert_slope_pct` · 측구 `depth_cm` · 비탈면 녹화 7칸 | 읽는 곳 0 |
| A5 | 숨은 solve 전용 — 종단 · 횡단 샘플 간격 · 기준값 4칸 · 경로 계산 설정 전부 · 선택 포인트 칸 | [최적 경로 계산] 숨김 · inert |
| A6 | 「지난 정의 값」 상자(늘 숨김) | 54-1 에서 숨김 · 코드만 남음 |
B. 옛 B08 수량산출로 넘기던 칸 — 지금 B08 · B09 는 빈 화면 · 읽는 곳 0
| # | 칸 | 생기는 곳 → 가던 곳 |
|---|---|---|
| B1 | 쌓기류 상세 — `stone_supply` · `stone_coeff_basis` · `stone_kind` · `back_len_cm` · `fill_concrete_mpa` · `thickness_top_m` · `thickness_bottom_m` · `weep_hole_diameter_mm` · `weep_hole_area_m2` · `blinding_concrete` (C군 · 흙막이 · 큰돌쌓기 · 돌기슭막이 · 골막이 · 바닥막이) | 구조물 정의 `phase=detail` → `structures.json options` → 옛 B08 품셈 열(정의에 「B08 `wants_blinding`」 그대로) |
| B2 | 골막이 `spillway` · `top_length_m` · `bottom_length_m` · 바닥막이 `area_m2` | 같음 |
| B3 | BOX `trench_depth_m` · `haunch_m` · `blinding_thickness_m` · `length_m` | 정의 「토공집계로 감」 · 칸 없음 |
| B4 | 포장 `separation_sheet` · `wire_mesh` | 화면에서 이미 뺌 |
| B5 | 화면에서 뺐는데 M02 바인딩이 읽는 칸 — `pipe_kind` · `wing_wall_type` · `inlet_basin_form` · 포장 `thickness_cm` · `width_m` · `widening_area_m2` · `joint_spacing_m` · 물넘이 `ford_width_m` · `ford_height_m` · `length_m` | **재정의** — 새 칸 이름으로 바인딩 다시 매김(25-3a 와 함께) |
C. 서버 결과에 남은 옛 B08 칸
| # | 칸 | 근거 |
|---|---|---|
| C1 | `wall_fill_overlap` · 벽마다 `fill_overlap_m2` | B08 「두 번 셈」 사유용 · 읽는 곳 0 |
| C2 | `extra_walls` 안 높이 · 형태 · 구간 | M02 는 단 수만 → 단 수 하나로 |
| C3 | 토적 저장 묶음 합계 · `transfers` · 거르지 않은 `haul_plan` | 그림판 `haul_plan_drawing` 만 B07 이 씀 · B07 대신 읽기 먼저 정리 |
| C4 | 채집석 · 구조물 잔토 통로(`collected_stone_*` · `structure_spoil_*`) | `Prebuild.py:72-84` 가 늘 빈 값 |
| C5 | `cut_slope_segments` | 저장도 안 함 · 주석 「읽는 곳 없음」 |
D. 키 · 코드
| # | 대상 | 근거 |
|---|---|---|
| D1 | 죽은 키 — `draft:selection` · `culvertmove` · `pref:section-panel-collapsed/-height` · 배수유역 `COLLAPSED_KEY` · ss `b05:pipes`(아무도 안 비움) · 가게 빈 칸 셋 · `hasDrafts` · `setActive` · `resetRoutePlan` · POST `cross-design`(54-5 H8) · `common_util_structure_lengths.py` · `common_util_storage.py:20` `B08_Quantity/quantities` · `common_util_node_bundle.py:23` B08 감시 | 쓰는 곳 · 부르는 곳 0 |
- 삭제는 「정의 · 화면에서 숨김」 먼저 → 저장값은 `options` 에 그대로(데이터 안 잃음) → 새 B08 방향(25-3a) 정해진 뒤 걷음
- 칸은 없는데 그림이 읽는 키(`revet_foundation` · BOX 두께 · 독립 기슭막이 `tiers` · `face_*` · 날개벽 치수 · 물넘이 폭)는 삭제 아님 — 칸을 되살리거나 고정 기본값으로 정하는 사용자 결정 몫(⑥)
## ④ 옮김 (데이터 잃지 않음)
브라우저 세션 키
| 옛 키 | 새 자리 | 방법 |
|---|---|---|
| `culvertopt` R | 칸 2 `draft:pipes` 의 그 시설 `options` | 등록표 `legacy` 함수 — 처음 읽을 때 합치고 옛 키 지움 |
| `revetx.h` · `extrawall` · `extraspan` · `inletstruct` R | 칸 2 관 `options`(`*_revet_height_m` · `soil_add_{n}_*` · `inlet_structure`) | 같음 |
| `revetx` x · d · m · `revetlink` · `basinadjust` · `fordadjust` · `boxadjust` · `crossdesign` · `rockb` · `cutslope` · `crossw` R | 칸 5 `draft:cross-patch` | 같음 · 키 열 개 → 하나 |
| `berm` R | 없앰(구조물에서 파생) | 읽고 버림 |
| `draft:cross-display` · `result:profile-enforce-min-cover` | 칸 7 `draft:profile-settings` | 같음 |
| 되돌리기 스냅샷 접두어(`B05_Profile_UI_Profile_History.ts:16`) | 새 키 이름 | 같이 고침 |
- 선행: 날 `sessionStorage` · `readByKey` · `createSessionMap`(`B06_Section_UI_Page_Link_Session.ts:31-55`) · `Api_Culvert_Options.ts` · `Ford_Controls.ts` · `Persist.ts` rock/cutslope 자리를 `readState`/`writeState` 로 먼저 바꿔야 `legacy` 가 돎(지금 `migrate()` 는 `readState` 때만)
서버 파일 · DB
| 옛 자리 | 새 자리 | 방법 |
|---|---|---|
| DB `cross_sections.data.design` 의 `revet_adjust.h` · `extra_walls` 단 수 · `extra_spans` · `inlet_structure` | `pipe_points.json` 그 시설 `options` | **읽을 때 옮김** — 관 `options` 에 없으면 상세에서 채움(`common_util_drainage_pipes.py` `_migrate_protection:305` 꼴) · DB 칸은 한 주기 남겨 둠 |
| `pipe_points.json` `culvertopt` 로 덮이던 옵션 | 그대로(같은 파일) | 이관 없음 |
| 페이지 설정(stage 2 params · stage 1 `contour_interval_m`) | 그대로 읽고 [저장] 때만 씀 | 이관 없음 |
| 삭제 후보 B1~B4 옵션 값 | `options` 에 그대로 | 정의에서 숨기기만 · `_DROPPED_KEYS`(`B05_Profile_Structures_Repository.py:42,90`)에 넣는 것은 새 B08 정한 뒤 |
| 결과 칸 C1~C5 | 새로 저장할 때 안 씀 | 옛 행은 그대로 · 읽는 쪽 없음 확인 뒤 |
- `pipe_points.json` 에 판번호가 없음 → 옮김 시작 때 `schema_version` 칸 하나 더함(옛 파일 = 1 로 읽음)
## ⑤ 단계 차례 (8)
| 단계 | 할 일 | 끝난 뒤 화면 | 크기 | 위험 | 흡수 | 54-22 겹침 |
|---|---|---|---|---|---|---|
| 0 | 등록표 한 곳 — 칸마다 「키 · 범위 · 저장 창구 · 저장 뒤 비움」 한 줄 · 날 ss 자리를 `readState`/`writeState` 로 · 죽은 키(D1) 걷음 | 같음(동작 그대로) | 중간 | 낮음 — 키 이름 그대로 | 54-16 D6 | 없음 |
| 1 | 저장 줄기 한 줄 — 관 PUT 한 번(배수유역도 메모리 PUT 뺌) · `culvertopt` 를 관 초안에 합쳐 같은 PUT · 저장 뒤 비우기를 등록표대로(`uphill` · 횡단 초안 포함) · 조작 중 `detail-basins` 서버 왕복을 저장 때로 | 관경 바로 저장 옛 값 사라짐 | 작음~중간 | 중간 — 관 시설 되붙이기 응답 처리 | 54-16 갈래 1 · 7 일부 · 54-5 S4 | 없음 |
| 2 | 횡단 patch 한 칸 `draft:cross-patch` · 상세를 불러올 때 한 번 얹음 · [저장]은 보기와 무관하게 칸 5 · 6 을 보냄 · `berm` 은 서버가 구조물에서 · `rock_boundary_offset_m` 을 `USER_TOUCHED_KEYS` 에 · `result:section-detail` 사본은 원본 전용 | 새로고침 · B05 [저장] 뒤에도 L형 등 그대로 | 중간 | 중간 — 키 열 개 옮김 | 54-16 갈래 2 · 3 · 4 | 없음 |
| 3 | 상세 한 벌 — 두 보기는 `Section_Store` 캐시만 읽음 · 종단 `currentSectionDetail` · 횡단 `sectionDetail` 걷음 · 구조물 · 관 바꿈 → 벽 · 면적 다시 얹기 공용 한 길 · 횡단 onShow 서버 재조회 · 전 측점 재계산은 더러울 때만 | 두 보기 누가토량 같음 · 보기 넘김 멈춤 사라짐 | 중간 | 중간 — 카드 · 3D 갱신 시점 | 54-16 갈래 5 · 54-5 S2 | **있음** — `design_profile.ts` · `B06_Section_UI_Section_View.ts` · `B06_Section_UI_Section_View_Profile.ts`(S1 디바운스 · 두 번 그리기) → 54-22 끝난 뒤 |
| 4 | 가게 실체화 — 칸마다 `write` · `subscribe` · 패널 배열 · 보기 지역 변수를 가게 읽기로 · 알약 끌기 · ▲▼ · 카드 단추도 `write` · 좌측 목록 · 폼은 바뀐 칸만 다시 그림 | 어느 보기에서 고쳐도 다른 보기 · 3D 즉시 | 큼 | 높음 — 흩어진 입구 전부 | 54-16 갈래 6 · 8 · 54-5 S6 | **있음** — `design_profile.ts`(▲▼ 입구) |
| 5 | 두 벌 칸 합침 — 흙막이 높이 · 단 수 · 구간 · 유입 형태를 관 `options` 로 · 카드 조정 줄은 같은 값을 읽고 씀 · 서버 `Engine_Culvert.py` 가 관 `options` 에서 · 읽을 때 옮김 | B05 에서 흙막이 바꿔도 카드 · 3D 바로 | 중간~큼 | 중간 — 서버 · 카드 · M02 단 수 | 54-16 갈래 7 | 없음 |
| 6 | 좌측 패널 한 벌 — `phase:"detail"` 칸 · 표준 횡단면 · 「횡단 조정」을 B05 에도(접힌 상자) · 페이지 설정 · 최소고 강제를 B06 에도 · 페이지 설정 칸 7 · 등고선 [재적용] · [3D 업데이트] · 반폭 [적용]을 [저장] 경유로 · 종단 onHide 코리도 PUT 없앰 | 두 보기 같은 패널 · [저장] 밖 쓰기 0 | 중간 | 중간 — 패널 높이 · 접힘 | 54-5 H9 | 없음 |
| 7 | 삭제 · 재정의 — A1~A6 · B1~B4 정의에서 숨김 · B5 바인딩 다시 매김 · C1~C5 새로 안 씀 · 표준 `cross_slope_pct.max` 정리 | 화면 칸 줄어듦 · M02 집계 그대로 | 중간 | 낮음(값 보존) · 바인딩은 25-3a 결정 필요 | — | **있음** — `B05_Profile_Structures_Schema.py`(H1) · `M02_Item_Snapshot.py`(H1) → 54-22 끝난 뒤 |
- 단계마다 끝에 고친 대상 시험 + 54-16 재현 표(관경 바로 저장 · L형 새로고침 · B05 [저장] · 누가토량 두 값) 다시 잼
- 0 → 1 → 2 는 서로 독립 · 바로 갈 수 있음 · 3 · 4 · 7 은 54-22 뒤
## ⑥ 사용자가 정할 것
1. 옛 B08 칸(B1~B4) — 지움 / 새 B08 면적산출 시트 입력으로 옮김 / 숨겨 둠
2. 숨은 경로 계산 설정 · 샘플 간격 · 기준값 4칸 · 선택 포인트(A5) — 지움 / 남김
3. 좌측 패널에서 B05 에도 「상세 칸 · 표준 횡단면 · 횡단 조정」, B06 에도 「페이지 설정」을 접힌 상자로 보이게 — 좋음 / 일부만
4. 칸은 없는데 그림이 읽는 값(기슭막이 기초 · BOX 두께 · 날개벽 치수 · 물넘이 폭 · 독립 기슭막이 단 · 기울기) — 칸 되살림 / 고정 기본값
5. BOX · 세월교 유입/유출 「흙막이」(골라도 아무것도 안 섬) — 그림 추가 / 선택지 뺌
6. 등고선 [재적용] · [3D 업데이트] · 반폭 [적용] — [저장] 경유로 바꿔도 됨 / 지금처럼 즉시
7. 사토 반영 — 저장 뒤만(지금) / 조작 중 즉시(브라우저 계산 추가)
8. 구조물 메모 — 남김 / 지움
@@ -0,0 +1,72 @@
54-33 끝 조사 · ① 갈래 3(추천 B: 열 수 자동 + 카드 최소·최대 폭) · ② 됨(같은 창 코드로 화면 조각만 팝업에 옮기는 길 · 키보드·메뉴 연결 손봐야 함)
# ① 횡단 카드 크기
## 지금 크기가 정해지는 곳
- 열 수 — `B06_Section_UI_Section_View.ts:319-326` : 열 수 = 칸 폭 ÷ (최소 폭 560 + 간격 16) 내림. 카드 폭 = 칸 폭을 열 수로 나눈 값. 최대 폭 없음 (`_Section_Common.ts:39-40` 상수 560·16).
- 높이 — `_Cross_View_Metrics.ts:57-64` : 1m 당 픽셀 = (카드 폭 − 좌우 여백 78) ÷ 가로 범위(m). 높이 = 고도 범위 × 1m 당 픽셀 + 위아래 여백 36 + 면적 표 머리방 58. 바닥 250 (`_Section_Common.ts:37`).
- 줄 높이 — `_Section_View.ts:344-349` : 같은 줄 카드 중 가장 큰 높이로 통일 (낮은 카드는 위아래 빈 자리).
- 그림 — `_Cross_View.ts:310-314` : SVG 가로세로 = 카드 px 그대로, viewBox 도 같은 값. 즉 CSS 확대·축소 없음 · 가로세로 같은 1m 당 픽셀 · 글자 크기 고정.
- 카드 틀 — `_Style_Cross.css:42-63`(머리·꼬리 줄) · `:119-123`(바둑판 · 열 수는 JS 가 직접 덮어씀).
## 원인
- 카드 높이 = 폭에 비례 (그림 모양 고정이므로). 칸 폭 1500 이면 2열 · 카드 약 740 폭 · 그림 높이 약 480 + 머리·꼬리 줄 → 한 줄이 칸 높이를 넘음.
- 폭을 줄이면 그림 전체가 같은 비율로 작아짐 = 축척(가로세로 비) 유지. 높이만 자르면 위아래 고도가 잘리거나 빈 자리가 늚.
- 줄여도 안 줄어드는 고정분 : 여백 36 · 면적 표 머리방 58 · 카드 머리·꼬리 · 바닥 250 → 아주 좁은 카드에서 높이가 폭을 따라 안 줄어듦.
## 갈래
- A. 최소 폭만 낮추기 (560 → 약 400)
- 고칠 곳 : 상수 한 줄.
- 장 : 가장 작음 · 축척 그대로.
- 단 : 1.5줄 보장 없음 (칸 높이를 안 봄) · 칸 폭마다 우연히 맞음.
- 크기 : 1줄.
- B. 열 수 자동 (추천)
- 고칠 곳 : `_Section_View.ts:319-326` 열 수 결정부 + 칸 높이도 보기(ResizeObserver 가 지금 폭만 봄 `:402-412`).
- 방식 : 열 수 2·3·4… 를 차례로 시험 → 첫 줄 높이 + 간격 + 둘째 줄 절반이 칸 높이 안에 드는 가장 적은 열 수 채택. 카드 폭이 최소 폭(예 360~400) 아래로 내려가면 거기서 멈춤. 최대 폭(예 800~900)을 넘는 1열은 열을 늘리거나 가운데 정렬로 폭 상한.
- 장 : 칸 높이가 달라져도(하단 패널 끌기·창 크기) 늘 1.5줄 근처 · 축척 유지(그림이 통째로 작아질 뿐 · 잘림 없음) · 계산이 기존 `crossPlotBase` 재사용.
- 단 : 하단 패널을 끌 때 열 수가 바뀌면 카드 전체 다시 그림 (열 수가 바뀔 때만 다시 그리게 막아야 함 · 줌·팬 상태는 측점별 캐시라 유지) · 좁아진 카드는 글자 대비 그림이 작아 읽기 힘든 한계(바닥 폭이 정함) · 바닥 250 · 머리방 58 같은 고정분이 1.5줄에 못 미치게 할 수 있음 → 이 값도 열 수 계산에 넣어야 함.
- 크기 : 약 40~60줄 + 시험 (`_Section_View.ts` 700줄 한계 확인 필요 · 열 수 계산을 별 파일로).
- C. 높이 상한 + 그림 맞춤 (CSS 만)
- 방식 : 카드 높이를 상한으로 막고 SVG 를 `preserveAspectRatio` 로 맞춤.
- 장 : 고치는 곳 적음.
- 단 : 그림이 줄어 양옆이 비고(폭 낭비) 카드 안 모든 클릭 좌표·끌기(`data-px-per-m`·팬)·글자 크기가 화면 배율과 어긋나 축척 신뢰 훼손 → 비추천.
## 한계·확인 필요
- 1.5줄이 실제로 되는 폭은 칸 높이와 단면 모양(고도 범위 · 가로 범위 · 세로 과장 배율)에 따라 다름 — 실측값 아님 · 식으로만 추정 : 칸 높이 500, 가로 40m, 고도 범위 23m 이면 카드 폭 약 300 까지 내려가야 1.5줄 → 바닥 폭 360~400 이면 칸 높이가 작은 화면에서는 1.5줄에 못 미칠 수 있음. 바닥 폭은 사용자 협의 대상(임의 확정 안 함).
- 줄 높이가 줄 최댓값이라 줄마다 열 수 시험 값이 다름 → 시험은 첫 줄과 둘째 줄을 실제 데이터로 계산.
# ② 종단 하단 패널을 별도 브라우저 창으로
## 지금 하단 패널이 기대는 것
- 한 벌만 존재 — `A00_Common/design/design_page.ts:116-118,125-138` (`profileSlot` · `shared.profile`) · 종단 보기·횡단 보기가 같은 인스턴스를 씀. 만드는 곳 `design_profile.ts:128-239`.
- 자료 — 같은 창 메모리(모듈 변수) + `sessionStorage`(초안·결과 · `b_page_state.ts:46-199,249-250`) + 설계 가게(`design_store.ts` : 구독 방식이 같은 창 안에서만 동작). 화면 취향(패널 높이·접힘)은 `localStorage` (+ 계정 서버 저장) → 창끼리 이미 공유.
- 페이지 쪽 연결 — 콜백 약 12 종 (`B05_Profile_UI_Profile_Panel_Types.ts:17-57` : 관 변경 · 구조물 이동·추가·삭제 · 측점 선택 · 횡단 재계산 알림 등) + `onSelectStation` · `onResetAll` + 횡단 카드 갱신 `refreshCards`.
- 창 전역에 거는 리스너 — `window` 포인터 놓기·취소·blur·keydown·keyup (`_Profile_Drag.ts:82-83,201-202` · `_Profile_Edit.ts:60-62` · `_Profile_Panel_Tools.ts:268-269,313-317` · `_Profile_Wheel`) · 우클릭 메뉴가 `document` 에 리스너 (`ui_template_context_menu.ts:57,67`) · 화면 크기 `window.innerHeight` (`_Profile_Heights.ts:26` · `_MassHaul.ts:231` · `_TableOverlay.ts:84`) · 토스트·모달은 `document.body` (`ui_template_elements.ts`, `ui_template_modal.ts`).
- 위치 — 종단 보기에서는 3D 위에 뜨는 판(`B05_Profile_UI_Style.css:42-54` absolute) · 횡단 보기는 카드 아래 흐름(`design_page.css:38-41`).
## 갈래
- A. 같은 창 코드로 화면 조각만 팝업에 옮기기 (추천)
- 방식 : [분리] 단추 → `window.open`(같은 출처 · 사용자 클릭 안에서) → 팝업 문서에 스타일 복사 → `profileSlot` 안 종단도 DOM 을 팝업 본문으로 옮김. 코드는 메인 창에서 계속 실행.
- 자료 공유 : 필요 없음 — 같은 메모리 · 같은 `sessionStorage` · 같은 가게. 편집 → 횡단 카드·3D 갱신도 지금 경로 그대로.
- 손볼 곳 : ① 창 전역 리스너를 요소의 소속 창(`ownerDocument.defaultView`)에 걸도록 약 10곳 ② 우클릭 메뉴 `document` 리스너와 화면 밖 보정 `window.innerWidth/Height` ③ 팝업 닫힘(`pagehide`) 때 DOM 을 원래 자리로 되돌림 · 메인 창 새로고침·이동 때 팝업 닫기 ④ 메인 쪽 빈 자리 처리(종단 보기 = 3D 가 전면 · 횡단 보기 = 카드 칸이 아래까지 늘어남) ⑤ 스타일 복사 (`link`·`style` 통째 복제 · 개발 서버 핫리로드 스타일 포함) ⑥ 토스트·모달은 메인 창에 뜸 (팝업 쪽에서 보이려면 별도 처리).
- 크기 : 신규 약 200~300줄 + 기존 약 8 파일 소폭 수정. 위험 중간 — 키보드(▲▼ 방향키)·끌기·우클릭 전부 다시 시험해야 함.
- B. 팝업이 자체 앱을 띄우고 BroadcastChannel 로 동기화
- 방식 : 별도 라우트로 종단도만 띄우고 메인과 메시지 주고받기.
- 막히는 것 : `sessionStorage` 는 탭마다 따로(팝업 열릴 때 복사본만 받고 이후 갈라짐 · `storage` 이벤트도 세션 저장소는 창 사이 안 옴) → 초안 5종(계획고·관·구조물·선택·횡단 상세) 양방향 동기화 직접 구현 · 콜백 12종을 메시지로 바꿔야 함 · 자료 정본이 둘로 갈려 `CLAUDE.md` 5장(캐시 한 곳)과 충돌 · 횡단 상세 응답이 커서 메시지 비용 큼.
- 크기 : 큼 (수백 줄 + 충돌 처리). 비추천.
- C. 읽기 전용 거울 (팝업은 종단도 그림 + 선택 표시만, 편집은 메인)
- 장 : 단순(BroadcastChannel 로 선택 측점·종단 자료 복사).
- 단 : 편집 도구(▲▼·직선화·유토곡선 표)를 쓰려는 목적이면 의미 없음.
## 한계·확인 필요
- ORCA 내장 브라우저에서 `window.open` 팝업이 뜨는지 확인 안 함 — 되는지 먼저 한 번 시험 필요(안 되면 공용 브라우저에서만 검증).
- 팝업 차단 : 반드시 단추 클릭 안에서 열어야 함.
- 메인 창 닫기·이동 시 팝업 정리, 팝업 위치·크기 기억(취향 저장소 `pref` 에 한 칸)은 부가 작업.
- 두 창을 동시에 켜는 쓰기 충돌은 A 에서는 없음 (한 인스턴스).
# 요약 다섯 줄
1. ① 카드 높이는 폭에 비례(그림이 CSS 확대 없이 px 그대로) → 폭을 줄이면 축척 유지한 채 높이가 줄어듦.
2. 추천 B : 열 수를 칸 높이에 맞춰 자동 선택(1.5줄) + 카드 최소·최대 폭 상한 · 약 50줄 · 최소 폭 값은 협의 필요.
3. 한계 : 여백 36·머리방 58·바닥 250 은 안 줄어서 칸이 낮은 화면에서는 1.5줄에 못 미칠 수 있음.
4. ② 종단 패널은 지금 한 벌 + 같은 창 메모리·세션 저장소에 기댐 → 팝업에 별도 앱을 띄우면 동기화가 크게 어려움.
5. 추천 A : 코드는 메인에 두고 화면 조각만 팝업으로 옮김(자료 공유 불필요) · 창 전역 리스너 약 10곳과 메뉴 손봐야 함 · ORCA 에서 팝업 되는지 먼저 확인.
@@ -0,0 +1,19 @@
# 54-44 새 검증 프로젝트 13
원본 입력 = 랩탑_보조(936be972…) · 새 로직 자동설계: 검증_랩탑메인 · 검증_sub1 · 검증_sub7 / 나머지 10 = 검증_랩탑메인 복제(tools_clone_project)
| 이름 | 소유 user | 프로젝트 id | 상태 | B05 (구조물 · 관 · 첫 관 기본값) |
| --- | --- | --- | --- | --- |
| 검증_랩탑메인 | 3 | 226fc805-26c8-4f5a-9956-bacb200e10a5 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub1 | 3 | 7e420ed6-f940-4d12-a1a5-39cdcf70a391 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub7 | 3 | 6d3b2812-6d5a-4168-a932-40e4ae303d5a | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub2 | 3 | c9fcb148-00e9-45fb-80b9-685e36bc694b | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub3 | 3 | 1f93a515-df0a-4975-a8ba-daaa7672b123 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub4 | 3 | 269f0a78-bac2-4eff-b8ed-c96cf9327839 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub5 | 3 | bec7fe41-83e7-4df7-86a3-fdddaa1f8fec | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub6 | 3 | 2a505e36-591f-462a-8240-23ea655a6a91 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub8 | 3 | 1bb0f876-983f-4ca5-9cc7-f59ee1f77e0a | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_데스크탑메인 | 3 | 3e331b49-05e7-43f8-b464-bf06e05d9516 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_데스크탑서브 | 3 | b97e52f4-a649-4be0-92cc-27b2f9458b2a | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 엄상준_검증 | 10 | d2245e3b-0468-4a90-ac5c-50b2adcb56e7 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 박동철_검증 | 9 | f1277414-39a7-476c-9dce-ab27e0b11cba | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
@@ -0,0 +1,55 @@
# 54-45 횡단 형상 제약표 — 배관 · 흙막이 · 옹벽
범위: 관 · 집수정 · 관 보호공 흙막이(유입·유출) · 추가 흙막이(다단) · 사면안정 흙막이 · 옹벽. 화면 = 서버(같은 TS 를 Node 번들로 돎 — `config/server_calc_node`). 줄 번호는 B06_Section 기준.
## 풂
| # | 무엇 | 어디 | 값 | 처리 |
|---|---|---|---|---|
| 1 | 관 유출 흙막이 — 원지반에 묻히면 위로 0.05m씩 되돌림(매몰-무교차 자리 금지) | 옛 `Culvert_Solve.ts:400` `requireCrossing` · 화면/서버 | 3도 절토선 교차 없으면 금지 | 이번에 풂 |
| 2 | 독립 기슭막이 유입 벽 — 1과 같은 되돌림 | 옛 `Culvert_Geom.ts:224` · 화면/서버 | 같음 | 이번에 풂 |
| 3 | 관 유입 흙막이 ▼ — 유출 벽이 원지반에 못 서면 유입도 못 내려감 | 옛 `Culvert_Solve.ts:436` `outletReceivable` · `placeInletWall` 가드 | 0.05m씩 되돌림 | 이번에 풂 |
| 4 | 사면안정 흙막이 · 옹벽 — 묻히는 자리면 위 · 안쪽으로 되돌림 | 옛 `Cross_Revetment.ts:209` `placeable` | 3도 절토선 교차 없으면 금지 | 이번에 풂 |
| 5 | 추가 흙막이 — 묻히는 자리면 d · x 되돌림 | 옛 `Culvert_Extra.ts:320` `placeable` | 이음선 위 지반 · 0.5m 이상 매몰 금지 | 이번에 풂 |
| 6 | 추가 흙막이 — 시작점이 원지반 아래면 다단 끊음 | 옛 `Culvert_Extra.ts:241` | 단 수 줄어듦 | 이번에 풂(`Culvert_Extra.ts:241`) |
| 7 | 추가 흙막이 — 남은 성토 0.7m 미만이면 다단 끊음 | 옛 `Culvert_Extra.ts:244` | 0.7m | 이번에 풂 |
| 8 | 추가 흙막이 — 앉을 지형 없으면 단 안 세움 | 옛 `Culvert_Extra.ts:296` | 지형 높이 0.05m 미만 | 이번에 풂 — 시작점 바로 밖에 섬(`Culvert_Extra.ts:295`) |
| 9 | 「좌우 이동 지형에 막힘」 값(`shiftBlockedM`) | 옛 `Culvert_Extra.ts:383` | 요청 − 적용 | 이번에 풂 — 막힘이 없어 안 나옴 |
| 10 | 형태별 높이 한도(메 2.0 · 찰 3.0 · 콘크리트 5.0) 자르기 | 54-42 지움 | — | 54-42 풂 |
| 11 | 추가 흙막이 원지반 맞춤 늘이기 | 54-42 지움 | — | 54-42 풂 |
## 남김
| # | 무엇 | 어디 | 값 | 남긴 까닭 |
|---|---|---|---|---|
| 12 | 벽 윗면 노면 위 금지 | `Cross_Wall.ts:70` · `Culvert_Solve.ts:388`(d 하한) · `Cross_Revetment.ts:212`(d ≥ 0) | 노면 표고에서 멈춤 | 브레인 규칙 ① |
| 13 | 관 길이 m 단위 — 유출 흙막이 자리 = 관 끝 | `Culvert_Geom.ts:248` · `:435` | 올림 정수 m | 브레인 규칙 ② |
| 14 | 최소 토피 — 유입 관 끝 ≤ 노면 − 관경 − 토피 | `Culvert_Geom.ts:128` · `Culvert_Const.ts:14` | 0.5m | 관 규칙(노면 기준 · 원지반 아님) |
| 15 | 역경사 금지 — 유출 관 끝 ≤ 유입 관 끝 · 유출 흙막이 ▲ 한도 | `Culvert_Geom.ts:240` · `:401` · `Culvert_Solve.ts:390` | 실측 440.2: ▲ −5 요청 → d 0.5 | 물 흐름(관 규칙) · 유입이 원지반 자동값이면 간접으로 걸림 |
| 16 | 관 시작 관 끝 자동값 = 원지반(토피 상한 안) | `Culvert_Geom.ts:129` · `:186` | 자동 자리만 | 벽을 움직이면 벽 자리를 따라감 — 잠금 아님 |
| 17 | 관 흙막이 최소 높이 | `Culvert_Const.ts:142` | 관경 + 1.0m | 관이 벽 위로 · 바닥으로 안 나오게 |
| 18 | 흙막이 좌우 노견 안쪽 금지 | `Culvert_Solve.ts:393` · `Cross_Revetment.ts:208` | x ≥ 0 | 원지반 무관 · 도로 안으로 못 들어감 |
| 19 | 성토선 1:1.2 각도 유지 — 선반 하한 | `Culvert_Extra.ts:317` · `Cross_Revetment.ts:210` | x ≥ 1.2·d(실측 d 3 → x 3.6) | 원지반 무관 · 성토 물매 |
| 20 | 다단 관통 금지 — 아랫단 윗면 ≤ 윗단 바닥 | `Culvert_Extra.ts:300` | 실측 d 0 요청 → 0.5~0.9 | 벽끼리 규칙 |
| 21 | 다단 수 | `Cross_Structure_Panel.ts:340` | 0~9 | 화면 칸 한도 |
| 22 | 벽 최저 높이 | `Culvert_Extra.ts:253` · `Cross_Revetment.ts:184` | 근입 + 0.1 = 0.6m | 형상이 안 무너지게 |
| 23 | 근입 깊이 고정 | `Culvert_Const.ts:76` | 0.5m | 기하 기준선 |
| 24 | 벽 두께 | `Culvert_Const.ts:17` | 0.45m | 기하 기준 |
| 25 | 전면 기울기 = 표준경사 표(형태 무관) | `Cross_Lean.ts:22` | 단면유형 × 설치 측 × 높이 | 54-42 결정 |
| 26 | 집수정 I형 벽 바닥 원지반까지 묻음 | `Culvert_Basin.ts:244` | 지반 − 부재두께 | 집수정 — 54-45 벽 범위 밖 · 사용자 확인 필요 |
| 27 | 집수정 ㄴ·ㄷ 기본 판정(절토선 없으면 I) | `Culvert_Basin.ts:51` | 기본값만 | 고른 값은 그대로 · 잠금 아님 |
| 28 | 집수정 내공 | `Cross_Structure_Panel.ts:309` | 1~2m | 화면 칸 한도 |
| 29 | 집수정 좌우 노견 안쪽 금지 | `Cross_View_Structure.ts:134` | ≥ 0 | 원지반 무관 |
| 30 | 사면안정 흙막이 · 옹벽 설치 측 빈 칸 = 성토 쪽 · 양측 절토면 안 그림 | `Cross_Revetment.ts:175` | — | 단면유형 규칙(원지반 아님) |
| 31 | 성토사면 5m 초과 경고 | `Culvert_Const.ts:180` · `Cross_Culvert.ts:114` | 5m | 경고만 · 잠금 아님 |
| 32 | 바닥 원지반 이격 경고 | `Cross_Culvert.ts:186` · `Cross_Revetment.ts:372` | 이격 m | 경고만 · 잠금 아님 |
| 33 | 유입 흙막이 선택지 판정(`revetAllowed`) | `Culvert_Basin.ts:417` | 원지반 > 토피 상한 | 계산만 · 쓰는 곳 없음 — 잠금 아님 |
## 확인 수치(검증_sub7 · 화면 eval = 서버 번들)
- 440.2 · 85.1 · 720.4 관 — 유출 d 8 · x 1 그대로(깊게) · x 9 그대로(멀리 · 이격 4.3~7.2m) · 다단 2단 d 3 그대로
- 옹벽(성토 측점에 붙임) — d 6 그대로 · ▲ −3 → 0(노면 멈춤) · 3단 중 3단
- 440.2 유출 흙막이 ▼ 8번 누름 → 캐시 d 10 남음(되돌림 없음)
- 서버 면적 = 화면 9건 전부 같음(절토 · 성토 ㎡ 소수 넷째 자리)
제약 33(남김 22)