From d4d5d48934c3c9647ae73eb2e61cd6bd5a8bba69 Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Fri, 22 Mar 2024 08:46:13 +0800
Subject: [PATCH] update

---
 src/components/GMap.vue                                                            |   14 
 src/utils/cesium/use-map-draw.ts                                                   |    7 
 src/pages/page-web/projects/components/route-edit/index.vue                        |   91 +++-
 src/pages/page-web/projects/wayline.vue                                            |   12 
 src/components/cesiumMap/cesium.vue                                                |   27 
 src/components/waylinetool/event-edit.vue                                          |  114 ++++
 src/assets/icons/waylinetool/panoramicview.png                                     |    0 
 src/pages/page-web/projects/components/route-edit/components/setting-point-tip.vue |    5 
 src/components/waylinetool/index.vue                                               |  940 ++++----------------------------------------
 src/store/index.ts                                                                 |   12 
 10 files changed, 288 insertions(+), 934 deletions(-)

diff --git a/src/assets/icons/waylinetool/panoramicview.png b/src/assets/icons/waylinetool/panoramicview.png
new file mode 100644
index 0000000..24e78c4
--- /dev/null
+++ b/src/assets/icons/waylinetool/panoramicview.png
Binary files differ
diff --git a/src/components/GMap.vue b/src/components/GMap.vue
index 8b0fbc7..ea0312a 100644
--- a/src/components/GMap.vue
+++ b/src/components/GMap.vue
@@ -848,12 +848,9 @@
           :payloads="osdVisible.payloads">
         </DroneControlPanel>
       </div>
-      <!-- <waylineTool /> -->
       <routeProfile />
     </div>
-    <div class="event-wrapper" v-if="false">
-      <eventEdit />
-    </div>
+    <eventEdit />
   </div>
 </template>
 
@@ -927,7 +924,6 @@
 import Cesium from './cesiumMap/cesium.vue'
 import { convertTimestampToDate } from '/@/utils/time'
 import { cesiumOperation } from '/@/hooks/use-cesium-tsa'
-import waylineTool from './waylinetool/index.vue'
 import routeProfile from './waylinetool/route-profile.vue'
 export default defineComponent({
   components: {
@@ -954,7 +950,6 @@
     CarryOutOutlined,
     RocketOutlined,
     DesktopOutlined,
-    waylineTool,
     routeProfile,
     eventEdit
   },
@@ -970,6 +965,7 @@
       label: string
       more?: any
     }
+
     // 打开飞行控制
     const openDroneControl = ref(false)
     const root = getRoot()
@@ -1640,7 +1636,7 @@
       aircrafIndex,
       airPortOption,
       controlStatus,
-      convertTimestampToDate,
+      convertTimestampToDate
     }
   },
 })
@@ -1651,10 +1647,6 @@
 .map-container {
   height: 100%;
   display: flex;
-  .event-wrapper {
-    width: 350px;
-    height: 100%;
-  }
 }
 
 .g-map-wrapper {
diff --git a/src/components/cesiumMap/cesium.vue b/src/components/cesiumMap/cesium.vue
index 8cdec9a..3dc2089 100644
--- a/src/components/cesiumMap/cesium.vue
+++ b/src/components/cesiumMap/cesium.vue
@@ -1,6 +1,5 @@
 <template>
   <div class="height-100 width-100 cesium" id="cesiumContainer"></div>
-  <div v-if="centerConfig.type && !centerConfig.latitude" class="pointLongitude">在地图上点击绘制项目中心点</div>
   <div class="search">
     <a-auto-complete v-if="show" v-model:value="searchText" style="width: 200px;height: 100%;" placeholder="请输入地址"
       @select="enter" @change="searchLocation" :options='resultList'>
@@ -9,7 +8,8 @@
       <SearchOutlined style="fontSize:24px; color: blue;" />
     </span>
   </div>
-
+  <!-- 事件编辑 -->
+  <actionEdit />
   <div class="zoon">
     <span class="zoon-in" @mousedown="handleMouseDown(zoonIn)" @mouseup="handleMouseUp">
       <PlusOutlined style="fontSize:24px; color: black;" />
@@ -50,6 +50,7 @@
 import { SearchOutlined, PlusOutlined, MinusOutlined } from '@ant-design/icons-vue'
 import { useMyStore } from '/@/store'
 import { requireImg } from '/@/utils/common'
+import actionEdit from '../waylinetool/index.vue'
 import * as Cesium from 'cesium'
 type result = {
   label: string,
@@ -157,20 +158,6 @@
   }
 }
 
