feat(bearing): model C4/C5 and the front–back pair eccentricity (승인 2026-10-26)
- C4/C5 = distance from the coping edge to the bearing centre along the coping length, from the model; the drawing value is for comparison only. - A pair is a front and back bearing of the same order within their row. A pair with an eccentricity above 100 mm forbids 일체 (분리 first). - ② bearing card: read-only table of C4/C5 and the pair eccentricities. - The 일체 block model is not built yet. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d77f2bfd17
commit
cd18665d6a
3 files changed
+132
No files matched your search
+29
@@ -18,6 +18,7 @@ import { buildQuantity, quantityRows, type Quantity, type QuantityLine } from '.
|
||||
import { parseDrawingRows } from './core/drawing-import';
|
||||
import { groundElFor, parseGroundModel, strataRowsFor, type GroundModelFile } from './core/ground-model';
|
||||
import { CORROSION_ALLOWANCE_MM, parseNValue, SEA_DATUM, STRATA_NAMES } from './core/ground';
|
||||
import { bearingEdgeDistances, PAIR_ECCENTRICITY_LIMIT_MM, pairEccentricities } from './core/bearing-layout';
|
||||
import { groundSectionSvg } from './view/ground-svg';
|
||||
import { parseBearingElevationTable, parseSolplateTable, readDxfTexts } from './core/dxf-table';
|
||||
import { columnDiameterIssues } from './core/column-check';
|
||||
@@ -1503,6 +1504,33 @@ function renderBearingBasis(wrap: HTMLDivElement, pier: Pier): void {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 받침 배치 (승인 2026-10-26, read-only): C4·C5 from the model (coping edge ↔ bearing centre, 교각축 방향) and the
|
||||
* eccentricity of each front–back pair (일체 allowed up to 100 mm, otherwise 분리 first).
|
||||
*/
|
||||
function renderBearingLayout(wrap: HTMLDivElement, pier: Pier): void {
|
||||
if (!pier.model) return;
|
||||
wrap.appendChild(el('p', `배치 규칙 (모델값 · 편심 한계 ${PAIR_ECCENTRICITY_LIMIT_MM} mm)`, 'lbl'));
|
||||
const edges = bearingEdgeDistances(pier.model);
|
||||
const table = el('table', undefined, 'grid-table rebar-table');
|
||||
const head = el('thead');
|
||||
const hr = el('tr');
|
||||
for (const h of ['받침', '열', 'C4 (코핑 시작 ↔ 받침, mm)', 'C5 (받침 ↔ 코핑 끝, mm)']) hr.appendChild(el('th', h));
|
||||
head.appendChild(hr);
|
||||
table.appendChild(head);
|
||||
const body = el('tbody');
|
||||
for (const e of edges) {
|
||||
const tr = el('tr');
|
||||
for (const v of [String(e.no), e.row, e.leftMm.toFixed(0), e.rightMm.toFixed(0)]) tr.appendChild(el('td', v));
|
||||
body.appendChild(tr);
|
||||
}
|
||||
table.appendChild(body);
|
||||
wrap.appendChild(el('div', undefined, 'table-scroll')).appendChild(table);
|
||||
const pairs = pairEccentricities(pier.model.blocks);
|
||||
const forced = pairs.filter((p) => !p.allowed).length;
|
||||
wrap.appendChild(el('p', `쌍 편심 (전열 k · 후열 k, 교각축 방향): 최대 ${Math.max(...pairs.map((p) => p.eccentricityMm)).toFixed(0)} mm · ${forced === 0 ? '모든 쌍 일체 가능' : `${forced}쌍은 편심 초과 → 분리 우선`}`, 'muted small'));
|
||||
}
|
||||
|
||||
/** Text of one tracked value in the 변경 list. */
|
||||
function valueText(key: EditableKey, v: unknown): string {
|
||||
if (v === undefined || v === null) return '없음';
|
||||
@@ -1776,6 +1804,7 @@ function renderBearingRef(box: HTMLDivElement, pier: Pier): void {
|
||||
renderAll();
|
||||
});
|
||||
wrap.appendChild(typeInput);
|
||||
renderBearingLayout(wrap, pier);
|
||||
wrap.appendChild(el('p', '공통 규칙 (입력 · 기본값 = 도면값)', 'lbl'));
|
||||
const rules: [keyof BearingRules, string][] = [['h2', '모르타르 h2 (mm)'], ['h3', '받침 높이 h3 (mm)'], ['T', '솔플레이트 중심 T (mm)'], ['margin', '솔플 여유 (mm)']];
|
||||
const grid = el('div', undefined, 'edit-row');
|
||||
|
||||
Reference in new issue
Block a user