From 9677f722a8effa12ef8bbfbd17b2a675a7060031 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 8 Oct 2026 13:20:50 +0900 Subject: [PATCH] =?UTF-8?q?chore(plan):=2092~97=EC=9E=A5=202=EC=B0=A8=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=20=EC=9B=90=EB=AC=B8=20=C2=B7=20=EC=A1=B0?= =?UTF-8?q?=EC=82=AC=20=EB=8B=A4=EC=84=AF=20=C2=B7=20=EB=B6=84=EC=84=9D=20?= =?UTF-8?q?=EC=A0=95=ED=95=A8(10-8=20=EC=98=A4=ED=9B=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit B01 대시보드 제안 · B07 평면도 묶음 · IP 표 · B08 탭 · 수리 연결 · CAD 입력창. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LLCk2y5xE8YGVgjbTntWsY --- docs/raw/요구_1008_2/IP표_예시.png | Bin 0 -> 12659 bytes docs/raw/요구_1008_2/분석_정함.md | 68 ++++++++++++++++++ docs/raw/요구_1008_2/사용자요구_1008_2.md | 37 ++++++++++ docs/raw/요구_1008_2/조사_I_B01대시보드.md | 58 +++++++++++++++ .../요구_1008_2/조사_J1_B07컨테이너_용지도.md | 49 +++++++++++++ .../raw/요구_1008_2/조사_J2_B07평면도_IP표.md | 48 +++++++++++++ docs/raw/요구_1008_2/조사_K_B08수량산출.md | 57 +++++++++++++++ docs/raw/요구_1008_2/조사_L_CAD커서입력창.md | 34 +++++++++ 8 files changed, 351 insertions(+) create mode 100644 docs/raw/요구_1008_2/IP표_예시.png create mode 100644 docs/raw/요구_1008_2/분석_정함.md create mode 100644 docs/raw/요구_1008_2/사용자요구_1008_2.md create mode 100644 docs/raw/요구_1008_2/조사_I_B01대시보드.md create mode 100644 docs/raw/요구_1008_2/조사_J1_B07컨테이너_용지도.md create mode 100644 docs/raw/요구_1008_2/조사_J2_B07평면도_IP표.md create mode 100644 docs/raw/요구_1008_2/조사_K_B08수량산출.md create mode 100644 docs/raw/요구_1008_2/조사_L_CAD커서입력창.md diff --git a/docs/raw/요구_1008_2/IP표_예시.png b/docs/raw/요구_1008_2/IP표_예시.png new file mode 100644 index 0000000000000000000000000000000000000000..cd85024f23cfb58b3ef16e8e8c878d9fb7fcefdb GIT binary patch literal 12659 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 평면도, 종단면도 > 종단도, 횡단면도 > 횡단도 + - 표준 횡단면도는 횡단면도 컨테이너 내부의 최상위에 1행 구조로 배치 + - 평면도의 IP에는 도면 좌측하단에 IP테이블 들어간 경우에는 테이블로 상세 정보도 표기되어야함. 단축키로 IP, CO의 X와 Y, IA, R, TL, CL, SL 정보임.(첨부 그림 참고) + +B08 수량산출 + - 수리집수면적표의 내용에서 상세페이지는 브라우져 크기에 연동되어야함. (다른 페이지 참조) + - 구조물도 탭은 삭제하고 구조물 집계표의 해당 행을 선택할경우 모달창으로 보여주게 변경. 이때 복수의 표현이 필요한 경우에는 모달창에서 스크롤하여 내려서 보이게 구현. + - 메인 탭과 보조탭의 사이에 수평 구분선은 좋은나 보조탭 항목의 아래와 위 공간이 차이가 있음 위 공간을 아래공간과 동일하게 구현 + - 기존 구조물 집계표 상위에 구조물이라는 탭을 생성하고 구조물 집계표는 보조탭으로 이동 + - 구조물 탭에서 구조물 집계표 외에 총괄자재수량집계표, 콘크리트소요자재집계표,자재수량집계표의 보조탭을 신규로 생성. 내용은 탭생성 후 하나씩 만들생각임. + - 수리집수면적표에 b05에서 배수유역 분석후에 넣을 수 있는 값들이 있음 연결필요. + - 세월교와 박스암거도 동일. + +전역 공통 및 공통 프로그램 + - 오토캐드에서 테마에 따라 마우스 커서를 따라 다니는 입력창의 색상문제로 제대로 안보임 + - 마우스 커서를 따라 다니는 입력창에서 단축키 텍스트가 벗어남 + - 마우스 커서를 따라 다니는 입력창에서 오토캐드 프로그램에서는 스페이스도 엔터키와 동일한 기능 아님? +``` + +첨부 그림(IP표_예시.png) 내용 — 열마다 IP 번호(BP · 1 · 2 …) · 행 = IP · CO(X · Y) · IA(도-분-초) · R · TL · CL · SL · BP 열은 IP · CO 만. + +## 함께 받은 말 + +다른 워크트리가 작업하는 동안 너는 신규 작업에 대한 신규 계획서 검토 진행. diff --git a/docs/raw/요구_1008_2/조사_I_B01대시보드.md b/docs/raw/요구_1008_2/조사_I_B01대시보드.md new file mode 100644 index 000000000..b6fc6b5d8 --- /dev/null +++ b/docs/raw/요구_1008_2/조사_I_B01대시보드.md @@ -0,0 +1,58 @@ +# 조사 I — B01 대시보드 항목별 페이지 나누기 검토 (10-8 오후 · 읽기 전용 조사 원문) + +결정은 `분석_정함.md` 가 앞섬. 한 주소(`#/b01-account`)에 역할별 5~9 컨테이너 · 시스템 관리자 화면 약 3.5~4 화면(추정). 해시 인자 탭(`?tab=`)이 가장 작게 바꾸는 길 · 보강 내용은 대부분 이미 백엔드 응답에 있음. +약어: Page · Projects · Company · Admin · Profile · Resources · TempUpload · Common · Modals · CompanyPick = `B01_Dashboard/B01_Dashboard_UI_<이름>.ts` · Api = `B01_Dashboard_Api_Fetch.ts` · Router · Router_Assets · Repo · Repo_Co = `B01_Dashboard_Router.py` · `_Router_Assets.py` · `_Repository.py` · `_Repository_Company.py` · SA = 시스템 관리자 · AD = 회사 관리자 · U = 일반. + +## 1. 현재 구성(Page:232-326) +| 컨테이너 | 내용 | 파일:줄 | API | 권한 | +|---|---|---|---|---| +| 리소스 현황 | CPU · 메모리 · 디스크 % · 활성 사용자 · 활성 프로젝트 5칸 + 7일 선그래프 | Page:243 · Resources:13-151 | GET admin/resources?days=7(Router:551) | SA | +| 시스템 설정 | M01 · M02 카드 · 통째 접힘 | Page:166-198 · 221-230 | 이동만 | 모두(SA 4장 / AD · 마스터 1장 / U 1장) | +| 프로젝트 | 이름 · 지역 · 단계 막대 · 수정일 · [수정][삭제] · [+]=B02 | Page:245/280/293 · Projects:11-54 | SA · AD admin/projects(Router:343) · U user/projects(Router:136) | 모두 | +| 임시 보관함 | 묶음 · 파일 표 · 청크 업로드 진행률 | Page:251/283/298 · TempUpload:72-469 | GET /api/temp-uploads(`B03_FileInput_Router_Temp.py:149`) | 모두 | +| 사용자 관리 | 이메일 · 이름 · 직급 · 부서 · 전화 · 역할 · 상태 · 관리 | Page:252-260 · Admin:18-76 | admin/users?company_id(Router:424) | SA | +| 팀원 관리 | 이메일 · 이름 · 직급 · 부서 · 역할 · 관리 | Page:284 · Company:84-137 | admin/members(Router:245) | AD | +| 가입 요청 | 이메일 · 회사 · 요청일 · 상태 · 승인/거절 | Page:261/287 · Company:139-160 | admin/join-requests(Router:316) | SA · AD | +| 회사 관리 | 고른 회사 1줄 | Page:241 · 269-274 · Company:162-207 | admin/companies(Router:408) | SA | +| 회사 정보 | 회사명 · 인원 · 프로젝트 수 · 주소(AD 수정 · 로고) | Page:288/299 · Company:25-82 | user/company(Router:148) · company/assets(Router_Assets:41) | AD · U | +| 기본정보(반폭) | 이름 · 직급 · 이메일 · 부서 · 전화 + 서명 | Page:304 · Profile:15-48 | GET/PATCH me(Router:99-115) | 모두 | +| 보안(반폭) | 비밀번호 바꾸기 | Page:305 · Profile:50-110 | POST /api/auth/password | 모두 | +| 시스템 로그 | 이메일 · 행위 · 대상 · IP · 시각 | Page:308-310 · Admin:97-118 | admin/audit-logs(Router:541) | SA | +| 챗봇(떠 있는 단추) | 법령 · 지침 질의 | Page:312 · Knowledge_Chat:7-119 | POST knowledge-chat | 모두 | +- 역할별 차례: SA 9개 · AD 7개 · U 5개 · 사실상 1열 · 목록은 4줄까지 + 안 스크롤(Common:11-15 · 08-08 지시) · 길이(추정) SA 2,900~3,500px · AD 2,100~2,700px · U 1,550~1,850px · 첫 화면 요청 SA 9 · AD 9(같은 회사 프로젝트를 user/projects · admin/projects 두 번 · Page:131-145) · U 5. + +## 2. 쓸 수 있는 틀 +- 해시 인자 `currentQuery()` · `navigateTo(route, query)`(`A00_Common/router.ts:127-140`) — M02 가 `?open=&root=&owner=&company=` 에 상태(`M02_MasterTemplete_Layer.ts:34-50`) · 층 단추 줄(`TreePanel_Roots.ts:48-90`). +- 페이지 안 탭: B08 위 탭(md) · 보조 탭(sm)(`B08_Quantity_UI_Page.ts:28-87` · `.css:14-20` · `B08_Quantity_UI_Earthwork.ts:257-283`) · 공용 탭 부품 없음(`cad_host_tabs.ts` 는 CAD 장 전용). +- 좌측 패널: `ui_template_overlay.ts:245` createWorkflowOverlays + `ui_template_tree.ts`(M01 · M02). +- 한 페이지 여러 주소: MountedPage(`router.ts:16-20 · 101-105` · B05 · B06). +- 자리표 페이지: B10 결재(`B10_Payment_UI_Page.ts:11-45`) · B11 처리 상태(`B11_Status_UI_Page.ts:31-51`) — 버튼 꺼짐 · 링크 없음. + +## 3. 갈래 +- A 해시 인자 탭(`#/b01-account?tab=projects`): 탭 줄(B08 단추 꼴) · 고른 탭만 그리고 그 자료만 받음 · 라우터 · 설정 안 바꿈 · 저장 뒤 다시 그려도 해시로 유지 · 다른 화면이 특정 탭으로 보냄(회사 없음 → `?tab=company`) · 요청 수 줄어듦 · 크기 Page 재편 120~180줄 + 탭 줄 25줄 + CSS 10줄 · 시험 1 · ORCA 점검 1. +- B A + 「개요」 첫 탭: 숫자 카드(단계별 프로젝트 수 · 실패/재확인 · 가입 대기 · 보관함 · SA 리소스) → 누르면 해당 탭 · 이미 받는 자료 · 카드 80~120줄 · CSS `.b01-dashboard__metric`(`B01_Dashboard_UI_Style.css:193-222`). +- C 좌측 패널 메뉴(M01 · M02 꼴): 세로 목록 · 09-06 「공용 일반 레이아웃」(Page:233)과 어긋남 · 좁은 화면 덮음 · 200~300줄. +- 비추천: 항목마다 새 주소(`config_frontend.ts:94-147` · `main.ts:26-40` · `router.ts:27-75` · 「주소 = 폴더 1:1」 어긋남). +- 판단(조사자): A 로 시작 · 요약 필요하면 B. + +## 4. 묶음 · 보강 후보 +| 묶음(권한) | 담을 것 | 더 보일 것 · 근거 | +|---|---|---| +| 프로젝트(모두) | 프로젝트 표 + 임시 보관함 | 연도 · 도로 종류 · 연장 · 발주처 · 작성자 · 만든 날(응답에 있음 Repo:213-219 · 표는 4칸 Projects:44-50) · 찾기 · 거르기 · 4줄 제한 풀기 | +| 진행 현황(모두) | 단계별 수 · 실패(FAILED) · 재확인(STALE) | 단계별 message · progress_percent · 시작/완료 시각(Repo:139-173 · Api:19-28 · 지금 막대 색 · 풍선만) | +| 회사(모두) | 회사 정보 · 팀원 · 가입 요청(AD) · 로고 · 서명 | 사업자번호 · 대표 · 사업 상태(Repo_Co:25-28) · U 도 팀원 목록 읽기 가능(Router:245-256) · 회사 자산 목록(Router_Assets:41) | +| 내 계정(모두) | 기본정보 · 서명 · 비밀번호 | 마지막 로그인 · 이메일 재인증 만료일(/me 가 줌 Repo:98-101 · 타입에 없음 Api:3-17) · 로그인 기록 목록 = 새 API | +| 설정(모두) | 시스템 설정 카드 | 자리만 | +| 시스템(SA) | 리소스 · 로그 · 회사 목록 · 문의 | 리소스 7/30/90일(백엔드 최대 90 Router:553 · 화면 7 고정 Page:115) · 활성 사용자 · 프로젝트 추이(Repo:516-518) · 로그 전체 수 · 쪽(Router:541-548 · 화면 50건) · 회사 전체 목록 + 인원 · 프로젝트 수 · 등록일(Repo_Co:252-263) · 사용자 마지막 로그인 · 소속(Repo:347-351) · 고객 문의 목록 · 상태(API 있음 `A09_Security_Router.py:86-122` · `A09_Security_Api_Fetch.ts` 안 쓰임) | +- 데이터 없음: 알림(표 · API 없음) · 결제(B10 · B11 자리표뿐 · `companies.subscription_status` 열만) · 회사 · 프로젝트별 저장 용량(없음 · total_storage_mb 는 서버 디스크 전체). +- 안 쓰는 함수: fetchAllProjects · assignUserToCompany · fetchAllJoinRequests · fetchProjectWorkflowState(Api:430 · 475 · 482 · 500). + +## 5. 영향 +- 진입(모두 인자 없이 `navigateTo(ROUTES.B01_ACCOUNT)`): 로그인 뒤(`A06_Login_UI_Auth_Page.ts:167 · 202`) · 머리 이름 단추(`app_shell.ts:139`) · 작업 화면 집 단추(`ui_template_workflow_layout.ts:80`) · 회사 없음(`router.ts:189-191`) · 프로젝트 없어짐(`router.ts:206`) · 자료 없음(`b_missing_data_guard.ts:32`) · B02 취소 · M01 권한 없음 · M02 회사 없음(`Layer.ts:176`) · B11 준비 실패 — 회사 없음 두 곳은 `tab` 인자 덧붙임. +- 다시 그리기: 저장 · 승인 · 회사 고르기 = hashchange 로 통째(Modals:77 · Company:219 · Page:213) → 탭을 메모리에만 두면 첫 탭으로 튐 → 해시에 둠 · MountedPage 면 hashchange 가 show() 만(main.ts:66-69). +- 상태: sessionStorage `aislo.adminCompany`(Page:67-74 · 212 · M02 도 읽음) 그대로 · localStorage `temp:session:*` 무관 · 마지막 탭 기억은 pref 틀(`b_page_state.ts:253 · 304-390` + Router:122-133). +- 시험: 고쳐야 함 `test_b01_settings_cards.py:99-141`(buildPage 문자열 구조) · `ui_checks/44-7_단위_드롭다운.js:22-26`(설정 카드 기다림) / 그대로 `test_common_native_menu.py:52` · `test_m02_layer_screen.py:146` · `test_b01_knowledge_chat` · `test_b01_ui_prefs_dead_project`. +- 기타: Modals.ts 662줄 · 위키 `docs/wiki/pages/B01_Dashboard/B01_frontend.md` 옛 내용(위키 운영 안 함). + +## 미결(조사자 제시) +1. 갈래 A / B / C. 2. 로그인 직후 첫 탭(개요 / 프로젝트). 3. 진행 현황을 프로젝트 탭에 합칠지 · 임시 보관함 자리(08-08 「프로젝트 바로 아래」). 4. 시스템 설정 자리(모든 탭 위 한 줄 27-3a / 설정 탭 / 머리). 5. SA 회사 알약(컨테이너 4곳 29-1 / 탭 줄 오른쪽 하나). 6. 4줄 제한(전용 탭에선 풀고 쪽 넘김). 7. 보강 범위(응답에 있는 것만 / + 화면만 새로(문의 관리) / + 새 API(로그인 기록 · 회사별 용량)). 8. 결제 · 알림 탭(만들지 않음 / B10 · B11 자리표를 탭으로). diff --git a/docs/raw/요구_1008_2/조사_J1_B07컨테이너_용지도.md b/docs/raw/요구_1008_2/조사_J1_B07컨테이너_용지도.md new file mode 100644 index 000000000..24ebada41 --- /dev/null +++ b/docs/raw/요구_1008_2/조사_J1_B07컨테이너_용지도.md @@ -0,0 +1,49 @@ +# 조사 J1 — B07 컨테이너 · 용지도 · 배수유역도 · 표준 횡단 (10-8 오후 · 읽기 전용 조사 원문) + +결정은 `분석_정함.md` 가 앞섬 · 이 파일은 근거(파일:줄)용. 경로 = `B07_DesignDetail/` 아래. + +## 0. 「대피소」의 정체 +- 「대피소」 = 계획평면도 기본 종류 넷 중 하나(id `layout` · `Engine_Cad_PlanKinds.py:78-82`). +- 같은 묶음 아래 접이 패널 제목 = 「종류 추가 · 업데이트 · 대피소 자리」(`UI_PlanKinds.ts:193-194`) — 펼치면 종류 칸(`kindForm` 55-94: 종류 고르기 · 이름 · 조각 체크 · [추가/업데이트]) + 대피소 · 사토장 자리 칸(`marksForm` 96-149). +- 원문 「종류 추가 업데이트 대피소 자리 항목으로 편입」 = 이 패널 제목과 글자 같음 → 추정: 용지도를 이 패널의 「종류」로(고르기 목록 · × 지우기 · 업데이트 대상) · 「대피소」 종류를 바꾸라는 뜻 아님. + +## 1. 좌측 목록 +- 정의 `UI_Panels.ts:24-40` `DRAWING_GROUPS` 8개: 표지(cover) · 계획평면도(plan) · 종단면도(longitudinal) · 표준 횡단면도(cross_standard) · 횡단면도(cross) · 토적도(mass_haul) · 유역도(watershed) · 용지도(`idPrefix:"landuse"`) · 이름은 코드에 직접(locale 키 없음). +- 그리기 `UI_Panels.ts:91-143` — plan 이면 `buildPlanSection` · 1장 이하면 컨테이너 없이 단추(이름 group.label · 106-128) · 2장 이상이면 컨테이너 + 제목 `${label} ${N}`(130-142). +- 계획평면도 묶음 `UI_PlanKinds.ts:152-211` — 종류별 블록 · × 지우기(176-186) · 접이 패널(191-209). +- 종류 자료: 조각 14개 `PIECES`(`Engine_Cad_PlanKinds.py:46-61`) · 기본 넷 `DEFAULT_KINDS`(71-89) · 저장 `B07_DesignDetail/plan_kinds/{id}.json`(폴더 없으면 기본 넷 · 처음 고칠 때 파일로 · `Router_Support_Plan.py:78-115`) · 도면 id `plan_{kind}[_{장}]`(:61) · 제목 `계획평면도({이름})`(:67-68). +- 서버 목록 순서 `Router_Support.py:110-192`: 종단 → 횡단 장 → 종류×장 → 용지도(161-174) → 표지 · 표준 · 토적 · 유역(176-189) — 화면 순서와 다름 · 도면번호(195-211) · 이전/다음(`UI_Page.ts:323-328`)은 서버 순서(원래부터 어긋남). + +## 2. 용지도 · 배수유역도 편입 +- 지금: 용지도 = 따로 `landuse[_N]`(`Router.py:358-366` · `Router_Support.py:481-500`) · 축척 · 도곽 · 장 나눔은 계획평면도와 같은 식(`Router_Support_Basin.py:470-480` = `_sheet_box` 496-510) / 배수유역도 = `watershed` 한 장 · 1/6,000 · 노선 전체 · 오른쪽 정보표(`Engine_Cad_Basin.py:278-438`). +- 길 A(화면만 · 작음): `_drawing_list` 에서 landuse · watershed 에 `plan_kind` · `plan_kind_name` 실음(`Router_Support.py:163-189`) · `UI_Panels.ts:92-96` plan 묶음에 함께 · 38-39줄 항목 뺌 · × 단추는 `kind==="plan"` 일 때만(`UI_PlanKinds.ts:176` — 가드 필수 · 없으면 `delete_kind` 가 기본 넷을 디스크에 먼저 내린 뒤 404 · `Router_Support_Plan.py:169-172`) · id · manifest · 확정 · 도면번호 그대로 · 「종류」 고르기 목록엔 안 들어감. +- 길 B(용지도를 진짜 종류로 · 중간): `PIECES` 에 조각 넷(parcel · parcel_info · emd · sgg) · `build_pieces`(`Router_Support_Plan.py:320-418`)에서 `_clip_parcels` · `_clip_rings`(Basin 377-438) · `_piece_entities`(`PlanKinds.py:347-478`)에 그리기 옮김(출처 `Engine_Cad_Landuse.py` `_boundary_entities` · 정보 글) · `DEFAULT_KINDS` 에 `{"id":"landuse","name":"용지도"}` → 체크 목록 · 고르기 · × · 업데이트 자동(`Router_PlanKinds.py:49-55` · 라이다 선례 138e80c79) · 이관 ① 이미 `plan_kinds/` 있는 프로젝트엔 새 기본 종류 안 생김(`list_kinds` 81-82) → 한 번 더해 주는 이관 ② id `landuse` → `plan_landuse` → 옛 확정 고아(단계 완료 기준은 횡단만 · `Router.py:448` · 무해) · 지울 자리 `Router.py:358-366` · `Router_Support.py:161-174 · 427-428 · 481-500` · `landuse_source`(Basin 441-490) · `build_landuse_drawing` · 주의: 제목 `plan_title` 로 「계획평면도(용지도)」 · 종류 양식엔 범례 없음 · 등고선 색이 계획평면도 색으로 · 순서 끝에 두면 도면번호 그대로. +- 길 C(배수유역도까지 조각 · 큼 · 비권장): 1/6,000 한 장 → 1/1,200 장 나눔 · 「수리집수면적유역도 S=1/6,000」 양식 깨짐 → 유역도는 길 A(고정 항목)가 맞음(추정). + +## 3. 제목 바꾸기(작음) +- 고칠 자리 `UI_Panels.ts:34` 「종단면도」 · `:36` 「횡단면도」 · `UI_PlanKinds.ts:159` `계획평면도 ${N}` · `UI_Panels.ts:33` label 은 화면에 안 쓰임 · 1장일 때 단추 이름 = group.label(`UI_Panels.ts:123`). +- 같은 글 다른 곳: 도각 도면명 `Engine_Cad_Long.py:661` 「종단면도」 · `Engine_Cad_Sheet.py:254` 「횡단면도」 · 장 응답 라벨 `Router_Support.py:396` 「횡단면도 N장」 · 종류 제목 `Router_Support_Plan.py:68` 「계획평면도(…)」(탭 이름 · 내보내기 파일 이름이 이 label · `UI_Page.ts:316 · 420-424`) · 종단 단추 이름은 이미 「종단도」(`Engine_Cad_Long.py:106-121`) · B08 · locale · B07 도움말엔 없음. + +## 4. 표준 횡단면도(작음) +- 지금 `UI_Panels.ts:35` 따로 항목 · 1장이라 종단 · 횡단 사이에 단추. +- 고칠 자리: `group.kind==="cross"` 일 때 items 앞에 `cross_standard` 붙이고 35줄 뺌 · 횡단 장 1개여도 컨테이너 · CSS 한 줄(횡단 컨테이너 2열 grid `UI_Style.css:59-63` → `grid-column: 1 / -1` · 84-86 재사용). +- 주의: 개수 표시 `횡단도 N` 에 표준 섞임 · 서버 고칠 것 없음 · `isCrossSheet`(`UI_Panels.ts:163-165`) kind 먼저 · `CROSS_SHEET_ID` 숫자 fullmatch · 확정 기준(`UI_Page.ts:125`) kind "cross" 만 → 안전. + +## 5. 용지도 글(중간) +- 지금 `Engine_Cad_Landuse.py:227-274` — 필지마다 지번 · 지목 · 면적 · 소유자 4줄(1.8 mm) · 자리 = 잘린 경계 bbox 중심(`_ring_center` 86-90) · 노선 · 다른 글과 겹침 검사 없음 · 노선 그린 뒤 글을 맨 위(303). +- 원인 1순위: 도곽을 감싼 필지의 글 자리 = 도곽 중심(`Router_Support_Basin.py:418 · 436-437`) = 노선 범위 중심 → 거의 노선 위 · 경계도 열린 선 조각으로만 와서 다각형 없음(433-435). +- 고칠 자리: `_clip_parcels`(Basin 399-438)에서 shapely `(필지 ∩ 도곽) − 노선 버퍼` 의 `representative_point()` → label_at · 노선을 인자로(시험 부르는 꼴은 기본값) · 엔진에서 상자 라벨 + 지시선 · 후보 자리 몇 개 중 노선 버퍼 · 놓은 상자와 안 겹치는 첫 자리(shapely `box.intersects`). +- 재사용: `Engine_Cad_MassHaul.py:182-256` `_balloon_entities`(사각 + 계단형 지시선 + 여러 줄 · 층 · 색 · 글 크기 인자로) · Basin `_number_badge_entities`(183-228) + `_info_box_entities`(231-275)(「번호 배지 + 오른쪽 표」) · `route_frame`(`PlanKinds.py:121-131` 노선 법선 띄우기 · 대피소 라벨 8 m 선례 `Router_Support_Plan.py:64 · 308-315`) · CAD 지시선 `openwebcad/src/tools/annotate/leader-table-tools.ts:20-53` · shapely 2.x 설치됨(`requirements.txt:46`). +- 주의: `Router_Support_Basin.py` 668줄 → 용지도 함수는 새 파일로 · b 를 길 B 로 하면 그리기가 `PlanKinds` 로 → a 와 한 번에. + +## 6. 시험 · 겹침 +- `test_b07_plan_kinds.py`(종류 이름 목록 단정 126 · 135 · 142) · `test_b07_landuse_parcel_info.py`(글 자리 단정 30 · 37) · `test_b07_masshaul_basin.py`(유역도 엔진 · 길 A 면 그대로) · ui_checks 엔 B07 목록 글 단정 없음. +- 82-4 탭 작업(`UI_Page.ts` · `UI_Style.css` 끝 `.b07-cad-stack` 332-343)과: b~e 는 `UI_Panels.ts` · `UI_PlanKinds.ts` · CSS 앞쪽만 · `buildDrawingSidePanel` 서명 지키면 `UI_Page.ts` 그대로 · 88-4 수확(`Cross_Overlay.ts`)과 안 겹침. + +## 미결(조사자 제시) +1. 용지도 = 진짜 「종류」(길 B) vs 묶음 안 고정 항목(길 A). +2. 배수유역도 = 1/6,000 한 장 고정 항목 vs 1/1,200 조각(길 C). +3. 이관: 이미 종류 고친 프로젝트에 용지도 종류 자동 추가 · 옛 용지도 확정 풀려도 되는지. +4. 용지도 종류 도면 제목(계획평면도(용지도) / 용지도 / 평면도(용지도)) · 종류 제목 「계획평면도(…)」 · 도각 도면명 「종단면도 · 횡단면도」도 바꿀지. +5. 라벨 꼴: 상자 + 지시선 4줄 vs 번호 배지 + 오른쪽 표 · 「구역」 = 필지 vs 행정구역(리 · 읍면동 — 지금 이름 글 없음 · `_clip_rings` 가 속성 버림) · 필지 채움색. +6. 표준 횡단면도 단추 이름 · 개수 표시. diff --git a/docs/raw/요구_1008_2/조사_J2_B07평면도_IP표.md b/docs/raw/요구_1008_2/조사_J2_B07평면도_IP표.md new file mode 100644 index 000000000..0135ca9fa --- /dev/null +++ b/docs/raw/요구_1008_2/조사_J2_B07평면도_IP표.md @@ -0,0 +1,48 @@ +# 조사 J2 — B07 평면도 사용자 지정 · IP 표 (10-8 오후 · 읽기 전용 조사 원문) + +결정은 `분석_정함.md` 가 앞섬. 접두어 `B07_DesignDetail_` 생략. +요약: (a) 이미 구현됨(PLAN 60 · 67장 · 커밋 138e80c79 → 3e1186861) — 평면도 종류(지형 · 노선배치도 · 대피소 · 라이다 · 사용자 추가)마다 정보 조각 14개를 체크로 고르고 서버가 생성 때 반영 · 남은 것 = 용지도 · 유역도 편입 · 이름 「평면도」. (b) 없음 — 지금 IP 는 점선 접선 · 원 · 「IPn」 글 · R 은 「R=..」 글뿐 · 가장 짧은 길 = 새 조각 `ip_table`(체크박스는 서버 목록에서 저절로). + +## 1. 평면도 만드는 방식 +- 목록 `Router_Support.py:152-160` ← `plan_kind_items` `Router_Support_Plan.py:450-468` · id `plan_{종류}[_{장}]` · 축척 1/1,200 고정 · 안 들어가면 장 나눔(`Engine_Cad_Plan.py:96-132`). +- 열기 `Router.py:348-357` → `plan_kind_source` `Router_Support_Plan.py:421-447` → `build_pieces` :320-418 → `build_plan_kind_drawing` `Engine_Cad_PlanKinds.py:481-555` · 조각은 열 때마다 다시 계산해 `plan_pieces/{장}/{조각}.json`(:415-417). +- 정보 층(조각 14 · `PlanKinds.py:46-61`): 라이다 음영 · 등고선 · 계류 · 비탈 눈금 · 노견선 · 성토/절토 외곽선 · 중심선 · IP · R · 측점 NO · 시종점 · 대피소/사토장 · 배수시설 기호 · 층 이름 `b07-plan-{조각}` · 고른 조각만 층(:542-554) · 기본 종류 넷 :71-89 · 조각에 없는 것 = 용지(지적 · 행정경계) · 유역은 따로 도면(`Engine_Cad_Landuse.py:191` · `Engine_Cad_Basin.py:278`). +- 저장: 종류 `plan_kinds/{id}.json` = {name, pieces, order}(`Router_Support_Plan.py:74-173` · 폴더 없으면 기본 넷 · 처음 고칠 때 파일로 :105-115) · 대피소 자리 `plan_marks.json` · 확정 `manifest.json`(`Router_Support_Io.py:65-79`) + `drawings/.json`(쓰기 `Router_Support.py:594-606` · 읽기 :417-436 · `DRAWING_FORMAT=7` `Engine_Cad.py:51`) · 종류 고치면 그 종류 확정본 풀림(`Router_Support_Plan.py:154-162`). +- 화면 · API: `Router_PlanKinds.py:72-126` · UI `UI_PlanKinds.ts:55-94`(체크 목록은 서버 조각 목록 `Router_PlanKinds.py:52` · `
` 안에 접힘 :193-208). +- 층 켬/끔: CAD 눈 아이콘(`openwebcad/src/components/LayerManager.tsx:68` · 숨긴 층 안 그림 `helpers/draw-functions.ts:32`) · DXF 내보내기는 숨김 안 봄(`Engine_Frame_Export.py:219-235`) · 미확정 도면은 열 때마다 새로 → 켬/끔 사라짐. +- 양식 `resources/master_template/drawing/00_template_A1.json` = 작도 영역 [42,47,812,567] + 표제란 자리표 11개 · 표 자리 없음. +- ⚠ 호출처 0 옛 코드(여기에 IP 표 넣으면 화면에 안 나옴): `Engine_Cad_Plan.py:66-71 · 135-142 · 155-388`(build_plan_drawing) · `Router_Support_Basin.py:276 · 292-353`(plan_source) · `:493 · 531-558`(lidar_source) · `Engine_Cad_Lidar.py:106`. + +## 2. (a) 사용자 지정 +- 지금 「종류마다 보일 조각」을 프로젝트에 저장 · 생성 때 반영 → 요구 문장 이미 충족. +- 남은 것: 이름 바꾸기(`UI_Panels.ts:33` · `UI_PlanKinds.ts:159` · `plan_title` `Router_Support_Plan.py:67-68`) · 용지(지적 · 경계 · 범례) · 유역(경계 · 번호 · 정보표) 조각 편입 + 기본 종류 「용지도」 「유역도」(`build_pieces` · `PlanKinds._piece_entities` · `Router_Support.py:161-189` 목록에서 따로 도면 빼기). +- 저장 자리: 종류 파일(권장) · 장마다(요구 없어 생략) · 회사 양식(여러 프로젝트 기본값 필요할 때만). +- 반영: 생성 때 주력 · CAD 켬/끔 보조면 `drawing_to_dxf` 가 숨긴 층 빼게 몇 줄(작음). +- 재사용 `map_background` `Router_Support_Basin.py:236-273` · `landuse_source` :441 · `watershed_source` :606 · `clip_line_to_box` :144. +- 위험: 유역도 1/6,000(`config_system.py:184`) vs 평면도 1/1,200(:187) · 종류별 축척 개념 없음 → 유역 편입은 축척 규칙부터. 크기: 이름 작음 · 용지 편입 중간 · 유역 편입 큼. + +## 3. IP 자료 원천 +- 곡선표 읽기 `_load_design_curves` `B05_Profile/B05_Profile_Engine_Sections.py:75-100` → `B05_Profile/route/planned_route_curves.json`(없으면 `planned_route_initial_curves.json` · 경로 `common_util_route_geometry.py:237-261`) · 쓰기 `B05_Profile_Router_Replan.py:296-326`. +- 곡선 하나(`RouteCurve.as_dict` `common_util/common_util_route_polyline.py:130-141` · 계산 :670-731): apex(IP 좌표 · 소수 4) · radius_m(R · 3) · tangent_m(TL · 3) · inner_angle_deg(**내각** · 교각 아님 · 2) · start / end(BC / EC · 4). +- 없는 것: IA(= 180° − 내각) · CL · SL · BP/EP · 식(지식DB `resources/knowledge/technical_info/01_임도/03_계산정보/곡선설치_계산.md:22-25`) TL = R·tan(IA/2) · CL = R·IA(rad) · SL = R·(sec(IA/2) − 1) · 예시 IA 94-59-58.38 · R 15 검산 = 16.36950 · 24.87082 · 7.20271 표와 정확히 일치 → SL = 외할 확정. +- 정밀도: 내각 소수 2자리 → IA 최대 ±18″ 틀림 → IA 는 곡선 자기 접선(`start→apex` · `apex→end` 방향각)으로 다시 계산(약 1″) · TL · CL · SL 은 R 과 새 IA 로 다시 계산 · 대안: `as_dict` 반올림 자리 늘리기 1줄(공용 · 새로 저장분부터). +- 예시 표 검산: BP→IP1 1,259 m · 좌표 사슬 교각 101.87° ≠ 94.9995° → 예시 값은 견본(추정) → IA 는 IP 사슬이 아니라 곡선 자기 접선으로. +- BP/EP: 노선 첫 · 끝 정점(`context.vertices`) · B05 화면 이름 「시점 · 종점 · 교각점」(`B05_Profile_UI_RouteEdit_CurveBar.ts:106`). +- 좌표계: TM(PRJ · 기본 EPSG:5186 `B04_PreProcess_Engine_Extent.py:146-147`) · x = 동 · y = 북 · 도면은 종이 mm(`PlanKinds.py:490-491`) · 예시 X 387998 = 북 · Y 226767 = 동 → 한국 측량 관례대로 X = 북(y) · Y = 동(x)(추정 · 근거 강함). +- 번호: `curve_pieces` `PlanKinds.py:299` 노선 전체 차례 · 장 범위로 거름(:304) · 노선 밖 옛 곡선 거르는 장치 없음 → B05 5 m 허용 `_design_curve_spans` `B05_Profile_Engine_Sections_Core.py:219-275` 재사용. 크기: 작음(계산 약 30줄 + 도-분-초 글 · 초 60.00 올림 처리). + +## 4. IP 표(b) +- 지금 `ip` 조각 = 접선 · 원 · 「IPn」(`PlanKinds.py:401-410`) · `radius` = 「R=..」(:411-413) · 표 · 양식 자리 없음. +- 그림 꼴: IP 마다 3열 묶음 [머리 | X·Y | 값] · 행 IP · CO(X, Y · CO 2행 병합) · IA · R · TL · CL · SL(IA 이하 2 · 3열 병합) · BP 묶음은 3행뿐 · 밑엔 테두리 없음 → 표 하나면 BP 밑 빈칸에 테두리 생김 → IP 묶음마다 Table 하나씩 나란히(유역 정보표 방식 `Engine_Cad_Basin.py:231-275`). +- 고칠 자리: `Engine_Cad_PlanKinds.py` 조각 목록 끝 `("ip_table","IP 표",False)` · `_COLORS` · `_piece_entities` 새 갈래 · 자리 = 장 도곽 왼쪽 아래 종이 (0,0) + 여백(`frame_box` :498) / `Router_Support_Plan.py` `build_pieces` :358-359 옆에서 BP · IP… · EP 자료 계산 · 번호는 `curve_pieces` 와 같은 차례 / UI · API · CAD 손댈 것 없음. +- 판정: 종류에 `ip_table` 조각 체크면 넣음(양식 표 칸 방식은 M02 양식 · 작업본까지 번져 비권장). +- 재사용: `table_entity` `Engine_Cad.py:183-219`(병합) · 병합 꼴 `Engine_Cad_Table.py:124-229` · DXF 표 → 선+글 `Engine_Frame_Export.py:81-149`(거울 시험) · CAD `entities/TableEntity.ts`. +- 길이: 값 칸 12자 · 글자 2.2 mm → 묶음 폭 약 30~35 mm · 평면 칸 약 700 mm(`Engine_Cad_Plan.py:81-87`) → 한 줄 약 20 묶음 · 1.1 km 노선 곡선 13곳이면 거의 한 줄 · 넘치면 다음 줄 위로(한 줄 = 8행 × 5 mm = 40 mm). +- 주의: 도각 배치 범위 계산(`Engine_Template.py:240-270`)이 Table 모름 → 도곽 안에 두거나 계산 보강 · 표 밑 등고선 · 노선 비침(Table 채움 없음 · Hatch 는 DXF 에서 테두리만 `Engine_Frame_Export.py:210-213`) → 가리려면 등고선을 표 칸 밖으로 자름 · 여러 장 범위 겹치면 같은 IP 두 장 → 누가거리로 거르기(`_project_chainage` `B05_Profile_Engine_Sections_Core.py:224-238`) · 확정 도면은 저장본 → 종류 [업데이트] 해야 풀림. 크기: 중간(2파일 약 150줄 + 시험). + +## 5. 시험 · 겹침 +- `test_b07_plan_kinds.py`(232줄 · 곡선/IP 경우 없음 → 예시 값 검산 · ip_table 층 시험 자리) · 표 내보내기 `test_b07_frame_export_table.py` · `helper_b07_table_geometry.cjs` · `resources/tester/cad/table.test.ts` · `table-export.test.ts` · 곡선 `test_plan_curve_limits.py` · `test_route_polyline_apex_roundtrip.py` · `test_route_polyline_curve_fit.py` · `test_b05_curve_radius_floor.py` · `test_75_profile_strip.py`. +- 겹침: `UI_Page.ts` 평면도 코드 없음 · `Cross_Overlay.ts` 무관 · openwebcad tools · entities 손댈 것 없음 · (a) 이름 바꾸기만 `UI_Panels.ts` · `UI_PlanKinds.ts`. + +## 미결(조사자 제시) +1. CO 의 X · Y = 북 · 동(한국 측량 관례). 2. EP 열(IP · CO 만). 3. 여러 장: 장마다 그 장 IP 만 vs 전체 표 · BP · EP 는 해당 장만. 4. 곡선 없는 꺾임(내각 179° 이상)에도 IP 번호 · 열. 5. 표 한 줄 최대 폭 · 넘칠 때 위로 · 표 밑 등고선 지움. 6. 어느 기본 종류에 IP 표 기본 체크(지형?) · 이미 내려간 프로젝트는 [업데이트]로만. 7. IA 정밀도: 기하 재계산만 vs B05 저장 자리 늘리기도. 8. 도-분-초 분 · 초 두 자리(「5-03-07.20」). 9. 색: 예시 빨강 선 · 파랑 글 vs 지금 도면 표 색. 10. 용지 · 유역 편입 범위 · 유역 축척 · 장마다 종류. diff --git a/docs/raw/요구_1008_2/조사_K_B08수량산출.md b/docs/raw/요구_1008_2/조사_K_B08수량산출.md new file mode 100644 index 000000000..88f171aba --- /dev/null +++ b/docs/raw/요구_1008_2/조사_K_B08수량산출.md @@ -0,0 +1,57 @@ +# 조사 K — B08 탭 · 수리집수면적표 · 구조물도 모달 (10-8 오후 · 읽기 전용 조사 원문) + +결정은 `분석_정함.md` 가 앞섬. 파일 = `B08_Quantity/B08_Quantity_*` · `ui_template/*` · `M02_MasterTemplete/*` · `common_util/common_util_drainage_detail.py` · `common_util_drainage_pipes.py` · `B04_PreProcess/B04_PreProcess_Router_Basins.py` · `A00_Common/b_page_state.ts` · `config/config_system_design.py`. + +## 1. 탭 · 구분선 · 보조 탭 간격(c) +- 메인 `TABS` 넷: summary(구조물 집계표) · sheet(구조물도) · earthwork(토공) · hydrology(수리집수면적표) — `UI_Page.ts:28-33` · 그리기 38-55 · md 단추 70-74. +- 보조 탭 세 곳 복사: 토공 넷(`UI_Earthwork.ts:226-283`) · 수리 측점(`UI_Hydro.ts:95-130` · [저장] 툴바 104-108) · 구조물도 조합(`UI_Drawing.ts:89-124`) · class `b08-quantity__tabs` · sm 단추. +- 탭 상태 저장 없음(늘 첫 탭 · `UI_Page.ts:87` · `UI_Earthwork.ts:282` · `UI_Hydro.ts:188`) · 수리 입력 초안만 sessionStorage `aislo:draft:b08-hydro:{프로젝트}`(`b_page_state.ts:167-168` · version 2). +- 구분선 `.b08-quantity__tabs { padding-bottom: 8px; border-bottom: 1px }`(`UI_Page.css:14-20`) · 보조 줄도 같은 class. +- 간격 원인: 보조 탭 위 16px = 메인 줄과 패널 사이 `gap: var(--spacing-16)`(`UI_Page.css:6`) · 아래 8px = padding-bottom(:18) → 고칠 자리 `UI_Page.css:6` gap 16 → 8 한 줄(수리 툴바도 같이 맞음) · 참고: 보조 줄 선 아래 본문 간격 토공 0 · 수리 16(`UI_Hydro.css:16`). 크기 작음. + +## 2. (a) 수리 상세 브라우저 크기 +- 폭 `.b08-hydro__toolbar, .b08-hydro__sheet { max-width: 1000px }`(`UI_Hydro.css:5-9` · 진행단계 판 피하려던 것) · 높이 규칙 없음 · 바깥 main 이 통째 스크롤(`ui_template_workflow_layout.css:132-138`) · 2열 → 1열 = `@media 960px`(`UI_Hydro.css:34-45`). +- 선례: ① B08 다른 보조 탭 공용 표 `max-height: calc(100vh - 260px)` + `max-width: 100%`(`ui_template_data_table.css:13-16`) — B08 안에서 수리만 규칙 밖 ② M02 면적 · 일위대가 상세 `height: calc(100vh - var(--spacing-64))` + flex `min-height: 0` · 본문만 스크롤(`M02_MasterTemplete_UI_Style.css:136-160` · `M02_MasterTemplete_Drawing.css:3-10`) ③ M02 구조물 카드 `--m02-struct-card-h: min(640px, 70vh)` + `@container 960px`(`Structure.css:9-45` · `test_m02_tree_paste.py:156-158` 고정) ④ B05/B06/B07 뿌리 `height: calc(100dvh - var(--spacing-64)); overflow: hidden`. +- 고칠 자리 `UI_Hydro.css` 하나: 1000px 지움 · 높이 = 선례 ① 꼴(카드 `max-height: calc(100vh - Npx)` + `.ui-card__body { overflow: auto }`) 또는 ② · `@media` → `@container`. +- 위험: 폭 풀면 오른쪽 떠 있는 진행단계 판(`ui_template_overlay.css:56-60` · 끌기 · 접기)이 오른쪽 카드 가림(B05~B07 · M02 도 같음). 크기 작음. + +## 3. (b) 구조물도 탭 → 집계표 행 모달 +- 지금: 집계표 열(조합)마다 보조 탭 · 한 장 = M02 항목 카드(`createItemCards`) · 카드 둘 = 도면 정보(보기 전용 웹캐드 iframe · `DrawingCard` → `M02_Drawing` → `cad_host`) + 면적산출(읽기 전용 시트) · 일위대가 카드 없어 2열로 덮어씀(`UI_Drawing.css:8-17`) · M02 원본 층만 읽음(`UI_Drawing.ts:74-81` readTemplate) · 프로젝트 복사본 안 읽음 · 열 · 차례는 집계표와 같음(summaryColumns). +- 행 ↔ 구조물: 집계표 줄 = 측점(1cm 묶음) · 열 = 조합(summary_item + group_items)(`Summary_Data.ts:45-83`) · 「측점 → 그 측점의 조합들」 함수 없음 → `Summary_Data.ts` 에 10줄 안팎(런타임 import 는 `common_util_summary_item` 하나만 · test_61_1 이 두 파일을 이어 붙여 node 로 돌림) · 조합 → M02 줄(열 · 도번) Map 이미 있음(`UI_Summary.ts:84` m02). +- 행 고르기: 공용 표 innerHTML 가상 그리기 · 줄 이벤트 없음(`ui_template_data_table.ts:108-130 · 179-211`) · 방법 1(권장) opt-in `onRowClick(i)` · `data-i` 는 옵션 있을 때만(`test_ui_data_table.py` 가 `` 글 봄) · 방법 2 B08 위임 클릭 + 첫 칸 측점 글. +- 재사용: `openModal`(`ui_template_modal.ts:20-52` · `.ui-modal` `overflow: auto` + `max-height: var(--modal-max)` → 세로 스크롤 그대로) · 큰 창 선례 `.ui-modal.ui-item-picker { width: min(1320px, 96vw); --modal-max: 94vh }`(`item_picker.css:3-10` · 공용 `modal.css` 는 `test_modal_top_and_add_word.py` 가 글 고정 → 자기 class) · 모달 안 카드 선례 `item_picker_detail.ts:318-337`(늦은 import) · 구조물 복사본 읽기 `makeSource 168-183` · 닫을 때 `cards.destroy()`(`ItemCards.ts:555-560`) → `beforeClose`(`modal.ts:17 · 23-25`). +- 주의: 조합마다 CAD iframe(`cad_host.ts:109-128` · 5개면 5개) · 감시 시계 20/15초(:147-182) 때문에 `loading=lazy` 못 씀 · 카드 높이 `min(640px, 70vh)` · 키보드 줄 고르기 없음 · `test_61_2` 가 `tab === "sheet"` 단언 → 고침 · PLAN 82(여러 장 `더한장[]`)와 「여러 장」 뜻 겹침. 크기 중간. + +## 4. (d)(e) 「구조물」 탭 · 보조 탭 넷 +- `UI_Page.ts:28-55` TABS = structure · earthwork · hydrology · sheet 지움 · structure 아래 보조 넷(토공 SHEETS 꼴 `UI_Earthwork.ts:226-283`): 구조물 집계표(`renderStructureSummary`) · 총괄자재수량집계표 · 콘크리트소요자재집계표 · 자재수량집계표 · 빈 탭 = 기존 「차례대로 만들 탭입니다.」(`B08_Quantity_Tab_Pending` `locale_b4.ts:21` · `UI_Page.ts:51-54`). +- 글: 새 키 넷 `locale_b4.ts` B08 묶음(20-46) · 옛 키 `B08_Quantity_Tab_Material` 등(`locale_b2.ts:611-617`) 안 씀 · 지울 것 `B08_Quantity_Tab_StructureSheet`(b2:614) · `UI_Page.ts` 머리 주석 3-8 · `UI_Drawing.ts`(모달 모듈로). +- 주의: `UI_Hydro.ts:22` · `UI_Earthwork.ts:16` 이 `UI_Summary` 에서 `stationInterval` import → 옮기면 함께 · `ui_checks/54-2_도움말.js:71` · `54-20_좌측단추_치수.js:22` 가 `.b08-quantity` 씀 → 이름 유지. 크기 작음. + +## 5. (f)(g) 수리 표 ← B05 배수유역 값 +- 칸(`UI_Hydro_Sheet.ts`): 왼쪽(323-353) 할증 factor(288) · 유출계수 f(337) · 유역면적 A `area_km2`(339) · 거리 L `length_m`(343) · 표고차 H `height_m`(344) · 최소 도달시간(346) · 지역(305-315) · 재현기간(296) · R24(295) / 오른쪽 관(404-425) 관 종류(419) · 단면 가정(420) · 관경 D `diameter_mm`(410) · 하상경사 1/S(361) · n(359) / 박스(370-383) 내공 B `box_width_m`(373) · H `box_height_m`(374) · 수심비(375) / 세월교 · 물넘이(384-403) 월류 폭 `overflow_width_m`(387) · 계산 칸은 서버(`Engine_Hydro.py:73-139`). +- 지금 값 차례: DEFAULTS(측점 고유 값 None · `Hydro_Defaults.py:24-39`) → 장 기본(51-58) → 저장본 `hydro_inputs.json`(`Hydro_Site.py:23 · 108-121`) → 세션 초안(`UI_Hydro.ts:86-93`) · R24 · 지역은 `rainfall_table.json` · 행정구역(`Hydro_Site.py:90-105`) · 계산 때 서버가 R24 덮음(`Router_Hydro.py:94-97`) · 「B05/B06 값과 잇지 않음」 = 사용자 결정 62 · 62-4 · 69-6(`docs/raw/plans/2026-10-06_plan_62_홍수량.md:4,9` · `2026-10-07_plan_64-71_밤작업.md:43`) → 이번 요구가 바꿈 · 같은 뜻 주석 넷 고침(`Router_Hydro.py:8-9` · `Hydro_Defaults.py:3` · `UI_Hydro.ts:5` · `b_page_state.ts:167`). +- B05 결과: 관 지점마다 유역 `area_m2` · `relief_m` · `flow_length_m` · `tc_minutes` · `intensity_mm_hr` · `design_flow_m3s`(×2.0) · `pipe_diameter_mm` · `recommended_diameter_mm` · `bridge_required`(`common_util_drainage_detail.py:102-130`) · 식(`size_pipe` 633-681) Kirpich + Mononobe(`config_system_design.py:166`) · f 0.8 · ×2.0 · 100년 · 최소 5분(:170-176) = B08 식 · 기본값과 같음 · 시설 옵션(`pipe_points.json`) 관 `pipe_diameter_mm`(분석 추천이 빈칸에 · `Router_Basins.py:156-186`) · 박스 `body_width_m` · `body_height_m` · 세월교 · 물넘이 `ford_width_m` · `ford_height_m`(`Router_Basins.py:122-142`). +- 파일 · API: `{프로젝트}/B04_PreProcess/drainage/04_detailed_basins.geojson`(kind `detail_basin` · 측점 0.01 반올림 · `required_area` · `recommended_facility` 안 남음) · B05 [저장](PUT …/drainage/pipe-points) 때 `pipe_points.json` 과 함께(`B04_PreProcess_Router_Basins.py:280-331 · 404-432`) · GET `/api/projects/{id}/drainage/pipe-points` → `basins[]` + `pipe_points[]`(매번 다시 셈 · 분석 없으면 404 · B08 이 이미 부름 `UI_Summary.ts:78`). + +| B08 칸 | B05 원천 | 장 | 비고 | +|---|---|---|---| +| A `area_km2` | `area_m2 / 1e6` | 모두 | | +| L `length_m` | `flow_length_m` | 모두 | | +| H `height_m` | `relief_m` | 모두 | 0 이면 빈칸(저장 검사 gt=0 `Router_Hydro.py:40`) | +| D `diameter_mm` | `options.pipe_diameter_mm` | 관 | 글 '1000' 일 수 있어 숫자로 | +| 내공 B · H | `options.body_width_m` · `body_height_m` | 박스 | | +| 월류 폭 | `options.ford_width_m` | 세월교 · 물넘이 | | +| f · 할증 · 재현기간 · 최소 tc | config `DRAINAGE_*` | 모두 | 지금 같은 수를 Hydro_Defaults 에 따로 → import 로 묶기 | +| (비교만) Qd · T · 월류 높이 | `design_flow` · `tc` · `ford_height_m` | 해당 장 | 계산 칸 옆 참고 | +- 잇지 않음: 하상경사(B05 관 경사 10° 고정 :178) · 관 종류(B05 은퇴 · 선택지 다름) · n. +- 방식(권장): 서버 GET …/quantity/hydro(`Router_Hydro.py:75-85`)가 04 파일 읽음(읽기 함수 `Hydro_Site.py`) · `station_rows(points, basins=None)`(`Hydro_Defaults.py:61-69`)가 측점마다 `linked`(기본 None → test_73_1 · 73_11 그대로) · 측점 짝 `carry_indices`(±0.05 m · `common_util_drainage_pipes.py:371-390`) · 화면 `inputsOf`(`UI_Hydro.ts:86-93`) 차례 = 기본 < 장 기본 < linked < 저장 < 초안 · 저장본 · 초안은 null 까지 담음 → null 은 건너뜀 · [저장] 때 linked 와 같은 값은 null 저장(연동 유지) · 다르면 손 값(B04 「빈칸만 채움 · 사용자 값 안 덮음」과 같은 규칙) · 초안 version 2 → 3. +- 위험: 04 파일은 B05 [저장] 때만 새로 → 저장 전 분석은 B08 에 안 보임 · B05 H = max(H, 0.1) · L = max(L, 1) · 반올림 → Qd 조금 다를 수 · R24 B05 선정 관측소 100년 `r24_design` vs B08 `values` 1440분(같은 표 추정) · 독립 기슭막이 지점도 관 장(기존) · 강우표 없으면 tc · Qd 비고 A · L · H 는 있음. +- 시험: `test_69_b08_hydro_site.py:75-80` DEFAULTS 측점 값 None 고정 → DEFAULTS 고치지 말고 linked 층 · 새 시험(견본 basins + points → linked · `compute(linked)` Qd ≈ B05 `design_flow`). 크기 중간. + +## 6. 시험 · 겹침 +- 걸림: `test_61_2_b08_structure_sheets.py`(탭 단언 → 모달) · `test_61_1_b08_summary_table.py`(Summary_Data import 제약) · `test_ui_data_table.py` + `helper_ui_data_table.cjs` · `test_modal_top_and_add_word.py` · `test_69_b08_hydro_site.py` · `test_73_1_b08_hydro_pending.py` · `test_73_11_b08_hydro_box_ford.py` · `test_62_2_b08_hydro_engine.py`(안 건드림) · `test_65_ford_defaults.py`(참고) · `test_69_b08_earthwork_tabs.py` · `ui_checks/54-2_도움말.js` · `54-20_좌측단추_치수.js`. +- 이미 깨진 옛 시험(없는 파일 읽음): `test_b08_station_label` · `test_b08_seed_spray_leaf` · `test_b10a_rules_visible_b08` · `test_b08_face_dressing_fields_ui` 등. +- 겹침: `M02_Table_Fill_Spec.py` 안 건드림 · PLAN 82(여러 장) — (b) 모달이 같은 카드. + +## 미결(조사자 제시) +1. (b) 「복수」 = 한 측점 여러 조합 vs 한 조합 도면 여러 장(82). 2. 모달 원천 = M02 원본 vs 프로젝트 복사본. 3. 모달 카드 = 도면 + 면적산출 vs 도면만. 4. (f)(g) 덮어쓰기 ⓐ 빈칸만 · B05 와 같은 값은 저장 안 함(연동) ⓑ 고정 읽기 전용 ⓒ 처음 한 번만. 5. 표준값도 B05 설정에 묶을지 · 하상경사를 B06 실제 관 경사에서. 6. (a) 진행단계 판 가림 허용 · 카드 안 스크롤 vs 페이지 고정 높이. 7. 탭 기억. 8. 독립 기슭막이 지점 수리 표에서 뺄지. diff --git a/docs/raw/요구_1008_2/조사_L_CAD커서입력창.md b/docs/raw/요구_1008_2/조사_L_CAD커서입력창.md new file mode 100644 index 000000000..3dbe55039 --- /dev/null +++ b/docs/raw/요구_1008_2/조사_L_CAD커서입력창.md @@ -0,0 +1,34 @@ +# 조사 L — CAD 커서 따라다니는 입력창 · Space (10-8 오후 · 읽기 전용 조사 원문) + +결정은 `분석_정함.md` 가 앞섬. CAD = `B07_DesignDetail/openwebcad/src`. +요약: 입력창은 HTML/CSS 가 아니라 캔버스에 직접 그림 → (a)(b) 뿌리 같음(칸 · 글이 테마에 따라 같은 색으로 바뀌고 글 세로 자리도 칸 아래로 어긋남) · (c) Space 전용 처리 없어 공백 글자로 들어감 · 빈 Enter 「직전 명령 반복」은 함수만 있고 부르는 곳 없음. + +## 1. 입력창 위치 · 색(a) +- 매 프레임 `helpers/draw.ts:73-76` → `inputController/input-controller.ts:129-174 draw()`(객체 `main.tsx:168`) · 칸 133-141 커서 오른쪽 아래 20px · 150×20(`App.consts.ts:165 · 170 · 175`) · 입력 글 144-157(12px) · 안내 · 좌표 · 명령 후보 665-689(`'#999'`). +- 색은 `fillRectScreen` · `drawTextScreen` 안에서 무조건 `paintColor`(`drawControllers/screenCanvas.drawController.ts:680 · 599`) · 자동색(#000000 · #ffffff · #f5f7fa)은 어두움 = 흰색 · 밝음 = 검정(`theme.ts:97-99`) · 부모 테마 전달은 정상(`app_shell.ts:40` frd_theme · `theme.ts:43-52`). +- 안 보이는 조합: 칸 `'#000000'`(`App.consts.ts:181`) · 글 `'#FFF'`(186) 둘 다 자동색 → 어두움 = 흰 칸 흰 글 · 밝음 = 검정 칸 검정 글(`resources/tester/cad/theme-auto-color.test.ts` 25 · 27 · 34 · 35 단언이 이 값) · 생긴 때 = 커밋 `44a6ec51d`(09-28 칸 `'#161616'` → `'#000000'`) · `App.consts.ts:179` 주석은 실제와 반대. +- 목록 글 `'#999'` 는 읽히나 바탕 없어 도면 선과 겹침. +- 고칠 자리: `input-controller.ts` draw() 색 · `screenCanvas.drawController.ts` 에 `paintColor` 건너뛰는 선택 인자 · `App.consts.ts` 상수 · 주석 · 재사용 `themeColor()`(`theme.ts:55` · `clear()` 371 이 씀) · 토큰은 명령줄 후보 상자(`App.css:617-629`)와 같게 `--cad-chrome-raised`(밝음 #ffffff · 어두움 #251f38) · `--cad-line` · `--cad-text`(#333 / #e4e0f0) · `--cad-text-dim`. +- 주의: 토큰 값을 그대로 넘기면 밝음에서 #ffffff 칸이 `paintColor` 로 다시 검정 → 건너뛰기 필수 · 상수 하나씩으론 두 테마 다 맞는 쌍 없음 · 차선 = 칸 `'#161616'` + 글 휘도 0.58 이하(예 `'#909090'`) → 두 테마 대비 약 5.7:1 · 밝음에서도 칸 어두움. 크기: 작음. + +## 2. 단축키 글이 칸 밖(b) +- 세로: 칸은 커서 아래 20~40px(137) · 글 중심은 커서 아래 42px(149 `-OFFSET-HEIGHT-2` · `textBaseline 'middle'` 600) → 글 중심이 칸 아래 변보다 2px 밑 → 12px 대문자(494 대문자 변환)의 약 2/3 가 칸 밖 · 칸과 글이 같은 색이라 삐져나온 부분만 보임 · 글자 18 → 12px 커밋 `b4a653e68` 뒤 더 드러남(추정). +- 가로: 칸 폭 150px 고정 · 글 폭 안 잼(src 에 `measureText` 없음) → 긴 좌표 · 한글 넘침 · 후보 「LINE (L) 선」(`registry.ts:134` · 최대 6개 518) · 안내 · 좌표는 칸 아래 바탕 없이(672-673) · 폭 제한 없음. +- 고칠 자리: `input-controller.ts` draw() · `drawListBelowInputField` — 글 y 를 칸 가운데 `-OFFSET-HEIGHT/2` · 칸 폭 = max(150, 가장 긴 줄 폭 + 여백) · 입력 글과 목록을 바탕 한 장 안 · 글 폭은 `screenCanvas.drawController.ts` 에 `measureText` 감싼 메서드 · 재사용 명령줄 후보 상자 모양(`App.css:617-638` min-width 220) · `registry.ts` 는 다른 창 고치는 중 → 읽기만. 크기: 작음~중간. + +## 3. 키 처리 · Space(c) +- 문서 keydown = `handleKeyStroke`(`input-controller.ts:394-496`) — input · textarea · select 키 건너뜀(396 · IME 받개 예외) · IME 조합 건너뜀(399) · 나머지 기본 동작 막음(444) · Enter(474-477) → `handleEnterKey`(521-643 · 빈 입력이면 활성 도구에 ENTER 525-541 · 문자 단계면 TEXT_INPUT · 아니면 명령 · 숫자 · 좌표) · 우클릭(183-188)도 같은 함수 · Esc(471-473) → `handleEscapeKey`(498-511 · 선택 해제 → 도구 취소 → 글 지움) · 명령줄 Esc `components/CommandLine.tsx:57-60`. +- Space 전용 처리 없음 → 일반 글자 가지(490-495) `text += ' '` → 「L␣」 실행 안 됨 · 빈 Space 는 공백만 쌓임 · 명령줄 입력칸(`CommandLine.tsx:50-77`)에서 Space = 띄어쓰기 · 빈 Enter 는 `handleEnterKey`(21) · 주석 「직전 명령 반복」이나 실제 반복 없음 · `repeatLastCommand`(`commands/run-command.ts:63-70`) 부르는 곳 0 · 빈 Enter 는 선택 도구 끝냈다 다시 세우기만(`tools/select-tool.ts:70-71`). +- 고칠 자리: `input-controller.ts` 490 앞 · 399 IME 가드 뒤에 Space 가지(Space · 수정키 없음 · 길게 누른 반복 아님 · 자유 글 단계 아님 → Enter 와 같음) · `handleEnterKey` 빈 입력 가지 — 선택 도구 대기(`WAITING_FOR_FIRST_SELECT_POINT`)면 `repeatLastCommand()` · `CommandLine.tsx` onKeyDown 56 IME 가드 뒤 — Space 면 기본 동작 막고 `form.requestSubmit()` · 판정 함수는 `inputController/ime-sink.ts` `activeToolAcceptsText`(13-16) 옆. +- 글 입력 상태 판정: 기존 `activeToolAcceptsText()` 는 너무 넓음(숫자 단계 `tools/factories/sequence-tool.ts:289-294` OFFSET 거리 · FILLET 반지름 · 키워드 단계 `array-tool.ts:150` 에서도 참) → 권장 `sequence-tool.ts:334` meta 에 `kind: step.kind` 한 줄 · `getMeta()` 로 `kind === 'text'` 인지(`state.ts:298` 꼴) · 'text' 단계 = TEXT · MTEXT · DDEDIT · FIND(`text-tools.ts:44 · 57 · 71 · 88-90`) · 표 칸(`table-tools.ts:100`) · 지시선(`leader-table-tools.ts:25`) · 도면층 상태 이름(`layer-tools.ts:157 · 167`) · 색 · 선종류 · 해치 패턴 · QSELECT 키워드형도 'text' → Space = 띄어쓰기로 남음(Enter 로 확정 · 해 없음). +- 주의: IME 조합 중 Space 는 399 에서 먼저 빠짐 · IME 띄어쓰기는 input 사건(`ime-sink.ts:51-55` · 시험 `ime-sink.test.ts:23-25`) → 새 가지는 399 뒤 · 윈도 한글 IME Shift+Space(한/영) · Ctrl+Space → 수정키 Space 제외 · 길게 누름 제외 · 화면 입력칸(LayerManager · PropertiesEditor)은 396 에서 빠짐 · 우클릭도 `handleEnterKey` → 반복을 그 안에 넣으면 빈 우클릭 = 반복(미결 3) · `components/Button.tsx:56-59` keyup Space/Enter onClick → 포커스 남으면 반복 + 단추 겹침(지금 Enter 도 같음) · `sequence-tool.ts` 는 tools 아래(다른 창 겹칠 수 있음 · meta 한 줄만) · 범위 밖: 494 대문자 변환으로 TEXT · MTEXT 영문이 대문자 · `keyboard-handler.ts:5` 의 `'Space'` 는 절대 안 맞음(`' '` 이어야). 크기: 중간. + +## 4. 시험 · 겹침 +- `resources/tester/cad/theme-auto-color.test.ts` 「칸 · 글 색이 두 테마 모두 달라야」 단언 자리(`node --experimental-strip-types`) · `inputController/ime-sink.test.ts:36-48` InputController + `handleKeyStroke` 직접 부르는 틀(Space = Enter · 자유 글 띄어쓰기 · 조합 중 Space) · `screenCanvas.drawController.test.ts:9-21` recordingContext(「글 중심이 칸 안」) · 동적 입력 · Space 시험 없음. +- 겹침: 고칠 파일(`input-controller.ts` · `ime-sink.ts` · `CommandLine.tsx` · `screenCanvas.drawController.ts` · `App.consts.ts` · `run-command.ts`)은 다른 창 목록과 안 겹침 · `main.tsx` · `registry.ts` 는 읽기만. + +## 미결(조사자 제시) +1. 칸 색: 테마 따름(밝음 흰 칸 + 테두리 · 어두움 #251f38) vs 두 테마 공통 어두운 칸(상수 2개). +2. 단축키 후보 목록 바탕 안에 · 몇 줄(지금 6). +3. 빈 우클릭도 마지막 명령 반복(오토캐드 기본은 바로가기 메뉴) vs 키보드만. +4. 키워드형 'text' 단계(색 · 선종류 · 패턴 · QSELECT)도 Space = 확정.