feat(view): shear-segment table for 2·3주형 on the ③ coping tab
The segment table lists each column's Level and the segments between columns (추천안, Q-K2), so a 2주형 shows 좌 경사 3, Level 1 9, Level 2 9, 기둥 사이 1 18, 우 경사 3. One column is unchanged. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
13318e9393
commit
1074fdf428
3 files changed
+31
-11
No files matched your search
+17
-10
@@ -112,12 +112,12 @@ export function capLength(x: number, coping: number): number {
|
||||
export const PIECES_PER_POSITION = 6;
|
||||
|
||||
/**
|
||||
* 전단철근 구간 표 (시안 ③ · 코핑): C9 / C10 / C11 grouped by segment, from the bar positions.
|
||||
* Positions are along the coping length (mm); the table shows the first and last bar of each segment.
|
||||
* 전단철근 구간 표 (시안 ③ · 코핑): the segments of C9 / C10 / C11 along the coping, from the bar positions.
|
||||
* One column gives the three T형 segments; several columns add the segments between them (추천안, Q-K2).
|
||||
*/
|
||||
export function shearSegments(coping: number): { segment: string; from: number; to: number; spacing: number; count: number; bar: 'C9' | 'C10' | 'C11' }[] {
|
||||
const b = shearBars(coping);
|
||||
const seg = (name: string, xs: number[], bar: 'C9' | 'C10' | 'C11', spacing: number) => ({
|
||||
export function shearSegments(coping: number, columns: number[] = [coping / 2]): { segment: string; from: number; to: number; spacing: number; count: number; bar: 'C9' | 'C10' | 'C11' | 'C9·C11' }[] {
|
||||
const b = shearBarsMulti(coping, columns);
|
||||
const seg = (name: string, xs: number[], bar: 'C9' | 'C10' | 'C11' | 'C9·C11', spacing: number) => ({
|
||||
segment: name,
|
||||
from: Math.min(...xs),
|
||||
to: Math.max(...xs),
|
||||
@@ -125,11 +125,18 @@ export function shearSegments(coping: number): { segment: string; from: number;
|
||||
count: xs.length,
|
||||
bar,
|
||||
});
|
||||
return [
|
||||
seg('좌 경사', b.c9, 'C9', COPING_REBAR.spacingS),
|
||||
seg('Level', b.c10, 'C10', COPING_REBAR.spacingL),
|
||||
seg('우 경사', b.c11, 'C11', COPING_REBAR.spacingS),
|
||||
];
|
||||
const out = [seg('좌 경사', b.c9, 'C9', COPING_REBAR.spacingS)];
|
||||
const groups = columns.length > 1 ? columns.length : 1;
|
||||
for (let k = 0; k < groups; k++) {
|
||||
const xc = columns[k] ?? coping / 2;
|
||||
out.push(seg(`Level ${k + 1}`, b.c10.filter((x) => Math.abs(x - xc) <= (COPING_REBAR.levelWidth / 2 + COPING_REBAR.spacingL * 4)).slice(0, 2 * 4 + 1), 'C10', COPING_REBAR.spacingL));
|
||||
}
|
||||
for (let k = 0; k + 1 < groups; k++) {
|
||||
const between = b.between.filter((x) => x > columns[k] && x < columns[k + 1]);
|
||||
if (between.length) out.push(seg(`기둥 사이 ${k + 1}`, between, 'C9·C11', COPING_REBAR.spacingS));
|
||||
}
|
||||
out.push(seg('우 경사', b.c11, 'C11', COPING_REBAR.spacingS));
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -791,7 +791,7 @@ function renderRebar(): void {
|
||||
renderMaterial();
|
||||
// 전단철근 구간 표 (시안 ③ 코핑 탭): segments of C9 / C10 / C11 along the coping, in metres.
|
||||
if (state.rebarMember === 'coping') {
|
||||
const seg = shearSegments(pier.model.copingL * 1000);
|
||||
const seg = shearSegments(pier.model.copingL * 1000, pier.model.columns.map((c) => c.s * 1000));
|
||||
const st = el('table', undefined, 'grid-table rebar-table');
|
||||
const sh = el('thead');
|
||||
const shr = el('tr');
|
||||
|
||||
@@ -47,3 +47,16 @@ describe('전단철근 구간 표 (시안 ③)', () => {
|
||||
expect([right.from, right.to, right.count, right.spacing]).toEqual([7450, 11700, 18, 250]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('전단철근 구간 표 다주형', () => {
|
||||
it('2주형 (columns 2400 and 9600): left 3, Level 1 9, Level 2 9, between 18, right 3', () => {
|
||||
const segs = shearSegments(12000, [2400, 9600]);
|
||||
expect(segs.map((g) => [g.segment, g.count])).toEqual([
|
||||
['좌 경사', 3],
|
||||
['Level 1', 9],
|
||||
['Level 2', 9],
|
||||
['기둥 사이 1', 18],
|
||||
['우 경사', 3],
|
||||
]);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user