fix: [fire-shutter] 밑면레일연결절곡물(린텔) 형태 수정

- 프로파일: 좌측벽(55)─상부선반(30)─스텝(15↓)─하부립(20)─하부선반(50)
- 레일과 떨어진 형태로 밑면에서 만나는 구조
- SVG: rect 기반 5개 부재로 표현
- 3D: addPlate 5개로 동일 형상 구현
This commit is contained in:
김보곤
2026-03-15 12:33:48 +09:00
parent d59797e82c
commit 7f9056cc2a

View File

@@ -1387,31 +1387,28 @@ function renderSbSide() {
` : '';
})()}
<!-- ━━━━━ 밑면레일연결절곡물 (레일 개구부 전면벽, 70mm 개구 유지) ━━━━━ -->
<!-- ━━━━━ 밑면레일연결절곡물 (린텔, 5세그먼트: 20,15,50,55,30) ━━━━━ -->
${(() => {
const bk30 = 30*sc, bk15 = 15*sc, bk20 = 20*sc;
// 전면판 J-훅 내부에 위치, 레일 개구부(70mm)를 막지 않음
// 프로파일: 밑면에서 하향 30mm → 내향 15mm → 하향 20mm (레일 개구부 전면벽)
const bx = ox + f50; // Seg3 끝 (50mm 지점) = 레일 개구부 전면
const by = oy + sH; // 밑면 레벨
const O = [
[bx, by], // 0: 밑면 레벨 (레일 개구 전면)
[bx, by + bk30], // 1: 30mm 하향
[bx + bk15, by + bk30], // 2: 15mm 내향 (레일 방향 선반)
[bx + bk15, by + bk30 + bk20],// 3: 20mm 하향 (하단)
];
const I = [
[bx - vt, by],
[bx - vt, by + bk30 - vt],
[bx + bk15 - vt, by + bk30 - vt],
[bx + bk15 - vt, by + bk30 + bk20],
];
const outer = O.map(p => p.join(',')).join(' L');
const inner = [I[3],I[2],I[1],I[0]].map(p => p.join(',')).join(' L');
// 프로파일: 좌측벽(55)─상부선반(30)─스텝(15↓)─하부립(20)─하부선반(50)
// 레일 개구부 전면에 위치, 레일과 떨어진 형태로 밑면에서 만남
const b20=20*sc, b15=15*sc, b50b=50*sc, b55=55*sc, b30=30*sc;
const bx = ox + f50 + vt; // 전면판 Seg3 끝에서 시작
const by = oy + sH; // 밑면 레벨 (상단)
const brkCol = '#7c9c6b';
const brkStroke = '#5a7a4a';
return `
<path d="M${outer} L${inner} Z" fill="${brkCol}" stroke="#5a7a4a" stroke-width="1" opacity="0.85"/>
<text x="${bx - 20*sc}" y="${by + bk30/2}" fill="${brkCol}" font-size="6" font-weight="700" text-anchor="middle" font-family="Pretendard" opacity="0.7" transform="rotate(-90,${bx-20*sc},${by+bk30/2})">레일연결절곡물</text>
<!-- 좌측벽 (55mm, 수직) -->
<rect x="${bx}" y="${by}" width="${vt}" height="${b55}" fill="${brkCol}" stroke="${brkStroke}" stroke-width="0.8" opacity="0.85"/>
<!-- 상부선반 (30mm , 상단) -->
<rect x="${bx}" y="${by}" width="${b30}" height="${vt}" fill="${brkCol}" stroke="${brkStroke}" stroke-width="0.8" opacity="0.85"/>
<!-- 스텝벽 (15mm , 상부선반 우측 ) -->
<rect x="${bx+b30}" y="${by}" width="${vt}" height="${b15+vt}" fill="${brkCol}" stroke="${brkStroke}" stroke-width="0.8" opacity="0.85"/>
<!-- 하부립 (20mm , 스텝 하단) -->
<rect x="${bx+b30}" y="${by+b15}" width="${b20}" height="${vt}" fill="${brkCol}" stroke="${brkStroke}" stroke-width="0.8" opacity="0.85"/>
<!-- 하부선반 (50mm , 하단) -->
<rect x="${bx}" y="${by+b55}" width="${b50b}" height="${vt}" fill="${brkCol}" stroke="${brkStroke}" stroke-width="0.8" opacity="0.85"/>
<!-- 라벨 -->
<text x="${bx+b30/2}" y="${by+b55/2}" fill="${brkCol}" font-size="6" font-weight="700" text-anchor="middle" font-family="Pretendard" opacity="0.6">린텔</text>
`;
})()}
@@ -1905,16 +1902,20 @@ function addPlate(w, h, d, x, y, z, mat, eMat) {
// Seg1: 17mm ← (Seg2 상단에서 전면 방향으로 복귀)
addPlate(W1, pt, fpSeg[0], 0, fpSeg[1] - pt / 2, frontZ - fpSeg[2] + fpSeg[0] / 2);
// ── 밑면레일연결절곡물 (레일 개구부 전면벽, 70mm 개구 유지) ──
// Seg3 끝(50mm 지점)에서 하향, 레일 개구부를 막지 않음
// ── 밑면레일연결절곡물 (린텔, 5세그먼트: 20,15,50,55,30) ──
// 좌측벽(55)─상부선반(30)─스텝(15↓)─하부립(20)─하부선반(50)
const brkMat = new THREE.MeshStandardMaterial({ color: 0x7c9c6b, transparent: true, opacity: S.td.caseOpacity, side: THREE.DoubleSide });
const brkZ = frontZ - fpSeg[2]; // Seg3 끝 = 레일 개구 전면
// 30mm 하향 (밑면에서 아래로, 레일 개구 전면벽)
addPlate(W1, 30, pt, 0, -30 / 2, brkZ + pt / 2, brkMat);
// 15mm 내향 선반 (30mm 하단에서 레일 방향)
addPlate(W1, pt, 15, 0, -30 + pt / 2, brkZ - 15 / 2, brkMat);
// 20mm 하향 (선반 끝에서 더 아래로)
addPlate(W1, 20, pt, 0, -30 - 20 / 2, brkZ - 15 + pt / 2, brkMat);
const brkZ = frontZ - fpSeg[2]; // Seg3 끝 = 린텔 좌측벽 위치
// 좌측벽 (55mm 수직, 밑면에서 아래로)
addPlate(W1, 55, pt, 0, -55 / 2, brkZ - pt / 2, brkMat);
// 상부선반 (30mm → 내향, 밑면 레벨)
addPlate(W1, pt, 30, 0, pt / 2, brkZ - 30 / 2, brkMat);
// 스텝벽 (15mm ↓, 상부선반 내측 끝)
addPlate(W1, 15, pt, 0, -15 / 2, brkZ - 30 - pt / 2, brkMat);
// 하부립 (20mm → 내향, 스텝 하단)
addPlate(W1, pt, 20, 0, -15 + pt / 2, brkZ - 30 - 20 / 2, brkMat);
// 하부선반 (50mm → 내향, 좌측벽 하단)
addPlate(W1, pt, 50, 0, -55 + pt / 2, brkZ - 50 / 2, brkMat);
// ── ② 상부 커버는 케이스 공통으로 아래에서 렌더링 ──