-.pointLongitude {
-  background-color: rgba(20, 20, 20, 0.792);
-  position: absolute;
-  z-index: 30;
-  bottom: 30px;
-  color: #fff;
-  left: 0;
-  right: 0;
-  margin: 0 80px;
-  padding: 15px 0;
-  text-align: center;
-  font-size: 16px;
-}
-
 .search {
   position: absolute;
   top: 40px;
@@ -192,7 +179,7 @@
 .zoon {
   position: absolute;
   right: 20px;
-  bottom: 340px;
+  bottom: 173px;
   color: #fff;
   font-size: 16px;
   display: flex;
@@ -214,7 +201,7 @@
   position: absolute;
   background-color: #fff;
   z-index: 30;
-  bottom: 400px;
+  bottom: 205px;
   font-size: 14px;
   right: 20px;
   cursor: pointer;
@@ -235,8 +222,8 @@
   width: 40px;
   height: 40px;
   padding: 3px;
-  right: 20px;
-  bottom: 120px;
+  right: 17px;
+  bottom: 70px;
   background: #fff;
   margin-top: 10px;
   border-radius: 50%;
diff --git a/src/components/waylinetool/event-edit.vue b/src/components/waylinetool/event-edit.vue
index 31fa5c9..2a5c461 100644
--- a/src/components/waylinetool/event-edit.vue
+++ b/src/components/waylinetool/event-edit.vue
@@ -1,24 +1,114 @@
 <template>
-    <div class="event-container">
-        <div class="edit-box"></div>
-        <div class="map-box"></div>
+  <div class="event-container" v-if="isActionEditShow">
+    <div class="edit-box" v-if="currentPointEvent">
+      <div class="header">
+        <div class="action-name">
+          <img :src="currentPointEvent.aciton.icon" alt="icon" />
+          <span>{{ currentPointEvent.aciton.name }}</span>
+        </div>
+        <div class="action-index">{{ currentPointEvent.actionIndex }}</div>
+        <div class="action-del">
+          <span @click="handleDelAction"><DeleteOutlined /></span>
+        </div>
+      </div>
+      <div class="event-edit">
+        <template v-if="currentPointEvent.aciton.key === 'takePhoto'">
+          1
+        </template>
+      </div>
     </div>
+    <div class="map-box"></div>
+  </div>
 </template>
 
-<script lang="ts" scoped>
+<script lang="ts" setup>
+import { DeleteOutlined } from '@ant-design/icons-vue'
+import { useMyStore } from '/@/store'
+import { actionList } from '/@/utils/cesium/use-map-draw'
+import { template as xmlTemplate } from '/@/utils/cesium/use-kmz-tsa'
+
+const store = useMyStore()
+// 事件编辑是否显示
+const isActionEditShow = computed(() => store.state.waylineTool.isShow)
+// 当前点事件
+const selectedAction = computed(() => store.state.waylineTool.selectedAction)
+
+const currentPointEvent = computed(() => {
+  const placemarks = xmlTemplate.value.Folder.Placemark
+  const pointIndex = store.state.waylineTool.selectedPoint
+  if (pointIndex === undefined) return null
+  const currentPoint = placemarks[pointIndex]
+  const actions = currentPoint.actionGroup.action
+  let actionIndex = 1
+  if (Array.isArray(actions)) {
+    actionIndex = actions.findIndex((item: { actionActuatorFunc: { '#text': string } }) => {
+      return item.actionActuatorFunc['#text'] === selectedAction.value.key
+    })
+  }
+  return {
+    aciton: selectedAction.value,
+    actionIndex: `${pointIndex + 1}-${actionIndex + 1}`,
+  }
+})
+
+const handleDelAction = () => {}
 </script>
 
 <style lang="scss" scoped>
 .event-container {
-    width: 100%;
-    height: 100%;
-    display: flex;
-    flex-direction: column;
-    background: rgb(35, 35, 35);
-    .edit-box,
-    .map-box {
+  width: 400px;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  background: rgb(35, 35, 35);
+  color: #fff;
+  .edit-box {
+    width: 400px;
+    height: calc(100% - 300px);
+    .header {
+      padding: 0 15px;
+      height: 50px;
+      border-bottom: 1px solid rgb(79, 79, 79);
+      display: flex;
+      align-items: center;
+      div {
         flex: 1;
-        border: 1px solid red;
+        flex-shrink: 0;
+      }
+      .action-name {
+        display: flex;
+        align-items: center;
+        img {
+          width: 15px;
+          height: 15px;
+          margin-right: 3px;
+        }
+      }
+      .action-index {
+        text-align: center;
+        font-weight: bold;
+      }
+      .action-del {
+        display: flex;
+        justify-content: flex-end;
+        span {
+          cursor: pointer;
+          &:hover {
+            color: #409eff;
+          }
+        }
+      }
     }
+    .event-edit {
+      width: 100%;
+      height: calc(100% - 50px);
+      padding: 15px;
+      overflow: auto;
+    }
+  }
+  .map-box {
+    width: 400px;
+    height: 300px;
+  }
 }
 </style>
diff --git a/src/components/waylinetool/index.vue b/src/components/waylinetool/index.vue
index 74e1c71..b241b92 100644
--- a/src/components/waylinetool/index.vue
+++ b/src/components/waylinetool/index.vue
@@ -1,877 +1,115 @@
 <template>
-  <ul class="btn-list" v-if="waylineAbout.isShow">
-    <!-- 参数按钮 -->
-    <li class="s-btn" v-for="(item, index) in btnList" :key="index">
-      <div class="title">{{ item.title }}</div>
-      <a-popover placement="leftTop" trigger="click" arrow-point-at-center class="param-popover">
-        <template #title>
-          <span>{{ item.title }}</span>
-        </template>
-        <template #content>
-          <div class="popover-content">
-            <div v-for="sParam in item.param" :key="sParam.key" class="content-box">
-              <div>{{ sParam.title }}</div>
-              <a-input v-model:value="sParam.value" placeholder="请输入参数" v-if="!sParam.isRadio" />
-              <a-radio-group :options="sParam.options" v-model:value="sParam.value" v-else />
-              <div class="annotation" v-if="sParam.annotation">
-                注:{{ sParam.annotation }}
-              </div>
-            </div>
-            <div class="btn-tool">
-              <a-button @click="resetParamSetting(item)">重置</a-button>
-              <a-button type="primary" @click="item.event(item)">确定</a-button>
-            </div>
-          </div>
-        </template>
-        <div class="btn" @click="() => saveInitPopoverParam(item.param)"
-          :style="{ backgroundColor: item.selected ? '#2D8CF0' : '#323131' }">
-          <img :src="item.icon" alt="icon">
+  <div class="action-container" v-if="isActionEditShow">
+    <div class="more-btn" @click="toggleMoreAction">
+      <div class="label">更多</div>
+      <div class="icon"><EllipsisOutlined /></div>
+    </div>
+    <ul class="action-list" v-if="isMoreActionShow">
+      <li class="action-list_item" v-for="action in actionList" :key="action.key" @click="handleSettingAction(action)">
+        <div class="name">{{ action.name }}</div>
+        <div class="icon">
+          <img :src="action.icon" alt="icon" />
         </div>
-      </a-popover>
-    </li>
-    <!-- 确认和取消按钮 -->
-    <li class="s-btn">
-      <div class="title">取消编辑</div>
-      <div class="btn cancel-edit" @click="cencalEdit">
-        <CloseOutlined />
-      </div>
-    </li>
-    <li class="s-btn">
-      <div class="title">确认编辑</div>
-      <div class="btn confirm-edit" @click="confirmEdit">
-        <CheckOutlined />
-      </div>
-    </li>
-  </ul>
+      </li>
+    </ul>
+  </div>
 </template>
-<script lang="ts" setup>
-import { ref, computed } from 'vue'
-import { useMyStore } from '/@/store'
-import axios from 'axios'
-import JSZIP from 'jszip'
-import { saveAs } from 'file-saver'
-import { message } from 'ant-design-vue'
-import { cloneDeep } from 'lodash'
-import {
-  CloseOutlined,
-  CheckOutlined
-} from '@ant-design/icons-vue'
-// 初始化jszip
-const JsZip = new JSZIP()
 
+<script lang="ts" setup>
+import { EllipsisOutlined } from '@ant-design/icons-vue'
+import { actionList } from '/@/utils/cesium/use-map-draw'
+import { useMyStore } from '/@/store'
+import { message } from 'ant-design-vue'
 const store = useMyStore()
 
-const prefix = import.meta.env.VITE_MEDIAPANEL_API_URL
+const isMoreActionShow = ref<boolean>(false)
 
-const getResource = (name: string) => {
-  return new URL(`/src/assets/icons/${name}`, import.meta.url).href
+const isActionEditShow = computed(() => store.state.waylineTool.isShow)
+
+const selectedPoint = computed(() => store.state.waylineTool.selectedPoint)
+
+const toggleMoreAction = () => {
+  isMoreActionShow.value = !isMoreActionShow.value
 }
 
-interface popoverParamType {
-  title: string,
-  key: string,
-  isRadio?: boolean,
-  annotation?: string,
-  options?: {
-    label: string,
-    value: string
-  }[],
-  value: string
+const handleSettingAction = (action: { key: string }) => {
+  console.log(selectedPoint.value)
+  if (selectedPoint.value === undefined) return message.warn('请选择要编辑的航点!!')
 }
 
-// 点击按钮list
-interface sBtn {
-  key: string,
-  icon: string,
-  title: string,
-  distinguish?: string,
-  param: popoverParamType[],
-  event: Function,
-  selected?: boolean
-}
-
-// 保存当前选择的kmz文件
-const kmzFileZip = ref()
-// 当前选中的位置
-const currentPosition = ref()
-const curKmzName = ref<string>('')
-// 当前kmzpath
-const curKmzPath = ref<string>('')
-// popover初始参数
-const initPopoverParam = ref<popoverParamType[]>([])
-
-const btnList = ref<sBtn[]>([
-  // 开始录像
-  {
-    key: 'startRecord',
-    icon: getResource('waylinetool/camera-on.png'),
-    title: '开始录像',
-    param: [
-      {
-        title: '负载挂载位置',
-        key: 'payloadPositionIndex',
-        isRadio: true,
-        options: [
-          { label: '飞行器1号挂载位置', value: '0' },
-          { label: '飞行器2号挂载位置', value: '1' },
-          { label: '飞行器3号挂载位置', value: '2' },
-        ],
-        annotation: '飞行器1号挂载位置。M300 RTK,M350 RTK机型,对应机身左前方。其它机型,对应主云台。飞行器2号挂载位置。M300 RTK,M350 RTK机型,对应机身右前方。飞行器3号挂载位置。M300 RTK,M350 RTK机型,对应机身上方。',
-        value: ''
-      },
-      {
-        title: '拍摄照片文件后缀',
-        key: 'fileSuffix',
-        annotation: '为生成媒体文件命名时将额外附带该后缀',
-        value: ''
-      },
-      {
-        title: '拍摄照片存储类型',
-        key: 'payloadLensIndex',
-        isRadio: true,
-        options: [
-          { label: '存储变焦镜头拍摄照片', value: 'zoom' },
-          { label: '存储广角镜头拍摄照片', value: 'wide' },
-          { label: '存储红外镜头拍摄照片', value: 'ir' },
-          { label: '存储窄带镜头拍摄照片', value: 'narrow_band' },
-          { label: '全部使用', value: 'zoom, wide, ir, narrow_band' }
-        ],
-        value: ''
-      },
-      {
-        title: '是否使用全局存储类型',
-        key: 'useGlobalPayloadLensIndex',
-        isRadio: true,
-        options: [
-          { label: '不使用全局设置', value: '0' },
-          { label: '使用全局设置', value: '1' }
-        ],
-        value: ''
-      }
-    ],
-    event: (obj: sBtn) => {
-      paramPopover('startRecord', obj)
-    }
-  },
-  // 停止录像
-  {
-    key: 'stopRecord',
-    icon: getResource('waylinetool/camera-off.png'),
-    title: '停止录像',
-    param: [
-      {
-        title: '负载挂载位置',
-        key: 'payloadPositionIndex',
-        isRadio: true,
-        options: [
-          { label: '飞行器1号挂载位置', value: '0' },
-          { label: '飞行器2号挂载位置', value: '1' },
-          { label: '飞行器3号挂载位置', value: '2' },
-        ],
-        annotation: '飞行器1号挂载位置。M300 RTK,M350 RTK机型,对应机身左前方。其它机型,对应主云台。飞行器2号挂载位置。M300 RTK,M350 RTK机型,对应机身右前方。飞行器3号挂载位置。M300 RTK,M350 RTK机型,对应机身上方。',
-        value: ''
-      },
-      {
-        title: '拍摄照片存储类型',
-        key: 'payloadLensIndex',
-        isRadio: true,
-        options: [
-          { label: '存储变焦镜头拍摄照片', value: 'zoom' },
-          { label: '存储广角镜头拍摄照片', value: 'wide' },
-          { label: '存储红外镜头拍摄照片', value: 'ir' },
-          { label: '存储窄带镜头拍摄照片', value: 'narrow_band' },
-          { label: '全部使用', value: 'zoom, wide, ir, narrow_band' }
-        ],
-        value: ''
-      }
-    ],
-    event: (obj: sBtn) => {
-      paramPopover('stopRecord', obj)
-    }
-  },
-  // 开始等时间隔拍照
-  {
-    key: 'time',
-    icon: getResource('waylinetool/shoot1.png'),
-    title: '开始等时间隔拍照',
-    param: [],
-    event: (obj: sBtn) => {
-      obj.selected = true
-      editKmlFile('time')
-    }
-  },
-  // 开始等距间隔拍照
-  {
-    key: 'distance',
-    icon: getResource('waylinetool/shoot2.png'),
-    title: '开始等距间隔拍照',
-    param: [],
-    event: (obj: sBtn) => {
-      obj.selected = true
-      editKmlFile('distance')
-    }
-  },
-  // 结束间隔拍照
-  {
-    key: 'deleteShootType',
-    icon: getResource('waylinetool/shoot3.png'),
-    title: '结束间隔拍照',
-    param: [],
-    event: (obj: sBtn) => {
-      obj.selected = true
-      editKmlFile('deleteShootType')
-    }
-  },
-  // 悬停
-  {
-    key: 'hover',
-    icon: getResource('waylinetool/xt.png'),
-    title: '悬停',
-    param: [
-      {
-        title: '飞行器悬停等待时间',
-        key: 'hoverTime',
-        annotation: '参数需大于0, 单位为秒',
-        value: ''
-      }
-    ],
-    event: (obj: sBtn) => {
-      paramPopover('hover', obj)
-    }
-  },
-  // 飞行器偏航角
-  {
-    key: 'rotateYaw',
-    icon: getResource('waylinetool/droneyaw.png'),
-    title: '飞行器偏航角',
-    param: [
-      {
-        title: '飞行器目标偏航角(相对于地理北)',
-        key: 'aircraftHeading',
-        annotation: '范围为-180°到180°,飞行器旋转至该目标偏航角。0°为正北方向,90°为正东方向,-90°为正西方向,-180°/180°为正南方向。',
-        value: ''
-      },
-      {
-        title: '飞行器偏航角转动模式',
-        key: 'aircraftPathMode',
-        isRadio: true,
-        options: [
-          { label: '顺时针旋转', value: 'clockwise' },
-          { label: '逆时针旋转', value: 'counterClockwise' }
-        ],
-        value: ''
-      }
-    ],
-    event: (obj: sBtn) => {
-      paramPopover('rotateYaw', obj)
-    }
-  },
-  // 云台偏航角
-  {
-    key: 'gimbalRotate',
-    distinguish: 'yaw',
-    icon: getResource('waylinetool/holderyaw.png'),
-    title: '云台偏航角',
-    param: [
-      {
-        title: '负载挂载位置',
-        key: 'payloadPositionIndex',
-        isRadio: true,
-        options: [
-          { label: '飞行器1号挂载位置', value: '0' },
-          { label: '飞行器2号挂载位置', value: '1' },
-          { label: '飞行器3号挂载位置', value: '2' },
-        ],
-        annotation: '飞行器1号挂载位置。M300 RTK,M350 RTK机型,对应机身左前方。其它机型,对应主云台。飞行器2号挂载位置。M300 RTK,M350 RTK机型,对应机身右前方。飞行器3号挂载位置。M300 RTK,M350 RTK机型,对应机身上方。',
-        value: ''
-      },
-      {
-        title: '云台转动模式',
-        key: 'gimbalRotateMode',
-        isRadio: true,
-        options: [
-          { label: '绝对角度,相对于正北方的角度', value: 'relativeAngle' },
-          { label: '相对角度,相对于飞行器机头的角度', value: 'absoluteAngle' }
-        ],
-        value: ''
-      },
-      {
-        title: '是否使能云台Yaw转动',
-        key: 'gimbalYawRotateEnable',
-        isRadio: true,
-        options: [
-          { label: '不使能', value: '0' },
-          { label: '使能', value: '1' }
-        ],
-        value: ''
-      },
-      {
-        title: '云台Yaw转动角度',
-        key: 'gimbalYawRotateAngle',
-        annotation: '不同云台可转动范围不同',
-        value: ''
-      },
-      {
-        title: '云台完成转动用时',
-        key: 'gimbalRotateTime',
-        annotation: '单位为秒',
-        value: ''
-      }
-    ],
-    event: (obj: sBtn) => {
-      paramPopover('gimbalRotate', obj, {
-        gimbalHeadingYawBase: 'north',
-        gimbalRotateMode: 'relativeAngle',
-        // 上下摆动 pitch xyz中心点为基准
-        gimbalPitchRotateEnable: 0,
-        gimbalPitchRotateAngle: 0,
-        // 摆动 roll 已x位基准
-        gimbalRollRotateEnable: 0,
-        gimbalRollRotateAngle: 0,
-        // 左右摆动 yaw xyz中心点为基准
-        gimbalRotateTimeEnable: 0,
-      })
-    }
-  },
-  // 云台俯仰角
-  {
-    key: 'gimbalRotate',
-    distinguish: 'pitch',
-    icon: getResource('waylinetool/holdertilt.png'),
-    title: '云台俯仰角',
-    param: [
-      {
-        title: '负载挂载位置',
-        key: 'payloadPositionIndex',
-        isRadio: true,
-        options: [
-          { label: '飞行器1号挂载位置', value: '0' },
-          { label: '飞行器2号挂载位置', value: '1' },
-          { label: '飞行器3号挂载位置', value: '2' },
-        ],
-        annotation: '飞行器1号挂载位置。M300 RTK,M350 RTK机型,对应机身左前方。其它机型,对应主云台。飞行器2号挂载位置。M300 RTK,M350 RTK机型,对应机身右前方。飞行器3号挂载位置。M300 RTK,M350 RTK机型,对应机身上方。',
-        value: ''
-      },
-      {
-        title: '云台转动模式',
-        key: 'gimbalRotateMode',
-        isRadio: true,
-        options: [
-          { label: '绝对角度,相对于正北方的角度', value: 'relativeAngle' },
-          { label: '相对角度,相对于飞行器机头的角度', value: 'absoluteAngle' }
-        ],
-        value: ''
-      },
-      {
-        title: '是否使能云台Pitch转动',
-        key: 'gimbalPitchRotateEnable',
-        isRadio: true,
-        options: [
-          { label: '不使能', value: '0' },
-          { label: '使能', value: '1' }
-        ],
-        value: ''
-      },
-      {
-        title: '云台Pitch转动角度',
-        key: 'gimbalPitchRotateAngle',
-        annotation: '不同云台可转动范围不同',
-        value: ''
-      },
-      {
-        title: '云台完成转动用时',
-        key: 'gimbalRotateTime',
-        value: ''
-      }
-    ],
-    event: (obj: sBtn) => {
-      paramPopover('gimbalRotate', obj, {
-        gimbalHeadingYawBase: 'north',
-        gimbalRotateMode: 'relativeAngle',
-        gimbalRollRotateEnable: 0,
-        gimbalRollRotateAngle: 0,
-        gimbalYawRotateEnable: 0,
-        gimbalYawRotateAngle: 0,
-        gimbalRotateTimeEnable: 0,
-      })
-    }
-  },
-  // 拍照
-  {
-    key: 'takePhoto',
-    icon: getResource('waylinetool/camera.png'),
-    title: '拍照',
-    param: [
-      {
-        title: '负载挂载位置',
-        key: 'payloadPositionIndex',
-        isRadio: true,
-        options: [
-          { label: '飞行器1号挂载位置', value: '0' },
-          { label: '飞行器2号挂载位置', value: '1' },
-          { label: '飞行器3号挂载位置', value: '2' },
-        ],
-        annotation: '飞行器1号挂载位置。M300 RTK,M350 RTK机型,对应机身左前方。其它机型,对应主云台。飞行器2号挂载位置。M300 RTK,M350 RTK机型,对应机身右前方。飞行器3号挂载位置。M300 RTK,M350 RTK机型,对应机身上方。',
-        value: ''
-      },
-      {
-        title: '拍摄照片文件后缀',
-        key: 'fileSuffix',
-        annotation: '为生成媒体文件命名时将额外附带该后缀。',
-        value: ''
-      },
-      {
-        title: '拍摄照片存储类型',
-        key: 'payloadLensIndex',
-        isRadio: true,
-        options: [
-          { label: '存储变焦镜头拍摄照片', value: 'zoom' },
-          { label: '存储广角镜头拍摄照片', value: 'wide' },
-          { label: '存储红外镜头拍摄照片', value: 'ir' },
-          { label: '存储窄带镜头拍摄照片', value: 'narrow_band' },
-          { label: '全部使用', value: 'zoom, wide, ir, narrow_band' }
-        ],
-        value: ''
-      },
-      {
-        title: '是否使用全局存储类型',
-        key: 'useGlobalPayloadLensIndex',
-        isRadio: true,
-        options: [
-          { label: '不使用全局设置', value: '0' },
-          { label: '使用全局设置', value: '1' }
-        ],
-        value: ''
-      }
-    ],
-    event: (obj: sBtn) => {
-      paramPopover('takePhoto', obj)
-    }
-  },
-  // 相机变焦
-  {
-    key: 'zoom',
-    icon: getResource('waylinetool/fd.png'),
-    title: '相机变焦',
-    param: [
-      {
-        title: '负载挂载位置',
-        key: 'payloadPositionIndex',
-        isRadio: true,
-        options: [
-          { label: '飞行器1号挂载位置', value: '0' },
-          { label: '飞行器2号挂载位置', value: '1' },
-          { label: '飞行器3号挂载位置', value: '2' },
-        ],
-        annotation: '飞行器1号挂载位置。M300 RTK,M350 RTK机型,对应机身左前方。其它机型,对应主云台。飞行器2号挂载位置。M300 RTK,M350 RTK机型,对应机身右前方。飞行器3号挂载位置。M300 RTK,M350 RTK机型,对应机身上方。',
-        value: ''
-      },
-      {
-        title: '变焦焦距',
-        key: 'focalLength',
-        annotation: '单位mm,值>0',
-        value: ''
-      }
-    ],
-    event: (obj: sBtn) => {
-      paramPopover('zoom', obj)
-    }
-  },
-  // 创建文件夹
-  {
-    key: 'customDirName',
-    icon: getResource('waylinetool/create-file.png'),
-    title: '创建文件夹',
-    param: [
-      {
-        title: '负载挂载位置',
-        key: 'payloadPositionIndex',
-        isRadio: true,
-        options: [
-          { label: '飞行器1号挂载位置', value: '0' },
-          { label: '飞行器2号挂载位置', value: '1' },
-          { label: '飞行器3号挂载位置', value: '2' },
-        ],
-        annotation: '飞行器1号挂载位置。M300 RTK,M350 RTK机型,对应机身左前方。其它机型,对应主云台。飞行器2号挂载位置。M300 RTK,M350 RTK机型,对应机身右前方。飞行器3号挂载位置。M300 RTK,M350 RTK机型,对应机身上方。',
-        value: ''
-      },
-      {
-        title: '新文件夹的名称',
-        key: 'directoryName',
-        value: ''
-      }
-    ],
-    event: (obj: sBtn) => {
-      paramPopover('customDirName', obj)
-    }
-  }
-])
-
-const waylineAbout = computed(() => {
-  return store.state.waylineTool
-})
-
-/**
- * @description: 读取kmz文件转blob
- * @param {*} kmzPath 文件地址
- * @return {*} void
- */
-const readKmzFile = (kmzPath: string) => {
-  return axios.get(kmzPath, { responseType: 'arraybuffer' })
-    .then(fileRes => fileRes.data)
-    .then(kmzData => JsZip.loadAsync(kmzData)) // 解压kmz文件
-    .then(kmzZip => kmzZip)
-    .catch(() => message.error('请求kmz文件失败!!'))
-}
-
-watch(() => store.state.waylineTool.kmzPath, (n: string) => {
-  curKmzPath.value = n
-  const arr = n.split('/')
-  curKmzName.value = decodeURIComponent(arr[arr.length - 1])
-  readKmzFile(n).then(kmzFile => {
-    kmzFileZip.value = kmzFile
-  })
-}, {
-  deep: true
-})
-
-watch(() => store.state.waylineTool.position, (position: number) => {
-  currentPosition.value = position
-  eventLight()
-}, {
-  deep: true
-})
-
-// 事件高亮
-const eventLight = () => {
-  // 已经添加的事件高亮
-  btnList.value.forEach(item => { item.selected = false })
-  kmzFileZip.value.file(/\.kml$/i)[0].async('text').then((content: string) => {
-    const regx = /<Placemark>([\s\S]*?)<\/Placemark>/g
-    const points = content.match(regx) || []
-    const funcRegx = /<wpml:actionActuatorFunc>([\s\S]*?)<\/wpml:actionActuatorFunc>/g
-    const funcs = (points[currentPosition.value] || '').match(funcRegx)
-    const funcNameRegx = /<wpml:actionActuatorFunc>(.*?)<\/wpml:actionActuatorFunc>/
-    const shootTypeRegx = /<wpml:shootType>([\s\S]*?)<\/wpml:shootType>/g
-    const shootType = (points[currentPosition.value] || '').match(shootTypeRegx)
-    const shootTypeValueRegx = /<wpml:shootType>(.*?)<\/wpml:shootType>/
-
-    // 云台正则
-    const actionRegx = /<wpml:action>([\s\S]*?)<\/wpml:action>/g
-    const actions = (points[currentPosition.value] || '').match(actionRegx)
-    const gimbalPitchRotateAngleRegx = /<wpml:gimbalPitchRotateAngle>(.*?)<\/wpml:gimbalPitchRotateAngle>/
-    const gimbalYawRotateAngleRegx = /<wpml:gimbalYawRotateAngle>(.*?)<\/wpml:gimbalYawRotateAngle>/
-
-    btnList.value.forEach(sBtn => {
-      funcs?.forEach((func: string) => {
-        const funcName = func.match(funcNameRegx) || []
-        if (funcName[1] === sBtn.key && !sBtn.distinguish) {
-          sBtn.selected = true
-        }
-      })
-      shootType?.forEach((shootType: string) => {
-        const typeValue = shootType.match(shootTypeValueRegx) || []
-        if (typeValue[1] === sBtn.key) {
-          sBtn.selected = true
-        }
-      })
-      if (sBtn.distinguish) {
-        const action = actions?.find((action: string) => action.includes('<wpml:actionActuatorFunc>gimbalRotate</wpml:actionActuatorFunc>'))
-        const pitchAngle = action?.match(gimbalPitchRotateAngleRegx) || []
-        const yawAngle = action?.match(gimbalYawRotateAngleRegx) || []
-        if (!!Number(pitchAngle[1]) && sBtn.distinguish === 'pitch') {
-          sBtn.selected = true
-        }
-        if (!!Number(yawAngle[1]) && sBtn.distinguish === 'yaw') {
-          sBtn.selected = true
-        }
-      }
-    })
-    settingDefaultValue(content)
-  })
-}
-
-// popover设置默认值
-const settingDefaultValue = (content: string) => {
-  const regx = /<Placemark>([\s\S]*?)<\/Placemark>/g
-  const points = content.match(regx) || []
-  // 当前选中的点
-  const currentPoint = points[currentPosition.value] || ''
-  const actionRegx = /<wpml:action>([\s\S]*?)<\/wpml:action>/g
-  const actionsKML = currentPoint.match(actionRegx)
-  btnList.value.forEach((sBtn: sBtn) => {
-    const kml = `<wpml:actionActuatorFunc>${sBtn.key}</wpml:actionActuatorFunc>`
-    const action = actionsKML?.find((action: string) => action.includes(kml))
-    sBtn.param.forEach((sParam) => {
-      const paramRegex = new RegExp(`<wpml:${sParam.key}>([\\s\\S]*?)<\\/wpml:${sParam.key}>`, 'g')
-      const actionParam = action?.match(paramRegex) || ['']
-      const infoRegx = new RegExp(`<wpml:${sParam.key}>([\\s\\S]*?)<\\/wpml:${sParam.key}>`)
-      const value: string[] = actionParam[0]?.match(infoRegx) || ['']
-      sParam.value = value[1] || ''
-    })
-  })
-}
-
-/**
- * @description: 创建kml模版
- * @param {*} actionId 事件id(唯一)
- * @param {*} actionType 事件类型
- * @param {*} param 事件参数
- * @return {*} void
- */
-const createActionKML = (actionId: string, actionType: string, param: any) => {
-  let paramKML = ''
-  Object.keys(param).forEach((key: string) => {
-    paramKML += `
-      <wpml:${key}>${param[key]}</wpml:${key}>
-    `
-  })
-  const template = `
-    <wpml:action>
-      <wpml:actionId>${actionId}</wpml:actionId>
-      <wpml:actionActuatorFunc>${actionType}</wpml:actionActuatorFunc>
-      <wpml:actionActuatorFuncParam>
-        ${paramKML}
-      </wpml:actionActuatorFuncParam>
-    </wpml:action>
-  `
-  return template
-}
-
-/**
- * @description: Popover参数编辑
- * @param {*} btnobj: 事件按钮所有参数
- * @param {*} eventType 事件类型
- * @param {*} eventParam 事件参数Param
- * @return {*}
- */
-const paramPopover = (eventType: string, btnobj: sBtn, eventParam?: any) => {
-  // 判断参数是否为有存在空的
-  let isParamNull = false
-  btnobj.param.some((sParam: any) => {
-    isParamNull = sParam.value === ''
-    return isParamNull
-  })
-  if (isParamNull) return message.warning('确认失败,请检查填写的参数')
-  // 参数处理
-  const param = { ...eventParam }
-  btnobj.param.forEach((sParam: { key: string, value: string | number }) => {
-    param[sParam.key] = sParam.value
-  })
-  editKmlFile(eventType, param)
-  btnobj.selected = true
-}
-
-const saveInitPopoverParam = (param: popoverParamType[]) => {
-  initPopoverParam.value = cloneDeep(param)
-}
-
-const resetParamSetting = (btnParam: sBtn) => {
-  btnParam.param = cloneDeep(initPopoverParam.value)
-}
-
-/**
- * @description: 修改template.kml文件
- * @param {*} eventType 事件类型
- * @param {*} eventParam 事件参数
- * @return {*} void
- */
-const editKmlFile = (eventType: string, eventParam?: any) => {
-  // kmzZip文件处理
-  const kmlFile = kmzFileZip.value.file(/\.kml$/i)[0]
-  kmlFile.async('text').then((kmlText: string) => {
-    const regx = /<Placemark>([\s\S]*?)<\/Placemark>/g
-    const points = kmlText.match(regx) || []
-    // 当前要修改的字段
-    // const curSelected: string | any = points?.find(item => item.includes(currentPosition.value.join(',')))
-    const curSelected: string | any = points[currentPosition.value]
-    // 判断是不是间隔拍照任务
-    if (eventType === 'time' || eventType === 'distance' || eventType === 'deleteShootType') {
-      // 判断当前选中的点是否存在shootType
-      const shootTypeRegx = /<wpml:shootType>([\s\S]*?)<\/wpml:shootType>/g
-      const kmlResult: string[] = curSelected.match(shootTypeRegx) || []
-      const shootTypeKML = kmlResult[0]
-      let replacedKML = ''
-      // 判断是不是结束间隔拍照任务
-      if (eventType === 'deleteShootType') {
-        if (!shootTypeKML) {
-          message.warning('暂未设置间隔任务,无法结束!!')
-        } else {
-          replacedKML = curSelected.replace(shootTypeRegx, '')
-        }
-      } else {
-        // 判断是否已经设置间隔拍照任务
-        if (shootTypeKML) {
-          replacedKML = curSelected.replace(shootTypeRegx, `<wpml:shootType>${eventType}</wpml:shootType>`)
-        } else {
-          // 判断是否存在actionGroup
-          const index = curSelected.indexOf('<wpml:actionGroup>')
-          if (index === -1) {
-            const placeMarkIdx = curSelected.indexOf('</Placemark>')
-            replacedKML = curSelected.slice(0, placeMarkIdx) + `<wpml:shootType>${eventType}</wpml:shootType>` + curSelected.slice(placeMarkIdx)
-          } else {
-            replacedKML = curSelected.slice(0, index) + `<wpml:shootType>${eventType}</wpml:shootType>` + curSelected.slice(index)
-          }
-        }
-      }
-      // 将另外两个间隔任务按钮高亮取消
-      btnList.value.forEach((sBtn: sBtn) => {
-        if (sBtn.key === 'time' || sBtn.key === 'distance' || sBtn.key === 'deleteShootType') {
-          if (sBtn.key !== eventType) {
-            sBtn.selected = false
-          }
-        }
-      })
-      // 替换原本KML
-      const replacedTemplateKML = kmlText.replace(curSelected, replacedKML)
-      JsZip.file('wpmz/template.kml', replacedTemplateKML)
-      kmzFileZip.value.file('wpmz/template.kml', replacedTemplateKML)
-      return
-    }
-    // 查找actionGroup
-    const actionGroupReg = /<wpml:actionGroup>([\s\S]*?)<\/wpml:actionGroup>/g
-    const actionGroup = curSelected.match(actionGroupReg) ? curSelected.match(actionGroupReg)[0] : ''
-    // 查找action
-    const actionReg = /<wpml:action>([\s\S]*?)<\/wpml:action>/g
-    const actions = actionGroup.match(actionReg) || []
-
-    // 判断kml文件中是否存在当前事件
-    const actionIndex = actions.findIndex((action: string) => action.includes(eventType))
-    if (actionIndex === -1) {
-      // 创建事件
-      const actionKML = createActionKML(actions.length, eventType, eventParam)
-      actions.push(actionKML)
-    } else {
-      // 移除当前存在的事件
-      actions.splice(actionIndex, 1)
-    }
-
-    let replacedActionsKML = ''
-    // 创建actionGroup
-    const actionGroupKML = `
-      <wpml:actionGroup>
-        ${actions.join('')}
-      </wpml:actionGroup>
-    `
-    // 判断是否存在事件组
-    if (!actionGroup) {
-      const index = curSelected.indexOf('</Placemark>')
-      replacedActionsKML = curSelected.slice(0, index) + actionGroupKML + curSelected.slice(index)
-    } else {
-      // 替换原有的action
-      replacedActionsKML = curSelected.replace(actionGroupReg, actionGroupKML)
-    }
-    // Placemark代替
-    const replacedTemplateKML = kmlText.replace(curSelected, replacedActionsKML)
-
-    JsZip.file('wpmz/template.kml', replacedTemplateKML)
-    kmzFileZip.value.file('wpmz/template.kml', replacedTemplateKML)
-  })
-}
-
-const cencalEdit = () => {
-  readKmzFile(curKmzPath.value).then(kmzFile => {
-    kmzFileZip.value = kmzFile
-    eventLight()
-  })
-}
-
-const confirmEdit = () => {
-  JsZip.generateAsync({ type: 'blob' }).then(content => {
-    saveAs(content, curKmzName.value)
-  })
-}
-
-onMounted(() => {
-  kmzFileZip.value = null
+onUnmounted(() => {
+  isMoreActionShow.value = false
 })
 </script>
+
 <style lang="scss" scoped>
-.btn-list {
-  position: absolute;
-  right: 75px;
-  top: 50%;
-  transform: translateY(-50%);
-
-  .s-btn {
-    margin-bottom: 15px;
+.action-container {
+  .more-btn {
+    position: absolute;
+    top: 50%;
+    right: 20px;
+    transform: translateY(-50%);
     display: flex;
-    align-items: center;
-
-    &:last-child {
-      margin: 0;
-    }
-
-    .title {
-      width: 130px;
-      text-align: right;
-      margin-right: 10px;
-      color: #fff;
-      text-shadow: 2px 2px 2px #000;
+    .label {
+      width: 60px;
+      line-height: 34px;
       font-weight: bold;
+      text-align: right;
+      color: #fff;
+      text-shadow: 2px 2px 2px #000000;
     }
-
-    .btn {
+    .icon {
       width: 34px;
       height: 34px;
-      background-color: #323131;
+      color: #fff;
+      line-height: 34px;
+      text-align: center;
+      font-size: 25px;
+      margin-left: 7px;
+      background-color: rgba(0, 0, 0, .5);
       cursor: pointer;
+    }
+  }
+  .action-list {
+    position: absolute;
+    top: 50%;
+    transform: translateY(-50%);
+    right: 120px;
+    padding: 0;
+    margin: 0;
+    list-style-type: none;
+    &_item {
+      width: fit-content;
+      height: 34px;
       display: flex;
-      justify-content: center;
-      align-items: center;
-
-      img {
-        width: 20px;
+      color: #fff;
+      margin-top: 10px;
+      &:first-child {
+        margin: 0;
+      }
+      .name {
+        width: 120px;
+        line-height: 34px;
+        text-align: right;
+        font-weight: bold;
+        text-shadow: 2px 2px 2px #000000;
+      }
+      .icon {
+        width: 34px;
+        height: 34px;
+        padding: 3px;
+        margin-left: 7px;
+        background-color: rgba(0, 0, 0, .5);
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        cursor: pointer;
+        img {
+          width: 25px;
+          height: 25px;
+        }
       }
     }
-  }
-
-  .cancel-edit {
-    font-size: 20px;
-    color: #fff;
-
-    &:hover {
-      background-color: #FF4D4F;
-    }
-  }
-
-  .confirm-edit {
-    font-size: 20px;
-    color: #fff;
-
-    &:hover {
-      background-color: #1777FF;
-    }
-  }
-}
-
-.popover-content {
-  .content-box {
-    margin-bottom: 10px;
-
-    .annotation {
-      font-size: 12px;
-      color: rgb(188, 187, 187);
-      max-width: 300px;
-    }
-  }
-
-  .btn-tool {
-    display: flex;
-    justify-content: center;
-    gap: 10px;
-
-    .ant-btn {
-      flex: 1;
-    }
-  }
-}
-
-:deep() {
-  .ant-radio-wrapper {
-    display: block;
-    max-width: 300px;
-    text-wrap: wrap;
   }
 }
 </style>
diff --git a/src/pages/page-web/projects/components/route-edit/components/setting-point-tip.vue b/src/pages/page-web/projects/components/route-edit/components/setting-point-tip.vue
index ca13c61..8e35bc3 100644
--- a/src/pages/page-web/projects/components/route-edit/components/setting-point-tip.vue
+++ b/src/pages/page-web/projects/components/route-edit/components/setting-point-tip.vue
@@ -10,6 +10,8 @@
 import * as Cesium from 'cesium'
 import useKmzTsa, { template as xmlTemplate } from '/@/utils/cesium/use-kmz-tsa'
 import useMapDraw, { kmlEntities as globalEntities } from '/@/utils/cesium/use-map-draw'
+import { useMyStore } from '/@/store'
+const store = useMyStore()
 const { appContext }: any = getCurrentInstance()
 const global = appContext.config.globalProperties
 const kmzUtils = useKmzTsa()
@@ -37,6 +39,9 @@
   const height = 6
   const takeOffPoint = [latitude, longitude, height]
   xmlTemplate.value.missionConfig.takeOffRefPoint['#text'] = takeOffPoint.join(',')
+  store.commit('SET_WAYLINE_INFO', {
+    isShow: true,
+  })
   const xmlStr = kmzUtils.generateXML(xmlTemplate.value)
   mapDraw.drawWayline(globalEntities.value, xmlStr)
 }
diff --git a/src/pages/page-web/projects/components/route-edit/index.vue b/src/pages/page-web/projects/components/route-edit/index.vue
index 8bd0d1f..184ffc3 100644
--- a/src/pages/page-web/projects/components/route-edit/index.vue
+++ b/src/pages/page-web/projects/components/route-edit/index.vue
@@ -59,7 +59,16 @@
         </a-tooltip>
         <contextMenu :menu="[{ title: '删除航点', value: { index, item } }]">
           <div class="graph-right">
-            <div v-for="(event, index) in item.eventList" :key="index" class="s-event-icon">
+            <div
+              v-for="(event, eIndex) in item.eventList"
+              :key="eIndex"
+              :class="[
+                's-event-icon',
+                selectedPointAndAction.selectedPoint === index &&
+                  selectedPointAndAction.selectedAction === event?.key &&
+                  'active-event',
+              ]"
+              @click="selectionEvent(event, index)">
               <a-tooltip placement="top">
                 <template #title>
                   {{ event?.name }}
@@ -177,7 +186,9 @@
         deep: true,
       },
     )
-
+    store.commit('SET_WAYLINE_INFO', {
+      isShow: true,
+    })
     kmlEntities.value = entities.value
     if (!mouseRightClickEvent) {
       // 添加右键事件
@@ -188,13 +199,7 @@
 // 新建航线初始化
 const initCreateRoute = () => {
   mapDraw = useMapDraw('', [], '', global)
-  const {
-    drawWayline,
-    waylineDetails: details,
-    waylinePointsEvent,
-    kmlEntities: entities,
-    clearWaylineData
-  } = mapDraw
+  const { drawWayline, waylineDetails: details, waylinePointsEvent, kmlEntities: entities, clearWaylineData } = mapDraw
   clearWaylineData()
   drawWayline()
   waylineDetails.value = details
@@ -244,17 +249,18 @@
 const selectPointIndex = ref<string | number | any>(null)
 const pointSelect = (value: tragetPoint, index: number) => {
   removeCesiumChildDom(popupDom)
-  if (selectPointIndex.value === index) {
-    global.$viewer.entities.remove(prevPointEntity)
-    global.$viewer.entities.remove(nextPointEntity)
-    kmlEntities.value.forEach((entity: Cesium.Entity | any, i: number) => {
-      entity.billboard.image = createBillboard(i + 1, '#61d396')
-      entity.label.show = false
-    })
-    selectPointIndex.value = null
-    pointIdx.value = null
-    return
-  }
+  // if (selectPointIndex.value === index) {
+  //   global.$viewer.entities.remove(prevPointEntity)
+  //   global.$viewer.entities.remove(nextPointEntity)
+  //   kmlEntities.value.forEach((entity: Cesium.Entity | any, i: number) => {
+  //     entity.billboard.image = createBillboard(i + 1, '#61d396')
+  //     entity.label.show = false
+  //   })
+  //   selectPointIndex.value = null
+  //   pointIdx.value = null
+  //   store.commit('SET_WAYLINE_INFO', {})
+  //   return
+  // }
   if (prevPointEntity) {
     global.$viewer.entities.remove(prevPointEntity)
   }
@@ -300,6 +306,15 @@
       entity.label.show = false
     }
   })
+  // 默认选中第一个事件
+  // if (selectPointIndex.value !== index) {
+  //   store.commit('SET_WAYLINE_INFO', {
+  //     selectedPoint: index,
+  //     // 默认选中第一个
+  //     selectedAction: value.eventList[0],
+  //   })
+  //   selectionEvent(value.eventList[0], index)
+  // }
   selectPointIndex.value = index
   pointIdx.value = index
 }
@@ -536,6 +551,25 @@
   },
 )
 
+// 选中事件
+const selectedPointAndAction = reactive<{
+  selectedPoint: number | null
+  selectedAction: any | null
+}>({
+  selectedPoint: null,
+  selectedAction: null,
+})
+const selectionEvent = (action: any, index: number) => {
+  const params = {
+    selectedPoint: index,
+    selectedAction: action,
+  }
+  selectedPointAndAction.selectedPoint = index
+  selectedPointAndAction.selectedAction = action.key
+  console.log(params)
+  store.commit('SET_WAYLINE_INFO', params)
+}
+
 onMounted(() => {
   // 清空画布
   clearCesiumMap()
@@ -553,8 +587,6 @@
   clearCesiumMap()
   store.commit('SET_WAYLINE_INFO', {
     isShow: false,
-    wayline: {},
-    position: null,
   })
 })
 </script>
@@ -695,16 +727,27 @@
         align-items: center;
 
         .s-event-icon {
-          width: 25px;
-          height: 25px;
+          width: 20px;
+          height: 20px;
           display: flex;
           justify-content: center;
           align-items: center;
+          border-radius: 2px;
+          margin-right: 3px;
+          overflow: hidden;
+
+          &:hover {
+            background-color: #409eff;
+          }
 
           img {
             width: 70%;
           }
         }
+
+        .active-event {
+          background-color: #409eff;
+        }
       }
 
       &:hover {
diff --git a/src/pages/page-web/projects/wayline.vue b/src/pages/page-web/projects/wayline.vue
index ae6d9a4..d015952 100644
--- a/src/pages/page-web/projects/wayline.vue
+++ b/src/pages/page-web/projects/wayline.vue
@@ -275,9 +275,7 @@
   removeAllPoint()
   // removeById('clickBox')
   store.commit('SET_WAYLINE_INFO', {
-    isShow: false,
-    wayline: {},
-    position: null,
+    isShow: false
   })
 })
 
@@ -353,9 +351,7 @@
     })
   // 清除选中点柱形和隐藏按钮
   store.commit('SET_WAYLINE_INFO', {
-    isShow: false,
-    wayline: {},
-    position: null,
+    isShow: false
   })
   // isPointListOpen.value = !isPointListOpen.value
 }
