From 802a1eab9733a857b265d432e5242b72c7807f18 Mon Sep 17 00:00:00 2001 From: ypshim Date: Fri, 23 Oct 2026 14:17:12 +0900 Subject: [PATCH] =?UTF-8?q?fix(view):=20EL.X=20=3D=20block=20top=20includi?= =?UTF-8?q?ng=20the=2050=20mm=20mortar;=20coping=20top=20=3D=20EL.X=20?= =?UTF-8?q?=E2=88=92=20h1=20=E2=88=92=20h2=20(matches=20the=20model)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With this definition the drawing's coping top matches the model's coping top to within 1 mm on all ten bearings. The earlier 0.211 m offset came from reading EL.X as the solplate top, which was wrong. The reference table now uses EL.X − h1 − h2, and the check tests the match. Co-Authored-By: Claude Haiku 5.5 --- src/main.ts | 7 ++++--- tests/bearing-ref.test.ts | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main.ts b/src/main.ts index 7b7d5a6..9be7d8b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1302,18 +1302,19 @@ function renderBearingRef(box: HTMLDivElement, pier: Pier): void { ct.appendChild(cb); wrap.appendChild(el('div', undefined, 'table-scroll')).appendChild(ct); wrap.appendChild(el('p', '교량받침 ELEVATION TABLE (도면값 · 읽기 전용, mm · EL m)', 'lbl')); - wrap.appendChild(el('p', '도면값은 모델에 쓰지 않습니다(Q16). 아래 "차이"는 도면과 모델의 코핑 상면 차이입니다.', 'muted small')); + wrap.appendChild(el('p', 'EL.X = 몰탈 50 mm를 포함한 받침블럭 상면. 도면값은 모델에 쓰지 않으며, 차이는 도면과 모델의 코핑 상면 차이입니다.', 'muted small')); const front = m?.segments ?? []; const backBlocks = m?.blocks.filter((b) => b.row === '후열') ?? []; const et = el('table', undefined, 'grid-table rebar-table'); const eh = el('thead'); const ehr = el('tr'); - for (const h of ['No', '열', 'EL.X', 'E', 'A', 'B', 'C1', 'S1', '도면 상면 (EL.X − E)', '모델 코핑 상면', '차이 (m)']) ehr.appendChild(el('th', h)); + for (const h of ['No', '열', 'EL.X', 'E', 'A', 'B', 'C1', 'S1', '코핑 상면 = EL.X − h1 − h2', '모델 코핑 상면', '차이 (m)']) ehr.appendChild(el('th', h)); eh.appendChild(ehr); et.appendChild(eh); const eb = el('tbody'); for (const r of BEARING_ELEVATION_REF) { - const drawingTop = r.elx - r.E / 1000; + // EL.X is the block top including the 50 mm mortar: coping top = EL.X − h1 − h2 (승인 2026-10-23). + const drawingTop = r.elx - (r.h1 + r.h2) / 1000; const modelTop = r.row === '전열' ? front[r.no - 1]?.top : backBlocks[r.no - 6]?.bottom; const diff = modelTop === undefined ? NaN : modelTop - drawingTop; eb.appendChild(el('tr')).append( diff --git a/tests/bearing-ref.test.ts b/tests/bearing-ref.test.ts index 0f52a7d..743ad20 100644 --- a/tests/bearing-ref.test.ts +++ b/tests/bearing-ref.test.ts @@ -31,14 +31,14 @@ describe('교량받침 reference (도면값, 읽기 전용, 1단계)', () => { } }); - it('the drawing EL.X − E sits a constant 0.211 m below the model coping top on all ten bearings (Q16 diagnostic)', () => { + it('EL.X = block top incl. the 50 mm mortar: coping top = EL.X − h1 − h2 matches the model on all ten bearings (within 2 mm)', () => { const m = buildPier(loadP1()); const back = m.blocks.filter((b) => b.row === '후열'); const diffs = BEARING_ELEVATION_REF.map((r) => { const modelTop = r.row === '전열' ? m.segments[r.no - 1].top : back[r.no - 6].bottom; - return modelTop - (r.elx - r.E / 1000); + return modelTop - (r.elx - (r.h1 + r.h2) / 1000); }); - for (const d of diffs) expect(d).toBeCloseTo(0.211, 2); + for (const d of diffs) expect(Math.abs(d)).toBeLessThan(0.002); }); });