feat(rebar): 확대기초 배근 입력 8개 (피복 3·여유·격자 s·s_v·e_top·n), FT01·FT02 검사
- core/rebar/footing-settings.ts: 입력 정의, 기본값(확대기초철근 (1).md), 범위(제안), 검사 (FT01 범위, FT02 n 정수) - 확대기초 계산 함수가 설정을 인자로 받음 (기본값 = 기존 값, 기존 호출은 그대로) - 3D 확대기초 그림의 125·100 하드코딩 제거, 철근표·3D·기둥 층 높이가 같은 설정을 씀 - 패널: 상면·측면·하면 피복을 칸 분리, s_v와 e_top 분리. 고정 규칙(k=2, Δ₂=100, 전단 4s·엇갈림 2s, cycle 교대)과 B2·B6 디리는 읽기 전용으로 표시 - 기본값에서 P1 결과 불변 (기존 테스트 통과) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
550b508e7a
commit
5a20a18185
11 files changed
+281
-96
No files matched your search
+17
-15
@@ -1,6 +1,6 @@
|
||||
import * as THREE from 'three';
|
||||
import type { PierModel } from '../core/geometry';
|
||||
import { assemblyEndOffset, assemblyJs, b10Levels, b9Bars, FOOTING_DEFAULTS, gridPositions, grid, layers, legLength, legOffsets, sideDepth } from '../core/rebar/footing';
|
||||
import { assemblyEndOffset, assemblyJs, b10Levels, b9Bars, gridPositions, grid, layers, legLength, legOffsets, sideDepth } from '../core/rebar/footing';
|
||||
import { bottomPiece, MAIN, topSplicePieces, widthLayout } from '../core/rebar/coping-main';
|
||||
import { C14_INSET, c14Bars, CAP, COPING_REBAR, SHEAR_LOOP_STEP, shearBars, shearBarsMulti, shearUHeight, copingSideBars, SIDE_HOOK_LEG, stairBars, undersideAt } from '../core/rebar/coping';
|
||||
import { sideRowLevels } from '../core/coping-geom';
|
||||
@@ -381,11 +381,13 @@ export function buildRebar3D(m: PierModel, common: Material = DEFAULT_MATERIAL,
|
||||
const Lf = f.length;
|
||||
const Wf = f.width;
|
||||
const Hf = (f.top - f.bottom) * 1000;
|
||||
const z = layers(Hf);
|
||||
const gW = grid(Wf * 1000);
|
||||
const gL = grid(Lf * 1000);
|
||||
const posW = (j: number) => -Wf / 2 + mm(100 + gW.e + j * 125);
|
||||
const posL = (i: number) => -Lf / 2 + mm(100 + gL.e + i * 125);
|
||||
// 확대기초 입력 (승인 2026-10-26): the grid, covers and layer heights come from the model's footing settings.
|
||||
const fs = m.footingRebar;
|
||||
const z = layers(Hf, fs);
|
||||
const gW = grid(Wf * 1000, fs);
|
||||
const gL = grid(Lf * 1000, fs);
|
||||
const posW = (j: number) => -Wf / 2 + mm(fs.cSide + gW.e + j * fs.s);
|
||||
const posL = (i: number) => -Lf / 2 + mm(fs.cSide + gL.e + i * fs.s);
|
||||
const sA = -Lf / 2 + 0.1;
|
||||
const sB = Lf / 2 - 0.1;
|
||||
const nA = -Wf / 2 + 0.1;
|
||||
@@ -435,7 +437,7 @@ export function buildRebar3D(m: PierModel, common: Material = DEFAULT_MATERIAL,
|
||||
const colX = m.columns.filter((c) => Math.abs(c.s - f.s) <= Lf / 2).map((c) => (c.s - f.s) * 1000);
|
||||
const yB9Bot = bottom + mm(z.B24);
|
||||
const yB9Top = bottom + mm(z.B5);
|
||||
for (const b of b9Bars(Lf * 1000, Wf * 1000, colX).bars) {
|
||||
for (const b of b9Bars(Lf * 1000, Wf * 1000, colX, 2000, fs).bars) {
|
||||
const x = mm(b.x);
|
||||
const n = mm(b.n);
|
||||
const tailDir = x >= 0 ? -1 : 1;
|
||||
@@ -450,13 +452,13 @@ export function buildRebar3D(m: PierModel, common: Material = DEFAULT_MATERIAL,
|
||||
};
|
||||
const hookB10 = mm(hookLength('main90', NOMINAL_DIAMETER.S19)); // 296
|
||||
const hookAsm = mm(Math.round(hookLength('main90', NOMINAL_DIAMETER.S16))); // 246
|
||||
const d1 = sideDepth(NOMINAL_DIAMETER.S29, NOMINAL_DIAMETER.S19); // B10-1 depth (mm), on the W faces
|
||||
const d2 = sideDepth(NOMINAL_DIAMETER.S25, NOMINAL_DIAMETER.S19); // B10-2 depth (mm), on the L faces
|
||||
const d1 = sideDepth(NOMINAL_DIAMETER.S29, NOMINAL_DIAMETER.S19, fs); // B10-1 depth (mm), on the W faces
|
||||
const d2 = sideDepth(NOMINAL_DIAMETER.S25, NOMINAL_DIAMETER.S19, fs); // B10-2 depth (mm), on the L faces
|
||||
const sEdge = Lf / 2 - mm(d2);
|
||||
const nEdge = Wf / 2 - mm(d1);
|
||||
const dB10 = mm(NOMINAL_DIAMETER.S19);
|
||||
for (let j = 0; j < b10Levels(Hf); j++) {
|
||||
const zj = bottom + mm(FOOTING_DEFAULTS.cBottom + j * FOOTING_DEFAULTS.sV);
|
||||
for (let j = 0; j < b10Levels(Hf, fs); j++) {
|
||||
const zj = bottom + mm(fs.cBottom + j * fs.sV);
|
||||
for (const sg of [-1, 1]) {
|
||||
// B10-2: across W at the L faces; its ends turn inward along s.
|
||||
const sp = f.s + sg * sEdge;
|
||||
@@ -468,13 +470,13 @@ export function buildRebar3D(m: PierModel, common: Material = DEFAULT_MATERIAL,
|
||||
}
|
||||
}
|
||||
// B11 (across W, spread along L) and B12 (along L, spread across W) at the assembly levels, 4s apart, 2s stagger per level.
|
||||
const xsL = gridPositions(Lf * 1000);
|
||||
const ysW = gridPositions(Wf * 1000);
|
||||
const xsL = gridPositions(Lf * 1000, fs);
|
||||
const ysW = gridPositions(Wf * 1000, fs);
|
||||
const dAsm = assemblyEndOffset();
|
||||
const nAsm = Wf / 2 - mm(d1 + dAsm);
|
||||
const sAsm = Lf / 2 - mm(d2 + dAsm);
|
||||
assemblyJs(Hf).forEach((jA, k) => {
|
||||
const zA = bottom + mm(FOOTING_DEFAULTS.cBottom + jA * FOOTING_DEFAULTS.sV);
|
||||
assemblyJs(Hf, fs).forEach((jA, k) => {
|
||||
const zA = bottom + mm(fs.cBottom + jA * fs.sV);
|
||||
const zB = zA + dB10;
|
||||
const i0 = k % 2 === 0 ? 0 : 2;
|
||||
for (let iL = i0; iL < xsL.length; iL += 4) {
|
||||
|
||||
Reference in new issue
Block a user