/** * 코핑 배근 입력 (승인 2026-10-26, 제안 = RAG/코핑_입력범위_제안.md). The 12 numbers of the ③ 코핑 배근 입력 panel. * Defaults are the 코핑철근.md values; the ranges are the proposal's, pending the design-standard check. */ export interface CopingRebarSettings { /** 피복 (철근 중심, mm). */ cover: number; /** 주철근 기본간격 (mm). */ mainSpacing: number; /** 주철근 끝단 최소 여유 (mm). */ mainEndGap: number; /** 상면 주철근 단 간격 · 세로 (mm). The horizontal step is fixed at d (H29, 28.6 mm). */ mainLayerGap: number; /** 첫 전단철근 최소 여유 (피복 다음, mm). */ firstShearGap: number; /** 전단철근 다리 수 (짝수). */ shearLegs: number; /** 전단철근 간격 · 경사 (mm). */ spacingS: number; /** 전단철근 간격 · Level (mm). */ spacingL: number; /** 측면 수평 간격 (mm). */ sideSpacing: number; /** 측면 위 끝 아래 최소 여유 (mm). */ sideEndGap: number; /** C14 간격 위 2줄 (mm). */ c14UpperSpacing: number; /** C14 간격 아래 줄 (mm). */ c14LowerSpacing: number; } export const DEFAULT_COPING_REBAR: CopingRebarSettings = { cover: 100, mainSpacing: 125, mainEndGap: 80, mainLayerGap: 100, firstShearGap: 200, shearLegs: 6, spacingS: 250, spacingL: 300, sideSpacing: 250, sideEndGap: 400, c14UpperSpacing: 1000, c14LowerSpacing: 2000, }; /** Allowed range per input (inclusive, mm). The shear legs are checked for evenness separately (CP02). */ export const COPING_REBAR_RANGES: Record = { cover: [80, 150], mainSpacing: [100, 150], mainEndGap: [60, 100], mainLayerGap: [80, 120], firstShearGap: [100, 300], shearLegs: [4, 8], spacingS: [200, 350], spacingL: [200, 350], sideSpacing: [200, 300], sideEndGap: [300, 500], c14UpperSpacing: [800, 1200], c14LowerSpacing: [1500, 2500], }; /** 상면 주철근(C1–C6) 이음 (승인 2026-10-26): ignore = 이음 무시 (사양 기본), apply = 정척 초과 시 2조각 겹침. */ export type TopSpliceMode = 'ignore' | 'apply'; /** 이음 위치: center = 기둥 중심, end = 단부 (정척 안에서 가장 끝 쪽). */ export type TopSpliceAt = 'center' | 'end'; export interface TopSpliceSettings { mode: TopSpliceMode; at: TopSpliceAt; } export const DEFAULT_TOP_SPLICE: TopSpliceSettings = { mode: 'ignore', at: 'center' }; export interface CopingSettingsIssue { code: 'CP01' | 'CP02'; key: keyof CopingRebarSettings; message: string; } /** * Checks the settings against the ranges. CP01: a value is not a finite number or is out of range (W). * CP02: the shear leg count is odd (the 폐합 bars come in pairs of legs). */ export function copingSettingsIssues(s: CopingRebarSettings): CopingSettingsIssue[] { const out: CopingSettingsIssue[] = []; for (const key of Object.keys(COPING_REBAR_RANGES) as (keyof CopingRebarSettings)[]) { const v = s[key]; const [lo, hi] = COPING_REBAR_RANGES[key]; if (!Number.isFinite(v) || v < lo || v > hi) { out.push({ code: 'CP01', key, message: `CP01 ${key} ${v} 범위 밖 (${lo}–${hi})` }); } } if (Number.isFinite(s.shearLegs) && s.shearLegs % 2 !== 0) { out.push({ code: 'CP02', key: 'shearLegs', message: `CP02 전단철근 다리 수 ${s.shearLegs}는 홀수 (짝수만 허용)` }); } return out; }