Files
Pier_v1/tests/bearing-table.test.ts
T
ypshimandClaude Opus 5.5 a0b0929e13 feat(bearing): 교각 솔플레이트를 2026-11-06 결정으로 (짝 받침 S · 열 T · 거더 하면 고정)
받침방위각_솔플레이트검토.md §3과 시안(Version 110–113)을 따른다 (사용자 결정 2026-11-06: 시안 적용).
11-03 C안(받침높이 H 고정, h3 = H − T, S 입력)을 대체한다.
- S: 교량 전체(A1, P1 … Pn, A2) 거더 짝 받침의 z 차 / 수평거리. 없으면 교각 종단경사 입력 →
  다른 열 같은 순번 값(가정, WS03) → 0 %(WS03). 받침별 직접 수정(수정됨)
- 평면 L = A + 100, W = B + 100 (받침별 A × B, 기본 700 × 640 가정), h3 181
- T = 열마다 max(22, ⌈22 + L·|S|/2⌉), 열 T 직접 수정 가능(T2 < T_min → WS02).
  T1은 오르막 쪽(3D 쐐기의 두꺼운 끝도 그쪽), T2 반대쪽
- 거더 하면 고정: 블럭 상면 = z − (T − T_ref), T_ref 30
- 짝 받침은 불러오기·프로젝트 열기 때 교량 전체로 계산해 교각 생성에 넘김
- ② 카드: h3·T_ref·T_min·여유·열 T·종단경사 입력, 표에 짝 받침·S 근거·받침별 S/A/B 수정·검산 W08·검사
- P1 검증(A1과 함께): S −1.908 … −1.902 %, L 800 · W 740 · T 30 · T1 38 · T2 22, 블럭 높이 변화 없음
- 블럭·솔플레이트 테스트는 A1–P1 짝 문맥으로 실행 (짝이 없으면 S 0 · T 22 · 블럭 +8 mm)
교대(QA-15 C안)와 Pier 시트 종단경사 열 읽기는 아직 남음.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:48:10 +09:00

81 lines
3.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, it } from 'vitest';
import { buildPier } from '../src/core/geometry';
import { elevationRows, pairCopingSpans, solplateRows } from '../src/core/bearing-table';
import { loadP1, p1Pairs } from './helpers';
// Bridge context (A1 ↔ P1 girder pairs) as in the app, so the solplate slope is computed (2026-11-06).
const P1CTX = { pairs: p1Pairs() };
const model = buildPier(loadP1(), P1CTX);
const integrated = buildPier({ ...loadP1(), bearingLayout: '일체' }, P1CTX);
describe('교량받침 ELEVATION TABLE (모델값, 2026-11-03)', () => {
const rows = elevationRows(model);
it('one row per bearing; EL.X is the Excel z (mortar top)', () => {
expect(rows.length).toBe(10);
expect(rows[0].elx).toBeCloseTo(43.561, 3);
expect(rows[5].elx).toBeCloseTo(43.611, 3);
});
it('front block 100 mm, back block 150 mm; mortar 50; bearing 181; solplate 30 (T = T_ref → no drop); E = sum', () => {
expect(rows[0]).toMatchObject({ h1: 100, h2: 50, h3: 181, h4: 30, E: 361 });
expect(rows[5]).toMatchObject({ h1: 150, h2: 50, h3: 181, h4: 30, E: 411 });
});
it('C1 is 600 for a 분리 bearing; C6 is the 1200 block depth; C4 and C5 are 600 each', () => {
expect(rows.every((r) => r.C1 === 600)).toBe(true);
expect(rows.every((r) => r.C6 === 1200)).toBe(true);
expect(rows[0]).toMatchObject({ C4: 600, C5: 600 });
});
it('C2 and C3 sit on the front row only: C2 is the bearing distance along 교축, C3 = C2 + 1200', () => {
expect(rows[0].C2).toBeGreaterThan(1000);
expect(rows[0].C3).toBe(rows[0].C2! + 1200);
expect(rows[5].C2).toBeNull();
expect(rows[5].C3).toBeNull();
});
it('S1 and S2 come from the block rebar: 8 bars of 2500 each on a 분리 block', () => {
expect(rows[0].S1).toEqual({ count: 8, length: 2500 });
expect(rows[0].S2).toEqual({ count: 8, length: 2500 });
});
it('일체: the pair block gives C3 = 2500 on the front row and the bars on the front row only', () => {
const ir = elevationRows(integrated);
expect(ir[0].C3).toBe(2500);
expect(ir[5].S1).toBeNull();
expect(ir[0].S1).not.toBeNull();
});
});
describe('솔플레이트 TABLE (모델값, 2026-11-03)', () => {
it('10 rows: S from the A1 pair (−1.908 %), L 800, W 740, T 30, T1 38, T2 22; W08 holds within 1 mm (2026-11-06)', () => {
const rows = solplateRows(model);
expect(rows.length).toBe(10);
expect(rows[0]).toMatchObject({ L: 800, W: 740, T: 30, T1: 38, T2: 22, ok: true, pair: 'A1-①', source: '계산' });
expect(rows[0].S).toBeCloseTo(-1.908, 3);
expect(rows[0].checkLhs).toBe(16);
expect(rows[0].checkRhs).toBeCloseTo(15.265, 2);
// 후열 ⑥: no pair (P2 not loaded) → the front twin ① value, 가정 + WS03.
expect(rows[5]).toMatchObject({ source: '가정', pair: undefined, T: 30 });
expect(rows[5].warnings).toContain('WS03');
});
});
describe('S1·S2 코핑 치수 (2026-11-03)', () => {
it('S1 + S2 + S1 = the coping width B (3100); S1 is bearing centre to the coping edge', () => {
const s = pairCopingSpans(model, 0)!;
expect(s.copingWidth).toBe(3100);
expect(s.S1Low + s.S2 + s.S1High).toBe(3100);
// Pair 1 · 6 (P1): the 후열 sits at n −0.600 (low side), the 전열 at n +0.698 (high side). S1 low 950 (후열), S2 1298, S1 high 852 (전열).
expect(s.S1Low).toBe(950);
expect(s.S2).toBe(1298);
expect(s.S1High).toBe(852);
});
it('an unknown pair gives null', () => {
expect(pairCopingSpans(model, 99)).toBeNull();
});
});