修改bug

This commit is contained in:
zyl
2025-11-28 10:35:06 +08:00
parent 1b7cba4e87
commit c704df3ead
8 changed files with 192 additions and 49 deletions

View File

@ -0,0 +1,60 @@
// electron.vite.config.ts
import { resolve } from "path";
import { defineConfig, externalizeDepsPlugin } from "electron-vite";
import vue from "@vitejs/plugin-vue";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import path from "path";
var electron_vite_config_default = defineConfig({
main: {
plugins: [externalizeDepsPlugin()]
},
preload: {
plugins: [externalizeDepsPlugin()]
},
renderer: {
resolve: {
alias: {
"@renderer": resolve("src/renderer/src"),
"@": resolve("src/renderer/src")
}
},
plugins: [
vue(),
AutoImport({
imports: ["vue"],
dts: "src/auto-imports.d.ts",
// 自动生成类型声明文件
resolvers: [ElementPlusResolver()]
}),
Components({
resolvers: [ElementPlusResolver()]
}),
// SVG图标插件配置
// 配置SVG图标插件
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), "src/renderer/src/icons/svg")],
symbolId: "icon-[name]",
// 自动清除 SVG 中的 fill 和 stroke 属性
svgoOptions: {
plugins: [{ name: "removeAttrs", params: { attrs: ["fill", "stroke", "stroke-width"] } }]
}
})
]
/*server: {
port: 8848,
proxy: {
'/api': {
target: localStorage.getItem('ip') || 'http://127.0.0.1:8848',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
}*/
}
});
export {
electron_vite_config_default as default
};

View File

