From 46442b030db95ae97b754711c6dc786376c3a6e1 Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Thu, 14 Mar 2024 17:28:36 +0800
Subject: [PATCH] update: kmz修改保持方式修改

---
 src/utils/cesium/use-kmz-tsa.ts |  185 +++++-----------------------------------------
 1 files changed, 20 insertions(+), 165 deletions(-)

diff --git a/src/utils/cesium/use-kmz-tsa.ts b/src/utils/cesium/use-kmz-tsa.ts
index 665aa36..f6671a9 100644
--- a/src/utils/cesium/use-kmz-tsa.ts
+++ b/src/utils/cesium/use-kmz-tsa.ts
@@ -1,8 +1,6 @@
-import { ref, getCurrentInstance } from 'vue'
+import { ref } from 'vue'
 import {
   analyzeKmzFile,
-  getKmlParams,
-  generateKmlFormat,
   XMLToJSON,
   JSONToXML
 } from '/@/utils/cesium/kmz'
@@ -18,7 +16,7 @@
 const kmlStr = ref('')
 const kmzFile = ref<any>(null)
 
-const template = ref({
+const template = ref<any>({
   author: '',
   createTime: '',
   updateTime: '',
@@ -91,7 +89,7 @@
     ],
   },
 })
-const waylines = ref({
+const waylines = ref<any>({
   missionConfig: {
     flyToWaylineMode: 'safely',
     finishAction: 'goHome',
@@ -138,34 +136,6 @@
   },
 })
 
-// 点位参数
-const placemark: any = {
-  Point: {
-    coordinates: '',
-  },
-  index: 0,
-  executeHeight: 80,
-  height: 80,
-  waypointSpeed: 10,
-  waypointHeadingParam: {
-    waypointHeadingMode: 'followWayline',
-    waypointHeadingAngle: 0,
-    waypointPoiPoint: '0.000000,0.000000,0.000000',
-    waypointHeadingPathMode: 'followBadArc',
-    waypointHeadingPoiIndex: 0,
-  },
-  waypointTurnParam: {
-    waypointTurnMode: 'toPointAndStopWithDiscontinuityCurvature',
-    waypointTurnDampingDist: 0.2,
-  },
-  useGlobalHeight: 1,
-  useGlobalSpeed: 1,
-  useGlobalHeadingParam: 1,
-  useGlobalTurnParam: 1,
-  useStraightLine: 1,
-  actionGroup: {},
-}
-
 const useKmzTsa = () => {
   const init = async (fileUrl: string, fileContent?: string) => {
     const fileRes = await analyzeKmzFile(fileUrl)
@@ -176,151 +146,36 @@
       return false
     }
     kmlStr.value = kmzRes
+    const tplXmlJson = XMLToJSON(kmzRes)
+    template.value = tplXmlJson.Document
     return kmzRes
   }
   const create = () => {
-    const nowTime = new Date().getTime()
-    const str = `
-    <?xml version="1.0" encoding="UTF-8"?>
-    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:wpml="http://www.dji.com/wpmz/1.0.5">
-      <Document>
-        <wpml:author>17304076412</wpml:author>
-        <wpml:createTime>${nowTime}</wpml:createTime>
-        <wpml:updateTime>${nowTime}</wpml:updateTime>
-        <wpml:missionConfig>
-        </wpml:missionConfig>
-        <Folder>
-        </Folder>
-      </Document>
-    </kml>
-    `
-    kmlStr.value = str
-  }
-  const writePoint = (settingParmas: any = {}, place: string, pointNumber: number = 0) => {
-    Object.keys(settingParmas).forEach((key: string) => {
-      placemark[key] = settingParmas[key]
-    })
-    const Placemark = `<Placemark>${generateKmlFormat(placemark)}</Placemark>`
-    const points: RegExpMatchArray = getKmlParams(kmlStr.value, false, {
-      name: 'Placemark',
-      findRegx: '([\\s\\S]*?)',
-      mode: 'g',
-    }) || ['']
-    if (place === 'add') {
-      const lastPoint = points[points.length - 1]
-      const index = kmlStr.value.indexOf(lastPoint)
-      const beforeStr = kmlStr.value.slice(0, index)
-      const afterStr = kmlStr.value.slice(index + lastPoint.length)
-      kmlStr.value = beforeStr + lastPoint + Placemark + afterStr
-    }
-    if (place === 'prev') {
-      const currentPoint: string = points[pointNumber]
-      const index = kmlStr.value.indexOf(currentPoint)
-      const beforeStr = kmlStr.value.slice(0, index)
-      const afterStr = kmlStr.value.slice(index + currentPoint.length)
-      kmlStr.value = beforeStr + Placemark + currentPoint + afterStr
-      // 更新点位序号
-      const pointIndexList = getKmlParams(kmlStr.value, true, {
-        name: 'index',
-        findRegx: '([\\s\\S]*?)',
-        mode: 'g',
-      })
-      pointIndexList?.forEach((pintIndex: string, index: number) => {
-        kmlStr.value.replace(pintIndex, `<wpml:index>${index}</wpml:index>`)
-      })
-    }
-    if (place === 'next') {
-      const currentPoint: string = points[pointNumber + 1]
-      const index = kmlStr.value.indexOf(currentPoint)
-      const beforeStr = kmlStr.value.slice(0, index)
-      const currentPointLength = currentPoint?.length || 0
-      const afterStr = kmlStr.value.slice(index + currentPointLength)
-      kmlStr.value = beforeStr + Placemark + currentPoint + afterStr
-      // 更新点位序号
-      const pointIndexList = getKmlParams(kmlStr.value, true, {
-        name: 'index',
-        findRegx: '([\\s\\S]*?)',
-        mode: 'g',
-      })
-      pointIndexList?.forEach((pintIndex: string, index: number) => {
-        kmlStr.value.replace(pintIndex, `<wpml:index>${index}</wpml:index>`)
-      })
-    }
-  }
-  const edit = (settingParmas: any = {}, keyName?: string, isKeyWpml: boolean = false) => {
-    Object.keys(settingParmas).forEach((key: string) => {
-      const regxVal: any = getKmlParams(kmlStr.value, true, {
-        name: key,
-        findRegx: '([\\s\\S]*?)',
-      })
-      const str = regxVal[1]
-      if (str) {
-        if (key === 'globalHeight') {
-          const regxVal: any = getKmlParams(kmlStr.value, true, {
-            name: 'height',
-            findRegx: '([\\s\\S]*?)',
-            mode: 'g',
-          })
-          const ellipsoidHeightRegx = getKmlParams(kmlStr.value, true, {
-            name: 'ellipsoidHeight',
-            findRegx: '([\\s\\S]*?)',
-            mode: 'g',
-          }) || ['']
-          // 文件中的海拔高度
-          const takeOffRefPointAGLHeightRegxStr = getKmlParams(kmlStr.value, true, {
-            name: 'takeOffRefPointAGLHeight',
-            findRegx: '([\\s\\S]*?)',
-          }) || ['', '0']
-          const posterHeight = Number(takeOffRefPointAGLHeightRegxStr[1])
-          // 获取每个点是否使用全局高度
-          const useGlobalHeightRegStr = getKmlParams(kmlStr.value, true, {
-            name: 'useGlobalHeight',
-            findRegx: '([\\s\\S]*?)',
-            mode: 'g',
-          }) || ['', '0']
-          regxVal.forEach((heightStr: string, index: number) => {
-            // 使用正则取值
-            const getUseGlobalHeightValStr = getKmlParams(useGlobalHeightRegStr[index], true, {
-              name: 'useGlobalHeight',
-              findRegx: '([\\s\\S]*?)',
-            }) || ['', '0']
-            const isGlobalHeight = Boolean(Number(getUseGlobalHeightValStr[1]))
-            if (isGlobalHeight) {
-              // 替换height
-              const rstr = generateKmlFormat({ height: settingParmas[key] })
-              const rEllipsoidHeightStr = generateKmlFormat({ ellipsoidHeight: settingParmas[key] - posterHeight })
-              kmlStr.value = kmlStr.value.replace(heightStr, rstr)
-              kmlStr.value = kmlStr.value.replace(ellipsoidHeightRegx[index], rEllipsoidHeightStr)
-              // 替换
-            } else {
-              const heightRegxVal: any = getKmlParams(heightStr, true, {
-                name: 'height',
-                findRegx: '([\\s\\S]*?)',
-              })
-            }
-          })
-        }
-        const replaceStr = generateKmlFormat({ [key]: settingParmas[key] })
-        kmlStr.value = kmlStr.value.replace(regxVal[0], replaceStr)
-      } else {
-        console.warn('没有找到对应的属性')
-      }
-    })
-  }
 
+  }
   const save = () => {
     console.log('存在问题')
   }
 
+  const generateXML = <T>(xmlJson: T) => {
+    return JSONToXML(xmlJson)
+  }
+
+  // 将wpmz/template.kml解析传来json转换回去,重新复制以便于后续绘制
+  watch(() => template.value, (newobj) => {
+    const xmlString = JSONToXML(newobj)
+    kmlStr.value = xmlString
+  }, {
+    deep: true
+  })
+
   return {
     init,
     create,
-    // write,
-    writePoint,
-    edit,
     save,
+    generateXML
   }
 }
 
-export { kmlStr, fileAuthor }
+export { kmlStr, fileAuthor, template, waylines }
 export default useKmzTsa

--
Gitblit v1.9.3