From 97940baa8e202a9258b280b0f1eefbe1ef39c28a Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 6 Oct 2026 17:59:21 +0900 Subject: [PATCH] =?UTF-8?q?fix(B07):=20=EB=B0=B0=EC=88=98=EC=9C=A0?= =?UTF-8?q?=EC=97=AD=EB=8F=84=20=ED=92=8D=EC=84=A0=20=EC=88=AB=EC=9E=90=20?= =?UTF-8?q?=ED=9D=B0=C2=B7=EA=B2=80=EC=9D=80=20=EB=B0=94=ED=83=95=20?= =?UTF-8?q?=EB=AA=A8=EB=91=90=20=EC=9D=BD=ED=9E=88=EA=B2=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 원판 #ffffff(CAD 자동색 — 흰 바탕에서 검정으로 뒤집혀 #111111 숫자 묻힘) → #909090 회색(테마가 안 바꾸는 밝기) - 화면 픽셀 실측: 밝은 테마 대비 약 1.1:1 → 5.9:1 · 어두운 테마 5.9:1 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_013rJwJMVL4EE31y77TB11AP --- .../B07_DesignDetail_Engine_Cad_Basin.py | 6 ++-- resources/tester/test_b07_basin_badge.py | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 resources/tester/test_b07_basin_badge.py diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Basin.py b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Basin.py index a9999693d..3ce69d183 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Basin.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Basin.py @@ -76,7 +76,9 @@ _FONT_SIZE = 2.2 # 유역 번호는 해칭 위에 얹히므로 흰 원판을 깔고 그 안에 적는다(2026-08-30 사용자 지시). _NUMBER_FONT_SIZE = 4.5 _BADGE_RADIUS_MM = 3.6 -_BADGE_FILL = "#ffffff" +# 흰색(#ffffff)은 CAD 자동색이라 흰 바탕에서 검정으로 바뀌어 숫자가 묻혔다. 원판은 CAD 가 +# 밝기를 손대지 않는 회색(단순 휘도 0.58 이하)으로 둔다 — 흰·검은 바탕 모두 숫자 대비 5.9:1. +_BADGE_FILL = "#909090" _BADGE_TEXT_COLOR = "#111111" _BADGE_SEGMENTS = 24 _TITLE_FONT_SIZE = 7.0 @@ -181,7 +183,7 @@ def _hatch_entity( def _number_badge_entities( drawing_id: str, number: int, center: tuple[float, float], color: str ) -> list[dict[str, Any]]: - """유역 번호를 동그라미 배지로 그린다 — 흰 원판 + 유역색 테두리 + 검은 숫자. + """유역 번호를 동그라미 배지로 그린다 — 회색 원판 + 유역색 테두리 + 검은 숫자. 해칭 위에 그냥 문자만 올리면 무늬에 묻혀 읽히지 않는다. 원판은 solid 해치라 화면(어두운 배경)과 인쇄(흰 배경) 어느 쪽에서도 숫자가 남는다. diff --git a/resources/tester/test_b07_basin_badge.py b/resources/tester/test_b07_basin_badge.py new file mode 100644 index 000000000..23e7deac3 --- /dev/null +++ b/resources/tester/test_b07_basin_badge.py @@ -0,0 +1,31 @@ +"""B07 유역도 풍선 — 흰·검은 바탕 어느 쪽에서도 숫자가 읽히는 색 (59-5). + +CAD 그리기 규칙(openwebcad `theme.ts` paintColor): 자동색(#000000·#ffffff·#f5f7fa)은 +바탕 따라 흑백이 뒤집히고, 흰 바탕에서는 단순 휘도 0.58 초과 색을 어둡게 누른다. +""" + +from B07_DesignDetail.B07_DesignDetail_Engine_Cad_Basin import _BADGE_FILL, _BADGE_TEXT_COLOR + +_AUTO = {"#000000", "#ffffff", "#f5f7fa"} + + +def _rgb(color: str) -> tuple[int, int, int]: + return tuple(int(color[index : index + 2], 16) for index in (1, 3, 5)) + + +def _wcag(color: str) -> float: + def channel(value: int) -> float: + value /= 255 + return value / 12.92 if value <= 0.03928 else ((value + 0.055) / 1.055) ** 2.4 + + r, g, b = (channel(v) for v in _rgb(color)) + return 0.2126 * r + 0.7152 * g + 0.0722 * b + + +def test_badge_colors_survive_both_themes() -> None: + for color in (_BADGE_FILL, _BADGE_TEXT_COLOR): + assert color.lower() not in _AUTO + r, g, b = _rgb(color) + assert (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255 <= 0.58 + fill, text = _wcag(_BADGE_FILL), _wcag(_BADGE_TEXT_COLOR) + assert (max(fill, text) + 0.05) / (min(fill, text) + 0.05) >= 4.5