ERP-node/frontend/components/admin/dashboard/widgets/yard-3d/Yard3DCanvas_NEW.tsx

291 lines
12 KiB
XML

// (이전 import 및 interface 동일, mobile-crane case만 교체)
// 실제로는 기존 파일에서 mobile-crane 케이스만 교체
// mobile-crane 케이스를 다음으로 교체:
case "mobile-crane":
// 이동식 크레인: 하부(트랙) + 회전대 + 캐빈 + 붐대 + 카운터웨이트 + 후크
return (
<group>
{/* ========== 하부 크롤러 트랙 시스템 ========== */}
{/* 좌측 트랙 메인 */}
<Box args={[boxWidth * 0.28, boxHeight * 0.18, boxDepth * 0.98]} position={[-boxWidth * 0.31, -boxHeight * 0.41, 0]}>
<meshStandardMaterial
color="#1a1a1a"
roughness={0.9}
metalness={0.2}
emissive={isSelected ? "#1a1a1a" : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.2 : 0}
/>
</Box>
{/* 좌측 트랙 상부 롤러 */}
<Box args={[boxWidth * 0.32, boxHeight * 0.08, boxDepth * 0.12]} position={[-boxWidth * 0.31, -boxHeight * 0.28, -boxDepth * 0.42]}>
<meshStandardMaterial color="#2d3748" roughness={0.7} metalness={0.5} />
</Box>
<Box args={[boxWidth * 0.32, boxHeight * 0.08, boxDepth * 0.12]} position={[-boxWidth * 0.31, -boxHeight * 0.28, 0]}>
<meshStandardMaterial color="#2d3748" roughness={0.7} metalness={0.5} />
</Box>
<Box args={[boxWidth * 0.32, boxHeight * 0.08, boxDepth * 0.12]} position={[-boxWidth * 0.31, -boxHeight * 0.28, boxDepth * 0.42]}>
<meshStandardMaterial color="#2d3748" roughness={0.7} metalness={0.5} />
</Box>
{/* 우측 트랙 메인 */}
<Box args={[boxWidth * 0.28, boxHeight * 0.18, boxDepth * 0.98]} position={[boxWidth * 0.31, -boxHeight * 0.41, 0]}>
<meshStandardMaterial
color="#1a1a1a"
roughness={0.9}
metalness={0.2}
emissive={isSelected ? "#1a1a1a" : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.2 : 0}
/>
</Box>
{/* 우측 트랙 상부 롤러 */}
<Box args={[boxWidth * 0.32, boxHeight * 0.08, boxDepth * 0.12]} position={[boxWidth * 0.31, -boxHeight * 0.28, -boxDepth * 0.42]}>
<meshStandardMaterial color="#2d3748" roughness={0.7} metalness={0.5} />
</Box>
<Box args={[boxWidth * 0.32, boxHeight * 0.08, boxDepth * 0.12]} position={[boxWidth * 0.31, -boxHeight * 0.28, 0]}>
<meshStandardMaterial color="#2d3748" roughness={0.7} metalness={0.5} />
</Box>
<Box args={[boxWidth * 0.32, boxHeight * 0.08, boxDepth * 0.12]} position={[boxWidth * 0.31, -boxHeight * 0.28, boxDepth * 0.42]}>
<meshStandardMaterial color="#2d3748" roughness={0.7} metalness={0.5} />
</Box>
{/* 트랙 연결 프레임 */}
<Box args={[boxWidth * 0.12, boxHeight * 0.06, boxDepth * 0.98]} position={[0, -boxHeight * 0.39, 0]}>
<meshStandardMaterial color="#374151" roughness={0.5} metalness={0.6} />
</Box>
{/* ========== 회전 상부 구조 ========== */}
{/* 메인 회전 플랫폼 */}
<Box args={[boxWidth * 0.88, boxHeight * 0.15, boxDepth * 0.88]} position={[0, -boxHeight * 0.28, 0]}>
<meshStandardMaterial
color={placement.color}
roughness={0.25}
metalness={0.75}
emissive={isSelected ? placement.color : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.9 : 0}
/>
</Box>
{/* 회전 베어링 하우징 */}
<Box args={[boxWidth * 0.45, boxHeight * 0.08, boxDepth * 0.45]} position={[0, -boxHeight * 0.35, 0]}>
<meshStandardMaterial color="#4b5563" roughness={0.4} metalness={0.8} />
</Box>
{/* ========== 엔진 및 유압 시스템 ========== */}
{/* 엔진룸 메인 */}
<Box args={[boxWidth * 0.65, boxHeight * 0.32, boxDepth * 0.35]} position={[0, -boxHeight * 0.12, boxDepth * 0.24]}>
<meshStandardMaterial
color={placement.color}
roughness={0.35}
metalness={0.65}
emissive={isSelected ? placement.color : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.8 : 0}
/>
</Box>
{/* 유압 펌프 하우징 */}
<Box args={[boxWidth * 0.25, boxHeight * 0.18, boxDepth * 0.25]} position={[-boxWidth * 0.25, -boxHeight * 0.15, boxDepth * 0.18]}>
<meshStandardMaterial color="#dc2626" roughness={0.4} metalness={0.7} />
</Box>
<Box args={[boxWidth * 0.25, boxHeight * 0.18, boxDepth * 0.25]} position={[boxWidth * 0.25, -boxHeight * 0.15, boxDepth * 0.18]}>
<meshStandardMaterial color="#dc2626" roughness={0.4} metalness={0.7} />
</Box>
{/* 배기 파이프 */}
<Box args={[boxWidth * 0.08, boxHeight * 0.35, boxDepth * 0.08]} position={[boxWidth * 0.2, -boxHeight * 0.02, boxDepth * 0.35]}>
<meshStandardMaterial color="#1f2937" roughness={0.3} metalness={0.8} />
</Box>
{/* ========== 운전실 (캐빈) ========== */}
{/* 캐빈 메인 바디 */}
<Box args={[boxWidth * 0.38, boxHeight * 0.35, boxDepth * 0.38]} position={[0, -boxHeight * 0.08, -boxDepth * 0.18]}>
<meshStandardMaterial
color="#2d3748"
roughness={0.15}
metalness={0.85}
emissive={isSelected ? "#3b82f6" : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.6 : 0}
/>
</Box>
{/* 캐빈 창문 */}
<Box args={[boxWidth * 0.35, boxHeight * 0.25, boxDepth * 0.02]} position={[0, -boxHeight * 0.05, -boxDepth * 0.37]}>
<meshStandardMaterial
color="#60a5fa"
roughness={0.05}
metalness={0.95}
transparent
opacity={0.6}
emissive={isSelected ? "#60a5fa" : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.8 : 0}
/>
</Box>
{/* 캐빈 지붕 */}
<Box args={[boxWidth * 0.4, boxHeight * 0.05, boxDepth * 0.4]} position={[0, boxHeight * 0.07, -boxDepth * 0.18]}>
<meshStandardMaterial color="#374151" roughness={0.3} metalness={0.7} />
</Box>
{/* ========== 붐대 시스템 ========== */}
{/* 붐대 마운트 베이스 */}
<Box args={[boxWidth * 0.25, boxHeight * 0.25, boxDepth * 0.25]} position={[0, -boxHeight * 0.02, 0]}>
<meshStandardMaterial
color="#4b5563"
roughness={0.25}
metalness={0.85}
emissive={isSelected ? "#4b5563" : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.5 : 0}
/>
</Box>
{/* 붐대 힌지 실린더 (유압) */}
<Box
args={[boxWidth * 0.12, boxHeight * 0.28, boxDepth * 0.12]}
position={[0, boxHeight * 0.02, boxDepth * 0.08]}
rotation={[Math.PI / 3, 0, 0]}
>
<meshStandardMaterial color="#dc2626" roughness={0.3} metalness={0.8} />
</Box>
{/* 메인 붐대 하단 섹션 */}
<Box
args={[boxWidth * 0.18, boxHeight * 0.55, boxDepth * 0.18]}
position={[0, boxHeight * 0.12, -boxDepth * 0.13]}
rotation={[Math.PI / 4.2, 0, 0]}
>
<meshStandardMaterial
color="#f59e0b"
roughness={0.25}
metalness={0.75}
emissive={isSelected ? "#f59e0b" : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.75 : 0}
/>
</Box>
{/* 붐대 상단 섹션 (텔레스코픽) */}
<Box
args={[boxWidth * 0.14, boxHeight * 0.45, boxDepth * 0.14]}
position={[0, boxHeight * 0.32, -boxDepth * 0.32]}
rotation={[Math.PI / 4.8, 0, 0]}
>
<meshStandardMaterial
color="#fbbf24"
roughness={0.25}
metalness={0.75}
emissive={isSelected ? "#fbbf24" : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.75 : 0}
/>
</Box>
{/* 붐대 최상단 섹션 */}
<Box
args={[boxWidth * 0.1, boxHeight * 0.32, boxDepth * 0.1]}
position={[0, boxHeight * 0.45, -boxDepth * 0.44]}
rotation={[Math.PI / 5.5, 0, 0]}
>
<meshStandardMaterial
color="#fbbf24"
roughness={0.25}
metalness={0.75}
emissive={isSelected ? "#fbbf24" : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.75 : 0}
/>
</Box>
{/* 붐대 트러스 구조 (디테일) */}
{[-0.15, -0.05, 0.05, 0.15].map((offset, idx) => (
<Box
key={`truss-${idx}`}
args={[boxWidth * 0.02, boxHeight * 0.5, boxDepth * 0.02]}
position={[offset, boxHeight * 0.12, -boxDepth * 0.13]}
rotation={[Math.PI / 4.2, 0, 0]}
>
<meshStandardMaterial color="#1f2937" roughness={0.4} metalness={0.7} />
</Box>
))}
{/* ========== 카운터웨이트 시스템 ========== */}
{/* 카운터웨이트 메인 블록 */}
<Box args={[boxWidth * 0.55, boxHeight * 0.25, boxDepth * 0.28]} position={[0, -boxHeight * 0.03, boxDepth * 0.32]}>
<meshStandardMaterial
color="#52525b"
roughness={0.7}
metalness={0.4}
emissive={isSelected ? "#52525b" : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.3 : 0}
/>
</Box>
{/* 카운터웨이트 추가 블록 (상단) */}
<Box args={[boxWidth * 0.48, boxHeight * 0.18, boxDepth * 0.22]} position={[0, boxHeight * 0.08, boxDepth * 0.32]}>
<meshStandardMaterial color="#3f3f46" roughness={0.7} metalness={0.4} />
</Box>
{/* 카운터웨이트 프레임 */}
<Box args={[boxWidth * 0.58, boxHeight * 0.08, boxDepth * 0.32]} position={[0, -boxHeight * 0.16, boxDepth * 0.32]}>
<meshStandardMaterial color="#1f2937" roughness={0.5} metalness={0.7} />
</Box>
{/* ========== 후크 및 케이블 시스템 ========== */}
{/* 붐대 끝단 풀리 */}
<Box args={[boxWidth * 0.08, boxHeight * 0.08, boxDepth * 0.08]} position={[0, boxHeight * 0.52, -boxDepth * 0.52]}>
<meshStandardMaterial color="#1f2937" roughness={0.3} metalness={0.8} />
</Box>
{/* 메인 호이스트 케이블 */}
<Box args={[boxWidth * 0.025, boxHeight * 0.42, boxDepth * 0.025]} position={[0, boxHeight * 0.28, -boxDepth * 0.52]}>
<meshStandardMaterial
color="#0f172a"
roughness={0.3}
metalness={0.7}
/>
</Box>
{/* 후크 블록 상단 */}
<Box args={[boxWidth * 0.12, boxHeight * 0.08, boxDepth * 0.12]} position={[0, boxHeight * 0.04, -boxDepth * 0.52]}>
<meshStandardMaterial color="#1f2937" roughness={0.3} metalness={0.8} />
</Box>
{/* 후크 메인 (빨간색 안전색) */}
<Box args={[boxWidth * 0.1, boxHeight * 0.12, boxDepth * 0.1]} position={[0, -boxHeight * 0.02, -boxDepth * 0.52]}>
<meshStandardMaterial
color="#dc2626"
roughness={0.25}
metalness={0.85}
emissive={isSelected ? "#dc2626" : "#000000"}
emissiveIntensity={isSelected ? glowIntensity * 0.9 : 0}
/>
</Box>
{/* 지브 지지 케이블 (좌측) */}
<Box
args={[boxWidth * 0.018, boxHeight * 0.38, boxDepth * 0.018]}
position={[-boxWidth * 0.06, boxHeight * 0.28, -boxDepth * 0.08]}
rotation={[Math.PI / 5.5, 0, 0]}
>
<meshStandardMaterial color="#0f172a" roughness={0.2} metalness={0.8} />
</Box>
{/* 지브 지지 케이블 (우측) */}
<Box
args={[boxWidth * 0.018, boxHeight * 0.38, boxDepth * 0.018]}
position={[boxWidth * 0.06, boxHeight * 0.28, -boxDepth * 0.08]}
rotation={[Math.PI / 5.5, 0, 0]}
>
<meshStandardMaterial color="#0f172a" roughness={0.2} metalness={0.8} />
</Box>
{/* ========== 조명 및 안전 장치 ========== */}
{/* 작업등 (전방) */}
<Box args={[boxWidth * 0.06, boxHeight * 0.04, boxDepth * 0.04]} position={[0, boxHeight * 0.09, -boxDepth * 0.4]}>
<meshStandardMaterial
color="#fef08a"
roughness={0.1}
metalness={0.9}
emissive="#fef08a"
emissiveIntensity={isSelected ? glowIntensity * 1.2 : 0.3}
/>
</Box>
{/* 경고등 (붐대 상단) */}
<Box args={[boxWidth * 0.04, boxHeight * 0.04, boxDepth * 0.04]} position={[0, boxHeight * 0.54, -boxDepth * 0.5]}>
<meshStandardMaterial
color="#ef4444"
roughness={0.1}
metalness={0.9}
emissive="#ef4444"
emissiveIntensity={isSelected ? glowIntensity * 1.5 : 0.4}
/>
</Box>
</group>
);