import JSZip from "jszip"; import JSZipUtils from "jszip-utils"; import { XMLParser, XMLBuilder, XMLValidator } from "fast-xml-parser"; // import { ACTION_ITEM_LIST } from "@/constants/action-item"; // import { params as actionParams } from "@/constants/action-function-params"; import { UUID } from "@/utils/Utils"; /** * @description 航线template示例文件 */ // 有机巢的用这个模板 m3TD export let inclinetemplate2 = { Document: { "wpml:author": 13874958346, "wpml:createTime": 1688652646205, "wpml:updateTime": 1688978993216, "wpml:missionConfig": { "wpml:flyToWaylineMode": "safely", "wpml:finishAction": "goHome", "wpml:exitOnRCLost": "goContinue", "wpml:executeRCLostAction": "goBack", "wpml:takeOffSecurityHeight": 20, "wpml:takeOffRefPoint": "28.192009,113.058389,16.581492", "wpml:takeOffRefPointAGLHeight": 0, "wpml:globalTransitionalSpeed": 15, "wpml:globalRTHHeight": 100, "wpml:droneInfo": { "wpml:droneEnumValue": 91, "wpml:droneSubEnumValue": 1, }, "wpml:payloadInfo": { "wpml:payloadEnumValue": 81, "wpml:payloadSubEnumValue": 2, "wpml:payloadPositionIndex": 0, }, }, Folder: { "wpml:templateType": "mapping3d", "wpml:templateId": 0, "wpml:waylineCoordinateSysParam": { "wpml:coordinateMode": "WGS84", 'wpml:heightMode': 'EGM96', 'wpml:globalShootHeight': 102.2, 'wpml:surfaceFollowModeEnable': 1, 'wpml:isRealtimeSurfaceFollow': 0, 'wpml:surfaceRelativeHeight': 102.2, 'wpml:dsmFile': 'wpmz/res/dsm/wgs84_ASTGTMV003_N28E112_dem_9.tif', }, 'wpml:autoFlightSpeed': 15, Placemark: { 'wpml:caliFlightEnable': 0, 'wpml:inclinedGimbalPitch': 45, 'wpml:shootType': 'time', 'wpml:direction': 0, 'wpml:margin': 0, 'wpml:inclinedFlightSpeed': 12, 'wpml:efficiencyFlightModeEnable': 0, 'wpml:overlap': { 'wpml:orthoCameraOverlapH': 80, 'wpml:orthoCameraOverlapW': 70, 'wpml:inclinedCameraOverlapH': 80, 'wpml:inclinedCameraOverlapW': 70 }, 'Polygon': { 'outerBoundaryIs': { 'LinearRing': { 'coordinates': '' } } }, 'wpml:ellipsoidHeight': 102.2, 'wpml:height': 102.2, }, "wpml:payloadParam": { "wpml:payloadPositionIndex": 0, "wpml:focusMode": "firstPoint", "wpml:meteringMode": "average", "wpml:returnMode": "singleReturnFirst", "wpml:samplingRate": 240000, "wpml:scanningMode": "repetitive", "wpml:imageFormat": "visable,ir", }, }, }, } export let inclinetemplate = { Document: { "wpml:missionConfig": { "wpml:flyToWaylineMode": "safely", "wpml:finishAction": "goHome", "wpml:exitOnRCLost": "goContinue", "wpml:executeRCLostAction": "goBack", "wpml:takeOffSecurityHeight": 20, "wpml:globalTransitionalSpeed": 15, "wpml:globalRTHHeight": 100, 'wpml:waylineAvoidLimitAreaMode': 0, "wpml:droneInfo": { "wpml:droneEnumValue": 91, "wpml:droneSubEnumValue": 1, }, "wpml:payloadInfo": { "wpml:payloadEnumValue": 81, "wpml:payloadSubEnumValue": 2, "wpml:payloadPositionIndex": 0, }, }, Folder: [{ "wpml:templateId": 0, "wpml:autoFlightSpeed": 10, "wpml:executeHeightMode": "WGS84", "wpml:waylineId": 0, "wpml:startActionGroup": { "wpml:action": [{ "wpml:actionId": 0, "wpml:actionActuatorFunc": "gimbalRotate", 'wpml:actionActuatorFuncParam': { 'wpml:gimbalHeadingYawBase': 'aircraft', 'wpml:gimbalRotateMode': 'absoluteAngle', 'wpml:gimbalPitchRotateEnable': 1, 'wpml:gimbalPitchRotateAngle': -90, 'wpml:gimbalRollRotateEnable': 0, 'wpml:gimbalRollRotateAngle': 0, 'wpml:gimbalYawRotateEnable': 1, 'wpml:gimbalYawRotateAngle': 0, 'wpml:gimbalRotateTimeEnable': 0, 'wpml:gimbalRotateTime': 10, 'wpml:payloadPositionIndex': 0, } }, { "wpml:actionId": 1, "wpml:actionActuatorFunc": "hover", 'wpml:actionActuatorFuncParam': { 'wpml:hoverTime': 0.5, } }, { "wpml:actionId": 2, "wpml:actionActuatorFunc": "setFocusType", 'wpml:actionActuatorFuncParam': { 'wpml:cameraFocusType': 'manual', 'wpml:payloadPositionIndex': 0 } }, { "wpml:actionId": 3, "wpml:actionActuatorFunc": "focus", 'wpml:actionActuatorFuncParam': { 'wpml:focusX': 0, 'wpml:focusY': 0, 'wpml:focusRegionWidth': 0, 'wpml:focusRegionHeight': 0, 'wpml:isPointFocus': 0, 'wpml:isInfiniteFocus': 1, 'wpml:payloadPositionIndex': 0 } }, { "wpml:actionId": 4, "wpml:actionActuatorFunc": "hover", 'wpml:actionActuatorFuncParam': { 'wpml:hoverTime': 1, } } ] }, Placemark: [], // "wpml:payloadParam": { // "wpml:payloadPositionIndex": 0, // "wpml:focusMode": "firstPoint", // "wpml:meteringMode": "average", // "wpml:returnMode": "singleReturnFirst", // "wpml:samplingRate": 240000, // "wpml:scanningMode": "repetitive", // "wpml:imageFormat": "visable,ir", // }, }, { "wpml:templateId": 0, "wpml:autoFlightSpeed": 10, "wpml:executeHeightMode": "WGS84", "wpml:waylineId": 0, "wpml:startActionGroup": { "wpml:action": [{ "wpml:actionId": 0, "wpml:actionActuatorFunc": "gimbalRotate", 'wpml:actionActuatorFuncParam': { 'wpml:gimbalHeadingYawBase': 'aircraft', 'wpml:gimbalRotateMode': 'absoluteAngle', 'wpml:gimbalPitchRotateEnable': 1, 'wpml:gimbalPitchRotateAngle': -90, 'wpml:gimbalRollRotateEnable': 0, 'wpml:gimbalRollRotateAngle': 0, 'wpml:gimbalYawRotateEnable': 1, 'wpml:gimbalYawRotateAngle': 0, 'wpml:gimbalRotateTimeEnable': 0, 'wpml:gimbalRotateTime': 10, 'wpml:payloadPositionIndex': 0, } }, { "wpml:actionId": 1, "wpml:actionActuatorFunc": "hover", 'wpml:actionActuatorFuncParam': { 'wpml:hoverTime': 0.5, } }, { "wpml:actionId": 2, "wpml:actionActuatorFunc": "setFocusType", 'wpml:actionActuatorFuncParam': { 'wpml:cameraFocusType': 'manual', 'wpml:payloadPositionIndex': 0 } }, { "wpml:actionId": 3, "wpml:actionActuatorFunc": "focus", 'wpml:actionActuatorFuncParam': { 'wpml:focusX': 0, 'wpml:focusY': 0, 'wpml:focusRegionWidth': 0, 'wpml:focusRegionHeight': 0, 'wpml:isPointFocus': 0, 'wpml:isInfiniteFocus': 1, 'wpml:payloadPositionIndex': 0 } }, { "wpml:actionId": 4, "wpml:actionActuatorFunc": "hover", 'wpml:actionActuatorFuncParam': { 'wpml:hoverTime': 1, } } ] }, Placemark: [], // "wpml:payloadParam": { // "wpml:payloadPositionIndex": 0, // "wpml:focusMode": "firstPoint", // "wpml:meteringMode": "average", // "wpml:returnMode": "singleReturnFirst", // "wpml:samplingRate": 240000, // "wpml:scanningMode": "repetitive", // "wpml:imageFormat": "visable,ir", // }, }, { "wpml:templateId": 0, "wpml:autoFlightSpeed": 10, "wpml:executeHeightMode": "WGS84", "wpml:waylineId": 0, "wpml:startActionGroup": { "wpml:action": [{ "wpml:actionId": 0, "wpml:actionActuatorFunc": "gimbalRotate", 'wpml:actionActuatorFuncParam': { 'wpml:gimbalHeadingYawBase': 'aircraft', 'wpml:gimbalRotateMode': 'absoluteAngle', 'wpml:gimbalPitchRotateEnable': 1, 'wpml:gimbalPitchRotateAngle': -90, 'wpml:gimbalRollRotateEnable': 0, 'wpml:gimbalRollRotateAngle': 0, 'wpml:gimbalYawRotateEnable': 1, 'wpml:gimbalYawRotateAngle': 0, 'wpml:gimbalRotateTimeEnable': 0, 'wpml:gimbalRotateTime': 10, 'wpml:payloadPositionIndex': 0, } }, { "wpml:actionId": 1, "wpml:actionActuatorFunc": "hover", 'wpml:actionActuatorFuncParam': { 'wpml:hoverTime': 0.5, } }, { "wpml:actionId": 2, "wpml:actionActuatorFunc": "setFocusType", 'wpml:actionActuatorFuncParam': { 'wpml:cameraFocusType': 'manual', 'wpml:payloadPositionIndex': 0 } }, { "wpml:actionId": 3, "wpml:actionActuatorFunc": "focus", 'wpml:actionActuatorFuncParam': { 'wpml:focusX': 0, 'wpml:focusY': 0, 'wpml:focusRegionWidth': 0, 'wpml:focusRegionHeight': 0, 'wpml:isPointFocus': 0, 'wpml:isInfiniteFocus': 1, 'wpml:payloadPositionIndex': 0 } }, { "wpml:actionId": 4, "wpml:actionActuatorFunc": "hover", 'wpml:actionActuatorFuncParam': { 'wpml:hoverTime': 1, } } ] }, Placemark: [], // "wpml:payloadParam": { // "wpml:payloadPositionIndex": 0, // "wpml:focusMode": "firstPoint", // "wpml:meteringMode": "average", // "wpml:returnMode": "singleReturnFirst", // "wpml:samplingRate": 240000, // "wpml:scanningMode": "repetitive", // "wpml:imageFormat": "visable,ir", // }, }, { "wpml:templateId": 0, "wpml:autoFlightSpeed": 10, "wpml:executeHeightMode": "WGS84", "wpml:waylineId": 0, "wpml:startActionGroup": { "wpml:action": [{ "wpml:actionId": 0, "wpml:actionActuatorFunc": "gimbalRotate", 'wpml:actionActuatorFuncParam': { 'wpml:gimbalHeadingYawBase': 'aircraft', 'wpml:gimbalRotateMode': 'absoluteAngle', 'wpml:gimbalPitchRotateEnable': 1, 'wpml:gimbalPitchRotateAngle': -90, 'wpml:gimbalRollRotateEnable': 0, 'wpml:gimbalRollRotateAngle': 0, 'wpml:gimbalYawRotateEnable': 1, 'wpml:gimbalYawRotateAngle': 0, 'wpml:gimbalRotateTimeEnable': 0, 'wpml:gimbalRotateTime': 10, 'wpml:payloadPositionIndex': 0, } }, { "wpml:actionId": 1, "wpml:actionActuatorFunc": "hover", 'wpml:actionActuatorFuncParam': { 'wpml:hoverTime': 0.5, } }, { "wpml:actionId": 2, "wpml:actionActuatorFunc": "setFocusType", 'wpml:actionActuatorFuncParam': { 'wpml:cameraFocusType': 'manual', 'wpml:payloadPositionIndex': 0 } }, { "wpml:actionId": 3, "wpml:actionActuatorFunc": "focus", 'wpml:actionActuatorFuncParam': { 'wpml:focusX': 0, 'wpml:focusY': 0, 'wpml:focusRegionWidth': 0, 'wpml:focusRegionHeight': 0, 'wpml:isPointFocus': 0, 'wpml:isInfiniteFocus': 1, 'wpml:payloadPositionIndex': 0 } }, { "wpml:actionId": 4, "wpml:actionActuatorFunc": "hover", 'wpml:actionActuatorFuncParam': { 'wpml:hoverTime': 1, } } ] }, Placemark: [], // "wpml:payloadParam": { // "wpml:payloadPositionIndex": 0, // "wpml:focusMode": "firstPoint", // "wpml:meteringMode": "average", // "wpml:returnMode": "singleReturnFirst", // "wpml:samplingRate": 240000, // "wpml:scanningMode": "repetitive", // "wpml:imageFormat": "visable,ir", // }, }, { "wpml:templateId": 0, "wpml:autoFlightSpeed": 10, "wpml:executeHeightMode": "WGS84", "wpml:waylineId": 0, "wpml:startActionGroup": { "wpml:action": [{ "wpml:actionId": 0, "wpml:actionActuatorFunc": "gimbalRotate", 'wpml:actionActuatorFuncParam': { 'wpml:gimbalHeadingYawBase': 'aircraft', 'wpml:gimbalRotateMode': 'absoluteAngle', 'wpml:gimbalPitchRotateEnable': 1, 'wpml:gimbalPitchRotateAngle': -90, 'wpml:gimbalRollRotateEnable': 0, 'wpml:gimbalRollRotateAngle': 0, 'wpml:gimbalYawRotateEnable': 1, 'wpml:gimbalYawRotateAngle': 0, 'wpml:gimbalRotateTimeEnable': 0, 'wpml:gimbalRotateTime': 10, 'wpml:payloadPositionIndex': 0, } }, { "wpml:actionId": 1, "wpml:actionActuatorFunc": "hover", 'wpml:actionActuatorFuncParam': { 'wpml:hoverTime': 0.5, } }, { "wpml:actionId": 2, "wpml:actionActuatorFunc": "setFocusType", 'wpml:actionActuatorFuncParam': { 'wpml:cameraFocusType': 'manual', 'wpml:payloadPositionIndex': 0 } }, { "wpml:actionId": 3, "wpml:actionActuatorFunc": "focus", 'wpml:actionActuatorFuncParam': { 'wpml:focusX': 0, 'wpml:focusY': 0, 'wpml:focusRegionWidth': 0, 'wpml:focusRegionHeight': 0, 'wpml:isPointFocus': 0, 'wpml:isInfiniteFocus': 1, 'wpml:payloadPositionIndex': 0 } }, { "wpml:actionId": 4, "wpml:actionActuatorFunc": "hover", 'wpml:actionActuatorFuncParam': { 'wpml:hoverTime': 1, } } ] }, Placemark: [], // "wpml:payloadParam": { // "wpml:payloadPositionIndex": 0, // "wpml:focusMode": "firstPoint", // "wpml:meteringMode": "average", // "wpml:returnMode": "singleReturnFirst", // "wpml:samplingRate": 240000, // "wpml:scanningMode": "repetitive", // "wpml:imageFormat": "visable,ir", // }, }], }, }; // 有机巢的用这个模板 export let Havetemplate = { Document: { "wpml:missionConfig": { "wpml:flyToWaylineMode": "safely", "wpml:finishAction": "goHome", "wpml:exitOnRCLost": "executeLostAction", "wpml:executeRCLostAction": "goBack", "wpml:takeOffSecurityHeight": 20, "wpml:globalTransitionalSpeed": 15, "wpml:globalRTHHeight": 100, "wpml:droneInfo": { "wpml:droneEnumValue": 91, "wpml:droneSubEnumValue": 1, }, "wpml:payloadInfo": { "wpml:payloadEnumValue": 81, "wpml:payloadSubEnumValue": 2, "wpml:payloadPositionIndex": 0, }, }, Folder: { "wpml:templateId": 0, "wpml:autoFlightSpeed": 10, "wpml:executeHeightMode": "relativeToStartPoint", "wpml:waylineId": 0, "wpml:globalWaypointHeadingParam": { "wpml:waypointHeadingMode": "followWayline", "wpml:waypointHeadingAngle": 0, "wpml:waypointPoiPoint": "0.000000,0.000000,0.000000", "wpml:waypointHeadingPathMode": "followBadArc", "wpml:waypointHeadingPoiIndex": 0, }, "wpml:globalWaypointTurnMode": "toPointAndStopWithDiscontinuityCurvature", "wpml:globalUseStraightLine": 1, Placemark: [], // "wpml:payloadParam": { // "wpml:payloadPositionIndex": 0, // "wpml:focusMode": "firstPoint", // "wpml:meteringMode": "average", // "wpml:returnMode": "singleReturnFirst", // "wpml:samplingRate": 240000, // "wpml:scanningMode": "repetitive", // "wpml:imageFormat": "visable,ir", // }, }, }, }; export let template = { Document: { "wpml:author": 13874958346, "wpml:createTime": 1688652646205, "wpml:updateTime": 1688978993216, "wpml:missionConfig": { "wpml:flyToWaylineMode": "safely", "wpml:finishAction": "goHome", "wpml:exitOnRCLost": "executeLostAction", "wpml:executeRCLostAction": "goBack", "wpml:takeOffSecurityHeight": 20, "wpml:takeOffRefPoint": "28.192009,113.058389,16.581492", "wpml:takeOffRefPointAGLHeight": 0, "wpml:globalTransitionalSpeed": 15, "wpml:globalRTHHeight": 100, "wpml:droneInfo": { "wpml:droneEnumValue": 91, "wpml:droneSubEnumValue": 1, }, "wpml:payloadInfo": { "wpml:payloadEnumValue": 81, "wpml:payloadSubEnumValue": 2, "wpml:payloadPositionIndex": 0, }, }, Folder: { "wpml:templateType": "waypoint", "wpml:templateId": 0, "wpml:waylineId": 0, "wpml:executeHeightMode": "relativeToStartPoint", "wpml:waylineCoordinateSysParam": { "wpml:coordinateMode": "WGS84", "wpml:heightMode": "relativeToStartPoint", }, "wpml:autoFlightSpeed": 10, "wpml:globalHeight": 20, "wpml:caliFlightEnable": 0, "wpml:gimbalPitchMode": "manual", "wpml:globalWaypointHeadingParam": { "wpml:waypointHeadingMode": "followWayline", "wpml:waypointHeadingAngle": 0, "wpml:waypointPoiPoint": "0.000000,0.000000,0.000000", "wpml:waypointHeadingPathMode": "followBadArc", "wpml:waypointHeadingPoiIndex": 0, }, "wpml:globalWaypointTurnMode": "toPointAndStopWithDiscontinuityCurvature", "wpml:globalUseStraightLine": 1, Placemark: [ { "Point": { "coordinates": " 112.946808121,28.012694428" }, "wpml:index": "0", "wpml:ellipsoidHeight": "20", "wpml:height": "20", "wpml:waypointSpeed": "5", "wpml:waypointHeadingParam": { "wpml:waypointHeadingMode": "followWayline", "wpml:waypointHeadingAngle": "0", "wpml:waypointPoiPoint": "0.000000,0.000000,0.000000", "wpml:waypointHeadingPathMode": "followBadArc", "wpml:waypointHeadingPoiIndex": "0" }, "wpml:waypointTurnParam": { "wpml:waypointTurnMode": "toPointAndStopWithDiscontinuityCurvature", "wpml:waypointTurnDampingDist": 0 }, "wpml:useGlobalHeight": "1", "wpml:useGlobalSpeed": "1", "wpml:useGlobalHeadingParam": "1", "wpml:useGlobalTurnParam": "1", "wpml:useStraightLine": "1", "wpml:isRisky": "0" }, ], "wpml:payloadParam": { "wpml:payloadPositionIndex": 0, "wpml:focusMode": "firstPoint", "wpml:meteringMode": "average", "wpml:returnMode": "singleReturnFirst", "wpml:samplingRate": 240000, "wpml:scanningMode": "repetitive", "wpml:imageFormat": "visable,ir", }, }, }, }; /** * @description 航线wayline示例文件 */ export let wayline = { Document: { "wpml:missionConfig": { "wpml:flyToWaylineMode": "safely", "wpml:finishAction": "goHome", "wpml:exitOnRCLost": "executeLostAction", "wpml:executeRCLostAction": "goBack", "wpml:takeOffSecurityHeight": 20, "wpml:globalTransitionalSpeed": 15, "wpml:globalRTHHeight": 100, "wpml:droneInfo": { "wpml:droneEnumValue": 91, "wpml:droneSubEnumValue": 0, }, "wpml:payloadInfo": { "wpml:payloadEnumValue": 80, "wpml:payloadSubEnumValue": 0, "wpml:payloadPositionIndex": 0, }, }, Folder: { "wpml:templateId": 0, "wpml:executeHeightMode": "relativeToStartPoint", "wpml:waylineId": 0, "wpml:distance": 486.405029296875, "wpml:duration": 59.816535949707, "wpml:autoFlightSpeed": 10, Placemark: [], }, }, }; /** * @description 读取kml路径 * @param {String} kml kml路径 */ export function readKMZ(kml) { let promise = new Promise((resolve, reject) => { JSZipUtils.getBinaryContent(kml, (err, data) => { if (err) { console.error(err); reject(err); } const zip = new JSZip(); // zip.loadAsync:解压 zip.loadAsync(data).then(async (res) => { let kmls = []; for (const key in res.files) { if (Object.hasOwnProperty.call(res.files, key)) { const element = res.files[key]; let content = await element.async("text"); kmls.push(content); } } resolve(kmls); }); }); }); return promise; } export function readKMZ2(kml) { let promise = new Promise((resolve, reject) => { const zip = new JSZip(); // zip.loadAsync:解压 zip.loadAsync(kml).then(async (zip) => { const fileName = "wpmz/waylines.wpml"; return zip.file(fileName).async("string"); }).then((wayline) => { const parser = new XMLParser(); resolve(parser.parse(wayline)); }) }); return promise; } /** * @description 将xml文件转为json * @param {xml} xml * @returns */ export function parserXml2Json(xml) { const parser = new XMLParser(); return parser.parse(xml); } /** * @description 导出航线文件 * @param {object} template * @param {object} wayline */ export async function writeWPMZ(template, wayline) { // JSZip示例 const zip = new JSZip(); // JSON2XML转换器实例 const builder = new XMLBuilder({ ignoreAttributes: false, // 保留键名原样 } ); let xmlPrefix = ` `; let xmlSuffix = ""; const processedJson1 = Object.keys(template).reduce((acc, key) => { const newKey = key.charAt(0).toUpperCase() + key.slice(1); acc[newKey] = template[key]; return acc; }, {}); const processedJson2 = Object.keys(wayline).reduce((acc, key) => { const newKey = key.charAt(0).toUpperCase() + key.slice(1); acc[newKey] = wayline[key]; return acc; }, {}); // 创建一个名为“wpmz”的文件夹 const wpmzFolder = zip.folder("wpmz"); //将名为“template.kml”的文件添加到“wpmz”文件夹 wpmzFolder.file( "template.kml", xmlPrefix + builder.build(processedJson1) + xmlSuffix ); wpmzFolder.file( "waylines.wpml", xmlPrefix + builder.build(processedJson2) + xmlSuffix ); // 生成KML let content = await zip.generateAsync({ type: "blob" }); return content; } export function getKMZ(data) { // console.log("新解析航线", data.url); //let ipPrefix = 'https://hunan-ib.chinatowercom.cn/file/2k-sc-file/'; //let ipPrefix = 'https://hunan-ib.chinatowercom.cn/file/2k-test-file/'; //let ipPrefix = 'http://120.76.142.34:19000/cloud-bucket/'; //let ipPrefix = 'https://gong001.oss-cn-hangzhou.aliyuncs.com/'; // let ipSub = ''; // const randomParam = '?t=' + new Date().getTime(); // let encodeurl = encodeURI(ipPrefix + url + ipSub + randomParam); let encodeurl = data.url; return new Promise(function (resolve, reject) { // Step 1: Request the file JSZipUtils.getBinaryContent(encodeurl, function (err, data) { if (err) { reject(err); } else { resolve(data); } }); }) .then(function (files) { // Step 2: Unzip the file return JSZip.loadAsync(files); }) .then(function (zip) { // Step 3: Get the file contents // const fileName = Object.keys(zip.files)[0]; const fileName = "wpmz/template.kml"; return zip.file(fileName).async("string"); }) .then((wayline) => { const parser = new XMLParser(); return parser.parse(wayline) }); } // 添加结束等时/等距拍照结束动作(整条航线) export const addIntervalStop = (template) => { // debugger; // 获取等时/等距拍照的尾数 function getEndIndex(actionGroup) { if ( actionGroup["wpml:action"] && actionGroup?.["wpml:actionTrigger"]?.["wpml:actionTriggerType"] && (actionGroup["wpml:actionTrigger"]["wpml:actionTriggerType"] == "multipleTiming" || actionGroup["wpml:actionTrigger"]["wpml:actionTriggerType"] == "multipleDistance") ) { let endIndex = actionGroup["wpml:actionGroupEndIndex"]; if (endIndex) { return endIndex; } } return null; } // 是否有reachPoint的actionGroup function hasReachPointActionGroup(actionGroup) { if (actionGroup.constructor == Object) { if ( actionGroup?.["wpml:actionTrigger"]?.["wpml:actionTriggerType"] && actionGroup["wpml:actionTrigger"]["wpml:actionTriggerType"] == "reachPoint" ) { return actionGroup; } } else { actionGroup.forEach((group) => { if ( group?.["wpml:actionTrigger"]?.["wpml:actionTriggerType"] && group["wpml:actionTrigger"]["wpml:actionTriggerType"] == "reachPoint" ) { return group; } }); } return false; } // 添加结束等时/等距拍照结束动作(具体的某一个) function addIntervalStopAction(endIndex) { // 构建动作 let item = ACTION_ITEM_LIST.find((action) => { return action.type == "intervalStop"; }); let param = actionParams[item.type] || {}; param["wpml:actionUUID"] = UUID(); // 动作 let intervalStopAction = { id: UUID(), "wpml:actionActuatorFunc": item.type, "wpml:actionActuatorFuncParam": param, }; let stopPlacemark = template.Document.Folder.Placemark[endIndex]; if (stopPlacemark && stopPlacemark["wpml:actionGroup"]) { let endActionGroup = hasReachPointActionGroup( stopPlacemark["wpml:actionGroup"] ); if (endActionGroup) { if (endActionGroup["wpml:action"]) { if (endActionGroup["wpml:action"].constructor == Object) { endActionGroup["wpml:action"] = [ endActionGroup["wpml:action"], intervalStopAction, ]; } else { endActionGroup["wpml:action"].push(intervalStopAction); } } else { endActionGroup["wpml:action"] = intervalStopAction; } } else { if (stopPlacemark["wpml:actionGroup"].constructor == Object) { stopPlacemark["wpml:actionGroup"] = [ stopPlacemark["wpml:actionGroup"], { "wpml:actionGroupId": 1, "wpml:actionGroupStartIndex": endIndex, "wpml:actionGroupEndIndex": endIndex, "wpml:actionGroupMode": "sequence", "wpml:actionTrigger": { "wpml:actionTriggerType": "reachPoint", }, "wpml:action": intervalStopAction, }, ]; } else { stopPlacemark["wpml:actionGroup"].push({ "wpml:actionGroupId": stopPlacemark["wpml:actionGroup"].length, "wpml:actionGroupStartIndex": endIndex, "wpml:actionGroupEndIndex": endIndex, "wpml:actionGroupMode": "sequence", "wpml:actionTrigger": { "wpml:actionTriggerType": "reachPoint", }, "wpml:action": intervalStopAction, }); } } } else { stopPlacemark["wpml:actionGroup"] = { "wpml:actionGroupId": 0, "wpml:actionGroupStartIndex": endIndex, "wpml:actionGroupEndIndex": endIndex, "wpml:actionGroupMode": "sequence", "wpml:actionTrigger": { "wpml:actionTriggerType": "reachPoint", }, "wpml:action": intervalStopAction, }; } } for ( let index = 0; index < template.Document.Folder.Placemark.length; index++ ) { let Placemark = template.Document.Folder.Placemark[index]; if (Placemark["wpml:actionGroup"]) { if (Placemark["wpml:actionGroup"].constructor == Object) { let endIndex = getEndIndex(Placemark["wpml:actionGroup"]); if (endIndex) { addIntervalStopAction(endIndex); } } else { Placemark["wpml:actionGroup"].forEach( (actionGroup, actionGroupIndex) => { let endIndex = getEndIndex(actionGroup); if (endIndex) { addIntervalStopAction(endIndex); } } ); } } } };