fix(B07): 빈 도면의 "작도 영역을 넘습니다" 경고 제거
빈 도면 7종이 도각만 두르는데도 경고를 냈음 — `build_blank_drawing()` 이 콘텐츠 bbox 로 작도 영역(`_A1_INNER`, 770×520mm)을 그대로 넘겼고, 검사 기준은 여백을 뺀 수용 한도(739×499mm)라 담을 내용이 없는데도 넘친 것으로 잡혔음. - `usable_bbox()` 신설 — 작도 영역 한가운데의 수용 한도 크기 bbox. 중심이 같아 도각 배치(이동량 0)는 그대로. - 한도와 **같은** 크기는 넘친 것이 아니므로 비교에 부동소수 여유(1e-6)를 둠. 한도를 그대로 넘기면 마지막 자리 오차로 경고가 났음. 검증: `pytest tmp/tests/ -q` 138 passed / 0 failed(경고 없음을 잠그는 1건 신규). 백엔드 재시작 뒤 화면 실측(5174, wdw): 빈 도면 7종 전부 200, 새 서버 로그의 "작도 영역을 넘습니다" **0건**. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -25,10 +25,10 @@ from B07_DesignDetail.B07_DesignDetail_Engine_Cad import (
|
||||
_layer,
|
||||
)
|
||||
from B07_DesignDetail.B07_DesignDetail_Engine_Template import (
|
||||
_A1_INNER,
|
||||
_fill_placeholders,
|
||||
_load_template,
|
||||
frame_entities,
|
||||
usable_bbox,
|
||||
)
|
||||
|
||||
COVER_TEMPLATE = "00_template_cover"
|
||||
@@ -73,8 +73,9 @@ def build_blank_drawing(drawing_id: str, label: str) -> dict[str, Any]:
|
||||
"""
|
||||
return {
|
||||
"format": DRAWING_FORMAT,
|
||||
# fit=False — 담을 콘텐츠가 없으니 A1 실치수 그대로 둔다.
|
||||
"entities": frame_entities(drawing_id, _A1_INNER, fit=False, fields={"도면명": label}),
|
||||
# fit=False — 담을 콘텐츠가 없으니 A1 실치수 그대로 둔다. bbox는 작도 영역이
|
||||
# 아니라 **수용 한도**를 준다(`_A1_INNER`를 주면 여백만큼 넘쳐 경고가 뜬다).
|
||||
"entities": frame_entities(drawing_id, usable_bbox(), fit=False, fields={"도면명": label}),
|
||||
"layers": [
|
||||
_layer(BLANK_LAYER_ID, "작도"),
|
||||
_layer(FRAME_LAYER_ID, "도각", locked=True),
|
||||
|
||||
@@ -259,6 +259,19 @@ def compass_entities(
|
||||
]
|
||||
|
||||
|
||||
def usable_bbox() -> tuple[float, float, float, float]:
|
||||
"""작도 영역 한가운데에 놓인 **수용 한도 크기**의 빈 bbox.
|
||||
|
||||
담을 내용이 없는 도면(빈 도면)이 도각만 두를 때 쓴다. `_A1_INNER`를 그대로 넘기면
|
||||
여백을 뺀 한도(`usable_area()`)보다 커서 "작도 영역을 넘습니다" 경고가 뜬다 —
|
||||
내용이 없는데 넘칠 리 없다. 중심이 같으므로 도각 배치(이동량 0)는 그대로다.
|
||||
"""
|
||||
ix0, iy0, ix1, iy1 = _A1_INNER
|
||||
width, height = usable_area()
|
||||
cx, cy = (ix0 + ix1) / 2.0, (iy0 + iy1) / 2.0
|
||||
return (cx - width / 2.0, cy - height / 2.0, cx + width / 2.0, cy + height / 2.0)
|
||||
|
||||
|
||||
def usable_area() -> tuple[float, float]:
|
||||
"""A1 내부 작도 영역에서 여백을 뺀 유효 크기(mm). 척도 고정 도면의 수용 한도."""
|
||||
ix0, iy0, ix1, iy1 = _A1_INNER
|
||||
@@ -344,7 +357,9 @@ def frame_entities(
|
||||
ix0, iy0, ix1, iy1 = _A1_INNER
|
||||
usable_w, usable_h = usable_area()
|
||||
scale = max(content_w / usable_w, content_h / usable_h) if fit else 1.0
|
||||
if not fit and (content_w > usable_w or content_h > usable_h):
|
||||
# 한도와 **같은** 크기는 넘친 것이 아니다 — 부동소수 오차만큼의 여유를 둔다
|
||||
# (수용 한도를 그대로 넘기는 빈 도면이 마지막 자리 오차로 경고를 냈다).
|
||||
if not fit and (content_w > usable_w + 1e-6 or content_h > usable_h + 1e-6):
|
||||
logger.warning(
|
||||
"도면 콘텐츠가 A1 작도 영역을 넘습니다: %s (%.0fx%.0f mm > %.0fx%.0f mm)",
|
||||
drawing_id,
|
||||
|
||||
Reference in New Issue
Block a user