diff --git a/resources/views/rd/fire-shutter-drawing/index.blade.php b/resources/views/rd/fire-shutter-drawing/index.blade.php index 46e81c6b..95d6b595 100644 --- a/resources/views/rd/fire-shutter-drawing/index.blade.php +++ b/resources/views/rd/fire-shutter-drawing/index.blade.php @@ -1822,50 +1822,75 @@ function createRailGroup() { const wdGeo = new THREE.ExtrudeGeometry(wdShape, railExtrude); grp.add(new THREE.Mesh(wdGeo, railMat)); - // --- ⑤ 벽도마감 (SUS 1.2T): 9-114-34-10 × 2개 --- - // 본체 양쪽 사이드를 감싸는 SUS 커버 (L자 프로파일) - const trimT = g.trimThick || 1.2; - // 하단 트림 (X=0 외면) - const bt = new THREE.Shape(); - bt.moveTo(-trimT, -9); // 전면 립 (9mm 돌출) - bt.lineTo(0, -9); - bt.lineTo(0, sw); // 사이드 커버 (본체 사이드월까지) - bt.lineTo(34, sw); // 벽쪽 플랜지 (34mm 안쪽으로) - bt.lineTo(34, sw + trimT); - bt.lineTo(-trimT, sw + trimT); - bt.lineTo(-trimT, -9); - grp.add(new THREE.Mesh(new THREE.ExtrudeGeometry(bt, railExtrude), railSusMat)); - // 상단 트림 (X=rw 외면) - const tt = new THREE.Shape(); - tt.moveTo(rw + trimT, -9); // 전면 립 - tt.lineTo(rw, -9); - tt.lineTo(rw, sw); // 사이드 커버 - tt.lineTo(rw - 34, sw); // 벽쪽 플랜지 - tt.lineTo(rw - 34, sw + trimT); - tt.lineTo(rw + trimT, sw + trimT); - tt.lineTo(rw + trimT, -9); - grp.add(new THREE.Mesh(new THREE.ExtrudeGeometry(tt, railExtrude), railSusMat)); - - // --- ① 마감재 (EGI 1.55T) × 2개 --- - // 슬랫 가이드 클립: 사이드월 내면에 부착된 L형 브라켓 - // 참조 도면 기준: 채널 내부 사이드월에서 안쪽으로 돌출 - [{ x: rt, dir: 1 }, { x: rw - rt, dir: -1 }].forEach(({ x, dir }) => { - const clipShape = new THREE.Shape(); - const cy = lp + rt + 3; // 립 내면에서 약간 안쪽 - const armLen = 12; // 사이드월에서 안쪽으로 돌출 길이 - const legLen = 20; // 사이드월 따라 길이 - // L형 브라켓 (사이드월 내면 → 채널 안쪽으로) - clipShape.moveTo(x, cy); - clipShape.lineTo(x + dir * armLen, cy); - clipShape.lineTo(x + dir * armLen, cy + rt); - clipShape.lineTo(x + dir * rt, cy + rt); - clipShape.lineTo(x + dir * rt, cy + legLen); - clipShape.lineTo(x, cy + legLen); - clipShape.lineTo(x, cy); - const clipGeo = new THREE.ExtrudeGeometry(clipShape, railExtrude); - grp.add(new THREE.Mesh(clipGeo, railMat)); + // --- ② 플랜지 끝 10mm 절곡 (채널 안쪽으로, 각 플랜지 내측 끝) --- + [[fl - rt, fl], [rw - fl, rw - fl + rt]].forEach(([x1, x2]) => { + const feLip = new THREE.Shape(); + feLip.moveTo(x1, 0); + feLip.lineTo(x1, lp); + feLip.lineTo(x2, lp); + feLip.lineTo(x2, 0); + feLip.lineTo(x1, 0); + grp.add(new THREE.Mesh(new THREE.ExtrudeGeometry(feLip, railExtrude), railMat)); }); + // --- ① 마감재 SUS 1.2T × 2장 (절곡: 10-11-110-30-15-15-15, J-hook 상하 대칭) --- + const tT = g.trimThick || 1.2; + const m1d = 30, m1e = 15, m1f = 15, m1g = 15, m1a = 10, m1b = 11; + + // 하단 트림 (X=0 외면) — cover + J-hook + const bt = new THREE.Shape(); + bt.moveTo(-tT, sw + rt + tT); + bt.lineTo(-tT, -lp); + bt.lineTo(m1d, -lp); + bt.lineTo(m1d, -lp + m1e); + bt.lineTo(m1d - m1f, -lp + m1e); + bt.lineTo(m1d - m1f, -lp + m1e + m1g); + bt.lineTo(m1d - m1f + tT, -lp + m1e + m1g); + bt.lineTo(m1d - m1f + tT, -lp + m1e - tT); + bt.lineTo(m1d - tT, -lp + m1e - tT); + bt.lineTo(m1d - tT, -lp + tT); + bt.lineTo(0, -lp + tT); + bt.lineTo(0, sw + rt + tT); + bt.lineTo(-tT, sw + rt + tT); + grp.add(new THREE.Mesh(new THREE.ExtrudeGeometry(bt, railExtrude), railSusMat)); + // 하단 벽쪽 ㄴ자 (측면탭 11mm + 코킹립 10mm) + const btW = new THREE.Shape(); + btW.moveTo(0, sw + rt); + btW.lineTo(m1b + tT, sw + rt); + btW.lineTo(m1b + tT, sw + rt + m1a); + btW.lineTo(m1b, sw + rt + m1a); + btW.lineTo(m1b, sw + rt + tT); + btW.lineTo(0, sw + rt + tT); + btW.lineTo(0, sw + rt); + grp.add(new THREE.Mesh(new THREE.ExtrudeGeometry(btW, railExtrude), railSusMat)); + + // 상단 트림 (X=rw 외면) — cover + J-hook (대칭) + const tt = new THREE.Shape(); + tt.moveTo(rw + tT, sw + rt + tT); + tt.lineTo(rw + tT, -lp); + tt.lineTo(rw - m1d, -lp); + tt.lineTo(rw - m1d, -lp + m1e); + tt.lineTo(rw - m1d + m1f, -lp + m1e); + tt.lineTo(rw - m1d + m1f, -lp + m1e + m1g); + tt.lineTo(rw - m1d + m1f - tT, -lp + m1e + m1g); + tt.lineTo(rw - m1d + m1f - tT, -lp + m1e - tT); + tt.lineTo(rw - m1d + tT, -lp + m1e - tT); + tt.lineTo(rw - m1d + tT, -lp + tT); + tt.lineTo(rw, -lp + tT); + tt.lineTo(rw, sw + rt + tT); + tt.lineTo(rw + tT, sw + rt + tT); + grp.add(new THREE.Mesh(new THREE.ExtrudeGeometry(tt, railExtrude), railSusMat)); + // 상단 벽쪽 ㄴ자 (대칭) + const ttW = new THREE.Shape(); + ttW.moveTo(rw, sw + rt); + ttW.lineTo(rw - m1b - tT, sw + rt); + ttW.lineTo(rw - m1b - tT, sw + rt + m1a); + ttW.lineTo(rw - m1b, sw + rt + m1a); + ttW.lineTo(rw - m1b, sw + rt + tT); + ttW.lineTo(rw, sw + rt + tT); + ttW.lineTo(rw, sw + rt); + grp.add(new THREE.Mesh(new THREE.ExtrudeGeometry(ttW, railExtrude), railSusMat)); + } else { // ====== 철재슬라트 가이드레일 (기존 C채널) ====== const rl = g.lip;