From d63e1aaf1d33925b534e5fc9a708160cd13c0874 Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Fri, 01 Dec 2023 14:34:37 +0800
Subject: [PATCH] 航线点位事件编辑修改

---
 src/pages/page-web/projects/wayline.vue |   23 +++++
 src/components/waylinetool/index.vue    |  193 ++++++++++++++++++++++++++++++++---------------
 2 files changed, 152 insertions(+), 64 deletions(-)

diff --git a/src/components/waylinetool/index.vue b/src/components/waylinetool/index.vue
index fe91a10..f8eed9e 100644
--- a/src/components/waylinetool/index.vue
+++ b/src/components/waylinetool/index.vue
@@ -31,6 +31,7 @@
   CloseOutlined,
   CheckOutlined
 } from '@ant-design/icons-vue'
+import { Item } from 'ant-design-vue/lib/menu'
 // 初始化jszip
 const JsZip = new JSZIP()
 
@@ -84,33 +85,33 @@
       })
     }
   },
-  // {
-  //   key: '',
-  //   icon: getResource('waylinetool/shoot1.png'),
-  //   title: '开始等时间隔拍照',
-  //   event: (obj: sBtn) => {
-  //     obj.selected = !obj.selected
-  //     editKmlFile()
-  //   }
-  // },
-  // {
-  //   key: 'shootType',
-  //   icon: getResource('waylinetool/shoot2.png'),
-  //   title: '开始等距间隔拍照',
-  //   event: (obj: sBtn) => {
-  //     obj.selected = !obj.selected
-  //     editKmlFile()
-  //   }
-  // },
-  // {
-  //   key: '',
-  //   icon: getResource('waylinetool/shoot3.png'),
-  //   title: '结束间隔拍照',
-  //   event: (obj: sBtn) => {
-  //     obj.selected = !obj.selected
-  //     editKmlFile()
-  //   }
-  // },
+  {
+    key: 'time',
+    icon: getResource('waylinetool/shoot1.png'),
+    title: '开始等时间隔拍照',
+    event: (obj: sBtn) => {
+      obj.selected = !obj.selected
+      editKmlFile('time')
+    }
+  },
+  {
+    key: 'distance',
+    icon: getResource('waylinetool/shoot2.png'),
+    title: '开始等距间隔拍照',
+    event: (obj: sBtn) => {
+      obj.selected = !obj.selected
+      editKmlFile('distance')
+    }
+  },
+  {
+    key: 'deleteShootType',
+    icon: getResource('waylinetool/shoot3.png'),
+    title: '结束间隔拍照',
+    event: (obj: sBtn) => {
+      obj.selected = !obj.selected
+      editKmlFile('deleteShootType')
+    }
+  },
   {
     key: 'hover',
     icon: getResource('waylinetool/xt.png'),
@@ -144,38 +145,41 @@
         payloadPositionIndex: 0,
         gimbalHeadingYawBase: 'north',
         gimbalRotateMode: 'relativeAngle',
+        // 上下摆动 pitch xyz中心点为基准
         gimbalPitchRotateEnable: 0,
-        gimbalPitchRotateAngle: 0.4,
+        gimbalPitchRotateAngle: 0,
+        // 摆动 roll 已x位基准
         gimbalRollRotateEnable: 0,
-        gimbalRollRotateAngle: 0.4,
-        gimbalYawRotateEnable: 0,
-        gimbalYawRotateAngle: 0.4,
+        gimbalRollRotateAngle: 0,
+        // 左右摆动 yaw xyz中心点为基准
+        gimbalYawRotateEnable: 1,
+        gimbalYawRotateAngle: 30.1,
         gimbalRotateTimeEnable: 0,
-        gimbalRotateTime: 5
+        gimbalRotateTime: 3
       })
     }
   },
-  // {
-  //   key: '',
-  //   icon: getResource('waylinetool/holdertilt.png'),
-  //   title: '云台俯仰角',
-  //   event: (obj: sBtn) => {
-  //     obj.selected = !obj.selected
-  //     editKmlFile('gimbalRotate', {
-  //       payloadPositionIndex: 0,
-  //       gimbalHeadingYawBase: 'north',
-  //       gimbalRotateMode: 'relativeAngle',
-  //       gimbalPitchRotateEnable: 0,
-  //       gimbalPitchRotateAngle: 0.4,
-  //       gimbalRollRotateEnable: 0,
-  //       gimbalRollRotateAngle: 0.4,
-  //       gimbalYawRotateEnable: 0,
-  //       gimbalYawRotateAngle: 0.4,
-  //       gimbalRotateTimeEnable: 0,
-  //       gimbalRotateTime: 5
-  //     })
-  //   }
-  // },
+  {
+    key: 'gimbalRotate',
+    icon: getResource('waylinetool/holdertilt.png'),
+    title: '云台俯仰角',
+    event: (obj: sBtn) => {
+      obj.selected = !obj.selected
+      editKmlFile('gimbalRotate', {
+        payloadPositionIndex: 0,
+        gimbalHeadingYawBase: 'north',
+        gimbalRotateMode: 'relativeAngle',
+        gimbalPitchRotateEnable: 1,
+        gimbalPitchRotateAngle: 31.1,
+        gimbalRollRotateEnable: 0,
+        gimbalRollRotateAngle: 0,
+        gimbalYawRotateEnable: 0,
+        gimbalYawRotateAngle: 0,
+        gimbalRotateTimeEnable: 0,
+        gimbalRotateTime: 3
+      })
+    }
+  },
   {
     key: 'takePhoto',
     icon: getResource('waylinetool/camera.png'),
@@ -220,6 +224,11 @@
   return store.state.waylineTool
 })
 