@@ -395,9 +391,7 @@
 function backPage () {
   isPointListOpen.value = false
   store.commit('SET_WAYLINE_INFO', {
-    isShow: false,
-    wayline: {},
-    position: 0,
+    isShow: false
   })
 }
 
diff --git a/src/store/index.ts b/src/store/index.ts
index b669865..53dbca3 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -99,8 +99,8 @@
   clientId: '', // mqtt 连接 唯一客户端id,
   waylineTool: {
     isShow: false as boolean,
-    wayline: {} as any,
-    position: null as any,
+    selectedPoint: undefined as number | undefined,
+    selectedAction: undefined as any | undefined,
     kmzPath: '' as string
   }
 })
@@ -211,10 +211,10 @@
     state.clientId = clientId
   },
   // 设置wayline中的信息
-  SET_WAYLINE_INFO (state, { isShow, wayline, position }) {
-    state.waylineTool.isShow = isShow
-    state.waylineTool.wayline = wayline
-    state.waylineTool.position = position
+  SET_WAYLINE_INFO (state, { isShow, selectedPoint, selectedAction }) {
+    isShow !== undefined && (state.waylineTool.isShow = isShow)
+    state.waylineTool.selectedPoint = selectedPoint
+    selectedAction !== undefined && (state.waylineTool.selectedAction = selectedAction)
   },
   SET_WAYLINE_KMZPATH (state, kmzPath) {
     state.waylineTool.kmzPath = kmzPath
diff --git a/src/utils/cesium/use-map-draw.ts b/src/utils/cesium/use-map-draw.ts
index 3f411f2..ecfb633 100644
--- a/src/utils/cesium/use-map-draw.ts
+++ b/src/utils/cesium/use-map-draw.ts
@@ -87,6 +87,11 @@
     name: '悬停等待',
     icon: getResource('waylinetool/xt.png'),
   },
+  {
+    key: 'panoShot',
+    name: '全景拍摄',
+    icon: getResource('waylinetool/panoramicview.png'),
+  }
 ]
 
 const waylinePointsEvent = ref<tragetPoint[]>([])
@@ -352,5 +357,5 @@
   }
 }
 
-export { waylinePointsEvent, waylineDetails, kmlEntities, selectPointIndex }
+export { waylinePointsEvent, waylineDetails, kmlEntities, selectPointIndex, actionList }
 export default useMapDraw

--
Gitblit v1.9.3