From 42316104dffdf1fd28d7ed685fae21945dbc183c Mon Sep 17 00:00:00 2001 From: ypshim Date: Fri, 6 Nov 2026 13:50:30 +0900 Subject: [PATCH] =?UTF-8?q?fix(rebar):=20=EB=8B=A4=EC=A3=BC=ED=98=95=20?= =?UTF-8?q?=EC=BD=94=ED=95=91=EC=97=90=EC=84=9C=20C5=C2=B7C6=20=EC=A0=9C?= =?UTF-8?q?=EC=99=B8=20(=EC=A0=84=EC=9A=A9=20=EC=82=BD=EB=8F=84=20?= =?UTF-8?q?=EA=B7=BC=EA=B1=B0=20=EC=97=86=EC=9D=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1106 엑셀 '2주형 3주형' 삽도(A92·A61·A38)에 C5·C6이 없어 다주형 상면 주철근 생성에서 제외했다. T형 레거시 경로는 변경하지 않는다. 경고 문구·화면 안내를 갱신하고 제외를 고정하는 테스트를 추가했다. Co-Authored-By: Claude Haiku 5.5 --- src/core/rebar/multicol-coping.ts | 4 +++- src/core/rebar/summary.ts | 2 +- src/main.ts | 2 +- tests/multicol-rebar.test.ts | 9 +++++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/core/rebar/multicol-coping.ts b/src/core/rebar/multicol-coping.ts index ffd5cec..9beba1e 100644 --- a/src/core/rebar/multicol-coping.ts +++ b/src/core/rebar/multicol-coping.ts @@ -45,8 +45,10 @@ export function multicolCopingBars(model: PierModel, material: Material = DEFAUL }; const width = widthLayout(B * 1000, settings); const ns = [width.yE, ...Array.from({ length: width.n + 1 }, (_, i) => width.yE + width.g + width.spacing * i), B * 1000 - width.yE].map(v => v / 1000 - B / 2); - // C5/C6 correspondence and cycle-specific splice locations remain explicitly pending. + // C5/C6 are excluded from the multi-column layout: the 1106 전용 삽도 (A92 · A61) shows no C5/C6 (대안A, 2026-11-06). + // Cycle-specific splice locations remain explicitly pending. for (let k = 1; k <= 3; k++) for (const [j, n] of ns.entries()) { + if (j % 2 === 0 && k > 1) continue; const name = `C${k + (j % 2 ? 0 : 3)}`; const size = Number(name.slice(1)) <= 4 ? 'H25' : 'H29'; const d = NOMINAL_DIAMETER[size]; diff --git a/src/core/rebar/summary.ts b/src/core/rebar/summary.ts index 2ea77dc..09de40c 100644 --- a/src/core/rebar/summary.ts +++ b/src/core/rebar/summary.ts @@ -389,7 +389,7 @@ export function rebarSummary( for (const [name, bars] of grouped) rows.push({ member: 'coping', name, size: bars[0].size, count: bars.length, length: null, pieces: bars.map(b => ({ length: b.length, count: 1 })), note: '다주형 전용 삽도 규격 · 실제 콘크리트 하면에 따른 조각별 중심선 길이. 번호·cycle별 이음 상세 확인 필요' }); - warnings.push({ code: 'RB-M02', target: 'coping', message: '다주형 전용 삽도 우선: C1~4 H25·C7 H29·C8 H25·전단 H22·수평/C14 H16. C5/C6 및 C11/C13 중복 번호·cycle별 이음 위치·분리 수평철근 갈고리는 상세 확인 필요. 해당 수량은 검토용입니다.' }); + warnings.push({ code: 'RB-M02', target: 'coping', message: '다주형 전용 삽도 우선: C1~4 H25·C7 H29·C8 H25·전단 H22·수평/C14 H16. C5/C6은 전용 삽도에 없어 제외했습니다. C11/C13 중복 번호·cycle별 이음 위치·분리 수평철근 갈고리는 상세 확인 필요. 해당 수량은 검토용입니다.' }); warnings.push({ code: 'RB-M01', target: 'coping', message: '다주형 C14는 전용 삽도의 H16·기본600 간격과 실제 하면을 사용합니다. 기둥별 반복·번호 대응 상세는 확인이 필요합니다.' }); warnings.push({ code: 'RB-M03', target: 'column', message: '다주형 단부는 삽도의 지름 이상·코핑 반높이 연장을 적용했습니다. P4/P5 번호는 기존 역할(단부 P5·기초내 P4)을 유지하며 도면 번호 대응 확인이 필요합니다.' }); } diff --git a/src/main.ts b/src/main.ts index 73a63ca..d36faa3 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2810,7 +2810,7 @@ function renderCopingSettings(box: HTMLDivElement, pier: Pier): void { const defaults = copingDefaults(pier.model.columns.length); const current: CopingRebarSettings = { ...defaults, ...pier.draft.copingRebar }; wrap.appendChild(el('p', `코핑 배근 입력 (기본값 = ${pier.model.columns.length > 1 ? '1106 다주형 전용 삽도' : '코핑철근.md'} · 적용을 눌러야 반영)`, 'lbl')); - if (pier.model.columns.length > 1) wrap.appendChild(el('p', '전용 삽도 규격 우선 · C5/C6·중복 번호와 cycle별 이음 위치는 확인 중입니다. 저장된 간격 입력은 기본값보다 우선합니다.', 'muted small')); + if (pier.model.columns.length > 1) wrap.appendChild(el('p', '전용 삽도 규격 우선 · C5/C6은 삽도에 없어 제외했고, 중복 번호와 cycle별 이음 위치는 확인 중입니다. 저장된 간격 입력은 기본값보다 우선합니다.', 'muted small')); const grid = el('div', undefined, 'edit-fields'); const controls = new Map(); for (const f of COPING_REBAR_FIELDS) { diff --git a/tests/multicol-rebar.test.ts b/tests/multicol-rebar.test.ts index 0896bfc..a287549 100644 --- a/tests/multicol-rebar.test.ts +++ b/tests/multicol-rebar.test.ts @@ -8,6 +8,15 @@ import { buildRebar3D } from '../src/view/rebar3d'; import { loadP1 } from './helpers'; describe('multi-column drawing corrections', () => { + it('excludes C5/C6 from the multi-column coping bars (대안A: the 1106 전용 삽도 has no C5/C6)', () => { + for (const [type, columnCount] of [['2주형', 2], ['3주형', 3]] as const) { + const model = buildPier({ ...loadP1(), type, columnCount, foundationType: '말뚝기초', groundEl: 30, pileLengthMm: 24000 }); + const names = new Set(multicolCopingBars(model).map(b => b.name)); + expect(names.has('C5')).toBe(false); + expect(names.has('C6')).toBe(false); + for (const name of ['C1', 'C2', 'C3', 'C4', 'C7', 'C8']) expect(names.has(name), `${type} ${name}`).toBe(true); + } + }); for (const [type, columnCount] of [['2주형', 2], ['3주형', 3]] as const) { for (const foundationType of ['말뚝기초', '현장타설말뚝'] as const) { it(`${type} ${foundationType}: every coping path stays inside the concrete lower boundary`, () => {