feat(abut): 교대 솔플레이트도 2026-11-06 결정으로 (짝 받침 S · T 하나 · 거더 하면 고정)
교대 받침 카드(spec_abut §5, QA-15)를 교각과 같은 계산(sole-plate.ts)으로 바꾸고 C안 모듈을 정리한다. - S: 짝 받침(A1 ↔ P1 전열, A2 ↔ Pn) 계산, 없으면 교대 종단경사 i(엑셀 Abut). 직접 수정 가능 - L = A + 100, W = B + 100 (A × B 기본 700 × 640, P1 전열 값 가정), 받침 1열이라 T 하나 - h3 기본값 = 받침 시트 받침높이 − T_ref (A1 275 − 30 = 245): 엑셀 받침높이의 거더 하면을 지킴. 시안은 P1의 h3 181을 가정했으나 교대 시트에 받침높이가 있어 이렇게 둔다 (입력으로 바꿀 수 있음) - 블럭 콘크리트 = 블럭 높이 − 패드 − (T − T_ref), E는 그대로 - 입력 칸: h3 · T_ref · T_min · 여유 · A · B · T · S (h3·T·S는 비우면 자동). C안 값(lengthMm 등)은 무시 - A1 검증: S −1.908 … −1.902 % (짝 P1 전열), L 800 · W 740 · T 30 · T1 38 · T2 22, E 400 - src/core/solplate-rule.ts(C안)와 그 테스트 삭제, 솔플레이트 기하 테스트는 새 계획으로 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
a0b0929e13
commit
87b445965b
7 files changed
+184
-205
No files matched your search
+21
-25
@@ -62,7 +62,6 @@ import {
|
||||
ABUT_PAD_PLAN_MM,
|
||||
abutBearingChecks,
|
||||
abutElevationRows,
|
||||
abutSolplatePlan,
|
||||
abutSolplateRows,
|
||||
resolveBearingRule,
|
||||
} from './core/abut/bearing-table';
|
||||
@@ -120,7 +119,6 @@ import { findPileSpec, PHC_PILES, STEEL_PILES } from './core/pile-spec';
|
||||
import { footingPlanSvg, footingSideSvg } from './view/footing-svg';
|
||||
import { P1_COPING_GEOM } from './core/coping-geom';
|
||||
import { SOLE_DEFAULTS, type SoleSettings, soleSettingsIssues } from './core/sole-plate';
|
||||
import { SOLPLATE_MIN_T2_MM } from './core/solplate-rule';
|
||||
import { bridgePairs } from './core/bridge-pairs';
|
||||
import type { BearingPair } from './core/bearing-pair';
|
||||
import { type BarSummary, elevationRows, solplateRows } from './core/bearing-table';
|
||||
@@ -955,9 +953,10 @@ function fillAbutBearingCard(
|
||||
}
|
||||
const m3 = (v: number) => v.toFixed(3);
|
||||
const H = rec.bearingHeightMm;
|
||||
const plan = abutSolplatePlan(rule, H);
|
||||
const elev = abutElevationRows(model, rule, H);
|
||||
const sol = abutSolplateRows(model, rule, H);
|
||||
// 솔플레이트 S: 짝 받침(P1 전열 등) 계산, 없으면 교대 종단경사 i (2026-11-06).
|
||||
const ctx = { pairs: state.bridgePairs, slopeI: rec.slopeI };
|
||||
const elev = abutElevationRows(model, rule, H, ctx);
|
||||
const sol = abutSolplateRows(model, rule, H, ctx);
|
||||
// 상세 보기 (받침 ①–⑤): the three 삽도 draw the picked bearing.
|
||||
const pickNo = elev.some((r) => r.no === state.abutBearingNo) ? state.abutBearingNo : elev[0].no;
|
||||
box.append(
|
||||
@@ -991,7 +990,7 @@ function fillAbutBearingCard(
|
||||
figs.append(fig);
|
||||
}
|
||||
box.append(figs);
|
||||
box.append(el('p', `받침 ELEVATION TABLE (mm, EL·위치는 m) · 거리는 IP3(① 쪽)에서 · h3 = H − T, h4 = T (솔플레이트 규칙)`, 'lbl'));
|
||||
box.append(el('p', `받침 ELEVATION TABLE (mm, EL·위치는 m) · 거리는 IP3(① 쪽)에서 · h3 받침 (기본 받침높이 ${H} − T_ref), h4 = T · 거더 하면 고정`, 'lbl'));
|
||||
box.append(
|
||||
table(
|
||||
['No.', '위치 s', '구간', '교좌면 EL', 'h1 블럭', 'h2 패드', 'z = EL.X', 'h3 받침', 'h4 솔플', 'E', '솔플 상면 EL', '블럭 ~ 계단 경계', '방위각 CAD / 진북 (°)', '블럭 회전 (°)'],
|
||||
@@ -1003,40 +1002,37 @@ function fillAbutBearingCard(
|
||||
]),
|
||||
),
|
||||
);
|
||||
box.append(el('p', '솔플레이트 상세 TABLE (mm) · 솔플레이트 규칙', 'lbl'));
|
||||
box.append(el('p', '솔플레이트 상세 TABLE (mm) · S는 같은 거더 양끝 받침에서 계산', 'lbl'));
|
||||
box.append(
|
||||
table(
|
||||
['No.', 'S (%)', 'L', 'W', 'T', 'T1', 'T2', '검산 T1 − T2 = L·|S|/100'],
|
||||
sol.map((r) => [String(r.no), r.S.toFixed(3), String(r.L), String(r.W), String(r.T), r.T1.toFixed(1), r.T2.toFixed(1), r.check]),
|
||||
['No.', '짝 받침', 'S (%)', 'S 근거', 'L', 'W', 'T', 'T1 (오르막 쪽)', 'T2', '검산 T1 − T2 ≈ L·|S|/100', '검사'],
|
||||
sol.map((r) => [String(r.no), r.pair ?? '없음', r.S.toFixed(3), r.source, String(r.L), String(r.W), String(r.T), String(r.T1), String(r.T2), r.check, r.warnings.length ? r.warnings.join(' · ') : '—']),
|
||||
),
|
||||
);
|
||||
// 솔플레이트 규칙 (교각 카드와 같은 형식, 2026-11-03): H는 교대 받침 시트 값으로 고정, L · W · S를 입력한다.
|
||||
const d = ABUT_BEARING_RULE_DEFAULT;
|
||||
box.append(el('p', `솔플레이트 규칙 (이 교대 · 기본 ${d.lengthMm} × ${d.widthMm} · ${d.slopePct} %) · 받침높이 H ${H} mm 고정 (솔플레이트 포함)`, 'lbl'));
|
||||
// 솔플레이트 입력 (결정 2026-11-06): 교각 카드와 같은 항목, 받침이 1열이라 T 하나.
|
||||
box.append(el('p', `솔플레이트 입력 (이 교대) · T = max(T_min, ⌈T_min + L·|S|/2⌉) · 거더 하면 고정 → 블럭 상면 = z − (T − T_ref)`, 'lbl'));
|
||||
const auto = sol[0];
|
||||
for (const f of BEARING_RULE_FIELDS) {
|
||||
const id = idOf(`rule-${f.key}`);
|
||||
const lab = el('label', f.label);
|
||||
lab.htmlFor = id;
|
||||
const input = numberInput(id, String(rule[f.key]));
|
||||
if (rule[f.key] !== ABUT_BEARING_RULE_DEFAULT[f.key]) input.classList.add('changed-input');
|
||||
const stored = (rec.bearingRule as Record<string, unknown> | undefined)?.[f.key];
|
||||
const value = f.optional ? (typeof stored === 'number' ? String(stored) : '') : String(rule[f.key]);
|
||||
const input = numberInput(id, value);
|
||||
const base = f.key === 'h3Mm' ? `${H - rule.tRefMm}` : f.key === 'tMm' ? `자동 ${auto?.T ?? '—'}` : f.key === 'slopePct' ? `계산 ${auto ? auto.S.toFixed(3) : '—'}` : String(ABUT_BEARING_RULE_DEFAULT[f.key]);
|
||||
if (f.optional) input.placeholder = base;
|
||||
if (typeof stored === 'number' && stored !== ABUT_BEARING_RULE_DEFAULT[f.key]) input.classList.add('changed-input');
|
||||
input.addEventListener('change', () => {
|
||||
try {
|
||||
apply(applyBearingRule(rec, f.key, Number(input.value)));
|
||||
apply(applyBearingRule(rec, f.key, input.value.trim() === '' && f.optional ? undefined : Number(input.value)));
|
||||
} catch (err) {
|
||||
fail(err, input, String(rule[f.key]));
|
||||
fail(err, input, value);
|
||||
}
|
||||
});
|
||||
box.append(lab, input, el('span', `기본 ${ABUT_BEARING_RULE_DEFAULT[f.key]}`, 'muted small'));
|
||||
box.append(lab, input, el('span', `기본 ${base}`, 'muted small'));
|
||||
}
|
||||
box.append(
|
||||
el(
|
||||
'p',
|
||||
`중심 두께 T = ${plan.T} mm (T2 ≥ ${SOLPLATE_MIN_T2_MM} mm) · 받침 본체 h3 = H − T = ${plan.h3} mm · T1 = ${plan.T1.toFixed(1)} mm · T2 = ${plan.T2.toFixed(1)} mm`,
|
||||
'muted small',
|
||||
),
|
||||
);
|
||||
box.append(el('p', `블럭 평면 ${ABUT_BLOCK_MM} × ${ABUT_BLOCK_MM} (기본값) · 몰탈패드 ${ABUT_PAD_PLAN_MM} × ${ABUT_PAD_PLAN_MM} × 50 (기본값) · 블럭 높이 = min(z) − 교좌면 (계산)`, 'muted small'));
|
||||
box.append(el('p', `검사 · ${abutBearingChecks(model, members, rule, H).join(' · ')}`, 'muted small abut-checks'));
|
||||
box.append(el('p', `검사 · ${abutBearingChecks(model, members, rule, H, ctx).join(' · ')}`, 'muted small abut-checks'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user