- `docs/` 를 .gitignore 에서 빼 git 추적 대상으로 전환 (위키·완료 이력·검증 기록) - `docs/raw/PLAN.md` · `docs/raw/OWNERS.md` 를 저장소 최상위로 이동 후 .gitignore 에 등록 — 창끼리 공유하되 저장소에는 안 올리는 장부 - 살아 있는 경로 참조 7개 파일 정정 (아카이브 107건은 그때 사실이라 그대로 둠) - graphify 날짜별 산출물(`docs/wiki/graphify-out/20*/`) 제외 — `graphify update` 가 다시 만듦 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
38 KiB
상시 계획서
운영 원칙
- 작업 목록: 남은 일을 한 곳에 둔다 — 착수 전·진행 중을 나누지 않는다(2026-09-06 사용자 지시. 구분이 모호해 통합).
- 지금 손대는 것은 체크 진행 상태로 알 수 있으므로 별도 구획을 두지 않는다. 착수하지 않기로 한 것만 맨 아래 보류에 둔다.
- 참고: 코드 작업 중 필요한 기준표·확정사항만 둔다.
- 완료 항목은 사용자 검증 또는 교차검증 후
docs/raw/plans/와docs/raw/verification/으로 이관한다.- 담당은 적지 않는다 — 어느 창·폴더가 맡을지는 그때그때 정한다.
- 작성방법 — 짧고 이해하기 쉽게, 문단의 종료 시점 전까지 줄바꿈금지.
작업 목록
2026-09-04 현재 — 미완료 체크 21건. 완료 구현과 자체검증 원문은
docs/raw/plans/2026-09-04_plan_snapshot_before_cleanup.md및 같은 날짜의 완료 아카이브 3개에 보존했다. 이 문서에는 남은 작업과 보류 항목만 유지한다.
B05↔B06 이동 지연 — 캐시·세션 일원화로 흡수 (2026-09-06 사용자 지시)
옛 내용(원인 조사·손댈 자리·체크리스트)은 삭제함. 원인이 한 페이지처럼 쓸 캐시가 없어서이므로 「B05·B06 캐시·세션 일원화」에서 함께 풂. 속도 목표만 여기 남김.
- 자체검증 — B06→B05 이동에서 서버 요청 없이 화면이 서는지, 마지막 응답 1.5초 이하·요청 10건 이하인지 수치로 확인.
구조물 측점 누가거리 정본 일원화 — 남은 작업
저장 정밀도와 화면 정본 맞춤 완료분은 정리 전 원문 스냅샷에 보존했다.
- 겹치면 구조물 측점만 남긴다.
- 그래프 측점 목록에서 구조물 측점과 0.1m 안에 겹치는 규칙 측점을 제외한다.
- 구조물 측점의 측점 번호 라벨이 그대로 읽히는지 실화면으로 확인한다.
- 그래프·3D·사이드바 선택과 측점 테이블 열이 구조물 측점 ID로 이어지는지 확인한다.
- 같은 규칙을 공용 렌더러를 쓰는 B06 종단에도 적용할지 확인한다.
B05 초기화 범위 확대 — 실경로 검증
배수유역 스냅샷 범위 확대·옛 스냅샷 호환·3D 코리도 보존 구현과 단위검증은 정리 전 원문 스냅샷에 보존했다.
- 파일입력부터 자동설계 체인이 새로 도는 프로젝트에서 확대된 초기 스냅샷 범위를 실화면으로 확인한다. 기존 프로젝트 초기값을 버리고 다시 촬영해야 한다면 먼저 사용자 지시를 받는다.
B05 3D 구조물 선택이 B06 횡단도에 안 뜬다 (2026-09-05 사용자 지시)
넘김 자체는 서 있다 — 3D 클릭이 aislo:structure-pick:{프로젝트} 세션 한 칸에 {측점, 부재키}를 적고(B05_Profile_UI_Page.ts의 wireStructurePick), B06 진입 때 그 값으로 카드를 열게 돼 있다(B06_Section_UI_Page_Structure_Pick.ts). 실제로는 안 열린다. 의심 지점은 세 곳이다.
① 측점 대조 허용오차가 0.01m로 좁다 — 3D가 준 누가거리가 소수점 아래에서 조금만 달라도 그 측점을 못 찾고 조용히 끝난다. 같은 파일의 다른 대조는 0.05m를 쓴다.
② 목록·폼에서 고르는 길(B05_Profile_UI_Page.ts의 onPipeFacilitySelect)이 같은 칸에 측점만 적어 부재키를 지운다 — 3D로 고른 직후 선택 동기화가 이 길을 타면 카드는 열려도 조정창이 안 열린다.
③ 복원이 진입당 한 번(pickRestored 빗장)인데, 부르는 곳이 둘(구조물 패널 적재 뒤 · 횡단 그림 그린 뒤)이라 이른 쪽이 빗장을 걸어 늦게 온 자료로는 다시 안 돈다.
두 화면은 한 페이지처럼 움직여야 하므로 선택·하이라이트 연결선을 끊지 않게 조심할 것.
- 실화면에서 3D 구조물을 클릭한 뒤 세션 칸에 무엇이 적히는지 수치로 확인한다.
- B06 진입 때 그 값이 어느 단계에서 버려지는지 짚는다.
- 고친 뒤 반대 방향(B06에서 고르고 B05로 이동)도 그대로인지 확인한다.
- 3D·종단 그래프·좌측 목록·배수유역도 하이라이트가 예전처럼 한 줄로 움직이는지 확인한다.
B07 도각 외부 파일 불러오기 (2026-09-05 사용자 지시)
지금은 도각을 캐드 화면에서 직접 고쳐 회사 도각으로 저장하는 길만 있다(B07_DesignDetail_UI_FrameEdit.ts → 회사 도각 storage/{회사}/templates/, 프로그램 기본 도각은 resources/template_2dDrawing/00_template_A1.json). 여기에 외부 파일 불러오기를 더한다. 불러온 도각의 내부 요소는 프로그램 값과 자동으로 이어져 배치되며, 사용자가 자리를 조정할 수 있고, 선택하면 회색 외곽선이 뜬다.
확인 결과 — 지금 코드에 도면 파일을 읽는 부분이 하나도 없다(dwg·dxf 읽기 라이브러리 미설치). 도면은 전부 프로그램이 JSON으로 만들어 낸다. 그래서 이 작업은 새 입구를 하나 여는 일이다. 그리고 DWG는 비공개 형식이라 파이썬이 바로 못 읽는다 — 외부 변환기(ODA File Converter)를 끼워 DXF로 바꿔 읽거나, 처음부터 DXF로 받는 두 갈래뿐이다.
- 파일 형식 확정 — 변환기 설치를 감수하고 DWG를 받을지, DXF만 받을지 사용자와 정한다.
- 읽은 도면 요소를 지금 도각 JSON 모양(
B07_DesignDetail_Engine_Template.py가 쓰는 형식)으로 옮기는 변환을 만든다. - 불러온 도각을 회사 도각 저장 경로에 얹는 흐름을 잇는다.
- 내부 요소(표제란 칸·문자)와 프로그램 값의 자동 연계 규칙을 정한다.
- 요소 선택 시 회색 외곽선 표시.
- 실화면 확인 — 불러오기 → 자동배치 → 조정 → 저장 → 다음 도면에 반영.
B05/B06 700줄 제한 분리 — 남은 확인
15개 분리와 초과 파일 0건 결과는 docs/raw/plans/2026-09-04_plan_700line_split.md에 보존했다.
- B04 배수유역 라우터 쓰기 경로는 다음 재분석 시 분리 전과 결과가 같은지 확인한다.
초기값 보전 후속
- 새 프로젝트 업로드 때
initial_design.lock동안 B05 진입이 B11 준비 화면으로 이동하고 체인 종료 후 자동으로 넘어가는지 실측한다. - 노선 경로 변경을 전체 재계산으로 분리하고 별도 모달·진행 표시·
route_signature게이트를 설계한다.
B06 횡단·수량 후속
- 3D 코리도 스윕과 저장·확정·새로고침에서
extra_spans단별 구간값을 확인한다. - 자동 자리에서 좌우 이동이 적용되지 않는 측점의 지형·배치 한계를 분리한다.
- 불규칙 측점 생성 시점을 정본화한다. 파일 업로드 직후 자동연산은 저장하고, 사용자 직접 추가는 캐시에 둔 뒤 임시저장·확정 때 정본화한다.
라이다 다중 파일 입력·대용량 처리
- 드론 라이다 프로그램의 병합 가능 여부를 확인한 뒤 용량 대책을 합의하고 별도 계획을 수립한다. 평상시 2장 30GB 미만, 최대 3장 50GB 미만이며 노선 버퍼 클리핑 없이 병합 전체 범위를 전처리한다는 현 방침을 유지한다.
구조물 절·성토 면적 반영 (2026-09-05 사용자 착수 지시)
보류를 푼다. 지금 면적은 구조물이 없다고 보고 낸 값이고, 그 뒤 구조물이 들어오면 면적이 갱신돼야 한다. 상세 원인·실측값은 정리 전 원문 스냅샷에 보존했다.
코드 확인 결과 (2026-09-05) — 면적은 지반선과 설계선의 차이만 사다리꼴로 적분한다(B06_Section_Engine_Areas.py ↔ common_util/common_util_cross_design_areas.ts, 두 벌 한 세트). 이 계산은 구조물이 있는지조차 모른다. 구조물 형상을 깎는 일은 3D 쪽에서만 하고 있다(B05_Profile_UI_Corridor_Carve.ts 등) — 그 결과가 면적으로 돌아오지 않는다. 그래서 「구조물이 먹은 만큼 면적을 고치는」 자리를 새로 만들어야 한다.
설계선을 세우는 B06_Section_Engine_Design.py가 이미 671줄이라 700줄 여유가 없다 — 새 로직은 별도 파일로 뺄 것.
- 구조물이 먹는 절·성토 면적을 빼는 기준을 정한다(기슭막이·BOX암거·세월교 각각).
- 구조물이 들어오거나 조정될 때 면적·수량·유토곡선이 따라 갱신되게 잇는다.
- 파이썬 계산과 브라우저 계산이 한 벌이므로 두 짝을 같이 고치고 거울 테스트(
tmp/tests/test_b06_cross_design_mirror.py)를 돌린다. - 실화면 확인 — 구조물 추가·조정 뒤 면적표와 유토곡선이 같이 움직이는지 수치로 확인한다.
B06 기슭막이 자동추가 (2026-09-05 사용자 지시)
지금 기슭막이는 두 갈래뿐이다 — ① 배수관·세월교·BOX암거에 딸린 벽(B06_Section_Engine_Culvert.py의 {측}_revet_* 옵션, 그 시설이 있어야만 생김) ② 사용자가 직접 넣은 독립 구조물(D군, structures.json). 스스로 생기는 길은 없다. 지형 조건이 맞는 측점에 자동으로 제안·배치되게 한다.
- 자동 배치 조건(성토 높이·계류 접함·비탈 기울기)을 지식DB 근거로 확정한다 — 임의 수치 금지. 교본에 「돌쌓기기슭막이 메쌓기 1:0.5」처럼 표준과 어긋나는 값이 있어(
03_미결_및_확인사항.md4번) 그 미결부터 정리해야 한다. - 넣는 자리는 D군 독립 구조물 정본(
structures.json)으로 잡는다 — 딸린 벽 쪽은 시설이 있어야 생기므로 자동추가에 못 쓴다. - 자동/후보/수동 구분 중 어느 것으로 낼지 정한다(후보=사용자 확정 뒤 반영).
- 자동분이 횡단도·3D·수량에 함께 서는지 확인한다.
- 「독립 기슭막이 자동화」(2026-09-05 지시)를 이 항목으로 합쳐 함께 처리 — 넣는 자리가 같은 D군 독립 구조물임.
B06 구조물 추가 가능 여부 — 조사 결과 (2026-09-05)
이미 가능하다. B06 좌측 「구조물 배치」는 B05와 같은 폼·목록 부품을 쓴다(B06_Section_UI_Page_Structures_Panel.ts → 공용 A00_Common/b_structures_section). B~G군 구조물의 추가·수정·삭제가 세션에 쌓였다가 [저장]·[확정]에서 정본에 들어간다. 다만 계곡 통과 시설(A군 — 배수관·세월교·BOX암거)은 표시·선택만 되고 "추가·삭제는 B05에서 하세요" 안내만 뜬다. 배수유역을 다시 나눠야 하기 때문이다.
- 실화면에서 B06 구조물 추가 → [저장] → 재진입까지 한 번 돌려 확인한다.
- A군도 B06에서 넣게 할지 사용자와 정한다(현재는 B05 전용).
B05·B06 캐시·세션 일원화 (2026-09-06 사용자 지시)
대전제 — B05와 B06은 한 페이지임. 두 화면은 같은 키를 읽고 쓰며, 페이지를 오갈 때는 캐시를 그대로 들고 이동해 다시 부르지 않음. 이 전제를 지키려면 어떤 값이 캐시로 움직이고 어떤 값이 즉시 서버로 가는지가 먼저 정의돼 있어야 함 — 그래서 이 작업이 필요함(2026-09-06 사용자).
같은 일을 여러 번 고쳤는데도 매번 판단이 갈림 — 규칙이 문서에 없고 읽고 쓰는 코드가 파일마다 흩어져 있기 때문임.
현황 조사 (2026-09-06)
- 세션 접근이 19개 파일 64곳, 키 이름이 네 갈래(
b05:,b06:,b05-route-,aislo:)로 제각각임. - 키가 페이지 이름으로 갈려 있음 — 같은 설계값인데
b05:…/b06:…로 나뉘어 두 화면이 서로의 값을 못 봄. (구조물 미저장분·유토곡선 범례처럼 이미 공유하는 키도 있어 규칙이 뒤섞임) - 계산 결과 보관이 거의 없음 — 횡단 상세는 메모리 캐시라 페이지를 떠나면 사라지고, B05 진입은 세션 캐시를 일부러 무시하고 DB를 다시 읽음(옛 노선번호 방지용 안전장치). 오갈 때마다 처음부터 다시 부르는 직접 원인임.
- 초안 범위가 제각각 — 프로젝트 단위와 프로젝트+노선 단위가 섞임.
- 초안 비우기가 파일마다 따로 있음.
- 통에 없는 성격이 하나 더 있음 — 페이지 간 넘김값(B05에서 고른 구조물을 B06으로 넘김). 세션에 임시로 얹혀 있음.
데이터를 네 통으로 나눔 (2026-09-06 사용자 확정)
| 통 | 무엇 | 어디에 | 언제 서버로 | 대상 |
|---|---|---|---|---|
| ① 화면 취향 | 패널 열림·높이, 보기 토글, 선택 상태 | 사용자 계정(+세션) | 바뀔 때 조용히 | 패널 접힘·높이, 유토곡선 범례, 테이블 열림 |
| ② 설계 초안 | 사용자가 만진 설계값 | 세션(초안) | [저장]·[확정] 때만 | 종단 계획선 · 횡단 · 구조물 · 배수유역 조작분 |
| ③ 즉시 반영 | 누르는 순간 다시 계산을 부르는 명령 | 안 쌓음 | 즉시 | 등고선 간격, 횡단 반폭 재생성, 노선 확정, 코리도 프리빌드 |
| ④ 계산 결과 | 서버·브라우저가 만들어 낸 값 | 세션·IndexedDB | 안 감(다시 계산) | 3D 코리도 · 유토곡선 · 배수유역 해석 결과 |
- ①은 계정에 붙임(2026-09-06 사용자 동의) — 다른 PC로 옮겨도 같은 배치로 열림.
- ②는 되돌릴 수 있어야 하고 [저장] 전에는 서버에 닿지 않음.
- ③은 되돌릴 조작이 아니라 「다시 계산해라」는 지시라 초안에 쌓을 값이 아님.
- ④는 저장 대상이 아님 — 입력(②·③)이 바뀌면 버리고 다시 만듦. 유토곡선·3D·배수유역 그림은 여기 속함. 사용자가 그 위에서 만진 값(관 위치·유역 나누기)은 ②로 감.
- 통이 정해지면 처리 방법이 따라옴. 새 기능은 이 표에 줄부터 넣고 코드를 씀.
- 실제 배분은 계획 반영 뒤 제어·리소스 현황을 보고 조정(사용자 지시) — 무거운 항목이 세션을 넘치면 ④를 IndexedDB로 내림.
기능마다 캐시냐 즉시냐 고를 수 있는가 — 됨 (조건 3개)
값마다 등록표에 통을 적어 두고 그 표만 보고 움직이게 만들면, 나중에 표 한 줄만 고쳐 캐시↔즉시를 바꿀 수 있음. 다만 아래 셋은 선택이 아니라 정해짐.
- 서버가 다시 계산해야 나오는 값(반폭 재생성·노선 확정 등)은 즉시밖에 안 됨 — 캐시에 담아 둘 값 자체가 없음.
- 식별자·판번호가 생기는 조작(구조물 새로 만들기 등)은 임시 식별자를 먼저 붙여야 캐시로 다룰 수 있음 — 지금 그렇게 돼 있음.
- 되돌리기·[초기화]가 걸리는 값은 캐시여야 함. 즉시로 두면 되돌릴 자리가 없음.
방법 (일원화 절차)
- 키 대장 만듦 — 지금 쓰는 세션 키 전부를 훑어 「키 · 통 · 소유 페이지 · 정본 위치」 표로 정리하고 이 계획서 참고 절에 둠. 분류가 애매한 키는 사용자에게 물어 확정.
- 그 대장을 코드에도 등록표로 둠 — 값마다 통을 한 줄로 적고, 저장·복원·비우기가 전부 그 표만 보고 움직이게 함(나중에 한 줄 고쳐 캐시↔즉시 전환).
- 화면 취향(①)을 계정에 저장하는 길을 냄 — 사용자별 화면 설정 저장·조회. 세션은 그 값의 사본으로 두고, 서버가 없으면 세션 값으로 동작.
- 세션 접근을 공용 파일 한 곳으로 모음 —
취향 읽기/쓰기,초안 읽기/쓰기, 키 만들기(프로젝트·노선 붙이기) 세 가지만 밖으로 냄. 다른 파일에서sessionStorage직접 호출 금지. - 키 이름 규칙 하나로 — 페이지 이름을 키에 넣지 않음.
aislo:{통}:{이름}:{프로젝트}[:{노선}]. ②·④는 두 페이지가 같은 키를 씀. 형식이 바뀌면 뒤에 판번호, 옛 키는 한 번 읽어 옮기고 지움. - 화면 취향(①)만 페이지별로 갈릴 수 있음 — 그 경우에도 키가 아니라 값 안에서 화면을 나눔.
- 이동할 때 다시 부르지 않음 — B05↔B06 이동은 캐시(②·④)를 그대로 들고 감. 진입은 캐시로 먼저 그리고 신선도 확인은 뒤에서. B05의 강제 새로읽기(
loadLatest(true))를 걷어내고 옛 노선번호는 지표면 서명으로 판정. - 페이지 간 넘김값(구조물 선택 등)은 ②의 한 자리로 흡수 — 별도 임시 키를 두지 않음.
- 초안은 한 덩어리 — B05·B06은 한 페이지이므로 프로젝트+노선당 초안 하나에 모음. [저장]은 그 덩어리를 훑어 한 번에 보냄(지금처럼 기능마다 따로 내보내지 않음).
- ③ 즉시 반영은 목록에 적힌 것만 허용 — 목록에 없는 즉시 저장은 금지(자동저장 금지, CLAUDE.md 5장).
- 초안을 비우는 자리도 한 곳으로 — [저장]·[확정]·[초기화]·노선 변경 뒤.
- 페이지 이동·새로고침 복원 경로를 그 한 곳으로 통일 — 지금 B05↔B06 이동 지연(1순위 항목)과 같은 뿌리임.
자체검증
- 조작 후 새로고침 — 조작값은 남고 서버 정본은 그대로.
- [저장] 후 — 초안이 비고 화면 값과 서버 값이 일치.
- B05에서 만진 값이 B06에서 그대로 보이고 [저장] 한 번에 함께 나감.
- 즉시 반영 목록 밖 호출이 없는지 코드 훑기로 확인.
뒤로 미룬 판단
- ②·④ 실제 배분은 구현 뒤 제어·리소스 현황을 보고 확정(2026-09-06 사용자).
- ③ 즉시 반영 목록에 더 넣을 것이 있는지도 그때 함께 봄.
계획노선 편집 — 예상노선을 바꿔 쓰는 길 (2026-09-06 사용자 지시)
지금 노선은 한 벌뿐이고 불변임. 실무는 두 벌임 — 사용자가 넣은 예상노선(원청, 불변)과 설계 과정에서 그것을 고쳐 만든 계획노선(정본). 계획노선을 만들 길을 새로 냄. 자동 제안 기능은 보류(뒤에 평면·종단·횡단·유토를 다 보고 제안하는 방식으로 붙임).
화면 — 좌측 패널에 버튼 하나, 누르면 큰 모달이 뜸(계산이 오래 걸려 신중히 하라는 뜻으로 모달을 씀).
- 모달 안에 수치지형 등고선 + 예상노선을 그림.
- 예상노선은 폴리라인이므로 선 성분 교차점마다 노드를 놓음.
- 노드를 옮기거나 새로 넣어 직선·곡선(R) 성분을 만들게 함.
- 고치는 동안 예상노선과 계획노선이 함께 보이게 함.
- [확인]을 누르면 배수유역·지표면 노선 투영·종단·횡단·유토곡선을 다시 계산해 보여 줌.
- 계산 도중 상태 표시와 취소 처리(오래 걸리는 작업).
데이터 — 노선을 세 벌로 나눠 보관해야 함.
- 업로드 원본(예상노선)은 그대로 두고, 계획노선을 따로 복사해 둠.
- 전처리·자동설계 체인이 계획노선 기준으로 돌게 함(지금은 원본 한 벌만 봄).
- 시공 단계의 설계변경 노선은 자리만 잡아 둠 — 설계 프로젝트 전체 완료 후 시공사에 넘긴 뒤 켜지는 기능이라 지금은 구조만 준비.
- 노선이 바뀌면 초기값 스냅샷·배수유역·구조물이 어디까지 다시 서는지 정하고, 되돌릴 길을 남김.
노선 자동탐색 — 사용 중단 (2026-09-06 사용자 확정)
지금 [최적 경로 계산]은 평면만 보고 노선을 정함. 실제 판단은 평면·종단·횡단·유토곡선을 함께 봐야 하므로 현재 방식은 불필요. 위 계획노선 편집이 그 자리를 대신함.
- 좌측 「경로 계산 설정」의 [최적 경로 계산] 입구를 내림(코드는 남기되 화면에서 뺌).
- 평면 최소곡선반경 법정표(설계속도·지형별 40→60/40 · 30→30/20 · 20→15/12)는 탐색 제약이 아니라 위반 표시 쪽으로 씀 — 원청 노선·계획노선 모두에 적용.
- 배향곡선(중심선 R 10m 미만)은 경고만 표시 — 자동 보정·차단 없음(2026-09-06 사용자 확정, 처리 방식은 뒤에 판단).
- 내각 155° 이상 곡선 생략 판정은 보류 — 넣을지 뒤에 정함.
B01 대시보드 권한·회사·프로젝트 연결 정비 (2026-09-06 사용자 협의)
확정 — ① 시스템 관리 회사는 개발사 자기 회사 한 곳뿐이며 새로 만들 일 없음. 그 회사 소속이면 역할을 고를 것 없이 전원 시스템관리자 ② 고객사는 회사 생성자가 회사관리자, 나머지는 일반사용자 ③ 타사 사용자 공유는 보류 ④ 도면에는 한 사람 이름만 나가되 설계 과정의 보조 인원은 여러 명일 수 있어 참여자 목록을 따로 둠.
1) 시스템 회사 자동 권한
시스템 회사 = .env 의 관리자 계정이 소속된 회사(현재 캐미팩토리). 표시 칸이나 설정 화면은 만들지 않음.
- 서버 시작 때 그 회사 소속 전원을 시스템관리자로 맞춤 (
main.py의 관리자 이메일 한 줄 옆). - 가입 승인·팀원 등록으로 그 회사에 들어오면 시스템관리자 부여, 다른 회사는 일반사용자 (
B01_Dashboard_Repository.pyprocess_join_request,_Repository_Members.py팀원 등록). - 회사에서 빠지면 일반사용자로 복귀 — 현행 그대로임을 확인만.
- 견본 계정·역할 칸은 그대로 둠 (2026-09-06 사용자 확정).
- 자체검증 — 소속 4명의 역할 변화를 DB 로 확인.
2) 회사 관리
- 회사 생성 모달에 중복 조회 — 사업자등록번호·회사명으로 기존 회사를 찾아 보이고, 있으면 「가입 신청」으로 유도.
- 입력 순서 = 사업자등록번호 > 회사명 > 대표자명 > 회사 로고 > 주소.
- 주소 입력 + 지도 미리보기 — 이미 쓰는 VWorld 키를 서버 경유로 재사용(새 지도 서비스 도입 없음).
- 회사 정보 수정 화면·API 신설 — 회사관리자는 자기 회사, 시스템관리자는 전체.
- 자체검증 — 같은 사업자번호로 생성 시도 시 안내가 뜨는지, 수정값이 도면 표제란·로고에 반영되는지 실화면 확인.
3) 사용자(팀원) 관리
- 「팀원 추가」를 계정 대신 만들기 → 소속 없는 기존 가입자 검색·선택 으로 교체. 다른 회사 소속자는 목록에서 제외. (지금은 임의 비밀번호로 계정을 만들어 당사자가 로그인 못 함)
- 아직 가입 안 한 사람은 안내 메일만 발송.
- 입력 순서 = 이름 > 직급 > 이메일 > 부서.
- 기본정보 폼과 사용자 수정 폼을 한 벌로 통일 (배치는 조절 가능).
- 회사관리자에게 역할 변경 허용 — 자기 회사 한정, 본인 강등 포함. 마지막 회사관리자 이탈 방지(
count_company_admins)는 유지, 시스템관리자는 전역 제어. - 비활성화·삭제 구현 — 회사관리자도 자기 회사 팀원 삭제까지 가능, 시스템관리자는 전역.
- 가입요청 반복 신청 방어 — 이미 소속이 있는 사용자가 「회사 찾기」로 재신청하면 지금은 소속이 풀리고 승인대기로 떨어짐(
B01_Dashboard_Repository.pyjoin_company). 소속자에게는 신청 자체를 막을 것. - 가입 요청 목록과 사용자 관리 목록의 중복 표시 정리.
- 자체검증 — 소속자가 재신청해도 소속 유지, 마지막 관리자 강등 거부, 권한 밖 호출은 백엔드가 403 인지 확인.
4) 프로젝트 권한·담당자
- 일반사용자도 회사 프로젝트 전체 열람(수정 불가) — 지금은 자기가 만든 것만 보임(
list_user_projects). - 회사관리자에게 자기 회사 프로젝트 삭제 허용 (지금은 시스템관리자만).
- 참여자 표 신설 — 프로젝트에 여러 명을 붙임. 만든 사람이 기본 참여자.
- 참여자면 일반사용자도 그 프로젝트 수정 가능 — 백엔드
_can_edit_project와 프론트 헬퍼를 같이 고침. - 도면 표제란 3역할(과업책임자·분야별책임자·설계자)은 각 1명 유지.
- 자체검증 — 일반사용자 계정으로 남의 프로젝트 열람 가능·수정 403, 참여자로 넣은 뒤 수정 성공을 실화면으로 확인.
5) 프로젝트 생성 화면 (B02)
- 취소 버튼 추가 — 대시보드로 복귀.
- 프로젝트명 자동 조합 — 사업연도 + 사업지역 + 임도종류 + 수기 입력값을 한 줄로 만들어 그대로 저장.
- 예상 연장 칸 삭제 — 대신 「노선 종료 누가거리(m)」 제목에 (종료 − 시작) 길이를 표기.
- 「연도 기번(표지)」·「사업량(표지)」 입력칸 삭제 — 위 두 값과 중복. 도면 표제란·표지는 프로젝트명·노선 연장에서 끌어 쓰게 잇고 B07 출력 영향 확인.
- 담당자 선택의 「+ 신규 등록…」 제거 — 계정 등록 후 고르는 길만 남김.
- 담당자 기본값 = 만든 사람.
- 자체검증 — 저장된 이름·연장·표제란 값이 도면에 그대로 나오는지 실화면 확인.
6) 대시보드 배치·문구
- 「시스템 로그」를 맨 아래로 — 지금은 기본정보·보안 칸이 그 뒤에 붙어 있음.
- 서명 고르는 칸 문구 정리 — 「○○에 물리기」·「올리고 선택」이 무슨 뜻인지 읽히게.
- 자체검증 — 실화면 스크린샷으로 순서·문구 확인.
2026-09-05 추가 지시 묶음 — 상세 계획 (2026-09-06 사용자 답변 반영)
「독립 기슭막이 자동화」는 위 「B06 기슭막이 자동추가」로 합침. 「B06 종단곡선도 제어」는 사용자 지시로 삭제.
A. 착수 가능
A-1. 유토곡선 초기 화면은 곡선만 — 토량분배 숨김 (B05·B06)
기본 켜짐 목록은 common_util/common_util_mass_haul.ts의 MASS_HAUL_DEFAULT_VISIBLE(횡단 곡선)에 토량분배 키를 더한 형태이고, 그 더하는 자리가 B05(B05_Profile_UI_Profile_MassHaul.ts)·B06(B06_Section_UI_Section_View_Panel.ts) 두 곳임. 세션 저장 키는 두 화면 공용.
- 두 파일의 기본 목록에서 토량분배를 뺌.
- 세션 저장 키 판(
b06:masshaul-visible-v4)을 올림 — 안 올리면 이미 켜 둔 브라우저가 옛 값을 그대로 씀. - 범례에서 켜면 평형선·운반 블록이 예전대로 나오는지 확인.
A-2. 종단 그래프 팬 이동 — 좌클릭 끌기·휠 버튼 끌기 (B05)
가로 이동이 이미 한 벌로 모여 있음(B05_Profile_UI_Profile_Wheel.ts). 여기에 끌기를 더하면 이것을 쓰는 세 곳(종단 그래프·유토곡선·측점 테이블)이 한 번에 같이 얻음.
- 같은 파일에 포인터 끌기 이동 추가 — 진행 중이던 관성 이동은 끌기 시작 시 중단.
- 그래프 위 조작 부품에서 시작한 끌기는 제외 — 계획고 편집 버튼(
.b05-profile-edit__btn)·구조물 표식(B05_Profile_UI_Structures_Marks.ts)이 좌클릭을 이미 씀. - 끌기와 클릭 구분 — 몇 px 넘게 움직인 뒤에만 이동으로 보고, 그 경우 클릭(측점 선택·선택 해제)은 취소.
- 끄는 동안 커서 모양 변경, 창 밖에서 손을 떼도 풀리게 함.
- 실화면 확인 — 세 곳 모두 끌리는지, 측점 선택·계획고 편집이 그대로인지.
A-3. 종단 테이블 행 정리 (B05) — 목적은 화면 자리 확보
지금 12행 = 구배 3행(L·H·S) + 측점값 7행 + 곡선 2행. 자리는 B05_Profile_UI_Profile_Table.ts 한 곳(SEGMENT_ROWS·buildStationRows).
- 뺄 6행 — 구배 L, 구배 H, 절토고, 성토고, 누가거리, 거리.
- 남길 6행 — 구배 S, 계획고, 지반고, 측점(사용자 확정: 유지), 곡선 L, 곡선 R.
- B07 도면 종단도는 현행 12행 유지 — 도면 표는 별도 코드(
B07_DesignDetail_Engine_Cad_Table.py)라 이 변경이 닿지 않음을 확인만 함(코드 확인 완료, 실제 도면 출력으로 재확인). - 행이 줄어든 만큼 그래프가 넓게 쓰이는지, 글자 크기·높이가 자동으로 맞는지 실화면 확인.
A-4. 유토곡선 최종 누가량을 종단 상단줄로 (B05)
지금 요약 막대(절토·성토·잉여/부족·최종 누가토량·운반·검산)는 유토곡선 오버레이 안에 있어 패널을 접으면 사라짐. 계획선을 만지며 봐야 하는 값이므로 종단 상단줄로 올림.
- 종단 상단줄(
B05_Profile_UI_Profile_Balance.ts)의 「최대 기울기」 오른쪽에 최종 누가토량 항목 추가 — 값 출처는 유토곡선 계산 결과(result.points마지막 누계)이며 토량분배 켜짐과 무관하게 나옴(A-1과 충돌 없음). - 유토곡선 오버레이의 요약 막대 행 삭제.
- 삭제되는 나머지 값(절토·성토·잉여/부족·운반·검산)은 새 항목의 툴팁으로 내림 — 지금 요약 막대가 세부 내역을 툴팁에 두는 방식과 같음.
- 종단 상단줄 높이를 조금 높임(값이 한 줄에 들어오게).
- 유토곡선 펼침 손잡이를 오버레이 형태로 바꿈(그래프 자리를 먹지 않게).
- 요약 막대·손잡이가 비운 만큼 유토곡선 그래프 상하 높이를 넓게 씀.
- B06 화면의 요약 막대는 그대로 둠(같은 공용 함수를 쓰므로 B05 쪽만 떼어 내게 손댈 것).
- 실화면 확인 — 유토곡선을 접은 상태에서도 누가량이 보이는지, 계획선을 고치면 값이 따라 바뀌는지 수치로 확인.
A-5. 기슭막이 연동 해제 시 높이도 분리 (B06)
지금 연동 해제는 위치(4축 조작값)만 그 측점 것으로 갈림. 높이는 두 곳에서 오는데 ⓐ 구조물 옵션에 저장된 높이(연동 구간 공용) ⓑ 측점별 조정값 — 해제해도 그 측점에서 높이를 직접 만지기 전에는 ⓐ를 계속 따라감(B06_Section_UI_Cross_Culvert_Wire.ts의 detachedAdjusts, B06_Section_UI_Cross_Culvert_Const.ts의 revetWallSpec).
- 연동을 푸는 그 순간의 실제 높이를 그 측점 값으로 굳힘 — 값이 튀지 않으면서 이후에는 따로 놀게 함.
- 다단(추가 기슭막이) 높이도 같은 규칙으로 분리.
- 2026-08-30 확정(「해제는 분리가 아니다」)은 단 수·형태에는 그대로 유지 — 해제해도 다단이 통째로 사라지던 옛 문제가 되살아나지 않는지 확인.
- 실화면 확인 — 연동 해제 후 소유 측점 높이를 바꿔도 해제한 측점이 안 따라가는지, 그 반대도 확인.
A-6. 곡선부 노폭 자동 확폭 (평면 R 기준) — 새 기능
노폭 = 도로 중심의 차도 폭(노견 아님). 지금 코드에 곡선부 확폭이 없음 — 차도 폭은 규격 프리셋 상수 하나로 전 측점 동일(B06_Section_Engine_Design.py의 road_width_m). 기존 「노폭 연장」은 기슭막이가 밖으로 나간 만큼 노견이 따라 늘어나는 별개 계산임.
근거 (2026-09-06 지식DB·실무 원본 확인)
- 법령(별표2 Ⅰ.2.나.(4) =
평면선형.md§3) — 확폭량은 평면 곡선반경 R 로만 정해지며 표값은 하한:
| R(m) | 10~13 | 13~14 | 14~15 | 15~18 | 18~20 | 20~25 | 25~30 | 30~40 | 40~45 | 45 이상 |
|---|---|---|---|---|---|---|---|---|---|---|
| 확폭(m) | 2.25 | 2.00 | 1.75 | 1.50 | 1.25 | 1.00 | 0.75 | 0.50 | 0.25 | 없음 |
- 유효너비 3.5m 이상이고 확폭 구간은 최대 5m까지. 배향곡선지는 8m 이상.
- 실무 원본 대조 — 울진·대흥 2공구 수량서 「확폭」 시트: IP별 R → 표값 W 그대로, 면적 = ((L1+L2)/2)×W 사다리꼴이고 전이는 양끝 각 10m. 울진·소광 「포장확폭」 시트: 측점별 확폭폭 × 구간거리 로 면적 산출. 대피소는 두 곳 모두 별도 줄로 측점 범위·면적 직접 입력.
확정 사항 (2026-09-06 사용자)
-
확폭 방향 = 곡선 바깥쪽 편측 — 회전 시 차량이 밀리는 쪽 기준. (참고: 일반 도로설계기준은 후륜 내륜차로 안쪽 확폭이며, 임도 법령·교본에는 방향 규정이 없음. 도면 실물로 재확인할 여지 있음)
-
전이 = 양끝 각 10m 테이퍼, 확폭 유지 구간은 곡선 구간(BC~EC). 측점별 확폭폭을 갖는 방식으로 넣으면 실무 사다리꼴과 같은 결과가 됨.
-
측점마다 평면 R을 구해 횡단 자료에 실음 — 횡단 생성이 이미 노선 폴리라인을 읽으므로 그 자리에서 계산(기존 외접원 반경 함수 재사용).
-
위 표로 확폭량 W 를 정함(경계는 「이상~미만」, 45m 이상 없음, 표값은 하한).
-
곡선 구간 앞뒤 10m 테이퍼로 확폭폭을 0→W→0 으로 잇고, 측점별 값으로 저장.
-
차도 폭 = 규격 폭 + 확폭(바깥쪽 편측)으로 측점별 적용 — 노견·측구·사면은 그 바깥에 그대로 밀림.
-
확폭 뒤 유효너비가 5m를 넘지 않게 제한하고, 넘으면 경고 표시.
-
횡단도에 노폭 값 라벨 표시(확폭 걸린 측점을 눈으로 확인 가능하게).
-
3D 코리도·수량(포장·혼합석 면적, 토공)에 늘어난 폭 반영 — 포장 수량 기준은 「3.0m + 곡선부 확폭」(
노면_콘크리트포장.md). -
대피소·차돌림곳은 이 자동계산에서 제외 — 실무처럼 별도 구간 입력으로 남김(별도 항목으로 다룰지 뒤에 정함).
-
파이썬·브라우저 두 벌 계산이 한 세트이므로 같이 고치고 거울 테스트를 돌림.
-
실화면 확인 — R이 작은 측점의 확폭 값·그림이 표와 맞는지, 테이퍼가 이어지는지 수치로 확인.
B. 조사·수리 (버그)
B-1. 연계(추가) 기슭막이가 성토사면과 만나는 자리 안 맞음 · 노견 확장 없음 (B06)
확인 결과 — 노견을 밖으로 늘리는 계산(B06_Section_UI_Cross_Culvert_Solve.ts의 fillSlopeOf)은 배관 기준벽(유입·유출)에만 걸림. 추가 기슭막이(다단)는 B06_Section_UI_Cross_Culvert_Extra.ts가 따로 세우며 그 길을 타지 않음.
- 실화면에서 증상을 재현하고 어긋난 거리를 수치로 잼.
- 원인이 「추가 벽이 노견 확장을 안 받아서」인지 「성토부선 시작점이 다른 자리라서」인지 가름.
- 고침 — 추가 벽도 같은 노폭 연장 규칙을 타게 하거나 접점을 기준벽과 같은 식으로 맞춤.
- 3D 코리도(노견 리본)와 횡단도가 같은 값을 그리는지 확인.
- 수량(면적)에도 늘어난 노견이 반영되는지 확인.
B-2. 3D 탑뷰에서 노선 선이 끊겨 보임 — 원인 확정 (2026-09-06 실측)
원인은 노선 선의 해상도임(사용자 추정과 일치). 3D 노선 선은 노선 폴리라인 정점을 그대로 이어 그리고 지형 위로 0.35m만 띄움(B05_Profile_UI_Markers.ts). 실측 — 정점 간격 중앙값 10.0m(점 500개, S자유역검증). 10m 현이 볼록한 능선을 가로지르면 0.35m 띄움으로는 모자라 선이 지면 아래로 잠기고, 그 구간만 안 보여 폴리라인이 끊긴 것처럼 보임. 화면에서 161+0.0~163+0.0 구간이 통째로 사라지는 것을 확인함.
- 고침 방향 셋 중 택일 — ① 선을 1~2m 간격으로 다시 뽑아 각 점의 지형고를 찍음(형상도 매끄러워짐) ② 띄움 높이를 키움(임시방편, 비스듬한 시점에서 뜬 선이 보임) ③ 깊이검사를 꺼 항상 위에 그림(지형에 가려지지 않으나 뒤쪽 선도 비침).
- 고른 방식으로 고친 뒤 같은 구간(161+0.0~163+0.0)에서 선이 이어지는지 화면으로 확인.
- 코리도 투영 커브(빨간 선)도 같은 문제인지 확인 — 그쪽 띄움은 0.02m 로 더 작음.
C. 보류
- 타사 사용자에게 프로젝트 공유 — 2026-09-06 사용자 보류. 회사 밖 사람에게 열람·참여를 여는 길은 당분간 만들지 않음.
- 구조물 명칭 조정 — 바꿀 이름 목록 미정. 정본은
B05_Profile/B05_Profile_Structure_Types.json한 곳이라 목록만 받으면 두 화면이 같이 따라옴.
참고
구조물 구현 기준
- 상세 타입·옵션 정본:
B05_Profile/B05_Profile_Structure_Types.json. - 배수관 정본:
pipe_points.json; 일반 구조물 정본:structures.json. - B05·B06은 같은 프론트 캐시와 백엔드 데이터를 사용한다.
- 점형=측점 1개, 구간형=시점~종점, 부지형=위치+면적.
- 자동=프로그램 산출, 후보=제안 후 사용자 확정, 수동=직접 추가.
- A8 집수정은 A1 배수관 유입부 옵션이며 단독 구조물이 아니다.
- 교량(A5)과 생태연못(F2)은 임도에서 사용하지 않는다.
- B·F·G군은 B05 선택지에서 제외하고 필요한 항목만 B06에서 사용한다.
- 기술 근거·수치는
resources/knowledge/technical_info/01_임도/를 우선한다.
계곡 통과 시설 선정
| 조건 | 시설 |
|---|---|
| 소계류, 횡단경사 30% 이하, 종단 3~5% 조정 가능 | 물넘이 또는 세월교 우선 검토 |
| 계곡 횡단경사 30% 초과 | 배수관 Ø800 이상; 800→1000→1200→1500 순 검토 |
| 수리계산 Ø1,500 초과, 협곡, 횡단경사 40% 이하 | BOX암거 검토 |
| 배수관 2련 이상 필요 | 물넘이 재검토 |
| 하천 또는 3차수 이상 계곡 | 세월교 검토 |
설계유량은 Qd = 2.0 × Q와 Manning 통수능으로 판단한다. 관경은 유량으로, 집수정·기슭막이 등 부속은 지형과 배치 위치로 정한다.