fix(구조물표): 322-2 다듬기(브레인 화면 확인) — 화면에 영어 키 안 보임 · 검사 글 한국어(화면 · 서버 짝) · 부품 탭 읽는 칸 = 정의 이름 · 줄바꿈 · 한눈 표 폭 줄임 · 바꿨다 되돌리면 [저장] 꺼짐

- 자리꼴 점 · 구간 · 터 · 정본 관 지점 · 구조물(키는 툴팁) · 고르기 글 = 부품 짧은 이름(괄호 설명 · 키는 툴팁) · 횡단도 없음 = 「안 만듦」 · 「벽 스윕」 → 「벽」 · 종류 키는 툴팁
- 검사 글: 「형상이 「없음」이면 횡단도도 「안 만듦」」 · 부품 짧은 이름 · 칸 이름 · 종류 이름(M02_SO_Def_Check.ts = M02_SO_Check.py)
- 부품 탭: 읽는 칸 = 그 부품을 쓰는 종류의 칸 이름(단위) · 표 줄바꿈(table-layout fixed)
- 한눈 표 형상칸 「기본 형태」 = 그림 형태 고르기(REVET_FORMS)
- [저장] 켬 = 저장할 꼴(tidy · 목록 짝 enabled)끼리 지금 판과 다를 때만(M02_SO_Def_Reflect.differs)
- 시험: 322-2 검사 글 · 되돌림 견본

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ji4nuyLVHcxrXWHTdb5nRD
This commit is contained in:
2026-10-14 16:29:30 +09:00
co-authored by Claude Opus 5.5
parent 6c87207f76
commit 0da2fa0767
11 changed files with 207 additions and 89 deletions
+18
View File
@@ -88,6 +88,24 @@ out.partOff = [clone(plain.부품), reflect.rowsOf(plain).get("retaining_wall").
reflect.setPartOn(plain, "형상.wall", true);
out.partOn = clone(plain.부품);
// 바꿨다 되돌리면 저장할 것 없음(322-2 다듬기) — 목록 · 횡단도 · 형상칸 · 보임 · 부품
const base = clone(input.definition);
const work = clone(input.definition);
const steps = [];
reflect.setReflect(work, "masonry_wet", "목록", "both");
steps.push(reflect.differs(work, base));
reflect.setReflect(work, "masonry_wet", "목록", "hidden");
reflect.setReflect(work, "open_ditch", "횡단도", "anchor");
reflect.setReflect(work, "open_ditch", "횡단도", "none");
reflect.setShapeOpt(work, "soil_guard", "form", "콘크리트");
reflect.setShapeOpt(work, "soil_guard", "form", "통나무·목재틀");
reflect.setShown(work, "pipe", ["wing_wall_type"], false);
reflect.setShown(work, "pipe", ["wing_wall_type"], true);
reflect.setPartOn(work, "3D.chute", false);
reflect.setPartOn(work, "3D.chute", true);
steps.push(reflect.differs(work, base));
out.revert = steps;
// 명세 폼 숨김 — 저장 · 갈래 키가 모두 숨김인 칸 · 키 있는 칸이 모두 숨긴 상자
out.spec = {};
for (const [tid, sp] of Object.entries(STRUCTURE_SPECS)) {
+16 -14
View File
@@ -123,27 +123,25 @@ def test_check_rules(ts: dict) -> None:
"부품 「횡단도.span3」 — 참거짓",
"부품 「끔」 — 없는 부품",
]
assert got["rule218"] == ["「개거(겉도랑)」 형상 none — 횡단도도 none 이어야 함"]
assert got["mismatch"] == [
"「옹벽」 형상 「pipe_set」 — 자리꼴 interval · 정본 structures 에 안 맞음"
]
assert got["rule218"] == ["「개거(겉도랑)」 형상이 「없음」이면 횡단도도 「안 만듦」"]
assert got["mismatch"] == ["「옹벽」 형상 「배관 세트」 — 구간 · 구조물 에 안 맞음"]
assert got["hide_read"] == [
"「배관」 형상 「pipe_set」 이 읽는 칸 「revet_foundation」 — 숨길 수 없음"
"「배관」 형상 「배관 세트」 이 쓰는 칸 「흙막이 기초」 — 숨길 수 없음"
]
assert got["hide_no_before"] == [] # 앞 판 없음 = 새로 숨긴 것 없음
assert got["fixed"] == [
# 표 줄도 함께 걸림 — 자리꼴 · 정본을 바꾸면 그 종류 부품이 안 맞음
"「BOX암거」 형상 「box」 — 자리꼴 interval · 정본 pipe_points 에 안 맞음",
"「BOX암거」 3D 「box」 — 자리꼴 interval · 정본 pipe_points 에 안 맞음",
"「기슭막이」 형상 「hidden_revet」 — 자리꼴 interval · 정본 structures 에 안 맞음",
"「pipe.pipe_diameter_mm」 선택지 값 — 고칠 수 없음(이름은 이름 표로)",
"「box_culvert」 자리꼴 — 만든 뒤 고정",
"「revetment」 정본 — 만든 뒤 고정",
"「mirror」 군 글자 — 만든 뒤 고정",
"종류 「etc」 — 지울 수 없음",
"「BOX암거」 형상 「BOX 본체 · 날개벽」 — 구간 · 관 지점 에 안 맞음",
"「BOX암거」 3D 「BOX 본체 · 날개벽」 — 구간 · 관 지점 에 안 맞음",
"「기슭막이」 형상 「독립 기슭막이」 — 구간 · 구조물 에 안 맞음",
"「배관」 「관경」 선택지 값 — 고칠 수 없음(이름만 고침)",
"「BOX암거」 자리꼴 — 만든 뒤 고정",
"「기슭막이」 정본 — 만든 뒤 고정",
"「반사경」 군 글자 — 만든 뒤 고정",
"종류 「기타」 — 지울 수 없음",
]
# 형상 부품을 끄면 벽 다섯은 형상 none — 횡단도도 none 으로 바꿔야 저장됨
assert len(got["parts_off"]) == 5 and all("횡단도도 none" in t for t in got["parts_off"])
assert len(got["parts_off"]) == 5 and all("횡단도도 「안 만듦」" in t for t in got["parts_off"])
def test_reflect_edits(ts: dict) -> None:
@@ -165,6 +163,10 @@ def test_reflect_edits(ts: dict) -> None:
assert r["reset"] == [None, None, True]
def test_revert_means_nothing_to_save(ts: dict) -> None:
assert ts["revert"] == [True, False] # 바꾸면 저장할 것 · 되돌리면 없음
def test_save_writes_list_and_enabled_together(ts: dict) -> None:
sync = ts["sync"]
assert sync["same"] is True