Files
Pier_v1/src/core/changes.ts
T
ypshimandClaude Haiku 5.5 2e0bfb6fc8 feat(rebar): 현장타설 말뚝 · 다주형 코핑 형상과 철근 계산
- 현장타설 기둥·말뚝 형상(cast-in-place-shape)과 주철근·횡철근·커플러 계산(rebar/cast-in-place, cast-layout)
- 다주형 코핑 철근(multicol-coping), 기둥 높이 · 양단부 연장
- 철근표 요약 · 재료 수량 · 3D 뷰 연결과 삽도(cast-rebar-svg)
- 검사 기준 갱신과 회귀 테스트, 검증 스크립트 보관

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-11-06 13:15:01 +09:00

97 lines
4.4 KiB
TypeScript

import type { PierInput } from './types';
/**
* Inputs the user can change on the 2단계 cards (spec §5.2 · plan C2). Each one maps to a field of PierInput.
* Extend this list as more cards are enabled; the tracking below works on any of these keys.
*/
export const EDITABLE_FIELDS = [
{ key: 'copingWidthMm', label: '코핑 폭 B', unit: 'mm' },
{ key: 'copingLengthMm', label: '코핑 길이 L', unit: 'mm' },
{ key: 'columnDiameterMm', label: '기둥 직경 D', unit: 'mm' },
{ key: 'footingLengthMm', label: '확대기초 길이 L', unit: 'mm' },
{ key: 'footingWidthMm', label: '확대기초 폭 W', unit: 'mm' },
{ key: 'footingHeightMm', label: '확대기초 높이 h1', unit: 'mm' },
{ key: 'blindingMarginMm', label: '비림 여유 (한쪽)', unit: 'mm' },
{ key: 'blindingThicknessMm', label: '비림 두께', unit: 'mm' },
{ key: 'pileOuterMm', label: '말뚝 외경 D', unit: 'mm' },
{ key: 'pileThicknessMm', label: '말뚝 두께 t', unit: 'mm' },
{ key: 'copingH1Mm', label: '끝단 높이 h1', unit: 'mm' },
{ key: 'copingH2Mm', label: '테이퍼 높이 h2', unit: 'mm' },
{ key: 'levelWidthMm', label: 'Level 폭', unit: 'mm' },
{ key: 'pileLengthMm', label: '말뚝 길이', unit: 'mm' },
{ key: 'groundEl', label: '지반고 EL', unit: 'm' },
] as const;
/** Inputs tracked for overrides and pending changes: the numeric cards plus 열별 본수 (an array, compared by value). */
export const TRACKED_KEYS = [...EDITABLE_FIELDS.map((f) => f.key), 'pileRows', 'groundPosition', 'groundWaterOn', 'groundWaterEl', 'floodLevelEl', 'scourDepthM', 'highWaterEl', 'lowWaterEl', 'strataRows', 'bearingType', 'bearingLayout', 'blockRebar', 'copingRebar', 'topSplice', 'columnRebar', 'footingRebar', 'castInPlaceRebar', 'castInPlaceShape'] as const;
export type EditableKey = (typeof TRACKED_KEYS)[number];
export const FIELD_LABELS: Record<EditableKey, string> = {
copingWidthMm: '코핑 폭 B',
copingLengthMm: '코핑 길이 L',
columnDiameterMm: '기둥 직경 D',
footingLengthMm: '확대기초 길이 L',
footingWidthMm: '확대기초 폭 W',
footingHeightMm: '확대기초 높이 h1',
blindingMarginMm: '비림 여유 (한쪽)',
blindingThicknessMm: '비림 두께',
pileOuterMm: '말뚝 외경 D',
pileThicknessMm: '말뚝 두께 t',
copingH1Mm: '끝단 높이 h1',
copingH2Mm: '테이퍼 높이 h2',
levelWidthMm: 'Level 폭',
pileLengthMm: '말뚝 길이',
groundEl: '지반고 EL',
pileRows: '열별 본수',
groundPosition: '지반 위치',
groundWaterOn: '지하수위 고려',
groundWaterEl: '지하수위 EL',
floodLevelEl: '설계홍수위 DHWL',
scourDepthM: '세굴 깊이',
highWaterEl: '고조위 HWL',
lowWaterEl: '저조위 LWL',
bearingType: '받침 종류·용량',
bearingLayout: '받침 배치',
blockRebar: '받침블럭 철근 설정',
copingRebar: '코핑 배근 입력',
topSplice: '상면 주철근 이음',
columnRebar: '기둥 배근 입력',
footingRebar: '확대기초 배근 입력',
strataRows: '지층 행',
castInPlaceRebar: '현장타설 기둥·말뚝 배근 입력',
castInPlaceShape: '현장타설 암반·고정점·희생강관 입력',
};
/** Keys whose values differ between two inputs. Arrays are compared by value. */
export function changedKeys(a: PierInput, b: PierInput): EditableKey[] {
return TRACKED_KEYS.filter((key) => JSON.stringify(a[key]) !== JSON.stringify(b[key]));
}
/**
* The three values a pier carries while it is edited (spec §5.5, plan B1):
* - defaults: the values as imported from the sheet (기본값, shown as "기본 3100").
* - input: the values the 3D model was generated from (생성본).
* - draft: the values the user currently has in the cards (현재 입력).
*/
export interface PierValues {
defaults: PierInput;
input: PierInput;
draft: PierInput;
}
/** Overrides: draft differs from the imported default (주황 표시, "변경 n건" in the card). */
export function overrideKeys(p: PierValues): EditableKey[] {
return changedKeys(p.defaults, p.draft);
}
/** Pending: draft differs from the generated model, so the 3D view is out of date (미반영 변경). */
export function pendingKeys(p: PierValues): EditableKey[] {
return changedKeys(p.input, p.draft);
}
/** Puts one field back to its imported default in the draft. */
export function revertDraft(p: PierValues, key: EditableKey): PierInput {
return { ...p.draft, [key]: p.defaults[key] };
}