From aec00ecc093be803860c8675cbe1c4c776a7cb4e Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Tue, 19 Mar 2024 17:49:21 +0800
Subject: [PATCH] update: 新建航线、事件编辑、kmz文件问题修改
---
src/pages/page-web/projects/components/route-edit/components/setting.vue | 318 ++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 240 insertions(+), 78 deletions(-)
diff --git a/src/pages/page-web/projects/components/route-edit/components/setting.vue b/src/pages/page-web/projects/components/route-edit/components/setting.vue
index d815c63..82b043a 100644
--- a/src/pages/page-web/projects/components/route-edit/components/setting.vue
+++ b/src/pages/page-web/projects/components/route-edit/components/setting.vue
@@ -1,21 +1,33 @@
<template>
<div class="setting">
- <a-popover
- placement="bottom"
- trigger="click"
- :getPopupContainer="(triggerNode: any) => triggerNode.parentNode">
+ <a-popover placement="bottom" trigger="click" :getPopupContainer="(triggerNode: any) => triggerNode.parentNode">
<template #content>
<div class="setting-content">
<div class="start-point common">
<div class="title">起飞点</div>
+ <div class="value">
+ {{ xmlTemplate.missionConfig?.takeOffRefPoint['#text'] !== '' ? '已设置' : '未设置' }}
+ </div>
</div>
<div class="photo-setting common">
<div class="title">拍照设置</div>
<ul class="select-box">
- <li class="select-item">广角照片</li>
- <li class="select-item">变焦照片</li>
+ <li
+ class="select-item"
+ v-for="item in photoSetting"
+ :key="item.value"
+ :style="{
+ '--settingColor': xmlTemplate.Folder.payloadParam?.imageFormat['#text']
+ .split(',')
+ .includes(item.value)
+ ? '#409eff'
+ : '#3c3c3c',
+ }"
+ @click="selectPhotoSetting(item.value)">
+ {{ item.title }}照片
+ </li>
</ul>
- <div class="auto-low-light">
+ <!-- <div class="auto-low-light">
<div class="title">自动低光</div>
<a-tooltip
placement="right"
@@ -25,17 +37,13 @@
checkedValue="lowLightSmartShooting"
unCheckedValue="normalPhoto" />
</a-tooltip>
- </div>
+ </div> -->
</div>
<!-- 爬升 -->
<div class="climb-mode common">
- <a-tooltip
- placement="right"
- :title="tipDescriptionEnums.climbModeTip">
+ <a-tooltip placement="right" :title="tipDescriptionEnums.climbModeTip">
<div class="mode-box">
- <a-radio-group
- v-model:value="setting.flyToWaylineMode"
- button-style="solid">
+ <a-radio-group v-model:value="xmlTemplate.missionConfig.flyToWaylineMode['#text']" button-style="solid">
<a-radio-button value="safely">垂直爬升</a-radio-button>
<a-radio-button value="pointToPoint">倾斜爬升</a-radio-button>
</a-radio-group>
@@ -45,59 +53,71 @@
<img :src="climbImage" alt="climb-img" />
</div>
<ul class="parameter-btn">
- <li>+100</li>
- <li>+10</li>
- <li>
- <span>{{ setting.takeOffSecurityHeight }}</span
+ <li @click="numberControls(true, 100, 'takeOffSecurityHeight')">+100</li>
+ <li @click="numberControls(true, 10, 'takeOffSecurityHeight')">+10</li>
+ <li class="parameter-input">
+ <a-input-number
+ :min="2"
+ :max="1500"
+ v-model:value="xmlTemplate.missionConfig.takeOffSecurityHeight['#text']"></a-input-number
>m
</li>
- <li>-100</li>
- <li>-10</li>
+ <li @click="numberControls(false, 100, 'takeOffSecurityHeight')">-100</li>
+ <li @click="numberControls(false, 10, 'takeOffSecurityHeight')">-10</li>
</ul>
</div>
</a-tooltip>
</div>
<!-- 高度模式 -->
<div class="height-mode common">
- <div class="title">航线高度模式</div>
- <div class="mode-box">
- <a-radio-group
- v-model:value="setting.executeHeightMode"
- button-style="solid">
- <a-radio-button value="WGS84">绝对高度</a-radio-button>
- <a-radio-button value="relativeToStartPoint"
- >相对起飞高度</a-radio-button
- >
- <a-radio-button value="realTimeFollowSurface"
- >相对地面高度</a-radio-button
- >
- </a-radio-group>
- </div>
- <div class="parameter-tool">
- <div class="example-img">
- <img :src="imgs[0]" alt="height-img" />
+ <a-tooltip
+ placement="right"
+ :title="tipDescriptionEnums[xmlTemplate.Folder.waylineCoordinateSysParam.heightMode['#text']]">
+ <div class="title">航线高度模式</div>
+ <div class="mode-box">
+ <a-radio-group
+ v-model:value="xmlTemplate.Folder.waylineCoordinateSysParam.heightMode['#text']"
+ button-style="solid">
+ <a-radio-button v-for="item in heightModeSetting" :key="item.value" :value="item.value">{{
+ item.title
+ }}</a-radio-button>
+ </a-radio-group>
</div>
- <div class="parameter-btn">
- <li>+100</li>
- <li>+10</li>
- <li>
- <span>{{ setting.executeHeight }}</span> m
- </li>
- <li>-100</li>
- <li>-10</li>
+ <div class="parameter-tool">
+ <div class="example-img">
+ <img :src="true ? heightModeSetting[0].img : heightModeSetting[1].img" alt="height-img" />
+ </div>
+ <div class="parameter-btn">
+ <li @click="numberControls(true, 100, 'globalHeight')">+100</li>
+ <li @click="numberControls(true, 10, 'globalHeight')">+10</li>
+ <li class="parameter-input">
+ <a-input-number
+ :min="0"
+ :max="10000"
+ v-model:value="xmlTemplate.Folder.globalHeight['#text']"></a-input-number
+ >m
+ </li>
+ <li @click="numberControls(false, 100, 'globalHeight')">-100</li>
+ <li @click="numberControls(false, 10, 'globalHeight')">-10</li>
+ </div>
</div>
- </div>
+ </a-tooltip>
</div>
<!-- 航线速度 -->
<div class="speed-setting common">
<div class="title">全局航线速度</div>
<div class="speed-box">
- <div class="subtract">-</div>
+ <div class="subtract" @click="numberControls(false, 1, 'autoFlightSpeed')">-</div>
<div class="text">
- <a-input-number :min="1" :max="15" class="value" v-model:value="setting.autoFlightSpeed">30</a-input-number>
+ <a-input-number
+ v-model:value="xmlTemplate.Folder.autoFlightSpeed['#text']"
+ :min="1"
+ :max="15"
+ class="value">
+ </a-input-number>
m / s
</div>
- <div class="add">+</div>
+ <div class="add" @click="numberControls(true, 1, 'autoFlightSpeed')">+</div>
</div>
</div>
</div>
@@ -108,28 +128,104 @@
</template>
<script setup lang="ts">
-import { min } from 'lodash'
+import { reactive, defineProps } from 'vue'
import { tipDescriptionEnums } from './enums'
+import useKmzTsa, { kmlStr, template as xmlTemplate } from '/@/utils/cesium/use-kmz-tsa'
+import useMapDraw, { kmlEntities as globalEntities } from '/@/utils/cesium/use-map-draw'
+import { getKmlParams } from '/@/utils/cesium/kmz'
+import { cesiumOperation } from '/@/hooks/use-cesium-tsa'
+import { message } from 'ant-design-vue'
+import type { missionConfig, payloadParam as payloadParamConfig, Folder } from '/@/utils/cesium/types/kml'
+const { appContext }: any = getCurrentInstance()
+const global = appContext.config.globalProperties
-const getResource = (name: string) => {
- return new URL(`/src/assets/icons/${name}`, import.meta.url).href
+const mapDraw = useMapDraw('', '', '', global)
+const { removeAllDataSource, removeAllPoint } = cesiumOperation()
+const kmzUtils = useKmzTsa()
+
+interface setting {
+ imageFormat: string[]
}
+
+const props = defineProps({
+ loadCompleted: Boolean,
+})
+
const getSvgResource = (name: string) => {
return new URL(`/src/assets/svg/${name}`, import.meta.url).href
}
const climbImage = getSvgResource('climb.svg')
-const imgs = [getSvgResource('xddm.svg')]
+const imgs = []
-const setting = reactive({
- flyToWaylineMode: 'safely',
- takeOffSecurityHeight: 80,
- executeHeightMode: 'WGS84',
- executeHeight: 80,
- // normal: normalPhoto row-light: lowLightSmartShooting
- orientedPhotoMode: 'normalPhoto',
- autoFlightSpeed: 10
-})
+// 拍照设置
+interface photoSetting {
+ title: string
+ value: string
+}
+const photoSetting = reactive<photoSetting[]>([
+ { title: '广角', value: 'wide' },
+ { title: '变焦', value: 'zoom' },
+ { title: '红外', value: 'ir' },
+])
+
+// 高度模式
+const heightModeSetting = reactive([
+ {
+ title: '绝对高度',
+ value: 'EGM96',
+ img: getSvgResource('jdgd.svg'),
+ },
+ {
+ title: '相对起飞高度',
+ value: 'relativeToStartPoint',
+ img: getSvgResource('xdqfd.svg'),
+ },
+])
+
+// 计算
+const numberControls = (isAdd: boolean, computeVal: number, key: string) => {
+ let obj = { '#text': '0' }
+ if (key === 'takeOffSecurityHeight') {
+ obj = xmlTemplate.value.missionConfig.takeOffSecurityHeight
+ }
+ if (key === 'globalHeight') {
+ obj = xmlTemplate.value.Folder.globalHeight
+ }
+ if (key === 'autoFlightSpeed') {
+ obj = xmlTemplate.value.Folder.autoFlightSpeed
+ }
+ let value = Number(obj['#text'])
+ if (isAdd) {
+ value += computeVal
+ } else {
+ value -= computeVal
+ }
+ obj['#text'] = value.toString()
+ if (key === 'globalHeight') {
+ const placemarkArr = xmlTemplate.value.Folder.Placemark
+ placemarkArr.forEach((placemark: { useGlobalHeight: { [x: string]: any }; height: { [x: string]: string } }) => {
+ if (Reflect.has(placemark, 'useGlobalHeight')) {
+ placemark.height['#text'] = value.toString()
+ }
+ })
+ const xmlString = kmzUtils.generateXML(xmlTemplate.value)
+ mapDraw.drawWayline(globalEntities.value, xmlString)
+ }
+}
+
+// 拍照选择
+const selectPhotoSetting = (value: string) => {
+ const imageFormat = xmlTemplate.value.Folder.payloadParam.imageFormat
+ const imageFormatArr = imageFormat['#text'].split(',')
+ if (imageFormatArr.includes(value)) {
+ const index = imageFormatArr.findIndex((item: string) => item === value)
+ imageFormatArr.splice(index, 1)
+ } else {
+ imageFormatArr.push(value)
+ }
+ xmlTemplate.value.Folder.payloadParam.imageFormat['#text'] = imageFormatArr.join(',')
+}
</script>
<style lang="scss" scoped>
@@ -139,51 +235,72 @@
max-height: 80vh;
overflow-y: auto;
color: #fff;
+
.common {
background-color: #232323;
border-radius: 10px;
padding: 15px;
margin-bottom: 16px;
+
.title {
font-weight: bold;
}
+
&:last-child {
margin: 0;
}
}
+
+ .start-point {
+ display: flex;
+ justify-content: flex-start;
+
+ .value {
+ margin-left: auto;
+ color: #409eff;
+ }
+ }
+
.photo-setting {
.select-box {
padding: 0;
display: flex;
margin-top: 10px;
+
li {
list-style-type: none;
padding: 3px 15px;
margin-left: 10px;
- background-color: #409eff;
+ background-color: var(--settingColor);
border-radius: 9999px;
font-weight: bold;
cursor: pointer;
+
&:first-child {
margin: 0;
}
}
}
+
.auto-low-light {
display: flex;
+
.title {
font-weight: bold;
margin-right: auto;
}
}
}
+
.height-mode,
.climb-mode {
.mode-box {
margin-top: 10px;
+
:deep() {
.ant-radio-group {
display: flex;
+
.ant-radio-button-wrapper {
flex: 1;
text-align: center;
@@ -192,9 +309,11 @@
color: #fff;
font-weight: bold;
border: 0;
+
&::before {
background-color: #101010;
}
+
&-checked {
background-color: #409eff !important;
}
@@ -202,19 +321,23 @@
}
}
}
+
.parameter-tool {
margin-top: 15px;
display: flex;
+
.example-img {
flex: 3;
flex-shrink: 0;
display: flex;
justify-content: center;
align-items: center;
+
img {
width: 100%;
}
}
+
.parameter-btn {
flex: 1;
padding: 0;
@@ -223,6 +346,7 @@
display: flex;
flex-direction: column;
align-items: center;
+
li {
width: 50px;
border-radius: 3px;
@@ -234,10 +358,12 @@
text-align: center;
font-weight: bold;
transition: all 0.3s ease-in-out;
+
&:nth-child(3) {
width: 100%;
background-color: transparent;
cursor: auto;
+
span {
color: #409eff;
font-size: 23px;
@@ -245,33 +371,64 @@
margin-right: 5px;
}
}
+
&:not(:nth-child(3)) {
&:hover {
background-color: #5d5f61;
}
}
}
+
+ .parameter-input {
+ display: flex;
+ align-items: center;
+
+ :deep() {
+ .ant-input-number {
+ background-color: transparent;
+ color: #409eff;
+ font-size: 23px;
+ border: 0;
+
+ .ant-input-number-handler-wrap {
+ display: none;
+ }
+
+ .ant-input-number-input-wrap {
+ input {
+ font-weight: bold;
+ text-align: center;
+ }
+ }
+ }
+ }
+ }
}
}
}
+
.speed-setting {
.speed-box {
margin-top: 10px;
display: flex;
justify-content: space-between;
align-items: center;
+
.text {
font-weight: bolder;
+
.value {
color: #409eff;
width: 60px;
font-size: 30px;
background-color: transparent;
border: 0;
+
:deep() {
.ant-input-number-handler-wrap {
display: none;
}
+
.ant-input-number-input-wrap {
input {
font-weight: bolder;
@@ -280,6 +437,7 @@
}
}
}
+
.subtract,
.add {
width: 32px;
@@ -291,6 +449,7 @@
background-color: #3c3c3c;
border-radius: 3px;
cursor: pointer;
+
&:hover {
background-color: #5d5f61;
}
@@ -298,22 +457,25 @@
}
}
}
-}
-:deep() {
- .ant-popover-content {
- .ant-popover-arrow,
- .ant-popover-inner {
- background-color: #101010;
- }
- .ant-popover-arrow {
- border-top-color: #101010 !important;
- border-left-color: #101010 !important;
- }
- .ant-popover-inner {
- border-radius: 15px;
- .ant-popover-inner-content {
- padding: 16px;
+ :deep() {
+ .ant-popover-content {
+ .ant-popover-arrow,
+ .ant-popover-inner {
+ background-color: #101010;
+ }
+
+ .ant-popover-arrow {
+ border-top-color: #101010 !important;
+ border-left-color: #101010 !important;
+ }
+
+ .ant-popover-inner {
+ border-radius: 15px;
+
+ .ant-popover-inner-content {
+ padding: 16px;
+ }
}
}
}
--
Gitblit v1.9.3