- `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>
27 KiB
2026-09-01 상시 계획서 완료 체크 항목 추가 이관
원본: docs/raw/PLAN.md. 혼합 섹션에 남아 있던 완료 체크 블록을 원문 그대로 이관했다.
검증: docs/raw/verification/2026-09-01_verify_remaining_checked_items.md
노선 원천 일원화 + 도엽 서피스 온디맨드 (2026-09-01 신규)
③ 트림된 지점이 종점
feat/b03-route-shapefile병합 (e4b85976) — shapefile 노선·PRJ 2벌·좌표계 짝 선택
LAS 없는 설계 — 곡선 경고 판정 후속
-
곡선 경고 표시가 검사 간격에 따라 나타났다 사라지는 문제를 확정한다.(현행 유지로 확정, 원청에서 공급하는 계획노선 데이터는 라운드 문제가 없으며 향후 특수한 경우인 계획노선 변경을 위해 필요한 기능임.)
- 같은 평면 노선에서도
curve_check_step = max(2×target_res, 4.0)때문에 LAS는 4.376m, 도엽은 4.000m 간격으로 검사한다. - 4.376m에서는 위반 표본이 한 점짜리 9건이라 화면에 안 보이고, 4.000m에서는 연속 위반 2건이 되어 빨간 구가 보인다.
- 검사 간격별 최소 R은 2.61m→2.59m, 4m→5.69m, 8m→9.93m, 10m→13.33m, 15m→17.64m로 변해 정점 잡음을 곡률로 읽은 가짜 경고로 판정됐다.
- 결정 후보: 검사 간격 10m 고정(권장), 정식 IP/R 데이터 수령 후 제원 R 직접 검사.
- 경고 자체 제거는 최소곡선반지름 규칙 검사를 잃으므로 권장하지 않는다.
- 같은 평면 노선에서도
-
라이다 서피스와 도엽등고선 서피스의 좌표가 어긋나는지 조사한다 (2026-08-31).
- 자체검증: 저장소 산출물 직접 대조 (구조물검증-LAS
2f940d8a· 구조물검증-도엽325f57d9).- 좌표계: 두 프로젝트 PRJ 모두
KGD2002 / East Belt 2010, 계획노선 CSVcrs_epsg 5187, 도엽 9매 인덱스 crs 전부EPSG:5187(zip 내부 PRJ도 동일 — 오라벨 없음).vworld_*_meta.json경계값이 두 프로젝트 소수점까지 같다. 좌표계 불일치 없음. - XY 정합: 라이다 지반점 50만 개를 도엽 격자에 대응시켜 ±40m 격자 탐색 — 최적 이동 dx 0m / dy −10m (RMS 2.95→2.53m). 도엽 등고선 정점 815,471개 대조도 dx 0 / dy +4m. 계통적 어긋남 없음.
- 표고차: 평균 +1.17m, 중앙 +0.51m, σ 2.79m, 1m 이내 60.8% · 5m 이내 92.5%.
- 노선 종단 대조: 노선 CSV z − 라이다 z = 평균 −0.08m, σ 0.12m (노선을 라이다 위에 그은 자료임이 수치로 확인됨). 노선 CSV z − 도엽 서피스 z = 평균 +2.37m, 최대 +13.40m.
- 결론: 앞 240m는 두 서피스가 붙고 끝 110m 한 구역만 갈린다
(x 183,720
183,770 / y 489,426489,476, 25m 셀 137개 중 13%가 5m 이상 차이). 그 자리 도엽 최근접 등고선은 7.9m 거리에 530m인데 라이다·노선은 541.4m — 주곡선 간격이 5m이므로 보간 오차로 설명되지 않는다. 도엽 등고선이 그 지형을 담고 있지 않다 (제작 이후 지형 변화 또는 도엽 자료 누락). 도엽 성절토·옹벽 표기는 반경 60m 내 없음.
- 좌표계: 두 프로젝트 PRJ 모두
- 위 「계곡 통과 시설이 갈리는 것」 항목의 배경이다 — 도엽이 그 구역을 얕게 잡는다.
- 남은 확인: B04 3D에서
x 183,730 / y 489,450을 위성영상과 대조해 성토인지 미갱신인지 가른다.
- 자체검증: 저장소 산출물 직접 대조 (구조물검증-LAS
B05/B06 구조물 UI 통합 후속
- 사용자 화면 확인 후 좌측 배치 폼과 횡단 오버레이의 중복 항목 정리.(완료)
B08 CAD 후속
-
도면 전환 지연·토스트 이질감·커서 지연을 손봤다 (2026-08-30, 커밋
9c1cdf8f).- 도면 프리페치: 진입 후 첫 장을 띄우고 목록 전체를 배경에서 받아 모듈 캐시에 담는다. 구조물까지 얹은 상태로 담아 클릭 때 재계산이 없다. 확정·확정취소는 그 도면 캐시만 버린다. sessionStorage가 아니라 메모리에 둔다 — 유역도 한 장이 엔티티 1,581개라 세션 한도(5MB)를 넘길 위험이 있다.
- 구조물 모듈이 공유 캐시 사용:
fetchSectionDetail직접 호출 →loadSectionDetail(B05·B06과 같은Section_Store). 장을 넘길 때마다 상세를 다시 받던 회당 ~200ms 제거. - 실측(클릭 → CAD 렌더 완료): 800
1,000ms → **5565ms**. 서버 조립 자체는 도면당 180~380ms로 그대로다(캐시가 가린다). - 토스트 통일: CAD 안
react-toastify자리에 vite alias로 다리를 끼워 (openwebcad/src/helpers/toast-bridge.ts) 부모로aislo:b08:toast메시지를 보내고, B07 페이지가 공용showToast로 띄운다. 호출부 30여 개 파일은 그대로 뒀다. 누르는 안내(백업 되살리기)를 위해showToast에onClick(선택 인자)을 더했다. - 커서 지연: 원인은 프레임이 아니라(측정
avgFrameMs16.68 = 60fps 상한, 씬 재생성 12.6ms) 합성 파이프라인이었다. Chrome은mousemove를 rAF 직전에 몰아 보내므로 대기 자체는 거의 없다. 화면 캔버스를desynchronized: true, alpha: false로 만들어 합성 큐를 건너뛴다(한 줄, 되돌리기 쉬움).
-
명령행 숨김/보임이 좌측 속성 패널 높이를 함께 흔들던 것을 끊었다 (2026-08-31).
- 원인:
.cad-inspector의bottom이calc(var(--cad-command-height) + var(--cad-status-height))라서 상태막대 [명령행] 토글이 바꾸는--cad-command-height에 좌측 패널이 끌려갔다. - 조치: 좌측 팔레트가 상위이므로
bottom: var(--cad-status-height)한 줄로 상태막대까지 내렸다 (openwebcad/src/App.css). 명령행은 이미left: var(--cad-panel-width)라 가로로 겹치지 않는다. 캔버스·줌 컨트롤은 그대로 명령행 높이를 따른다. - 자체검증(공용 브라우저, B07 1장,
868_hardreload.py): 패널bottom737px · 높이 579px가 명령행 보임(--cad-command-height: 86px) → 숨김(0px) → 다시 보임 전 구간에서 불변. 수정 전 측정은 651/493 ↔ 737/579로 흔들렸다. dist/가 gitignore라 검증 전에openwebcad에서npm run build실행. 다른 PC도 동일.
- 원인:
B08 CAD 후속
도각(A1 템플릿)이 설계를 방해한다 — 2026-08-31
-
잠금 레이어를 집지 않게 했다 (2026-08-31).
state.ts에getPickableEntities()(잠금 도면층 제외) 하나를 두고, 집기 경로가getEntities()대신 그걸 쓴다.- 선택은
setSelectedEntityIds()한 곳에서 막았다 — 호출부마다 거르지 않는다. Ctrl+A뿐 아니라 앞으로 생길 어떤 선택 경로도 잠금 객체를 담지 못하고, 따라서select-tool.ts:166선택 삭제도 도각을 지울 수 없다(같은 결함의 뿌리 하나). tools/eraser-tool.ts자르기 ·tools/factories/sequence-tool.tspickEntityAt(트림·모따기 등) ·input-controller.ts커서 강조 →getPickableEntities()- 자체검증(공용 브라우저 1장 0~240m,
880·882): Ctrl+A 선택이 226 → 107개, 내역b08-design 48 · structure 27 · rock-boundary 16 · cross-table 16—b08-frame·b08-ground0개. 자르기로 도각 테두리를 클릭해도 엔티티 226개· frame 103개 불변. 수정 전 실측은 226개 전부 선택이었다.
- 선택은
-
잠금 경로 다섯 곳을 마저 닫았다 (2026-08-31, 첫 감사가 불완전했다).
tools/select-tool.helpers.tspickEntityAt— 클릭 선택 후보에 잠금 객체가 섞여 도각을 물면 아무 일도 안 일어나는 죽은 클릭이 됐다.tools/eraser-tool.tsgetAllIntersectionPoints2곳 — 자르기가 도각 선을 절단 경계로 썼다.tools/modify/property-tools.tsOVERKILL — 선택이 없으면 전체가 대상이라 도각까지 지웠다.tools/annotate/text-tools.ts찾기/바꾸기 — 도각 표제란 글자를 바꿔 버렸다.tools/utility/selection-tools.ts유형 선택·유사 선택 — 잠금 객체까지 세어 토스트 개수가 틀렸다.- 자체검증(
892·893·894, 횡단 1장): 찾기/바꾸기로 도각 라벨(도 면 명)을 노려도 0건, 도각 텍스트 24개 불변. OVERKILL은 설계 콘텐츠에서 2개를 지우면서b08-frame63개·b08-ground16개는 불변. 선택 0. (검증 중 지운 2개는 도면 재요청으로 원복 — 엔티티 186개 복구 확인.)
-
수량 산출표 패널이 명령 입력칸을 덮던 것을 올렸다 (2026-08-31, 검증 중 발견).
.cad-qtable이bottom: 상태막대+8px이라 명령행(86px)과 겹쳐 입력칸을 클릭으로 누를 수 없었다.bottom에--cad-command-height를 더해 명령행 위로 띄운다. 명령행을 접으면 이 값이 0이라 예전 자리로 돌아간다.- 자체검증(
897): 패널[607,643]· 입력칸[704,730], 겹침 -61px(61px 떨어짐). 입력칸 중앙의elementFromPoint가cad-command, 클릭 후 타이핑이 입력칸에 들어간다.
- 자체검증(
-
화면맞춤(⛶)을 콘텐츠 기준으로 바꿨다 (2026-08-31 사용자 확정: "당연히 컨텐츠에 맞추는게 좋을것같아").
screenCanvas.drawController.tszoomToFitScreen이 잠금 도면층을 뺀 bbox에 맞춘다(콘텐츠가 하나도 없으면 전체로 폴백). 도면 로드 직후 자동 맞춤 (aislo-drawing-bridge.ts:128)도 같은 함수라 함께 바뀐다.- 자체검증(
881): 캔버스 1136×493에서 맞춤 후 배율 94%. 콘텐츠 631×472 기준 예상치 94.0%와 일치, 도각 840×594 기준 예상치 74.7%와 불일치 — 콘텐츠에 맞았다.
- 자체검증(
-
임시 도각에서 남의 자료를 걷어냈다 (2026-08-31).
00_template_A1.json엔티티 87 → 47. 지운 것: 용역회사 로고 벡터 22 · 시행청 로고 6 · 담당자 손서명 9 · 영문 병기와 워드마크 3. 값 텍스트 11개는 같은 좌표·서식에{{공사명}}{{시행청}}{{용역회사}}{{설계일자}}{{과업책임자}}{{분야별책임자}}{{설계자}}{{도면명}}{{도면번호}}{{축척_A1}}{{축척_A3}}로 바꿨다. 도각 테두리·표제란 격자·라벨 텍스트·재단 표식은 그대로다. 정리 스크립트는tmp/clean_a1_template.py, 원본 사본은tmp/00_template_A1.orig.json.frame_entities(fields=...)로{{키}}를 치환하고, 값이 없으면 빈칸으로 둔다. 지금은 4개 엔진이{{도면명}}만 채운다(횡단면도·종단면도·토적도·유역도).- 자체검증(백엔드 재시작 후,
885_final_verify.py): 4개 도면(횡단·종단·토적·유역) API 응답의b08-frame텍스트에 남의 값 0건.{{도면명}}이 각각 횡단면도·종단면도·토적도·유역도로 치환되고 나머지 칸은 빈칸이다.
-
방위표 템플릿도 같이 정리했다 (2026-08-31).
00_template_compass.json에 원본 DXF의 표제란 글자 4개(편 입 용 지 도-2공구·25·2,400)가 도면 반대편에 남아 있었다. 이 때문에 템플릿 bbox가 183×262mm 로 부풀어, 긴 변을 14mm에 맞추는compass_entities()가 방위표를 1.1×1.8mm 로 줄여 놓고 있었다 — 사실상 안 보였다. 글자를 지우니 bbox 20.5×32.9mm, 방위표가 8.7×14mm 로 나온다 (유역도 화면에서 확인,885_watershed.png). 엔티티 39 → 35, 남는 텍스트는N뿐. -
기본 도면층 이름을 국문으로 바꿨다 (2026-08-31 사용자 지시). 도면층 17종을 프로젝트가 이미 쓰는 용어로 맞췄다 — 원지반·계획선·구조물·암 경계선·수량 산출표· 도각·등고선·계류·노선·배수유역·유역 제원·표제·그래프 격자·측점표·유토곡선· 그래프 축·운반 구간. CAD 앱의
Default·New layer도 기본·새 도면층으로 바꿨다.layerId는 그대로라 저장된 도면과 어긋나지 않는다.- 자체검증(
885): 4개 도면 API 응답의 도면층 이름이 전부 국문. 화면 도면층 패널도 같이 확인(885_watershed.png).
- 자체검증(
-
표지를 통째로 템플릿으로 (2026-08-31 완료). 도각을 두르지 않고 템플릿 한 장을 그대로 도면으로 낸다.
kind:"cover"배선까지 끝나 화면에 뜬다. 작업 기록은docs/raw/plans/2026-08-31_plan_B07_cover_template.md로 이관했다. 값(공사명·위치·사업량·시행청)은 아직 빈칸 — 아래 「표제란 필드 바인딩」과 같은 판이다.
B08 CAD 후속
도각을 배경으로 굳힌다 — 새 선이 잠금 도면층에 떨어진다 (2026-09-01 보조폴더)
-
현재 도면층은 잠금 아닌 첫 층으로 (2026-09-01 완료). 가드를
state.ts:setActiveLayerId()한 곳에 뒀다 — 브리지·자동백업 복구·JSON 가져오기· 도면층 패널·리본이 모두 이 함수를 지난다. 잠금 아닌 층이 없으면 요청값 유지.- 자체검증(화면
425_cover.png·425_cross.png): 표지 현재 도면층주기, 횡단 1장계획선. 선을 그으니 표지b08-cover-note, 횡단b08-design— 둘 다 잠금 아닌 층이다(고치기 전에는b08-frame·b08-ground). - 단위 시험
src/state.test.ts2건: 잠금층 요청 → 잠금 아닌 첫 층, 전부 잠금 → 요청값 유지.
- 자체검증(화면
-
리본 「현재 도면층」 목록에서 잠금층을 뺐다 (2026-09-01 완료).
RibbonWidgets.tsx목록에서 잠금층을 거르되, 현재 층이 잠금이면 그 항목은 남긴다.- 자체검증: 횡단 1장 드롭다운 항목이
계획선·구조물·암 경계선·수량 산출표4개 —원지반·도각빠졌다. 표지는주기하나.
- 자체검증: 횡단 1장 드롭다운 항목이
-
표지에 자유 도면층 하나를 줬다 (2026-09-01 완료). 표지 14개 엔티티가 전부 도각(잠금)이라 가드만으로는 그릴 자리가 없었다.
Cover.py에b08-cover-note「주기」를 잠금 없이 실었다(엔티티는 그대로 도각층).- 자체검증: 표지 도면층
주기(자유)·도각(잠금), 현재 층주기, 그은 선b08-cover-note.
- 자체검증: 표지 도면층
-
도면 적재를 되돌리기 기준선으로 세웠다 (2026-09-01 완료).
state.ts:resetUndoBaseline()을 만들어 브리지 적재·자동백업 복구에서 부른다.- 자체검증: 표지 14 → 선 1개 15 →
Ctrl+Z→ 14(백지 아님), 횡단 186 → 187 →Ctrl+Z→ 186. 고치기 전에는 187 → 0 이었다. - 단위 시험
src/state.test.ts1건. - 회귀: 도각 스냅 제외 그대로 — 횡단 1장에서 마우스 187지점 훑어 스냅 64회,
도각 전용 영역 0회. 파이썬 스위트 34건 통과. CAD
vitest81건 중 6건 실패는 변경 전부터 있던 것(window is not defined·find-closest-entity단정) — 내가 고친 함수를 쓰지 않는 시험들이다.
- 자체검증: 표지 14 → 선 1개 15 →
-
검증 창구에 스냅점을 열었다.
debug-hook.ts에snap: () => getSnapPoint()한 줄 — 잠금층이 스냅에 끼는지 수치로 판정하는 데 썼다.
B08 CAD 후속
프로젝트 소유 검증 — 남의 회사 자료에 닿던 구멍 (2026-09-01)
- 검사를 한 곳에 뒀다 (2026-09-01 완료).
common_util_auth.require_project_access를 만들어main.py의protected_with_company목록에 함께 걸었다. 경로에project_id가 있는 요청만 검사하고(55개 경로), 없는 요청은 그대로 지나간다. 시스템 관리자는 통과.- 자체검증
tmp/tests/test_project_access_guard.py: 같은 회사 통과 · 다른 회사 403 · 없는 프로젝트 404 · 관리자·프로젝트 없는 경로 통과. - 화면(
440_after_guard.png): 도면 목록·표지·도각 API 전부 200, 없는 프로젝트 404, 종단도 엔티티 487 정상. 파이썬 스위트 36건 통과. - 남은 것:
project_id를 본문·질의로 받는 경로는 이 가드가 닿지 않는다. 지금 B03~B07은 전부 경로 매개변수라 해당 없음 — 새로 만들 때 경로로 받는다.
- 자체검증
B08 CAD 후속
도각 편집 모드 — 캐드에서 고치고 [완료] 한 번에 (2026-09-01 사용자 확정)
-
회사 도각 저장 자리 (2026-09-01 완료).
storage/{회사}/templates/00_template_A1.json. 회사 폴더는 프로젝트 경로 두 단계 위에서 얻는다 — DB 조회를 새로 만들지 않았다. 정본(resources/template_2dDrawing/)은 읽기 전용 그대로.- 자체검증: [완료] 한 번에
storage/1/templates/00_template_A1.json생성(48개 엔티티,layerId전부b08-frame). 정본 파일은 변경 없음.
- 자체검증: [완료] 한 번에
-
도각 로더에 우선순위 (2026-09-01 완료).
_load_template()이 회사 파일을 먼저 보고 없으면 기본을 쓴다. 캐시 키에 mtime을 넣어 저장 즉시 반영된다 — 템플릿을 고칠 때마다 백엔드를 재시작하던 일이 없어졌다. 회사 폴더는 요청마다ContextVar로 세운다 (엔진 6개 서명을 줄줄이 고치지 않으려고.asyncio.to_thread가 문맥을 복사한다). 개인용 도각은 이 함수에 한 줄 더 붙이면 되는 자리로 남겼다.- 자체검증: 회사 도각 파일을 지우자 재시작 없이 기본 도각(47개)으로 돌아왔다.
tmp/tests/test_b07_frame_template.py1건(우선순위·저장 즉시 반영·층 정규화).
- 자체검증: 회사 도각 파일을 지우자 재시작 없이 기본 도각(47개)으로 돌아왔다.
-
도각 편집 API (2026-09-01 완료).
GET/PUT /api/projects/{id}/frame-template. 1:1 이라 좌표 역변환이 없다. 인증은 라우터에 걸린protected_with_company그대로.- 자체검증: 편집 화면 도면층이
도각(잠금 아님)하나, 엔티티 47개 = 기본 도각 그대로.
- 자체검증: 편집 화면 도면층이
-
B07 화면의 편집 모드 (2026-09-01 완료). 새 파일
B07_DesignDetail_UI_FrameEdit.ts(페이지가 700줄에 가까워 분리). 도면 목록 아래 「도각 편집」 → 배너 + [완료]·[취소]. [완료]는 기존 저장 통로로 엔티티를 받아 PUT 하고, 받아 둔 도면 캐시를 버린 뒤 보던 도면을 다시 싣는다(안 버리면 옛 도각이 그대로 보인다). 편집 중에 오는 도면 변경 알림은 확정 해제로 이어지지 않게 막았다. -
자체검증 완료 (2026-09-01, 보조 폴더 5174 · 프로젝트 wdw).
- 편집 → [완료] → 반영: 종단도 도각 47 → 48(전체 487 → 488), 배너는 닫히고 보던
도면으로 복귀(
432_frame_edit.png). - 확정본 보존: 종단도를 확정한 뒤 도각을 한 번 더 고쳐(48 → 49) 저장했더니 확정한
종단도는 48 그대로, 미확정 유역도는 84(새 도각 49 + 방위표 35)로 새 도각을 받았다
(
433_confirmed_frame.png). - 원복: 종단도 확정 해제(200) + 시험용 회사 도각 삭제 → 종단도 도각 47(기본), 확정 뱃지 false. 사용자 자료는 시험 전 상태로 되돌려 놓았다.
- 파이썬 스위트 35건 통과, 프론트
tsc --noEmit무오류.
- 편집 → [완료] → 반영: 종단도 도각 47 → 48(전체 487 → 488), 배너는 닫히고 보던
도면으로 복귀(
B08 CAD 후속
유역도 표현 정리 — 2026-08-31 사용자 지시
-
노선을 굵게, 그리고 맨 위로. 노선이 유역 해칭 아래에 깔려 안 보였다.
polyline_entity(width=)(기본 1)를 더하고 노선만_ROUTE_WIDTH = 3으로 그린다. 그리기 순서도 등고선·계류·해칭·정보표 다음, 번호 배지 바로 앞으로 옮겼다. bbox 계산에는 그대로 포함시켜 오른쪽 칸 위치가 흔들리지 않게 했다.- 자체검증(
890_route_view.png): 유역 1·3·4 해칭 위로 노란 노선이 끊김 없이 보인다. - 축척은 1:6000 유지로 확정 (2026-08-31 사용자 "유역도는 유지"). 도곽이 실거리 약 4km를 담고 노선은 350m다(노선 bbox 40×28mm 대 지형 681×477mm) — 노선이 작게 보이는 것은 이 축척에서 정상이고, 굵기·그리기 순서로 해결한다. 축척을 바꾸자는 이야기는 다시 꺼내지 않는다.
- 자체검증(
-
방위표를 키우고 유역 정보표를 그 아래로. 오른쪽 칸을 방위표(맨 위) → 정보표 (아래로 쌓기) 순으로 바꿨다. 방위표
14mm → 26mm(_COMPASS_SIZE), 간격 6mm. 옛 배치(도면 오른쪽 위 구석max_bx-8, max_by-8)는 걷어냈다.- 자체검증(
889): 도각 bbox[-70,-67,770,527](840×594) 밖으로 나간 엔티티 0개. 정보표 칸[693,364]~[739,445], 폭 46mm로 예약 폭 그대로다.
- 자체검증(
-
등고선·계류를 배경으로 — 이미 되어 있었다(잠금 도면층). 자체검증(
886): Ctrl+A가 엔티티 1,537개 중 27개만 선택하고 등고선·계류는 0개. 스냅·화면맞춤도 잠금 도면층을 제외한다(2026-08-31getPickableEntities()작업으로 함께 닫혔다). -
등고선·계류 외곽을 곧게 잘랐다.
clip_line_to_box()가 경계 바깥 점을 하나씩 물고 나와 외곽이 들쭉날쭉했다. Liang-Barsky 선분 절취(_clip_segment)로 바꿔 끝점이 경계 위에 정확히 놓인다. 물림 여유_CLIP_SLACK14mm → 0.- 자체검증:
tmp/tests/test_clip_line_to_box.py5건 통과. 화면(887) — 등고선·계류 bbox가 둘 다 정확히 681×477mm 직사각형. 박스 선은 그리지 않는다(사용자 지시).
- 자체검증:
다른 AI 작업(PRJ 좌표계 판별) 검증 — 2026-08-31
origin/feat/prj-crs-identify의0d90595a(다른 워크트리 작업)를 내 브랜치에 fast-forward로 가져와 검증했다. 내46ac5425위에 쌓인 커밋이라 충돌 없음.- 내용: PRJ 판별을 문자열 매칭 → WKT 정본+EPSG 라벨(
common_util_crs.py신규). 옛 코드는 WKT에 항상 있는false_easting의 "EAST" 때문에 모든 PRJ를 EPSG:5187로 판정하고 있었다 — 실제 결함이 맞다. - 실데이터 검증: ① storage 3건의 COMPD_CS(KGD2002 East Belt+KNGeoid24,
to_epsg()None) → 5187 정답, ② 실무문서 ESRI WKT(파일명 EPSG5176, AUTHORITY 없음) → 5176 정답, ③ 불량·빈 입력 → None(기본값 5186 폴백), ④ TOWGS84 박힌 WKT → 원문 유지(보정 보존). B03analyze_prj_metadata· B04get_epsg_from_prj호출부도 같은 결과. - 회귀 테스트
tmp/tests/test_crs_identify.py4건 추가, 통과. - 전체 스위트 265 통과/10 실패 — 실패는 머지 전과 동일한 이전 결함들 (B05 구조물 8·B06 1·B07 정보표 1). 이 머지가 새로 깨뜨린 것 없음.
- 내용: PRJ 판별을 문자열 매칭 → WKT 정본+EPSG 라벨(
B08 횡단도·장 배치 후속
- 신규 프로젝트에서 구조물이 안 나온다는 증상을 실측으로 종결했다 (2026-08-30).
-
원인은 그 프로젝트(
e05b7ff4)가workflow.json = {"current_stage":"scan"}— WF1이 안 끝나 자동설계 체인이 호출된 적이 없었다(initial_design.lock도 없음). 구조물만이 아니라 노선·종횡단 자체가 없던 상태였다. -
새로 등록해 체인을 완주시켜 대조했다. [저장]을 누르지 않은 상태의 수치:
항목 LAS 없음(도엽) 325f57d9r117LAS 있음 2f940d8ar118pipe_points / 종단 표식 / 횡단 표식 4 / 4 / 4 4 / 4 / 4 load_culvert_sets매칭4건 전부 4건 전부 B06 횡단 카드 표시됨 표시됨 3D 코리도 구조물 솔리드 corridor_0117.json31개corridor_0118.json36개B08 횡단도 1장 structure 엔티티 40 (20블록) 27 (16블록) -
3D 코리도 파일도 [저장] 없이 자동 생성됐다 — "저장해야 3D에 나온다"는 종전 인식도 해소.
-
���단 스크립트를 남겼다:
./venv/Scripts/python.exe tmp/tests/diag_structures.py [UUID](인자 없으면 최근 프로젝트) — 위 5항목을 한 번에 대조한다.
-
좌표계 라벨 오용 수정 — 상세 배수유역 표기 누락 (2026-09-01, 보조폴더)
-
common_util_drainage_context:DrainageContext.epsg(int)→crs(str),crs_input사용 -
B07_DesignDetail_Router_Support:context.crs그대로 사용 -
SheetSurface.build_sheet_surface_from_route:load_design_route로 읽어 도엽 서피스를 라이다 지표면과 같은 좌표계에 만든다 (LAS 없는 WF1 경로는 라벨·좌표가 한 벌이라 유지) -
Router_Inflow._resolve_epsg: 격자 산출물과 같은 .prj 좌표계로 역투영- 검증:
tmp/tests/test_drainage_crs.py신규(용화 회귀) +tmp/tests전체 37 passed.build_detail실행 시 유역 11개 폴리곤이 lon 129.0947129.0988 / lat 36.810736.8127 (노선 위). 수정 전 같은 점 = 119.7872 / 23.0817. 커밋b50559d7. - 화면 검증 미실시: 데이터가 메인폴더 storage 에만 있어 보조폴더 백엔드(8001)로는 못 띄운다.
- 검증:
-
옛 저장본 좌표계:
04_detailed_basins.geojson에 변환에 쓴 좌표계를crs_input으로 남기고 B07 유역도가 그 값으로 되돌린다. 기록이 없는 옛 저장본은 노선 CSV의 EPSG 라벨로 쓰였으므로 그 라벨로 되돌린다(경고 로그 + 재확정 안내). -
3D 서피스 겹쳐보기 어긋남: 도엽 서피스가 라이다 포인트 상자(
structured.npz= 화면setReferenceBounds와 같은 값)를 화면 원점으로 쓰게 했다. 표고 격자 상자 (bounds)는 절취 범위 그대로 두고scene_bounds를 npz에 따로 남겨 등고선 API도 같은 원점을 쓴다. 라이다 없는 사업지는 종전대로 자기 상자.- 검증:
tmp/tests42 passed(신규test_scene_origin_and_basin_crs.py5건). 패치 코드로 도엽 서피스를 다시 만들어 GLB 정점 상자 대조 — sheet[-426.58, -68.95, -386.41]~[411.42, 71.52, 379.59], csf[-172.12, -44.06, -199.69]~[184.11, 3.22, 165.72]로 같은 원점(수정 전 sheet는±419.5 / ±70.24 / ±383.0자기 중심). 커밋0a1ebcfb. - 화면 검증 완료(2026-09-01, 보조폴더 8001·5174): 용화(e418fcfc) B04 지도에서 세부유역
11개가 번호 서클과 함께 칠해져 나온다(
tmp/browser/shots/509_b04_basins_on.png). API 대조 — 유역 bbox lon 129.0906129.1019 / lat 36.804936.8127, 노선 bbox 129.0948129.1018 / 36.810736.8127 로 겹친다. 수정 전 같은 호출은 119.78 / 23.08. 좌표계가 맞던 프로젝트(c1bb453f)는 값이 그대로 — 회귀 없음. - 보조폴더 storage 는 메인폴더로 정션이 걸려 있어 같은 데이터를 본다(2026-08-30 생성).
보조 백엔드는
SERVER_PORT=8001 FRONTEND_DEV_PORT=5174 AISLO_API_PORT=8001로 띄운다 —AISLO_API_PORT를 빼면 vite 5174 가 메인 백엔드(8000)로 프록시해 남의 코드를 검증하게 된다.
- 검증: