This commit is contained in:
2025-12-03 11:02:26 +08:00
74 changed files with 997 additions and 675 deletions

2
.gitignore vendored
View File

@ -2,6 +2,8 @@ node_modules
dist dist
build build
out out
resources
ffplay
.history .history
.DS_Store .DS_Store
.vscode .vscode

View File

@ -1 +0,0 @@
41b/ujShRZRf9Aa433FD3uyIZuxWSSqXWXlc2dyQfJ75ED0HNbadcdsPF5CaMuJ624E+iLBfS14muki3Kp1qv3N0KPVdc0TjJDyrO+AVfwE3xW3RZy00SBFwUgG/tIU6bBTw4XijzGn57R1nl7djDeP1sx04fzNeWSLujfPS4hzwLryTr1ScTPGegLiv1C+rXsbkAxFf47uMIGGK0M2VBZTA9+UoajQ1PHwDUdI7Sfo2JRzkCFW8v6WI1jCNPaFyLypkZtybW+yeNEhnp/jeYw==

View File

@ -1 +0,0 @@
41b/ujShRZRf9Aa433FD3uyIZuxWSSqXWXlc2dyQfJ75ED0HNbadcdsPF5CaMuJ624E+iLBfS14muki3Kp1qv3N0KPVdc0TjJDyrO+AVfwE3xW3RZy00SBFwUgG/tIU6bBTw4XijzGn57R1nl7djDeP1sx04fzNeWSLujfPS4hzwLryTr1ScTPGegLiv1C+rXsbkAxFf47uMIGGK0M2VBZTA9+UoajQ1PHwDUdI7Sfo2JRzkCFW8v6WI1jCNPaFyLypkZtybW+yeNEhnp/jeYw==1

View File

@ -1 +0,0 @@
41b/ujShRZRf9Aa433FD3uyIZuxWSSqXWXlc2dyQfJ75ED0HNbadcdsPF5CaMuJ624E+iLBfS14muki3Kp1qv3N0KPVdc0TjJDyrO+AVfwE3xW3RZy00SBFwUgG/tIU6bBTw4XijzGn57R1nl7djDeP1sx04fzNeWSLujfPS4hzwLryTr1ScTPGegLiv1C+rXsbkAxFf47uMIGGK0M2VBZTA9+UoajQ1PHwDUdI7Sfo2JRzkCFW8v6WI1jCNPaFyLypkZtybW+yeNEhnp/jeYw==

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 MiB

View File