@ -33,7 +33,7 @@
>搜索
</el-button>
</div>
<div class="treeBox">
<div class="treeBox custom_scroll_bar_ts">
<ul id="treeDemos" class="ztree"></ul>
<rightMenuTs ref="rightMenuRef" class="absolute zIndex99"></rightMenuTs>
</div>
@ -336,6 +336,10 @@ const onMouseDown = (event: MouseEvent, treeId: string, treeNode: any) => {
}
}
let rightClick = (event: MouseEvent, treeId: string, treeNode: any) => {
if (window['tsObj']._Clock._status == 'play') {
ElMessage({message: "态势推演中,暂停或停止后再试"})
return;
}
let selectNodes = getSelectedNodes(treeObj.value)
let isnewSelect = true //是否为新选中
selectNodes.forEach((item: any) => {
@ -462,6 +466,7 @@ defineExpose({
.treeBox {
//border: 1px solid red;
flex: auto;
overflow-y: auto;
.ztree {
height: 100%;

View File

@ -4,14 +4,12 @@
<div v-for="item in columns" :style="item.style">{{ item.name }}</div>
</div>
<div class="grid-body">
<template v-for="item in 10">
<div :class="['row',(eventObj&&event.id==eventObj.id)?'selectedRow':'']" :style="getStyle"
v-for="(event) in eventList" @click.right="(e)=>{rightClick(e,event)}">
<span v-for="item in columns" :class="item.key" :style="item.style">{{
format(item.key, event[item.key])
}}</span>
</div>
</template>
<div :style="style">
<!--aa-->
@ -137,9 +135,9 @@ const rightClick = (e, eventObj) => {
nextTick(() => {
let parentHeight = parseInt(window.getComputedStyle($(".grid-body")[0]).height)//203
let height = parseInt(window.getComputedStyle($(".gridRightMenu")[0]).height)//65
let maxTop = parentHeight - height//138
$(".gridRightMenu")[0].style.top = e.layerY > maxTop ? maxTop : e.layerY + "px"
let offset = e.layerY > maxTop ? maxTop : e.layerY
$(".gridRightMenu")[0].style.top = offset + "px"
$(".gridRightMenu")[0].style.left = e.layerX + "px"
})
} else {

View File

@ -66,10 +66,10 @@ export const useRightOperate = () => {
// @ts-ignore
let name = getLastPathComponent(item, ['clt', 'json', 'pak', 'kml', 'kmz', 'shp', 'geojson', 'geoJson', 'czml', 'jct', 'mif', 'tab', 'csv']);
let sourceType = "layer";
if (item.endsWith(".clt") || item.endsWith(".json")) {
/* if (item.endsWith(".clt") || item.endsWith(".json")) {
sourceType = "tileset";
} else if (item.endsWith(".pak")) {
sourceType = "Terrain";
sourceType = "terrain";
} else if (item.endsWith(".kml") || item.endsWith(".kmz")) {
sourceType = "kml";
} else if (item.endsWith(".shp")) {
@ -86,7 +86,7 @@ export const useRightOperate = () => {
sourceType = "shp";
} else if (item.endsWith(".csv")) {
sourceType = "csv";
}
}*/
// 获取最后一个点的位置
const lastDotIndex = filePaths[0].lastIndexOf('.');
@ -135,6 +135,7 @@ export const useRightOperate = () => {
let selectedNode = window.treeObj.getNodeByParam('id', parentId)
//
console.log("添加到树上")
cusAddNodes(window.treeObj, selectedNode, [res.data], true)
})
}

View File

@ -18,16 +18,18 @@
<el-icon :size="20" @click="stopCallBack('stop')">
<RefreshLeft/>
</el-icon>
<!--:before-show="handleBeforeShow"-->
<el-popover
ref="multiplierPopover"
placement="top"
:width="92"
trigger="click"
trigger="manual"
:teleported="false"
v-model:visible="isPopoverShow"
popper-style="background: transparent !important;color:#fff;padding:0;min-width:50px"
>
<template #reference>
<span class="">{{ TSOBJ._Store._multiplier }}×</span>
<span class="" @click="handleReferenceClick">{{ TSOBJ._Store._multiplier }}×</span>
</template>
<div class="multiplierBox">
<span v-for="item in multipliers"
@ -89,7 +91,7 @@ import Grid from "./components/grid.vue"
import TimeScale from "./components/timeScale.vue"
import Chart from "./components/chart.vue"
import {ref, onBeforeUnmount, getCurrentInstance} from "vue"
import {ElPopover} from 'element-plus'; // 确保导入ElPopover按需导入时
import {ElMessage, ElPopover} from 'element-plus'; // 确保导入ElPopover按需导入时
// import {dragElement} from "./util/drag.js";
import dragLeftRight from './util/dragLeftRight.js';
@ -103,7 +105,10 @@ if (instance) {
}
// 注册拖拽指令
// 1. 创建ref引用绑定到el-popover组件
const multiplierPopover = ref<InstanceType<typeof ElPopover> | null>(null);
// const multiplierPopover = ref<InstanceType<typeof ElPopover> | null>(null);
const multiplierPopover = ref(null);
// 控制 popover 显示/隐藏的核心变量(替代实例方法)
const isPopoverShow = ref(false);
let multipliers = [16, 8, 4, 2, 1, 0.5, 0.25]
let currentStamp = ref(window['tsObj']._Store._startTimestamp)
let maxLevel = ref(24)
@ -148,6 +153,21 @@ let handleMultiplierChange = (multiplier) => {
props.TSOBJ._Store._multiplier = multiplier
multiplierPopover.value?.hide();
}
const handleReferenceClick = async () => {
// 执行校验逻辑(支持同步/异步)
const canShow = window['tsObj']._Clock._status !== 'play';
console.log(multiplierPopover.value)
if (canShow) {
// 校验通过:手动显示 popover
isPopoverShow.value = true; // 校验通过:显示
} else {
// 校验不通过:提示或不操作
ElMessage.warning("态势推演中,暂停或停止后再试");
// 可选:如果之前显示了,手动隐藏
isPopoverShow.value = false; // 校验通过:显示
}
};
let formatTime = (timeStamp) => {
return props.TSOBJ.parseTime(timeStamp)
}
@ -337,7 +357,10 @@ const handleDrag = (newLeft: number) => {
};
let add = (num) => {
// 大格12个取值小格间距3个取值level8-1
if (window['tsObj']._Clock._status == 'play') {
ElMessage({message: "态势推演中,暂停或停止后再试"})
return;
}
let res = level.value + num
if (res <= maxLevel.value && res >= minLevel.value) {
level.value += num
@ -352,6 +375,7 @@ let add = (num) => {
onBeforeUnmount(() => {
// props.TSOBJ._Clock.stopAnimation()
})
</script>
<style lang="scss" scoped>
@ -486,7 +510,7 @@ onBeforeUnmount(() => {
&::-webkit-scrollbar-thumb {
border-radius: 1em;
background-color: rgb(0 255 255 / 100%);
background-color: rgba(0, 255, 255, 0.5);
}
&::-webkit-scrollbar-track {

View File

@ -29,7 +29,7 @@
</div>
</div>
<div class="panel">
<div class="treeOrList" :style="currentTypeId!=''?'height: calc(100% - 300px);':''">
<div class="treeOrList custom_scroll_bar_ts" :style="currentTypeId!=''?'height: calc(100% - 300px);':''">
<template v-if="dataType=='tree'">
<el-tree
:data="treeData"
@ -44,7 +44,7 @@
</template>
</div>
<div class="list" v-if="currentTypeId!=''">
<div class="list custom_scroll_bar_ts" v-if="currentTypeId!=''">
<div v-for="item in elementList" class="itemBox" @click="addMarker(item)">
<div class="imgbg">
<img :src="service + (item.posterDataUrl||item.militaryDataUrl)"/>
@ -72,6 +72,7 @@ import {GraphApi} from "../../api/graphLabel";
import {addMapSource} from "./entity";
import {useTreeNode} from "../components/tree/hooks/treeNode";
import {ElMessage} from "element-plus";
const {getSelectedNodes} = useTreeNode()
const service = ref(localStorage.getItem('ip'))
@ -185,6 +186,10 @@ let getGraphTypeList = async () => {
}
// 添加标绘
let addMarker = (item) => {
if (window['tsObj']._Clock._status == 'play') {
ElMessage({message: "态势推演中,暂停或停止后再试"})
return;
}
let nodes = getSelectedNodes(window['treeObj'])
console.log("绘制", item)
console.log("获取选中的节点", nodes)

View File

@ -42,6 +42,7 @@ export function initMapData(type, data, cb: any = null) {
case 'terrain':
data.host = baseURL
entityObject = new YJ.Obj.Terrain(window['earth_ts'], data)
cb && cb(entityObject)
break
case 'tileset':
data.host = baseURL

View File

@ -75,7 +75,7 @@
</el-form>
<div class="optionbtn">
<el-button @click="addEvent">确定</el-button>
<el-button @click="isShowPup=false">取消</el-button>
<el-button @click="()=>{isShowPup=false,reset()}">取消</el-button>
</div>
</template>
@ -150,7 +150,7 @@ const defaultProps = {
}
const handleNodeClick = (data: Tree, node, TreeNode, event) => {
console.log(data)
reset()
reset(true)
currentKey.value = data.id; // data.id 为节点的唯一 key需与 tree 的 node-key 对应)
form.name = data.name + '-' + zNode.value.sourceName
}
@ -165,17 +165,32 @@ const addEvent = () => {
let startTime = form.datetime.getTime()
let obj: any = {}
let duration_S = (hour.value * 3600 + minute.value * 60 + second.value) * 1
// 数据是否合法有效
let isRight = true
let errorFields = []//数据错误的字段
let minPositionLength = 2
switch (currentKey.value) {
case 'flicker':
if (duration_S == 0) {
isRight = false
errorFields.push("持续时间")
}
if (obj.numbers == 0) {
isRight = false
errorFields.push("闪烁次数")
}
if (isRight) {
obj.numbers = numbers.value
obj.times = Number((duration_S / obj.numbers).toFixed(2))
}
break
case 'move':
let detail = typeof zNode.value.detail == 'string' ? JSON.parse(zNode.value.detail) : JSON.parse(JSON.stringify(zNode.value.detail))
let position = [...positions.value]
if (isContainModelPosition.value) {
position.unshift(detail.positions || detail.position || detail.center)
minPositionLength = 3
}
positions.value = position;
obj = {
@ -190,13 +205,27 @@ const addEvent = () => {
},
isContainModelPosition: isContainModelPosition.value
}
if (!obj.line['positions'] || (obj.line['positions'] && obj.line['positions'].length < minPositionLength)) {
// ElMessage({message: "机动事件的路径不合法", type: "warning"})
isRight = false
errorFields.push("路径点位")
}
if (duration_S == 0) {
isRight = false
errorFields.push("持续时间")
}
break
}
// 当事件为机动事件且轨迹点的长度为0时终止
if (obj['positions'] && obj['positions'].length == 0) {
ElMessage({message: "机动事件的路径不合法", type: "warning"})
return
if (!isRight) {
// ElMessage({message: "机动事件的路径不合法", type: "warning"})
let eventType = form.name.split("-")[0] + "事件"
ElMessage({message: eventType + errorFields.join("、") + "数据不合法", type: "warning"})
return;
}
// console.log("数据校验通过")
let dbParams = {
id: new YJ.Tools().randomString(),
@ -237,7 +266,7 @@ const addEvent = () => {
})
console.log(dbParams)
}
const reset = () => {
const reset = (changeEventType = false) => {
hour.value = 0
minute.value = 0
second.value = 0
@ -248,7 +277,27 @@ const reset = () => {
form['datetime'] = new Date(window['tsObj']._Store._currentTimestamp)
currentKey.value = "flicker"
console.log("changeEventType", changeEventType)
if (!changeEventType)
eventTree.value = [
{
id: "normal",
label: '常用推演事件',
children: [
{
id: "display",
label: '显示事件',
name: '显示'
},
{
id: "hide",
label: '隐藏事件',
name: '隐藏'
},
],
}
]
}
eventBus.on('openAddEvent', (data, cb, type) => {
if (['point', "model", "military"].includes(data.sourceType))
@ -262,8 +311,8 @@ eventBus.on('openAddEvent', (data, cb, type) => {
label: '机动事件',
name: '机动'
},]
console.log("openAddEvent", data)
console.log("openAddEvent", eventTree.value[0].children[0])
// console.log("openAddEvent", data)
// console.log("openAddEvent", eventTree.value[0].children[0])
// selectCallback = cb
// addType.value = type
zNode.value = data