/** * Coping heights and Level width (mm) that the coping geometry and the coping rebar depend on (1단계, 승인 2026-10-23). * Dependency-free so that both the model and the rebar modules can import it. */ export interface CopingGeom { /** 끝단 높이 h1 (mm). */ h1: number; /** 테이퍼 높이 h2 (mm). */ h2: number; /** Level 폭 W_L (mm). */ levelWidth: number; } /** P1 values: 끝단 높이 1000, 테이퍼 높이 1500, Level 폭 2100. Used when the input does not give them. */ export const P1_COPING_GEOM: CopingGeom = { h1: 1000, h2: 1500, levelWidth: 2100 }; /** Bar centre to the face of the coping, 127 mm (코핑철근.md §6.1, y_e). */ export const SIDE_COVER_M = 0.127; /** * Side-row levels (EL m) of C12 / C13 (코핑철근.md §6.1). z_0 = Level underside + 127 (the lowest bottom bar's Level * height, 41.038 on P1), z_k = z_0 + k·250. The split is by height band: * C12 rows lie in the taper band (Level underside … end underside, height h2); * C13 rows lie in the end band (end underside … top, height h1). * zBreak = end underside + 127 is where the taper line starts at the end face (P1: 42.538). */ export function sideRowLevels(levelBottom: number, endBottom: number, top?: number): { zBottom: number; zBreak: number; zTop?: number } { // Top margin (상면 여유) at least 400 mm (코핑철근.md §6.1): the highest side row lies at or below top − 0.4. return { zBottom: levelBottom + SIDE_COVER_M + 0.25, zBreak: endBottom + SIDE_COVER_M, zTop: top === undefined ? undefined : top - SIDE_TOP_MARGIN_M }; } /** Pitch of the side-row grid (m), and the top margin 400 mm (상면 여유). */ export const SIDE_PITCH_M = 0.25; export const SIDE_TOP_MARGIN_M = 0.4;