From b1975408e36f186c5e576339b835a54548307660 Mon Sep 17 00:00:00 2001 From: jjangddu Date: Tue, 8 Sep 2026 12:15:36 +0900 Subject: [PATCH] =?UTF-8?q?fix(clinical):=20=EC=A2=8C=EC=9A=B0=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC=EC=9D=84=20=EB=B6=80=EC=B0=A9=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=95=88?= =?UTF-8?q?=EB=82=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 좌우 단계를 붙이면서 순서를 화면이 말해 주지 않았다. 1단계가 끝난 시점에 프로브는 **최적 위치**에 있고, 실제로 부착할 자리는 그보다 1cm 위다(오프셋 자리는 측정하지 않는다 — 설계상 지표가 나빠 재확인하면 반드시 미달이 뜬다). 그런데 좌우 카드가 그 사이에 "옮기세요" 없이 바로 나왔다. 좌우 균형은 그 높이의 단면에서 정해지는 값이라 높이를 바꾸면 u4·u5 가 달라진다. 옮기기 전에 맞추면 헛일이 되는데, 화면이 순서를 말하지 않으면 간호사마다 갈린다 — 맞춘 뒤 올리는 사람과 올린 뒤 맞추는 사람이 생기고, 둘의 데이터가 다른 조건이 된다. 카드 상단에 부착 위치를 명시하고, 시작 버튼 문구에도 cm 을 박았다("3cm 에서 좌우 정렬 시작"). 누르는 순간에도 어느 높이인지 눈에 들어와야 위 안내를 지나친 경우를 잡는다. Co-Authored-By: Claude Opus 5 --- .../ui/views/clinical/AnchorAlignView.kt | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/medithings/vesiscan/ui/views/clinical/AnchorAlignView.kt b/app/src/main/java/com/medithings/vesiscan/ui/views/clinical/AnchorAlignView.kt index 3ff83ad..5992b81 100644 --- a/app/src/main/java/com/medithings/vesiscan/ui/views/clinical/AnchorAlignView.kt +++ b/app/src/main/java/com/medithings/vesiscan/ui/views/clinical/AnchorAlignView.kt @@ -468,6 +468,7 @@ fun AnchorAlignView(appState: AppState) { // ── 2단계: 좌우 정렬 ─────────────────────────────────────── // 상하가 정해진 자리에서 프로브를 좌우로만 움직여 CH4·CH5 를 맞춘다. LateralSection( + anchorCm = last?.anchorCm, running = lrRunning, commit = lrCommit, accumulated = lrAccum, @@ -559,6 +560,8 @@ fun AnchorAlignView(appState: AppState) { */ @Composable private fun LateralSection( + /** 부착 위치(best + 오프셋). 좌우는 **이 높이에서** 맞춰야 한다. */ + anchorCm: Int?, running: Boolean, commit: LateralGuide.Commit?, accumulated: Int, @@ -587,9 +590,29 @@ private fun LateralSection( if (confirmed) Text("확인됨", fontSize = 12.sp, color = MlSuccess, fontWeight = FontWeight.SemiBold) } - Spacer(Modifier.height(4.dp)) + Spacer(Modifier.height(10.dp)) + + // 1단계가 끝난 시점에 프로브는 **최적 위치**에 있고, 부착할 자리는 그보다 1cm + // 위다(오프셋 자리는 측정하지 않는다). 좌우 균형은 그 높이의 단면에서 정해지는 + // 값이라 높이를 바꾸면 u4·u5 가 달라진다 — 옮기기 **전에** 맞추면 헛일이 된다. + // 화면이 이걸 말해 주지 않으면 간호사마다 순서가 갈린다. + anchorCm?.let { anchor -> + Box( + Modifier.fillMaxWidth() + .background(MlPrimary.copy(alpha = 0.10f), RoundedCornerShape(10.dp)) + .padding(10.dp) + ) { + Text( + "먼저 프로브를 부착 위치 ${anchor}cm 로 옮기세요. " + + "좌우는 그 높이에서 맞춥니다.", + fontSize = 13.sp, fontWeight = FontWeight.SemiBold, color = MlPrimary, + ) + } + Spacer(Modifier.height(10.dp)) + } + Text( - "위치는 그대로 두고 프로브를 좌우로만 옮기며 맞춥니다. " + + "높이는 그대로 두고 프로브를 좌우로만 옮기며 맞춥니다. " + "|ch4−ch5| ≤ ${AlignmentConstants.LAT_TOL} 이면 완료입니다.", fontSize = 12.sp, color = MlSecondaryText, ) @@ -644,7 +667,18 @@ private fun LateralSection( shape = RoundedCornerShape(12.dp), colors = ButtonDefaults.buttonColors( containerColor = if (running) MlCritical else MlPrimary), - ) { Text(if (running) "정지" else "좌우 정렬 시작", fontWeight = FontWeight.Bold) } + ) { + // 버튼 문구에 cm 을 박아 둔다 — 누르는 순간에도 "어느 높이에서" 가 + // 눈에 들어와야 위 안내를 지나친 경우를 잡는다. + Text( + when { + running -> "정지" + anchorCm != null -> "${anchorCm}cm 에서 좌우 정렬 시작" + else -> "좌우 정렬 시작" + }, + fontWeight = FontWeight.Bold, + ) + } Spacer(Modifier.width(8.dp)) Button( // 균형에 도달했을 때만 누를 수 있다. 아무 때나 확인 처리하면 이 표시가