From d3d444752325fe8eb87fb92720407676674dda96 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 6 Oct 2026 16:59:40 +0900 Subject: [PATCH 1/2] =?UTF-8?q?chore(sync):=20=EA=B3=B5=EC=9C=A0=20docs=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EB=8B=B4=EC=9D=8C=20=E2=80=94=20=ED=95=A9?= =?UTF-8?q?=EB=A5=98=EC=A0=90=EA=B3=BC=20=EB=A7=9E=EC=B6=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/raw/M02_구조물옵션정의/정의_틀.md | 101 +++++++++++++ docs/raw/구조물정의_표/01_횡단배수_배관.md | 12 ++ .../raw/구조물정의_표/02_횡단배수_박스암거.md | 8 + .../구조물정의_표/03_횡단배수_물넘이포장.md | 5 + docs/raw/구조물정의_표/04_횡단배수_세월교.md | 8 + .../05_횡단배수_노출형횡단수로_개거.md | 6 + docs/raw/구조물정의_표/06_횡단배수_맹암거.md | 7 + .../raw/구조물정의_표/07_안전부대용지_숨김.md | 25 +++ .../08_사토장_토취장_노면공_기타.md | 19 +++ docs/raw/사용자요구/2026-10-05_수정요구.md | 133 ++++++++++++++++ docs/raw/조사/2026-10-06_54-5_속도_보안.md | 142 ++++++++++++++++++ 11 files changed, 466 insertions(+) create mode 100644 docs/raw/M02_구조물옵션정의/정의_틀.md create mode 100644 docs/raw/구조물정의_표/01_횡단배수_배관.md create mode 100644 docs/raw/구조물정의_표/02_횡단배수_박스암거.md create mode 100644 docs/raw/구조물정의_표/03_횡단배수_물넘이포장.md create mode 100644 docs/raw/구조물정의_표/04_횡단배수_세월교.md create mode 100644 docs/raw/구조물정의_표/05_횡단배수_노출형횡단수로_개거.md create mode 100644 docs/raw/구조물정의_표/06_횡단배수_맹암거.md create mode 100644 docs/raw/구조물정의_표/07_안전부대용지_숨김.md create mode 100644 docs/raw/구조물정의_표/08_사토장_토취장_노면공_기타.md create mode 100644 docs/raw/조사/2026-10-06_54-5_속도_보안.md diff --git a/docs/raw/M02_구조물옵션정의/정의_틀.md b/docs/raw/M02_구조물옵션정의/정의_틀.md new file mode 100644 index 000000000..c64e03855 --- /dev/null +++ b/docs/raw/M02_구조물옵션정의/정의_틀.md @@ -0,0 +1,101 @@ +# 구조물 정의 틀 (PLAN 48-1) + +정본 = `resources/master_template/구조물정의.json` 한 벌. 서버 · 화면은 이 한 벌만 읽음. + +## 1. 길 + +| 길 | 누가 | 하는 것 | +| --- | --- | --- | +| `GET /api/m02/structure-definition` | 로그인 누구나 | 정의 한 벌 그대로 | +| `PUT /api/m02/structure-definition` `{판, 정의}` | 시스템 관리자만(아니면 403) | 통째로 고쳐 씀 · 낡은 판 409 · 검사 틀림 422 | +| `GET /api/projects/structure-types` | 로그인 | 정의의 `types` + `표시` · `그룹` 을 옛 꼴 그대로(`visible` · `groups`) | +| `PUT /api/m02/structure-options` · `structure-option-groups` | 시스템 관리자 | 정의의 `표시` · `그룹` 칸만 고쳐 씀(같은 판 · 같은 이력) | + +- 서버 읽기 = `B05_Profile_Structures_Schema.load_definition()` · `load_structure_types()` · 쓰기 = `M02_SO_Definition.save()` · `save_sections()`. + +## 2. 담는 것 + +| 칸 | 꼴 | 뜻 | +| --- | --- | --- | +| `판` | 정수 | 저장마다 +1 · 앞 판은 `구조물정의_이력/판_N.json` | +| `schema_version` · `comment` | 수 · 글 | 옛 레지스트리 머리 그대로 | +| `구조물군` | `{군 키: 이름}` | 구조물군 이름(A 횡단배수 …) | +| `동작` | `{동작 이름: 뜻}` | 손코딩 특수 동작 목록(5장) | +| `types` | 종류 목록 | 종류 · 옵션 · 선택지 · 기본값 · placement 등(옛 `B05_Profile_Structure_Types.json` 꼴 그대로) | +| `종류` | `{종류 키: {기준측점?, 동작?}}` | 종류마다 덧칸 — 없으면 기본 | +| `표시` | `{종류 키: {옵션 키: false}}` | 끈 옵션만(옛 `구조물옵션표시.json`) | +| `그룹` | `{종류 키: [그룹]}` | 옵션 그룹(옛 `구조물옵션그룹.json` · 46장) + 형상 칸 | +| `배치` | `{종류 키: {옵션 키: {줄, 칸, 너비}}}` | B05 · B06 좌측 「구조물 배치」 칸 자리 — 없으면 지금 차례 | +| `규칙` | 규칙 목록 | 상위 옵션 값 → 하위 옵션(4장) | + +## 3. 키 규칙 + +- 키 = 만들 때 자동 · 안 바뀜 · 영문 소문자 · 숫자 · `_`. 이름(`name` · `label` · 선택지 글 · 그룹 `이름`)은 자유. +- 종류 키(`type_id`) 는 정의 안에서 하나 · 옵션 키(`key`) 는 종류 안에서 하나 · 그룹 id 는 `g` + 소문자 · 숫자. +- 지움 = 「안 씀」(`enabled: false`) — 종류 · 옵션을 목록에서 빼지 않음. +- 저장된 값의 키가 지금 정의에 없으면 = 지난 정의 값 — 버리지 않고 남김(오류 없음 · 계산은 없는 값으로). +- 프로젝트 `structures.json` 에 저장 때 정의 판(`definition_version`). + +## 4. 옵션 + +### 꼴 + +| `input` | 이름 | 값 | +| --- | --- | --- | +| `select` | 고르기 | `choices` 중 하나(선택지 있어야 함) | +| `number` | 숫자 | 0 이상 수 · `unit` | +| `text` | 글 | 글 | +| `bool` | 예/아니오 | 참 · 거짓 | + +- 옵션 덧칸(옛 그대로) = `label` · `choices` · `unit` · `default` · `required` · `phase`(b05 · detail) · `enabled` · `empty_means` · `default_basis` · `warn_above` · `warn_message` · `not_in_table`. + +### 배치 칸 + +- `줄` = 몇째 줄(1부터) · `칸` = 그 줄 몇째 칸(1부터) · `너비` = 칸 몇 개 차지(1부터). 셋 다 1 이상 정수. + +### 그룹 + +``` +{"id": "g1a2b3c", "이름": "유입구 기슭막이", "옵션": ["옵션 키", …], + "형상": {"길이": {"받기": true, "뜻": "유입구 기슭막이 연장"}, "높이": {…}, "전": {…}, "후": {…}}} +``` + +- 옵션 하나는 한 종류 안에서 그룹 하나에만 · 빈 그룹(옵션 0)도 그룹 · 그룹에 안 넣은 옵션 = 본체 칸. +- `형상` = 그룹이 받을 형상 칸(길이 · 높이 · 기준 측점 전 · 후) — 칸마다 `받기`(켬끔) + `뜻`(무엇을 정하는지). 없는 칸 = 안 받음. + +### 종류 덧칸 + +- `기준측점` = 종류 맨 위 기준 측점 칸 보이기(없으면 보임). +- `동작` = 이 종류에 붙인 특수 동작 이름들(`동작` 목록 안에서). + +## 5. 규칙 꼴 + +``` +{"종류": "종류 키", + "만약": {"옵션": "상위 옵션 키", "값들": ["값", …]}, + "그러면": {"옵션": "하위 옵션 키", "선택지": ["값", …], "보이기": false, "기본값": "값"}} +``` + +- 만약 상위 옵션 = 값들 중 하나 → 그러면 하위 옵션의 선택지 / 보이기 / 기본값(셋 중 하나 이상). +- 상위 · 하위는 같은 종류 안 · 서로 다른 옵션 · 고르기 꼴이면 값들은 선택지 안 · 하위 `선택지` 는 고르기 꼴의 선택지 안 · `기본값` 은 (좁힌) 선택지 안. +- 계산 · 연동 제어는 넣지 않음(48-5). + +## 6. 동작 이름(손코딩 특수 동작) + +| 이름 | 붙은 종류 | 하는 것 | +| --- | --- | --- | +| `계곡통과시설` | pipe · box_culvert · ford_pavement · ford_bridge · revetment | 관 지점 정본 시설 — 부속 옵션 서브폼 · 저장은 폼이 아는 칸만 | +| `유입유출_묶음` | pipe | 유입구(집수정 · 기슭막이 택일) · 유출구(기슭막이) 소그룹 | +| `기슭막이_한벌` | pipe · revetment | 형태 · 길이 · 높이 · 바닥 보호공 한 벌 | +| `BOX_본체규격` | box_culvert | 본체 규격 프리셋(폭 × 높이) | +| `날개벽` | box_culvert · ford_bridge | 날개벽 유입 · 유출 · 짧은쪽 높이 · 길이 · 각도 | +| `월류단면` | ford_pavement · ford_bridge | 월류 폭 · 높이 · 바닥 경사 · 포장 두께 + 개략 단면 · 필요 수심 미만 되돌림 | +| `포장_물넘이_겹침` | pavement_concrete | 포장 구간이 물넘이를 품으면 나눔 · 끝만 걸치면 저장 멈춤 | + +- 정의에서 붙이고 뗌 = `종류.{키}.동작` · 새 동작은 코딩 뒤 목록에 이름을 더함. + +## 7. 판 · 이력 + +- 저장 = 읽어 간 `판` 을 같이 보냄 → 같으면 앞 판을 `구조물정의_이력/판_N.json` 으로 남기고 새 판 = N + 1. +- 검사(틀리면 422 · 안 씀) = 칸 꼴 · 종류 키 · 옵션 키 겹침 · 고르기 선택지 있음 · 구조물군 있음 · 표시 · 그룹 · 배치 · 종류 덧칸 · 규칙 대상 있음. +- 판 1 = 옛 `B05_Profile_Structure_Types.json`(37종 · 옵션 235) + `구조물옵션표시.json` + `구조물옵션그룹.json` 을 키 그대로 옮김. diff --git a/docs/raw/구조물정의_표/01_횡단배수_배관.md b/docs/raw/구조물정의_표/01_횡단배수_배관.md new file mode 100644 index 000000000..7af37a8c5 --- /dev/null +++ b/docs/raw/구조물정의_표/01_횡단배수_배관.md @@ -0,0 +1,12 @@ +# 구조물 표 01 — 횡단배수 › 배관 (사용자 10-5 · 원문 그대로 · 탭 구분) + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 컨테이너 2 컨테이너 2 옵션항목 컨테이너 3 컨테이너 3 옵션항목 컨테이너 4 컨테이너 4 옵션항목 컨테이너 5 컨테이너 5 옵션항목 + (필수)컨테이너 제목 : 관 (필수)컨테이너 제목 : 관 보호공 (유입) (필수)컨테이너 제목 : 관 보호공 (유출) (선택)컨테이너 제목 : 흙막이 추가 | 여러개일수 있음. (선택)컨테이너 제목 : 도수로/돌붙임 | 여러개일수 있음. +횡단배수 배관 측점 No, + 측점거리 관경 800, 1000, 1200, 1500 구조 집수정, 흙막이 구조 흙막이 구조 흙막이 구조 도수로, 돌붙임 + 관 길이 입력값 아님, 자동계산됨 형태 집수정 : I형, L형, ㄷ형 | 흙막이 : 돌 쌓기(찰), 돌 쌓기(메), 콘크리트, 돌망태, 통나무/목재틀, 바자 형태 (같음) 형태 (같음) + 길이 수기입력 길이 수기입력 길이 수기입력 + 높이 수기입력 및 횡단도에서 제어 높이 수기입력 및 횡단도에서 제어 높이 수기입력 및 횡단도에서 제어 + 기준측점 전 수기입력(길이 + 기준측점 전/후에 따라 연동 계산) (같음) (같음) + 기준측점 후 수기입력(길이 + 기준측점 전/후에 따라 연동 계산) (같음) (같음) + +운영(사용자 10-5): M02 「구조물 옵션 정의」 = 이름 · 값 이름 바꿀 때만 · 구조는 사용자가 엑셀 표로 주는 대로 브레인이 구조물마다 작업 창 하나에 코드로 넣음 · 연동 계산까지 · 구조물별 계산 파일 따로 됨. diff --git a/docs/raw/구조물정의_표/02_횡단배수_박스암거.md b/docs/raw/구조물정의_표/02_횡단배수_박스암거.md new file mode 100644 index 000000000..84db436a0 --- /dev/null +++ b/docs/raw/구조물정의_표/02_횡단배수_박스암거.md @@ -0,0 +1,8 @@ +# 구조물 표 02 — 횡단배수 › 박스암거 (사용자 10-5 · 고친 판 · 원문 그대로) + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 컨테이너 2 컨테이너 2 옵션항목 컨테이너 3 컨테이너 3 옵션항목 + (필수)컨테이너 제목 : 본체 (필수)유입 구조 (필수) 유출 구조 +횡단배수 박스암거 측점 No, + 측점거리 본체 규격 2.0 X 2.0, 3.0 X 3.0, 사용자 입력 구조 없음, 날개벽, 흙막이 구조 없음, 날개벽, 흙막이 + +(첫 판: 날개벽(유입) · 날개벽(유출) 설치 있음/없음 → 이 판으로 바뀜) +사용자 참고(10-5): 컨테이너 항목별로 이전에 작업한 구조물 조합의 키값을 연결할 예정 · 연결 코드는 이미 있음. diff --git a/docs/raw/구조물정의_표/03_횡단배수_물넘이포장.md b/docs/raw/구조물정의_표/03_횡단배수_물넘이포장.md new file mode 100644 index 000000000..dc4fa248c --- /dev/null +++ b/docs/raw/구조물정의_표/03_횡단배수_물넘이포장.md @@ -0,0 +1,5 @@ +# 구조물 표 03 — 횡단배수 › 물넘이 포장 (사용자 10-5 · 원문 그대로) + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 컨테이너 2 컨테이너 2 옵션항목 컨테이너 3 컨테이너 3 옵션항목 + (필수)컨테이너 제목 : 경사각도 (선택)컨테이너 제목 : 도수로/돌붙임 +횡단배수 물넘이 포장 측점 No, + 측점거리 경사각도 각도 수기입력 구조 도수로, 돌붙임 diff --git a/docs/raw/구조물정의_표/04_횡단배수_세월교.md b/docs/raw/구조물정의_표/04_횡단배수_세월교.md new file mode 100644 index 000000000..16a74addd --- /dev/null +++ b/docs/raw/구조물정의_표/04_횡단배수_세월교.md @@ -0,0 +1,8 @@ +# 구조물 표 04 — 횡단배수 › 세월교 (사용자 10-5 · 원문 그대로) + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 컨테이너 2 컨테이너 2 옵션항목 컨테이너 3 컨테이너 3 옵션항목 + (필수)컨테이너 제목 : 세월교 (필수)유입 구조 (필수) 유출 구조 +횡단배수 세월교 측점 No, + 측점거리 관경 800, 1000, 1200, 1500 구조 없음, 날개벽, 흙막이 구조 없음, 날개벽, 흙막이 + 월류 폭 수기 입력 + 월류 높이 월류 폭과 높이는 연동 자동계산 + 수량(련) 수기 입력 diff --git a/docs/raw/구조물정의_표/05_횡단배수_노출형횡단수로_개거.md b/docs/raw/구조물정의_표/05_횡단배수_노출형횡단수로_개거.md new file mode 100644 index 000000000..0fefba539 --- /dev/null +++ b/docs/raw/구조물정의_표/05_횡단배수_노출형횡단수로_개거.md @@ -0,0 +1,6 @@ +# 구조물 표 05 — 횡단배수 › 노출형 횡단수로 · 개거(겉도랑) (사용자 10-5 · 원문 그대로) + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 + 컨테이너 없는 항목 측점 하단에 구조물 조합 연결 항목 넣기 +횡단배수 노출형 횡단수로 측점 No, + 측점거리 +횡단배수 개거(겉도랑) 측점 No, + 측점거리 diff --git a/docs/raw/구조물정의_표/06_횡단배수_맹암거.md b/docs/raw/구조물정의_표/06_횡단배수_맹암거.md new file mode 100644 index 000000000..7b319babc --- /dev/null +++ b/docs/raw/구조물정의_표/06_횡단배수_맹암거.md @@ -0,0 +1,7 @@ +# 구조물 표 06 — 횡단배수 › 맹암거 (새 종류 · 사용자 10-5 · 원문 그대로) + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 +횡단배수 맹암거 측점 No, + 측점거리 (필수)컨테이너 제목 : 맹암거 + 암거 높이 수기입력 + 암거 경사 수기입력 +* 종단 배수의 암거와는 다른 내용임 diff --git a/docs/raw/구조물정의_표/07_안전부대용지_숨김.md b/docs/raw/구조물정의_표/07_안전부대용지_숨김.md new file mode 100644 index 000000000..4b3636e7f --- /dev/null +++ b/docs/raw/구조물정의_표/07_안전부대용지_숨김.md @@ -0,0 +1,25 @@ +# 구조물 표 07 — 안전부대용지 · 종단배수 · 계류사방 (사용자 10-5 · 원문 그대로) + +사용자: 다음 종단배수 전체 항목은 구조물 연결 지정 없으며 현재처럼 숨김처리. 계류사방 항목도 숨김처리 + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 +안전부대용지 대피로 측점 No, + 측점거리 (필수)컨테이너 제목 : 상세 내용 + 상세 대피소, 정차/작업장, 차돌림곳 + + 컨테이너 없는 항목 측점 하단에 구조물 조합 연결 항목 넣기 +안전부대용지 반사경 측점 No, + 측점거리 +안전부대용지 경계석 측점 No, + 측점거리 +안전부대용지 위험표시 측점 No, + 측점거리 +안전부대용지 국가지점번호판 측점 No, + 측점거리 +안전부대용지 취수정 측점 No, + 측점거리 +안전부대용지 준공표지판 측점 No, + 측점거리 +안전부대용지 차단기 측점 No, + 측점거리 +안전부대용지 취수정 측점 No, + 측점거리 (원문에 두 번 · 하나로 봄) + +(덧 · 사용자 10-5) +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 + (필수)컨테이너 제목 : 상세 내용 +안전부대용지 가드레일 측점 No, + 측점거리 형태 수기입력 + 길이 수기입력 + 기준측점 전 수기입력(길이 + 기준측점 전/후에 따라 연동 계산) + 기준측점 후 수기입력(길이 + 기준측점 전/후에 따라 연동 계산) diff --git a/docs/raw/구조물정의_표/08_사토장_토취장_노면공_기타.md b/docs/raw/구조물정의_표/08_사토장_토취장_노면공_기타.md new file mode 100644 index 000000000..4816aadc2 --- /dev/null +++ b/docs/raw/구조물정의_표/08_사토장_토취장_노면공_기타.md @@ -0,0 +1,19 @@ +# 구조물 표 08 — 안전부대용지 사토장 · 토취장 · 노면공 콘크리트 포장 · 기타 (사용자 10-5 · 원문 그대로) + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 … 상세 설계 필수 선택 +안전부대용지 유용토운반작업장(사토장) 측점 No, + 측점거리 (필수)컨테이너 제목 : 상세 내용 + 사토장 부피 수기입력 + +안전부대용지 토사채취장(토취장) 측점 No, + 측점거리 (필수)컨테이너 제목 : 상세 내용 + 토취장 부피 수기입력 + +노면공 콘크리트 포장 측점 No, + 측점거리 (필수)컨테이너 제목 : 상세 내용 + 포장사양 콘크리트, XXX + 높이 수기입력 + +기타 수기입력 측점 No, + 측점거리 (선택)컨테이너 제목 : 상세 내용 (상세 설계) 도수로(or 돌붙임) + 비고 수기 입력 (상세 설계) 도수로(or 돌붙임) 관보호공, 옹벽, 돌쌓기, 흙막이, 큰톨쌓기 가 같은 형상으로 보임. + +(가드레일은 표 07 덧과 같음) + +사용자(10-6): 기타 항목의 목적은 우리 프로그램에 등록되지 않은 구조물을 수기입력하여 등록하기 위함임. diff --git a/docs/raw/사용자요구/2026-10-05_수정요구.md b/docs/raw/사용자요구/2026-10-05_수정요구.md index eeadef7f7..32518256a 100644 --- a/docs/raw/사용자요구/2026-10-05_수정요구.md +++ b/docs/raw/사용자요구/2026-10-05_수정요구.md @@ -48,3 +48,136 @@ 4. 구조물 조합의 단가산출 상세화면에도 원문보기 우측 패널이 있어야함. 우측 패널은 단가산출 로직을 선택할 경우에 원문을 보여주는 기능이며 패널을 접었다 펼수 있어야함. 5. 원문 패널 추가에 따라 현재 단가산출 로직 항목을 선택하면 옵션창이 보이나 선택하면 하이라이트를 하고 원문을 보일수 있게 함. 그리고 옵션설정에 대한 조정은 올리기, 내리기, 빼기 버튼의 이름을 위로, 아래로, 삭제로 변경하고 아래로 와 삭제 사이에 신규 버튼(이름 : 옵션)을 추가하여 선택할 수 있게 변경. 버튼 사이간격에 대해 템플릿화하여 적용. 6. 구조물 조합의 면적산출 우측패널에 별도의 도면 패널 추가(기능은 4번 요청 확인) + +## 구조물 옵션 정의 페이지 (10-5 · 원문 그대로) + +이제부터 다시 계획서를 세울 예정임. +1. 목표 : 현재 구조물 옵션 보이기의 컨테이너 항목을 기준으로 프로젝트 내부에 사용하는 구조물의 옵션 항목 및 제어를 설정하는 페이지를 궁성 +2. 상세 내용 + - 현재 M02의 구조물 옵션보이기 항목으로 구조물군과 구조물 종류를 설정하고 이름을 변경할 수 있게 반영 + - 구조물 종류를 선택시 우측에 해당항목의 일위대가 그룹을 지정하고 변수를 편입할수 있게 반영(기반영), 추가로 배치 순서를 조절할 수 있게, 행열의 크기 제어도 같이 + - 구조물 종류의 특정 옵션의 옵션 값 항목을 지정할 수 있게 반영 + - 구조물 종류의 최상위에 기본값인 기준 측점을 표현할건지에 대한 기능 + - 구조물의 길이, 높이, 기준측점 전/후 값에 대한 옵션 사용여부 및 어떤걸 제어하는지에 대한 결정 + - 구조물 옵션과 값들의 이름 변경기능 + - 옵션들은 상위에 따라 하위 옵션을 변경할 수 있게 반영 +3. 현재 B05와 B06의 방대한 변경이 필요하니 순차적으로 진행, 가자먼저 작업할 내용은 B05와 B06에 좌측 패널의 구조물 배치 컨테이너에 보일 항목을 반만들수 있게 반영하고 선택에 따라 변경되는 변수 값과 제어는 별도로 작업 할 예정. 일단 방향성에 대해 검토해보고 대화부터 하자. 내가 원하는 방향은 결국 내가 프로그래머가 아니라서 나중에 항목을 추가하거나 옵션을 변경하였을때 프론트엔드에 기능을 구현하고 변경하고 싶은것임. + +## 원문 보기 패널 (10-5 · 원문 그대로) + +계획서는 작성해주고 빠르게 작업해줄 내용이 M01과 M02에서 원문보기가 패널 양식을 사용하지 않고 있음. 추가로 M01페이지의 원문보기에서 md파일을 보기가 깨짐이 있음. M02는 정상. M01의 경우 흐름도와 원분은 우측 패널로 구현되어있음. 좌측 패널과 동일하게 접었다 펴는 양식 제대로 확인할 ㄱ서. + +그리고 우측 패널의 내용은 메인 화면의 스크롤과 별개로 동작하게 반영 + +추가로 원문에서 표는 스크롤로 매우 낮은 공간만 보이고 스크롤 표현되어서 보기가 힘듬. 그냥 표가 길더라도 보여줄것. 어차피 상세페이지와 원문의 우측 패널의 영역은 별도의 스크롤 영역이라 무관함. + +원문은 M01과 M02에 표현되고 있는데 일원화 할것. M02가 더 가독성이 좋음. + +## 일위대가 조합 · 면적산출 알약 (10-5 · 원문 그대로) + +다시 돌아가서 M02 페이지에 +1-1. 구조물 조합의 면적산출에서 도면으로 보내진 셀의 영역을 표현이 되게하기 +1-2. 구조물 조합의 면적산출에서 알약을 선택을 했을때 셀이 반짝임은 있지만 반대로 셀을 선택했을때는 잘 안보임. +1-3. 구조물 조합의 면적산출에서 일위대가의 로직을 삭제했을때 기 지정된 알약이 잔존하고 있음. 삭제가 힘들다면 느낌표라도 보여지게 하고 삭제가능한지 검토 +2. 원문 표기의 '산림품셈 3-4-2 1' 항목 확인 +3. 구조물 조합의 일위대가 상세 화면에서 단가산출 로직에 들어가는 로직항목들은 단가산출 로직 뿐만아니라 단일 단가산출 로직을 일위대가로 승격시킨 선택지와 다른 일위대가로 만들어진 조합도 선택이 되어야함. +4. 방법 : 구조물 조합 컨테이너 하단에 일위대가 조합 컨테이너를 추가하고 여기에 마스터, 회사, 개인의 권한을 구현, 이때는 두가지의 선택지가 있음. 하나는 일위대가로 승격시킨 단가산출로직의 리스트와 일위대가에 사용하기 전 사전 조합으로 만들어진 조합으로 구분함. +5. 단가산출 승격은 단가산출 로직의 항목들을 검색하여 선택하면 일위대가 형태로 저장이 됨. (도면 X, 면적산출 X) +6. 일위대가 사전 조합은 단가산출 승격 + 다른 일위대가의 조합으로 그룹(도면 X, 면적산출 X) +7. 일위대가 조합은 구조물 조합의 일위대가 상세화면에서 선택할 수 있어야함. +8. 구조물 조합의 일위대가 상세화면에서의 로직테이블은 일위대가 목록표임. 여기서 행을 눌렀을때 하단에 상세 내역이 보였으면 함. 상세내역은 M01페이지의 단가산출 로직을 보면 시험계산 컨테이너 내부에 기준단위에 대한 테이블 리스트가 있음. 이걸 B02 구조물 조합의 일위대가 조합에 맞게 넣어주면 됨. 행을 선택했을때만 보여주면 되고 다른 행을 선택하면 닫히면 됨. +9. 구조물 조합의 일위대가 상세화면에 단가산출 로직 테이블의 이름 좌측 열을 추가하고 구분을 추가함. 구분은 출처로 단가산출인지, 일위대가 조합인지, 단가산출을 승격한 정보인지 표기 항목은 4음절로 표기, +일단 상세히 반영 가능성에 대해 상세히 검토후 계획서에 반영 + +## 오른쪽 패널 높이 (10-5 · 원문 그대로) + +하나씩 수정 내용에 대해 요청할께. M01 단가산출 로직 상세와 M02의 구조물 조합의 일위대가와 면적산출에는 우측 패널이 존재함. 이 우측 패널의 높이는 화면에 맞춰서 높이를 결정하게 했으면 함. 스크롤 동작시 움직임. + +추가로 너가 오해한게 있는데 구조물 조합의 일위대가 상세페이지에서 단가산출 로직 행을 선택했을때 나오는 상세정보를 해당행이 아래에 별도의 행으로 구분하여 접었다 폈다하면서 내용을 보줬으면 해. 별도의 공간에 M01처럼 보여달라는게 아니라 테이블에 맞춰서 정보를 넣어달라는 의미였어. + +## 서고 · 고르기 창 (10-5 · 원문 그대로) + +1. 로직고르기 모달창에서 찾기 버튼은 필요없어 보임. 다른 찾기 기능을 보면 없어도 될것같아. 그리고 단가 승격과 사전 조합을 별도의 버튼으로 활성화하는데 이건 그냥 구분정보를 보여줘서 선택을 유도해도 되지 않을까? +2. 일위대가 조합 컨테이너에는 새로, 본떠 만들기, 지우기 버튼은 필요없고 단가산출 승격 이라는 항목과 일위대가 사전조합이라는 항목 두게만 있으면 될것같음. 그리고 해당 항목을 누르면 상세에 테이블형태로 리스트 들을 보여주고 거기에 생성, 복사, 삭제 버튼이 있으면 됨. +3. 사전 조합도 동일함 + +단위를 선택하게 하는 항목들 중 선택 후 나오는 단위 표기 버튼이 너무 작음 저장같은 버튼과 같은 크기로 변경 + +사전조합에 상세에서 보여지는 단가산출 로직의 선택 기능이 없음 + +구조물 조합의 일위대가에서 조합 테이블에 넣어준 상세 항목 펼쳐짐 화살표는 필요없어. + +그리고 로직 고르기 모달창에서 구분과 상세 구분은 2열 구조로 변경하고 찾을때 나온 항목들의 이름들은 좌측 맞춤으로 글자를 맞춰야지. 찾기의 공용화 양식이 없는거야?템플릿 있을것같은데? + +단가산출과 일위대가 사전조합에서 테이블의 양식도 M01에 공통테이블 양식이 있을것같고 버튼들도 M01에 템플릿이 있을거야. 확인해봐 그리고 사전조합의 경우에 검색은 별도의 창이 아니라 구조물 조합의 일위대가 테이블의 조건 추가와 같은 기능이어야. + +일위대가 사전조합에서 나오는 모당창의 형식 뿐만아니라 내용도 구조물조합의 일위대가의 상세 화면에서 로직 추가와 같아야된다고 선택되는 항목도 + +어차피 신규로 키값을 만들지 않았음? 그럼 당연히 해당 연결정보와 구분, 상세구분을 만들어야하지 않음? + +다음으로 구조물 조합에서 일위대가의 상세페이지에서 테이블 행 선택에서 단가승격이야 단가산출과 같은 항목이라 문제가 없는데 일위대가 사전조합의 경우에는 전체를 다 표현하는데 문제가 있어. 일위조합인 경우에는 조합의 세부항목을 기준으로 노무비, 재료비, 경비를 값을 가져와서 사용하면 가능하지 않을까? + +추가로 구조물 조합의 일위대가 상세페이지의 로직 테이블의 순서 열에서 존재하는 버튼을 2행 구조로 변경 +단가 승격에도 옵션 버튼이있어야할것같고. 일위조합의 경우에는 바로 옵션으로 지정할수 없으니 수정버튼(모달)도 잇어할것 같은데? + +맹암거처럼 cad연결이나 횡단도에 그릴지 말지는 이번 수정 후에 작업할거야. 너는 B05/B06 좌측 패널의 생성과 기존 로직 연결에만 신경쓸것. +나는 이제 자러 갈거니 너가 다른 워크트리들을 잘 제어해서 계획서의 내용을 반영하고 최종검증을 진행 후 아티팩트로 결과를 보여주는데 만약 개선이 필요하다고 판단되는 부분이 있다면 계획서에 내용을 추가해서 개선할것. + +(10-6 사용자) +1. 내가 넣어준 선택지 외에는 다른 정보들은 필요없는 상황임. +2. 각 워크트리는 자기의 검증프로젝트를 가지며 수정해도 상관없음. +3. 기타 표가 뭐임? 내가 넣어준거에는 없는데? +4. 물넘이 경사는 내가 다시 요청하겠음. +5. 세월교도 보고 내가 판단하겠음. +6. 현재 만들어진 프로젝트는 이전 로직으로 만들어진 프로젝트로 필요시 재생성 +7. 현재 횡단도의 구조물을 선택하면 좌측 패널 활성화부분 재점검 +8. 좌측 패널의 좌측 하단의 구조물리스트와 하이라이트 기능들 점검 + +(10-6 사용자 · 구조물별 수정 요청 1차) +1. 공통 + - 좌측 패널의 컨테이너 내부 구조물 조합 항목의 고르기 버튼의 이름은 '선택'으로 변경 + - 패널 내부 설명은 공간이 부족하니 별도로 빼서 작성할 예정 ? 버튼으로 연결하여 별도의 모달창으로 작업예정이며 각페이지에는 설명서를 넣을 예정. 내부에 들어갈 말은 나도 수정할 수 있게 별도로 페이지별 항목별 별도의 파일로 관리. 여기서 ? 버튼의 위치는 좌측 패널의 좌측하단 초기화 버튼이 있는 그룹들 중 제일 좌측에 존재. 다른 B02 ~ B09 까지 공통사항 + - 횡단도 +2. 배관 + - 관컨테이너 : 관 길이의 사용자의 입력을 받는 정보가 아니라 보여주는 정보임. 라벨은 유지하고 내부 내용은 자동계산으로 변경, 관 길이 항목은 소수점 없음 + - 관 보호공(유입) 컨테이너 : + ㄱ. 집수정은 길이, 기준측점 전/후의 내용이 필요 없음. + ㄴ. 높이에 따라 집수정의 형상이 변경 연결이 안되어 있음. + ㄷ. 흙막이의 돌쌓기(찰)의 경우 다른 형태 대비 모양이 변함. 모양은 같고 형태에 따라 내부 모양만 변하는게 맞음. + - 관 보호공(유출) : + ㄱ. '관길이 15m 좌우 자동 자리 ...' 설명 필요 없음 + ㄴ. 지난 정의 값이라는 항목은 필요없음. 향후 다 정리하고 사용하지 않는 코드들은 삭제 예정 + ㄷ. 추가 기슭막이(단)이 흙막이 추가 흙막이 추가에 대한 내용이었음. 별도 버튼으로 추가하는게 아님. 상단 컨테이너의 흙막이 옵션중 추가 기슭막이(단)의 값에 따라 생성되는데 이때 추가되는 기슭막이의 이름을 흙막이로 변경하고 선택되었을때 보여주는게 아니라 항상 보이게 + ㄹ. 도수로/돌붙임은 일단 유지 + +(10-6 사용자 · 공통 덧) +공통 + - 기존 배관에서 박스암거로 변경할 경우 횡단도의 그림이 업데이트 안됨. 확인 및 업데이트 + - 추가로 관련된 정보 중 확인해줘야 할 내용이 기존에 화면의 B05/B06의 실시간 제어와 동작 속도/보안 개선을 위해 많은 작업이 있었는데 좌측 패널 통합 이후 많이 느려진 걸로 보임. 재확인. 이건 확인부터 하는게 좋겠음. + +(10-6 사용자 · 추가 요청) + - 사면 안정 그룹의 종류들 전체가 컨테이너 구성이 안되어 있음. 현재 기준 측점을 제외한 옵션들을 하나의 컨테이너에 넣고 그 안에 집계 항목 지정 넣을것 + +(10-6 사용자 · 추가 요청) + - 안전부대용지 그룹의 사토장의 기준측점 표현이 예전 코드입. 토취장과 동일하게 구성 + +(10-6 사용자 · 다음 수정) + - B05/B06의 종단도 내널에서 구조물 알약을 선택하면 정보 라벨이 나오는데 위치가 상하 제어 버튼에 가려져서 안보여 최상위로 올려주고 그럼 버튼이 가려지니까 Y축 방향으로 조금 쉬프트 해줘. 그리고 안에 내용은 중요한 정보만 보여주면 됨. 지금은 너무 많이 나와. 중요한 정보라면 아마 기준 측점 정보와 컨테이너가 있는 경우 제일 앞에 있는 옵션값만 있어도 될것같아. + +(10-6 사용자 · 신규 기능) +다음은 신규 기능이야. 구조물 조합을 지정해야하는 경우에가 있는데 이때 좌측 패널의 구조물 리스트의 항목들에 측점정보 좌측에 연결되었거나 연결되지 않은 정보를 알려주는 기능이 있었으면 함. 이때 구조물에 따라 선택이나 필수 정보들에 의해 램프와 램프의 색상으로 표현되게 하면 될것같아. 램프영역에 의해 글자들의 배열이 깨지는건 싫으니 별도의 영역을 먼저지정하고 램프는 3행 다열 구조로 구성해줘. 램프의 사이즈는 작아도 되니 현재의 리스트 높이를 깨지 않는 범위에서 진행해줘. + +(10-6 사용자 · 중요) +이건 중요한 부분인데 B05와 B06은 같은 프론트엔드를 공유하고 같은 결과와 묶여있어야하는데 지금 분리되어있는것같아. 하나를 변경하면 다른 페이지로 이동되었을때 이전자료를 가지고 있는것같아. 저장하는 데이터 셋의 위치가 일원화 되어있지 않는것같은데. 확인해봐. + +(10-6 사용자 · 추가 요청) + - 구조물 배치에 구조물 조합 선택의 프론트엔드를 2행 구조로 변경해줘. 다른 옵션들을 보면 제목과 입력을 2행 구조로 반영되어 있잖아. 글자 폰트와 크기도 같은걸 사용해줘. + +(10-6 사용자 · 추가항목) +B05에서 3D 영역의 상단 버튼들 중 원근으로, 직교로 버튼의 제목은 원근, 직교 로 변경하고 기본값을 직교로 변경해줘. + +(10-6 사용자 · 추가항목) + - B05의 3D 영역에서 Front, Side버튼의 방향이 대각선 방향인것같아. 방향 재설정 해줘. + +(10-6 사용자 · 추가 요청) + - 페이지의 좌측 패널의 공통항목으로 들어온 버튼 세트의 버튼 크기가 조금 이상함. 점검 diff --git a/docs/raw/조사/2026-10-06_54-5_속도_보안.md b/docs/raw/조사/2026-10-06_54-5_속도_보안.md new file mode 100644 index 000000000..0c804388d --- /dev/null +++ b/docs/raw/조사/2026-10-06_54-5_속도_보안.md @@ -0,0 +1,142 @@ +# 54-5 B05 · B06 실시간 조작 속도 · 보안 재확인 (조사 · 보고만) + +- 기준 커밋: `6233daab1` (sub_laptop_8 = origin/main_laptop_1) +- 검증 프로젝트: `sub8_검증` (`c81b21f8…`) · 노선 224 · 저장 · 확정 누르지 않음(캐시만 · 브라우저 문맥 버림) +- 측정 도구: 헤드리스 Chrome(실 GPU — ANGLE D3D11 Intel Iris Xe) · 1509×1069 · 페이지 안 계측(Event Timing · Long Task · fetch/XHR 감쌈 · sessionStorage 쓰기 셈 · DOM 변화 셈 · WebGL clear 셈) + CDP 메인 스레드 시간 +- ⚠ ORCA 내장 탭이 10초마다 강제로 내려감(다른 창 탭 여럿 · 숨은 탭 10초 뒤 버림 · `tab switch --focus` 로도 같음) → 10초 넘는 측정 불가 → 측정 전용 헤드리스 Chrome 으로 대체(공용 브라우저 아님 · 화면 안 띄움 · ORCA 탭은 닫음) +- 통합 전 판 실행 대조는 안 함(워크트리 금지) → 통합 전 실측값은 커밋 글에 남은 수치로 대조(`9da48d5e7` 9-12 · `1abb456ef` 9-06) + +## ① 기준 커밋 + +속도 · 실시간 · 보안 작업 + +| sha | 날짜 | 내용 | +|---|---|---| +| 7fdbb343a | 08-23 | 코리도 편집 즉시 반영 · 프리즈 제거(프레임 갭 3603→100ms) | +| 08c0dc322 | 08-29 | 자동저장 제거 · 초기값 스냅샷 | +| a35c8ff35 | 09-03 | 계획선 편집 중 횡단 재계산을 브라우저로 — 서버 왕복 제거 | +| c2f681f9d · 8dca4bbfb | 09-04 | 휠 · 세로 맞춤 실시간(다시 그리기 대신 변환) | +| 3cd717d8f | 09-06 | [저장]·[확정] 정본 서버 재계산 | +| 9da3bce1b | 09-06 | 카드 버튼 즉시 저장 → 캐시 · `designRequestSeq` 제거(최신만 채택은 `B05_Profile_UI_Profile_Preview.ts:35-57` seq 가 맡음) | +| c0bfcba34 | 09-06 | 유토 배분을 서버 Node 로(사용자 확정 · 400ms 잠잠해지면 · 최신만) | +| df2dedcbc · 8e3c1f91f | 09-06 | 진입 중복 호출 제거 | +| 0b30f5b03 · 1abb456ef · 4df5d0a7e | 09-06 | 지형 색인 · 카드 강제 레이아웃 67→1회 · B06 진입 2.3~2.9s → 2.0s | +| 674777626 | 09-06 | 세션 확인 활동시각 쓰기 1분 1회 | +| **9da48d5e7** | 09-12 | **B06 ▲▼ — `refreshCards` 묶음 + 120ms 디바운스 · 한 번 누름 920→17~23ms · 최장 멈춤 180~229ms · 1.5초 누름 누적 멈춤 2,577→473ms** | + +좌측 패널 통합(통합 직전 기준 `cd26699d2` 09-29) + +| sha | 날짜 | 내용 | +|---|---|---| +| 439f605ba · 7760dcd77 · 2c520537b | 09-29 | 좌측 칸 등록부 · 설계 가게 한 곳 · 저장 한 줄기 | +| 38aae89b2 | 09-29 | 종단도 한 벌(`design_profile.ts`) — B06 위 종단도도 B05 것으로 | +| 8a9456579 | 09-29 | 고름 한 곳 | +| **dd8066275** | 09-29 | **옛 B06 계획선 편집 껍데기 삭제 — 120ms 디바운스 같이 사라짐** · 유토 뱃지 한 계산(전 측점 `structureAreaRows`) | +| 90a2cb9a1 | 09-29 | 한 페이지 뼈대 · 숨은 3D 그리기 멈춤 | +| **473d959d6** | 09-29 | **가운데 보기 전환 — 폼 한 벌 · `pipeReloadTimer` 추가** | +| 7f04bf961 · 767adc4a4 | 09-29~30 | 관 · 옹벽 칸 한 곳 | +| fc54a385d | 10-05 | 구조물 배치 칸을 정의대로 | +| 0a095c14b … 1a9055444 | 10-05~06 | 52장 명세 공용 틀 + 구조물별 폼 | + +## ② 수치 (지금 판) + +열: 입력→그림 = Event Timing 최대(ms · 괄호 = 그중 JS) · 긴 작업 = 50ms 넘는 멈춤(ms) · 요청 = 조작 하나에 나간 요청(올림/받음) · 캐시 쓰기 = sessionStorage setItem 수 · 좌측 = 좌측 패널 DOM 갈아 끼운 노드 수 · DOM = 전체 · 오버레이 = 잠금 오버레이 뜸 + +### B05 (종단 보기) + +| 조작 | 입력→그림 | 긴 작업 | 요청 | 캐시 쓰기 | 좌측 | DOM | 오버레이 | +|---|---|---|---|---|---|---|---| +| 쉼 3초(3D 켜짐) | — | 0 | 0 | 0 | 0 | 1 | 0 | +| 종단 패널 펼침 | 16~24 | 0 | 0~1(설정 PUT) | 0 | 0 | 0~17 | 0 | +| 구조물 고르기(목록 클릭) | 72~136 (38~54) | 0~57 | 0 | 1 | 95~114 | 106~147 | 0 | +| 좌측 칸 — 돌쌓기 높이 2→1.5 | 16 | 53 · 88 | 0 | 1 (2KB) | 68 | 84 | 0 | +| 좌측 칸 — 돌쌓기 측점 +m | 80~128 | 52~76 · 88 | 0 | 1 (2KB) | 72 | 88 | 0 | +| 좌측 칸 — 메모 6자 타자 | ≤24 | 0 | 0 | 0 | 0 | 0 | 0 | +| 좌측 칸 — 배관 관경 바꿈 | — | 59~64 · 68~93 | **1 · POST detail-basins 1KB/96KB · 211~478ms** | 1~2 | 52~119 | 143~245 | 0 | +| 측점 끌기(구조물 알약 40px) | **160~240 (57~87)** | 59~95 · 62~95 | 0 | 1~2 | 136~158 | 172~182 | 0 | +| 종단 점 ▲ 한 번 | 56~72 (12~22) | 53~78 | 1 · haul-plan 22KB/0.6KB(400ms 뒤) | 2 | 0 | 36 | 0 | +| 종단 점 ▲ 2.5초 길게(약 20회) | 32~56 | 최대 64 | 2 · haul-plan | **42** | 0 | 558 | 0 | + +- 쉼 3초 메인 스레드 시간 **1,484~1,600ms (≈50%)** · WebGL clear 700회(초당 ≈230) — 3D 가 가만히 있어도 매 프레임 그림 → 위 모든 B05 조작에 깔리는 바닥 부하 +- B05 진입: 5.9초 · 요청 21 · 받음 등고선 geojson **36.7MB** + 지형 미리보기 7.8MB + 등고선 7.0MB + 횡단 상세 2.6MB · 진입 때 `POST route/structures/migrate`(쓰기) · 긴 작업 합 832ms + +### B05 ↔ B06 넘김 + +| 조작 | 긴 작업 | 요청 | 캐시 쓰기 | 좌측 | DOM | +|---|---|---|---|---|---| +| B05 → B06 (첫 번째) | **752** · 214 · 403 · 72 · 57 · 154 (합 1,652) | 6 · pipe-points 96KB 다시 받음(1,036ms) · missing-stations 541ms · haul-plan | 10~11 | 392~525 | 2,402~2,560 | +| B06 → B05 | 198~231 · 104~114 | 1 (structures) | 2 | 207~390 | 863~1,094 | +| B05 → B06 (두 번째) | **1,231~1,242** · 76~98 · 81~125 · 137~148 | 2 (structures · pipe-points — 메인 스레드 막혀 1,308~1,341ms 대기) | 1 | 260~371 | 1,474~1,611 | + +- B06 쉼 3초 메인 스레드 5ms · WebGL 0 (숨은 3D 멈춤은 정상) +- 통합 전 B06 페이지 진입 긴 작업 합 1,604~1,728ms(1abb456ef) → 지금은 **같은 페이지 안 보기 바꿈인데도** 1.5~1.7초를 매번 다시 씀 + +### B06 (횡단 보기) + +| 조작 | 입력→그림 | 긴 작업 | 요청 | 캐시 쓰기 | 좌측 | DOM | +|---|---|---|---|---|---|---| +| 종단 점 ▲ 한 번 | 40 | **587** | 1 · haul-plan | 2 | 0 | 900 | +| 종단 점 ▲ 2.5초 길게 | pointerup **344** | **663 · 558 · 545 · 500** · 95 · 162 · 161 (합 2,684) | 4 · haul-plan(325~851ms) | 8 | 0 | 3,564 | +| 횡단 조정 줄 — 카드 암 경계 ▲ | 96 (63) | 68 | 0 | 1 | 67 | 118 | +| 구조물 고르기(돌쌓기) | 128 (74) | 80 | 0 | 2 | **247** | 279 | +| 구조물 고르기(배관) | 120 (75) | 82 | 0 | 2 | **286** | 342 | +| 좌측 칸 — 배관 관경 바꿈 | — | 109 · 54 | **2 · POST detail-basins + haul-plan** | 3 | 52 | 717 | +| 좌측 칸 — 돌쌓기 높이 2→1.5 | 16 | 0 | 0 | **0** | **0** | **0** | + +- **B06 ▲ 통합 전 대비(9da48d5e7 실측)**: 한 번 누름 최장 멈춤 180~229 → **587ms** · 길게 누름 누적 멈춤 473ms(1.5초) → **2,684ms(2.5초)** · 9-12 에 고친 것이 9-29 통합에서 되돌아감 +- B06 보기에서 돌쌓기 높이 칸을 바꿔도 캐시 쓰기 · 화면 변화 0 (B05 보기에선 즉시 반영) — 속도와 별개 흠 의심 · 확인 필요 +- 잠금 오버레이: 모든 조작에서 0 (규칙 맞음) + +## ③ 느린 원인 후보 (6) + +| # | 자리 | 왜 | 실측 근거 | 생긴 때 | +|---|---|---|---|---| +| S1 | `A00_Common/design/design_profile.ts:125` (`CROSS_PREVIEW_DEBOUNCE_MS = 16`) · `:367-392` · `B06_Section/B06_Section_UI_Section_View.ts:393-397` · `:287-291` · `B06_Section/B06_Section_Cross_Refresh.ts:129-140` | B06 ▲ 마다(초당 10회) 전 측점 재계산 → 바뀐 측점 카드 전부 다시 만들기 → 종단도 두 번 그림(`draw()` + `refreshCards`→`redrawProfile`) → 전 측점 `structureAreaRows` · 옛 B06 120ms 디바운스 사라짐 | B06 ▲ 587ms · 길게 500ms+ ×4 | dd8066275 · 38aae89b2 (통합) | +| S2 | `A00_Common/design/design_view_cross.ts:493-497` (`host.onShow`) | 횡단 보기 보일 때마다 구조물 다시 읽기 · 상세 다시 받기 · `reconcileStaleDesigns` 전 측점 재계산 · 카드 전부 다시 — 바뀐 것 없어도 | B05→B06 1,231ms 한 덩어리 · pipe-points 96KB 매번 | 473d959d6 (통합) | +| S3 | `B05_Profile/B05_Profile_UI_Viewer.ts:357-376` (`animate`) | 3D 가 쉬는 중에도 매 프레임 `renderer.render` — 메인 스레드 ≈50% 상시 점유 → 모든 B05 조작이 그 위에 얹힘 | 쉼 3초 CPU 1.5초 · clear 230/초 | 통합 전부터(90a2cb9a1 은 숨길 때만 멈춤) | +| S4 | `A00_Common/design/design_view_cross.ts:140-143` (`pipeReloadTimer`) → `B05_Profile/B05_Profile_UI_Drainage_Panel.ts:551-553` · `:402-407` · B05 쪽 `:612-613` | 관 옵션 하나 바꿀 때마다 서버 `detail-basins` 왕복(96KB 받음) → 배수유역 목록 다시 그림 → 관 변경 알림 다시 퍼뜨림 — 5장 「조작 중 네트워크 왕복 금지」 어긋남 | 관경 바꿈 POST 163~478ms · B06 DOM 717 | B05 쪽 통합 전부터 · B06 쪽 473d959d6 | +| S5 | `B06_Section/B06_Section_UI_Page_Pipe_Options.ts:144-148` | 관 옵션 바꿀 때 덮는 범위 측점마다 `refreshCard` → 측점마다 공용 종단도 전체 `draw()` — 9-12 에 고친 꼴(측점 수만큼 다시 그림)이 다시 생김 | 코드 읽기 · 관경 바꿈 긴 작업 109ms | 통합 때 커짐(무거운 공용 종단도로 바뀜) | +| S6 | `B05_Profile/B05_Profile_UI_Structures_Panel.ts:393-400` (`liveCommit`) → `B05_Profile_UI_Structures_Panel_Commit.ts:216-219` · `B06_Section/B06_Section_UI_Page_Structures_Panel.ts:167-172` · `A00_Common/design/design_structure_form.ts:158-159` · `:214-234` · B06 쪽 `design_view_cross.ts:207-224` · `:447-462` | 고르기 · 칸 하나 · 알약 끌기마다 좌측 목록 통째 + 명세 폼 다시 만들기 · B06 은 목록을 두 번 다시 그리고 카드 전체 · 공용 종단도까지 | 고름 B05 95~114 · B06 247~286 노드 · 알약 끌기 160~240ms | 통합 · 52장 폼으로 무거워짐 | + +덧(조작 아님): B05 진입 등고선 geojson 36.7MB · 진입 때 `structures/migrate` 쓰기 · 유토 배분 `haul-plan` 은 조작마다 22KB 올림이나 사용자 확정 설계(서버 Node · 400ms 잠잠 · 최신만) + +## ④ 보안 (흠 11) + +인증 · 권한 공통: 모든 B04/B05/B06 라우터가 `protected_with_company`(`main.py:613-637`) → 세션 + 회사 + 프로젝트가 같은 회사인지(`common_util/common_util_auth.py:105` · `:179` · `:187`) · `project_id` UUID 형 · `route_id` 는 프로젝트와 대조 · 조작 중 자동저장 PUT 없음 + +| # | 무게 | 자리 | 흠 | +|---|---|---|---| +| H1 | **치명** | `B05_Profile/B05_Profile_Structures_Schema.py:175` · `B05_Profile/B05_Profile_Structures_Repository.py:123` · `M02_MasterTemplete/M02_Item_Snapshot.py:67-69` · `:155-165` · `:212-223` | 구조물 저장 때 `structure_id` 아무 글자 그대로 저장 → 저장 뒤 `safe_sync` 가 `base / structure_id` 폴더를 `shutil.rmtree` · 그 자리에 씀 → `"../../.."` · 절대경로로 서버 디스크 폴더 지우기 가능(회사 사용자 누구나) · 안전 이름 `FOLDER_PATTERN`(`:53`) 이 있는데 여기선 안 씀 (코드로 확인함) | +| H2 | 높음 | `B05_Profile/B05_Profile_Schema.py:66-67` · `:272` → `B05_Profile/B05_Profile_Engine_Solver.py:49-155` · `common_util/common_util_surface_sampler.py:134` · `B05_Profile/B05_Profile_Engine_Skeleton.py:284` | `filter_key` · `method` 자유 글자가 파일 이름에 들어감 → 경로 넘기(다른 프로젝트 지형 읽기 · 캐시 파일 쓰기) · confirm 은 값을 저장까지 | +| H3 | 중간 | `B05_Profile/B05_Profile_Structures_Repository.py:200-202` · `common_util/common_util_drainage_pipes.py:345-361` | **52장 명세 칸 서버 검사 없음** — 정의에 없는 키(동적 `{머리}_{n}_{항목}` 포함)는 `continue` 로 통과 · 관 `options` 그대로 저장 · 명세 규칙은 브라우저(`A00_Common/design/design_structure_spec.ts`)에만 · 파이썬 짝 없음 · 자유 글자 길이 제한 없음 | +| H4 | 중간 | `A00_Common/design/design_structure_ford_calc.ts:10` | 세월교 폭→최소 높이 규칙이 브라우저에만 · 서버는 받은 `ford_height_m` 그대로 — 5장 ⛔(브라우저만 계산) | +| H5 | 중간 | `B05_Profile/B05_Profile_Router_Corridor.py:131-160` · 호출 `B05_Profile_UI_Corridor.ts:208` · `:228` | 코리도 PUT 이 브라우저가 만든 기하 · hash 를 검사 없이 저장 · 첫 빌드 때 자동 PUT — 5장 ⛔ · 서버가 만들 수 있음(`B05_Profile_Corridor_Prebuild.py`) | +| H6 | 중간 | `B06_Section/B06_Section_Schema.py:198` · `B06_Section/B06_Section_Router_Confirm.py:124-169` | B06 저장 · 확정이 브라우저 `mass_haul` · 면적 · 관 길이를 먼저 적고 서버 재계산이 덮음 — 재계산 실패하면 로그만 · 브라우저 값 남음 · `standard_cross_section` 검사 없는 dict | +| H7 | 낮음 | `B06_Section/B06_Section_Schema.py:174-177` (대 `:44-47`) | `CrossSectionPatch` 의 `ground_type` 등 자유 글자 · 사전 키 · 목록 길이 제한 없음 | +| H8 | 낮음 | `B06_Section/B06_Section_Router.py:599` | 안 쓰는 `POST cross-design` 이 DB 에 바로 씀(저장 밖 쓰기 길) | +| H9 | 낮음 | `design_view_profile.ts:503` · `:459` · `B05_Profile_UI_Corridor.ts:208` | [저장] 밖 쓰기 — 등고선 간격 PUT · 진입 때 structures/migrate · 코리도 첫 PUT — 5장 어긋남 | +| H10 | 낮음 | `B06_Section_Router.py:431` · replan · cross-preview | `cross_half_width_m` 상한 없음 · `vertices` 길이 제한 없음 · 코리도 크기 검사가 전체 파싱 뒤 | +| H11 | 낮음 | `station_offsets` · `curve_radii` · 관 `chainage_m` · `B05_Profile_Repository.py:256` | NaN/Infinity 통과 · 관 측점이 노선 길이 검사 없음 · `surface_model_id` 조회에 프로젝트 조건 없음(좌표계 코드만 샘) | + +- 참고: 프로젝트 권한이 회사 단위뿐(멤버 · 읽기 전용 역할 없음) — 정책 결정 사항 +- 서버 정본 재계산: 계획선 저장(`B05_Profile_Router.py:387-402`) · B06 저장(`recompute_server_side`) 맞음 · 구조물은 등록부 대조만(재계산 아님) + +## ⑤ 고칠 갈래와 차례 (8 · 작은 것부터) + +| 차례 | 갈래 | 크기 | 예상 효과 | +|---|---|---|---| +| 1 | H1 — `structure_id` 를 `FOLDER_PATTERN` 으로 스키마 검사 + `sync_snapshots` 에서 한 번 더 | 몇 줄 | 서버 폴더 지우기 막음(최우선) | +| 2 | H2 — `filter_key` · `method` 를 Literal 화이트리스트 | 몇 줄 | 경로 넘기 막음 | +| 3 | S1 — 횡단 쪽 재계산 120ms 디바운스 되살림 · `onCrossDesignsUpdated` 받는 쪽에서 종단도 두 번째 그리기 뺌 · 숨은 보기 건너뜀 | 작음 | B06 ▲ 587ms → 9-12 수준(최장 ≈200ms · 길게 누적 ≈0.5초) | +| 4 | S5 · S4 — 관 옵션 측점 루프를 `refreshCards` 한 번으로 · `detail-basins` 서버 왕복을 [저장] 때로(조작 중은 로컬) | 작음~중간 | 관 옵션 조작 왕복 0 · 다시 그림 1회 | +| 5 | S2 — 횡단 보기 다시 보일 때 가게 판번호가 같으면 다시 읽기 · 전 측점 재계산 건너뜀 | 중간 | 보기 넘김 1.2~1.7초 → 바뀐 것만 | +| 6 | S3 — 3D 그리기를 「바뀔 때만」(카메라 움직임 · 장면 변경 때 render 요청) | 중간 | 쉬는 중 메인 스레드 ≈50% → ≈0 · B05 조작 전반 체감 | +| 7 | S6 — 고름 · 칸 바꿈 때 좌측 목록 통째 대신 바뀐 줄만 · 폼 다시 만들기 줄임 · B06 목록 두 번 그리기 없앰 | 중간 | 고름 B06 120ms → B05 수준 이하 | +| 8 | H3~H11 — 52장 명세 서버 clean(파이썬 짝 + 거울 시험) · 세월교 높이 서버 검산 · 코리도 서버 생성 · B06 재계산 실패 시 거절 · 안 쓰는 POST 삭제 · [저장] 밖 쓰기 정리 · 상한 · NaN 막기 | 큼 | 5장 「서버 정본」 · 입력 검사 채움 | + +## 남은 확인 + +- B06 보기 돌쌓기 높이 칸 바꿈 반영 0 (캐시 · 화면 모두) — 별도 흠 의심 +- B05 배관 관경 바꿈 뒤 고름이 풀린 일 1회(재현 불확실) +- 통합 전 판 실행 대조가 필요하면 브레인 결정(워크트리 필요) +- ORCA 내장 탭 10초 강제 내림 — 다른 창 탭 정리 또는 탭 보이게 두면 풀릴 수 있음 From cbad89d96c747775a68690b2500841c04899d6b1 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 6 Oct 2026 17:00:53 +0900 Subject: [PATCH 2/2] =?UTF-8?q?chore(sync):=20=EA=B3=B5=EC=9C=A0=20docs=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EB=8B=B4=EC=9D=8C=20=E2=80=94=20=ED=95=A9?= =?UTF-8?q?=EB=A5=98=EC=A0=90=EA=B3=BC=20=EB=A7=9E=EC=B6=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../09_사면안정_흙막이_옹벽_소단.md | 22 ++ docs/raw/사용자요구/2026-10-05_수정요구.md | 143 +++++++++++ docs/raw/조사/2026-10-06_54-16_자료_한곳.md | 91 +++++++ docs/raw/조사/2026-10-06_54-21_일원화_제안.md | 224 ++++++++++++++++++ .../조사/2026-10-06_54-33_횡단카드_종단창.md | 72 ++++++ docs/raw/조사/2026-10-06_54-44_새프로젝트.md | 19 ++ docs/raw/조사/2026-10-06_54-45_횡단_제약표.md | 55 +++++ 7 files changed, 626 insertions(+) create mode 100644 docs/raw/구조물정의_표/09_사면안정_흙막이_옹벽_소단.md create mode 100644 docs/raw/조사/2026-10-06_54-16_자료_한곳.md create mode 100644 docs/raw/조사/2026-10-06_54-21_일원화_제안.md create mode 100644 docs/raw/조사/2026-10-06_54-33_횡단카드_종단창.md create mode 100644 docs/raw/조사/2026-10-06_54-44_새프로젝트.md create mode 100644 docs/raw/조사/2026-10-06_54-45_횡단_제약표.md diff --git a/docs/raw/구조물정의_표/09_사면안정_흙막이_옹벽_소단.md b/docs/raw/구조물정의_표/09_사면안정_흙막이_옹벽_소단.md new file mode 100644 index 000000000..e69aa254b --- /dev/null +++ b/docs/raw/구조물정의_표/09_사면안정_흙막이_옹벽_소단.md @@ -0,0 +1,22 @@ +# 구조물 표 09 — 사면안정 › 흙막이 · 옹벽 · 소단 (사용자 10-6 · 원문 그대로) + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 + (필수)컨테이너 제목 : 흙막이 +사면안정 흙막이 측점 No, + 측점거리 형태 돌 쌓기(찰), 돌 쌓기(메), 콘크리트, 돌망태, 통나무/목재틀, 바자 + 길이 수기입력 + 높이 수기입력 및 횡단도에서 제어 + 기준측점 전 수기입력(길이 + 기준측점 전/후에 따라 연동 계산) + 기준측점 후 수기입력(길이 + 기준측점 전/후에 따라 연동 계산) + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 + (필수)컨테이너 제목 : 옹벽 +사면안정 옹벽 측점 No, + 측점거리 형태 콘크리트 + 길이 수기입력 + 높이 수기입력 및 횡단도에서 제어 + 기준측점 전 수기입력(길이 + 기준측점 전/후에 따라 연동 계산) + 기준측점 후 수기입력(길이 + 기준측점 전/후에 따라 연동 계산) + +구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 + (필수)컨테이너 제목 : 상세 내용 +사면안정 소단 측점 No, + 측점거리 소단 폭 수기입력 + 소단 높이 수기입력 diff --git a/docs/raw/사용자요구/2026-10-05_수정요구.md b/docs/raw/사용자요구/2026-10-05_수정요구.md index 32518256a..717487d47 100644 --- a/docs/raw/사용자요구/2026-10-05_수정요구.md +++ b/docs/raw/사용자요구/2026-10-05_수정요구.md @@ -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 수량산출 페이지에 대해 분리하여 워크트리를 나눠서 너가 지시했으면 해. 이 방식은 한시적으로만 운영할 생각임. diff --git a/docs/raw/조사/2026-10-06_54-16_자료_한곳.md b/docs/raw/조사/2026-10-06_54-16_자료_한곳.md new file mode 100644 index 000000000..8a1e5415e --- /dev/null +++ b/docs/raw/조사/2026-10-06_54-16_자료_한곳.md @@ -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 서버 재조회는 초안 없을 때만 | 큼 | 두 벌 전반 | diff --git a/docs/raw/조사/2026-10-06_54-21_일원화_제안.md b/docs/raw/조사/2026-10-06_54-21_일원화_제안.md new file mode 100644 index 000000000..461dc81fc --- /dev/null +++ b/docs/raw/조사/2026-10-06_54-21_일원화_제안.md @@ -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//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. 구조물 메모 — 남김 / 지움 diff --git a/docs/raw/조사/2026-10-06_54-33_횡단카드_종단창.md b/docs/raw/조사/2026-10-06_54-33_횡단카드_종단창.md new file mode 100644 index 000000000..c89449c09 --- /dev/null +++ b/docs/raw/조사/2026-10-06_54-33_횡단카드_종단창.md @@ -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 에서 팝업 되는지 먼저 확인. diff --git a/docs/raw/조사/2026-10-06_54-44_새프로젝트.md b/docs/raw/조사/2026-10-06_54-44_새프로젝트.md new file mode 100644 index 000000000..e85985674 --- /dev/null +++ b/docs/raw/조사/2026-10-06_54-44_새프로젝트.md @@ -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"} | diff --git a/docs/raw/조사/2026-10-06_54-45_횡단_제약표.md b/docs/raw/조사/2026-10-06_54-45_횡단_제약표.md new file mode 100644 index 000000000..cad588697 --- /dev/null +++ b/docs/raw/조사/2026-10-06_54-45_횡단_제약표.md @@ -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)