Compare commits

...

2 Commits

Author SHA1 Message Date
徐景良 f6f330c0b6 merge 2 weeks ago
徐景良 b3d7070aa4 merge 2 weeks ago

@ -276,12 +276,15 @@ const startEditAirLine = (data,form,type) => {
editMode.value = type;
//
if(editMode.value == 'edit'){
workPlanFormShow.value = false;
ariLineShow.value = false;
aircraftShow.value = false;
planListShow.value = false;
createAirLineShow.value = false;
}
workPlanFormShow.value = false;
ariLineShow.value = false;
aircraftShow.value = false;
planListShow.value = false;
createAirLineShow.value = false;
}

@ -0,0 +1,131 @@
<template>
<div class="params-container">
<!-- 间隔距离 -->
<div class="params-item">
<div class="params-label">间隔距离</div>
<div class="params-value">
<a-input-number v-model:value="props.params.actionTrigger.actionTriggerParam"></a-input-number>
</div>
<div class="params-unit"></div>
</div>
<!-- 选择相机 -->
<div class="params-item">
<div class="params-label">相机选择</div>
<div class="params-value">
<div v-for="(item,index) in cameraType"
:key="index"
:class="item.checked ? 'checkbox-item-active' : 'checkbox-item'"
@click="checkCamera(item)"
>
{{ item.name }}
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import {defineProps,defineComponent,defineOptions,ref} from 'vue';
const props = defineProps(["params"])
defineComponent({
name: 'multipleTiming'
})
let cameras = props.params.action.actionActuatorFuncParam.payloadLensIndex?.split(",");
const cameraType = ref([
{
name:"可见光",
value:"visable",
checked:false,
},{
name:"红外照片",
value:"ir",
checked:false
}
])
cameras?.forEach((item,index)=>{
cameraType.value.forEach((camera,idx)=>{
if(item == camera.value){
cameraType.value[idx].checked = true;
}
})
})
const checkCamera = (item) => {
item.checked = !item.checked
const result = cameraType.value
.filter(item => item.checked)
.map(item => item.value)
.join(",");
props.params.payloadLensIndex = result;
}
</script>
<style scoped>
.params-container{
display:flex;
flex-direction: column;
gap:20px;
}
.params-item{
width:100%;
display: flex;
gap:20px;
}
.params-item .params-label{
line-height:30px;
}
.params-item .params-value{
flex:1;
display:flex;
gap:10px;
}
.params-item .params-unit{
line-height:30px;
padding:0px 5px 0px 15px;
}
::v-deep .ant-input-number{
color:#fff!important;
background:#3F4150!important;
border:0px !important;
}
::v-deep .ant-input-number-input{
color:#fff!important;
border:0px !important;
}
.checkbox-item {
line-height:30px;
border-radius: 15px;
background:#3C3C3C;
padding:0px 12px;
cursor:pointer;
}
.checkbox-item-active{
line-height:30px;
border-radius: 15px;
background:#3A57E8;
padding:0px 12px;
cursor:pointer;
}
</style>

