ui(align): 지시문 카드의 방향 화살표(↑↓●)를 뺀다
"치골 위 N cm" 하나만 말하기로 한 마당에 화살표가 남아 있으면 다시 방향을, 그러면 "얼마나"를 세게 된다(2026-09-29 현장 의견). AlignInstruction 에서 arrow 를 없앤다 — 좌우 정렬 단계의 ←/→/■ 는 좌우로 얼마나 움직일지 알려 주는 다른 것이라 그대로다. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -29,7 +29,7 @@
|
|||||||
* 치골 위 1cm 에서 한 번 더 측정 [1cm 측정하기] (이미 그 자리)
|
* 치골 위 1cm 에서 한 번 더 측정 [1cm 측정하기] (이미 그 자리)
|
||||||
* **치골 위 2cm 에 붙이세요 (재지 말고 좌우로)** — 버튼 없음
|
* **치골 위 2cm 에 붙이세요 (재지 말고 좌우로)** — 버튼 없음
|
||||||
*
|
*
|
||||||
* 화살표(↑↓●)는 지금 자리에서 어느 쪽인지 눈으로만 거든다 — 글에는 방향을 쓰지 않는다.
|
* 방향(올리세요/내리세요·화살표)은 어디에도 쓰지 않는다 — 치골 위 N cm 하나면 된다.
|
||||||
*
|
*
|
||||||
* 마지막 +1cm 자리는 **측정하지 않는다**. 설계상 그 자리는 지표가 나쁘므로, 재확인하면
|
* 마지막 +1cm 자리는 **측정하지 않는다**. 설계상 그 자리는 지표가 나쁘므로, 재확인하면
|
||||||
* 반드시 "미달"이 떠서 도달 전에 멈추게 된다.
|
* 반드시 "미달"이 떠서 도달 전에 멈추게 된다.
|
||||||
@@ -718,8 +718,6 @@ fun AnchorAlignView(appState: AppState) {
|
|||||||
) {
|
) {
|
||||||
val fg = if (instr.done) Color.White else MlPrimary
|
val fg = if (instr.done) Color.White else MlPrimary
|
||||||
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
Text(instr.arrow, fontSize = 40.sp, fontWeight = FontWeight.Bold, color = fg)
|
|
||||||
Spacer(Modifier.height(2.dp))
|
|
||||||
Text(instr.headline, fontSize = 24.sp, fontWeight = FontWeight.Bold,
|
Text(instr.headline, fontSize = 24.sp, fontWeight = FontWeight.Bold,
|
||||||
color = fg, textAlign = TextAlign.Center)
|
color = fg, textAlign = TextAlign.Center)
|
||||||
instr.sub?.let {
|
instr.sub?.let {
|
||||||
@@ -1248,7 +1246,7 @@ private fun RecordRow(
|
|||||||
* "위치"라는 이름의 숫자였다. 그래서 상대 이동("2cm 내리고 측정")으로 바꿨는데 그것도
|
* "위치"라는 이름의 숫자였다. 그래서 상대 이동("2cm 내리고 측정")으로 바꿨는데 그것도
|
||||||
* 헷갈렸다(2026-09-29 현장) — 판정 결과 "N cm" 옆에 "아래로 2cm" 가 붙어 다시 숫자가
|
* 헷갈렸다(2026-09-29 현장) — 판정 결과 "N cm" 옆에 "아래로 2cm" 가 붙어 다시 숫자가
|
||||||
* 둘이 됐다. 치골은 손으로 짚는 기준점이라 **치골 위 절대 위치** 하나면 셀 것이 없다.
|
* 둘이 됐다. 치골은 손으로 짚는 기준점이라 **치골 위 절대 위치** 하나면 셀 것이 없다.
|
||||||
* 화살표는 지금 자리에서 어느 쪽인지 눈으로만 거든다.
|
* 화살표도 뺐다(같은 날) — 방향을 보이면 다시 "얼마나"를 세게 된다.
|
||||||
*
|
*
|
||||||
* | 상태 | 지시 |
|
* | 상태 | 지시 |
|
||||||
* |---|---|
|
* |---|---|
|
||||||
@@ -1261,7 +1259,6 @@ private fun RecordRow(
|
|||||||
* @param nextCm 화면이 다음에 재려는 위치(치골 위 cm). 호출부가 판정 뒤 이미 갱신해 둔다.
|
* @param nextCm 화면이 다음에 재려는 위치(치골 위 cm). 호출부가 판정 뒤 이미 갱신해 둔다.
|
||||||
*/
|
*/
|
||||||
internal data class AlignInstruction(
|
internal data class AlignInstruction(
|
||||||
val arrow: String,
|
|
||||||
val headline: String,
|
val headline: String,
|
||||||
val sub: String?,
|
val sub: String?,
|
||||||
/** 확정 상태 — 카드를 통째로 초록으로 칠한다. */
|
/** 확정 상태 — 카드를 통째로 초록으로 칠한다. */
|
||||||
@@ -1283,49 +1280,45 @@ internal fun instructionOf(
|
|||||||
/** 후보가 하나도 없어 재부착이 필요한가. */
|
/** 후보가 하나도 없어 재부착이 필요한가. */
|
||||||
needReattach: Boolean = false,
|
needReattach: Boolean = false,
|
||||||
): AlignInstruction = when {
|
): AlignInstruction = when {
|
||||||
step == null -> AlignInstruction(
|
step == null -> AlignInstruction("치골 위 0cm 에 붙이고 측정",
|
||||||
"●", "치골 위 0cm 에 붙이고 측정",
|
|
||||||
"젤을 바르고, 프로브를 치골 바로 위에 밀착시킵니다.")
|
"젤을 바르고, 프로브를 치골 바로 위에 밀착시킵니다.")
|
||||||
|
|
||||||
// 확인 측정까지 끝났다 — 오프셋 자리에 붙이고 좌우로. 그 자리는 재지 않는다.
|
// 확인 측정까지 끝났다 — 오프셋 자리에 붙이고 좌우로. 그 자리는 재지 않는다.
|
||||||
confirmDone -> {
|
confirmDone -> {
|
||||||
val attach = (confirmTarget ?: step.record?.cm ?: nextCm) + offsetCm
|
val attach = (confirmTarget ?: step.record?.cm ?: nextCm) + offsetCm
|
||||||
AlignInstruction(
|
AlignInstruction("치골 위 ${attach}cm 에 붙이세요",
|
||||||
"↑", "치골 위 ${attach}cm 에 붙이세요",
|
|
||||||
"여기서는 측정하지 않습니다. 붙인 뒤 좌우 맞추기로 넘어갑니다.",
|
"여기서는 측정하지 않습니다. 붙인 뒤 좌우 맞추기로 넘어갑니다.",
|
||||||
done = true)
|
done = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 수집 중에는 판정이 뭐라 하든 다음 자리로 간다. 판정은 다 재고 나서 한다.
|
// 수집 중에는 판정이 뭐라 하든 다음 자리로 간다. 판정은 다 재고 나서 한다.
|
||||||
sweeping -> AlignInstruction(
|
sweeping -> AlignInstruction("치골 위 ${nextCm}cm 에 붙이고 측정",
|
||||||
"↑", "치골 위 ${nextCm}cm 에 붙이고 측정",
|
|
||||||
decidedAtCm?.let {
|
decidedAtCm?.let {
|
||||||
"0~${AnchorConfig.SEARCH_MAX_CM}cm 를 전부 잽니다. " +
|
"0~${AnchorConfig.SEARCH_MAX_CM}cm 를 전부 잽니다. " +
|
||||||
"(옛 방식이면 ${it}cm 에서 멈췄을 자리입니다 — 지금은 다 재고 판정합니다.)"
|
"(옛 방식이면 ${it}cm 에서 멈췄을 자리입니다 — 지금은 다 재고 판정합니다.)"
|
||||||
} ?: "0~${AnchorConfig.SEARCH_MAX_CM}cm 를 전부 잽니다.")
|
} ?: "0~${AnchorConfig.SEARCH_MAX_CM}cm 를 전부 잽니다.")
|
||||||
|
|
||||||
// 다 쟀는데 후보가 하나도 없다.
|
// 다 쟀는데 후보가 하나도 없다.
|
||||||
needReattach -> AlignInstruction(
|
needReattach -> AlignInstruction("더 아래에 다시 붙이세요",
|
||||||
"↓", "더 아래에 다시 붙이세요",
|
|
||||||
"잰 위치 중 CH3 이 제대로 잡힌 곳이 없습니다. 치골 쪽으로 내려 다시 부착한 뒤 " +
|
"잰 위치 중 CH3 이 제대로 잡힌 곳이 없습니다. 치골 쪽으로 내려 다시 부착한 뒤 " +
|
||||||
"[처음부터 다시 정렬] 을 눌러 주세요.")
|
"[처음부터 다시 정렬] 을 눌러 주세요.")
|
||||||
|
|
||||||
// 판정된 자리로 이동 → 확인 측정. 화살표만 방향을 거든다.
|
// 판정된 자리로 이동 → 확인 측정. 이미 그 자리인지만 가른다.
|
||||||
confirmTarget != null -> {
|
confirmTarget != null -> {
|
||||||
val from = step.record?.cm ?: confirmTarget
|
val from = step.record?.cm ?: confirmTarget
|
||||||
val delta = confirmTarget - from
|
val delta = confirmTarget - from
|
||||||
when {
|
when {
|
||||||
delta > 0 -> AlignInstruction("↑", "치골 위 ${confirmTarget}cm 에 다시 붙이고 측정",
|
delta > 0 -> AlignInstruction("치골 위 ${confirmTarget}cm 에 다시 붙이고 측정",
|
||||||
"잰 위치 전부로 고른 자리입니다. 여기서 확인 측정 한 번 합니다.")
|
"잰 위치 전부로 고른 자리입니다. 여기서 확인 측정 한 번 합니다.")
|
||||||
delta < 0 -> AlignInstruction("↓", "치골 위 ${confirmTarget}cm 에 다시 붙이고 측정",
|
delta < 0 -> AlignInstruction("치골 위 ${confirmTarget}cm 에 다시 붙이고 측정",
|
||||||
"잰 위치 전부로 고른 자리입니다. 여기서 확인 측정 한 번 합니다.")
|
"잰 위치 전부로 고른 자리입니다. 여기서 확인 측정 한 번 합니다.")
|
||||||
else -> AlignInstruction("●", "치골 위 ${confirmTarget}cm 에서 한 번 더 측정",
|
else -> AlignInstruction("치골 위 ${confirmTarget}cm 에서 한 번 더 측정",
|
||||||
"옮겨 온 자리의 상태를 확인하는 마지막 측정입니다.")
|
"옮겨 온 자리의 상태를 확인하는 마지막 측정입니다.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 여기까지 오면 아직 한 위치도 못 쟀거나 상태가 어긋난 것이다.
|
// 여기까지 오면 아직 한 위치도 못 쟀거나 상태가 어긋난 것이다.
|
||||||
else -> AlignInstruction("↑", "치골 위 ${nextCm}cm 에 붙이고 측정", null)
|
else -> AlignInstruction("치골 위 ${nextCm}cm 에 붙이고 측정", null)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+2
-10
@@ -19,8 +19,8 @@ import org.junit.Test
|
|||||||
* 쪽을 크게 보여 줬기 때문이다. 여기서는 **헷갈림 자체가 고치려던 결함**이라 문구가
|
* 쪽을 크게 보여 줬기 때문이다. 여기서는 **헷갈림 자체가 고치려던 결함**이라 문구가
|
||||||
* 요구사항이다.
|
* 요구사항이다.
|
||||||
*
|
*
|
||||||
* **① ′ 상대 이동("올리고/내리고")도 나오면 안 된다.** 2026-09-29 현장: 판정 "N cm" 옆에
|
* **① ′ 상대 이동("올리고/내리고")도, 화살표도 나오면 안 된다.** 2026-09-29 현장: 판정
|
||||||
* "아래로 2cm" 가 붙어 다시 숫자가 둘이 됐다. 지시는 **치골 위 절대 위치 하나**다.
|
* "N cm" 옆에 "아래로 2cm" 가 붙어 다시 숫자가 둘이 됐다. 지시는 **치골 위 절대 위치 하나**다.
|
||||||
*
|
*
|
||||||
* **② 단계 순서.** 2026-09-10 부터 흐름이 바뀌었다:
|
* **② 단계 순서.** 2026-09-10 부터 흐름이 바뀌었다:
|
||||||
*
|
*
|
||||||
@@ -56,7 +56,6 @@ class AlignInstructionTest {
|
|||||||
|
|
||||||
@Test fun `첫 측정 전에는 붙일 자리를 말한다`() {
|
@Test fun `첫 측정 전에는 붙일 자리를 말한다`() {
|
||||||
val i = instructionOf(null, nextCm = 0, offsetCm = 1)
|
val i = instructionOf(null, nextCm = 0, offsetCm = 1)
|
||||||
assertEquals("●", i.arrow)
|
|
||||||
assertTrue(i.headline.contains("치골"))
|
assertTrue(i.headline.contains("치골"))
|
||||||
assertFalse(i.done)
|
assertFalse(i.done)
|
||||||
assertNoPositionWords(i)
|
assertNoPositionWords(i)
|
||||||
@@ -66,7 +65,6 @@ class AlignInstructionTest {
|
|||||||
|
|
||||||
@Test fun `수집 중에는 다음 자리를 치골 위 절대 위치로 말한다`() {
|
@Test fun `수집 중에는 다음 자리를 치골 위 절대 위치로 말한다`() {
|
||||||
val i = instructionOf(step(0), nextCm = 1, offsetCm = 1, sweeping = true)
|
val i = instructionOf(step(0), nextCm = 1, offsetCm = 1, sweeping = true)
|
||||||
assertEquals("↑", i.arrow)
|
|
||||||
assertEquals("치골 위 1cm 에 붙이고 측정", i.headline)
|
assertEquals("치골 위 1cm 에 붙이고 측정", i.headline)
|
||||||
assertTrue("어디까지 재는지 말해야 멈추지 않는다",
|
assertTrue("어디까지 재는지 말해야 멈추지 않는다",
|
||||||
i.sub!!.contains("${AnchorConfig.SEARCH_MAX_CM}cm"))
|
i.sub!!.contains("${AnchorConfig.SEARCH_MAX_CM}cm"))
|
||||||
@@ -90,7 +88,6 @@ class AlignInstructionTest {
|
|||||||
// 못 가고 데이터가 비어 버린다.
|
// 못 가고 데이터가 비어 버린다.
|
||||||
val i = instructionOf(step(2, searching = false, bestCm = 0),
|
val i = instructionOf(step(2, searching = false, bestCm = 0),
|
||||||
nextCm = 3, offsetCm = 1, sweeping = true, confirmTarget = 0)
|
nextCm = 3, offsetCm = 1, sweeping = true, confirmTarget = 0)
|
||||||
assertEquals("↑", i.arrow)
|
|
||||||
assertEquals("치골 위 3cm 에 붙이고 측정", i.headline)
|
assertEquals("치골 위 3cm 에 붙이고 측정", i.headline)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,7 +98,6 @@ class AlignInstructionTest {
|
|||||||
// 화살표만 — 글에 "3cm 내리고" 를 쓰면 판정 숫자와 이동 숫자가 나란히 보여 헷갈린다.
|
// 화살표만 — 글에 "3cm 내리고" 를 쓰면 판정 숫자와 이동 숫자가 나란히 보여 헷갈린다.
|
||||||
val i = instructionOf(step(4, searching = false, bestCm = 0),
|
val i = instructionOf(step(4, searching = false, bestCm = 0),
|
||||||
nextCm = 1, offsetCm = 1, confirmTarget = 1)
|
nextCm = 1, offsetCm = 1, confirmTarget = 1)
|
||||||
assertEquals("↓", i.arrow)
|
|
||||||
assertEquals("치골 위 1cm 에 다시 붙이고 측정", i.headline)
|
assertEquals("치골 위 1cm 에 다시 붙이고 측정", i.headline)
|
||||||
assertTrue("왜 그 자리인지 말해야 한다", i.sub!!.contains("전부"))
|
assertTrue("왜 그 자리인지 말해야 한다", i.sub!!.contains("전부"))
|
||||||
assertNoPositionWords(i)
|
assertNoPositionWords(i)
|
||||||
@@ -110,7 +106,6 @@ class AlignInstructionTest {
|
|||||||
@Test fun `판정된 자리가 위면 올리라고 한다`() {
|
@Test fun `판정된 자리가 위면 올리라고 한다`() {
|
||||||
val i = instructionOf(step(0, searching = false, bestCm = 0),
|
val i = instructionOf(step(0, searching = false, bestCm = 0),
|
||||||
nextCm = 3, offsetCm = 1, confirmTarget = 3)
|
nextCm = 3, offsetCm = 1, confirmTarget = 3)
|
||||||
assertEquals("↑", i.arrow)
|
|
||||||
assertEquals("치골 위 3cm 에 다시 붙이고 측정", i.headline)
|
assertEquals("치골 위 3cm 에 다시 붙이고 측정", i.headline)
|
||||||
assertNoPositionWords(i)
|
assertNoPositionWords(i)
|
||||||
}
|
}
|
||||||
@@ -119,7 +114,6 @@ class AlignInstructionTest {
|
|||||||
// 이 화면에서 제일 많이 나오는 질문이 "왜 방금 잰 자리를 또 재냐"다.
|
// 이 화면에서 제일 많이 나오는 질문이 "왜 방금 잰 자리를 또 재냐"다.
|
||||||
val i = instructionOf(step(2, searching = false, bestCm = 2),
|
val i = instructionOf(step(2, searching = false, bestCm = 2),
|
||||||
nextCm = 2, offsetCm = 1, confirmTarget = 2)
|
nextCm = 2, offsetCm = 1, confirmTarget = 2)
|
||||||
assertEquals("●", i.arrow)
|
|
||||||
assertTrue(i.headline.contains("한 번 더"))
|
assertTrue(i.headline.contains("한 번 더"))
|
||||||
assertNotNull("이유가 없으면 또 물어본다", i.sub)
|
assertNotNull("이유가 없으면 또 물어본다", i.sub)
|
||||||
assertNoPositionWords(i)
|
assertNoPositionWords(i)
|
||||||
@@ -131,7 +125,6 @@ class AlignInstructionTest {
|
|||||||
// 여기가 제일 중요하다. 그 자리를 측정하면 설계상 "미달"이 떠서 되돌아간다.
|
// 여기가 제일 중요하다. 그 자리를 측정하면 설계상 "미달"이 떠서 되돌아간다.
|
||||||
val i = instructionOf(step(2, searching = false, bestCm = 2),
|
val i = instructionOf(step(2, searching = false, bestCm = 2),
|
||||||
nextCm = 2, offsetCm = 1, confirmTarget = 2, confirmDone = true)
|
nextCm = 2, offsetCm = 1, confirmTarget = 2, confirmDone = true)
|
||||||
assertEquals("↑", i.arrow)
|
|
||||||
assertEquals("치골 위 3cm 에 붙이세요", i.headline)
|
assertEquals("치골 위 3cm 에 붙이세요", i.headline)
|
||||||
assertTrue("측정하지 말라는 말이 빠지면 안 된다", i.sub!!.contains("측정하지 않습니다"))
|
assertTrue("측정하지 말라는 말이 빠지면 안 된다", i.sub!!.contains("측정하지 않습니다"))
|
||||||
assertTrue("다음 단계를 말해야 멈추지 않는다", i.sub!!.contains("좌우"))
|
assertTrue("다음 단계를 말해야 멈추지 않는다", i.sub!!.contains("좌우"))
|
||||||
@@ -172,7 +165,6 @@ class AlignInstructionTest {
|
|||||||
@Test fun `후보가 없으면 아래로 내려 다시 붙이라고 한다`() {
|
@Test fun `후보가 없으면 아래로 내려 다시 붙이라고 한다`() {
|
||||||
val i = instructionOf(step(4, searching = false, bestCm = null),
|
val i = instructionOf(step(4, searching = false, bestCm = null),
|
||||||
nextCm = 4, offsetCm = 1, needReattach = true)
|
nextCm = 4, offsetCm = 1, needReattach = true)
|
||||||
assertEquals("↓", i.arrow)
|
|
||||||
assertTrue(i.headline.contains("아래"))
|
assertTrue(i.headline.contains("아래"))
|
||||||
assertTrue("무엇을 눌러야 하는지 말해야 한다", i.sub!!.contains("처음부터"))
|
assertTrue("무엇을 눌러야 하는지 말해야 한다", i.sub!!.contains("처음부터"))
|
||||||
assertFalse(i.done)
|
assertFalse(i.done)
|
||||||
|
|||||||
@@ -375,21 +375,21 @@ val anchorCm: Int? get() = bestCm?.let { it + offsetCm } // offsetCm = 1
|
|||||||
### 3.6 실제 진행 순서
|
### 3.6 실제 진행 순서
|
||||||
|
|
||||||
```
|
```
|
||||||
치골 위 0cm 에 붙이고 측정 → ↑ 치골 위 1cm 에 붙이고 측정
|
치골 위 0cm 에 붙이고 측정 → 치골 위 1cm 에 붙이고 측정
|
||||||
→ ↑ 치골 위 2cm 에 붙이고 측정 (판정이 나빠져도 멈추지 않습니다)
|
→ 치골 위 2cm 에 붙이고 측정 (판정이 나빠져도 멈추지 않습니다)
|
||||||
→ … 4cm 까지
|
→ … 4cm 까지
|
||||||
↓
|
↓
|
||||||
잰 위치 전부로 판정 → best = N
|
잰 위치 전부로 판정 → best = N
|
||||||
↓
|
↓
|
||||||
↓/↑ 치골 위 N cm 에 다시 붙이고 측정 (확인 측정 = 확정 신호 · 이미 그 자리면 "에서 한 번 더 측정")
|
치골 위 N cm 에 다시 붙이고 측정 (확인 측정 = 확정 신호 · 이미 그 자리면 "에서 한 번 더 측정")
|
||||||
↓
|
↓
|
||||||
↑ 치골 위 N+1 cm 에 붙이세요 (초록 · 여기서는 측정하지 않음)
|
치골 위 N+1 cm 에 붙이세요 (초록 · 여기서는 측정하지 않음)
|
||||||
↓
|
↓
|
||||||
좌우 정렬 (치골 위 N+1 cm 그대로)
|
좌우 정렬 (치골 위 N+1 cm 그대로)
|
||||||
```
|
```
|
||||||
|
|
||||||
지시문의 숫자는 **치골 위 절대 위치 하나**입니다(2026-09-29). "2cm 내리고" 같은 상대
|
지시문의 숫자는 **치골 위 절대 위치 하나**입니다(2026-09-29). "2cm 내리고" 같은 상대
|
||||||
이동은 판정 숫자와 나란히 보여 헷갈린다는 현장 의견으로 뺐고, 화살표만 방향을 거듭니다.
|
이동과 방향 화살표는 판정 숫자와 나란히 보여 헷갈린다는 현장 의견으로 뺐습니다.
|
||||||
|
|
||||||
[여기까지만 재고 판정하기] 로 수집을 중단할 수 있습니다 — 그 시점까지의 위치로 판정합니다.
|
[여기까지만 재고 판정하기] 로 수집을 중단할 수 있습니다 — 그 시점까지의 위치로 판정합니다.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user