From 4bd6f36030948afc34e031fc9f4b8f8cc3dde6f9 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Sat, 19 Apr 2025 19:03:51 +0800
Subject: [PATCH] feat:useTaskWayline使用方式调整
---
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