@ -1,55 +1,131 @@
<template>
<div class="params-item">
<div class="params-label">间隔时间</div>
<div class="params-value">
<a-input-number v-model:value="props.params.hoverTime"></a-input-number>
</div>
<div class="params-unit"></div>
</div>
</template>
<script lang="ts" setup>
import {defineProps,defineComponent,defineOptions} from 'vue';
const props = defineProps(["params"])
defineComponent({
name: 'multipleTiming'
})
</script>
<style scoped>
.params-item{
width:100%;
display: flex;
gap:20px;
}
.params-item .params-label{
<div class="params-container">
<!-- 间隔距离 -->
<div class="params-item">
<div class="params-label">间隔时间</div>
<div class="params-value">
<a-input-number v-model:value="props.params.actionTrigger.actionTriggerParam"></a-input-number>
</div>
<div class="params-unit"></div>
</div>
<!-- 选择相机 -->
<div class="params-item">
<div class="params-label">相机选择</div>
<div class="params-value">
<div v-for="(item,index) in cameraType"
:key="index"
:class="item.checked ? 'checkbox-item-active' : 'checkbox-item'"
@click="checkCamera(item)"
>
{{ item.name }}
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import {defineProps,defineComponent,defineOptions,ref} from 'vue';
const props = defineProps(["params"])
defineComponent({
name: 'multipleTiming'
})
let cameras = props.params.action.actionActuatorFuncParam.payloadLensIndex?.split(",");
const cameraType = ref([
{
name:"可见光",
value:"visable",
checked:false,
},{
name:"红外照片",
value:"ir",
checked:false
}
])
cameras?.forEach((item,index)=>{
cameraType.value.forEach((camera,idx)=>{
if(item == camera.value){
cameraType.value[idx].checked = true;
}
})
})
const checkCamera = (item) => {
item.checked = !item.checked
const result = cameraType.value
.filter(item => item.checked)
.map(item => item.value)
.join(",");
props.params.payloadLensIndex = result;
}
</script>
<style scoped>
.params-container{
display:flex;
flex-direction: column;
gap:20px;
}
.params-item{
width:100%;
display: flex;
gap:20px;
}
.params-item .params-label{
line-height:30px;
}
.params-item .params-value{
flex:1;
}
.params-item .params-unit{
}
.params-item .params-value{
flex:1;
display:flex;
gap:10px;
}
.params-item .params-unit{
line-height:30px;
padding:0px 5px 0px 15px;
}
::v-deep .ant-input-number{
}
::v-deep .ant-input-number{
color:#fff!important;
background:#3F4150!important;
border:0px !important;
}
::v-deep .ant-input-number-input{
}
::v-deep .ant-input-number-input{
color:#fff!important;
border:0px !important;
}
</style>
}
.checkbox-item {
line-height:30px;
border-radius: 15px;
background:#3C3C3C;
padding:0px 12px;
cursor:pointer;
}
.checkbox-item-active{
line-height:30px;
border-radius: 15px;
background:#3A57E8;
padding:0px 12px;
cursor:pointer;
}
</style>

