feat(rebar): per-member fck on ② for column, coping and footing
Each member can take its own fck on its ② card. A member without one uses the ③ 공통 fck, and fy stays common. The rebar table and the 3D model both read the resolved value. The I02 note stays until every fck member has its own value. The project file stores the values as optional fckByMember and refuses a bad value on open. Changing the fck is not a shape change, so it is not counted in the pending changes. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d8fd6adcf0
commit
7cf5835689
6 files changed
+175
-18
No files matched your search
+7
-5
@@ -5,7 +5,7 @@ import { bottomPiece, MAIN, widthLayout } from '../core/rebar/coping-main';
|
||||
import { C14_INSET, c14Bars, CAP, COPING_REBAR, shearBars, shearBarsMulti, shearUHeight, copingSideBars, SIDE_HOOK_LEG, stairBars, undersideAt } from '../core/rebar/coping';
|
||||
import { columnRebar, COLUMN_P1 } from '../core/rebar/column';
|
||||
import { barsAcross, BLOCK_REBAR } from '../core/rebar/bearing-block';
|
||||
import { DEFAULT_MATERIAL, hookLength, Material, NOMINAL_DIAMETER } from '../core/rebar/common';
|
||||
import { DEFAULT_MATERIAL, FckByMember, hookLength, Material, materialFor, NOMINAL_DIAMETER } from '../core/rebar/common';
|
||||
import { stretchMatrix } from './scene';
|
||||
|
||||
/**
|
||||
@@ -34,7 +34,9 @@ const COLOR = {
|
||||
|
||||
const mm = (v: number) => v / 1000;
|
||||
|
||||
export function buildRebar3D(m: PierModel, mat: Material = DEFAULT_MATERIAL): RebarScene {
|
||||
export function buildRebar3D(m: PierModel, common: Material = DEFAULT_MATERIAL, byMember: FckByMember = {}): RebarScene {
|
||||
const mCoping = materialFor(common, byMember, 'coping');
|
||||
const mColumn = materialFor(common, byMember, 'column');
|
||||
const group = new THREE.Group();
|
||||
const byName = new Map<string, THREE.Mesh[]>();
|
||||
const Ms = m.stretches.map((_, k) => stretchMatrix(m, k));
|
||||
@@ -87,7 +89,7 @@ export function buildRebar3D(m: PierModel, mat: Material = DEFAULT_MATERIAL): Re
|
||||
// at each end to the C1 level. Each bar is two pieces spliced at the column centre (overlap l_s). The slope runs x_L0 from each end (T형).
|
||||
const xL0 = L / 2 - COPING_REBAR.levelWidth / 2000;
|
||||
const under = (x: number) => undersideAt(L * 1000, x * 1000, m.endBottom, m.levelBottom);
|
||||
const lap = bottomPiece(mat).ls / 2000;
|
||||
const lap = bottomPiece(mCoping).ls / 2000;
|
||||
xs.forEach((n, j) => {
|
||||
const z = (x: number) => under(x) + 0.127;
|
||||
const left: [number, number, number][] = [
|
||||
@@ -166,7 +168,7 @@ export function buildRebar3D(m: PierModel, mat: Material = DEFAULT_MATERIAL): Re
|
||||
}
|
||||
}
|
||||
// C15 (거꾸로 된 U) and C16 (L형) on the stair (코핑철근.md §7): 11 bars each across the width.
|
||||
const stairs = stairBars(L * 1000, B * 1000, topEl, mat);
|
||||
const stairs = stairBars(L * 1000, B * 1000, topEl, mCoping);
|
||||
for (const s of stairs.c15) {
|
||||
const n = mm(s.n);
|
||||
const ld = mm(s.leg);
|
||||
@@ -187,7 +189,7 @@ export function buildRebar3D(m: PierModel, mat: Material = DEFAULT_MATERIAL): Re
|
||||
}
|
||||
|
||||
// Columns: P1 / P2 main bars on their radii, ties P3 / P5 / P4 as rings, P6 crossties across the column.
|
||||
const col = columnRebar(COLUMN_P1, mat);
|
||||
const col = columnRebar(COLUMN_P1, mColumn);
|
||||
const zBot = col.zBot; // mm
|
||||
const ring = (name: string, k: number, sc: number, y: number, r: number, d: number) => {
|
||||
const N = 36;
|
||||
|
||||
Reference in new issue
Block a user