fix(abut): 날개벽을 삽도대로 흉벽·벽체 배면에 맞닿게 나눔
- 날개벽을 상·하 두 부분으로 나눔. 브라켓 상면 위는 흉벽 배면(−0.5)에, 아래는 벽체 배면(−0.8)에 맞닿음 (삽도 A-A와 평면) - 브라켓 상면이 s 방향으로 기울어 있으므로, 두께 0.45 m 안에서 가장 높은 브라켓 상면을 기준으로 자름 - 헌치는 기존 위치 유지: 위 헌치는 흉벽 배면 모서리, 아래 헌치는 벽체 배면 모서리 - 테스트 갱신: 날개벽 상부·하부 경계, 날개벽 개수 4. 전체 638건 통과, 타입 검사·빌드 통과. 브라우저 시각 확인은 미실시 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
7fab9b6685
commit
3aa7cc06b6
3 files changed
+40
-6
No files matched your search
@@ -69,7 +69,7 @@ describe('교대 3D: 받침블럭과 접속슬래브 (spec §4.2, §4.8)', () =>
|
||||
expect(Math.min(...backs)).toBeCloseTo(members.shape.wallBackM, 6);
|
||||
});
|
||||
|
||||
it('the 날개벽 stays behind the 벽체 back face, so it does not enter the 벽체 or the 흉벽', () => {
|
||||
it('the 날개벽 meets the 흉벽 back face above the 브라켓 and the 벽체 back face below it, and never enters them', () => {
|
||||
// All 벽체 and 흉벽 parts lie at t ≥ 벽체 배면 (−0.8). A wing vertex with t ≤ −0.8 therefore has no volume in common with them.
|
||||
const z = (g: THREE.Object3D) => {
|
||||
const pos = (g as THREE.Mesh).geometry.getAttribute('position');
|
||||
@@ -77,7 +77,15 @@ describe('교대 3D: 받침블럭과 접속슬래브 (spec §4.2, §4.8)', () =>
|
||||
for (let i = 0; i < pos.count; i++) max = Math.max(max, pos.getZ(i));
|
||||
return max;
|
||||
};
|
||||
for (const w of (named('wings') as THREE.Group).children) expect(z(w)).toBeLessThanOrEqual(members.shape.wallBackM + 1e-6);
|
||||
// Upper part (above the 브라켓 상면) meets the 흉벽 back face (−0.5); the lower part meets the 벽체 back face (−0.8).
|
||||
const backTop = (s: number) => members.parapetTopStartEl + ((members.parapetTopEndEl - members.parapetTopStartEl) * s) / model.length - members.shape.bracketHeightM;
|
||||
for (const w of (named('wings') as THREE.Group).children) {
|
||||
expect(z(w)).toBeLessThanOrEqual(members.shape.parapetBackM + 1e-6);
|
||||
const pos = (w as THREE.Mesh).geometry.getAttribute('position');
|
||||
for (let i = 0; i < pos.count; i++) {
|
||||
if (pos.getZ(i) > members.shape.wallBackM + 1e-6) expect(pos.getY(i)).toBeGreaterThanOrEqual(backTop(pos.getX(i)) - 1e-6);
|
||||
}
|
||||
}
|
||||
for (const w of (named('wall') as THREE.Group).children) expect(new THREE.Box3().setFromObject(w).min.z).toBeGreaterThanOrEqual(members.shape.wallBackM - 1e-6);
|
||||
});
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ describe('교대 A1 3D 장면 (AA3·AA3b·AA3c)', () => {
|
||||
expect(count('parapet')).toBe(10); // per step: back strip (흉벽 배면 단차) and the 흉벽 (삽도)
|
||||
expect(count('footing')).toBe(1);
|
||||
expect(count('piles')).toBe(18);
|
||||
expect(count('wings')).toBe(2);
|
||||
expect(count('wings')).toBe(4); // upper and lower part per wing
|
||||
expect(count('haunches')).toBe(4);
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Block a user