97 lines
3.0 KiB
TypeScript
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)
|
|
}
|
|
})
|
|
}
|