Files
aerbim-ht-monitor/frontend/components/model/sensorHighlight.ts
2026-01-21 03:16:52 +03:00

97 lines
3.0 KiB
TypeScript

import {
AbstractMesh,
HighlightLayer,
Mesh,
InstancedMesh,
Color3,
} from '@babylonjs/core'
import * as statusColors from '../../lib/statusColors'
export const SENSOR_HIGHLIGHT_COLOR = new Color3(1, 1, 0)
const CRITICAL_COLOR3 = Color3.FromHexString(statusColors.STATUS_COLOR_CRITICAL)
const WARNING_COLOR3 = Color3.FromHexString(statusColors.STATUS_COLOR_WARNING)
const NORMAL_COLOR3 = Color3.FromHexString(statusColors.STATUS_COLOR_NORMAL)
export const statusToColor3 = (status?: string | null): Color3 => {
if (!status) return SENSOR_HIGHLIGHT_COLOR
const lower = status.toLowerCase()
if (lower === 'critical') {
return CRITICAL_COLOR3
}
if (lower === 'warning') {
return WARNING_COLOR3
}
if (lower === 'info' || lower === 'normal' || lower === 'ok') {
return NORMAL_COLOR3
}
if (status === statusColors.STATUS_COLOR_CRITICAL) return CRITICAL_COLOR3
if (status === statusColors.STATUS_COLOR_WARNING) return WARNING_COLOR3
if (status === statusColors.STATUS_COLOR_NORMAL) return NORMAL_COLOR3
return SENSOR_HIGHLIGHT_COLOR
}
export const getSensorIdFromMesh = (m: AbstractMesh | null): string | null => {
if (!m) return null
try {
const meta: any = (m as any)?.metadata
const extras: any = meta?.gltf?.extras ?? meta?.extras ?? (m as any)?.extras
const sid =
extras?.Sensor_ID ??
extras?.sensor_id ??
extras?.SERIAL_NUMBER ??
extras?.serial_number ??
extras?.detector_id
if (sid != null) return String(sid).trim()
const monitoringSensorInstance = extras?.bonsaiPset_ARBM_PSet_MonitoringSensor_Instance
if (monitoringSensorInstance && typeof monitoringSensorInstance === 'string') {
try {
const parsedInstance = JSON.parse(monitoringSensorInstance)
const instanceSensorId = parsedInstance?.Sensor_ID
if (instanceSensorId != null) return String(instanceSensorId).trim()
} catch {
return null
}
}
} catch {
return null
}
return null
}
export const collectSensorMeshes = (meshes: AbstractMesh[]): AbstractMesh[] => {
const result: AbstractMesh[] = []
for (const m of meshes) {
const sid = getSensorIdFromMesh(m)
if (sid) result.push(m)
}
return result
}
export const applyHighlightToMeshes = (
layer: HighlightLayer | null,
highlightedRef: { current: AbstractMesh[] },
meshesToHighlight: AbstractMesh[],
getColor?: (mesh: AbstractMesh) => Color3 | null,
) => {
if (!layer) return
for (const m of highlightedRef.current) {
m.renderingGroupId = 0
}
highlightedRef.current = []
layer.removeAllMeshes()
meshesToHighlight.forEach(mesh => {
const color = getColor ? getColor(mesh) ?? SENSOR_HIGHLIGHT_COLOR : SENSOR_HIGHLIGHT_COLOR
if (mesh instanceof Mesh) {
mesh.renderingGroupId = 1
highlightedRef.current.push(mesh)
layer.addMesh(mesh, color)
} else if (mesh instanceof InstancedMesh) {
mesh.sourceMesh.renderingGroupId = 1
highlightedRef.current.push(mesh.sourceMesh)
layer.addMesh(mesh.sourceMesh, color)
}
})
}