fix(B07): 횡단면도 박스가 화면 덧그림(B06 설계선·구조물)까지 1 mm 로 감쌈
- 덧그림 범위를 서버가 화면과 같은 TS 로 셈 — Node 진입점 B07_DesignDetail_Cross_Extent_Node(최소 DOM 위에서 오프스크린 SVG 그리기 그대로) · 번들 build:b07-extent - 화면 그리기·수확 부분을 B07_DesignDetail_Cross_Overlay 로 떼어 화면과 Node 가 한 벌로 씀 - 장 배치·블록 테두리가 측점별 덧그림 범위를 덮음(목록·장 열기·확정·수정 네 길 모두 같은 계획) - 글자는 CAD 그리기대로 세로 가운데 · 폭은 글꼴 어림(한글 1.0 · 나머지 0.6 배) - 번들 낡음 판정에 B07 맨 위 TS 포함 - 검증_sub4: 66개 박스 ↔ 그림(덧그림·글자 실폭 포함) 모두 1.0 mm · 잘림 0 · 겹침 0 · 20장 → 21장 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013rJwJMVL4EE31y77TB11AP
This commit is contained in:
@@ -50,6 +50,7 @@ from B07_DesignDetail.B07_DesignDetail_Router_Support import (
|
||||
landuse_source,
|
||||
watershed_source,
|
||||
)
|
||||
from B07_DesignDetail.B07_DesignDetail_Router_Support_Overlay import cross_overlay_extents
|
||||
from B07_DesignDetail.B07_DesignDetail_Router_Support_Plan import PLAN_KIND_ID, plan_kind_source
|
||||
from B07_DesignDetail.B07_DesignDetail_Schema import (
|
||||
DesignDrawingConfirmRequest,
|
||||
@@ -271,7 +272,10 @@ async def get_design_drawing_list(
|
||||
try:
|
||||
route_id, project_root, longitudinal_path, bypass = await _confirmed_source(project_id)
|
||||
designs = await _designs_by_chainage(route_id)
|
||||
drawings = await asyncio.to_thread(_drawing_list, project_root, longitudinal_path, designs)
|
||||
overlays = await cross_overlay_extents(project_id, route_id)
|
||||
drawings = await asyncio.to_thread(
|
||||
_drawing_list, project_root, longitudinal_path, designs, overlays
|
||||
)
|
||||
return DesignDrawingListResponse(
|
||||
project_id=str(project_id), route_id=route_id, drawings=drawings, dev_bypass=bypass
|
||||
)
|
||||
@@ -301,6 +305,7 @@ async def get_design_drawing(
|
||||
# 횡단도는 B06 지정 설계를 먼저 읽어 CAD 계획선(design_line)과 응답에 함께 쓴다.
|
||||
design: dict[str, Any] | None = None
|
||||
source_design: Any = None
|
||||
overlays: dict[Any, Any] | None = None
|
||||
cross_match = _CROSS_ID.fullmatch(drawing_id)
|
||||
if cross_match:
|
||||
pool = get_db_pool()
|
||||
@@ -312,6 +317,7 @@ async def get_design_drawing(
|
||||
elif CROSS_SHEET_ID.fullmatch(drawing_id):
|
||||
# 장은 여러 측점을 담으므로 노선 전체 지정을 한 번에 읽어 넘긴다.
|
||||
source_design = await _designs_by_chainage(route_id)
|
||||
overlays = await cross_overlay_extents(project_id, route_id)
|
||||
elif drawing_id == MASS_HAUL_ID:
|
||||
# 유토곡선은 B06 확정 시 종단 레코드에 저장해 둔 산출물을 그대로 쓴다.
|
||||
pool = get_db_pool()
|
||||
@@ -364,6 +370,7 @@ async def get_design_drawing(
|
||||
longitudinal_path,
|
||||
drawing_id,
|
||||
source_design,
|
||||
overlays,
|
||||
)
|
||||
return DesignDrawingResponse(
|
||||
project_id=str(project_id),
|
||||
@@ -406,14 +413,17 @@ async def confirm_design_drawing(
|
||||
try:
|
||||
route_id, project_root, longitudinal_path, bypass = await _confirmed_source(project_id)
|
||||
designs = await _designs_by_chainage(route_id)
|
||||
items = await asyncio.to_thread(_drawing_list, project_root, longitudinal_path, designs)
|
||||
overlays = await cross_overlay_extents(project_id, route_id)
|
||||
items = await asyncio.to_thread(
|
||||
_drawing_list, project_root, longitudinal_path, designs, overlays
|
||||
)
|
||||
item = next((candidate for candidate in items if candidate.id == drawing_id), None)
|
||||
if not item:
|
||||
raise FileNotFoundError("확정할 도면을 찾을 수 없습니다.")
|
||||
sheet = None
|
||||
if CROSS_SHEET_ID.fullmatch(drawing_id):
|
||||
plan = await asyncio.to_thread(
|
||||
_cross_sheet_plan, project_root, longitudinal_path, designs
|
||||
_cross_sheet_plan, project_root, longitudinal_path, designs, overlays
|
||||
)
|
||||
sheet = next((entry for entry in plan if entry["id"] == drawing_id), None)
|
||||
# 수량표는 CAD 테이블(Text 엔티티)에서 역추출을 우선하고, 없으면 요청 본문 폴백.
|
||||
@@ -511,7 +521,10 @@ async def invalidate_design_drawing(
|
||||
# 설계 없이 만들면 방금 확정한 장 id 가 목록에 없어 [수정]이 404 로 막힌다
|
||||
# (2026-09-03 실측: `cross_s00220m` 확정 후 확정 해제 불가).
|
||||
designs = await _designs_by_chainage(route_id)
|
||||
items = await asyncio.to_thread(_drawing_list, project_root, longitudinal_path, designs)
|
||||
overlays = await cross_overlay_extents(project_id, route_id)
|
||||
items = await asyncio.to_thread(
|
||||
_drawing_list, project_root, longitudinal_path, designs, overlays
|
||||
)
|
||||
if drawing_id not in {item.id for item in items}:
|
||||
raise FileNotFoundError("변경된 도면을 찾을 수 없습니다.")
|
||||
await asyncio.to_thread(_invalidate_drawing, project_root, drawing_id)
|
||||
@@ -522,7 +535,7 @@ async def invalidate_design_drawing(
|
||||
stale = [parse_cross_key(cross_match.group(1))]
|
||||
elif CROSS_SHEET_ID.fullmatch(drawing_id):
|
||||
plan = await asyncio.to_thread(
|
||||
_cross_sheet_plan, project_root, longitudinal_path, designs
|
||||
_cross_sheet_plan, project_root, longitudinal_path, designs, overlays
|
||||
)
|
||||
sheet = next((entry for entry in plan if entry["id"] == drawing_id), None)
|
||||
stale = list(sheet["chainages"]) if sheet else []
|
||||
|
||||
Reference in New Issue
Block a user