feat(ground): 해상 selectable with MSL levels, 고조위·저조위, and checks

- Rules confirmed (승인 2026-10-26): datum MSL; 고조위 HWL and 저조위 LWL as
  two levels; 세굴 깊이 as for 하상; 파랑과 선박 하중 excluded from this scope.
- Checks: G13 levels missing, G10 해저면 not below 고조위, G11 저조위 not
  below 고조위, G14 pile wall at or below the corrosion allowance reference.
- CORROSION_ALLOWANCE_MM = 1 is a PLACEHOLDER reference (not in the RAG
  documents); the card and G14 mark it as to be confirmed.
- Card: the 해상 inputs; the section draws 고조위 (solid), 저조위 (dashed),
  and labels the ground line 해저면 EL.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-10-26 11:11:31 +09:00
1 parent 26a5aff517
commit b6e7f36091
9 files changed
+132 -22

No files matched your search

+22 -3
View File
@@ -17,7 +17,7 @@ import { DEFAULT_MATERIAL, FCK_MEMBERS, fyOf, GRADE_CHOICES, isAssumedMaterial,
import { buildQuantity, quantityRows, type Quantity, type QuantityLine } from './core/rebar/quantity';
import { parseDrawingRows } from './core/drawing-import';
import { groundElFor, parseGroundModel, strataRowsFor, type GroundModelFile } from './core/ground-model';
import { parseNValue, STRATA_NAMES } from './core/ground';
import { CORROSION_ALLOWANCE_MM, parseNValue, SEA_DATUM, STRATA_NAMES } from './core/ground';
import { groundSectionSvg } from './view/ground-svg';
import { parseBearingElevationTable, parseSolplateTable, readDxfTexts } from './core/dxf-table';
import { columnDiameterIssues } from './core/column-check';
@@ -1515,10 +1515,10 @@ function valueText(key: EditableKey, v: unknown): string {
}
/** Sets one 지반·지층 input in the draft (applied to the model by 다시 생성). */
function editGround(name: string, key: 'groundPosition' | 'groundWaterOn' | 'groundWaterEl' | 'floodLevelEl' | 'scourDepthM', value: unknown): void {
function editGround(name: string, key: 'groundPosition' | 'groundWaterOn' | 'groundWaterEl' | 'floodLevelEl' | 'scourDepthM' | 'highWaterEl' | 'lowWaterEl', value: unknown): void {
const p = state.piers.find((q) => q.input.name === name);
if (!p) return;
const numeric = key === 'groundWaterEl' || key === 'floodLevelEl' || key === 'scourDepthM';
const numeric = key !== 'groundPosition' && key !== 'groundWaterOn';
if (numeric && value !== undefined && !Number.isFinite(value)) {
setError(`${FIELD_LABELS[key]}은(는) 숫자로 입력하세요. 값을 되돌렸습니다.`);
renderAll();
@@ -1575,6 +1575,25 @@ function renderGroundModel(box: HTMLDivElement, pier: Pier): void {
scourRow.append(el('span', label, 'muted small'), input);
}
wrap.appendChild(scourRow);
} else if (position === '해상') {
// 해상 (승인 2026-10-26, 기준면 MSL): 고조위·저조위와 세굴. 파랑과 선박 하중은 이번 범위에서 제외.
wrap.appendChild(el('p', `해상 · 기준면 ${SEA_DATUM} · 지반고 칸은 해저면 EL`, 'lbl'));
const seaRow = el('div', undefined, 'ground-water');
seaRow.style.display = 'flex';
seaRow.style.flexWrap = 'wrap';
seaRow.style.alignItems = 'center';
seaRow.style.gap = '8px';
for (const [key, label, value] of [['highWaterEl', '고조위 HWL (m)', d.highWaterEl], ['lowWaterEl', '저조위 LWL (m)', d.lowWaterEl], ['scourDepthM', '세굴 깊이 (m)', d.scourDepthM]] as const) {
const input = el('input');
input.type = 'number';
input.step = 'any';
input.placeholder = label;
input.value = value === undefined ? '' : String(value);
input.addEventListener('change', () => editGround(name, key, input.value === '' ? undefined : Number(input.value)));
seaRow.append(el('span', label, 'muted small'), input);
}
wrap.appendChild(seaRow);
wrap.appendChild(el('p', `부식 여유 기준 ${CORROSION_ALLOWANCE_MM} mm (확인 필요) · 파랑과 선박 하중은 이번 범위에서 제외`, 'muted small'));
} else {
wrap.appendChild(el('p', '지하수위', 'lbl'));
const water = el('div', undefined, 'ground-water');