fix(clinical): 좌우 정렬을 부착 위치에서 하도록 안내

좌우 단계를 붙이면서 순서를 화면이 말해 주지 않았다.

1단계가 끝난 시점에 프로브는 **최적 위치**에 있고, 실제로 부착할 자리는 그보다 1cm
위다(오프셋 자리는 측정하지 않는다 — 설계상 지표가 나빠 재확인하면 반드시 미달이 뜬다).
그런데 좌우 카드가 그 사이에 "옮기세요" 없이 바로 나왔다.

좌우 균형은 그 높이의 단면에서 정해지는 값이라 높이를 바꾸면 u4·u5 가 달라진다. 옮기기
전에 맞추면 헛일이 되는데, 화면이 순서를 말하지 않으면 간호사마다 갈린다 — 맞춘 뒤
올리는 사람과 올린 뒤 맞추는 사람이 생기고, 둘의 데이터가 다른 조건이 된다.

카드 상단에 부착 위치를 명시하고, 시작 버튼 문구에도 cm 을 박았다("3cm 에서 좌우 정렬
시작"). 누르는 순간에도 어느 높이인지 눈에 들어와야 위 안내를 지나친 경우를 잡는다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 12:15:36 +09:00
parent bd7fb05c6e
commit b1975408e3
@@ -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(
// 균형에 도달했을 때만 누를 수 있다. 아무 때나 확인 처리하면 이 표시가