@ -128,6 +128,19 @@ function createWindow(): void {
allowRunningInsecureContent: true allowRunningInsecureContent: true
} }
}) })
mainWindow.webContents.on('before-input-event', (event, input) => {
// 条件:仅按了 Alt 键(无其他键组合、不是组合键、不是重复按键)
if (
input.key === 'Alt' && // 按键是 Alt
!input.ctrl && // 未按 Ctrl
!input.shift && // 未按 Shift
!input.meta && // 未按 MetaWin/Mac
!input.isComposing && // 非输入法组合态
input.type === 'keyDown' // 仅拦截按下事件
) {
event.preventDefault(); // 阻止 Alt 键的默认行为(激活菜单)
}
});
let ymlBatPath = process.env.NODE_ENV === 'development' ? path.resolve(app.getAppPath(), 'resources', 'java', 'app', 'application.yml') : path.join(process.resourcesPath, 'app.asar.unpacked', 'resources', 'java', 'app', 'application.yml') let ymlBatPath = process.env.NODE_ENV === 'development' ? path.resolve(app.getAppPath(), 'resources', 'java', 'app', 'application.yml') : path.join(process.resourcesPath, 'app.asar.unpacked', 'resources', 'java', 'app', 'application.yml')
ymlBatPath = process.platform === 'win32' ? ymlBatPath.replace(/^(\w:)/, '/$1') : ymlBatPath ymlBatPath = process.platform === 'win32' ? ymlBatPath.replace(/^(\w:)/, '/$1') : ymlBatPath
let ymlPath = ymlBatPath.substring(1, 200) let ymlPath = ymlBatPath.substring(1, 200)
@ -457,6 +470,19 @@ function createWindow(): void {
}); });
// 6. 记录窗口映射 // 6. 记录窗口映射
newWindow.webContents.on('before-input-event', (event, input) => {
// 条件:仅按了 Alt 键(无其他键组合、不是组合键、不是重复按键)
if (
input.key === 'Alt' && // 按键是 Alt
!input.ctrl && // 未按 Ctrl
!input.shift && // 未按 Shift
!input.meta && // 未按 MetaWin/Mac
!input.isComposing && // 非输入法组合态
input.type === 'keyDown' // 仅拦截按下事件
) {
event.preventDefault(); // 阻止 Alt 键的默认行为(激活菜单)
}
});
_winMap.set(id, newWindow.id); _winMap.set(id, newWindow.id);
return _winMap; return _winMap;
@ -663,7 +689,10 @@ if (!gotTheLock) {
let string = data.toString().trim() let string = data.toString().trim()
// console.log(`批处理输出: ${string}`); // console.log(`批处理输出: ${string}`);
// 临时处理:应用启动失败或项目文档地址出现时,认为服务初始化完成;后续需后端配合 // 临时处理:应用启动失败或项目文档地址出现时,认为服务初始化完成;后续需后端配合
if (string.indexOf('APPLICATION FAILED TO START') !== -1 || string.indexOf('项目文档地址') !== -1) { if (string.indexOf('APPLICATION FAILED TO START') !== -1) {
mainWindow.webContents.send('program-init', '后端服务未正常启动,尝试更换地址或端口')
}
else if (string.indexOf('项目文档地址') !== -1) {
if (!isSeverInit) { if (!isSeverInit) {
isSeverInit = true isSeverInit = true
if (isAppInit) { if (isAppInit) {

View File

@ -178,6 +178,7 @@
color: rgba(var(--color-base1), 1) !important; color: rgba(var(--color-base1), 1) !important;
cursor: pointer; cursor: pointer;
} }
.YJ-custom-base-dialog button:not(button[disabled]):hover svg { .YJ-custom-base-dialog button:not(button[disabled]):hover svg {
fill: rgba(var(--color-base1), 1) !important; fill: rgba(var(--color-base1), 1) !important;
} }
@ -341,7 +342,7 @@
.YJ-custom-base-dialog>.content input, .YJ-custom-base-dialog>.content input,
.YJ-custom-base-dialog>.content textarea { .YJ-custom-base-dialog>.content textarea {
font-size: 16px; font-size: 14px;
background-color: rgba(0, 0, 0, 0.5); background-color: rgba(0, 0, 0, 0.5);
border: 1px solid rgba(var(--color-base1), 0.5); border: 1px solid rgba(var(--color-base1), 0.5);
border-radius: 5px; border-radius: 5px;
@ -2534,8 +2535,8 @@
.YJ-custom-base-dialog.polygon>.content .attribute-content-vr .table .tr .td:nth-child(3), .YJ-custom-base-dialog.polygon>.content .attribute-content-vr .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.polygon>.content .attribute-content-rtmp .table .tr .th:nth-child(3), .YJ-custom-base-dialog.polygon>.content .attribute-content-rtmp .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.polygon>.content .attribute-content-rtmp .table .tr .td:nth-child(3) { .YJ-custom-base-dialog.polygon>.content .attribute-content-rtmp .table .tr .td:nth-child(3) {
flex: 0 0 165px; flex: 0 0 175px;
width: 165px; width: 175px;
justify-content: center; justify-content: center;
} }
@ -2618,8 +2619,8 @@
.YJ-custom-base-dialog.assemble>.content .attribute-content-vr .table .tr .td:nth-child(3), .YJ-custom-base-dialog.assemble>.content .attribute-content-vr .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.assemble>.content .attribute-content-rtmp .table .tr .th:nth-child(3), .YJ-custom-base-dialog.assemble>.content .attribute-content-rtmp .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.assemble>.content .attribute-content-rtmp .table .tr .td:nth-child(3) { .YJ-custom-base-dialog.assemble>.content .attribute-content-rtmp .table .tr .td:nth-child(3) {
flex: 0 0 165px; flex: 0 0 175px;
width: 165px; width: 175px;
justify-content: center; justify-content: center;
} }
@ -2678,8 +2679,8 @@
.YJ-custom-base-dialog.pincerArrow>.content .attribute-content-vr .table .tr .td:nth-child(3), .YJ-custom-base-dialog.pincerArrow>.content .attribute-content-vr .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.pincerArrow>.content .attribute-content-rtmp .table .tr .th:nth-child(3), .YJ-custom-base-dialog.pincerArrow>.content .attribute-content-rtmp .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.pincerArrow>.content .attribute-content-rtmp .table .tr .td:nth-child(3) { .YJ-custom-base-dialog.pincerArrow>.content .attribute-content-rtmp .table .tr .td:nth-child(3) {
flex: 0 0 165px; flex: 0 0 175px;
width: 165px; width: 175px;
justify-content: center; justify-content: center;
} }
@ -2761,7 +2762,7 @@
/* 折线 */ /* 折线 */
.YJ-custom-base-dialog.polyline>.content { .YJ-custom-base-dialog.polyline>.content {
width: 580px; width: 600px;
} }
.YJ-custom-base-dialog.polyline>.content>div #dashTextureDom { .YJ-custom-base-dialog.polyline>.content>div #dashTextureDom {
@ -3796,7 +3797,7 @@
.yj-custom-icon { .yj-custom-icon {
display: inline-block; display: inline-block;
width: 22px; width: 22px;
height: 10px; height: 18px;
margin-right: 5px; margin-right: 5px;
} }

View File

@ -80,16 +80,16 @@ window.newFuzzySearch = function (
hideAllNode(allNodes) hideAllNode(allNodes)
nodeChildren.forEach((item) => { nodeChildren.forEach((item) => {
if (item.oldname) { if (item.oldname) {
item.sourceName = item.oldname item.sourceName = item.oldname + ''
zTreeObj.updateNode(item) zTreeObj.updateNode(item)
} }
if (contrast) { if (contrast) {
if ((item.sourceName || '').indexOf(contrast) > -1) { if (((item.sourceName || '')+'').indexOf(contrast) > -1) {
console.log('sourceName包含关键字') console.log('sourceName包含关键字')
console.log(item) console.log(item)
console.log(item.sourceName) console.log(item.sourceName)
item.oldname = item.sourceName item.oldname = item.sourceName + ''
item.highlight = true item.highlight = true
let F = new RegExp(contrast, 'gi') let F = new RegExp(contrast, 'gi')
item.sourceName = item.oldname.replace(F, function (h) { item.sourceName = item.oldname.replace(F, function (h) {

View File

@ -263,6 +263,8 @@ export default {
rtmp: 'rtmp', rtmp: 'rtmp',
: '物资', : '物资',
: '编辑内容', : '编辑内容',
: '请输入设备名称进行搜索',
: '请输入物资名称进行搜索',
: '打开文本编辑器', : '打开文本编辑器',
: '添加链接', : '添加链接',
: '名称', : '名称',

View File

@ -47,16 +47,16 @@ export default {
excel: 'Excel' excel: 'Excel'
}, },
firstMenu: { firstMenu: {
measure: 'measure', measure: 'Measure',
tool: 'tool', tool: 'Tool',
effect: 'effect', effect: 'Special effects',
bigData: 'bigData', bigData: 'bigData',
modelLibrary: 'modelLibrary', modelLibrary: 'Model',
situation: 'situationLibrary', situation: 'Scheme',
onlinePictureSource: 'onlinePictureSource', onlinePictureSource: 'onlinePictureSource',
analysis: 'analysis', analysis: 'Analyze',
militaryMark: 'militaryMark', militaryMark: 'militaryMark',
ersanwei: 'two and three-dimensional', ersanwei: '2D/3D',
junbiao3d: '3D military logo' junbiao3d: '3D military logo'
}, },
effect: { effect: {
@ -155,7 +155,8 @@ export default {
authorize: 'Authorization Information', authorize: 'Authorization Information',
setting: 'System settings', setting: 'System settings',
project: 'Engineering Information', project: 'Engineering Information',
device: 'device management', device: 'Device management',
materials: 'Materials management',
modelManage: 'Model management', modelManage: 'Model management',
graphLabelManage: 'Military Icon Management', graphLabelManage: 'Military Icon Management',
photoManage: 'Icon Management', photoManage: 'Icon Management',
@ -262,6 +263,8 @@ export default {
rtmp: 'rtmp', rtmp: 'rtmp',
: 'Materials', : 'Materials',
: 'Edit content', : 'Edit content',
: 'Please enter the device name to search',
: 'Please enter the materials name to search',
: 'Open the editor', : 'Open the editor',
: 'Add Link', : 'Add Link',
: 'Name', : 'Name',

View File

@ -155,6 +155,7 @@ export default {
setting: '系統設置', setting: '系統設置',
project: '工程管理', project: '工程管理',
device: '設備管理', device: '設備管理',
materials: '物資管理',
modelManage: '模型管理', modelManage: '模型管理',
graphLabelManage: '軍標管理', graphLabelManage: '軍標管理',
photoManage: '圖標管理', photoManage: '圖標管理',
@ -261,6 +262,8 @@ export default {
rtmp: 'rtmp', rtmp: 'rtmp',
: '物資', : '物資',
: '編輯內容', : '編輯內容',
: '請輸入設備名稱進行搜索',
: '請輸入物資名稱進行搜索',
: '打開文本編輯器', : '打開文本編輯器',
: '添加鏈接', : '添加鏈接',
: '名稱', : '名稱',

View File

@ -44,7 +44,7 @@ export const GraphApi = {
}) })
}, },
//军标类型列表 //军标类型列表
modelTypeList: async (data: any) => { modelTypeList: async (data: any = {}) => {
return await request.get({ return await request.get({
url: `/militaryLibrary/militaryTypeTree`, url: `/militaryLibrary/militaryTypeTree`,
params: data, params: data,

View File

@ -44,7 +44,7 @@ export const ModelApi = {
}) })
}, },
//模型类型列表 //模型类型列表
modelTypeList: async (data: any) => { modelTypeList: async (data: any = {}) => {
return await request.get({ return await request.get({
url: `/modelLibrary/modelTypeList`, url: `/modelLibrary/modelTypeList`,

View File

@ -1,3 +1,4 @@
// @ts-nocheck
import request from '@/axios/request' import request from '@/axios/request'
//图标库 //图标库
export const PhotoApi = { export const PhotoApi = {
@ -44,7 +45,7 @@ export const PhotoApi = {
}) })
}, },
//图标类型列表 //图标类型列表
modelTypeList: async (data: any) => { modelTypeList: async (data?: any) => {
return await request.get({ return await request.get({
url: `/iconLibrary/iconTypeTree`, url: `/iconLibrary/iconTypeTree`,
params: data, params: data,

View File

@ -27,6 +27,7 @@ export const TreeApi = {
url: `/source/addOtherSource`, url: `/source/addOtherSource`,
data data
}).then((res) => { }).then((res) => {
ElMessage.closeAll()
ElMessage({ ElMessage({
message: '添加成功', message: '添加成功',
type: 'success' type: 'success'
@ -50,6 +51,7 @@ export const TreeApi = {
url: `/source/update`, url: `/source/update`,
data data
}).then((res) => { }).then((res) => {
ElMessage.closeAll()
ElMessage({ ElMessage({
message: '操作成功', message: '操作成功',
type: 'success' type: 'success'

View File

@ -44,12 +44,12 @@ service.interceptors.request.use(
const key = getRequestKey(config) const key = getRequestKey(config)
// 检查是否有相同请求正在进行 // 检查是否有相同请求正在进行
if (pendingRequests.has(key)) { // if (pendingRequests.has(key)) {
ElMessage({ // ElMessage({
message: '当前请求已存在,请稍后再试', // message: '当前请求已存在,请稍后再试',
type: 'warning' // type: 'warning'
}) // })
} // }
const controller = new AbortController() const controller = new AbortController()
config.signal = controller.signal config.signal = controller.signal

View File

@ -2,12 +2,12 @@ import {TreeApi} from '@/api/tree'
import { useTreeNode } from '../views/components/tree/hooks/treeNode' import { useTreeNode } from '../views/components/tree/hooks/treeNode'
import { initMapData } from './initMapData' import { initMapData } from './initMapData'
export const addMapSource = async ({type, id, sourceName = '未命名对象', opt = {}}) => { export const addMapSource = async ({ type, id, sourceName = '未命名对象', opt = {} }, cd:any = null) => {
const { cusAddNodes } = useTreeNode() const { cusAddNodes } = useTreeNode()
if (!id) { if (!id) {
id = new YJ.Tools().randomString() id = new YJ.Tools().randomString()
} }
let options: any = await initMapData(type, opt, null) let options: any = await initMapData(type, opt, cd)
let selectedNodes = window.treeObj.getSelectedNodes() let selectedNodes = window.treeObj.getSelectedNodes()
let node = selectedNodes && selectedNodes[selectedNodes.length - 1] let node = selectedNodes && selectedNodes[selectedNodes.length - 1]
function getParentId(nd: any) { function getParentId(nd: any) {

View File

@ -20,6 +20,7 @@ export const initMapData = async (type, data, cd) => {
case 'vrImage': case 'vrImage':
console.log(data, 'dataccccc') console.log(data, 'dataccccc')
entityObject = new YJ.Obj.BillboardObject(window.earth, data) entityObject = new YJ.Obj.BillboardObject(window.earth, data)
cd && cd(entityObject)
console.log('entityObject', entityObject) console.log('entityObject', entityObject)
// entityObject.options.billboard.defaultImage = '' // entityObject.options.billboard.defaultImage = ''
break break
@ -62,11 +63,12 @@ export const initMapData = async (type, data, cd) => {
case 'terrain': case 'terrain':
data.host = baseURL data.host = baseURL
entityObject = new YJ.Obj.Terrain(window.earth, data) entityObject = new YJ.Obj.Terrain(window.earth, data)
cd && cd(entityObject)
break break
case 'layer': case 'layer':
data.host = baseURL data.host = baseURL
console.log('layer', data)
entityObject = new YJ.Obj.Layer(window.earth, data) entityObject = new YJ.Obj.Layer(window.earth, data)
cd && cd(entityObject)
break break
case 'gdslImagery': case 'gdslImagery':
data.host = baseURL data.host = baseURL
@ -177,11 +179,14 @@ export const initMapData = async (type, data, cd) => {
break break
case 'geojson': case 'geojson':
entityObject = new YJ.Obj.GeoJson(window.earth, data) entityObject = new YJ.Obj.GeoJson(window.earth, data)
entityObject.on() entityObject.on().then(()=>{
cd && cd(entityObject)
})
break break
case 'vector': case 'vector':
let node = window.treeObj.getNodeByParam("id", data.id, null); let node = window.treeObj.getNodeByParam("id", data.id, null);
entityObject = renderVector(node, false) entityObject = renderVector(node, false)
cd && cd(entityObject)
break break
default: default:
break break

View File

@ -201,8 +201,8 @@ const moveDiv = () => {
newLeft = windowWidth - oMoveDivWidth newLeft = windowWidth - oMoveDivWidth
} }
if (newTop <= 0) { if (newTop <= 97) {
newTop = 0 newTop = 97
} else if (newTop + oMoveDivHeight > windowHeight) { } else if (newTop + oMoveDivHeight > windowHeight) {
newTop = windowHeight - oMoveDivHeight newTop = windowHeight - oMoveDivHeight
} }

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -1,6 +1,6 @@
<!--:style="'left:'+(index*Store.scales.distanceOfTicTiny+Store.scales.originOffset)+'px'"--> <!--:style="'left:'+(index*Store.scales.distanceOfTicTiny+Store.scales.originOffset)+'px'"-->
<template> <template>
<div class="timeScale" @click="clickTime"> <div class="timeScale" @click="clickTime" @wheel="wheel">
<!-- 循环数组确保key唯一 --> <!-- 循环数组确保key唯一 -->
<template v-for="(_, index) in ticTiny" :key="index"> <template v-for="(_, index) in ticTiny" :key="index">
<span <span
@ -23,13 +23,19 @@
import {ref, watchEffect} from 'vue' import {ref, watchEffect} from 'vue'
const props = defineProps(['ticTiny', 'ticMain', 'distanceOfTicTiny', 'distanceOfTicMain', 'originOffset', 'originMainOffset']) const props = defineProps(['ticTiny', 'ticMain', 'distanceOfTicTiny', 'distanceOfTicMain', 'originOffset', 'originMainOffset'])
const eventBus: any = inject('bus')
const clickTime = (e) => { const clickTime = (e) => {
console.log("点击时间轴", e) console.log("点击时间轴", e)
let offset = window['tsObj']._Store._scales.scrollLeft + (e.screenX - 400) let offset = window['tsObj']._Store._scales.scrollLeft + (e.screenX - 400)
window['tsObj']._Store.currentTimestamp = window['tsObj']._Store._startTimestamp + (offset / window['tsObj']._Store._scales.preSecondPx) * 1000 window['tsObj']._Store.currentTimestamp = window['tsObj']._Store._startTimestamp + (offset / window['tsObj']._Store._scales.preSecondPx) * 1000
window['tsObj']._Store.setCursorLeft(window['tsObj']._Store._currentTimestamp) window['tsObj']._Store.setCursorLeft(window['tsObj']._Store._currentTimestamp)
} }
const wheel = (event) => {
let num = event.wheelDelta > 0 ? 1 : -1;
eventBus.emit('wheel-time', num)
}
let ticLabel = (val) => { let ticLabel = (val) => {
let timeLabels = [] let timeLabels = []
/* console.log("timeLabels", this.Store.scales.ticMain) /* console.log("timeLabels", this.Store.scales.ticMain)

View File

@ -84,6 +84,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
// @ts-nocheck
import {ZoomIn, ZoomOut, VideoPlay, VideoPause, RefreshLeft} from '@element-plus/icons-vue' import {ZoomIn, ZoomOut, VideoPlay, VideoPause, RefreshLeft} from '@element-plus/icons-vue'
import EventParams from "./components/eventParams.vue" import EventParams from "./components/eventParams.vue"
@ -106,7 +107,7 @@ if (instance) {
// 注册拖拽指令 // 注册拖拽指令
// 1. 创建ref引用绑定到el-popover组件 // 1. 创建ref引用绑定到el-popover组件
// const multiplierPopover = ref<InstanceType<typeof ElPopover> | null>(null); // const multiplierPopover = ref<InstanceType<typeof ElPopover> | null>(null);
const multiplierPopover = ref(null); const multiplierPopover: any = ref(null);
// 控制 popover 显示/隐藏的核心变量(替代实例方法) // 控制 popover 显示/隐藏的核心变量(替代实例方法)
const isPopoverShow = ref(false); const isPopoverShow = ref(false);
let multipliers = [16, 8, 4, 2, 1, 0.5, 0.25] let multipliers = [16, 8, 4, 2, 1, 0.5, 0.25]
@ -357,6 +358,12 @@ const handleDrag = (newLeft: number) => {
}*/ }*/
}; };
let add = (num) => { let add = (num) => {
// 不存在事件时,缩放无效
if (window['tsObj']._Store._tasks.length == 0) {
ElMessage({type: "warning", message: "不存在事件时,禁止操作"})
return;
}
// 大格12个取值小格间距3个取值level8-1 // 大格12个取值小格间距3个取值level8-1
if (window['tsObj']._Clock._status == 'play') { if (window['tsObj']._Clock._status == 'play') {
ElMessage({message: "态势推演中,暂停或停止后再试"}) ElMessage({message: "态势推演中,暂停或停止后再试"})
@ -376,7 +383,10 @@ let add = (num) => {
onBeforeUnmount(() => { onBeforeUnmount(() => {
// props.TSOBJ._Clock.stopAnimation() // props.TSOBJ._Clock.stopAnimation()
}) })
eventBus.on('wheel-time', (num) => {
console.log("wheel", num)
add(num)
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -42,7 +42,6 @@
<mouseRight></mouseRight> <mouseRight></mouseRight>
<!-- 方案描述编辑框 --> <!-- 方案描述编辑框 -->
<!--<div class="dialogBox">-->
<el-dialog width="20vw" v-model="isShowPup" :modal="false" draggable> <el-dialog width="20vw" v-model="isShowPup" :modal="false" draggable>
<template #header> <template #header>
<div class="set_pup_header"> <div class="set_pup_header">
@ -100,12 +99,74 @@
<div class="set_detail"> <div class="set_detail">
<el-input type="textarea" :rows="7" v-model="des_detail"></el-input> <el-input type="textarea" :rows="7" v-model="des_detail"></el-input>
</div> </div>
<div style="text-align: right;"> <div style="text-align: right;margin-top: 15px">
<el-button @click="submit">保存</el-button> <el-button @click="submit">保存</el-button>
<el-button @click="isShowPup=false">取消</el-button> <el-button @click="isShowPup=false">取消</el-button>
</div> </div>
</el-dialog> </el-dialog>
<!--</div>--> <!-- 立体文字内容 -->
<el-dialog width="30vw" v-model="showStandText" :modal="false" draggable>
<template #header>
<div class="set_pup_header">
<div class="system_title">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="229" height="35"
viewBox="0 0 229 35" fill="none" preserveAspectRatio="none">
<path
d="M74 34L85 34L99.5 6L88.5 6L74 34ZM92 34L103 34L117.5 6L106.5 6L92 34ZM111 34L122 34L136.5 6L125.5 6L111 34ZM140 34L129 34L143.5 6L154.5 6L140 34ZM148 34L159 34L173.5 6L162.5 6L148 34ZM177 34L166 34L180.5 6L191.5 6L177 34ZM185 34L196 34L210.5 6L199.5 6L185 34ZM214 34L203 34L217.5 6L228.5 6L214 34ZM0 34L11 34L25.5 6.5L14.5 6.5L0 34ZM18 34L29 34L43.5 6.5L32.5 6.5L18 34ZM37 34L48 34L62.5 6.5L51.5 6.5L37 34ZM66 34L55 34L69.5 6.5L80.5 6.5L66 34Z"
fill-rule="evenodd" fill="url(#linear_fill_2442_1053)"/>
<rect x="0" y="0" width="229" height="34" fill="url(#linear_fill_2442_1054)"/>
<g clip-path="url(#clip-path-2442_1055)">
<path
d="M10.3993 32.7333L10.666 33L10.666 21L9.33267 22.3333L4.66602 27L5.66602 28L10.3993 32.7333ZM9.33267 29.6667L6.73267 27L9.33267 24.3333L9.33267 29.6667Z"
fill="rgb(var(--color-base1))"/>
<g opacity="0.5">
<path
d="M7.39934 32.7333L7.66602 33L7.66602 21L6.33267 22.3333L1.66602 27L2.66602 28L7.39934 32.7333ZM6.33267 29.6667L3.73267 27L6.33267 24.3333L6.33267 29.6667Z"
fill="rgb(var(--color-base1))"/>
</g>
</g>
<g clip-path="url(#clip-path-2442_1059)">
<path
d="M218.601 32.7333L218.334 33L218.334 21L219.667 22.3333L224.334 27L223.334 28L218.601 32.7333ZM219.667 29.6667L222.267 27L219.667 24.3333L219.667 29.6667Z"
fill="rgb(var(--color-base1))"/>
<g opacity="0.5">
<path
d="M221.601 32.7333L221.334 33L221.334 21L222.667 22.3333L227.334 27L226.334 28L221.601 32.7333ZM222.667 29.6667L225.267 27L222.667 24.3333L222.667 29.6667Z"
fill="rgb(var(--color-base1))"/>
</g>
</g>
<defs>
<linearGradient id="linear_fill_2442_1053" x1="119.1239013671875" y1="33.99998474121094"
x2="119.1231689453125" y2="6" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="rgb(var(--color-base1))" stop-opacity="0.2"/>
<stop offset="1" stop-color="rgb(var(--color-base1))" stop-opacity="0"/>
</linearGradient>
<linearGradient id="linear_fill_2442_1054" x1="0" y1="17" x2="229" y2="17"
gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="rgb(var(--color-base1))" stop-opacity="0"/>
<stop offset="0.4891" stop-color="rgb(var(--color-base1))" stop-opacity="0.4"/>
<stop offset="1" stop-color="rgb(var(--color-base1))" stop-opacity="0"/>
</linearGradient>
<clipPath id="clip-path-2442_1055">
<path d="M0 19L0 35L16 35L16 19L0 19Z" fill="white"/>
</clipPath>
<clipPath id="clip-path-2442_1059">
<path d="M229 19L229 35L213 35L213 19L229 19Z" fill="white"/>
</clipPath>
</defs>
</svg>
立体文字
</div>
</div>
</template>
<div class="set_detail">
<el-input type="textarea" v-model="standText"></el-input>
</div>
<div style="text-align: right;margin-top: 15px">
<el-button @click="()=>{submitStandText(true)}">保存</el-button>
<el-button @click="()=>{submitStandText(false)}">取消</el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
@ -128,7 +189,10 @@ import {$changeComponentShow} from "../../utils/communication";
const planInfo = ref({}) const planInfo = ref({})
const isShowPup = ref(false) const isShowPup = ref(false)
const showStandText = ref(false)
const currentDrawItem = ref({})
const des_detail = ref("") const des_detail = ref("")
const standText = ref("")
const stamp = ref("") const stamp = ref("")
const rightMenus = ref([ const rightMenus = ref([
@ -200,6 +264,16 @@ let submit = () => {
isShowPup.value = false isShowPup.value = false
}) })
} }
let submitStandText = (flag) => {
showStandText.value = false
/* let res = {
currentDrawItem: currentDrawItem.value,
source_name: flag ? standText.value : ""
}*/
currentDrawItem.value.source_name = flag ? standText.value : ""
eventBus.emit('standText-value', currentDrawItem.value)
}
// 通过planID获取方案包含的所有事件 // 通过planID获取方案包含的所有事件
let getEventList = () => { let getEventList = () => {
let events: any = [] let events: any = []
@ -226,10 +300,14 @@ let getEventList = () => {
newTS(params, events) newTS(params, events)
} }
eventBus.on('delete-event', (ids) => { eventBus.on('delete-event', (ids) => {
console.log(ids)
tsOBJ.value._Store._tasks = tsOBJ.value._Store._tasks.filter(item => !ids.includes(item.id)) tsOBJ.value._Store._tasks = tsOBJ.value._Store._tasks.filter(item => !ids.includes(item.id))
}) })
eventBus.on('open-standText', (currentDrawItemres) => {
standText.value = ""
showStandText.value = true
currentDrawItem.value = currentDrawItemres
})
eventBus.on('add-event', (task) => { eventBus.on('add-event', (task) => {
tsOBJ.value._Store._tasks = [...tsOBJ.value._Store._tasks, task] tsOBJ.value._Store._tasks = [...tsOBJ.value._Store._tasks, task]
}) })

View File

@ -85,6 +85,7 @@ interface Tree {
children?: Tree[] children?: Tree[]
} }
const eventBus: any = inject('bus')
const treeRef = ref<TreeInstance>() const treeRef = ref<TreeInstance>()
const defaultProps = { const defaultProps = {
children: 'children', children: 'children',
@ -106,7 +107,13 @@ const tabs = [
{name: "钳形箭头", source_name: "钳形箭头", funName: 'DrawPincerArrow', type: "pincerArrow", positionLength: 5} {name: "钳形箭头", source_name: "钳形箭头", funName: 'DrawPincerArrow', type: "pincerArrow", positionLength: 5}
] ]
}, },
{name: "特效", dataType: 'list', children: [/*{name: "火焰"}*/]}, {
name: "特效", dataType: 'list', children: [
{name: "火焰", source_name: "火焰", funName: 'DrawPoint', type: "fire"},
{name: "喷射水柱", source_name: "喷射水柱", funName: 'DrawPolyline', type: "waterL", option: {number: 2}},
{name: "立体文字", source_name: "", funName: 'DrawPolyline', type: "standText", positionLength: 2}
]
},
] ]
let treeData = ref<Tree[]>([]) let treeData = ref<Tree[]>([])
// 模型类型 // 模型类型
@ -203,22 +210,40 @@ let getGraphTypeList = async () => {
graphTypes.value = res.data graphTypes.value = res.data
} }
} }
eventBus.on('standText-value', obj => {
console.log("obj", obj)
addMarker(obj, false)
})
// 添加标绘 // 添加标绘
let addMarker = (item) => { let addMarker = (item, needSendEvent = true) => {
if (window['tsObj']._Clock._status == 'play') { if (window['tsObj']._Clock._status == 'play') {
ElMessage({message: "态势推演中,暂停或停止后再试"}) ElMessage({message: "态势推演中,暂停或停止后再试"})
return; return;
} }
let nodes = getSelectedNodes(window['treeObj'])
console.log("绘制", item) console.log("绘制", item)
console.log("获取选中的节点", nodes) // 立体文字的节点名称需要先弹框输入文本内容
if (item.type == 'standText' && item.source_name == '') {
if (needSendEvent)
eventBus.emit('open-standText', item)
return;
}
let nodes = getSelectedNodes(window['treeObj'])
// console.log("获取选中的节点", nodes)
let id = new YJ.Tools().randomString() let id = new YJ.Tools().randomString()
let pId = -1 let pId = -1
if (nodes.length) { if (nodes.length) {
pId = nodes[0].sourceType == 'directory' ? nodes[0].id : nodes[0].parentId pId = nodes[0].sourceType == 'directory' ? nodes[0].id : nodes[0].parentId
} }
// let pId = nodes.length >= 1 ? nodes[0].id : -1 // let pId = nodes.length >= 1 ? nodes[0].id : -1
window.draw = new YJ.Draw[item.funName](earth_ts)
console.log("立体文字有效,准备绘制")
// 模拟后续步骤完成后将默认值设回“”
/* setTimeout(() => {
item.source_name = ""
}, 100)*/
// return;
window.draw = new YJ.Draw[item.funName](window['earth_ts'], item.option ? item.option : "")
window.draw.start((a, position) => { window.draw.start((a, position) => {
console.log(position) console.log(position)
if (position != undefined) { if (position != undefined) {
@ -245,9 +270,27 @@ let addMarker = (item) => {
obj.center = position.center obj.center = position.center
obj.radius = position.radius obj.radius = position.radius
break break
case "fire":
obj.lng = position.lng
obj.lat = position.lat
obj.alt = position.alt
delete obj.position
break
case "waterL":
obj.start = position[0]
obj.end = position[1]
delete obj.position
break
case "standText":
obj.positions = position
obj.text = item.source_name
delete obj.position
if (position.length < item.positionLength) return
break
} }
// console.log("添加标注标会") // console.log("添加标注标会")
addMapSource(item.type, pId, obj) addMapSource(item.type, pId, obj)
item.source_name = ""
} }

View File

@ -85,6 +85,15 @@ export function initMapData(type, data, cb: any = null) {
if (cb) if (cb)
cb(entityObject) cb(entityObject)
break break
case "fire":
entityObject = new YJ.Obj.Flame(window['earth_ts'], data)
break;
case 'waterL':
entityObject = new YJ.Obj.Spout(window['earth_ts'], data)
break
case 'standText':
entityObject = new YJ.Obj.StandText(window['earth_ts'], data)
break
} }
if (entityObject) { if (entityObject) {
function getOptions() { function getOptions() {
@ -177,6 +186,7 @@ export function addMapSource(type, pId, option, cb: any = null) {
"planId": window['planId'] "planId": window['planId']
} }
console.log('dbOption', dbOption) console.log('dbOption', dbOption)
// return
TsApi.addTsSource(dbOption).then(res => { TsApi.addTsSource(dbOption).then(res => {
console.log("addTsSource", res) console.log("addTsSource", res)
cb && cb(res) cb && cb(res)

View File

@ -156,6 +156,7 @@ import {ElMessage, ElMessageBox, TableV2SortOrder} from 'element-plus'
import type {SortBy} from 'element-plus' import type {SortBy} from 'element-plus'
import {TsApi} from "../../api/ts"; import {TsApi} from "../../api/ts";
import NewPlan from "./newPlan.vue" import NewPlan from "./newPlan.vue"
const moment = require("moment");
const date = ref({ const date = ref({
ymd: '', ymd: '',
@ -235,7 +236,13 @@ const toTSEdit = (row) => {
console.log("当前推演方案", row) console.log("当前推演方案", row)
router.push({ router.push({
name: 'tsEdit', // 必须用 name 匹配路由,不能用 path name: 'tsEdit', // 必须用 name 匹配路由,不能用 path
query: {id: row.id, name: row.name, desc: row.desc, start_time: new Date(row.simulationStartTime).getTime(),} query: {
id: row.id,
name: row.name,
desc: row.desc,
wheel: row.wheel,
start_time: new Date(row.simulationStartTime).getTime(),
}
}) })
} }

View File

@ -2,7 +2,8 @@
<div class="bottomMenuBox zIndex9" ref="bottomMenuBox"> <div class="bottomMenuBox zIndex9" ref="bottomMenuBox">
<div class="animate__animated bottomMenu"> <div class="animate__animated bottomMenu">
<div class="bottom_box" v-for="(item, i) of bottomMenuList" :key="i"> <div class="bottom_box" v-for="(item, i) of bottomMenuList" :key="i">
<div class="bottom_box_content" @click="addMarker(item, $event)" :title="t('bottomMenu.' + item.sourceType)"> <div class="bottom_box_content" @click="addMarker(item, $event)">
<el-tooltip :content="t('bottomMenu.' + item.sourceType)" effect="customized" placement="top" :hide-after="0">
<svg class="bottom_box_bg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" <svg class="bottom_box_bg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="117.030029296875" height="44" viewBox="0 0 117.030029296875 44" fill="none" width="117.030029296875" height="44" viewBox="0 0 117.030029296875 44" fill="none"
preserveAspectRatio="none"> preserveAspectRatio="none">
@ -18,6 +19,8 @@
</linearGradient> </linearGradient>
</defs> </defs>
</svg> </svg>
</el-tooltip>
<svg class="bottom_box_bg bottom_box_bg_hover" style="opacity: 0;" xmlns="http://www.w3.org/2000/svg" <svg class="bottom_box_bg bottom_box_bg_hover" style="opacity: 0;" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" width="118.09130859375" height="45" xmlns:xlink="http://www.w3.org/1999/xlink" width="118.09130859375" height="45"
viewBox="0 0 118.09130859375 45" fill="none" preserveAspectRatio="none"> viewBox="0 0 118.09130859375 45" fill="none" preserveAspectRatio="none">
@ -39,16 +42,16 @@
</div> </div>
</div> </div>
<div class="bottom_children" v-if="item.children" v-show="item.childrenShow"> <div class="bottom_children" v-if="item.children" v-show="item.childrenShow">
<div class="bottom_childre_box" v-for="(item2, m) of item.children" :key="m" <div class="bottom_childre_box" v-for="(item2, m) of item.children" :key="m" @click="addMarker(item2, $event)">
@click="addMarker(item2, $event)" :title="t('bottomMenu.' + item2.sourceType)"> <el-tooltip :content="t('bottomMenu.' + item2.sourceType)" effect="customized" placement="top" :hide-after="0">
<svg class="bottom_childre_box_bg" xmlns="http://www.w3.org/2000/svg" <svg class="bottom_childre_box_bg" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" width="6vw" height="44.5" viewBox="0 0 119 35.5" fill="none" xmlns:xlink="http://www.w3.org/1999/xlink" width="6vw" height="44.5" viewBox="0 0 119 35.5" fill="none"
preserveAspectRatio="none"> preserveAspectRatio="none">
<path d="M11 0.5L108 0.5L118 35.5L1 35.5L11 0.5Z" stroke="url(#linear_border_2485_3)" stroke-width="1" <path d="M11 0.5L108 0.5L118 35.5L1 35.5L11 0.5Z" stroke="url(#linear_border_2485_3)" stroke-width="1"
fill="#000000" fill-opacity="0.5" /> fill="#000000" fill-opacity="0.5" />
<path d="M118 34.5L1 34.5L0 36.5L119 36.5L118 34.5Z" fill-rule="evenodd" <path d="M118 34.5L1 34.5L0 36.5L119 36.5L118 34.5Z" fill-rule="evenodd" fill="url(#linear_fill_2485_4)" />
fill="url(#linear_fill_2485_4)" />
</svg> </svg>
</el-tooltip>
<svg class="bottom_childre_box_bg bottom_childre_box_bg_hover" style="opacity: 0;" <svg class="bottom_childre_box_bg bottom_childre_box_bg_hover" style="opacity: 0;"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="118.32568359375" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="118.32568359375"
height="36" viewBox="0 0 118.32568359375 36" fill="none" preserveAspectRatio="none"> height="36" viewBox="0 0 118.32568359375 36" fill="none" preserveAspectRatio="none">
@ -659,6 +662,14 @@ document.addEventListener('click', (e: any) => {
height: 44px; height: 44px;
bottom: 1em; bottom: 1em;
left: 13vw; left: 13vw;
:deep(.el-tooltip__trigger) {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
pointer-events: all;
}
} }
.bottomMenu { .bottomMenu {

View File

@ -436,7 +436,7 @@ const handleDragEnd = (
console.log('tree drag end:', dropNode, dropType, ev, draggingNode) console.log('tree drag end:', dropNode, dropType, ev, draggingNode)
if (dropType != 'none') { if (dropType != 'none') {
let nodeList = [] let nodeList:any = []
switch (dropType) { switch (dropType) {
case 'before': case 'before':
case 'after': case 'after':
@ -506,6 +506,7 @@ const showImage = (row: any) => {
const handleContextMenu = (event: MouseEvent, row: TypeNode) => { const handleContextMenu = (event: MouseEvent, row: TypeNode) => {
event.stopPropagation() event.stopPropagation()
event.preventDefault() event.preventDefault()
// @ts-expect-error
if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) { if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) {
let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect() let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect()
contextMenu.x = event.clientX - rect.left contextMenu.x = event.clientX - rect.left
@ -578,6 +579,7 @@ const getModelListByType = (id) => {
} }
const divContextMenu = (event: MouseEvent) => { const divContextMenu = (event: MouseEvent) => {
event.preventDefault() event.preventDefault()
// @ts-expect-error
if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) { if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) {
let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect() let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect()
contextMenu.x = event.clientX - rect.left contextMenu.x = event.clientX - rect.left
@ -700,7 +702,7 @@ const getBase64Image = (src) => {
let blob = this.response let blob = this.response
let oFileReader = new FileReader() let oFileReader = new FileReader()
oFileReader.onloadend = function (e) { oFileReader.onloadend = function (e) {
const base64 = e.target.result const base64 = e?.target?.result
resolve(base64) resolve(base64)
} }
oFileReader.readAsDataURL(blob) oFileReader.readAsDataURL(blob)

View File

@ -223,7 +223,7 @@ const contextMenu = reactive({
const treeRef = ref() const treeRef = ref()
//表头拖拽 //表头拖拽
const tableRef = ref(null) const tableRef:any = ref(null)
const handleHeaderDragend = (newWidth, oldWidth, column, event) => { const handleHeaderDragend = (newWidth, oldWidth, column, event) => {
const columns = tableRef.value.$refs.tableHeaderRef.columnRows[0] const columns = tableRef.value.$refs.tableHeaderRef.columnRows[0]
@ -486,7 +486,7 @@ const handleDragEnd = (
) => { ) => {
console.log('tree drag end:', dropNode, dropType, ev, draggingNode, draggingNode.parent) console.log('tree drag end:', dropNode, dropType, ev, draggingNode, draggingNode.parent)
if (dropType != 'none') { if (dropType != 'none') {
let nodeList = [] let nodeList:any = []
switch (dropType) { switch (dropType) {
case 'before': case 'before':
case 'after': case 'after':
@ -584,6 +584,7 @@ const handleContextMenu = (event: MouseEvent, row: TypeNode) => {
event.preventDefault() event.preventDefault()
contextMenu.currentRow = row contextMenu.currentRow = row
// 计算相对于文档的坐标 // 计算相对于文档的坐标
// @ts-expect-error
if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) { if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) {
let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect() let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect()
contextMenu.x = event.clientX - rect.left contextMenu.x = event.clientX - rect.left
@ -649,6 +650,7 @@ const getModelListByType = (id) => {
} }
const divContextMenu = (event: MouseEvent) => { const divContextMenu = (event: MouseEvent) => {
event.preventDefault() event.preventDefault()
// @ts-expect-error
if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) { if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) {
let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect() let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect()
contextMenu.x = event.clientX - rect.left contextMenu.x = event.clientX - rect.left

View File

@ -516,7 +516,7 @@ const handleDragEnd = (
) => { ) => {
console.log('tree drag end:', dropNode, dropType, ev, draggingNode) console.log('tree drag end:', dropNode, dropType, ev, draggingNode)
if (dropType != 'none') { if (dropType != 'none') {
let nodeList = [] let nodeList:any = []
switch (dropType) { switch (dropType) {
case 'before': case 'before':
case 'after': case 'after':
@ -590,6 +590,7 @@ const handleContextMenu = (event: MouseEvent, row: TypeNode) => {
} }
contextMenu.currentRow = row contextMenu.currentRow = row
// @ts-expect-error
if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) { if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) {
let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect() let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect()
contextMenu.x = event.clientX - rect.left contextMenu.x = event.clientX - rect.left
@ -670,6 +671,7 @@ const divContextMenu = (event: MouseEvent) => {
return return
} }
event.preventDefault() event.preventDefault()
// @ts-expect-error
if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) { if (document.getElementsByClassName('settingPop')[0]?.style.transform.length) {
let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect() let rect = document.getElementsByClassName('settingPop')[0].getBoundingClientRect()
contextMenu.x = event.clientX - rect.left contextMenu.x = event.clientX - rect.left

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="set_pup"> <div class="set_pup" :class="{'dialog-en': isEN}">
<el-dialog <el-dialog
v-model="isShowPup" v-model="isShowPup"
:modal="true" :modal="true"
@ -135,10 +135,11 @@ import photoManage from './components/photoManage.vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
const eventBus: any = inject('bus') const eventBus: any = inject('bus')
const { t } = useI18n() const { t, locale } = useI18n()
const tabPosition = ref('left') const tabPosition = ref('left')
const activeName = ref('authorize') const activeName = ref('authorize')
const isShowPup = ref(false) const isShowPup = ref(false)
const isEN = ref(false)
const open = (data) => { const open = (data) => {
isShowPup.value = true isShowPup.value = true
if (data !== 'current') { if (data !== 'current') {
@ -163,6 +164,25 @@ const close = () => {
isShowPup.value = false isShowPup.value = false
} }
onMounted(() => {
// 可以在这里添加初始化逻辑
if(locale.value === 'zh-EN') {
isEN.value = true
}
else {
isEN.value = false
}
})
watch(locale, ()=>{
if(locale.value === 'zh-EN') {
isEN.value = true
}
else {
isEN.value = false
}
})
defineExpose({ defineExpose({
open, open,
close close
@ -182,6 +202,7 @@ defineExpose({
), ),
rgba(0, 0, 0, 0.6); rgba(0, 0, 0, 0.6);
border: 1px solid var(--color-border1); border: 1px solid var(--color-border1);
padding-left: 0px;
// padding-left: 0 !important; // padding-left: 0 !important;
} }
@ -308,14 +329,18 @@ defineExpose({
:deep(.el-tabs__item) { :deep(.el-tabs__item) {
width: 8vw; width: 8vw;
color: #fff !important; color: #fff !important;
font-size: 1.1rem; font-size: 0.9rem;
font-family: 黑体; font-family: SourceHanSansTi;
font-weight: 500; font-weight: 500;
display: flex; line-height: 38px;
display: block;
align-items: center; align-items: center;
justify-content: center; text-align: center;
margin-bottom: 3px; margin-bottom: 3px;
box-sizing: border-box; box-sizing: border-box;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
} }
:deep(.el-tabs__item:hover) { :deep(.el-tabs__item:hover) {
@ -366,4 +391,10 @@ defineExpose({
} }
} }
} }
.set_pup.dialog-en {
:deep(.el-tabs__item) {
text-align: left;
}
}
</style> </style>

View File

@ -2,9 +2,10 @@
<div class="leftBox" ref="leftBoxRef"> <div class="leftBox" ref="leftBoxRef">
<div class="left animate__animated"> <div class="left animate__animated">
<div class="menus"> <div class="menus">
<div class="menus_itemBox" v-for="(item, index) in menuList" :title="t(`firstMenu.${item.name}`)"> <div class="menus_itemBox" v-for="(item, index) in menuList">
<el-tooltip :content="t(`firstMenu.${item.name}`)" effect="customized" placement="top" :hide-after="0">
<div class="item_icon" @click="(e) => { <div class="item_icon" @click="(e) => {
handleClick(item, e) handleClick(item, index, e)
} }
"> ">
<!-- <svg class="item_icon_bg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" <!-- <svg class="item_icon_bg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
@ -56,6 +57,8 @@
{{ t(`firstMenu.${item.name}`) }} {{ t(`firstMenu.${item.name}`) }}
</div> </div>
</div> </div>
</el-tooltip>
</div> </div>
<leftSideSecond class="absolute zIndex99 leftSideSecond" ref="leftSideSecondRef"></leftSideSecond> <leftSideSecond class="absolute zIndex99 leftSideSecond" ref="leftSideSecondRef"></leftSideSecond>
</div> </div>
@ -264,10 +267,12 @@ onMounted(() => {
document.addEventListener('click', handleClickOutside, true); document.addEventListener('click', handleClickOutside, true);
}) })
const leftSideSecondRef = ref() const leftSideSecondRef = ref()
const handleClick = (item: any, e) => { const handleClick = (item: any, index, e) => {
console.log('点击了', item, e) console.log('点击了', item, e, index)
$('.leftSideSecond')[0].style.left = '100%' $('.leftSideSecond')[0].style.left = '100%'
$('.leftSideSecond')[0].style.top = e.layerY - 120 + 'px' // $('.leftSideSecond')[0].style.top = e.layerY + 120 + 'px'
$('.leftSideSecond')[0].style.top = `calc(${index} * 6.32vh)`
$('.leftSideSecond')[0].style.transform = 'translateY(calc(2.6vh - 50%))';
$('.leftSideSecond')[0].style.display = 'none' $('.leftSideSecond')[0].style.display = 'none'
if (item.children.length) { if (item.children.length) {
$('.leftSideSecond')[0].style.display = 'block' $('.leftSideSecond')[0].style.display = 'block'

View File

@ -687,7 +687,6 @@ const methodMap = {
}) })
dom?.classList.remove('default-cursor') dom?.classList.remove('default-cursor')
dom?.classList.add('custom-cursor') dom?.classList.add('custom-cursor')
console.log(document.getElementsByClassName('custom-cursor')[0].style, 'llllll')
} else { } else {
dom?.classList.remove('custom-cursor') dom?.classList.remove('custom-cursor')
dom?.classList.add('default-cursor') dom?.classList.add('default-cursor')

View File

@ -31,6 +31,7 @@
<attribute :entityOptions="entityOptions"></attribute> <attribute :entityOptions="entityOptions"></attribute>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="空间信息" name="2"> <el-tab-pane label="空间信息" name="2">
<div class="div-item">
<div class="row"> <div class="row">
<div class="col height-mode-box"> <div class="col height-mode-box">
<span class="label" style="flex: 0 0 56px;">高度模式</span> <span class="label" style="flex: 0 0 56px;">高度模式</span>
@ -43,7 +44,8 @@
<div class="col"> <div class="col">
<span class="label">Z值统一增加</span> <span class="label">Z值统一增加</span>
<div class="input-number input-number-unit-1 height-box" :class="{ 'disabled': heightMode == 2 }"> <div class="input-number input-number-unit-1 height-box" :class="{ 'disabled': heightMode == 2 }">
<input class="input height" type="number" title="" min="-9999999" max="999999999" v-model="height" @input="$handleInputLimit"> <input class="input height" type="number" title="" min="-9999999" max="999999999" v-model="height"
@input="$handleInputLimit">
<span class="unit">m</span> <span class="unit">m</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -66,12 +68,14 @@
<div class="td">圆心坐标</div> <div class="td">圆心坐标</div>
<div class="td lng align-center" @dblclick="inputDblclick($event, 1, 'lng')"> <div class="td lng align-center" @dblclick="inputDblclick($event, 1, 'lng')">
<input class="input" @blur="inputBlurCallBack($event, 1, 'lng', 8)" type="number" <input class="input" @blur="inputBlurCallBack($event, 1, 'lng', 8)" type="number"
v-model="entityOptions.center.lng" min="-180" max="180" v-if="activeTd.index == 1 && activeTd.name == 'lng'" @input="$handleInputLimit"> v-model="entityOptions.center.lng" min="-180" max="180"
v-if="activeTd.index == 1 && activeTd.name == 'lng'" @input="$handleInputLimit">
<span style="pointer-events: none;" v-else>{{ entityOptions.center.lng.toFixed(8) }}</span> <span style="pointer-events: none;" v-else>{{ entityOptions.center.lng.toFixed(8) }}</span>
</div> </div>
<div class="td lat align-center" @dblclick="inputDblclick($event, 1, 'lat')"> <div class="td lat align-center" @dblclick="inputDblclick($event, 1, 'lat')">
<input class="input" @blur="inputBlurCallBack($event, 1, 'lat', 8)" type="number" <input class="input" @blur="inputBlurCallBack($event, 1, 'lat', 8)" type="number"
v-model="entityOptions.center.lat" min="-180" max="180" v-if="activeTd.index == 1 && activeTd.name == 'lat'" @input="$handleInputLimit"> v-model="entityOptions.center.lat" min="-180" max="180"
v-if="activeTd.index == 1 && activeTd.name == 'lat'" @input="$handleInputLimit">
<span style="pointer-events: none;" v-else>{{ entityOptions.center.lat.toFixed(8) }}</span> <span style="pointer-events: none;" v-else>{{ entityOptions.center.lat.toFixed(8) }}</span>
</div> </div>
<div class="td alt align-center" @dblclick="inputDblclick($event, 1, 'alt')"> <div class="td alt align-center" @dblclick="inputDblclick($event, 1, 'alt')">
@ -84,6 +88,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="面风格" name="3"> <el-tab-pane label="面风格" name="3">
<div class="row"> <div class="row">
@ -98,7 +103,8 @@
<div class="col"> <div class="col">
<span class="label">描边宽度</span> <span class="label">描边宽度</span>
<div class="input-number input-number-unit-2"> <div class="input-number input-number-unit-2">
<input class="input" type="number" title="" min="0" max="99" v-model="entityOptions.lineWidth" @input="$handleInputLimit"> <input class="input" type="number" title="" min="0" max="99" v-model="entityOptions.lineWidth"
@input="$handleInputLimit">
<span class="unit">px</span> <span class="unit">px</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -124,7 +130,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -378,4 +384,15 @@ defineExpose({
}) })
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss">
.circle.dialog-en {
::v-deep>.content {
.attribute-content-link .table .tr .td.operation button,
.attribute-content-vr .table .tr .td.operation button,
.attribute-content-rtmp .table .tr .td.operation button {
width: 76px !important;
flex: 0 0 76px !important;
}
}
}</style>

View File

@ -15,7 +15,7 @@
<button @click="draw"> <button @click="draw">
<svg class="icon-edit"><use xlink:href="#yj-icon-edit"></use></svg>重新绘制 <svg class="icon-edit"><use xlink:href="#yj-icon-edit"></use></svg>重新绘制
</button> </button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -251,7 +251,7 @@
<span class="custom-divider" style="order: 10; margin-top: 12px"></span> <span class="custom-divider" style="order: 10; margin-top: 12px"></span>
</template> </template>
<template #footer> <template #footer>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -103,7 +103,7 @@
<span class="custom-divider"></span> <span class="custom-divider"></span>
</template> </template>
<template #footer> <template #footer>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -43,7 +43,7 @@
</div> </div>
</template> </template>
<!-- <template #footer> <!-- <template #footer>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> --> </template> -->
</Dialog> </Dialog>
</template> </template>

View File

@ -90,7 +90,7 @@
</button> </button>
</div> </div>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -147,7 +147,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -401,4 +401,15 @@ defineExpose({
}) })
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss">
.attackArrow.dialog-en {
::v-deep>.content {
.attribute-content-link .table .tr .td.operation button,
.attribute-content-vr .table .tr .td.operation button,
.attribute-content-rtmp .table .tr .td.operation button {
width: 76px !important;
flex: 0 0 76px !important;
}
}
}
</style>

View File

@ -47,15 +47,15 @@
</div> </div>
<div class="td" v-else>{{ item.url }}</div> <div class="td" v-else>{{ item.url }}</div>
<div class="td operation" v-if="linkEditActive.index === index"> <div class="td operation" v-if="linkEditActive.index === index">
<button style="width: 76px;flex: 0 0 76px" @click="linkConfirmEdit(index)">{{ <button @click="linkConfirmEdit(index)">{{
t('general.确认') t('general.确认')
}} }}
</button> </button>
<button style="width: 76px;flex: 0 0 76px" @click="linkCancelEdit">{{ t('general.取消') }}</button> <button @click="linkCancelEdit">{{ t('general.取消') }}</button>
</div> </div>
<div class="td operation" v-else> <div class="td operation" v-else>
<button style="width: 76px;flex: 0 0 76px" @click="linkEdit(index, item)">{{ t('general.编辑') }}</button> <button @click="linkEdit(index, item)">{{ t('general.编辑') }}</button>
<button style="width: 76px;flex: 0 0 76px" @click="linkDelete(index)">{{ t('general.删除') }}</button> <button @click="linkDelete(index)">{{ t('general.删除') }}</button>
</div> </div>
</div> </div>
</div> </div>
@ -69,7 +69,7 @@
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<span class="label">{{ t('general.编辑内容') }}</span> <span class="label">{{ t('general.编辑内容') }}</span>
<input class="input" type="text" v-model="cameraParams.keyWord" style="width: 180px;margin-right: 10px;"/> <input class="input" type="text" :placeholder="t('general.请输入设备名称进行搜索')" v-model="cameraParams.keyWord" style="width: 180px;margin-right: 10px;"/>
<button class="select btn" @click="cameraSelect({page: 1, limit: cameraParams.pageSize })"> <button class="select btn" @click="cameraSelect({page: 1, limit: cameraParams.pageSize })">
{{ t('general.搜索') }} {{ t('general.搜索') }}
</button> </button>
@ -244,7 +244,7 @@
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<span class="label">{{ t('general.编辑内容') }}</span> <span class="label">{{ t('general.编辑内容') }}</span>
<input class="input goods-select-input" type="text" placeholder="请输入关键字" style="width: 180px;margin-right: 10px;" <input class="input goods-select-input" type="text" :placeholder="t('general.请输入物资名称进行搜索')" style="width: 180px;margin-right: 10px;"
v-model="goodsKeywords"> v-model="goodsKeywords">
<button class="select btn" @click="goodsFilter">{{ t('general.搜索') }}</button> <button class="select btn" @click="goodsFilter">{{ t('general.搜索') }}</button>
</div> </div>
@ -388,8 +388,8 @@ const cameraSelect = ({page, limit}) => {
if (res.code === 0 || res.code === 200) { if (res.code === 0 || res.code === 200) {
if (res.data) { if (res.data) {
cameraParams.value.total = res.data.total cameraParams.value.total = res.data.total
if (res.data.records && res.data.records.length > 0) {
cameraList.value = res.data.records cameraList.value = res.data.records
if (res.data.records && res.data.records.length > 0) {
for (let i = 0; i < cameraList.value.length; i++) { for (let i = 0; i < cameraList.value.length; i++) {
cameraList.value[i].checked = false cameraList.value[i].checked = false
for (let j = 0; j < props.entityOptions.attributeCamera.length; j++) { for (let j = 0; j < props.entityOptions.attributeCamera.length; j++) {
@ -724,8 +724,8 @@ const changeAttributeCamera = (e) => {
.YJ-custom-base-dialog > .content .attribute-content-vr .table .tr .td:nth-child(1), .YJ-custom-base-dialog > .content .attribute-content-vr .table .tr .td:nth-child(1),
.YJ-custom-base-dialog > .content .attribute-content-rtmp .table .tr .th:nth-child(1), .YJ-custom-base-dialog > .content .attribute-content-rtmp .table .tr .th:nth-child(1),
.YJ-custom-base-dialog > .content .attribute-content-rtmp .table .tr .td:nth-child(1) { .YJ-custom-base-dialog > .content .attribute-content-rtmp .table .tr .td:nth-child(1) {
width: 164px; width: 150px;
flex: 0 0 164px; flex: 0 0 150px;
} }
.YJ-custom-base-dialog > .content .attribute-content-link .table .tr .th:nth-child(2), .YJ-custom-base-dialog > .content .attribute-content-link .table .tr .th:nth-child(2),
@ -744,21 +744,21 @@ const changeAttributeCamera = (e) => {
.YJ-custom-base-dialog > .content .attribute-content-vr .table .tr .td:nth-child(3), .YJ-custom-base-dialog > .content .attribute-content-vr .table .tr .td:nth-child(3),
.YJ-custom-base-dialog > .content .attribute-content-rtmp .table .tr .th:nth-child(3), .YJ-custom-base-dialog > .content .attribute-content-rtmp .table .tr .th:nth-child(3),
.YJ-custom-base-dialog > .content .attribute-content-rtmp .table .tr .td:nth-child(3) { .YJ-custom-base-dialog > .content .attribute-content-rtmp .table .tr .td:nth-child(3) {
flex: 0 0 150px; flex: 0 0 175px;
width: 150px; width: 175px;
justify-content: center; justify-content: center;
} }
.YJ-custom-base-dialog.dialog-en > .content .attribute-content-link .table .tr .th:nth-child(3), // .YJ-custom-base-dialog.dialog-en > .content .attribute-content-link .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.dialog-en > .content .attribute-content-link .table .tr .td:nth-child(3), // .YJ-custom-base-dialog.dialog-en > .content .attribute-content-link .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.dialog-en > .content .attribute-content-vr .table .tr .th:nth-child(3), // .YJ-custom-base-dialog.dialog-en > .content .attribute-content-vr .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.dialog-en > .content .attribute-content-vr .table .tr .td:nth-child(3), // .YJ-custom-base-dialog.dialog-en > .content .attribute-content-vr .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.dialog-en > .content .attribute-content-rtmp .table .tr .th:nth-child(3), // .YJ-custom-base-dialog.dialog-en > .content .attribute-content-rtmp .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.dialog-en > .content .attribute-content-rtmp .table .tr .td:nth-child(3) { // .YJ-custom-base-dialog.dialog-en > .content .attribute-content-rtmp .table .tr .td:nth-child(3) {
flex: 0 0 190px; // flex: 0 0 190px;
width: 190px; // width: 190px;
justify-content: center; // justify-content: center;
} // }
.YJ-custom-base-dialog > .content .attribute-content-link .table .tr .td .input-group .input, .YJ-custom-base-dialog > .content .attribute-content-link .table .tr .td .input-group .input,
.YJ-custom-base-dialog > .content .attribute-content-vr .table .tr .td .input-group .input, .YJ-custom-base-dialog > .content .attribute-content-vr .table .tr .td .input-group .input,

View File

@ -26,11 +26,61 @@
<div class="row coordinate-select-box"> <div class="row coordinate-select-box">
<div class="lable-left-line"> <div class="lable-left-line">
{{ t('dialog.point.转换坐标选择') }} {{ t('dialog.point.转换坐标选择') }}
<el-select class="input input-select coordinate-select" style="width: 155px; margin-left: 20px" <el-select style="width: 155px; margin-left: 20px;" v-model="coordinate" @change="coordinateChange">
<div class="group-header" :class="name_map1.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'arrowActive'
: ''
" @click="toggleGroup('hot')">
地理坐标系
<svg-icon v-if="isHotGroupOpen" name="arrow2" :size="10" :color="name_map1.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
" style="margin-left: 10px"></svg-icon>
<svg-icon v-else name="arrow1" :size="10" :color="name_map1.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
" style="margin-left: 10px"></svg-icon>
</div>
<div v-show="isHotGroupOpen">
<el-option v-for="item in name_map1" :key="item.epsg" :label="item.name"
:value="item.epsg"></el-option>
</div>
<div class="group-header" :class="name_map2.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'arrowActive'
: ''
" @click="toggleGroup('ty')">
投影坐标系
<svg-icon v-if="isHotGroupOpen2" name="arrow2" :size="10" :color="name_map2.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
" style="margin-left: 10px"></svg-icon>
<svg-icon v-else name="arrow1" :size="10" :color="name_map2.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
" style="margin-left: 10px"></svg-icon>
</div>
<div v-show="isHotGroupOpen2">
<el-option v-for="item in name_map2" :key="item.epsg" :label="item.name"
:value="item.epsg"></el-option>
</div>
</el-select>
<!-- <el-select class="input input-select coordinate-select" style="width: 155px; margin-left: 20px"
v-model="coordinate" @change="coordinateChange" placeholder="请选择"> v-model="coordinate" @change="coordinateChange" placeholder="请选择">
<el-option v-for="item in epsg_map" :key="item.epsg" :label="item.name" :value="item.epsg"> <el-option v-for="item in epsg_map" :key="item.epsg" :label="item.name" :value="item.epsg">
</el-option> </el-option>
</el-select> </el-select> -->
</div> </div>
</div> </div>
</div> </div>
@ -352,7 +402,7 @@
</div> </div>
<button @click="remove">{{ t('general.删除') }}</button> <button @click="remove">{{ t('general.删除') }}</button>
<button @click="confirm">{{ t('general.确定') }}</button> <button @click="confirm">{{ t('general.确定') }}</button>
<button @click="close">{{ t('general.关闭') }}</button> <button @click="close">{{ t('general.取消') }}</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -375,6 +425,31 @@ const { cusUpdateNode, getSelectedNodes, cusRemoveNode } = useTreeNode()
const baseDialog: any = ref(null) const baseDialog: any = ref(null)
const eventBus: any = inject('bus') const eventBus: any = inject('bus')
const name_map: any = ref([])
const name_map1: any = ref([])
const name_map2: any = ref([
{
epsg: 'EPSG:32601',
name: 'WGS84 通用横轴墨卡托投影'
},
{
epsg: 'EPSG:4534',
name: '2000 坐标 3 度不带代号'
},
{
epsg: 'EPSG:4513',
name: '2000 坐标 3 度带代号'
},
{
epsg: 'EPSG:4502',
name: '2000 坐标 6 度不带代号'
},
{
epsg: 'EPSG:4491',
name: '2000 坐标 6 度带代号'
}
])
const epsg_map = ref([ const epsg_map = ref([
{ {
name: 'WGS 84 / UTM zone 3N', name: 'WGS 84 / UTM zone 3N',
@ -390,6 +465,10 @@ for (const [key, value] of window.earth.proj.epsg_map) {
} }
epsg_map.value = array epsg_map.value = array
let tool = new YJ.Tools(window.earth)
name_map.value = Array.from(tool.name_map.values())
name_map1.value = name_map.value.splice(0, 2)
const format1 = ref(true) const format1 = ref(true)
const format2 = ref(false) const format2 = ref(false)
const format3 = ref(false) const format3 = ref(false)
@ -434,6 +513,9 @@ const x = ref()
const y = ref() const y = ref()
const z = ref() const z = ref()
const coordinate = ref('EPSG:4326') const coordinate = ref('EPSG:4326')
const isHotGroupOpen: any = ref(true)
const isHotGroupOpen2: any = ref(false)
const showPosiType: any = ref(false)
const heightMode = ref(0) const heightMode = ref(0)
const labelColorRef = ref(null) const labelColorRef = ref(null)
const sourceType = ref('') const sourceType = ref('')
@ -454,6 +536,13 @@ const open = async (id, type) => {
baseDialog.value?.open() baseDialog.value?.open()
await nextTick() await nextTick()
let data = name_map1.value.filter((item) => item.epsg === coordinate.value)
showPosiType.value = data.length
if (data.length) {
isHotGroupOpen.value = true
} else {
isHotGroupOpen2.value = true
}
let labelColorPicker = new window.YJColorPicker({ let labelColorPicker = new window.YJColorPicker({
el: labelColorRef.value, el: labelColorRef.value,
size: 'mini', //颜色box类型 size: 'mini', //颜色box类型
@ -519,6 +608,11 @@ const closeCallback = () => {
eventBus?.emit('destroyComponent') eventBus?.emit('destroyComponent')
} }
const toggleGroup = (type: string) => {
if (type === 'hot') isHotGroupOpen.value = !isHotGroupOpen.value
if (type === 'ty') isHotGroupOpen2.value = !isHotGroupOpen2.value
}
const changeName = (e) => { const changeName = (e) => {
entityOptions.value.labelText = e.target.value entityOptions.value.labelText = e.target.value
} }
@ -771,7 +865,7 @@ defineExpose({
} }
::v-deep>.content { ::v-deep>.content {
width: 590px; width: 600px;
.title1 { .title1 {
width: 46%; width: 46%;
@ -802,7 +896,7 @@ defineExpose({
.billboard-object.dialog-en { .billboard-object.dialog-en {
::v-deep>.content { ::v-deep>.content {
width: 690px; width: 660px;
.title1 { .title1 {
width: 40%; width: 40%;

View File

@ -103,7 +103,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -64,8 +64,8 @@
<div class="col" style="flex: 0 0 33%"> <div class="col" style="flex: 0 0 33%">
<span class="label">缓冲宽度</span> <span class="label">缓冲宽度</span>
<div class="input-number input-number-unit-1" style="width: 80px"> <div class="input-number input-number-unit-1" style="width: 80px">
<input class="input" type="number" title="" min="0" data-min="0.01" max="999999" <input class="input" type="number" title="" min="0" data-min="0.01" max="999999" @input="$handleInputLimit"
@input="$handleInputLimit" v-model="entityOptions.extendWidth" /> v-model="entityOptions.extendWidth" />
<span class="unit">m</span> <span class="unit">m</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -190,7 +190,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -554,4 +554,14 @@ defineExpose({
} }
} }
} }
.polyline.dialog-en {
::v-deep>.content {
.attribute-content-link .table .tr .td.operation button,
.attribute-content-vr .table .tr .td.operation button,
.attribute-content-rtmp .table .tr .td.operation button {
width: 76px !important;
flex: 0 0 76px !important;
}
}
}
</style> </style>

View File

@ -56,7 +56,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -36,7 +36,7 @@
</template> </template>
<template #footer> <template #footer>
<button @click="sure">确认</button> <button @click="sure">确认</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -76,7 +76,7 @@
<template #footer> <template #footer>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -179,6 +179,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
//@ts-nocheck
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
import { ref, onMounted, onBeforeUnmount, watch } from 'vue' import { ref, onMounted, onBeforeUnmount, watch } from 'vue'

View File

@ -194,7 +194,7 @@
<button @click="returnY"><svg-icon name="yaxis" :size="12"></svg-icon>Y轴翻转</button> <button @click="returnY"><svg-icon name="yaxis" :size="12"></svg-icon>Y轴翻转</button>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -74,7 +74,7 @@
</template> </template>
<template #footer> <template #footer>
<button @click="save">保存</button> <button @click="save">保存</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -1,6 +1,5 @@
<template> <template>
<Dialog ref="baseDialog" title="贴地文字属性" left="180px" top="100px" className="ground-text" <Dialog ref="baseDialog" title="贴地文字属性" left="180px" top="100px" className="ground-text" :closeCallback="closeCallback">
:closeCallback="closeCallback">
<template #content> <template #content>
<span class="custom-divider"></span> <span class="custom-divider"></span>
<div class="div-item"> <div class="div-item">
@ -11,8 +10,7 @@
</div> </div>
<div class="col"> <div class="col">
<span class="label">颜色</span> <span class="label">颜色</span>
<div class="color" ref="colorRef" </div> <div class="color" ref="colorRef"></div>
</div>
</div> </div>
</div> </div>
<span class="custom-divider"></span> <span class="custom-divider"></span>
@ -25,7 +23,8 @@
</div> </div>
<div class="col"> <div class="col">
<span class="label">纬度</span> <span class="label">纬度</span>
<input class="input" type="number" title="" min="-90" max="90" v-model="entityOptions.lat" @input="$handleInputLimit"> <input class="input" type="number" title="" min="-90" max="90" v-model="entityOptions.lat"
@input="$handleInputLimit">
</div> </div>
</div> </div>
</div> </div>
@ -37,8 +36,8 @@
<input type="range" max="360" min="0" step="1" v-model="entityOptions.angle"> <input type="range" max="360" min="0" step="1" v-model="entityOptions.angle">
<div class="input-number input-number-unit" <div class="input-number input-number-unit"
style="width: 100px;flex: 0 0 100px;margin-left: 10px;"> style="width: 100px;flex: 0 0 100px;margin-left: 10px;">
<input class="input" type="number" title="" min="0" max="360" step="1" @input="$handleInputLimit" <input class="input" type="number" title="" min="0" max="360" step="1"
v-model="entityOptions.angle"> @input="$handleInputLimit" v-model="entityOptions.angle">
<span class="unit">°</span> <span class="unit">°</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -60,14 +59,15 @@
<span class="label">滚动速度</span> <span class="label">滚动速度</span>
<input type="range" max="100" min="0" step="1" v-model="entityOptions.speed"> <input type="range" max="100" min="0" step="1" v-model="entityOptions.speed">
<div class="input-number" style="width: 100px;flex: 0 0 100px;margin-left: 10px;"> <div class="input-number" style="width: 100px;flex: 0 0 100px;margin-left: 10px;">
<input class="input" type="number" title="" min="0" max="100" step="1" @input="$handleInputLimit" <input class="input" type="number" title="" min="0" max="100" step="1"
v-model="entityOptions.speed"> @input="$handleInputLimit" v-model="entityOptions.speed">
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<span class="custom-divider"></span> <span class="custom-divider"></span>
</div>
</template> </template>
<template #footer> <template #footer>
<div style="position: absolute; left: 24px; display: flex;"> <div style="position: absolute; left: 24px; display: flex;">
@ -77,7 +77,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -32,7 +32,7 @@
</button> </button>
</div> </div>
<button @click="save">保存</button> <button @click="save">保存</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -38,7 +38,7 @@
<div class="row"></div> <div class="row"></div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<span class="label">字体样式</span> <span class="label">字体风格</span>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
@ -63,7 +63,7 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="row"> <!-- <div class="row">
<div class="col"> <div class="col">
<div class="customized-tip"></div> <div class="customized-tip"></div>
<span class="label" style="flex: none;">{{ t('general.text.style') }}</span> <span class="label" style="flex: none;">{{ t('general.text.style') }}</span>
@ -106,7 +106,7 @@
</div> </div>
</div> </div>
<div class="col"></div> <div class="col"></div>
</div> </div> -->
<span class="custom-divider"></span> <span class="custom-divider"></span>
<div class="row"></div> <div class="row"></div>
<div class="row"> <div class="row">
@ -124,13 +124,6 @@
<div class="labelBackgroundColorStart" ref="labelBackgroundColorStartRef" style="margin-right: 10px;"></div> <div class="labelBackgroundColorStart" ref="labelBackgroundColorStartRef" style="margin-right: 10px;"></div>
<div class="labelBackgroundColorEnd" ref="labelBackgroundColorEndRef"></div> <div class="labelBackgroundColorEnd" ref="labelBackgroundColorEndRef"></div>
</div> </div>
<!-- <div class="col font-select-box">
<span class="label" style="flex: none">字体选择</span>
<el-select class="input input-select font-select" v-model="entityOptions.labelFontFamily">
<el-option v-for="item in fontList" :key="item.key" :label="item.name" :value="item.key">
</el-option>
</el-select>
</div> -->
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">

View File

@ -31,7 +31,7 @@
<template #footer> <template #footer>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -524,7 +524,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -74,7 +74,7 @@
</template> </template>
<template #footer> <template #footer>
<button @click="save">保存</button> <button @click="save">保存</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -183,7 +183,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -1,5 +1,6 @@
<template> <template>
<Dialog ref="baseDialog" :title="title+'属性'" left="180px" top="100px" className="polygon" :closeCallback="closeCallback"> <Dialog ref="baseDialog" :title="title + '属性'" left="180px" top="100px" className="polygon"
:closeCallback="closeCallback">
<template #content> <template #content>
<span class="custom-divider"></span> <span class="custom-divider"></span>
<div class="div-item"> <div class="div-item">
@ -43,7 +44,8 @@
<div class="col"> <div class="col">
<span class="label">Z值统一增加</span> <span class="label">Z值统一增加</span>
<div class="input-number input-number-unit-1 height-box" :class="{ 'disabled': heightMode == 2 }"> <div class="input-number input-number-unit-1 height-box" :class="{ 'disabled': heightMode == 2 }">
<input class="input height" type="number" title="" min="-9999999" max="999999999" v-model="height" @input="$handleInputLimit" /> <input class="input height" type="number" title="" min="-9999999" max="999999999" v-model="height"
@input="$handleInputLimit" />
<span class="unit">m</span> <span class="unit">m</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -66,15 +68,18 @@
<div class="td">{{ i + 1 }}</div> <div class="td">{{ i + 1 }}</div>
<div class="td lng align-center" @dblclick="inputDblclick($event, i, 'lng')"> <div class="td lng align-center" @dblclick="inputDblclick($event, i, 'lng')">
<input class="input" @blur="inputBlurCallBack($event, i, 'lng', 8)" type="number" <input class="input" @blur="inputBlurCallBack($event, i, 'lng', 8)" type="number"
v-model="item.lng" min="-180" max="180" v-if="activeTd.index == i && activeTd.name == 'lng'" @input="$handleInputLimit" /> v-model="item.lng" min="-180" max="180" v-if="activeTd.index == i && activeTd.name == 'lng'"
@input="$handleInputLimit" />
<span style="pointer-events: none;" v-else>{{ (item.lng).toFixed(8) }}</span> <span style="pointer-events: none;" v-else>{{ (item.lng).toFixed(8) }}</span>
</div> </div>
<div class="td lat align-center" @dblclick="inputDblclick($event, i, 'lat')"> <div class="td lat align-center" @dblclick="inputDblclick($event, i, 'lat')">
<input class="input" @blur="inputBlurCallBack($event, i, 'lat', 8)" type="number" <input class="input" @blur="inputBlurCallBack($event, i, 'lat', 8)" type="number"
v-model="item.lat" min="-180" max="180" v-if="activeTd.index == i && activeTd.name == 'lat'" @input="$handleInputLimit"> v-model="item.lat" min="-180" max="180" v-if="activeTd.index == i && activeTd.name == 'lat'"
@input="$handleInputLimit">
<span style="pointer-events: none;" v-else>{{ (item.lat).toFixed(8) }}</span> <span style="pointer-events: none;" v-else>{{ (item.lat).toFixed(8) }}</span>
</div> </div>
<div class="td alt align-center" @dblclick="inputDblclick($event, i, 'alt')" @input="$handleInputLimit"> <div class="td alt align-center" @dblclick="inputDblclick($event, i, 'alt')"
@input="$handleInputLimit">
<input class="input" @blur="inputBlurCallBack($event, i, 'alt', 2)" type="number" <input class="input" @blur="inputBlurCallBack($event, i, 'alt', 2)" type="number"
v-model="entityOptions.height" min="-9999999" max="999999999" v-model="entityOptions.height" min="-9999999" max="999999999"
v-if="activeTd.index == i && activeTd.name == 'alt'"> v-if="activeTd.index == i && activeTd.name == 'alt'">
@ -98,7 +103,8 @@
<div class="col"> <div class="col">
<span class="label">描边宽度</span> <span class="label">描边宽度</span>
<div class="input-number input-number-unit-2"> <div class="input-number input-number-unit-2">
<input class="input" type="number" title="" min="0" max="99" v-model="entityOptions.lineWidth" @input="$handleInputLimit"> <input class="input" type="number" title="" min="0" max="99" v-model="entityOptions.lineWidth"
@input="$handleInputLimit">
<span class="unit">px</span> <span class="unit">px</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -124,7 +130,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -376,4 +382,16 @@ defineExpose({
}) })
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss">
.polygon.dialog-en {
::v-deep>.content {
.attribute-content-link .table .tr .td.operation button,
.attribute-content-vr .table .tr .td.operation button,
.attribute-content-rtmp .table .tr .td.operation button {
width: 76px !important;
flex: 0 0 76px !important;
}
}
}
</style>

View File

@ -64,7 +64,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -75,8 +75,8 @@
<div class="col" style="flex: 0 0 33%"> <div class="col" style="flex: 0 0 33%">
<span class="label">缓冲宽度</span> <span class="label">缓冲宽度</span>
<div class="input-number input-number-unit-1" style="width: 80px"> <div class="input-number input-number-unit-1" style="width: 80px">
<input class="input" type="number" title="" min="0" data-min="0.01" max="999999" <input class="input" type="number" title="" min="0" data-min="0.01" max="999999" @input="$handleInputLimit"
@input="$handleInputLimit" v-model="entityOptions.extendWidth" /> v-model="entityOptions.extendWidth" />
<span class="unit">m</span> <span class="unit">m</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
@ -111,13 +111,13 @@
</div> </div>
</div> </div>
</div> </div>
<div class="div-item">
<div class="row"> <div class="row">
<el-tabs v-model="activeName"> <el-tabs v-model="activeName">
<el-tab-pane label="属性信息" name="1"> <el-tab-pane label="属性信息" name="1">
<attribute :entityOptions="entityOptions"></attribute> <attribute :entityOptions="entityOptions"></attribute>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="空间信息" name="2"> <el-tab-pane label="空间信息" name="2">
<div class="div-item">
<div class="row"> <div class="row">
<div class="col height-mode-box"> <div class="col height-mode-box">
<span class="label" style="flex: 0 0 56px">高度模式</span> <span class="label" style="flex: 0 0 56px">高度模式</span>
@ -176,13 +176,15 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="标签风格" name="3"> <el-tab-pane label="标签风格" name="3">
<div class="div-item">
<labelStyle type="线" :entityOptions="entityOptions"></labelStyle> <labelStyle type="线" :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</div>
<span class="custom-divider"></span> <span class="custom-divider"></span>
</template> </template>
<template #footer> <template #footer>
@ -200,7 +202,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -562,4 +564,16 @@ defineExpose({
} }
} }
} }
.polyline.dialog-en {
::v-deep>.content {
.attribute-content-link .table .tr .td.operation button,
.attribute-content-vr .table .tr .td.operation button,
.attribute-content-rtmp .table .tr .td.operation button {
width: 76px !important;
flex: 0 0 76px !important;
}
}
}
</style> </style>

View File

@ -66,7 +66,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -82,7 +82,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -24,7 +24,7 @@ import { GisApi } from '@/api/gisApi'
const props = defineProps({ const props = defineProps({
}); });
const host = window.location.host const host = localStorage.getItem('ip')
const visible = ref(false) const visible = ref(false)
const baseDialog:any = ref(null); const baseDialog:any = ref(null);
const eventBus:any = inject("bus"); const eventBus:any = inject("bus");

View File

@ -39,7 +39,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -14,7 +14,7 @@
<template #footer> <template #footer>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -49,7 +49,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -233,7 +233,7 @@
<template #footer> <template #footer>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -21,7 +21,7 @@
</template> </template>
<template #footer> <template #footer>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -12,18 +12,18 @@
<div class="div-item" style="display: flex"> <div class="div-item" style="display: flex">
<button @click="importHeader" style="margin-right: 15px"> <button @click="importHeader" style="margin-right: 15px">
<svg class="icon-updateheigh"> <svg class="icon-updateheigh">
<use xlink:href="#icon-importHeader"></use></svg <use xlink:href="#icon-importHeader"></use>
>{{ t('vector.导入表头') }} </svg>{{ t('vector.导入表头') }}
</button> </button>
<button @click="downloadHeader"> <button @click="downloadHeader">
<svg> <svg>
<use xlink:href="#icon-download"></use></svg <use xlink:href="#icon-download"></use>
>{{ t('vector.下载字典模板') }} </svg>{{ t('vector.下载字典模板') }}
</button> </button>
<button @click="exportExcel" style="position: absolute; right: 25px"> <button @click="exportExcel" style="position: absolute; right: 25px">
<svg> <svg>
<use xlink:href="#icon-export"></use></svg <use xlink:href="#icon-export"></use>
>{{ t('vector.导出') }} </svg>{{ t('vector.导出') }}
</button> </button>
</div> </div>
<span class="custom-divider"></span> <span class="custom-divider"></span>
@ -113,9 +113,10 @@ const maxPageNum: any = ref(0)
const filterData: any = ref([]) const filterData: any = ref([])
const title = ref('') const title = ref('')
const closeCallback = () => { const closeCallback = () => {
entityOptions.value.originalOptions = structuredClone(originalOptions) // entityOptions.value.originalOptions = structuredClone(originalOptions)
entityOptions.value.reset() // console.log('entityOptions--------------', entityOptions.value)
eventBus.emit('destroyComponent') // entityOptions.value.reset()
// eventBus.emit('destroyComponent')
} }
const getKeys = () => { const getKeys = () => {
keyData.value = [] keyData.value = []
@ -140,9 +141,8 @@ let features
const open = async (id: any) => { const open = async (id: any) => {
// that = window.earth.entityMap.get(id) // that = window.earth.entityMap.get(id)
node = window.treeObj.getNodeByParam('id', id, null) node = window.treeObj.getNodeByParam('id', id, null)
entityOptions.value.field = JSON.parse(node.params).field
that = getThat(node) that = getThat(node)
console.log(node, that, entityOptions.field, 'yyyyyyyyyyyyyy') entityOptions.value.field = that.field
if (that.options.id === id) { if (that.options.id === id) {
features = that.geojson.features features = that.geojson.features
} else { } else {
@ -157,7 +157,7 @@ const open = async (id: any) => {
let spliceData = arrSplice(arr, pageSize.value) let spliceData = arrSplice(arr, pageSize.value)
maxPageNum.value = spliceData.length maxPageNum.value = spliceData.length
tableData.value = spliceData[pageNum.value - 1] tableData.value = spliceData[pageNum.value - 1]
title.value = node.sourceName title.value = node.title || node.sourceName
getKeys() getKeys()
originalOptions = structuredClone(that.options) originalOptions = structuredClone(that.options)
entityOptions.value = that entityOptions.value = that
@ -227,8 +227,8 @@ const getTableList = ({ page, limit }) => {
tableData.value = spliceData[pageNum.value - 1] tableData.value = spliceData[pageNum.value - 1]
} }
const changeFieId = async (e) => { const changeFieId = async (e) => {
console.log(e, 'eeeeeeeee') let fNode = window.treeObj.getNodeByParam('id', that.options.id, null)
let data = JSON.parse(node.params) let data = JSON.parse(fNode.params)
data.field = e data.field = e
let params2 = { let params2 = {
id: data.id, id: data.id,

View File

@ -98,7 +98,7 @@
</div> </div>
<button @click="remove">删除</button> <button @click="remove">删除</button>
<button @click="confirm">确定</button> <button @click="confirm">确定</button>
<button @click="close">关闭</button> <button @click="close">取消</button>
</template> </template>
</Dialog> </Dialog>
</template> </template>

View File

@ -31,12 +31,16 @@
<span class="label">材质样式</span> <span class="label">材质样式</span>
<el-select class="input input-select input-select-line-type" v-model="entityOptions.material"> <el-select class="input input-select input-select-line-type" v-model="entityOptions.material">
<template #label="{ label, value }"> <template #label="{ label, value }">
<i class="yj-custom-icon" :class="material[value].icon"></i> <i class="yj-custom-icon" :class="material[value].icon"
:style="`background: url(${material[value].icon}) 100% 100% no-repeat;background-size: 100% 100%;`">
</i>
{{ label }} {{ label }}
</template> </template>
<el-option v-for="item in material" :key="item.key" :label="item.name" :value="item.key"> <el-option v-for="item in material" :key="item.key" :label="item.name" :value="item.key">
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<i class="yj-custom-icon" :class="item.icon"></i> <i class="yj-custom-icon" :class="item.icon"
:style="`background: url(${item.icon}) 100% 100% no-repeat;background-size: 100% 100%;`"
></i>
{{ item.name }} {{ item.name }}
</div> </div>
</el-option> </el-option>
@ -99,25 +103,25 @@ const material = ref([
name: '纯色墙', name: '纯色墙',
value: '纯色墙', value: '纯色墙',
key: 0, key: 0,
icon: 'icon-wall' icon: '../sdk/custom/img/icon-wall.png',
}, },
{ {
name: '上升墙', name: '上升墙',
value: '上升墙', value: '上升墙',
key: 1, key: 1,
icon: 'icon-wall-gradient' icon: '../sdk/custom/img/icon-wall-gradient.png'
}, },
{ {
name: '箭头墙', name: '箭头墙',
value: '箭头墙', value: '箭头墙',
key: 2, key: 2,
icon: 'icon-wall-arrow' icon: '../sdk/img/material/arrow.png'
}, },
{ {
name: '警戒墙', name: '警戒墙',
value: '警戒墙', value: '警戒墙',
key: 3, key: 3,
icon: 'icon-wall-warn' icon: '../sdk/img/material/warn.png'
} }
]) ])
eventBus.on("openStandTextAdd", () => { eventBus.on("openStandTextAdd", () => {

View File

@ -98,6 +98,7 @@ export const useRightOperate = () => {
params.params = JSON.stringify(params.params) params.params = JSON.stringify(params.params)
cusAddNodes(window.treeObj, params.parentId, [params]) cusAddNodes(window.treeObj, params.parentId, [params])
let entityObject = renderVector(params, true); let entityObject = renderVector(params, true);
entityObject.flyTo();
(window as any)._entityMap.set(id, entityObject) (window as any)._entityMap.set(id, entityObject)
} else if (["geojson"].includes(sourceType)) { } else if (["geojson"].includes(sourceType)) {
let baseURL = localStorage.getItem('ip') let baseURL = localStorage.getItem('ip')
@ -113,6 +114,8 @@ export const useRightOperate = () => {
width: 1, width: 1,
color: "rgb(239, 6, 6, 1)", color: "rgb(239, 6, 6, 1)",
} }
}, (entity:any) => {
entity?.flyTo()
}) })
} else { } else {
// 获取最后一个点的位置 // 获取最后一个点的位置
@ -683,7 +686,9 @@ export const useRightOperate = () => {
}) })
for (let i = 0; i < res.data.length; i++) { for (let i = 0; i < res.data.length; i++) {
let item = res.data[i] let item = res.data[i]
initMapData(type, JSON.parse(item.params), null) initMapData(type, JSON.parse(item.params), (entity: any) => {
entity.flyTo()
})
} }
cusAddNodes(window.treeObj, parentId, res.data) cusAddNodes(window.treeObj, parentId, res.data)
} }

View File

@ -595,6 +595,7 @@ export const useTreeNode = () => {
node.sourceName = sourceName; node.sourceName = sourceName;
node.oldname = sourceName; node.oldname = sourceName;
node.params = params; node.params = params;
delete node.title
window.treeObj.updateNode(node); window.treeObj.updateNode(node);
} }

View File

@ -1,13 +1,7 @@
<template> <template>
<div <div class="login-container" style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0">
class="login-container" <transition name="video-fade" mode="out-in"
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0" style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover">
>
<transition
name="video-fade"
mode="out-in"
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover"
>
<!-- 第一个视频播放一次 --> <!-- 第一个视频播放一次 -->
<!-- <video v-if="!isFirstVideoPlayed" ref="firstVideoRef" key="first-video" muted @ended="onFirstVideoEnded" <!-- <video v-if="!isFirstVideoPlayed" ref="firstVideoRef" key="first-video" muted @ended="onFirstVideoEnded"
src="../../assets/video/login_front.mp4" src="../../assets/video/login_front.mp4"
@ -15,14 +9,8 @@
<!-- 第二个视频循环播放 --> <!-- 第二个视频循环播放 -->
<!-- <video v-else key="second-video" autoplay loop muted src="../../assets/video/login_feature.mp4" <!-- <video v-else key="second-video" autoplay loop muted src="../../assets/video/login_feature.mp4"
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover"></video> --> style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover"></video> -->
<video <video key="second-video" autoplay loop muted src="../../assets/video/author_video.mp4"
key="second-video" style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover"></video>
autoplay
loop
muted
src="../../assets/video/author_video.mp4"
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover"
></video>
</transition> </transition>
<!-- 登录页面 --> <!-- 登录页面 -->
<div class="rightBox" v-if="isDesktop"> <div class="rightBox" v-if="isDesktop">
@ -39,95 +27,45 @@
</div> </div>
</div> </div>
</div> </div>
<el-form <el-form class="login-form" autoComplete="on" :model="loginForm" :rules="loginRules" ref="loginFormRef"
class="login-form" label-position="left">
autoComplete="on"
:model="loginForm"
:rules="loginRules"
ref="loginFormRef"
label-position="left"
>
<el-form-item prop="username"> <el-form-item prop="username">
<el-input <el-input name="username" type="text" v-model="loginForm.username" autoComplete="on" placeholder="请输入用户名"
name="username" :prefix-icon="User" />
type="text"
v-model="loginForm.username"
autoComplete="on"
placeholder="请输入用户名"
:prefix-icon="User"
/>
</el-form-item> </el-form-item>
<el-form-item prop="password"> <el-form-item prop="password">
<el-input <el-input type="password" @keyup.enter.native="handleLogin(loginFormRef)" v-model="loginForm.password"
type="password" autoComplete="on" placeholder="请输入密码" :prefix-icon="Unlock" show-password></el-input>
@keyup.enter.native="handleLogin(loginFormRef)"
v-model="loginForm.password"
autoComplete="on"
placeholder="请输入密码"
:prefix-icon="Unlock"
show-password
></el-input>
</el-form-item> </el-form-item>
<el-form-item class="rememberForget"> <el-form-item class="rememberForget">
<!-- justify-content: space-around;align-items: center; --> <!-- justify-content: space-around;align-items: center; -->
<div style="display: flex"> <div style="display: flex">
<svg <svg class="checkbox-svg" v-show="checkboxVModel" style="pointer-events: none"
class="checkbox-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14"
v-show="checkboxVModel" viewBox="0 0 14 14" fill="none">
style="pointer-events: none" <path fill="rgba(var(--color-base1), 1)"
xmlns="http://www.w3.org/2000/svg" d="M7.34788e-16 2L-2.20436e-15 12C-2.40727e-15 13.1046 0.895431 14 2 14L12 14C13.1046 14 14 13.1046 14 12L14 2C14 0.895431 13.1046 -1.46958e-15 12 -1.46958e-15L2 -1.46958e-15C0.895431 -1.60485e-15 8.02424e-16 0.895431 7.34788e-16 2Z">
xmlns:xlink="http://www.w3.org/1999/xlink" </path>
width="14"
height="14"
viewBox="0 0 14 14"
fill="none"
>
<path
fill="rgba(var(--color-base1), 1)"
d="M7.34788e-16 2L-2.20436e-15 12C-2.40727e-15 13.1046 0.895431 14 2 14L12 14C13.1046 14 14 13.1046 14 12L14 2C14 0.895431 13.1046 -1.46958e-15 12 -1.46958e-15L2 -1.46958e-15C0.895431 -1.60485e-15 8.02424e-16 0.895431 7.34788e-16 2Z"
></path>
<path <path
d="M5.47283 8.3039L3.10764 6.12807C3.06194 6.08647 2.99525 6.08647 2.94955 6.12946L2.04424 6.98093C1.98989 7.03224 1.98495 7.12376 2.03312 7.18201L6.03602 11.9566C6.09778 12.0301 6.20647 12.0065 6.24105 11.9136C7.03644 9.69343 9.25835 5.63439 11.9619 2.69585C11.999 2.65564 12.0101 2.59601 11.9904 2.54331L11.8211 2.08568C11.7915 2.00525 11.7038 1.97474 11.6396 2.02328C8.63587 4.21019 6.45966 6.92546 5.47283 8.3039Z" d="M5.47283 8.3039L3.10764 6.12807C3.06194 6.08647 2.99525 6.08647 2.94955 6.12946L2.04424 6.98093C1.98989 7.03224 1.98495 7.12376 2.03312 7.18201L6.03602 11.9566C6.09778 12.0301 6.20647 12.0065 6.24105 11.9136C7.03644 9.69343 9.25835 5.63439 11.9619 2.69585C11.999 2.65564 12.0101 2.59601 11.9904 2.54331L11.8211 2.08568C11.7915 2.00525 11.7038 1.97474 11.6396 2.02328C8.63587 4.21019 6.45966 6.92546 5.47283 8.3039Z"
fill="#004242" fill="#004242"></path>
></path>
</svg> </svg>
<svg <svg class="checkbox-svg" v-show="!checkboxVModel" style="pointer-events: none"
class="checkbox-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14"
v-show="!checkboxVModel" viewBox="0 0 14 14" fill="none">
style="pointer-events: none" <path fill-rule="evenodd" fill="url(#linear_border_2442_533_0)"
xmlns="http://www.w3.org/2000/svg" d="M0 12L0 2C0 0.895431 0.895431 0 2 0L12 0C13.1046 0 14 0.895431 14 2L14 12C14 13.1046 13.1046 14 12 14L2 14C0.895431 14 0 13.1046 0 12ZM2 12.5C1.72386 12.5 1.5 12.2761 1.5 12L1.5 2C1.5 1.72386 1.72386 1.5 2 1.5L12 1.5C12.2761 1.5 12.5 1.72386 12.5 2L12.5 12C12.5 12.2761 12.2761 12.5 12 12.5L2 12.5Z">
xmlns:xlink="http://www.w3.org/1999/xlink" </path>
width="14"
height="14"
viewBox="0 0 14 14"
fill="none"
>
<path
fill-rule="evenodd"
fill="url(#linear_border_2442_533_0)"
d="M0 12L0 2C0 0.895431 0.895431 0 2 0L12 0C13.1046 0 14 0.895431 14 2L14 12C14 13.1046 13.1046 14 12 14L2 14C0.895431 14 0 13.1046 0 12ZM2 12.5C1.72386 12.5 1.5 12.2761 1.5 12L1.5 2C1.5 1.72386 1.72386 1.5 2 1.5L12 1.5C12.2761 1.5 12.5 1.72386 12.5 2L12.5 12C12.5 12.2761 12.2761 12.5 12 12.5L2 12.5Z"
></path>
<defs> <defs>
<linearGradient <linearGradient id="linear_border_2442_533_0" x1="0" y1="-0.5574798583984375" x2="12.1173095703125"
id="linear_border_2442_533_0" y2="12.878036499023438" gradientUnits="userSpaceOnUse">
x1="0"
y1="-0.5574798583984375"
x2="12.1173095703125"
y2="12.878036499023438"
gradientUnits="userSpaceOnUse"
>
<stop offset="0.0625" stop-color="rgba(var(--color-base1), 1)" /> <stop offset="0.0625" stop-color="rgba(var(--color-base1), 1)" />
<stop offset="1" stop-color="var(--color-border1)" /> <stop offset="1" stop-color="var(--color-border1)" />
</linearGradient> </linearGradient>
</defs> </defs>
</svg> </svg>
<el-checkbox <el-checkbox :disabled="loading" v-model="checkboxVModel" @change="rememberpwd"
:disabled="loading" label="string">记住密码</el-checkbox>
v-model="checkboxVModel"
@change="rememberpwd"
label="string"
>记住密码</el-checkbox
>
<!-- <div style="cursor: pointer;">忘记密码</div> --> <!-- <div style="cursor: pointer;">忘记密码</div> -->
</div> </div>
</el-form-item> </el-form-item>
@ -150,24 +88,15 @@
<h2 class="greet"><span>欢迎您使用</span>实景三维电子沙盘系统</h2> <h2 class="greet"><span>欢迎您使用</span>实景三维电子沙盘系统</h2>
<div class="serviceContent"> <div class="serviceContent">
<el-tabs v-model="selectedService" class="demo-tabs" @tab-click="handleSelect"> <el-tabs v-model="selectedService" class="demo-tabs" @tab-click="handleSelect">
<el-tab-pane <el-tab-pane v-for="item in serviceOptions" :label="item.name" :name="item.name"></el-tab-pane>
v-for="item in serviceOptions"
:label="item.name"
:name="item.name"
></el-tab-pane>
</el-tabs> </el-tabs>
<div class="tabPanel"> <div class="tabPanel">
<template v-if="selectedService == '接口服务'"> <template v-if="selectedService == '接口服务'">
<div class="item"> <div class="item">
<span class="itemLabel">服务选择</span> <span class="itemLabel">服务选择</span>
<el-select class="select" popper-class="login-select-popper" v-model="servVal"> <el-select class="select" popper-class="login-select-popper" v-model="servVal">
<el-option <el-option size="mini" v-for="item in servOptions" :key="item.value" :label="item.name"
size="mini" :value="item.name">
v-for="item in servOptions"
:key="item.value"
:label="item.name"
:value="item.name"
>
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
@ -214,13 +143,8 @@
<div class="item"> <div class="item">
<span class="itemLabel">串口选择</span> <span class="itemLabel">串口选择</span>
<el-select class="select" popper-class="login-select-popper" v-model="gpsVal"> <el-select class="select" popper-class="login-select-popper" v-model="gpsVal">
<el-option <el-option size="mini" v-for="item in gpsOptions" :key="item.value" :label="item.Product"
size="mini" :value="item.Name">
v-for="item in gpsOptions"
:key="item.value"
:label="item.Product"
:value="item.Name"
>
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
@ -235,14 +159,8 @@
</div> </div>
</div> </div>
<!-- 授权页面 --> <!-- 授权页面 -->
<Dialog <Dialog ref="baseDialog" class="graffiti" title="系统授权" :closeCallback="closeCallBack" left="calc(50vw - 188px)"
ref="baseDialog" top="calc(50vh - 191px)">
class="graffiti"
title="系统授权"
:closeCallback="closeCallBack"
left="calc(50vw - 188px)"
top="calc(50vh - 191px)"
>
<template #content> <template #content>
<div class="auth_info custom_scroll_bar content_h"> <div class="auth_info custom_scroll_bar content_h">
<div class="auth_info_box"> <div class="auth_info_box">
@ -250,12 +168,7 @@
<span class="fankuai"></span> <span class="fankuai"></span>
{{ t('auths.authCode') }} {{ t('auths.authCode') }}
</div> </div>
<div <div class="auth_info_text" @click="copy(authInfo.license_code)" style="cursor: pointer" title="点击可复制">
class="auth_info_text"
@click="copy(authInfo.license_code)"
style="cursor: pointer"
title="点击可复制"
>
{{ authInfo.license_code || '' }} {{ authInfo.license_code || '' }}
<svg-icon name="copy" :size="20" style="margin-left: 30px"></svg-icon> <svg-icon name="copy" :size="20" style="margin-left: 30px"></svg-icon>
</div> </div>
@ -278,22 +191,13 @@
<span class="fankuai"></span> <span class="fankuai"></span>
{{ t('auths.authType') }} {{ t('auths.authType') }}
</div> </div>
<div <div v-if="authInfo.status != null" class="auth_info_text" style="font-size: 16px" :style="{
v-if="authInfo.status != null"
class="auth_info_text"
style="font-size: 16px"
:style="{
color: authInfo.status ? 'rgba(27, 248, 195, 1)' : 'rgba(255, 161, 69, 1)' color: authInfo.status ? 'rgba(27, 248, 195, 1)' : 'rgba(255, 161, 69, 1)'
}" }">
>
{{ authInfo.status ? t('auths.authTempExpire') : t('auths.authexpire') }} {{ authInfo.status ? t('auths.authTempExpire') : t('auths.authexpire') }}
</div> </div>
<!-- <div v-else class="auth_info_text">{{ authInfo.message || '无' }}</div> --> <!-- <div v-else class="auth_info_text">{{ authInfo.message || '无' }}</div> -->
<div <div v-else class="auth_info_text" style="font-size: 16px; color: rgba(241, 108, 85, 1)">
v-else
class="auth_info_text"
style="font-size: 16px; color: rgba(241, 108, 85, 1)"
>
{{ t('auths.noAuthexpire') }} {{ t('auths.noAuthexpire') }}
</div> </div>
</div> </div>
@ -313,6 +217,14 @@
import { User, Unlock, Setting, SwitchButton } from '@element-plus/icons-vue' import { User, Unlock, Setting, SwitchButton } from '@element-plus/icons-vue'
import { useLogin } from './useLogin' import { useLogin } from './useLogin'
import { useSetUp } from './useSetUp' import { useSetUp } from './useSetUp'
import { useI18n } from 'vue-i18n'
import { useRouter } from 'vue-router'
import useClipboard from 'vue-clipboard3'
import { ipcMain } from 'electron'
import { AuthApi } from '@/api/setting/auth'
import Dialog from '@/components/dialog/baseDialog.vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { $sendElectronChanel } from '@/utils/communication'
const { const {
loginFormRef, loginFormRef,
@ -371,7 +283,7 @@ onMounted(() => {
} }
} }
else { else {
ipcRenderer.once('program-init', () => { ipcRenderer.once('program-init', (error, e) => {
if (!router.currentRoute.value.query.type) { if (!router.currentRoute.value.query.type) {
getAuthCode() getAuthCode()
getAuthInfo() getAuthInfo()
@ -383,14 +295,6 @@ onMounted(() => {
}) })
//授权判断 //授权判断
import { useI18n } from 'vue-i18n'
import { useRouter } from 'vue-router'
import useClipboard from 'vue-clipboard3'
import { ipcMain } from 'electron'
import { AuthApi } from '@/api/setting/auth'
import Dialog from '@/components/dialog/baseDialog.vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { $sendElectronChanel } from '@/utils/communication'
let isAuth = ref(true) let isAuth = ref(true)
@ -1041,8 +945,7 @@ const validatePortRange = (rule, value, callback) => {
z-index: 99; z-index: 99;
background: linear-gradient(0deg, #00ffff33 0%, #00ffff00 100%), rgba(0, 0, 0, 0.6); background: linear-gradient(0deg, #00ffff33 0%, #00ffff00 100%), rgba(0, 0, 0, 0.6);
border: 1.5px solid; border: 1.5px solid;
border-image: linear-gradient(to bottom, rgba(var(--color-base1), 1) 6.25%, rgb(0, 200, 255) 100%) border-image: linear-gradient(to bottom, rgba(var(--color-base1), 1) 6.25%, rgb(0, 200, 255) 100%) 1;
1;
text-align: left; text-align: left;
font-family: 'sy-boldface'; font-family: 'sy-boldface';
} }
@ -1304,8 +1207,7 @@ const validatePortRange = (rule, value, callback) => {
align-items: center; align-items: center;
margin: 15px 0; margin: 15px 0;
.select { .select {}
}
} }
} }
} }
@ -1358,6 +1260,7 @@ const validatePortRange = (rule, value, callback) => {
.el-message-box__headerbtn { .el-message-box__headerbtn {
display: none !important; display: none !important;
} }
.el-message-box__btns { .el-message-box__btns {
.el-button { .el-button {
--el-button-text-color: #fff; --el-button-text-color: #fff;