main
徐景良 2 weeks ago
parent 9728998757
commit 01eb68f678

@ -6,7 +6,8 @@
:workPlanFormShow="workPlanFormShow"
:editMode="editMode"
:airLineForm="airLineForm"
@exitDraw="exitDraw" @flyToThere="flyToThere"
@exitDraw="exitDraw"
@flyToThere="flyToThere"
:wayline="wayline"
:waylineInfo="waylineInfo"
:templateKmlConfig="templateKmlConfig"
@ -175,7 +176,11 @@ const exitDraw = ()=>{
planListShow.value = false;
workPlanFormShow.value = true;
ariLineShow.value = true;
editMode.value = 'add'
editMode.value = 'add';
// 线template.kml
templateKmlConfig.value = {}
// 线wayline.wpml
waylineWpmlConfig.value = {}
}

@ -123,7 +123,7 @@
<a-menu-item @click="checkAriLine(item)" v-if="props.title == '选择航线'">
<a href="javascript:;">选择</a>
</a-menu-item>
<a-menu-item @click="toEditAirLine(item,'edit')" v-if="props.title != '选择航线'">
<a-menu-item @click="toEditAirLine(item,'detail')" v-if="props.title != '选择航线'">
<a href="javascript:;">预览</a>
</a-menu-item>
<a-menu-item @click="toEditAirLine(item,'edit')" v-if="props.title != '选择航线'">

