화면 실측에서 나온 지적 세 가지를 반영했다.
- 세부유역에 격자 해칭(Hatch style=cross, 유역색)을 넣는다. openwebcad Hatch
엔티티라 CAD에서 무늬·간격을 그대로 편집할 수 있다.
- 유역 번호를 동그라미 배지로 바꾼다 — 흰 원판(solid 해치) + 유역색 테두리 +
검은 숫자. 해칭 위에서도 읽히고, 화면(어두운 배경)·인쇄(흰 배경) 양쪽에서 남는다.
배지는 엔티티 목록 맨 뒤에 몰아 그려 뒤따르는 해칭·정보표에 가리지 않는다.
- 토적도 balloon의 장비명 뒤 숫자를 뺀다. 납품 도면에는 "도자 11"처럼 붙지만
그 숫자의 정체가 확인되지 않았다(2026-08-30 사용자 확정 — 확인되면 붙인다).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
납품 도면 2장을 B07 도면 목록에 새로 붙였다. 계산은 하지 않는다 —
유토곡선은 B06 확정 시 저장한 산출물(longitudinal_sections.data.mass_haul)을,
유역도는 B04 세부유역 GeoJSON과 도엽 등고선·세류선을 읽어 좌표만 종이 mm로 옮긴다.
- 도면 종류 확장: kind에 mass_haul·watershed 추가(Schema·Api_Fetch·openwebcad
App.types), 12분류 라벨에 연결, 목록에 단장 도면 2건 상시 노출
- 엔진 신규: _Engine_Cad_MassHaul.py(축·곡선·평형선·띠 현·balloon·측점 테이블),
_Engine_Cad_Basin.py(등고선·세류선 배경·노선·유역·구역별 정보표·방위표)
- 척도 상수: 유토곡선 H 1/2,000 · 세로 1mm=50㎥, 유역도 1/6,000 (A1 고정)
- 유토곡선 저장 payload에 띠·잔여의 기하 필드 추가 — 파이썬에 곡선 보간·토량 배분
로직을 복제하지 않기 위해 값을 낳는 쪽(TS 엔진)에서 함께 남긴다
- 유역도 배경은 여러 도엽을 합쳐 받은 뒤 도곽 크기로 절취(clip_line_to_box)
- 배수규격은 소요 관경이 아니라 규격관(recommended_diameter_mm)으로 표기
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
병행 작업(CLAUDE.md 7장)에서 워크트리마다 자기 백엔드를 봐야 하는데 프록시 대상이
8000으로 하드코딩돼 있었다. 워크트리 vite(5174)를 `AISLO_API_PORT=8001`로 띄우면
그쪽 백엔드를 본다. 기본값이 8000이라 메인 폴더 동작은 그대로다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
횡단도에 그려지던 노면은 사실 월류부 가장 아래를 자른 자리다 — 구체 위 노면은
월류 높이만큼 낮게 앉아야 한다(2026-08-30 사용자 확정). 계획고를 통째로 내려
잡아 측벽·바닥판·십자선·절성토 면적이 한 번에 따라오게 했다. 전폭 평행 하강이라
횡단경사·측구·사면 규칙은 그대로다.
백엔드
- `_ford_set`이 `ford_height_m`을 `overflow_depth_m`으로 스펙에 싣는다.
- `compute_cross_design(surface_drop_m=)` — 계획고를 그만큼 내려 계산하고, 내린
양을 `surface_drop_m`으로 echo한다(프론트가 점선을 되그리는 데 쓴다).
- `ford_surface_drops()`·`ford_drop_at()` — 관 지점 정본에서 측점별 하강량을 읽는다
(포장 구간과 같은 방식). 설계 계산 경로 전부(기본값·재계산·프리뷰·종횡단 확정)에
물렸다.
- `enforce_ford_surface_drops()` — 저장분이 옛 계획고면 상세 조회에서 다시 계산한다.
월류 높이를 지우면 같은 경로로 원래 계획고로 되돌아온다.
프론트
- 십자선을 하강량만큼 내려 찍는다(`cardDesignElevation`). 종단 계획고를 그대로
쓰던 자리다.
- `appendFordSurfaceDropPlan()` — "월류가 없었다면" 노면을 점선으로 남긴다.
물넘이포장의 「기존 계획고 점선」과 같은 표기라 한 규칙으로 읽힌다.
- 측벽·바닥판은 내려간 설계선(`design_line`)에 그대로 붙으므로 따로 손대지 않았다.
자체검증(공용 브라우저 5174 + 워크트리 백엔드 8001, 측점 7+9.7, 월류 높이 0.39m):
- `tmp/tests/test_ford_surface_drop.py` 2건 통과 — 계획고·좌우 노견이 정확히
0.39m 내려가고, 절토는 늘고 성토는 줄며, 하강이 없으면 `surface_drop_m` 키 자체가
없다.
- 화면 실측: y축 눈금 1m = 24.375px에서 십자선이 점선보다 9.50px 아래
(= 0.390m, 오차 0.001m). 수정 전에는 두 선이 같은 자리였다.
- 세월교 측벽 자동 높이 1.70m → 1.50m. 이론값 1.31m이나 하한(관경 1.0 + 최소 토피
0.5 = 1.5m)에 걸린 값이다 — 기존 규칙 그대로다.
- 성토 면적 18.46 → 13.85 ㎡. 이웃 일반 측점에는 점선이 그려지지 않는다.
- 검증에 쓴 `pipe_points.json` 임시 옵션은 백업본으로 되돌렸다(정본 무변경).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`syncFordSummary`가 "빈 칸이거나 계산값보다 작을 때만" 높이를 채워 넣어, 폭을
바꿔 필요 수심이 **낮아지는** 쪽으로 움직이면 칸이 옛 값 그대로 남았다. 안내문
(설계유량·필요 수심·필요 단면)만 바뀌고 높이는 안 바뀌는 것으로 보였다.
칸이 아직 **직전에 자동으로 채운 값 그대로**인지 본다(±0.005m). 그대로면 자동
상태로 보고 계산값을 계속 따라가고, 사용자가 다른 값을 넣었으면 그때부터 그
값이 이긴다. 시설을 새로 폼에 올릴 때는 추적을 끊어(`fordAutoDepthM = null`)
저장돼 있던 높이를 사용자 값으로 대접한다.
자체검증(공용 브라우저 5174, 측점 7+9.7 세월교, 설계유량 36.734 ㎥/s):
- tsc --noEmit 통과.
- 자동 상태(폭 10 → 높이 0.39)에서 폭 5 → 0.63(올라감), 폭 20 → 0.25(내려감).
수정 전에는 0.63에서 내려오지 않았다.
- 높이를 2.5로 직접 넣은 뒤 폭 20→5 → 2.5 유지(사용자 값 우선).
- 조작값은 원래대로(폭 10 · 높이 자동 0.39) 되돌려 놓았다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
B06 좌측 폼이 계곡 통과 시설 목록을 만들 때 `design_flow_m3s: null`을 그대로
박아 넣고 있었다. 개략 단면(필요 수심 = 월류 높이 자동값)은 담당 유역의 설계
유량에서 나오므로, 값이 없으면 "담당 유역의 설계유량이 아직 없습니다" 안내만
뜨고 월류 폭을 넣어도 높이가 채워지지 않았다.
같은 응답(`/drainage/pipe-points`)에 유역(`basins`)이 함께 오므로 B05
(`B05_Profile_UI_Drainage_Panel`)와 같은 규칙 — 누가거리 0.51m 이내 짝짓기 —
으로 설계유량을 실어 준다.
자체검증(공용 브라우저 5174, 측점 7+9.7 세월교):
- tsc --noEmit 통과.
- 벽 선택 시 안내문 "설계유량 36.734 ㎥/s · 필요 수심 0.39 m · 필요 단면
3.89 ㎡ · 유속 9.43 m/s", 월류 높이 칸 자동 0.39 (수정 전 빈 칸).
- 월류 폭 10→5 → 필요 수심 0.63으로 다시 계산되고 높이도 0.63으로 올라간다.
(폭을 10으로 되돌려도 0.63은 유지 — 계산값 이상은 사용자 입력으로 본다는
기존 규칙 그대로다.)
- 조작값은 원래대로(폭 10·높이 0.39) 되돌려 놓았다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
사용자 지시 3건(2026-08-30).
1) 횡단도에서 세월교 측벽을 고르면 좌측 폼의 그 측 칸이 선다 — 배관 기슭막이가
쓰던 경로를 그대로 탄다. `SideSlots`에 `wingInlet`·`wingOutlet`을 더하고
`slotOf()`가 배관 칸 → 독립 기슭막이 칸 → 날개벽 칸 순으로 지금 서 있는 쪽을
고른다. 세월교 조정창은 `dataset.side`·`dataset.panelTitle`을 세워 어느 칸을
가리키는지 알린다. 벽 선택 뒤 `refreshAdjustSlots()`도 배관과 같게 붙였다.
2) 월류 폭·높이·수량·개략 단면 결과를 관경 바로 다음으로 옮겼다(바닥 경사도 같은
묶음에 둔다 — 물넘이포장 전용이라 세월교에서는 숨는다). 개략 단면 안내문은
읽는 글이라 10px·opacity 0.75로 줄였다.
3) 세월교·날개벽 숫자 칸을 기슭막이·집수정과 같은 [-][값][+] 묶음으로 바꿨다
(월류 폭·높이·바닥 경사·수량·날개 높이·길이·각도). `stepper()`에 표시 자릿수
인자를 더해 련·각도는 정수로 보인다("1.0련"·"45.0°" 방지). 기본값 1이라 기존
호출부는 그대로다.
자체검증(공용 브라우저 5174, 측점 7+9.7 세월교):
- tsc --noEmit 통과.
- 유입 측벽 선택 → `날개벽(유입) (세월교)` 칸 강조, 유출 측벽 → `날개벽(유출)
(세월교)`. 한 번에 한 칸만 선다.
- 폼 항목 순서 실측: 관종 > 관경 > 월류 폭 > 월류 높이 > 수량 > 날개벽(유입) …
안내문 font-size 10px, 보이는 스텝 묶음 9개.
- 수량 + → 폼 "2"·조정창 "2련", 각도 + → 폼 "50"·조정창 "50°" (소수점 없음).
- 회귀: 배관 측점 기슭막이 선택 → `유출구 (기슭막이(유출))` 강조 + 높이·길이·
기준측점 전/후 행 이식 정상.
- 조작값은 원래대로(수량 1·각도 45) 되돌려 놓았다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
좌측 폼의 세월교 상세 항목(관종·관경·수량·월류 폭·날개벽 유입/유출)이 도면에
전혀 반영되지 않았다. `applyPipeOptionsToCache`가 `section.culvert`만 보고
세월교 측점(`section.ford`)에서는 즉시 return했기 때문이다.
프론트는 구조물 배치의 상세 UI를 쓰고 로직은 조정창 제어기 것을 쓴다
(2026-08-30 사용자 확정).
- `applyFordFormOptions()` 신설 — 폼 옵션 키를 `FordControl.setPipe`/`setWing`
인자로 옮긴다. 캐시 반영·바닥판 연장 재계산·정본 예약·카드 갱신은 제어기에
이미 있어 새로 만들지 않았다.
- `FordControl.setPipe` 확장 — `pipe_kind`(관종)·`ford_width_m`(월류 폭 =
`span_m`) 추가. 두 값은 조정창에 칸이 없고 폼만 보낸다.
- `withFordSpec()` — 폼 기본값을 `section.ford` 스펙에서 읽는다. 두 창이 같은
스펙을 보므로 어느 쪽에서 만졌든 값이 갈리지 않는다(수량(련) 빈 칸 해소).
월류 높이(`ford_height_m`)는 백엔드 `_ford_set`이 읽지 않는다 — 세월교는 구체
위 노면이라 파임이 없고, 물넘이포장 전용 값이다. 폼에는 남되 도면 반영처는 없다.
자체검증(공용 브라우저 5174, 측점 7+9.7 세월교):
- tsc --noEmit 통과.
- 폼 날개 길이(유입) 2→4 → 조정창 「날개 길이 4.0m」, 바닥판 7.63m→9.04m
(= +2×cos45°). 수정 전에는 둘 다 그대로였다.
- 폼 수량 3 → 조정창 「3련」, 폼 관경 Ø1200 → 조정창 select 1200.
- 재선택 왕복: 월류폭 12·수량 3·관경 1200·날개길이 4 그대로 되읽힘(스펙 정본).
- 진입 시 수량(련) 칸 = 1(수정 전 빈 칸), 관종 파형강관.
- 조작값은 원래 값(10/1/1000/2)으로 되돌려 놓았다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
다단 벽을 고르면 단 수·옵션 행이 사라지던 문제. 두 값은 그 단이 딸린 부모 벽의
것이므로 다단 쪽으로 옮기지 않고 부모 칸에 남긴다.
- Adjust_Dock: EXTRA_ROWS에서 단 수·옵션을 빼고, 행 이동을 moveRows()로 묶어
다단 선택 시 형태·높이·구간값은 다단 칸으로, 단 수·옵션은 부모 칸으로 보낸다.
- Cross_Structure_Panel: extra/bextra 선택에서도 단 수 채널을 부모 쪽(outlet·basin)
으로 열어 둔다.
저장소 사고(2026-08-30 01:12)로 유실된 커밋 bc8a3477의 작업물을 복원한 것이다.
원 작업자는 병렬 B05/B06 세션이며 워킹트리에 남아 있던 변경을 그대로 커밋했다.
구조물 측점 빈 칸의 세로선이 이웃 규칙 측점 값 한가운데를 지나고, 곡선 L/R 칸
경계와 x가 겹쳐 곡선 행 구분선이 위 행들까지 이어진 것처럼 보였다. 세로선을
곡선 행에만 남기고 값 행에서는 지운다 (2026-08-30 사용자 지시).
저장소 사고(2026-08-30 01:12)로 유실된 커밋 84d02b68의 작업물을 복원한 것이다.
원 작업자는 병렬 B05/B06 세션이며 워킹트리에 남아 있던 변경을 그대로 커밋했다.
저장소 사고로 잃은 4개 커밋(38eb7cd4·b8a11756·281528bf·f60b488d)의 작업물을
하나로 다시 담았다. 내용은 동일하다.
■ 구조
- commands/: 명령 정의(id·AutoCAD 별칭·글리프·도구/즉시실행)를 단일 소스로 두고
리본·명령행·단축키가 모두 이 레지스트리를 읽는다. tools/tool.consts.ts 폐지.
- ribbon/: 탭→패널→명령 데이터(ribbon.config.ts)와 범용 렌더러 분리.
AutoCAD 배치(홈·삽입·주석·뷰·출력)와 패널 확장(▾)을 따른다.
- tools/factories/sequence-tool.ts: 점·숫자·문자·객체·선택 단계를 선언하면
xstate 머신을 만들어 주는 공장. 명령당 170줄 보일러플레이트 제거.
- helpers/geometry/: 3점 호·정다각형·타원·스플라인·구름형·평행이동·해치 스캔선·
점렬 샘플링 등 상태 없는 순수 함수.
- Toolbar 483줄을 QuickAccessBar/Ribbon/InspectorPanel/StatusBar/CommandLine/
ViewControls/PropertiesEditor/QuickProperties로 분해.
■ 명령 (조사표 기준)
- 1절 그리기 21건, 2절 수정 27건, 3절 도면층·특성·그룹·유틸리티 39건 전부 반영.
- 5절 주석 34건 중 26건 반영(문자·치수 16종·지시선·표·구름형·주석 축척).
- HatchEntity 추가(solid·pattern·cross·gradient) + JSON 왕복, Layer에 색·선가중치·
선종류·동결·투명도 필드 추가, 그리기 루프가 동결·숨김·투명도를 반영.
■ 화면 실측에서 고친 결함
- 명령행 포커스 상태에서 ENTER가 도구로 가지 않던 문제
- 명령행 문자 입력이 접두사가 같은 명령으로 실행되던 문제
- 명령이 끝나도 입력을 계속 먹던 문제(점 입력 명령만 반복, 나머지는 선택 도구 복귀)
- 시퀀스 단계 인덱스 오사용 9건 + 단계 값 종류 검사 추가
- 해치 내부를 클릭해도 선택되지 않던 문제
미반영 8건(맞춤법 검사·꺾기 치수·치수 끊기/재연관/검사 치수·기하공차·지시선 수집·
축척 리스트 편집)은 조사표 `반영` 열과 PLAN.md에 사유를 적었다.
단 수·옵션 행은 조정창 사본에서 DOM째 빌려온 행이라, 다단 벽을 고르면
clearSideSlots()가 되돌린 뒤 다시 채우지 못해 유입구·유출구 칸이 비었다.
다단 벽에서도 tierChannel을 부모 채널로 열어 두 행을 살리고(revetWall에
isExtra 포함), 이식은 부모 칸으로 보낸다. 추가 기슭막이 칸에는 형태·
높이·구간값만 남긴다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
구조물 측점(세월교·BOX암거 등) 빈 칸의 border-left가 이웃 규칙 측점 값
한가운데를 지나고, 곡선 L/R 칸 경계와 x가 정확히 겹쳐 절토고~곡선 R를
관통하는 한 줄로 보였다. 값 행에서만 선을 지우고 곡선 행 구분선은 유지한다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
B07 CAD 화면 개선 참조용. AutoCAD 2024 Windows 기본 2D 제도 기능 기준,
Autodesk 공식 명령 참조·2024 신규/변경 명령·상태막대와 재대조한 조사 결과.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
배관 유입·유출과 독립 좌·우 기준벽에서는 [추가 기슭막이(단)]과 [옵션]이
상태와 무관하게 자리를 지킨다. 링크 카드에서 만져도 제어기가 소유 측점 값을
고치므로 안전하다. 집수정 유입은 종전대로 계류측 단 자리가 있을 때만 뜬다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
다단은 유출 채널(extra)과 유입·계류측 채널(bextra)로 갈린다. 칸이 늘 유출구
아래 고정이라 어느 쪽 단인지 자리로 읽히지 않았다. 고른 단의 채널을 창이
알려 주고, 칸을 그 쪽(배관 유입구·유출구 / 독립 좌·우) 바로 아래로 옮겨 세운다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
조정창에서 옮겨 오는 [추가 기슭막이(단)] 행과 같은 값이라 두 벌이었다.
단 수 정본은 횡단 설계 patch(extra_wall_counts)이고 조작은 그 행이 한다 —
폼 칸과 그 값을 나르던 배선(tierCount·setTierCount)을 함께 걷어낸다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
clipPath id는 문서 전역인데 이름을 벽 키 + 배면 offset으로 지어, 같은 벽을
소유 측점과 연동 측점이 함께 그리면 이름이 겹쳤다. url(#id)는 문서에서 처음
만난 clipPath를 쓰므로 뒤 카드의 해칭이 앞 카드 좌표로 잘려 통째로 사라졌다.
벽을 옮기면 두 카드가 같은 offset으로 다시 겹쳐 증상이 재발했다.
측정(14+0.0 화면): 6개 중 4개 id가 중복 → 수정 후 10개 전부 고유, 모든 카드의
해칭 그룹이 화면에 폭을 갖는다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
다른 브랜치(feat/B05B06-구조물패널-일원화)의 B05·B06 구조물 배치 폼 일원화
결과를 받는다. 충돌 없음 — 그쪽은 B05/B06만, 이쪽은 B07/B08만 건드렸다.
그쪽 브랜치에 남아 있던 옛 폴더(B08_DesignDetail, B07_Quantity)는 이쪽 삭제가
반영돼 사라진다. main.py·라우트·척도 등 B07 작업물은 이쪽 것이 유지된다.
벽 선택은 카드가 먼저 처리하고 폼 교체가 뒤따른다. 그래서 다른 기슭막이를 보다가
배관 유출 벽을 고르면, 이식 시점의 목적지 칸이 아직 이전 시설 것이라 행이 엉뚱한
칸으로 가고 강조도 남지 않았다. 폼이 갈아 끼워진 뒤 refreshAdjustSlots()로 한 번 더
이식한다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- 단 수를 바깥 행에서 좌·우 칸 안으로 옮긴다. 저장 키도 좌·우 각각
(inlet_revet_tiers·outlet_revet_tiers, 옛 tiers는 폴백·호환 기록).
폼 값은 다단 채널(extra·bextra)로 가고, 폼은 그 채널 값을 되읽는다.
- 좌·우 칸에도 조정창 행 이식 자리를 두어, 벽을 고르면 배관 유입구·유출구와
같이 그 칸이 강조되고 조정 항목이 옮겨 온다. 칸 이름표는 좌·우 그대로 둔다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- 설치 측·단 수를 컨테이너 밖 한 행으로 빼고, 벽 제원은 [기슭막이 (좌)]·
[기슭막이 (우)] 두 칸으로 나눈다. 설치 측이 한쪽이면 그 칸만 뜬다.
좌·우 이름표는 그 측점 오르막 방향(uphill_side)이 정한다.
- 두 칸은 배관 유출구와 같은 양식이다 — [구조][형태] + 길이·높이·전/후.
구조 선택지는 기슭막이 하나뿐이지만 레이아웃을 맞추려 그대로 둔다.
- 값은 유입/유출 키로 좌·우 따로 저장한다(옛 한 벌 저장분은 양쪽으로 펼쳐 읽는다).
- 단 수에 [-][값][+] 조정칸을 붙이고, 폼 단 수를 다단 채널(extra·bextra)로
보낸다 — 배수관 측점처럼 횡단도에 단이 선다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
도면이 한 장뿐인 그룹(종단면도)과 아직 만들지 않은 그룹은 접이식 컨테이너에
항목 하나를 넣을 이유가 없다. 그룹 이름을 단 버튼 하나로 바꾼다.
- 0~1장: 컨테이너 없이 버튼 하나 (없으면 비활성 + '준비 중')
- 2장 이상(횡단면도): 기존 접이식 컨테이너 유지
- 버튼 생성은 drawingButton() 헬퍼로 합침
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
도면 구성이 확정된 12분류(표지~용지도)를 좌측 패널에 순서대로 세운다.
아직 만들지 않는 도면은 접힌 채 '준비 중'으로 자리만 잡는다.
- DRAWING_GROUPS 상수로 12개 그룹 정의, kind가 있는 둘(종단면도·횡단면도)만
서버 목록으로 채운다
- 빈 그룹은 data-pending=true + is-collapsed, 제목만 흐리게
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
작성 척도(횡단 1/100)를 도면 좌표에 넣고, A1 한 장에 들어가는 만큼 단면을 담는다.
- 횡단 좌표를 종이 mm로(x10). 수량표도 종이 치수로 재조정(폭 108mm, 행 5mm)
- 단면 폭 = 설계선이 원지반에서 갈라졌다 만나는 구간 + 여유 1.5m.
지표선도 그 범위로 자른다. 실측 갈라짐 폭 4.0~15.0m (종전 전폭 40m)
- Engine_Cad_Sheet 신설: 칸 크기는 최대 블록 기준, 좌하단부터 아래→위,
그다음 오른쪽 열로 채우고 넘치면 다음 장. 23측점 -> 4장(3열x2행)
- 목록·확정을 장 단위로. 확정 시 담긴 측점 전부의 B06 단면적을 재계산하고
수량표는 측점별로 매니페스트에 보관
- 700줄 제한: 수량표를 Engine_Cad_Table로, 라우터 동기 헬퍼를 Router_Support로 분리
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
배관 유출구 기슭막이가 폼과 다른 형태로 그려졌다. 폼은 저장된 옵션을,
그림은 조정값(m·h)을 쓰는데 둘이 어긋나도 맞추는 자리가 없었다.
조작이 정본이므로 폼이 그려진 값을 따라간다 — wallForm 의존성을 추가하고
형태·높이는 빈칸 채우기가 아니라 덮어쓰기로 바꾼다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
좌측 폼의 실시간 반영은 **고른 항목**에만 걸린다. 아무것도 고르지 않은 상태에서
형태·높이를 바꾸면 값이 조용히 버려져 "형태별 모양이 안 그려진다"로 보였다.
패널에 hasSelection()을 열고, B06에서 선택 없이 폼이 바뀌면 안내한다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
도면에 척도 개념이 없어 도각을 콘텐츠 크기에 맞춰 늘렸다 줄였다. 사용자가 정한
작성 척도로 그림 크기가 결정되도록 좌표를 종이 밀리미터로 옮긴다.
- config_system에 DRAWING_SCALE_* 상수 추가 (종단 1/1,000 x 1/200, 횡단 1/100, A1)
- 종단 좌표를 종이 mm로: 거리 x1.0, 표고는 기준선 기준 x5.0 (세로 5배 과장)
- 기준선(datum)을 종이 y=0으로 정규화, Y축 눈금 라벨은 실제 표고 유지
- frame_entities(fit=False) 추가 — 도각을 실치수 1:1로 두고 위치만 맞춘다.
콘텐츠가 작도 영역(693x468mm)을 넘으면 경고 로그
- 실측: 도각 840x594mm(A1 실치수), 콘텐츠 370x213mm (노선 350m = 350mm)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 유입구·유출구 이름표에 지금 만지는 구조물을 괄호로 단다 — "유입구 (기슭막이)".
추가 기슭막이 칸은 "추가 기슭막이 (2단)". 선택이 풀리면 원래 문구로 돌아간다.
- 추가 기슭막이 칸이 설 때 그 자리로 스크롤한다(칸이 화면 밖에서 생겼다).
- 독립 기슭막이 형태·높이가 그림에 안 실리던 두 자리를 고친다:
① 정본 읽기가 옛 전용 키(form·height_m)만 봐서 배관 키 한 벌로 저장된
값을 놓쳤다 → 배관 키 우선, 옛 키는 폴백.
② 다단 전개에 소유 벽 형태를 안 넘겨 단들이 늘 메쌓기로 그려졌다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- 옵션 토글 켜짐 색을 주 액션 색으로 바꾼다(붉은 채움이 경고처럼 읽혔다).
- 같은 문구 토스트가 연달아 오면 앞 토스트가 떠 있는 동안 무시한다.
- 벽 내부 표현을 형태별로 나눈다: 메=돌, 찰=돌+줄눈, 콘크리트=사선 해칭,
돌망태=2열 격자, 통나무=원, 바자=말뚝+엮음. 배관용·독립용·추가용이
공용 `appendWallHatch` 하나를 쓴다(배관 오버레이의 중복 코드 제거).
- 추가(다단) 기슭막이를 고르면 유입구·유출구 아래에 전용 칸이 서고
형태·높이·구간값·옵션 행이 그 칸으로 옮겨 간다. 선택이 풀리면 사라진다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
원인 추적 결과 두 겹이었다.
① 배관 벽 높이는 spec.revet_height_m을 쓰지 않는다 — revetWallSpec이 관경 기준
하한과 조정값(adjust.h)만 본다. 폼 값을 스펙에만 넣어 그림이 안 바뀌었다.
이제 폼의 높이·형태를 조정창과 같은 채널(revetOffset.update)로 보낸다.
② 형태마다 높이 한계가 있다(돌쌓기(메) 2.0m). 한계를 넘겨 입력하면 그림은 그대로인데
폼 숫자만 커져 '제어가 안 된다'로 보였다. 기하가 적용한 값을 폼에 되돌리고
한계를 토스트로 알린다.
폼 기본 높이도 스펙이 아니라 지금 그려진 순수 높이(조정창 표시값)를 쓴다.
확대가 이벤트 1회당 10% 고정이라 트랙패드처럼 잔 델타를 초당 수십 번 보내는
입력에서 튀었고, 두 손가락 이동은 팬이 아니라 확대로 먹혔다.
- zoomScreen을 부호 기반에서 델타 비례 지수식 exp(-delta*지수)로 변경.
마우스 휠 한 칸(deltaY 100)은 종전과 같은 10%, 트랙패드 잔 델타는 그만큼만
- 트랙패드 두 손가락 이동은 panScreen으로 — 마우스 휠은 한 칸이 100/120px로
딱 떨어지고 가로 델타가 없다는 성질로 기기를 가른다
- 핀치(ctrl+휠)는 기기 무관 확대, 전용 지수로 천천히
- deltaMode(줄·쪽 단위) 픽셀 환산 추가
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 사용자 지적 2건:
① 폼에서 높이·길이·기준측점 전/후를 고쳐도 도면이 그대로였다 — 조정창 조작값
(revet_adjust.h·m)이 폼 값보다 우선이라 그림이 옛 값을 유지했다. 폼이 높이·
형태를 정하면 그 벽의 조정값을 비워 폼 값이 이기게 했다.
② 폼 기본값은 예전 조정창이 보여주던 값이 기준이다 — 관 옵션이 비어 있으면
횡단 스펙(culvert 스펙: 형태·높이·길이·전/후·집수정 구간값·관종·관경)에서
채워 폼과 조정창이 같은 원천을 보게 했다. 저장된 옵션이 있으면 그쪽이 이긴다.
핀치는 ctrl+wheel 이벤트인데 CAD 휠 처리가 preventDefault를 하지 않아 브라우저
기본 확대가 그대로 실행됐다. 캔버스 밖(리본·패널)에는 휠 핸들러조차 없었다.
- 캔버스 휠 리스너를 passive:false로 등록하고 handleMouseWheel에서 preventDefault
- document에 ctrl+wheel만 막는 리스너 — 리본·패널 위 핀치도 브라우저 확대 금지,
ctrl 없는 휠은 남겨 패널 스크롤 유지
확대 감각(세기)·방향·로그는 건드리지 않았다 — 별도 제안으로 PLAN.md 보류 항목.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 사용자: 구조물 배치 컨테이너를 B06으로 가져온 이유가 이것이다 —
폼의 기준 측점 숫자를 바꾸면 관이 옮겨져야 한다.
- 관 저장기에 이동 예약(queueMove)을 더했다. 세션 키 b06:culvertmove에 담고,
[저장]·[확정]의 flush가 옵션 병합과 함께 pipe_points에 반영한다. 세부 배수유역
재분할은 서버가 관 목록을 다시 받아 처리한다.
- 폼에서 측점을 옮기면 목록·폼 캐시가 즉시 새 자리를 따르고, 옵션은 옮기기 전
자리로 예약한다(저장 시점 관 목록이 그 자리 기준).
- 이동 안내는 차단 문구에서 '저장 뒤 다시 계산' 알림으로 바꿨다.