feat(view): 확대기초·말뚝 inputs on ② (입력만): footing L, W, h1, blinding margin and thickness, steel and PHC pile lists
The footing card takes L, W, h1 (default 2000), the blinding margin on each side (100) and thickness (100). The pile is picked from the 강관 or PHC list by outer diameter and wall; the inner diameter, area and weight are read from the list. Defaults are the 1단계 constants, so P1 is unchanged. The model reads them (footing width, height, blinding, pile diameter; the footing length for grouping). 복합 말뚝 and the rule-pending items stay disabled; the footing rebar is not yet tied to these inputs (1·2단계 후). Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e580677887
commit
df19cc47e9
7 files changed
+200
-18
No files matched your search
+60
-2
@@ -18,6 +18,7 @@ import { buildQuantity, quantityRows, type Quantity, type QuantityLine } from '.
|
||||
import { parseDrawingRows } from './core/drawing-import';
|
||||
import { parseBearingElevationTable, parseSolplateTable, readDxfTexts } from './core/dxf-table';
|
||||
import { columnDiameterIssues } from './core/column-check';
|
||||
import { findPileSpec, PHC_PILES, STEEL_PILES } from './core/pile-spec';
|
||||
import { P1_COPING_GEOM } from './core/coping-geom';
|
||||
import { applyBearingRules, BEARING_ELEVATION_REF, BEARING_RULES_DEFAULT, type BearingBasis, type BearingRules, type DrawingBearing, DRAWING_TOL_MM, drawingCopingCheck, SOLPLATE_REF, SOLPLATE_T_RULE, solplateTs, withDrawingBasis } from './core/bearing-ref';
|
||||
|
||||
@@ -71,7 +72,7 @@ const MEMBERS: { id: MemberId; label: string; keys: EditableKey[]; note: string
|
||||
{ id: 'bearing', label: '교량받침·받침블럭·솔플레이트', keys: [], note: '받침 상세(C3)는 Q16 결정 후 추가합니다. 지금은 표시만 합니다.' },
|
||||
{ id: 'coping', label: '코핑', keys: ['copingWidthMm', 'copingLengthMm', 'copingH1Mm', 'copingH2Mm', 'levelWidthMm'], note: '폭, 길이, 끝단 높이 h1, 테이퍼 높이 h2, Level 폭을 입력합니다. 계단 위치·단차선 입력은 다음 단계에서 추가합니다.' },
|
||||
{ id: 'column', label: '기둥', keys: ['columnDiameterMm'], note: '기둥 직경 D를 입력합니다 (1200–3000 mm, 50 mm 단위). 높이와 위치는 계산값입니다.' },
|
||||
{ id: 'footing', label: '확대기초 · 말뚝', keys: ['pileLengthMm'], note: '말뚝 길이를 입력합니다. 열별 본수는 다음 단계에서 추가합니다.' },
|
||||
{ id: 'footing', label: '확대기초 · 말뚝', keys: ['footingLengthMm', 'footingWidthMm', 'footingHeightMm', 'blindingMarginMm', 'blindingThicknessMm', 'pileLengthMm'], note: '확대기초 치수, 비림, 말뚝 길이와 규격을 입력합니다. 규칙 미정 항목(모따기, 경사, 복합 말뚝)은 다음 단계에서 추가합니다.' },
|
||||
{ id: 'ground', label: '지반·지층', keys: [], note: '지반고는 입력값을 표시만 합니다. 지층 입력은 다음 단계에서 추가합니다.' },
|
||||
];
|
||||
|
||||
@@ -198,6 +199,14 @@ function withCopingDefaults(input: PierInput): PierInput {
|
||||
return {
|
||||
...input,
|
||||
columnDiameterMm: input.columnDiameterMm ?? 2000,
|
||||
footingLengthMm: input.footingLengthMm ?? 10400,
|
||||
footingWidthMm: input.footingWidthMm ?? 8150,
|
||||
footingHeightMm: input.footingHeightMm ?? 2000,
|
||||
blindingMarginMm: input.blindingMarginMm ?? 100,
|
||||
blindingThicknessMm: input.blindingThicknessMm ?? 100,
|
||||
pileKind: input.pileKind ?? '강관',
|
||||
pileOuterMm: input.pileOuterMm ?? 609.6,
|
||||
pileThicknessMm: input.pileThicknessMm ?? 12,
|
||||
copingH1Mm: input.copingH1Mm ?? P1_COPING_GEOM.h1,
|
||||
copingH2Mm: input.copingH2Mm ?? P1_COPING_GEOM.h2,
|
||||
levelWidthMm: input.levelWidthMm ?? P1_COPING_GEOM.levelWidth,
|
||||
@@ -707,6 +716,52 @@ function footingLengthOf(p: Pier): number | undefined {
|
||||
return p.model?.footings[0]?.length;
|
||||
}
|
||||
|
||||
/** 말뚝 규격 (승인 2026-10-23): 강관 and PHC from their lists by outer diameter and wall; the inner diameter, area and weight are read. */
|
||||
function renderPileSpec(box: HTMLDivElement, pier: Pier): void {
|
||||
const kind = pier.draft.pileKind ?? '강관';
|
||||
const list = kind === '강관' ? STEEL_PILES : PHC_PILES;
|
||||
const cur = findPileSpec(kind, pier.draft.pileOuterMm ?? 609.6, pier.draft.pileThicknessMm ?? 12);
|
||||
const wrap = el('div', undefined, 'pile-spec');
|
||||
const kindSel = el('select');
|
||||
kindSel.id = 'pile-kind';
|
||||
for (const k of ['강관', 'PHC'] as const) {
|
||||
const o = el('option', k === '강관' ? '강관 말뚝' : 'PHC 말뚝');
|
||||
o.value = k;
|
||||
kindSel.appendChild(o);
|
||||
}
|
||||
kindSel.value = kind;
|
||||
kindSel.addEventListener('change', () => {
|
||||
const first = (kindSel.value === '강관' ? STEEL_PILES : PHC_PILES)[0];
|
||||
setPileSpec(pier.input.name, kindSel.value as '강관' | 'PHC', first.D, first.t);
|
||||
});
|
||||
const sizeSel = el('select');
|
||||
sizeSel.id = 'pile-size';
|
||||
for (const p of list) {
|
||||
const o = el('option', `${p.D} × ${p.t}`);
|
||||
o.value = `${p.D}|${p.t}`;
|
||||
sizeSel.appendChild(o);
|
||||
}
|
||||
if (cur) sizeSel.value = `${cur.D}|${cur.t}`;
|
||||
sizeSel.addEventListener('change', () => {
|
||||
const [D, t] = sizeSel.value.split('|').map(Number);
|
||||
setPileSpec(pier.input.name, kind, D, t);
|
||||
});
|
||||
const info = cur
|
||||
? `내경 ${cur.inner} mm · 단면적 ${cur.area} cm² · 단위중량 ${cur.unitWeight} ${kind === '강관' ? 'kg/m' : 'kN/m'}`
|
||||
: '목록에 없는 규격입니다.';
|
||||
wrap.append(el('label', '말뚝 종류 '), kindSel, el('label', ' 외경 × 두께 '), sizeSel, el('p', info, 'muted small'));
|
||||
box.appendChild(wrap);
|
||||
}
|
||||
|
||||
function setPileSpec(name: string, kind: '강관' | 'PHC', D: number, t: number): void {
|
||||
const p = state.piers.find((q) => q.input.name === name);
|
||||
if (!p) return;
|
||||
p.draft = { ...p.draft, pileKind: kind, pileOuterMm: D, pileThicknessMm: t };
|
||||
state.piers = state.piers.map((q) => (q === p ? regenerateEntry(q) : q));
|
||||
setupScene();
|
||||
renderAll();
|
||||
}
|
||||
|
||||
/** 열별 본수 −/+ per 열 (spec §5.4). Shows the spacing, the total, and a warning below the minimum spacing. */
|
||||
function renderPileRows(box: HTMLDivElement, pier: Pier): void {
|
||||
const footingLength = footingLengthOf(pier);
|
||||
@@ -1587,7 +1642,10 @@ function renderPlan(): void {
|
||||
regen.disabled = true;
|
||||
} else {
|
||||
fieldRows(fields, pier, member.keys);
|
||||
if (member.id === 'footing') renderPileRows(fields, pier);
|
||||
if (member.id === 'footing') {
|
||||
renderPileSpec(fields, pier);
|
||||
renderPileRows(fields, pier);
|
||||
}
|
||||
if (member.id === 'coping') renderCopingInfo(fields, pier);
|
||||
if (member.id === 'bearing') renderBearingRef(fields, pier);
|
||||
if (FCK_MEMBERS.includes(member.id as FckMember)) renderMemberFck(fields, member.id as FckMember);
|
||||
|
||||
Reference in new issue
Block a user