@ -11,7 +11,7 @@
<a-select
ref="select"
style="width: 185px"
v-model:value="pageQuery.UavTypeId"
v-model:value="pageQuery.UavModel"
placeholder="全部机型"
@change="getAirList"
>
@ -19,7 +19,7 @@
<a-select-option :value="'M30'">经纬 M30 系列</a-select-option>
<a-select-option :value="'Mavic 3'">Mavic 3 系列</a-select-option>
<a-select-option :value="'Mavic 3D'">Mavic 3D 系列</a-select-option>
<a-select-option :value="'Matrce 4TD'">Matrce 4TD 系列</a-select-option>
<a-select-option :value="'Matrice 4TD'">Matrice 4TD 系列</a-select-option>
</a-select>
</div>
@ -229,7 +229,6 @@
:width="200"
>
<div style="padding:40px;">
<div> 文件名称</div>
<a-input v-model:value="createFolderForm.folderName"></a-input>
@ -440,7 +439,7 @@
const pageQuery = ref({
Ascending:false,
UavTypeId:null,
UavModel:null,
AirLineType:null,
AirLineName:null,
Folder:null,

@ -667,35 +667,96 @@ const handelrAirPoint = () => {
}
if(item.actions.length>0){
point.actionGroup = {
"actionGroupId": index,
"actionGroupStartIndex": index,
"actionGroupEndIndex": index,
"actionGroupMode": "sequence",
"actionTrigger": {
"actionTriggerType": "reachPoint"
},
"action": []
};
item.actions.forEach((action,idx)=>{
let actor = action.config;
actor.actionId = idx
point.actionGroup.action.push(actor);
//
let actiongroup = item.actions.find((it,idx)=>{
return it.type == 'actionGroup';
})
//
if(actiongroup){
point.actionGroup = [
{
"actionGroupId": index,
"actionGroupStartIndex": index,
"actionGroupEndIndex": index,
"actionGroupMode": "sequence",
"actionTrigger": {
"actionTriggerType": "reachPoint"
},
"action": []
}
];
item.actions.forEach((action,idx)=>{
//
if(action.type == 'action'){
let actor = action.config;
actor.actionId = idx
point.actionGroup[0].action.push(actor);
}
//
if(action.type == 'actionGroup'){
action.config.actionGroupStartIndex = index;
point.actionGroup.push(action.config)
}
})
}else{
point.actionGroup = {
"actionGroupId": index,
"actionGroupStartIndex": index,
"actionGroupEndIndex": index,
"actionGroupMode": "sequence",
"actionTrigger": {
"actionTriggerType": "reachPoint"
},
"action": []
};
item.actions.forEach((action,idx)=>{
//
if(action.type == 'action'){
let actor = action.config;
actor.actionId = idx
point.actionGroup.action.push(actor);
}
})
}
}
props.waylineWpmlConfig.Folder.Placemark.push(point);
props.templateKmlConfig.Folder.Placemark.push(point);
let tempGroupId = 0;
props.templateKmlConfig.Folder.Placemark?.forEach((placemark,index)=>{
//
if(Array.isArray(placemark.actionGroup)){
props.templateKmlConfig.Folder.Placemark[index].actionGroup?.forEach((actionGroup,idx)=>{
props.templateKmlConfig.Folder.Placemark[index].actionGroup[idx].actionGroupId = tempGroupId;
tempGroupId++;
})
}else{
props.templateKmlConfig.Folder.Placemark[index].actionGroup.actionGroupId = tempGroupId;
tempGroupId++;
}
})
console.log("props.waylineWpmlConfig.Folder.Placemark",props.waylineWpmlConfig.Folder.Placemark);
})
// actionGroupId
console.log("props.waylineWpmlConfig.Folder.Placemark",props.waylineWpmlConfig.Folder.Placemark);
}
// wpml:
// wpml:
const handlerPrefixWpml = (obj) => {
@ -715,7 +776,7 @@ const handlerPrefixWpml = (obj) => {
newAttrs[attrName] = obj[key][attrName];
}
}
obj[key] = newAttrs;
}else if(typeof obj[key] === 'object' && obj[key] !== null && Array.isArray(obj[key])){ //

@ -84,7 +84,7 @@
<div class="item-content">
<component
:is="componentMap[item.value]"
:params="item.config.actionActuatorFuncParam"
:params="item.type == 'action' ? item.config.actionActuatorFuncParam : item.config"
:info="item"
:key="index"
@paramChagne="paramChagne"
@ -111,6 +111,8 @@ import orientedShoot from '../actionComponents/orientedShoot.vue'
import startRecord from '../actionComponents/startRecord.vue'
import takePhoto from '../actionComponents/takePhoto.vue'
import panoShot from '../actionComponents/panoShot.vue'
import multipleTiming from '../actionComponents/multipleTiming.vue'
import multipleDistance from '../actionComponents/multipleDistance.vue'
const componentMap = {
hover: hover,
@ -121,6 +123,8 @@ const componentMap = {
startRecord:startRecord,
takePhoto:takePhoto,
panoShot:panoShot,
multipleTiming:multipleTiming,
multipleDistance:multipleDistance
};
const props = defineProps(['currentAirPoint','airPoints'])

@ -114,7 +114,7 @@
<div class="label">航向重叠率</div>
<div class="content">
<!-- -->
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.overlapX"></a-input>
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.overlapX" @blur="onOverlayXChange"></a-input>
</div>
<div class="unit"> % </div>
</div>
@ -122,7 +122,6 @@
<div class="item">
<div class="label">旁向重叠率</div>
<div class="content">
<!-- -->
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.overlapY" @blur="onOverlayYChange"></a-input>
</div>
<div class="unit"> %</div>
@ -141,7 +140,7 @@
<div class="label">主航线角度</div>
<div class="content">
<!-- calculatParam.overlapAngle -->
<a-input type="number" style="width:100px;" placeholder="" v-model:value="calculatParam.overlapAngle" ></a-input>
<a-input type="number" style="width:100px;" placeholder="" v-model:value="props.templateKmlConfig.Folder.Placemark.direction" @blur="onDirectionChange"></a-input>
</div>
<div class="unit"> °</div>
</div>
@ -324,29 +323,40 @@ const calculatParam = ref({
watch(
() => calculatParam.value,
(newVal,oldVal) => {
if(props.editModel != 'add'){
emits("calculatParamChange",newVal)
}
emits("calculatParamChange",newVal)
},
{deep:true}
)
//
if(props.editModel == 'edit'){
if(props.editModel == 'edit' || props.editModel == 'detail'){
// gsd
calculatParam.value.gsd = calculateGsd(props.templateKmlConfig.Folder.Placemark.height,uavModel['m4td']);
// 线
calculatParam.value.overlapAngle = props.templateKmlConfig.Folder.Placemark.direction;
//
calculatParam.value.overlapY = props.templateKmlConfig.Folder?.overlapRate?.lateral ? props.templateKmlConfig.Folder.overlapRate.lateral : 70;
calculatParam.value.overlapX = props.templateKmlConfig.Folder?.overlapRate?.heading ? props.templateKmlConfig.Folder.overlapRate.heading : 80;
}
//
//
calculatParam.value.overlapY = props.templateKmlConfig.Folder?.overlapRate?.lateral ? props.templateKmlConfig.Folder.overlapRate.lateral : 70;
calculatParam.value.overlapX = props.templateKmlConfig.Folder?.overlapRate?.heading ? props.templateKmlConfig.Folder.overlapRate.heading : 80;
// gsd 线
calculatParam.value.height = calculateHeight(calculatParam.value.gsd,uavModel['m4td']);
// 线
calculatParam.value.spacing = calculateSpacing(calculatParam.value.gsd,calculatParam.value.overlapY/100,uavModel['m4td'])
// 线
calculatParam.value.overlapAngle = props.templateKmlConfig.Folder.Placemark.direction;
// gsd
const onGsdChange = ()=>{
@ -362,9 +372,20 @@ const onHeightChange = () => {
//
const onOverlayYChange = ()=>{
props.templateKmlConfig.Folder.overlapRate.lateral = calculatParam.value.overlapY;
calculatParam.value.spacing = calculateSpacing(calculatParam.value.gsd,calculatParam.value.overlapY/100,uavModel['m4td'])
}
//
const onOverlayXChange = () => {
props.templateKmlConfig.Folder.overlapRate.heading = calculatParam.value.overlapX;
}
// 线
const onDirectionChange = ()=>{
calculatParam.value.overlapAngle = props.templateKmlConfig.Folder.Placemark.direction;
}
// 线
const missionConfig = ref(
{
@ -1573,7 +1594,7 @@ const handelrAirPoint = () => {
color:#ffffff;
display:flex;
gap:12px;
line-height:24px;
line-height:0px;
}
.area-info{

@ -319,7 +319,6 @@
border-radius: 3px!important;
}
::v-deep .ant-select-selection-placeholder {
color:rgba(255, 255, 255, 0.533)!important;
}

@ -74,6 +74,9 @@
</a-dropdown>
</div>
</div>
<p class="validate-tooplip" v-if="!submitForm.airLineId && isSubmit" >请选择航线</p>
</a-form-item>
<a-form-item ref="name" label="选择设备" name="name">
@ -88,7 +91,7 @@
<MoreOutlined />
</div>
</div>
<p class="validate-tooplip" v-if="!submitForm.taskDronePort && isSubmit" >请选择设备</p>
</a-form-item>
</div>
@ -251,6 +254,7 @@ const paramValue = router.query.taskid
const formRef = ref();
const labelCol = { span: 24 };
const wrapperCol = { span: 24 };
const isSubmit = ref(false);
const props = defineProps({
"checkedAriLine":{
type:Object
@ -596,9 +600,15 @@ const rules = {
const onSubmit = () => {
formRef.value.validate().then(
isSubmit.value = true;
formRef.value.validate().then(
()=>{
if(!(submitForm.value.airLineId && submitForm.value.taskDronePort)){
return null;
}
if(submitForm.value.taskType == 1){
onOnceTimeChange();
}
@ -1061,4 +1071,10 @@ const extractKmz = async (kmzBlob)=>{
::v-deep .ant-select-selection-search-input::placeholder{
color:red!important;
}
.validate-tooplip{
font-size:15px;
color:#ed6f6f;
padding-top:6px;
}
</style>

@ -199,7 +199,7 @@
// 线
airLineType.value?.forEach((item,idx)=>{
if(item.checked){
airLineInfo.value.airLineType = item.name;
submitForm.value.airLineType = item.name;
}
})
@ -243,8 +243,8 @@
const submitForm = ref({
"id": "",
"airLineName": "", // 线
"airLineType": "waypoint", // 线 templateType waypointmapping2dmappingStrip
"airLineName": null, // 线
"airLineType": "", // 线 templateType waypointmapping2dmappingStrip
"uavId": "",
"flyToFirstPointMode": "", // :flyToWaylineMode safelypointToPoint
"safeTakeoffAltitude": 0, // takeOffSecurityHeight

@ -25,7 +25,7 @@
</div>
<!-- 航面航线 -->
<div v-if="props.airLineForm.airLineType == 'mapping2d'" class="airpolygon-container">
<div v-if="props.airLineForm.airLineType == 'mapping2d'" v-show="props.editMode != 'detail'" class="airpolygon-container">
<airPolygon
:airInfo="airInfo"
:editModel="props.editMode"
@ -52,6 +52,35 @@
@positionChange="positionChange"
></airPointConfig>
</div>
<!-- 航线预览信息 -->
<div class="airline-preview-container" v-if="props.editMode == 'detail'">
<div class="info-item">
<div class="info-value">46461</div>
<div class="info-label">区域面积</div>
</div>
<div class="info-item">
<div class="info-value">46461</div>
<div class="info-label">航线长度</div>
</div>
<div class="info-item">
<div class="info-value">34分钟</div>
<div class="info-label">预计时间</div>
</div>
<div class="info-item">
<div class="info-value">78</div>
<div class="info-label">照片数量</div>
</div>
<div class="info-item">
<div>
<a-button type="primary" danger size="small" @click="exitDraw">
<CloseOutlined />
</a-button>
</div>
<div>关闭</div>
</div>
</div>
<!-- 面绘制 -->
<div class="draw-polygon-patrol" title="绘制面区域" v-if="props.drawArea" @click="handlerDrawPolygonPatrol">
<EditOutlined />
@ -61,6 +90,7 @@
<script lang="ts" setup>
import { ref, onMounted, defineProps, watch, defineEmits, reactive } from 'vue';
import { message } from 'ant-design-vue';
import { CloseOutlined } from '@ant-design/icons-vue';
import { GeojsonToWkt, WktToGeojson } from '@/components/MapboxMaps/src/WktGeojsonTransform';
import { buildUUID } from '@/utils/uuid';
import airPoint from './airPoint.vue';
@ -251,17 +281,18 @@
watch(
() => props.editMode,
(newVal, oldVal) => {
if (newVal == 'edit' || newVal == 'detail') {
// 线
if (props.airLineForm.airLineType == 'waypoint') {
handlerEditWaypointAirLine();
} else if (props.airLineForm.airLineType == 'mapping2d') {
handlerEditPolygonAirLine();
(newVal,oldVal)=>{
if(newVal == 'edit' || newVal == 'detail'){
if(props.airLineForm.airLineType == 'waypoint'){
handlerEditWaypointAirLine();
}else if(props.airLineForm.airLineType == 'mapping2d'){
handlerEditPolygonAirLine();
}
}
},
);
}
)
watch(
() => props.polygonArea,
(newVal, oldVal) => {
@ -990,7 +1021,6 @@
///////////////////////////////线////////////////////////////////////////////
//
const polygonGeoJson = ref();
//
@ -1006,42 +1036,35 @@
//
const handlerDrawPolygon = async () => {
const graphic = await polygonGraphicLayer.startDraw({
type: 'polygon',
style: {
color: '#408eff',
opacity: 0.3,
outline: true,
outlineColor: '#408eff',
outlineWidth: 3.0,
clampToGround: true,
},
});
console.log('graphic1233', graphic.toGeoJSON());
let coordinates = graphic.toJSON().positions;
coordinates.push(coordinates[0]);
polygonGeoJson.value = coordinates;
console.log('polygonGeoJson', polygonGeoJson.value);
let polygon = turf.polygon([coordinates]);
let polygonWkt = GeojsonToWkt(polygon['geometry']);
props.airLineForm.flyToFirstPointMode = polygonWkt;
let spceing = parseFloat(polygonCalculateParams.value?.spacing) / 10000;
let lines = generateScanLines(polygon, spceing, 0);
//
CalculateAreaInfo(polygon, lines);
// 线
handlerDrawPolygonLine(lines);
//
handlerGetPolygonBorderInfo(polygonGeoJson.value);
const graphic = await polygonGraphicLayer.startDraw({
type: 'polygon',
style: {
color: '#408eff',
opacity: 0.3,
outline: true,
outlineColor: '#408eff',
outlineWidth: 3.0,
clampToGround: true,
},
});
let coordinates = graphic.toJSON().positions;
coordinates.push(coordinates[0]);
polygonGeoJson.value = coordinates;
let polygon = turf.polygon([coordinates]);
let polygonWkt = GeojsonToWkt(polygon['geometry']);
props.airLineForm.flyToFirstPointMode = polygonWkt;
// 线
let spceing = parseFloat(polygonCalculateParams.value?.spacing) / 10000;
//
let direction = props.templateKmlConfig.Folder.Placemark.direction ? props.templateKmlConfig.Folder.Placemark.direction : 0;
// 线
let lines = generateScanLines(polygon, spceing, direction);
// 线
CalculateAreaInfo(polygon, lines);
// 线
handlerDrawPolygonLine(lines);
//
handlerGetPolygonBorderInfo(polygonGeoJson.value);
};
//
const handlerDrawPolygonPatrol = async () => {
@ -1056,13 +1079,11 @@
clampToGround: true,
},
});
let coordinates = graphic.toJSON().positions;
coordinates.push(coordinates[0]);
polygonGeoJson.value = coordinates;
emits('areaData', polygonGeoJson.value);
};
// 线
const onPolygonGraphicLayerEdit = (e) => {
let coordinates = e.graphic.toJSON().positions;
@ -1079,7 +1100,8 @@
props.airLineForm.flyToFirstPointMode = polygonWkt;
let spceing = parseFloat(polygonCalculateParams.value?.spacing) / 10000;
let lines = generateScanLines(polygon, spceing, 0);
let direction = props.templateKmlConfig.Folder.Placemark.direction;
let lines = generateScanLines(polygon, spceing, direction);
//
CalculateAreaInfo(polygon, lines);
@ -1445,28 +1467,43 @@
textLabelGraphicLayer.clear();
}
info?.forEach((item, index) => {
//
const handlerLoadtextLabelGraphicLayer = (info) => {
if(textLabelGraphicLayer == null){
textLabelGraphicLayer = new mars3d.layer.GraphicLayer({
isAutoEditing:false
})
map.addLayer(textLabelGraphicLayer);
}else{
textLabelGraphicLayer.clear();
}
info?.forEach((item,index)=>{
const graphic = new mars3d.graphic.LabelEntity({
position: [item.center[0], item.center[1], 0],
style: {
text: item.length + 'm',
font_size: 15,
scale: 1,
font_family: '微软雅黑',
color: '#ffffff',
text: item.length+"m",
font_size: 15,
scale: 1,
font_family: "微软雅黑",
color: "#ffffff",
outline: true,
outlineColor: '#000000',
outlineColor: "#000000",
outlineWidth: 2,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
visibleDepth: false,
clampToGround: true,
clampToGround:true,
},
attr: { remark: '示例1' },
});
textLabelGraphicLayer.addGraphic(graphic);
});
};
attr: { remark: "示例1" }
})
textLabelGraphicLayer.addGraphic(graphic)
})
}
}
// 线
// 线
@ -2956,6 +2993,7 @@
right: 40px;
z-index: 999;
}
.draw-polygon-patrol {
cursor: pointer;
position: absolute;
@ -2973,4 +3011,28 @@
border-image: linear-gradient(180deg, #3661a4, rgba(61, 109, 171, 0.68)) 1 1;
z-index: 2;
}
.airline-preview-container{
width:500px;
background:rgba(0,0,0,0.6);
position: absolute;
bottom:100px;
left:50%;
transform: translate(0%,0);
z-index:999;
border-radius: 10px;
display: flex;
padding:20px;
font-size:18px;
color:#fff;
}
.airline-preview-container .info-item{
flex:1;
text-align: center;
}
.airline-preview-container .info-item .info-label{
font-size:14px;
margin-top:12px;
}
</style>

@ -1,55 +0,0 @@
<template>
<div class="params-item">
<div class="params-label">间隔距离</div>
<div class="params-value">
<a-input-number v-model:value="props.params.hoverTime"></a-input-number>
</div>
<div class="params-unit"></div>
</div>
</template>
<script lang="ts" setup>
import {defineProps,defineComponent,defineOptions} from 'vue';
const props = defineProps(["params"])
defineComponent({
name: 'multipleDistance'
})
</script>
<style scoped>
.params-item{
width:100%;
display: flex;
gap:20px;
}
.params-item .params-label{
line-height:30px;
}
.params-item .params-value{
flex:1;
}
.params-item .params-unit{
line-height:30px;
padding:0px 5px 0px 15px;
}
::v-deep .ant-input-number{
color:#fff!important;
background:#3F4150!important;
border:0px !important;
}
::v-deep .ant-input-number-input{
color:#fff!important;
border:0px !important;
}
</style>

@ -0,0 +1,25 @@
/**
* 线
*/
class Mapping2d {
/**
*
*/
/**
*
*/
/**
*
*/
}
export { Mapping2d }

@ -196,7 +196,7 @@ export const airPointActions = {
"actionTriggerParam": 3
},
"action": {
"actionId": null,
"actionId": 0,
"actionActuatorFunc": "takePhoto",
"actionActuatorFuncParam": {
"payloadPositionIndex": 0,
@ -221,7 +221,7 @@ export const airPointActions = {
"actionTriggerParam": 10
},
"action": {
"actionId": null,
"actionId": 0,
"actionActuatorFunc": "takePhoto",
"actionActuatorFuncParam": {
"payloadPositionIndex": 0,
@ -235,5 +235,6 @@ export const airPointActions = {
"multipleStop":{
"name":"停止间隔拍照",
"value":"multipleStop",
"type":"endMark"
}
}

@ -32,6 +32,10 @@ export const templateKml = {
"Folder": {
"templateType": "mapping2d",
"templateId": 0,
"overlapRate":{
"lateral":77,
"heading":88
},
"waylineCoordinateSysParam": {
"coordinateMode": "WGS84",
"heightMode": "EGM96",
@ -50,7 +54,7 @@ export const templateKml = {
"facadeWaylineEnable": 0,
"isLookAtSceneSet": 0,
"shootType": "time",
"direction": 83,
"direction": 0,
"margin": 0,
"efficiencyFlightModeEnable": 0,
"overlap": {

@ -0,0 +1,72 @@
// vite.config.ts
import { defineApplicationConfig } from "file:///E:/projects/DiKongGanZhiPingTai/internal/vite-config/dist/index.mjs";
import { mars3dPlugin } from "file:///E:/projects/DiKongGanZhiPingTai/node_modules/.pnpm/registry.npmmirror.com+vite-plugin-mars3d@3.1.3_rollup@2.79.2/node_modules/vite-plugin-mars3d/dist/index.js";
var vite_config_default = defineApplicationConfig({
overrides: {
optimizeDeps: {
include: [
"echarts/core",
"echarts/charts",
"echarts/components",
"echarts/renderers",
"qrcode",
"@iconify/iconify",
"ant-design-vue/es/locale/zh_CN",
"ant-design-vue/es/locale/en_US",
"@/../lib/vform/designer.umd.js"
]
},
build: {
/* 其他build生产打包配置省略 */
//...
target: "esnext",
commonjsOptions: {
include: [
/node_modules|lib/,
/node_modules|packages/
]
//这里记得把lib目录加进来否则生产打包会报错
}
},
server: {
proxy: {
"/basic-api": {
target: "http://localhost:3000",
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(new RegExp(`^/basic-api`), "")
// only https
// secure: false
},
"/upload": {
target: "http://localhost:3300/upload",
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(new RegExp(`^/upload`), "")
}
},
warmup: {
clientFiles: ["./index.html", "./src/{views,components}/*"]
}
},
define: {
"process.env": {
BASE_URL: "/"
}
},
css: {
preprocessorOptions: {
less: {
javascriptEnabled: true
}
}
},
plugins: [
mars3dPlugin()
]
}
});
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxwcm9qZWN0c1xcXFxEaUtvbmdHYW5aaGlQaW5nVGFpXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxwcm9qZWN0c1xcXFxEaUtvbmdHYW5aaGlQaW5nVGFpXFxcXHZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi9wcm9qZWN0cy9EaUtvbmdHYW5aaGlQaW5nVGFpL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQXBwbGljYXRpb25Db25maWcgfSBmcm9tICdAdmJlbi92aXRlLWNvbmZpZyc7XG5pbXBvcnQgeyBtYXJzM2RQbHVnaW4gfSBmcm9tIFwidml0ZS1wbHVnaW4tbWFyczNkXCJcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQXBwbGljYXRpb25Db25maWcoe1xuICBvdmVycmlkZXM6IHtcbiAgICBvcHRpbWl6ZURlcHM6IHtcbiAgICAgIGluY2x1ZGU6IFtcbiAgICAgICAgJ2VjaGFydHMvY29yZScsXG4gICAgICAgICdlY2hhcnRzL2NoYXJ0cycsXG4gICAgICAgICdlY2hhcnRzL2NvbXBvbmVudHMnLFxuICAgICAgICAnZWNoYXJ0cy9yZW5kZXJlcnMnLFxuICAgICAgICAncXJjb2RlJyxcbiAgICAgICAgJ0BpY29uaWZ5L2ljb25pZnknLFxuICAgICAgICAnYW50LWRlc2lnbi12dWUvZXMvbG9jYWxlL3poX0NOJyxcbiAgICAgICAgJ2FudC1kZXNpZ24tdnVlL2VzL2xvY2FsZS9lbl9VUycsXG4gICAgICAgICdALy4uL2xpYi92Zm9ybS9kZXNpZ25lci51bWQuanMnLFxuICAgICAgXSxcbiAgICB9LFxuICAgIGJ1aWxkOiB7XG4gICAgICAvKiBcdTUxNzZcdTRFRDZidWlsZFx1NzUxRlx1NEVBN1x1NjI1M1x1NTMwNVx1OTE0RFx1N0Y2RVx1NzcwMVx1NzU2NSAqL1xuICAgICAgLy8uLi5cbiAgICAgIHRhcmdldDogJ2VzbmV4dCcsXG4gICAgICBjb21tb25qc09wdGlvbnM6IHtcbiAgICAgICAgaW5jbHVkZTogW1xuICAgICAgICAgIC9ub2RlX21vZHVsZXN8bGliLyxcbiAgICAgICAgICAvbm9kZV9tb2R1bGVzfHBhY2thZ2VzL1xuICAgICAgICBdIC8vXHU4RkQ5XHU5MUNDXHU4QkIwXHU1Rjk3XHU2MjhBbGliXHU3NkVFXHU1RjU1XHU1MkEwXHU4RkRCXHU2NzY1XHVGRjBDXHU1NDI2XHU1MjE5XHU3NTFGXHU0RUE3XHU2MjUzXHU1MzA1XHU0RjFBXHU2MkE1XHU5NTE5XHVGRjAxXHVGRjAxXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2VydmVyOiB7XG4gICAgICBwcm94eToge1xuICAgICAgICAnL2Jhc2ljLWFwaSc6IHtcbiAgICAgICAgICB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAnLFxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICB3czogdHJ1ZSxcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYF4vYmFzaWMtYXBpYCksICcnKSxcbiAgICAgICAgICAvLyBvbmx5IGh0dHBzXG4gICAgICAgICAgLy8gc2VjdXJlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICAnL3VwbG9hZCc6IHtcbiAgICAgICAgICB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0OjMzMDAvdXBsb2FkJyxcbiAgICAgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsXG4gICAgICAgICAgd3M6IHRydWUsXG4gICAgICAgICAgcmV3cml0ZTogKHBhdGgpID0+IHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKGBeL3VwbG9hZGApLCAnJyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgd2FybXVwOiB7XG4gICAgICAgIGNsaWVudEZpbGVzOiBbJy4vaW5kZXguaHRtbCcsICcuL3NyYy97dmlld3MsY29tcG9uZW50c30vKiddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmluZToge1xuICAgICAgJ3Byb2Nlc3MuZW52Jzoge1xuICAgICAgICBCQVNFX1VSTDogJy8nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNzczoge1xuICAgICAgcHJlcHJvY2Vzc29yT3B0aW9uczoge1xuICAgICAgICBsZXNzOiB7XG4gICAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcGx1Z2luczogW1xuICAgICAgbWFyczNkUGx1Z2luKClcbiAgICBdLFxuICB9LFxufSk7XG5cblxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFxUixTQUFTLCtCQUErQjtBQUM3VCxTQUFTLG9CQUFvQjtBQUU3QixJQUFPLHNCQUFRLHdCQUF3QjtBQUFBLEVBQ3JDLFdBQVc7QUFBQSxJQUNULGNBQWM7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUE7QUFBQSxNQUdMLFFBQVE7QUFBQSxNQUNSLGlCQUFpQjtBQUFBLFFBQ2YsU0FBUztBQUFBLFVBQ1A7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFFBQVE7QUFBQSxNQUNOLE9BQU87QUFBQSxRQUNMLGNBQWM7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLGNBQWM7QUFBQSxVQUNkLElBQUk7QUFBQSxVQUNKLFNBQVMsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sYUFBYSxHQUFHLEVBQUU7QUFBQTtBQUFBO0FBQUEsUUFHL0Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLGNBQWM7QUFBQSxVQUNkLElBQUk7QUFBQSxVQUNKLFNBQVMsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sVUFBVSxHQUFHLEVBQUU7QUFBQSxRQUM1RDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOLGFBQWEsQ0FBQyxnQkFBZ0IsNEJBQTRCO0FBQUEsTUFDNUQ7QUFBQSxJQUNGO0FBQUEsSUFDQSxRQUFRO0FBQUEsTUFDTixlQUFlO0FBQUEsUUFDYixVQUFVO0FBQUEsTUFDWjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUs7QUFBQSxNQUNILHFCQUFxQjtBQUFBLFFBQ25CLE1BQU07QUFBQSxVQUNKLG1CQUFtQjtBQUFBLFFBQ3JCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLGFBQWE7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==
Loading…
Cancel
Save