diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Cover.py b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Cover.py index dbea164d..e9dbf92b 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Cover.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Cover.py @@ -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), diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Template.py b/B07_DesignDetail/B07_DesignDetail_Engine_Template.py index cace17bc..ecb09ad0 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Template.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Template.py @@ -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,