fix(abut-rebar): 날개벽 철근이 콘크리트 밖으로 나가는 곳 수정
- WR12 (전면 등단면) 아래 갈고리: 전면이 저판 끝면과 같은 면이라 바깥으로 꺾으면 저판 밖 → 안쪽으로 - WR7-1 · 7-2 · 7-3 · WR10 날개벽 다리: 뒷굽 끝 너머 경사 하단이 올라오는 곳에서 c 안쪽까지만 (최대 l_d) - WR20: 갈고리까지 날개벽 안인 단만 - 테스트: 교대 A1 모든 3D 철근을 ~100 mm 간격으로 찍어 콘크리트 안인지 확인 (P10은 슬래브 쪽 절반만 밖) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e3c9ad0953
commit
81fe1f1549
3 files changed
+179
-6
No files matched your search
@@ -241,7 +241,8 @@ export function abutWingRebar(g: AbutWingGeom, changes?: Partial<AbutWingRebarSe
|
||||
const sp = face === 'front' ? 2 * sBack : sBack;
|
||||
const off = face === 'front' ? 0 : o;
|
||||
const depth = face === 'front' ? c : T - c;
|
||||
const out = face === 'front' ? -1 : 1; // 갈고리는 날개벽 바깥쪽
|
||||
// 갈고리 방향: 전면은 저판 끝면과 같은 면이라 바깥으로 꺾으면 콘크리트 밖 → 두 면 모두 +n (전면은 날개벽 안쪽, 배면은 흙 쪽 저판 안).
|
||||
const out = 1;
|
||||
const heelF = Math.min(g.heelD, g.L) + off;
|
||||
const endF = g.L + off;
|
||||
const base = heelF - c;
|
||||
@@ -357,6 +358,13 @@ export function abutWingRebar(g: AbutWingGeom, changes?: Partial<AbutWingRebarSe
|
||||
const add2 = (p: V2, u: V2, f: number): V2 => [p[0] + u[0] * f, p[1] + u[1] * f];
|
||||
const haunchLevels = { 'WR7-1': 0, 'WR7-2': 0, 'WR7-3': 0 };
|
||||
const wDir: V2 = [ws, wt];
|
||||
// 날개벽 안쪽 다리 (WR7 · WR10): 경사 하단이 올라오는 곳에서 c 안쪽까지만, 최대 l_d.
|
||||
const legEnd = (A: V2, z: number) => {
|
||||
const dA = (A[0] - g.p0[0]) * ws + (A[1] - g.p0[1]) * wt;
|
||||
let lim = g.L - c;
|
||||
if (general && z - c < g.bottomEnd) lim = Math.min(lim, g.heelD + ((z - c - g.footTop) / (g.bottomEnd - g.footTop)) * (g.L - g.heelD));
|
||||
return Math.max(0, Math.min(ld.H25, lim - dA));
|
||||
};
|
||||
if (g.haunch > 0) {
|
||||
const sp = 2 * sBackV;
|
||||
const legIn = T - c - (d('H16') + d('H25')) / 2 - (d('H25') + d('H25')) / 2; // WR3–5 안쪽 25.4
|
||||
@@ -382,9 +390,10 @@ export function abutWingRebar(g: AbutWingGeom, changes?: Partial<AbutWingRebarSe
|
||||
const legLine = at(0, legIn);
|
||||
const A = lineX(legLine, wDir, diagP, du);
|
||||
const B = lineX(diagP, du, [0, backT + c], [1, 0]);
|
||||
const P0 = add2(A, wDir, ld.H25);
|
||||
const leg = legEnd(A, z);
|
||||
const P0 = add2(A, wDir, leg);
|
||||
const C: V2 = [B[0], tEnd];
|
||||
const len = ld.H25 + Math.hypot(B[0] - A[0], B[1] - A[1]) + Math.abs(tEnd - B[1]) + h25;
|
||||
const len = leg + Math.hypot(B[0] - A[0], B[1] - A[1]) + Math.abs(tEnd - B[1]) + h25;
|
||||
put(mark, [P3(P0, z), P3(A, z), P3(B, z), P3(C, z), P3(C, z - h25)], len);
|
||||
}
|
||||
// WR9 (§6, 결정 2026-11-04): 아래 헌치 대각 위 연직 @2·s_h, 개수 = floor(대각 / 간격) + 1, 가운데 맞춤. 위 끝 브라켓 상면 − c (그 위는 헌치 없음).
|
||||
@@ -414,7 +423,8 @@ export function abutWingRebar(g: AbutWingGeom, changes?: Partial<AbutWingRebarSe
|
||||
const X = lineX(wingLine, wDir, [0, backT + depth10], [1, 0]);
|
||||
const X1 = add2(X, uOut, r);
|
||||
const X2 = add2(X, wDir, r);
|
||||
put('WR10', [P3(add2(X1, uOut, ld.H25), z), P3(X1, z), P3(X2, z), P3(add2(X2, wDir, ld.H25), z)], 2 * ld.H25 + Math.hypot(X2[0] - X1[0], X2[1] - X1[1]));
|
||||
const leg = legEnd(X2, z);
|
||||
put('WR10', [P3(add2(X1, uOut, ld.H25), z), P3(X1, z), P3(X2, z), P3(add2(X2, wDir, leg), z)], ld.H25 + leg + Math.hypot(X2[0] - X1[0], X2[1] - X1[1]));
|
||||
}
|
||||
}
|
||||
// WR20 (§8): 간격재, 수평 @k·s_h × 연직 @k·s_v, 단마다 반 칸 엇갈림, 전면 · 배면 수평철근 사이 + 양끝 갈고리.
|
||||
@@ -427,7 +437,7 @@ export function abutWingRebar(g: AbutWingGeom, changes?: Partial<AbutWingRebarSe
|
||||
let j = 0;
|
||||
for (let z = g.footTop + c; z <= g.topStart + g.slope * g.L - c + 1e-6; z += dz, j++) {
|
||||
for (let dd = g.wallBackD + c + (j % 2 ? dx / 2 : 0); dd <= g.L - c + 1e-6; dd += dx) {
|
||||
if (z > top(dd) - c || z < bottom(dd) + c) continue;
|
||||
if (z > top(dd) - c || z - h13 < bottom(dd) + c) continue; // 갈고리까지 날개벽 안
|
||||
const a = at(dd, dF);
|
||||
const b = at(dd, dB);
|
||||
put('WR20', [P3(a, z - h13), P3(a, z), P3(b, z), P3(b, z - h13)], dB - dF + 2 * h13);
|
||||
@@ -452,7 +462,7 @@ export function abutWingRebar(g: AbutWingGeom, changes?: Partial<AbutWingRebarSe
|
||||
const hz2 = lenText(2 * sBackV);
|
||||
const hz1 = lenText(sBackV);
|
||||
push({ mark: 'WR11', size: SZ.WR11, role: '연직', spacing: v2, actual: v2, shape: '직선 · 아래 경사 하단 + c', position: '전면 · 변화단면', note: `기준선 (뒷굽 끝 − ${lenText(c)}) → 끝 쪽 ${vertical.front.nV}@${v2} · 끝 여유 ${lenText(vertical.front.endGap)}`, basis: '규칙', modified: vMod });
|
||||
push({ mark: 'WR12', size: SZ.WR12, role: '연직', spacing: v2, actual: v2, shape: `아래 90° 갈고리 ${h16} (저판 B6 · B8 위)`, position: '전면 · 등단면', note: `기준선 + 교대 쪽 ${vertical.front.nE}@${v2} · 마지막 ${lenText(vertical.front.lastE)}`, basis: '규칙', modified: vMod });
|
||||
push({ mark: 'WR12', size: SZ.WR12, role: '연직', spacing: v2, actual: v2, shape: `아래 90° 갈고리 ${h16} (저판 B6 · B8 위, 안쪽으로)`, position: '전면 · 등단면', note: `기준선 + 교대 쪽 ${vertical.front.nE}@${v2} · 마지막 ${lenText(vertical.front.lastE)} · 전면은 저판 끝면과 같은 면이라 갈고리를 안쪽으로`, basis: '규칙', modified: vMod });
|
||||
push({ mark: 'WR1', size: SZ.WR1, role: '연직', spacing: v1, actual: v1, shape: '직선 · 아래 경사 하단 + c', position: '배면 · 변화단면', note: `${vertical.back.nV}@${v1} · 끝 여유 ${lenText(vertical.back.endGap)}`, basis: '규칙', modified: vMod });
|
||||
push({ mark: 'WR2', size: SZ.WR2, role: '연직', spacing: v1, actual: v1, shape: `아래 90° 갈고리 ${h16}`, position: '배면 · 등단면', note: `기준선 + ${vertical.back.nE}@${v1} · 마지막 ${lenText(vertical.back.lastE)}`, basis: '규칙', modified: vMod });
|
||||
push({ mark: 'WR13', size: SZ.WR13, role: '수평', spacing: hz2, actual: hz2, shape: `교대 쪽 흉벽 지나 90° 갈고리 ${h25} · 맨 위 2단 경사와 나란히`, position: '전면 수평 · 등단면 띠', note: '흉벽 전면 − c까지 (Q-WR1: 맨 위 2단 경사)', basis: '규칙', modified: hMod });
|
||||
|
||||
Reference in new issue
Block a user