diff --git a/docs/raw/요구_1010_2/사용자요구_1010_2.md b/docs/raw/요구_1010_2/사용자요구_1010_2.md index c3d325c81..26ce29d52 100644 --- a/docs/raw/요구_1010_2/사용자요구_1010_2.md +++ b/docs/raw/요구_1010_2/사용자요구_1010_2.md @@ -129,3 +129,6 @@ 103. 노면공 범위 관련은 1번 방향이 더 좋을것같아. 대신 하이라이트는 여러군데 연동되어 있어 좀더 폭넓게 조사해보고 작동해줘. 104. 3D의 측점의 노선을 선택할때 하이라이트되는데 이게 바로 꺼지는 상황이야. 일단 하이라이트가 계속 문제되는데 전체적인 조사가 필요해. 일단 조사부터 해줘. (조사) 105. 추가로 하이라이트에서 소수점 단위 구조물 측점들의 경우 1단위로 사사오입하여 측점을 지정하게 반영했던걸로 기억하는데 언제 했고 어떤식으로 했는지 알아보고 어떻게 개선할지 조사만 해봐. (조사) +106. (105번 보충) 일반측점이 있고 소수점 단위로 근처의 측점이 있다면 입력되는 기준의 측점을 값을 정수단위로 맞춰야하는게 아니냐는 거야. 선택이 안되는게 문제가 아니라 사용자가 소수점을 못넣게 하고 넣더라도 정수로 변경하여 맞출수 있는 기능이 필요하지 않을까해서 조사를 시킨거야. 조사만 해. +107. (질문) 노면공이 아닌데 범위값을 지정하는 구조물이 뭐가 있는거야? — 답: B 측구 · 산마루측구 · 소단측구 · 도수로·산비탈수로 · 절토사면 배수로 · 맹암거 / C 옹벽 · 돌쌓기(찰 · 메) · 흙막이 · 큰돌쌓기 · 소단 / E 대피소 · 정차·작업장 · 가드레일 / F 비탈면 녹화 +108. 셋다 너의 제안대로 해주고(104 구멍 둘 먼저 · 고름 한 칸 원천으로 단계별 묶음 · 구조물 기준 측점 정수 맞춤) 노면공은 아닌데 범위를 갖는 구조물은 예전의 자료인것같은데 지금 구현하는 구성을 다시 확인해봐. diff --git a/docs/raw/요구_1010_2/조사_AF_강조체계.md b/docs/raw/요구_1010_2/조사_AF_강조체계.md new file mode 100644 index 000000000..f4b602a42 --- /dev/null +++ b/docs/raw/요구_1010_2/조사_AF_강조체계.md @@ -0,0 +1,166 @@ +# 조사 AF — 강조(하이라이트) 체계 전수 · 3D 측점 띠 바로 꺼짐 (요구 104 · 105) + +기준 = HEAD `a22deacf6`(231-1 · 231-2 · 230-2 합친 뒤) · 코드 · 자료 · git 안 바꿈 · 재현은 시스템 임시 폴더 스크래치. +약칭 — DSel `A00_Common/design/design_selection.ts` · DVP `…/design_view_profile.ts` · DVC `…/design_view_cross.ts` · DP `…/design_profile.ts` · MK3 `B05_Profile/B05_Profile_UI_Markers.ts` · MI `…_Viewer_Marker_Input.ts` · SPK `…_Viewer_Structure_Pick.ts` · PKS `…_Structure_Pick_Session.ts` · SY `…_Selection.ts` · R `…_Profile_Render.ts` · SP5 `…_Structures_Panel.ts` · CM `…_Structures_Panel_Commit.ts` · LI `…_Structures_List.ts` · DrP `…_Drainage_Panel.ts` · DrPi `…_Drainage_Pipes.ts` · SV `B06_Section/B06_Section_UI_Section_View.ts` · SVP `…_Section_View_Profile.ts` · CV `…_Cross_View.ts` · SP6 `…_Page_Structures_Panel.ts` · DET `…_Cross_Detail.ts` · DTS `…_Cross_Detail_Select.ts` · NC `…_Cross_Notice_Chips.ts` + +## 1. 한눈 결론 + +- 104 까닭 확정 — 3D 띠를 누르면 **누를 때 켜고(마커 듣개) 뗄 때 끔(3D 부재 고름 듣개)**. 부재 고름은 띠를 못 보고 「빈 곳 누름」으로 읽어 고름 전체를 지움(세션 · 띠 · 핀 · 종단 선). 09-04(2878ab961)부터 있던 구멍 · 오늘 띠 누름이 폼 · 세션까지 움직이게 되어(188-1 · 216-1) 눈에 띔. +- 스크래치 재현 — 진짜 코드로 누름 뒤 빨강 · 핀 · 세션 {at:120} → 뗌 뒤 노랑 · 핀 끔 · 세션 비움(코리도 있든 없든 같음). 「누름이 띠에 맞으면 부재 고름 건너뜀」 흉내로 뗌 뒤에도 유지. +- 강조 자리 = 화면 7곳 · 25개 남짓 · 상태 변수 15개 넘게 · 공유는 세션 한 칸(`structure-pick`)뿐. 알림 장치(`subscribeSelection`)는 있으나 **듣는 곳 0** — 화면끼리 손으로 서로 부르는 사슬. +- 되풀이 까닭 — 원천 여럿 · 같은 누름을 듣개 둘이 받음 · 재진입 가드가 뒤 고름을 버림 · 「해제」 뜻이 화면마다 다름 · 다시 계산이 강조를 버림 · 찾는 거리 제각각. +- 추천 — (가) 104 구멍 두 줄 먼저(작음) → (나) 「세션 한 칸 = 유일 원천 · 화면은 구독해 파생」으로 단계별 묶음(해제 규칙은 사용자 협의 뒤). + +## 2. 강조 지도 + +| 자리 | 켬 | 끔 · 리셋 | 상태 | 듣는 것 · 다시 그림 때 | +| --- | --- | --- | --- | --- | +| 3D 측점 띠(빨강) + 핀 | MK3:493 `selectStation` ← MI:124 누름 · DVP:143 · :149 · :229 · :332 | 같은 함수 null ← PKS:63 → SY:112 · DVP:332 · :568 | MK3:121 `selectedStationId` | 다시 그림(MK3:403)은 유지(:437) · 숨은 핀은 마지막 자리에 남음(:487-491) | +| 3D 구조물 부재(자체발광) | SPK:134 누름 · :153 `selectAtChainage` · :160 `select` | SPK:134 빈 곳 = null · `selectAtChainage(null)` | SPK:53 `selected` | 코리도 새로 만듦 → reapply(`B05_Profile_UI_Viewer.ts:166`) 유지 | +| 종단 측점 세로선 · 표 값 칸 · 유토곡선 선 | DP:243 `selectStation`(토글 · 바깥 알림 :248 는 이것만) · :519 `setSelectedStation` · :569 `setSelectedStructure` | R:223 빈 곳 · R:457 · DP:610 · `setSelectedStructure(null)`(keepStation 거짓이면 끔 · B06 만 참 SVP:268 · 177-3) | DP:211 | 매 그림 다시 칠함(R:130 · :267) | +| 종단 구조물 알약 · 구간 띠 | R:326-332 누름 · DP:246 · :522 · :570 짝 | 다시 누름 · R:226 · DP:562-564 목록에 없으면 조용히 버림 | DP:218 | 관 알약 id = `pipe-`+toFixed(2)(`B05_Profile_UI_Page_Structures.ts:207`) → 관이 움직이면 끊김 | +| 배수유역도 유역 채움 · 유역 목록 줄 | DrP:323 `selectBasin` | **DrP:364 재계산마다 끔** | DrP:128 | 지도 그림 rAF(DrP:305) | +| 배수유역도 관 마커 | DrPi:178 ← DrP:642 | **DrPi:172 `setPipes` 재계산마다 null** | DrPi:70 | 폼 · 목록 · 종단은 관을 계속 고름 → 지도만 꺼짐 | +| 배수유역도 측점 마름모 | DrP:598 `markStation`(SY:73 만) | 같은 함수 null | DrP:130 | 지도 · 유역에서 고를 땐 안 옮김(SY:98-125) | +| 좌측 목록 줄 | LI:223(구조물) · LI:231-233(관 · **폭 0.05 m**) | `renderList` 마다 다시 셈 | SP5:177 · :179 · :183 | 관 0.51 m 안 옮김에 `selectedPipeChainage` 안 고침(SP5:590-600) → 줄 강조 빠짐 | +| 좌측 폼 | CM:94 `loadForm`(늘 onSelect) · CM:163 `loadPipeForm` | SP5:374 `resetForm` · EV `startNew`(+세션 비움) | 위와 같음 | `setStructures`(SP5:556 · 저장 · 새로 읽기 뒤)가 관 폼 닫고 onSelect(null) → 종단 선 · 알약 끔(DVP:349) | +| B06 카드 고름 테두리 | SV:293 `selectStation` · SV:587 `focusStation` | SV:295 다시 누름 · :322 `clearSelection` · :598 `revealStation`(알림 없이) | SV:102 | 다시 그림이 다시 얹음(SV:350) | +| B06 `--span` 범위 테두리 · 포장층 | SV:607 `selectMark` → :256 `applySpan` | `selectMark(null)` · span 거짓(SV:609) | SV:245 `spanMarkId` | 다시 얹음(SV:374) · **카드 해제 DVC:388 · `releaseCross` DVC:498 이 `selectMark(null)` 안 부름 → 남을 수 있음** | +| B06 면적 띠 | CV:286 · SV:309 | SV:298 · CV:221 | SV:104 · CV:192 | 고른 카드에서만 다시 얹음 | +| B06 벽 · 집수정 · 관 · 도수로 형상 · 세월교 · BOX 몸체 | CV:232 · `…_View_Box.ts:52` | 같은 토글 · CV:262 · DVC:498 | `…_Page_Station_Controls.ts:272` · `…_Ford_Controls.ts:227` · :428 | 다시 얹음 | +| B06 계획선 조각(보라) | CV:308 → `…_Design_Pick.ts:523` | CV:205 | `…_Design_Pick.ts:278` | 고른 카드 · 다른 고름 없을 때만 다시 얹음(CV:325) | +| B06 좌측 조정 묶음 | `…_Adjust_Dock.ts:162` | :114 | DOM | 카드 다시 그릴 때마다 다시 붙고 좌측을 스크롤(:184) | +| 횡단 → 종단 선 · 알약 | SVP:270 `showCard` · SVP:266 | `showCard(null)` | DP 상태 공유 | — | +| [상세] 모달 칸 · 그림 | DET:304 | 다시 누름 · 키 없어짐 DET:297 | DET:293 | paint 마다 다시 얹음(DET:337) | +| [상세] 모달 선 조각 | DTS:193 | **DTS:212 다시 칠할 때마다 지움**(창 크기 · 카드 다시 세움 DET:316 · :412) | DTS:167 | 「바로 꺼짐」 또 한 자리 | +| 알림 칩 측점 단추(207) | NC:65(SV 카드 고름 읽음) | 고르면 목록 닫음 NC:88 | NC:47 | 구독 없음 → 열린 동안 고름이 바뀌면 낡음 | + +## 3. 고름 원천 · 차례 + +원천 여덟 무리(공유는 ①뿐): +① 세션 한 칸 `structure-pick` {at · sid · key} — DSel:150 `selectDesign`. 쓰는 곳 B05: DVP:118 `rememberPick`(알약 :182 · 측점 :244 · 관 목록 :322 · 구조물 목록 :345) · PKS:62 · :68(3D) · EV `startNew` / B06: DVC:372(부재) · :390(카드 해제) · :398(카드) · :515(`releaseCross`) · SP6:207 · :233(231-2 목록 고름 늘) · :319(관). 읽는 곳: DVP:135 · PKS:34(되살림 DVP:252 · :560) · DVC:466 · :569 · SP6:197 · :409. +② 3D 띠 MK3:121 ③ 3D 부재 SPK:53 ④ 종단 DP:211 · :218 ⑤ 좌측 폼 SP5:177-183 ⑥ 배수유역도 DrP:128 · :130 · DrPi:70 ⑦ B06 SV:102 · :104 · :245 + 형상 · 계획선 · `preferredId` · `openingAtStation`(SP6) ⑧ 모달 · 칩. + +누가 이기나: +- B05 안 = 손 사슬 + 재진입 가드 `selectionSyncing`(DVP:216). 가드가 켜진 동안 들어온 고름은 **통째로 버려짐**(SY:79 · :99 · DVP:323 · :346) → 188-1 이 끝에 `remember`(SY:96)로 덮어 「마지막 하나」를 맞춤. +- 세션 = 한 누름 안에서도 여러 번 적힘 — 측점선 누름 → 폼 콜백이 구조물 id 적음 → 끝에 측점으로 덮음. 마지막 `selectDesign` 이 이김. +- B05 ↔ B06 = 숨은 보기는 세션만 남기고 보일 때 다시 풂(DVP:558 `syncPick` · DVC:564 onShow → SP6 `load()` → `restoreStructurePick`). 다시 풀 때 거름(노면공 `coverable`)이 길마다 따로 넘겨져 한 곳 빠지면 다른 것이 열림(조사 AD · 231). +- 덮어쓰는 길 — (a) 3D 빈 곳 누름 PKS:62 세션 비움 = 104 (b) 새로 놓기 (c) 카드 해제 · `releaseCross` (d) `setStructures` 가 관 폼 닫음 (e) 배수 재계산이 지도 강조 끔. + +## 4. 104번 까닭 · 재현 + +차례(3D 띠 하나 누름): +1. 누름 — MI:105 `handlePointerDown` → :124 `markers.selectObject(hit)` → MK3:523 → :493 띠 빨강 · 핀 · :502 알림 → DVP:380 → 종단 선 + SY:78 → 폼 열기(`openAtStation`) · 세션 {at}. MI:125 는 `stopPropagation` — 같은 캔버스의 다른 듣개는 그대로 돎. +2. 같은 누름을 SPK:121 `handleDown` 도 받아 적음 — `blocked()`(MI:184)는 「점 끌기 · 이동 대기」만이라 띠 누름은 안 막힘. +3. 뗌 — SPK:128 `handleUp` → :98 `pickAt` 은 **코리도 무리만** 봄(띠는 마커 무리) → 띠 뒤 리본 · 지형이거나 코리도가 없으면 null → :136 `onPick(null)` → PKS:61-64 세션 비움 + `selectStationOfPipe(null)` → SY:112 띠 노랑 · 핀 끔 → DVP:381 종단 선 끔 · 좌측 `selectPipeByChainage(null)`. +4. 결과 — 누름~뗌 사이(0.1초 안팎)만 빨강. 1에서 연 구조물 폼은 남을 수 있음(관 폼만 닫음 SP5:603-609) · 세션이 비어 B06 로 가면 카드 없음 · `--span` 은 남을 수 있음(2장). + +갈래: +- 관 측점 띠 = 뗌이 띠 뒤 관 부재를 집으면 관 측점으로 다시 켜짐(SY:109) · 리본에 맞으면 꺼짐. +- 벽 등 구조물 위 일반 측점 = 부재 강조만 남고 띠는 꺼짐(`selectStationOfPipe` 는 관 측점만 찾음 SY:103-108). +- 언제부터 — 2878ab961(09-04 3D 부재 고름)의 「null → `selectStation(null)`」. 08-05 규칙 「3D 빈 곳 누름은 측점 고름을 안 풂」(MK3:526-529)과 정면으로 어긋남. + +스크래치 재현(진짜 MK3 · MI · SPK · SY · PKS · DSel + three 0.185 · 가짜 캔버스 · 저장소 밖): + +| 경우 | 누름 뒤 | 뗌 뒤 | +| --- | --- | --- | +| 코리도 있음(리본) | 띠 #ef4444 · 핀 보임 · 세션 {at:120} | 띠 #facc15 · 핀 끔 · 세션 null | +| 코리도 없음 | 같음 | 같음 | +| 흉내 고침(누름이 마커 · 띠에 맞으면 부재 고름 건너뜀) | 같음 | 빨강 · 핀 · 세션 그대로 | + +시험 빈칸 — MI · SPK 를 한 누름으로 함께 도는 시험 없음(test_231_1 은 `onPick` 을 바로 부름) → 104 를 못 잡음. 위 스크래치 꼴이 고칠 때 시험 바탕. +곁 구멍 — three 레이캐스트는 `visible` 을 안 봄(three.cjs `intersect`) → 숨은 핀(마지막 고른 자리에 남음) · 꺼 둔 측점선 · 라벨이 누름을 가로챔(MI:89 첫 맞음). 띠 가운데를 누르면 숨은 핀에 먼저 맞아 띠가 안 켜짐(스크래치에서 실제 겪음). + +## 5. 되풀이 구조 원인 + +1. 원천이 여럿 — 공유 세션 하나 + 화면마다 자기 변수. 세션은 「넘김용」이고 화면 안 강조는 자기 변수가 진짜라 둘이 어긋남(104 = 변수 켬 → 세션 지움 → 변수 끔). +2. 알림 장치 놀고 있음 — `subscribeSelection`(DSel:135) 듣는 곳 0 · DVP 한 파일에 고름 길 일곱(측점선 :148 · 지도 :176-177 · 알약 :180 · 관 목록 :321 · 구조물 목록 :342 · 3D 띠 :380 · 3D 부재 PKS:60)이 저마다 다른 화면을 다른 차례로 부름 → 길마다 빠지는 화면이 다름(지도 마름모 · 관 → 구조물 때 지도 강조 남음). +3. 재진입 가드가 「막기」 — 순서 의존 · 뒤 고름 버림 → 덮어쓰기 덧댐(188-1). +4. 같은 누름을 듣개 둘이 받음 — 3D(마커 · 부재) · 종단(측점선 · 도구 R:207-221) · B06(카드 · 형상 SV:426 캡처). 서로 다른 결론을 차례로 적음. +5. 「해제」 뜻이 제각각 — 3D 빈 곳(08-05 안 풂 ↔ 09-04 풂) · 종단 빈 곳 풂 · 카드 다시 누름 풂 · 보기 오감 `releaseCross` 풂. 어디까지 푸는지(세션 · 폼 · span)도 다름. +6. 다시 계산이 상태를 버림 — 배수 재계산(DrP:364 · DrPi:172) · [상세] 조각(DTS:212) · `setStructures`. 반대로 B06 카드는 다시 그림이 다시 얹음 → 화면마다 규칙이 다름. +7. 찾는 거리 · 키 제각각 — 0.51(DSel) · 0.05(LI:232) · 0.01(SPK:75) · 0.006(213) · 관 알약 id toFixed(2) → 관이 조금만 움직여도 강조가 안 이어짐(7장과 같은 뿌리). +8. 거름(노면공)을 부르는 쪽마다 넘겨야 함 → 한 곳 빠지면 샘(AD · 231-1 이 다섯 곳에 덧댐). + +## 6. 고칠 방향 비교 · 추천 + +(가) 구멍만 막기 — 각 1~5줄 · 위험 낮음 · 고친 곳마다 시험 하나 +- a1(104) SPK 가 마커 · 띠에 맞은 누름을 건너뜀(`B05_Profile_UI_Viewer.ts:261` `blocked` 에 「누름이 마커에 맞음」 · MI 에 값 하나) + `onPick(null)` 은 3D 부재 강조만 풀고 세션 · 측점 고름은 안 지움(PKS:61-64 · 08-05 규칙). +- a2 숨은 핀 · 꺼진 측점선을 레이캐스트에서 뺌(MI:89 · `visible` 거름). +- a3 배수 재계산 뒤 고른 관 · 유역 다시 얹음(DrP:364). +- a4 카드 해제 · `releaseCross` 에 `selectMark(null)`(DVC:388 · :498). +- a5 목록 관 줄 폭 0.05 → `PIPE_MATCH_M` · 옮김 때 고른 자리 갱신(LI:232 · SP5:590-600). +- a6 지도 · 유역 고름 때도 마름모 옮김(SY:98-125 에 `markStation`). +- 흠 — 오늘만 177-3 · 177-4 · 188 · 189 · 216 · 231 · 104 일곱 번째 덧댐 · 다음 길이 또 샘. + +(나) 원천 하나 + 강조 파생 +- 원천 = DSel 세션 한 칸(이미 있음) + 고름 갈래 칸 하나(측점 · 구조물 · 부재 · 관 — 189 세 갈래를 값으로). +- 쓰기 = 모든 누름은 `selectDesign` 만 · 화면끼리 직접 부르기와 `selectionSyncing` 지움. +- 읽기 = 화면마다 `subscribeSelection` 듣개 하나 → 「값 → 그 화면 강조」 함수 하나(3D 띠 = 측점 id · 종단 = `graphTargetAt` · 폼 = `resolveSelection` + `coversAtStation` · 카드 · span = `applyStructurePick`) · 다시 그림 · 다시 계산 뒤에도 같은 함수로 다시 얹음. +- 해제 규칙 표 하나 · 찾는 거리 한 값(7장). +- 크기 큼(DVP · SY · PKS · DVC · SP6 · SV · DP · CM · DrP 등 10파일 안팎 · 300~500줄) · 위험 중~높음 — 지금 규칙을 박은 시험(165 · 177_3 · 177_4 · 188_1 · 189_1 · 216_1 · 231_1 · selection_single)이 안전망. +- 차례 — ① 값 모양 · 해제 규칙 사용자 협의 ② B05 3D · 종단을 구독으로(104 길 포함) ③ 좌측 폼 ④ B06 카드 · span ⑤ 지도 · 모달 · 칩 ⑥ 직접 부르기 · 가드 지움. 단계마다 위 시험 통과. + +231 겹침 — 231-1(64c9470f9) · 231-2(4db793117) 모두 메인에 합쳐짐. a1 은 231 이 만진 PKS `onPick` 안 null 갈래만 → 충돌 없음 · test_231_1 함께 돌림. 231 의 `coverable` 은 (나) ③ 폼 파생 함수 한 곳으로 들어감. + +추천 — a1 + a2 먼저(104 바로 풂) → (나)는 협의 뒤 단계별 · a3~a6 은 (나) ②~⑤에 흡수(급하면 따로). +⬜ 사용자 협의 — 「3D 빈 곳 누름 = 고름 해제」 여부(08-05 안 풂 ↔ 09-04 풂) · 해제가 어디까지(세션 · 폼 · span)인지. + +## 7. 소수 측점 1단위 반올림 (요구 105) + +언제 · 어떻게 +| 날짜 · 커밋 | 장 | 내용 | +| --- | --- | --- | +| 07-30 12f166650 · 08-02 32fd199db | — | 「같은 자리」 폭 0.51 m — ±0.5 라 사실상 1 m 사사오입 맞춤(고름 · 유역↔관 짝) | +| **08-28 0979927df** | — | **기억하신 그것** — 서버가 관 · 구조물 측점을 `int(round())` 로 같은 정수 m 격자 측점에 붙임(관 80.17 = 카드 80 에 이름표만 · 까닭 = 횡단 파일 이름이 정수 m) | +| 09-29 867c4650c · 08e493f13 | 20장(사용자 확정 9-29) | 붙임 풂 — 카드 80 과 80.17 따로 · 파일 이름 소수 2자리 · 0.005 m 안만 합침(`B05_Profile_Engine_Sections_Core.py:349-353`) · **화면 표기만 정수**(119.8 → 5+20) | +| 09-29 8a9456579 | 24-2d | 0.51 을 `PIPE_MATCH_M`(DSel:17) 한 값으로 — 사본 · 손으로 적은 0.51 은 TS 21곳 남음 | +| 10-10 002165f04 · ca3786115 | 213-1 · 219-1 | 같은 측점 폭 0.006 m(서버 · TS 짝 `B05_Profile_UI_Profile_Alignment.ts:202`) | +| 10-10 42673505e | 231-1 | 넘김 카드 한 곳만 「찾는 거리 안 가장 가까운 카드」(관 80.17 → 카드 80 막음) | + +지금 동작(관 80.17 · 카드 80) +- 고름 풀기 = 0.51 안 관 먼저(DSel:94 · SY:131-142 · SVP:43 · :276-279) → 카드 80 을 눌러도 관 80.17 폼 · 종단 관 선. 「관 먼저」는 9-29 전 「한 카드」 전제. +- 0.51 안 **첫** 항목 — DVC:128-131 `ownerAt` · `B06_Section_UI_Page_Structures_Spec.ts:146-148` · `…_Pipe_Options.ts:68-69` · `B05_Profile_UI_Profile_Structures.ts:121` · `:181` · `B05_Profile_UI_IrregularStations.ts:483-543` → 1 m 안 소수 측점 둘이면 엉뚱한 것을 고름 · 옮김 · 지움(앞 셋은 코드로 읽은 추정). +- 표기 `common_util/common_util_station.ts:24` 반올림 → 80 과 80.17 둘 다 「4+0」 · 119.8 = 「5+20」. +- 바른 본보기 — `B06_Section_UI_Page_Structure_Pick.ts:61`(231-1) · `design_structure_pipe_calc.ts:63-68`. + +흠 — ① 9-29 뒤 0.17 m 떨어진 두 카드를 폭 0.51 이 한 자리로 봄 ② 관 측점 ↔ 일반 측점 혼동 ③ 폭 일곱 갈래(0.005 · 0.006 · 0.01 · 0.02 · 0.05 · 0.1 · 0.51) ④ 다른 두 카드가 같은 글자로 보임. + +지금 자료(검증 프로젝트 13개 · 읽기만) +- 관 136/136 개 모두 소수(자동 배치 3자리 484.213 · 고친 것 2자리) · 20 m 일반 측점 1 m 안 관 = 프로젝트당 0~4개(대부분 11 중 4) · 엄상준_검증 80.17(초기 80.374 · 카드 80 옆) · 263.31(초기 263.206 · 213 · 219 방향키 흠 자취). +- 구조물(structures.json 있는 4개) 1/4 소수(표지 127.86). + +근거(지식DB) +- 별표2(`resources/knowledge/original/법률/산림자원의 조성 및 관리에 관한 법률 시행규칙/별표/별표2_…md` L25) — 20 m 중심말뚝 · 구조물 지점 보조말뚝 · 정밀도 규정 없음. +- 교재 `산림과임업기술(임도)/2. 임도/5. 설계.md` L157 — 「No.11+13」 정수 예 · 소수는 곡선 BC · EC(L184-189)뿐. +- 실무 자료 — 오솔길 PIN 보조측점 449개 · 구조물BOM 42개 · 울진 · 영덕 수량산출 = 구조물 · 횡단 측점 전부 정수 m · 소수는 곡선점 · 운반거리 셈표뿐. +- 품셈 1-2-2(`원가계산/산림_표준품셈/본문/제01장_적용기준/1-02_설계_및_수량.md` L53-60) — 연장 · 관 길이 소수 2자리(측점 규정 아님). +- 관이 꼭 소수 자리여야 할 까닭 — 못 찾음. 계곡 관도 0.5 m 안 옮김은 실무 꼴과 같음. 곡선점은 소수가 맞으나 구조물 기준 측점 아님. + +정수 맞춤 — 넣을 자리(지금은 어디서도 정수로 안 맞춤 · 0.01 이거나 날값) +| 길 | 자리 | 지금 | 맞춤 | +| --- | --- | --- | --- | +| 좌측 폼 시작 · 기준 · 종료 측점 | `B05_Profile_UI_Structures_Fields.ts:142` · `:144`(잔여 칸 step 0.1 · 막지 않음) · `:156-171` 정규화 · `:182-199` 읽기(날값) | 날값 | step 1 · 확정 때 반올림 | +| 구간형 시작 · 끝 | `B05_Profile_UI_Structures_Panel_Commit.ts:307-308`(기준 − 앞 길이 · + 길이 0.1 m) | 소수 | 기준만 맞추면 시작 · 끝 소수 남음 · 측점은 세 곳에 심김(`B05_Profile_Engine_Sections.py:285-311`) | +| 종단 알약 · 측점선 끌기 · 우클릭 추가 | `B05_Profile_UI_Structures_Marks.ts:339` · `B06_Section_UI_Longitudinal.ts:186` · `B05_Profile_UI_Profile_Structures.ts:81` · `B05_Profile_UI_Viewer_Menu.ts:79` | 0.01 | 1 m | +| 방향키 | `B05_Profile_UI_Profile_Panel_Tools.ts:36` · `:237` | 0.1 m | 1 m(219 소속 규칙 그대로) | +| 배수유역도 관 놓기 · 끌기 | `B05_Profile_UI_Drainage_Pipes.ts:236` · `:264-294` | 날값 | 1 m | +| B06 관 옮김 · 폼 | `B06_Section_UI_Page_Structures_Panel.ts:483` · `:265-270`(**0.51 m 넘을 때만 옮김 → 80.17→80 고침은 무시됨**) | 0.01 | 1 m · 폭 거름 손봄 | +| 서버 자동 배치 · 재계산 · 노선 바뀜 재투영 | `common_util/common_util_drainage_detail.py:437-457`(1 m 걸음이나 시작이 소수) · `:476-490`(관 재계산 한 곳 `round(,2)`) · `common_util/common_util_drainage_pipes.py:207-230`(좌표 정본 → 다시 소수) | 소수 | 재계산 한 곳 · 재투영 뒤 반올림 | +| 기존 자료 | pipe_points.json · structures.json | 소수 | [정수 맞춤] 단추 | + +- 받는 곳에서 한 번 — 화면은 `moveById`(SP5:670) · 폼 commit · 관 목록 문(DrPi `moveTo` · `addAtChainage` · `addAt` · 끌기) · B06 `movePipeTo` · `KEY_STEP_M`, 서버는 관 재계산 한 곳 + 재투영 뒤. 서버에서만 자르면 시설 옵션 이어받기 폭 0.05(`common_util_drainage_pipes.py:371`)를 넘어 관 종류 · 옵션이 기본값으로 돌아감 → 화면 입력에서 맞춤이 먼저. +- 다시 쓸 함수 — `design_profile_free.ts:79` `snapStation`(215-1 79 m → 80 m) · `B05_Profile_UI_Profile_Guard.ts:79` `snapToMasterStations` · 서버 격자 합침 `B05_Profile_Engine_Sections_Core.py:347-354`. + +영향 — 관 길이 · 형상은 가까운 측점에 붙어 그대로(`B06_Section_Engine_Culvert.py:639-666`) · 정수 관이 일반 측점 자리면 서버가 이미 한 카드로 합침(Sections_Core:349-353 · 08-28 꼴) · 정수 파일 이름은 옛 규칙과 같아짐(`B05_Profile_Engine_Sections.py:130-134`) · 225 관보호공 0.1 m 이동은 횡단 안 자리라 무관. +기존 자료 정리 함정 — 한꺼번에 옮기면 213 편집 키 「사라진 것 하나 · 새것 하나」 규칙(`B05_Profile_UI_Profile_Alignment.ts:189-199`)이 안 맞아 옛 계획고 편집이 [저장] 때 버려짐 · B08 · M02 `pipe@측점` 키는 [저장]을 거쳐야 이름이 따라감(`M02_Item_Snapshot.py:227`) · 80.17 자리 횡단 설계 · B07 도면 id 는 고아 · 관 id `pipe-`+toFixed(2) 세션 고름 한 번 풀림 → 단추는 하나씩 옮기는 길(213 따라감) + [저장] 거침. +깨질 시험 — test_b05_station_roundtrip(119.8 · 120 따로) · test_b06_patch_station · test_b05_b06_save_roundtrip · test_b05_extra_stations_supplier · test_213_1(263.206). + +방안 +- A 정수 강제 — 입력 · 끌기 · 방향키 · 자동 배치 모두 1 m. 실무 표기와 같음 · 9-29 확정을 뒤집음. 단 81 처럼 격자 옆 1 m 카드는 남음. +- B 일반 측점 붙기(스냅) — 일반 측점 ±폭 안이면 그 측점으로(snapStation 재사용) · 밖이면 정수 m. 「격자 옆 소수 측점 없애기」에 가장 바로. +- C [정수 맞춤] 단추 — 기존 소수 관 · 구조물을 하나씩 옮겨 편집 키가 따라가게 · [저장]으로 마침. +- 공통 — 고름 · 강조는 측점 id(카드 `station_id` · 관 id)로 정확히 잇기 · 같은 측점 폭 상수 하나 · 반올림은 표시에만. + +추천 — A + B + C(입력 1 m 단계 · 일반 측점 붙기 · 기존 자료 단추) · 고름 폭은 한 값으로. 정수 · 붙기면 관 80 = 카드 80 한 자리라 흠 ①②④가 함께 사라짐. 크기 중(화면 받는 곳 6~7곳 각 1~3줄 + 서버 두 곳 + 단추) · 위험 중(213 편집 키 · B08 키 · 깨질 시험 다섯). +⬜ 사용자 확정 — 9-29 「저장값 소수 · 표기만 정수」를 「저장값도 정수 m」로 바꿀지 · 붙기 폭(예 1 m) · 구간형 시작 · 끝도 정수인지. diff --git a/resources/tester/helper_b05_structures_form_summary.cjs b/resources/tester/helper_b05_structures_form_summary.cjs index 09c3e4f7c..1d65a9cc3 100644 --- a/resources/tester/helper_b05_structures_form_summary.cjs +++ b/resources/tester/helper_b05_structures_form_summary.cjs @@ -16,7 +16,11 @@ class FakeNode { this.tagName = tag; this.children = []; this.dataset = {}; - this.style = {}; + this.style = { + setProperty(name, value) { + this[name] = value; + }, + }; this.listeners = {}; this._text = ""; this._classes = new Set(); @@ -66,6 +70,10 @@ class FakeNode { (this.listeners.click || []).forEach((h) => h({ target: this })); } scrollIntoView() {} + // 고르기 칸 보기(syncChoices) — 자식 중 option 만 + get options() { + return this.children.filter((c) => c.tagName === "option"); + } // 시험에 필요한 두 가지 선택자만 — `[data-option-keys]` · `.클래스` querySelectorAll(selector) { const match = selector.startsWith("[") @@ -82,6 +90,9 @@ class FakeNode { } } globalThis.document = { createElement: (tag) => new FakeNode(tag) }; +globalThis.Option = function Option(text, value) { + return Object.assign(new FakeNode("option"), { _text: text, value }); +}; globalThis.Option = function Option(text, value) { const node = new FakeNode("option"); node._text = String(text); @@ -115,6 +126,10 @@ function loadTs(file) { if (STUBS[request]) return STUBS[request]; // 화면 공용 부품(@ui/…) — 이 시험이 안 쓰는 것이라 뭘 불러도 아무 일 안 하는 함수로 막아 둠 if (request.startsWith("@ui/")) return new Proxy({}, { get: () => () => {} }); + // 공용 계산(@util/…) — tsconfig 별칭대로 common_util 폴더에서 읽음 + if (request.startsWith("@util/")) { + return loadTs(path.join(ROOT, "common_util", `${request.slice("@util/".length)}.ts`)); + } if (request.startsWith(".") && request.endsWith(".json")) { return JSON.parse(fs.readFileSync(path.join(path.dirname(full), request), "utf8")); } @@ -297,7 +312,12 @@ const draw = (includeDetail) => { }, { height_m: 2 }, ); - return { keys: optionInputs.map((e) => e.key), hidden: optionRow.hidden }; + return { + keys: optionInputs.map((e) => e.key), + // 그린 칸 — 숨긴 길이(54-26)는 값만 쥐고 칸은 안 그림 + drawn: optionRow.querySelectorAll("[data-option-keys]").map((e) => e.dataset.optionKeys), + hidden: optionRow.hidden, + }; }; out.drawB05 = draw(false); // B05 — 상세 칸 없음 + visible:false 숨김 out.drawB06 = draw(true); // B06 — 상세 칸까지, 단 visible:false 는 여기서도 숨김 diff --git a/resources/tester/test_b05_structures_form_summary.py b/resources/tester/test_b05_structures_form_summary.py index 22ad774a1..3fadfc00f 100644 --- a/resources/tester/test_b05_structures_form_summary.py +++ b/resources/tester/test_b05_structures_form_summary.py @@ -36,11 +36,15 @@ def test_visible_false_만_숨김(out): def test_visible_false_옵션은_폼에_안_그림_정의는_그대로(out): + # 숨긴 길이는 칸을 안 그리고 값만 쥠(54-26 · 범위 계산 · 저장이 옛 값을 이어 씀) · 상세는 B05 에 없음 assert out["drawB05"] == { - "keys": ["height_m"], + "keys": ["height_m", "length_m"], + "drawn": ["height_m"], "hidden": False, - } # 길이 숨김 · 상세는 B05 에 없음 - assert out["drawB06"]["keys"] == ["height_m", "stone_kind"] # B06 은 상세까지 · 숨김은 여기도 + } + # B06 은 상세까지 · 숨김은 여기도 칸 없음 + assert out["drawB06"]["drawn"] == ["height_m", "stone_kind"] + assert out["drawB06"]["keys"] == ["height_m", "stone_kind", "length_m"] assert out["definitionKept"] == ["height_m", "length_m", "stone_kind", "back_len_cm"]