From 88f106e0b85c4745c593886ea9b1912098a5dbb4 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Sat, 19 Apr 2025 19:44:19 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/hooks/useTaskWayline/useTaskWayline.js |  155 +++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 129 insertions(+), 26 deletions(-)

diff --git a/src/hooks/useTaskWayline/useTaskWayline.js b/src/hooks/useTaskWayline/useTaskWayline.js
index fe73342..506c46c 100644
--- a/src/hooks/useTaskWayline/useTaskWayline.js
+++ b/src/hooks/useTaskWayline/useTaskWayline.js
@@ -2,7 +2,7 @@
  * @Author: shuishen 1109946754@qq.com
  * @Date: 2025-04-19 14:24:34
  * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2025-04-19 17:47:46
+ * @LastEditTime: 2025-04-19 19:00:36
  * @FilePath: \command-center-dashboard\src\hooks\useTaskWayline\useTaskWayline.js
  * @Description: 
  * 
@@ -18,9 +18,12 @@
 
 import * as Cesium from 'cesium'
 import { Cartesian3 } from 'cesium'
+import aircraftGltf from '@/assets/gltf/aircraft.gltf'
+import CreateFrustum from '@/utils/cesium/frustum/CreateFrustum'
 
-export function useTaskWayline (viewer, taskDetails) {
-  const newViewer = isRef(viewer) ? viewer : ref(viewer)
+export function useTaskWayline () {
+  let viewer = null
+  let deviceOsdInfo = null
 
   // 解析kmz文件
   const parsingFiles = async url => {
@@ -30,7 +33,7 @@
     const waylinesXMLObj = removeTextKey(waylinesXMLJSON.Folder)
     if (!waylinesXMLObj.Placemark.length) return
     const allPoint = waylinesXMLObj.Placemark.map(item => item.Point.coordinates.split(','))
-    flyVisual(allPoint, newViewer.value)
+    flyVisual(allPoint, viewer)
     drawWayline(waylinesXMLObj)
   }
 
@@ -43,7 +46,7 @@
     removeEntitys()
 
     // 起点
-    newViewer.value.entities.add({
+    viewer.entities.add({
       id: 'drone-job-wayline-start',
       position: positions[0],
       billboard: {
@@ -54,7 +57,7 @@
     })
 
     // 终点
-    newViewer.value.entities.add({
+    viewer.entities.add({
       id: 'drone-job-wayline-end',
       position: positions[positions.length - 1],
       billboard: {
@@ -66,7 +69,7 @@
     })
 
     // 路径线
-    newViewer.value.entities.add({
+    viewer.entities.add({
       id: 'drone-job-wayline-polyline',
       polyline: {
         width: 4,
@@ -82,34 +85,134 @@
     })
   }
 
-  watch(
-    [
-      () => taskDetails.value?.way_lines?.length,
-      () => newViewer.value
-    ],
-    (
-      [wayLinesLength, curViewer],
-    ) => {
-      if (wayLinesLength && wayLinesLength > 0 && curViewer) {
-        parsingFiles(taskDetails.value.way_lines[0].url)
-      }
-    },
-    { immediate: true }
-  )
 
-  const removeEntitys = () => {
-    const entitiesIDs = newViewer.value?.entities.values.map(i => i.id)
 
-    Array.isArray(entitiesIDs) && entitiesIDs.forEach(item => {
-      item.includes('drone-job-wayline-') && newViewer.value?.entities.removeById(item)
+
+  let viewInfoFrustum
+  // 设置视椎
+  const setCreateFrustum = (host) => {
+    if (!host) return
+    viewInfoFrustum?.clear()
+
+    const attitude_head = 180 + host?.attitude_head
+    const gimbal_pitch = 90 - Number(host?.payloads[0]?.gimbal_pitch) || 0
+
+    viewInfoFrustum = new CreateFrustum(viewer, {
+      position: {
+        longitude: host?.longitude,
+        latitude: host?.latitude,
+        altitude: host?.height,
+      },
+      width: 30,
+      height: 30,
+      fov: 20.0,
+      near: 3.0,
+      far: 250.0,
+      roll: gimbal_pitch,
+      pitch: 0,
+      heading: attitude_head,
     })
   }
 
+  function setAircraftGltf () {
+    const host = deviceOsdInfo.value?.data?.host
+
+    console.log(host, 1111111111)
+
+    const aircraftEntity = viewer?.entities.getById('aircraftGltf')
+    const position = Cesium.Cartesian3.fromDegrees(host?.longitude, host?.latitude, host?.height)
+    if (aircraftEntity) {
+      aircraftEntity.position = new Cesium.ConstantPositionProperty(position)
+      return
+    }
+
+    let entity = viewer?.entities.add({
+      id: 'aircraftGltf',
+      position,
+      label: {},
+      model: {
+        uri: aircraftGltf, // 或 .glb
+        scale: 1.0, // 缩放比例
+        minimumPixelSize: 64, // 最小像素尺寸(保证模型远处可见)
+        maximumScale: 128, // 最大缩放(可选)
+      },
+    })
+
+    const homeDistance = Math.floor(host?.home_distance) || 0
+    const distance = 1
+    const arrivalTime = 1
+    const totalDistance = 1
+    const usedTime = 1
+
+    entity.label = new Cesium.LabelGraphics({
+      text: `距离机场水平距离:${homeDistance}m\n距离下一个航点:${Math.round(
+        distance,
+      )}m\n预计到达下一航点时间:${arrivalTime}\n本次飞行时间:${usedTime}\n本次航线平面里程:${Math.round(
+        totalDistance,
+      )}m`,
+      font: '13px monospace',
+      showBackground: true,
+      horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
+      verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+      disableDepthTestDistance: Number.POSITIVE_INFINITY,
+      pixelOffset: new Cesium.Cartesian2(0, -40),
+      show: true,
+    })
+  }
+
+  const mapEntityRemove = () => {
+    viewInfoFrustum?.clear()
+
+    viewer?.entities.removeById('aircraftGltf')
+  }
+
+  const removeEntitys = () => {
+    const entitiesIDs = viewer?.entities.values.map(i => i.id)
+
+    Array.isArray(entitiesIDs) && entitiesIDs.forEach(item => {
+      item.includes('drone-job-wayline-') && viewer?.entities.removeById(item)
+    })
+  }
+
+  const init = (v, wsInfo, taskDetails) => {
+    console.log(v, wsInfo, taskDetails)
+
+    viewer = v
+    deviceOsdInfo = computed(() => wsInfo.value?.device_osd)
+
+    watch(taskDetails,
+      () => {
+        if (taskDetails.value?.way_lines?.length) {
+          parsingFiles(taskDetails.value.way_lines[0].url)
+        }
+      },
+      { immediate: true }
+    )
+
+    watch(deviceOsdInfo, () => {
+      const host = deviceOsdInfo.value?.data?.host
+
+      if (!host) return
+
+      if ([14, 0].includes(host?.mode_code)) {
+        mapEntityRemove()
+        return
+      }
+
+      setCreateFrustum(host)
+      setAircraftGltf()
+    }
+    )
+  }
+
   onBeforeUnmount(() => {
+    mapEntityRemove()
     removeEntitys()
   })
 
   return {
-    removeEntitys
+    init,
+    removeEntitys,
+    mapEntityRemove,
   }
 }
\ No newline at end of file

--
Gitblit v1.9.3