From 7f9056cc2afcb6f92ab2fd2e8f1f8a478f3c4cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sun, 15 Mar 2026 12:33:48 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[fire-shutter]=20=EB=B0=91=EB=A9=B4?= =?UTF-8?q?=EB=A0=88=EC=9D=BC=EC=97=B0=EA=B2=B0=EC=A0=88=EA=B3=A1=EB=AC=BC?= =?UTF-8?q?(=EB=A6=B0=ED=85=94)=20=ED=98=95=ED=83=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 프로파일: 좌측벽(55)─상부선반(30)─스텝(15↓)─하부립(20)─하부선반(50) - 레일과 떨어진 형태로 밑면에서 만나는 구조 - SVG: rect 기반 5개 부재로 표현 - 3D: addPlate 5개로 동일 형상 구현 --- .../rd/fire-shutter-drawing/index.blade.php | 63 ++++++++++--------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/resources/views/rd/fire-shutter-drawing/index.blade.php b/resources/views/rd/fire-shutter-drawing/index.blade.php index 06eaee23..0b948bd5 100644 --- a/resources/views/rd/fire-shutter-drawing/index.blade.php +++ b/resources/views/rd/fire-shutter-drawing/index.blade.php @@ -1387,31 +1387,28 @@ function renderSbSide() { ` : ''; })()} - + ${(() => { - 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 ` - - 레일연결절곡물 + + + + + + + + + + + + 린텔 `; })()} @@ -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); // ── ② 상부 커버는 케이스 공통으로 아래에서 렌더링 ──