+/**
+ * @description: 读取kmz文件转blob
+ * @param {*} kmzPath 文件地址
+ * @return {*} void
+ */
 const readKmzFile = (kmzPath: string) => {
   // return axios.get(kmzPath, { responseType: 'arraybuffer' })
   return axios({
@@ -264,6 +273,10 @@
     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>/
     btnList.value.forEach(sBtn => {
       funcs?.forEach((func: string) => {
         const funcName = func.match(funcNameRegx) || []
@@ -271,11 +284,23 @@
           sBtn.selected = true
         }
       })
+      shootType?.forEach((shootType: string) => {
+        const typeValue = shootType.match(shootTypeValueRegx) || []
+        if (typeValue[1] === sBtn.key) {
+          sBtn.selected = true
+        }
+      })
     })
   })
 }
 
-// 创建kml模版
+/**
+ * @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) => {
@@ -295,8 +320,13 @@
   return template
 }
 
-// 修改template.kml文件
-const editKmlFile = (eventType: string, eventParam: any) => {
+/**
+ * @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) => {
@@ -305,6 +335,49 @@
     // 当前要修改的字段
     // 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] : ''
@@ -336,19 +409,13 @@
       replacedActionsKML = curSelected.slice(0, index) + actionGroupKML + curSelected.slice(index)
     } else {
       // 替换原有的action
-      // replacedActionsKML = curSelected.replace(actionReg, actions.join(''))
       replacedActionsKML = curSelected.replace(actionGroupReg, actionGroupKML)
     }
     // Placemark代替
     const replacedTemplateKML = kmlText.replace(curSelected, replacedActionsKML)
-    // 转成unit8格式
-    // const textEncoder = new TextEncoder()
-    // const uint8Array = textEncoder.encode(replacedTemplateKML)
+
     JsZip.file('wpmz/template.kml', replacedTemplateKML)
     kmzFileZip.value.file('wpmz/template.kml', replacedTemplateKML)
-    // JsZip.generateAsync({ type: 'blob' }).then(content => {
-    //   saveAs(content, curKmzName.value)
-    // })
   })
 }
 
diff --git a/src/pages/page-web/projects/wayline.vue b/src/pages/page-web/projects/wayline.vue
index c6e07ed..49fd1f3 100644
--- a/src/pages/page-web/projects/wayline.vue
+++ b/src/pages/page-web/projects/wayline.vue
@@ -187,7 +187,7 @@
 const selectedPoint = ref<number | null>(null)
 
 // 对应事件
-const eventList: any = reactive<{
+const eventList = reactive<{
   key: string,
   name: string,
   icon?: string
@@ -206,6 +206,16 @@
     key: 'stopRecord',
     name: '结束录像',
     icon: getResource('waylinetool/camera-off.png'),
+  },
+  {
+    key: 'time',
+    name: '开始等时间隔拍照',
+    icon: getResource('waylinetool/shoot1.png'),
+  },
+  {
+    key: 'distance',
+    name: '开始等距间隔拍照',
+    icon: getResource('waylinetool/shoot2.png'),
   },
   {
     key: 'zoom',
@@ -550,6 +560,8 @@
       const actionGroupReg = /<wpml:actionGroup>([\s\S]*?)<\/wpml:actionGroup>/g
       // 查找单个事件reg
       const actionRegx = /<wpml:action>([\s\S]*?)<\/wpml:action>/g
+      // 获取shootType
+      const shootTypeRegx = /<wpml:shootType>([\s\S]*?)<\/wpml:shootType>/g
       // 当前kmz文件航点
       const kmlPoints = kml.match(regx)
       kmlPoints?.forEach((point: string, index: number) => {
@@ -566,6 +578,15 @@
           })
           tragetPointArr.value[index].eventList = eventArr
         }
+        // 获取当前是否存在拍照模式
+        const pointShootTypeKML = point.match(shootTypeRegx)
+        if (pointShootTypeKML) {
+          pointShootTypeKML.forEach((type: string) => {
+            eventList.forEach((item: any) => {
+              type.includes(item.key) && eventArr.push(item)
+            })
+          })
+        }
       })
     })
 }

--
Gitblit v1.9.3