feat(abut): 날개벽 측면 삽도에 흉벽 · 브라켓 단차 · 저판을 함께 그리고 교대 삽도 EL 표기를 EL.xx.xxx로 통일

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-11-04 09:45:53 +09:00
1 parent 886347471e
commit 41b3165543
7 files changed
+83 -36

No files matched your search

+1 -1
View File
@@ -18,7 +18,7 @@ describe('교대 받침 삽도 (시안 ② 교량받침 카드)', () => {
it('단면: the four layers and E = h1 + h2 + h3 + h4 = 400', () => {
const svg = abutBearingSectionSvg(d);
for (const s of ['h1 75', 'h2 50', 'h3 250', 'h4 25', 'E = 400', '교좌면 44.367', 'z 44.492']) expect(svg).toContain(s);
for (const s of ['h1 75', 'h2 50', 'h3 250', 'h4 25', 'E = 400', '교좌면 EL.44.367', 'z EL.44.492']) expect(svg).toContain(s);
expect(svg.match(/<rect /g)).toHaveLength(4);
});
+4 -4
View File
@@ -35,16 +35,16 @@ const d: AbutWallDrawing = {
describe('교대 벽체·흉벽 삽도 (시안 ② 벽체·흉벽 카드)', () => {
it('단면 (① 구간): the width line and the levels of the generated model', () => {
const svg = abutWallSectionSvg(d);
for (const s of ['300 + 500 + 1600 = 2400', '교좌면 44.367', '벽체 2.372', '상면 41.995', '기초 하단 40.895', '교대축', '← 배면', '전면 →']) {
for (const s of ['300 + 500 + 1600 = 2400', '교좌면 EL.44.367', '벽체 2.372', '상면 EL.41.995', '기초 하단 EL.40.895', '교대축', '← 배면', '전면 →']) {
expect(svg).toContain(s);
}
expect(svg).toMatch(/흉벽 상단 4[67]\.\d{3}/);
expect(svg).toMatch(/브라켓 상면 4[56]\.\d{3}/);
expect(svg).toMatch(/흉벽 상단 EL\.4[67]\.\d{3}/);
expect(svg).toMatch(/브라켓 상면 EL\.4[56]\.\d{3}/);
});
it('정면·배면도: five steps, five bearings, the sloped 흉벽 top (IP3 46.835 → IP1 47.180) and the 수축줄눈', () => {
const svg = abutWallElevationSvg(d);
for (const s of ['IP3', 'IP1', `${model.length.toFixed(3)} m`, '수축줄눈 1', '46.835', '47.180', '①', '⑤']) expect(svg).toContain(s);
for (const s of ['IP3', 'IP1', `${model.length.toFixed(3)} m`, '수축줄눈 1', 'EL.46.835', 'EL.47.180', '①', '⑤']) expect(svg).toContain(s);
expect(svg).toContain('교좌면 계단 5구간');
});
+8 -2
View File
@@ -51,14 +51,20 @@ describe('날개벽 삽도 (시안 ② 날개벽 카드)', () => {
expect(svg.match(/<polygon /g)).toHaveLength(4); // slab, wall, two wings
});
it('측면: the bands, the length, the end height and the 뒷굽 끝', () => {
it('측면: the bands, the length, the end height, the 뒷굽 끝, and the 벽체 · 흉벽 · 브라켓 · 저판 with EL. labels', () => {
const { members, wings } = build();
const w = wings[0];
const svg = abutWingSideSvg({
name: '좌 날개벽', form: w.form, lengthM: w.lengthM, endHeightM: w.endHeightM, heelDistanceM: w.heelDistanceM,
topLine: w.topLine, bottomLine: w.bottomLine, bands: w.bands, seatEl: rec.seatEl, footingTopEl: members.footingTopEl,
parapetTopEl: w.topStartEl, bracketHeightM: members.shape.bracketHeightM, wallBackM: members.shape.wallBackM,
parapetBackM: members.shape.parapetBackM, wallFrontM: members.shape.wallFrontM, footingFrontM: members.shape.footingFrontM,
footingBackM: members.shape.footingBackM, footingThicknessM: members.shape.footingThicknessM,
});
for (const s of ['6500 (교좌면 끝에서, 날개벽 축 방향)', '1500', '등단면', '변화단면1', '변화단면2', '뒷굽 끝 1.807 m', '교좌면 44.367']) expect(svg).toContain(s);
for (const s of ['6500 (교좌면 끝에서, 날개벽 축 방향)', '1500', '등단면', '변화단면1', '변화단면2', '뒷굽 끝 1.807 m', '교좌면 EL.44.367', 'EL.41.995', '기초 하단 EL.40.895']) expect(svg).toContain(s);
expect(svg).toMatch(/흉벽 상단 EL\.4[67]\.\d{3}/);
expect(svg).toMatch(/브라켓 상면 EL\.4[56]\.\d{3}/);
expect(svg.match(/<polygon /g)).toHaveLength(5); // wing, 저판, 벽체, 브라켓 단차, 흉벽
});
it('모서리: haunch, bracket, slab chamfer and gaps from the inputs', () => {