@ -668,7 +668,7 @@ const handelrAirPoint = () => {
if(item.actions.length>0){
point.actionGroup = {
"actionGroupId": 0,
"actionGroupId": index,
"actionGroupStartIndex": index,
"actionGroupEndIndex": index,
"actionGroupMode": "sequence",
@ -687,6 +687,9 @@ const handelrAirPoint = () => {
props.templateKmlConfig.Folder.Placemark.push(point);
})
// actionGroupId
console.log("props.waylineWpmlConfig.Folder.Placemark",props.waylineWpmlConfig.Folder.Placemark);
}

@ -324,7 +324,9 @@ const calculatParam = ref({
watch(
() => calculatParam.value,
(newVal,oldVal) => {
emits("calculatParamChange",newVal)
if(props.editModel != 'add'){
emits("calculatParamChange",newVal)
}
},
{deep:true}
)

@ -10,7 +10,10 @@
</div>
<div class="body-container">
<div class="item-label">航线类型</div>
<div class="item-label">
航线类型
<span class="validate-tooplip" v-if="!createAirLineForm.airLineType && isSubmit" >请选择航线类型</span>
</div>
<div class="draw-type">
<div v-for="(item,index) in airLineType"
@ -22,7 +25,10 @@
</div>
</div>
<div class="item-label">选择飞行器</div>
<div class="item-label">
选择飞行器
<span class="validate-tooplip" v-if="!createAirLineForm.uavType && isSubmit"></span>
</div>
<div class="draw-type">
<div class="air-line-type" v-for="(item,index) in airType"
@ -33,7 +39,10 @@
</div>
</div>
<div class="item-label">选择型号</div>
<div class="item-label">
选择型号
<span class="validate-tooplip" v-if="!createAirLineForm.uavModel && isSubmit"></span>
</div>
<div class="draw-type">
<div class="air-line-type" v-for="(item,index) in airModel"
@ -44,7 +53,10 @@
</div>
</div>
<div class="item-label">航线名称</div>
<div class="item-label">
航线名称
<span class="validate-tooplip" v-if="!createAirLineForm.airLineName?.trim() && isSubmit">线</span>
</div>
<a-input v-model:value="createAirLineForm.airLineName" placeholder="航线名称" />
<div class="operate-button">
@ -61,7 +73,8 @@
<script lang="ts" setup>
import { CloseOutlined,FileAddOutlined,LeftOutlined,ImportOutlined,MoreOutlined,EditOutlined } from '@ant-design/icons-vue';
import {ref,defineEmits} from 'vue'
import { message } from 'ant-design-vue';
const isSubmit = ref(false);
const emit = defineEmits(["checkAriLine","cancle","createAirLine"])
//
@ -134,8 +147,16 @@
// 线
const createAirLine = () => {
getCheckedData();
emit("createAirLine",createAirLineForm.value);
isSubmit.value = true;
if(createAirLineForm.value.airLineType && createAirLineForm.value.uavType && createAirLineForm.value.uavModel && createAirLineForm.value.airLineName){
emit("createAirLine",createAirLineForm.value);
}else{
}
}
@ -174,6 +195,8 @@
})
}
getCheckedData();
}
const getCheckedData = () => {
@ -284,6 +307,11 @@
.button-flex{
flex:1;
}
.validate-tooplip{
font-size:12px;
color:#F56C6C;
}
::v-deep .ant-select-selector{
border:none!important;
color:#fff!important;

@ -59,6 +59,19 @@
<div class="item-name">{{submitForm.taskAirLineName}}</div>
<div class="item-operate" @click="selectAriLine">
<MoreOutlined />
<a-dropdown v-if="false">
<MoreOutlined />
<template #overlay>
<a-menu>
<a-menu-item >
<a href="javascript:;" @click="previewAirLine(submitForm.airLineId)">线</a>
</a-menu-item>
<a-menu-item >
<a href="javascript:;" @click="selectAriLine">线</a>
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</div>
</div>
</a-form-item>
@ -225,8 +238,10 @@
<script lang="ts" setup>
import { ref, defineEmits, defineProps, watch } from "vue";
import { PlusOutlined,LeftOutlined,DeleteOutlined,MoreOutlined } from '@ant-design/icons-vue';
import { addTask,editTask,getWorkspaceList } from "@/api/sys/workplan";
import { addTask,editTask,getWorkspaceList,getAirLine } from "@/api/sys/workplan";
import axios from 'axios';
import JSZip from 'jszip';
import { XMLParser, XMLBuilder } from 'fast-xml-parser';
import { Modal, message } from 'ant-design-vue';
import { useRoute,useRouter } from 'vue-router'
const router = useRoute()
@ -490,7 +505,7 @@ watch(
}
)
const emit = defineEmits(['selectAriLine','cancleCraete',"selectAircraft","successCreatePlan","intelligentPatrol"]);
const emit = defineEmits(['selectAriLine','cancleCraete',"selectAircraft","successCreatePlan","intelligentPatrol","startEditAirLine"]);
const removeAirLine = ()=>{
props.checkedAriLine.value = {};
@ -725,6 +740,53 @@ const changeAiInspection = (val)=>{
emit('intelligentPatrol')
}
}
// 线
const previewAirLine = async (id) => {
let airLine = await getAirLine({airLineId:id});
try{
let response = await axios.get(airLine.wpml,{responseType: 'arraybuffer'});
// kmz
let xmlStr =await extractKmz(response.data);
// wpml
let removeWpmlXmlStr = {
template:xmlStr.template.replace(/wpml:/g,""),
wayline:xmlStr.wayline.replace(/wpml:/g,"")
}
// josn
const parser = new XMLParser();
let xmlObj = {
template:parser.parse(removeWpmlXmlStr.template),
wayline:parser.parse(removeWpmlXmlStr.wayline),
}
emit("startEditAirLine",xmlObj,airLine,"detail")
}catch(e){
console.error(e);
}
}
const extractKmz = async (kmzBlob)=>{
const zip = new JSZip();
const contents = await zip.loadAsync(kmzBlob);
let xmlData = {
wayline:null,
template:null
}
// .wpml .kmz
for (const [filename, file] of Object.entries(contents.files)) {
// wpml
if (filename.toLowerCase().endsWith('.wpml')) {
xmlData.wayline = await file.async('text');
}
// kmz
if (filename.toLowerCase().endsWith('.kml')) {
xmlData.template = await file.async('text');
}
}
return xmlData;
}
</script>
<style scoped>

@ -11,10 +11,16 @@
<div class="body-container">
<div class="item-label">航线名称</div>
<div class="item-label">
航线名称
<span class="validate-tooplip" v-if="!submitForm.airLineName?.trim() && isSubmit">线</span>
</div>
<a-input v-model:value="submitForm.airLineName" placeholder="航线名称" />
<div class="item-label">航线类型</div>
<div class="item-label">
航线类型
<span class="validate-tooplip" v-if="!submitForm.airLineType && isSubmit" >请选择航线类型</span>
</div>
<div class="draw-type">
<div v-for="(item,index) in airLineType"
@ -27,7 +33,10 @@
</div>
<div class="item-label">航线文件</div>
<div class="item-label">
航线文件
<span class="validate-tooplip" v-if="fileList?.length <= 0 && isSubmit" >请选择航线文件</span>
</div>
<div class="">
<a-upload-dragger
@ -71,6 +80,7 @@
const props = defineProps(["currentFolder"])
const isSubmit = ref(false);
const checkAriLine = (item)=> {
emit("checkAriLine",item);
}
@ -266,15 +276,24 @@
const handleManualUpload = async () => {
if (fileList.value.length<1) return;
getCheckedData();
isSubmit.value = true;
if(submitForm.value.airLineType && submitForm.value.airLineName){
}else{
return null;
}
const formData = new FormData();
if (fileList.value.length<1) return;
formData.append('xmlFile', fileList.value[0]?.originFileObj);
const formData = new FormData();
let res = await uploadXmlFile(props.currentFolder,formData);
formData.append('xmlFile', fileList.value[0]?.originFileObj);
let res = await uploadXmlFile(props.currentFolder,formData);
if(res){
@ -485,4 +504,8 @@
color:#fff;
}
.validate-tooplip{
font-size:12px;
color:#F56C6C;
}
</style>

@ -2,7 +2,7 @@
<!-- 地图 -->
<div ref="vChartRef " :id="'mars3d-container_' + mapId" class="mars3d-container">
<!-- 航点航线 -->
<div v-if="props.airLineForm.airLineType == 'waypoint'" class="air-container">
<div v-if="props.airLineForm.airLineType == 'waypoint'" v-show="props.editMode != 'detail'" class="air-container">
<airPoint
:airInfo="lineInfo"
:editModel="props.editMode"
@ -239,7 +239,7 @@
watch(
() => props.editMode,
(newVal,oldVal)=>{
if(newVal == 'edit' ){
if(newVal == 'edit' || newVal == 'detail'){
// 线
if(props.airLineForm.airLineType == 'waypoint'){
handlerEditWaypointAirLine();
@ -444,8 +444,10 @@
let graphic = null;
// //
const exitDraw = () => {
//
graphicLayer ? graphicLayer.clear() : null;
takeOffPointGraphicLayer ? takeOffPointGraphicLayer.clear() : null;
@ -501,6 +503,7 @@
onMounted(() => {
initMap();
EventBus.on('closeTranslation', (val: any) => {
if (moveTool) {
moveTool.destroy();
@ -686,6 +689,7 @@
map.addLayer(graphicLayer);
//
takeOffPointGraphicLayer = new mars3d.layer.GraphicLayer({
isAutoEditing: true,
@ -761,13 +765,13 @@
setAirportPosition();
}
if (props.uavTrack) {
setUAVPosition();
// setUAVPosition();
}
//
// loadChangGuangLayer();
//
if(props.editMode == 'edit' ){
if(props.editMode == 'edit' || props.editMode == 'detail'){
// 线
if(props.airLineForm.airLineType == 'waypoint'){
handlerEditWaypointAirLine();
@ -776,6 +780,8 @@
}
}
//
if (props.polygonArea) {
handlerReportPolygonAirLine();
@ -1076,6 +1082,7 @@
};
// 线
const handlerDrawPolygonLine = (lines) => {
//
let firstAirLinePoint = polygonGraphicLayer.getGraphicById('polygon-node-1');
if (firstAirLinePoint) {
@ -2366,7 +2373,6 @@ let stickGraphicLayer: mars3d.layer.GraphicLayer;
//
const stickGraphicMove = (e) => {
return null;
let uav = uavGraphicLayer.getGraphicById('flytothere-uav');
if (uav) {
@ -2728,6 +2734,7 @@ let stickGraphicLayer: mars3d.layer.GraphicLayer;
};
//
const setUAVPosition = () => {
let point = graphicLayer.getGraphicById('set-uav');
const position = [props.uavTrack.longitude, props.uavTrack.latitude, props.uavTrack.height];
//
@ -2805,7 +2812,6 @@ let stickGraphicLayer: mars3d.layer.GraphicLayer;
});
graphicLayer.addGraphic(groundPoint);
const linePositions = [];
const groundLine = new mars3d.graphic.PolylineEntity({
id: route.id + '-groundLine',
@ -2893,8 +2899,15 @@ let stickGraphicLayer: mars3d.layer.GraphicLayer;
///////////////////////////////////////////////////////////////////////
const addAction = (action) => {
//
if(action.value == "takePhoto"){
currentAirPoint.value.actions.push(JSON.parse(JSON.stringify(airPointActions['focus'])));
}
//
currentAirPoint.value.actions.push(JSON.parse(JSON.stringify(action)));
};
</script>

@ -2,7 +2,17 @@
<div>
<div class="map-out-container">
<div class="map-inner-container">
<Map :workPlanFormShow="workPlanFormShow" :airLineForm="airLineForm" @exitDraw="exitDraw" @flyToThere="flyToThere" :wayline="wayline" :waylineInfo="waylineInfo"></Map>
<Map
:workPlanFormShow="workPlanFormShow"
:editMode="editMode"
:airLineForm="airLineForm"
@exitDraw="exitDraw"
@flyToThere="flyToThere"
:wayline="wayline"
:waylineInfo="waylineInfo"
:templateKmlConfig="templateKmlConfig"
:waylineWpmlConfig="waylineWpmlConfig"
></Map>
</div>
</div>
@ -16,7 +26,7 @@
<!-- 创建计划 -->
<div v-if="workPlanFormShow" style="width:360px;height: calc( 100vh - 144px);flex:1;">
<createWorkPlan :workPlanStatus="workPlanStatus" :formData="formData" @successCreatePlan="successCreatePlan" @cancleCraete="cancleCraete" @selectAircraft="selectAircraft" @selectAriLine="selectAriLine" :checkedAriLine="checkedAriLine" :checkedDronePort="checkedDronePort" @intelligentPatrol="changePatrolShow"></createWorkPlan>
<createWorkPlan :workPlanStatus="workPlanStatus" :formData="formData" @successCreatePlan="successCreatePlan" @cancleCraete="cancleCraete" @selectAircraft="selectAircraft" @selectAriLine="selectAriLine" :checkedAriLine="checkedAriLine" :checkedDronePort="checkedDronePort" @intelligentPatrol="changePatrolShow" @startEditAirLine="startEditAirLine"></createWorkPlan>
</div>
<!-- 智能巡检 -->
<div v-if="patrolShow" class="patrol-box">
@ -235,10 +245,31 @@ const previewAirLine =async (line,type) => {
}
}
// 线 add edit detail
const editMode = ref("add");
// 线template.kml
const templateKmlConfig = ref({})
// 线wayline.wpml
const waylineWpmlConfig = ref({})
// 线
const startEditAirLine = (formData,airLineInfo) => {
console.log("formData123",formData,airLineInfo);
const startEditAirLine = (data,form,type) => {
// 线template.kml
templateKmlConfig.value = data.template.kml.Document
// 线wayline.wpml
waylineWpmlConfig.value = data.wayline.kml.Document;
// 线
waylineInfo.value = form;
// 线
airLineForm.value = form;
//
editMode.value = type;
}
const workPlanStatus = ref("");
// 线

Loading…
Cancel
Save