This commit is contained in:
zyl
2025-11-19 11:14:47 +08:00
50 changed files with 1763 additions and 950 deletions

View File

@ -1,6 +1,10 @@
server:
host: 127.0.0.1
port: 8848
path: C:\Users\MSI\AppData\Roaming\dzsp_shijingjun_offline_Y_save
poi:
global:
enabled: false
sdk:
port: 8888
spring:

View File

@ -1 +1 @@
41b/ujShRZRf9Aa433FD3uyIZuxWSSqXWXlc2dyQfJ75ED0HNbadcdsPF5CaMuJ624E+iLBfS14muki3Kp1qv3N0KPVdc0TjJDyrO+AVfwFghRHbXEWYEGb3GpmVU0MwclqNNggKfnTvj0gDIpFBNl/nxMZKwYXbYk8nqd3yUDfwLryTr1ScTPGegLiv1C+r1SDxtenx4d2fxqS6FkGbV5TA9+UoajQ1PHwDUdI7SfpxjvK4tQscOcu0R0wLgUa3LypkZtybW+yeNEhnp/jeYw==
41b/ujShRZRf9Aa433FD3uyIZuxWSSqXWXlc2dyQfJ75ED0HNbadcdsPF5CaMuJ624E+iLBfS14muki3Kp1qv3N0KPVdc0TjJDyrO+AVfwE2pkhuoGoZ8sNGSUSrom2NhRIwJNl4SNhqGkxKvDJhRhWfxw6LHS3T/4NDVmw/KlXwLryTr1ScTPGegLiv1C+r0BN58Qcbdy/IN4J0/xuadZTA9+UoajQ1PHwDUdI7SfpTyz/mXYghVpbQcW8OYTHqLypkZtybW+yeNEhnp/jeYw==

Binary file not shown.

View File

@ -13,6 +13,8 @@ const http = require("http");
const yaml = require("js-yaml");
let Store = require('electron-store')
Store.initRenderer();
const store = new Store()
process.on('unhandledRejection', (reason) => {
console.error('主进程异步异常:', reason);
@ -128,6 +130,10 @@ function createWindow(): void {
})
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
let ymlPath = ymlBatPath.substring(1, 200)
const ymlContent = yaml.load(fs.readFileSync(ymlPath, 'utf8'));
ymlContent.server.path = path.dirname(store.path)
fs.writeFileSync(ymlPath, yaml.dump(ymlContent));
ipcMain.on("getIniConfig", (event, option) => {
let ymlPath = ymlBatPath.substring(1, 200)
console.log("iniPath", ymlPath);
@ -152,7 +158,7 @@ function createWindow(): void {
// 监听启动页完成的消息
ipcMain.on('splash-completed', () => {
// 启动页进度条已完成,可以关闭启动页并显示主窗口
if(isSeverInit) {
if (isSeverInit) {
mainWindow.webContents.send('program-init')
}
isAppInit = true
@ -415,8 +421,6 @@ function createWindow(): void {
"1300",
"-y",
"730",
"-rtsp_transport",
"tcp",
obj.url,
],
{
@ -428,6 +432,9 @@ function createWindow(): void {
console.log("out");
console.log(err);
e.sender.send("openFFPlayOut", err);
if (obj.id) {
e.sender.send("openFFPlayOut_" + obj.id, err, obj.id);
}
});
/* .on("stdout", function(err, m) {
@ -502,7 +509,7 @@ function windowAllClosed() {
setTimeout(() => {
if (isQuitting) {
console.log('清理脚本执行超时,强制退出');
cleanupProcess.kill(); // 终止卡住的脚本
// cleanupProcess.kill(); // 终止卡住的脚本
forceQuit();
}
}, 3000); // 3秒超时
@ -587,10 +594,10 @@ if (!gotTheLock) {
let string = data.toString().trim()
// console.log(`批处理输出: ${string}`);
// 临时处理:应用启动失败或项目文档地址出现时,认为服务初始化完成;后续需后端配合
if(string.indexOf('APPLICATION FAILED TO START') !== -1 || string.indexOf('项目文档地址') !== -1) {
if(!isSeverInit) {
if (string.indexOf('APPLICATION FAILED TO START') !== -1 || string.indexOf('项目文档地址') !== -1) {
if (!isSeverInit) {
isSeverInit = true
if(isAppInit) {
if (isAppInit) {
mainWindow.webContents.send('program-init')
}
}

View File

@ -26,7 +26,6 @@ declare module 'vue' {
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm']
ElPopover: typeof import('element-plus/es')['ElPopover']
ElRow: typeof import('element-plus/es')['ElRow']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSlider: typeof import('element-plus/es')['ElSlider']

File diff suppressed because one or more lines are too long

View File

@ -297,11 +297,6 @@
flex-wrap: wrap;
}
.YJ-custom-base-dialog>.content .row .input-select-unit-box,
.YJ-custom-base-dialog>.content .row .input-select-fit-unit-box {
flex: 0 0 270px;
}
.YJ-custom-base-dialog>.content .row:last-child {
margin-bottom: 0;
}
@ -424,7 +419,8 @@
}
.YJ-custom-base-dialog>.content .attribute .attribute-content-link .link_add_btn,
.YJ-custom-base-dialog>.content .attribute .attribute-content-vr .vr_add_btn {
.YJ-custom-base-dialog>.content .attribute .attribute-content-vr .vr_add_btn,
.YJ-custom-base-dialog>.content .attribute .attribute-content-rtmp .rtmp_add_btn {
display: inline-block;
width: 20px;
height: 20px;
@ -436,12 +432,14 @@
}
.YJ-custom-base-dialog>.content .attribute .attribute-content-link .link_add,
.YJ-custom-base-dialog>.content .attribute .attribute-content-vr .vr_add {
.YJ-custom-base-dialog>.content .attribute .attribute-content-vr .vr_add,
.YJ-custom-base-dialog>.content .attribute .attribute-content-rtmp .rtmp_add {
padding-right: 30px;
}
.YJ-custom-base-dialog>.content .attribute .attribute-content-link .tr .td:last-child button:first-child,
.YJ-custom-base-dialog>.content .attribute .attribute-content-vr .tr .td:last-child button:first-child {
.YJ-custom-base-dialog>.content .attribute .attribute-content-vr .tr .td:last-child button:first-child,
.YJ-custom-base-dialog>.content .attribute .attribute-content-rtmp .tr .td:last-child button:first-child {
margin-right: 5px;
}
@ -531,7 +529,8 @@
}
.YJ-custom-base-dialog>.content .attribute-content-link .table .table-body,
.YJ-custom-base-dialog>.content .attribute-content-vr .table .table-body {
.YJ-custom-base-dialog>.content .attribute-content-vr .table .table-body,
.YJ-custom-base-dialog>.content .attribute-content-rtmp .table .table-body {
max-height: 172px;
}
@ -816,8 +815,8 @@
.fly-roam>.content .table .tr .th:nth-child(2),
.fly-roam>.content .table .tr .td:nth-child(2) {
flex: 0 0 100px;
width: 100px;
flex: 0 0 180px;
width: 180px;
}
.fly-roam>.content .table .tr .th:last-child,
@ -2514,7 +2513,9 @@
.YJ-custom-base-dialog.polygon>.content .attribute-content-link .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.polygon>.content .attribute-content-link .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.polygon>.content .attribute-content-vr .table .tr .th: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-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 .td:nth-child(3) {
flex: 0 0 165px;
width: 165px;
justify-content: center;
@ -2596,7 +2597,9 @@
.YJ-custom-base-dialog.assemble>.content .attribute-content-link .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.assemble>.content .attribute-content-link .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.assemble>.content .attribute-content-vr .table .tr .th: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-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 .td:nth-child(3) {
flex: 0 0 165px;
width: 165px;
justify-content: center;
@ -2643,14 +2646,20 @@
.YJ-custom-base-dialog.circle>.content .attribute-content-link .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.circle>.content .attribute-content-vr .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.circle>.content .attribute-content-vr .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.circle>.content .attribute-content-rtmp .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.circle>.content .attribute-content-rtmp .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.attackArrow>.content .attribute-content-link .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.attackArrow>.content .attribute-content-link .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.attackArrow>.content .attribute-content-vr .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.attackArrow>.content .attribute-content-vr .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.attackArrow>.content .attribute-content-rtmp .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.attackArrow>.content .attribute-content-rtmp .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.pincerArrow>.content .attribute-content-link .table .tr .th:nth-child(3),
.YJ-custom-base-dialog.pincerArrow>.content .attribute-content-link .table .tr .td:nth-child(3),
.YJ-custom-base-dialog.pincerArrow>.content .attribute-content-vr .table .tr .th: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-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 .td:nth-child(3) {
flex: 0 0 165px;
width: 165px;
justify-content: center;
@ -2946,8 +2955,9 @@
.YJ-custom-base-dialog.polyline>.content input.input-text {
background-color: rgba(0, 0, 0, 0.5) !important;
border-radius: unset !important;
border-top: 1px solid rgba(var(--color-base1), 0.5) !important;
border-bottom: 1px solid rgba(var(--color-base1), 0.5) !important;
border: none;
border-top: 1px solid rgba(var(--color-base1), 0.7) !important;
border-bottom: 1px solid rgba(var(--color-base1), 0.7) !important;
}
.YJ-custom-base-dialog.polyline>.content>div .input-select-line-type-box .cy_datalist input {
@ -3133,7 +3143,9 @@
.YJ-custom-base-dialog.model>.content .attribute-content-link .table .tr .th:nth-child(2),
.YJ-custom-base-dialog.model>.content .attribute-content-link .table .tr .td:nth-child(2),
.YJ-custom-base-dialog.model>.content .attribute-content-vr .table .tr .th:nth-child(2),
.YJ-custom-base-dialog.model>.content .attribute-content-vr .table .tr .td:nth-child(2) {
.YJ-custom-base-dialog.model>.content .attribute-content-vr .table .tr .td:nth-child(2),
.YJ-custom-base-dialog.model>.content .attribute-content-rtmp .table .tr .th:nth-child(2),
.YJ-custom-base-dialog.model>.content .attribute-content-rtmp .table .tr .td:nth-child(2) {
flex: 0 0 210px;
width: 210px;
justify-content: center;
@ -3461,7 +3473,7 @@
.YJ-custom-checkbox-left:checked::after,
.YJ-custom-checkbox-right:checked::after {
content: "\2714";
content: "";
background-color: rgba(var(--color-base1), 1);
color: rgba(var(--color-sdk-auxiliary), 1);
width: 25px;
@ -3496,7 +3508,7 @@
}
.YJ-custom-base-dialog>.content input.YJ-custom-checkbox[type=checkbox]:checked::after {
content: "\2714";
content: "";
background-color: rgba(var(--color-base1), 1);
color: rgba(var(--color-sdk-auxiliary), 1);
width: 12px;

View File

@ -1,8 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="12" viewBox="0 0 12 12" >
<path d="M11.3166 3.25L0.598117 3.25C0.317037 3.25 0.0859375 3.025 0.0859375 2.74999C0.0859375 2.475 0.317037 2.25 0.598117 2.25L11.3166 2.25C11.5977 2.25 11.8288 2.475 11.8288 2.74999C11.8288 3.025 11.5977 3.25 11.3166 3.25Z" >
</path>
<path d="M4.60805 2.6125C4.59556 2.5375 4.58931 2.45625 4.58931 2.37499C4.58931 1.61875 5.20768 1 5.96348 1C6.71927 1 7.33765 1.61875 7.33765 2.37499C7.33765 2.45625 7.3314 2.53125 7.31891 2.6125L8.32454 2.6125C8.3308 2.5375 8.33703 2.45625 8.33703 2.37499C8.33703 1.06249 7.27518 0 5.96348 0C4.65178 0 3.58993 1.06249 3.58993 2.37499C3.58993 2.45625 3.59616 2.53125 3.60241 2.6125L4.60805 2.6125ZM9.45511 2.73124L9.45511 11L2.45936 11L2.45936 2.73124L1.45996 2.73124L1.45996 11.2188C1.45996 11.65 1.80976 12 2.24075 12L9.67372 12C10.1047 12 10.4545 11.65 10.4545 11.2188L10.4545 2.73124L9.45511 2.73124Z" >
</path>
<path d="M4.21395 9.36328L4.20146 9.36328C3.92663 9.36328 3.70801 9.14452 3.70801 8.86952L3.70801 5.35702C3.70801 5.08203 3.92663 4.86328 4.20146 4.86328L4.21395 4.86328C4.48879 4.86328 4.70741 5.08203 4.70741 5.35702L4.70741 8.87578C4.70741 9.14452 4.48879 9.36328 4.21395 9.36328ZM5.96289 9.36328L5.9504 9.36328C5.67556 9.36328 5.45695 9.14452 5.45695 8.86952L5.45695 5.35702C5.45695 5.08203 5.67556 4.86328 5.9504 4.86328L5.96289 4.86328C6.23772 4.86328 6.45635 5.08203 6.45635 5.35702L6.45635 8.87578C6.45635 9.14452 6.23772 9.36328 5.96289 9.36328ZM7.71183 9.36328L7.69933 9.36328C7.4245 9.36328 7.20589 9.14452 7.20589 8.86952L7.20589 5.35702C7.20589 5.08203 7.4245 4.86328 7.69933 4.86328L7.71183 4.86328C7.98666 4.86328 8.20527 5.08203 8.20527 5.35702L8.20527 8.87578C8.20527 9.14452 7.98666 9.36328 7.71183 9.36328Z" >
</path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="15.65869140625" height="16" viewBox="0 0 15.65869140625 16" fill="none"><path d="M14.9742 4.33334L0.682905 4.33334C0.308133 4.33334 0 4.03334 0 3.66666C0 3.3 0.308133 3 0.682905 3L14.9742 3C15.349 3 15.6571 3.3 15.6571 3.66666C15.6571 4.03334 15.349 4.33334 14.9742 4.33334Z" fill="#FFFFFF" ></path><path d="M6.02972 3.48334C6.01307 3.38334 6.00474 3.275 6.00474 3.16666C6.00474 2.15834 6.82924 1.33334 7.83697 1.33334C8.84469 1.33334 9.66919 2.15834 9.66919 3.16666C9.66919 3.275 9.66086 3.375 9.64421 3.48334L10.9851 3.48334C10.9934 3.38334 11.0017 3.275 11.0017 3.16666C11.0017 1.41666 9.5859 0 7.83697 0C6.08803 0 4.67223 1.41666 4.67223 3.16666C4.67223 3.275 4.68054 3.375 4.68888 3.48334L6.02972 3.48334ZM12.4925 3.64166L12.4925 14.6667L3.16481 14.6667L3.16481 3.64166L1.83228 3.64166L1.83228 14.9583C1.83228 15.5333 2.29867 16 2.87332 16L12.784 16C13.3586 16 13.825 15.5333 13.825 14.9583L13.825 3.64166L12.4925 3.64166Z" fill="#FFFFFF" ></path><path d="M5.50491 12.4834L5.48826 12.4834C5.12182 12.4834 4.83032 12.1917 4.83032 11.8251L4.83032 7.14172C4.83032 6.77506 5.12182 6.4834 5.48826 6.4834L5.50491 6.4834C5.87137 6.4834 6.16285 6.77506 6.16285 7.14172L6.16285 11.8334C6.16285 12.1917 5.87137 12.4834 5.50491 12.4834ZM7.83683 12.4834L7.82018 12.4834C7.45373 12.4834 7.16224 12.1917 7.16224 11.8251L7.16224 7.14172C7.16224 6.77506 7.45373 6.4834 7.82018 6.4834L7.83683 6.4834C8.20327 6.4834 8.49477 6.77506 8.49477 7.14172L8.49477 11.8334C8.49477 12.1917 8.20327 12.4834 7.83683 12.4834ZM10.1688 12.4834L10.1521 12.4834C9.78565 12.4834 9.49417 12.1917 9.49417 11.8251L9.49417 7.14172C9.49417 6.77506 9.78565 6.4834 10.1521 6.4834L10.1688 6.4834C10.5352 6.4834 10.8267 6.77506 10.8267 7.14172L10.8267 11.8334C10.8267 12.1917 10.5352 12.4834 10.1688 12.4834Z" fill="#FFFFFF" ></path></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -152,14 +152,14 @@ export default {
},
system: {
systemTitle: '系统面板',
authorize: '授权信息',
setting: '系统设置',
authorize: '授权管理',
setting: '系统管理',
project: '工程管理',
device: '设备管理',
materials: '物资管理',
modelManage: '模型管理',
graphLabelManage: '军标管理',
photoManage: '图标管理',
graphLabelManage: '军标管理',
version: '版本信息'
},
auths: {
@ -259,6 +259,7 @@ export default {
ISC摄像头: 'ISC摄像头',
: '传感器',
: '全景图',
rtmp: 'rtmp',
: '物资',
: '编辑内容',
: '打开文本编辑器',

View File

@ -258,6 +258,7 @@ export default {
ISC摄像头: 'ISC Camera',
: 'Sensor',
: 'Panorama photo',
rtmp: 'rtmp',
: 'Materials',
: 'Edit content',
: 'Open the editor',

View File

@ -257,6 +257,7 @@ export default {
ISC摄像头: 'ISC攝像頭',
: '傳感器',
: '全景圖',
rtmp: 'rtmp',
: '物資',
: '編輯內容',
: '打開文本編輯器',

View File

@ -415,11 +415,11 @@ img {
.ztree li span.button.chk {
background: none;
}
.ztree li span.button.roots_open, .ztree li span.button.bottom_open, .ztree li span.button.center_open {
.ztree li span.button.root_open, .ztree li span.button.roots_open, .ztree li span.button.bottom_open, .ztree li span.button.center_open {
background: url(../images/tree/roots-open.png) 0 0 no-repeat;
background-position: center !important;
}
.ztree li span.button.roots_close, .ztree li span.button.bottom_close, .ztree li span.button.center_close{
.ztree li span.button.root_close, .ztree li span.button.roots_close, .ztree li span.button.bottom_close, .ztree li span.button.center_close{
background: url(../images/tree/roots-close.png) 0 0 no-repeat;
background-position: center !important;
}
@ -605,6 +605,22 @@ img {
bottom: 126px !important;
right: 16px !important;
}
.YJ-custom-base-dialog>.content .row .input-select-unit-box {
.el-select {
.el-select__wrapper {
border: 1px solid rgba(var(--color-base1), 0.5);
}
&:nth-of-type(1) .el-select__wrapper {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
&:nth-of-type(2) .el-select__wrapper {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
}
}
}
.custom-slider-tooltip {

View File

@ -19,6 +19,9 @@ export const addMapSource = async ({type, id, sourceName = '未命名对象', op
}
}
delete options.host
if(options.attribute && options.attribute.rtmp) {
delete options.attribute.rtmp
}
switch (type) {
case 'rendezvous':
case 'attackArrow':

View File

@ -11,7 +11,7 @@
</div>
<div class="boxBody">
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="80px"
@keyup.enter.native="submitForm(ruleForm)">
@keyup.enter.native="submitForm(ruleForm)" @submit.native.prevent>
<el-form-item label="名称:" prop="sourceName">
<!-- @input="removeSpaces" -->
<el-input v-model.trim="form.sourceName" placeholder="图层文件夹"></el-input>

View File

@ -11,7 +11,7 @@
</div>
<div class="boxBody">
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="80px"
@keyup.enter.native="submitForm(ruleForm)">
@keyup.enter.native="submitForm(ruleForm)" @submit.native.prevent>
<el-form-item label="名称:" prop="sourceName">
<!-- @input="removeSpaces" -->
<el-input v-model.trim="form.sourceName" placeholder="节点名称"></el-input>
@ -49,9 +49,11 @@ const removeSpaces = (value: string) => {
}
const close = () => {
$changeComponentPop('.editdirectoryBox', false)
setTimeout(() => {
sourceId.value = ''
form.sourceName = ''
ruleForm.value?.resetFields()
}, 200);
}
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
@ -69,6 +71,7 @@ const add = throttle(async () => {
sourceName: form.sourceName
})
cusUpdateNode({ id: sourceId.value, sourceName: form.sourceName, params: undefined })
close()
// console.log(res)
}, 3000)
// //上传或修改树的层级

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M5.69937 5L9.80167 0.897704C10.0017 0.697704 10 0.59666 10 0.39666C9.9 0.19666 9.80334 0.1 9.60334 0C9.40334 0 9.3023 -0.00167015 9.1023 0.19833L5 4.30063L0.897704 0.19833C0.797704 0.0983299 0.701044 0 0.501044 0C0.401044 0 0.29833 0.0983299 0.19833 0.19833C0.0983299 0.29833 0 0.401044 0 0.501044C0 0.701044 0.0983299 0.797704 0.19833 0.897704L4.30063 5L0.19833 9.1023C-0.00167015 9.3023 0 9.40334 0 9.60334C0.1 9.80334 0.19666 9.9 0.39666 10C0.59666 10 0.697704 10.0017 0.897704 9.80167L5 5.69937L9.1023 9.80167C9.2023 9.90167 9.29896 10 9.49896 10C9.59896 10 9.70167 9.90167 9.80167 9.80167C9.90167 9.70167 10 9.59896 10 9.49896C10 9.29896 9.90167 9.2023 9.80167 9.1023L5.69937 5Z" fill="#FFFFFF" ></path></svg>

After

Width:  |  Height:  |  Size: 863 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 36 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -28,7 +28,7 @@ export const sysChange = async (eventBus) => {
let coor = systemSetting.coordinate ? systemSetting.coordinate : 'EPSG:4326'
YJ.Global.setCoordinateSystem(window.earth, coor)
//设置坐标格式
// YJ.Global.setDMS(window.earth, systemSetting.positionType)
YJ.Global.setDMS(window.earth, systemSetting.positionType)
//比例尺
await YJ.Global.SheetIndexStatusSwitch(window.earth, systemSetting.sheetIndexStatusSwitch)

View File

@ -194,6 +194,34 @@ const bottomMenuList = ref([
}
let id = new YJ.Tools().randomString()
let name = t(`default.point`)
let defaultStyle = (JSON.parse(localStorage.getItem('defaultStyle') || '{}').point) || {}
if(!defaultStyle) {
defaultStyle = {}
}
if(!defaultStyle.billboard) {
defaultStyle.billboard = {}
}
if(!defaultStyle.label) {
defaultStyle.label = {}
}
if(defaultStyle.billboard.image) {
try {
let urlObject = new URL(defaultStyle.billboardimage)
let pathname = urlObject.pathname
let folderName = pathname.split('/')[1]
if(folderName === 'iconLibrary') {
let ip = localStorage.getItem('ip') || ''
let ipObject = new URL(ip)
urlObject.port = ipObject.port
defaultStyle.billboard.image = urlObject.href
}
else {
urlObject.port = availablePort.value+''
defaultStyle.billboard.image = urlObject.href
}
} catch (error) {
}
}
await addMapSource({
type: 'point',
id: id,
@ -203,13 +231,19 @@ const bottomMenuList = ref([
name: name,
position: position,
billboard: {
show: true,
show: defaultStyle.billboard.show || true,
image:
YJ.Global.getBillboardDefaultUrl() ||
"http://localhost:" +
defaultStyle.billboard.image || "http://localhost:" +
availablePort.value +
"/" +
"GEMarker1/A-ablu-blank.png",
scale: defaultStyle.billboard.scale || 3,
},
label: {
show: defaultStyle.show || true,
color: defaultStyle.label.color,
fontFamily: defaultStyle.label.fontFamily,
fontSize: defaultStyle.label.fontSize,
}
}
})
@ -232,6 +266,7 @@ const bottomMenuList = ref([
}
let id = new YJ.Tools().randomString()
let name = t(`default.line`)
let defaultStyle = (JSON.parse(localStorage.getItem('defaultStyle') || '{}').line) || {}
await addMapSource({
type: 'line',
id: id,
@ -239,7 +274,18 @@ const bottomMenuList = ref([
opt: {
id: id,
name: name,
positions: positions
positions: positions,
color: defaultStyle.color,
width: defaultStyle.width,
type: defaultStyle.type,
noseToTail: defaultStyle.noseToTail,
smooth: defaultStyle.smooth,
extend: defaultStyle.extend,
extendWidth: defaultStyle.extendWidth,
extendColor: defaultStyle.extendColor,
rotate: defaultStyle.rotate,
speed: defaultStyle.speed,
space: defaultStyle.space,
}
})
})
@ -259,6 +305,7 @@ const bottomMenuList = ref([
}
let id = new YJ.Tools().randomString()
let name = t(`default.curve`)
let defaultStyle = (JSON.parse(localStorage.getItem('defaultStyle') || '{}').curve) || {}
await addMapSource({
type: 'curve',
id: id,
@ -266,7 +313,17 @@ const bottomMenuList = ref([
opt: {
id: id,
name: name,
positions: positions
positions: positions,
color: defaultStyle.color,
width: defaultStyle.width,
type: defaultStyle.type,
noseToTail: defaultStyle.noseToTail,
extend: defaultStyle.extend,
extendWidth: defaultStyle.extendWidth,
extendColor: defaultStyle.extendColor,
rotate: defaultStyle.rotate,
speed: defaultStyle.speed,
space: defaultStyle.space,
}
})
})

View File

@ -202,7 +202,7 @@ const routeImport = () => {
filters: [
{
name: '路网', //、底图
extensions: ['PBFL']
extensions: ['pbf']
}
]
}
@ -483,6 +483,7 @@ const importProject = () => {
console.log(arr, 'arrarr')
arr.pop()
// let path: any = 'C:/Users/Administrator/AppData/Roaming/yjearth'
console.log(paths[0], arr.join('/'), 'pathpath')
unzip_file(paths[0], arr.join('/'))
.then((res) => {
// loadingInstance.close()

View File

@ -58,7 +58,7 @@
<el-table-column prop="password" label="密码" width="120" />
<el-table-column prop="channel" label="通道号" width="120" />
<el-table-column prop="flvUrl" label="flv地址" width="300" />
<el-table-column fixed="right" label="操作" min-width="140">
<el-table-column fixed="right" label="操作" min-width="160">
<template #default="scope">
<el-button type="primary" size="small" @click="edit('编辑设备', scope.row)">
编辑

View File

@ -20,7 +20,7 @@
</el-select>
</div>
<!-- 主题色 -->
<div class="detailSkin"></div>
<!-- <div class="detailSkin"></div> -->
<div class="detailSkin">
<span class="titleLabel">{{ t('systemSetting.theme') }}</span>
<el-select
@ -66,7 +66,13 @@
<el-select style="width: 175px" v-model="systemSetting.coordinate" @change="sysChange">
<div
class="group-header"
:class="isHotGroupOpen ? 'arrowActive' : ''"
:class="
name_map1.filter((item) => {
return item.epsg == systemSetting.coordinate
}).length > 0
? 'arrowActive'
: ''
"
@click="toggleGroup('hot')"
>
地理坐标系
@ -74,14 +80,26 @@
v-if="isHotGroupOpen"
name="arrow2"
:size="10"
color="rgba(0, 255, 255, 1)"
:color="
name_map1.filter((item) => {
return item.epsg == systemSetting.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="rgba(255, 255, 255, 1)"
:color="
name_map1.filter((item) => {
return item.epsg == systemSetting.coordinate
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
"
style="margin-left: 10px"
></svg-icon>
</div>
@ -95,7 +113,13 @@
</div>
<div
class="group-header"
:class="isHotGroupOpen2 ? 'arrowActive' : ''"
:class="
name_map2.filter((item) => {
return item.epsg == systemSetting.coordinate
}).length > 0
? 'arrowActive'
: ''
"
@click="toggleGroup('ty')"
>
投影坐标系
@ -103,14 +127,26 @@
v-if="isHotGroupOpen2"
name="arrow2"
:size="10"
color="rgba(0, 255, 255, 1)"
:color="
name_map2.filter((item) => {
return item.epsg == systemSetting.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="rgba(255, 255, 255, 1)"
:color="
name_map2.filter((item) => {
return item.epsg == systemSetting.coordinate
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
"
style="margin-left: 10px"
></svg-icon>
</div>
@ -124,7 +160,7 @@
</div>
</el-select>
</div>
<div class="detailSkin"></div>
<!-- <div class="detailSkin"></div> -->
<div class="detailSkin" v-show="showPosiType">
<span class="titleLabel">{{ t('systemSetting.latitude') }}</span>
<el-select
@ -167,7 +203,7 @@
</el-option>
</el-select>
</div>
<div class="detailSkin1"></div>
<!-- <div class="detailSkin1"></div> -->
<div class="detailSkin1">
<span class="titleLabel">{{ t('systemSetting.areaUnit') }}</span>
<el-select
@ -202,7 +238,7 @@
</el-option>
</el-select>
</div>
<div class="detailSkin1"></div>
<!-- <div class="detailSkin1"></div> -->
<div class="detailSkin1">
<span class="titleLabel">{{ t('systemSetting.speedUnit') }}</span>
<el-select
@ -268,7 +304,7 @@
</el-option>
</el-select>
</div>
<div class="detailSkin1"></div>
<!-- <div class="detailSkin1"></div> -->
<div class="detailSkin1">
<span class="titleLabel">{{ t('ConcurrencyControl') }}</span>
<el-select
@ -703,21 +739,25 @@ onMounted(() => {
}
}
.seting_content {
width: 100%;
padding: 15px 0 0 22px;
width: calc(100% - 22px);
margin: 15px 0 0 22px;
display: grid;
grid-template-columns: repeat(3, 1fr);
.detailSkin {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.detailSkin {
width: 50%;
display: flex;
align-items: left;
box-sizing: border-box;
flex-direction: row;
padding-bottom: 15px;
> span {
font-size: 0.9rem;
color: #c8cfcf;
display: block;
width: 86px;
// width: 86px;
text-align: right;
}
}
@ -725,10 +765,12 @@ onMounted(() => {
.seting_content1 {
width: 100%;
padding: 15px 0 0 22px;
display: grid;
grid-template-columns: repeat(3, 1fr);
display: flex;
justify-content: space-between;
flex-wrap: wrap;
.detailSkin1 {
width: 100%;
width: 50%;
display: flex;
align-items: center;
box-sizing: border-box;
@ -737,7 +779,7 @@ onMounted(() => {
font-size: 0.9rem;
color: #c8cfcf;
display: inline-block;
width: 86px;
// width: 86px;
text-align: right;
}
}
@ -760,7 +802,7 @@ onMounted(() => {
font-size: 0.9rem;
color: #c8cfcf;
display: inline-block;
width: 86px;
// width: 86px;
text-align: right;
}
}
@ -792,5 +834,6 @@ onMounted(() => {
}
.titleLabel {
margin-right: 10px;
text-align: left !important;
}
</style>

View File

@ -105,12 +105,12 @@
<el-tab-pane :label="t('system.modelManage')" name="modelManage">
<modelManage></modelManage>
</el-tab-pane>
<el-tab-pane :label="t('system.graphLabelManage')" name="graphLabelManage">
<graphLabelManage></graphLabelManage>
</el-tab-pane>
<el-tab-pane :label="t('system.photoManage')" name="photoManage">
<photoManage></photoManage>
</el-tab-pane>
<el-tab-pane :label="t('system.graphLabelManage')" name="graphLabelManage">
<graphLabelManage></graphLabelManage>
</el-tab-pane>
<el-tab-pane :label="t('system.version')" name="version">
<version></version>
</el-tab-pane>

View File

@ -810,7 +810,7 @@ const methodMap = {
//模型压平
pressModel() {
if ((window as any).checkAuthIsValid) {
let selectedNode = window.treeObj.getSelectedNodes()[0]
let selectedNode = window.treeObj?.getSelectedNodes()[0]
if (selectedNode) {
let isTileset = ['bim', 'tileset'].includes(selectedNode.sourceType)
if (!isTileset) {

View File

@ -20,7 +20,7 @@
<span class="custom-divider"></span>
<div class="div-item">
<div class="row">
<div class="col input-select-unit-box">
<div class="col">
<span class="label">等高距</span>
<div class="input-number input-number-unit-1">
<input
@ -35,8 +35,8 @@
<span class="arrow"></span>
</div>
</div>
<div class="col input-select-unit-box" style="flex: 0 0 60px"></div>
<div class="col input-select-unit-box" style="flex: 0 0 157px">
<div class="col" style="flex: 0 0 60px"></div>
<div class="col" style="flex: 0 0 157px">
<span class="label">选中线颜色</span>
<div class="active-color"></div>
</div>
@ -49,11 +49,11 @@
<span class="label">计曲线</span>
<input class="btn-switch index-contour-switch" type="checkbox" />
</div>
<div class="col input-select-unit-box" style="flex: 0 0 120px">
<div class="col" style="flex: 0 0 120px">
<span class="label">计曲线颜色</span>
<div class="index-contour-color"></div>
</div>
<div class="col input-select-unit-box">
<div class="col">
<span class="label">计曲线宽度</span>
<div class="input-number input-number-unit-1">
<input
@ -74,11 +74,11 @@
<span class="label">首曲线</span>
<input class="btn-switch intermediate-contour-switch" type="checkbox" />
</div>
<div class="col input-select-unit-box" style="flex: 0 0 120px">
<div class="col" style="flex: 0 0 120px">
<span class="label">首曲线颜色</span>
<div class="intermediate-contour-color"></div>
</div>
<div class="col input-select-unit-box">
<div class="col">
<span class="label">首曲线宽度</span>
<div class="input-number input-number-unit-1">
<input
@ -99,11 +99,11 @@
<span class="label">间曲线</span>
<input class="btn-switch halfInterval-contour-switch" type="checkbox" />
</div>
<div class="col input-select-unit-box" style="flex: 0 0 120px">
<div class="col" style="flex: 0 0 120px">
<span class="label">间曲线颜色</span>
<div class="halfInterval-contour-color"></div>
</div>
<div class="col input-select-unit-box">
<div class="col">
<span class="label">间曲线宽度</span>
<div class="input-number input-number-unit-1">
<input
@ -123,11 +123,11 @@
<span class="label">助曲线</span>
<input class="btn-switch supplementary-contour-switch" type="checkbox" />
</div>
<div class="col input-select-unit-box" style="flex: 0 0 120px">
<div class="col" style="flex: 0 0 120px">
<span class="label">助曲线颜色</span>
<div class="supplementary-contour-color"></div>
</div>
<div class="col input-select-unit-box">
<div class="col">
<span class="label">助曲线宽度</span>
<div class="input-number input-number-unit-1">
<input

View File

@ -3,7 +3,7 @@
ref="baseDialog"
class="fly-roam"
title="飞行漫游"
width="382px"
width="460px"
left="180px"
top="100px"
:closeCallback="closeCallBack"
@ -14,9 +14,9 @@
<div class="row">
<div class="col" style="flex: 0 0 205px">
<span class="label">名称</span>
<input class="input" type="text" name="name" />
<input class="input" type="text" name="name" placeholder="请输入名称" />
</div>
<div class="col">
<!-- <div class="col">
<input
type="checkbox"
name="repeat"
@ -30,7 +30,7 @@
"
/>
<span class="label">循环播放</span>
</div>
</div> -->
</div>
</div>
<span class="custom-divider"></span>
@ -95,14 +95,14 @@
<svg class="icon-edit"><use xlink:href="#yj-icon-edit"></use></svg>调整视点
</button>
</div> -->
<div class="col">
<!-- <div class="col">
<button class="afreshPlay">
<svg class="icon-play"><use xlink:href="#yj-icon-play"></use></svg>全局播放
</button>
<button class="cease" style="margin-left: 10px">
<svg-icon name="stop" :size="12" color="rgba(255, 255, 255, 1)"></svg-icon>结束播放
</button>
</div>
</div> -->
<!-- <div class="col">
<button class="cease">
<svg class="icon-pause"><use xlink:href="#yj-icon-pause"></use></svg>结束播放
@ -110,8 +110,30 @@
</div> -->
</div>
<div class="row">
<div class="col" style="flex: 0 0 200px">
<div class="col" style="flex: 0 0 300px">
<span class="label">默认时长</span>
<div class="input-number input-number-unit-3">
<input
class="input total-time"
type="number"
title=""
min="0"
max="999999.99"
step="0.01"
name="defaultTime"
value="0"
/>
<span class="unit" style="top: 6px">s</span>
<span class="arrow"></span>
</div>
<button class="add-point" style="margin-left: 10px">
<svg class="icon-add"><use xlink:href="#yj-icon-add"></use></svg>增加视点
</button>
</div>
</div>
<div class="row">
<div class="col" style="flex: 0 0 300px">
<!-- <input
type="checkbox"
name="isTotalTime"
style="
@ -122,7 +144,7 @@
width: auto;
margin-right: 5px;
"
/>
/> -->
<span class="label">设置总时长</span>
<div class="input-number input-number-unit-3">
<input
@ -138,6 +160,14 @@
<span class="unit" style="top: 6px">s</span>
<span class="arrow"></span>
</div>
<button class="isTotalTime" style="margin-left: 10px">应用</button>
<input
type="checkbox"
name="repeat"
class="YJ-custom-checkbox"
style="cursor: pointer; width: auto; margin-right: 5px; margin-left: 10px"
/>
<span class="label">循环</span>
<!-- <button style="margin-left: 10px" @click="apply">应用</button> -->
</div>
</div>
@ -161,8 +191,14 @@
</template>
<template #footer>
<div style="position: absolute; left: 24px; display: flex">
<button class="add-point">
<svg class="icon-add"><use xlink:href="#yj-icon-add"></use></svg>增加视点
<button class="afreshPlay">
<svg class="icon-play"><use xlink:href="#yj-icon-play"></use></svg>播放
</button>
<button class="cease" style="margin-left: 10px">
<svg-icon name="stop" :size="12" color="rgba(255, 255, 255, 1)"></svg-icon>结束
</button>
<button class="video" style="margin-left: 10px" @click="startVideo">
<svg-icon name="video" :size="12"></svg-icon>录制
</button>
</div>
<button class="saveRoam" @click="draw">保存</button>
@ -180,6 +216,7 @@ import { app } from 'electron'
import { TreeApi } from '@/api/tree'
import { useTreeNode } from '../tree/hooks/treeNode'
import { ElMessage } from 'element-plus'
import { $sendElectronChanel } from '@/utils/communication'
const { t } = useI18n()
const { cusAddNodes } = useTreeNode()
@ -236,8 +273,24 @@ const draw = (data) => {
type: 'warning'
})
}
}
console.log(data)
const startVideo = () => {
document.getElementById('earthContainer').style.zIndex = 100
$sendElectronChanel('startRecoder')
ElMessage({
message: '按ESC结束录制',
type: 'warning'
})
const handleKeyDown = (e) => {
if (e.key === 'Escape') {
$sendElectronChanel('endRecoder')
window.removeEventListener('keydown', handleKeyDown)
document.getElementById('earthContainer').style.zIndex = ''
}
}
window.addEventListener('keydown', handleKeyDown)
}
const clangeViewPointHeight = () => {}
@ -275,15 +328,40 @@ defineExpose({
linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)),
linear-gradient(180deg, rgba(27, 248, 195, 0.2) 0%, rgba(27, 248, 195, 0) 100%) !important;
border: 1px solid rgba(27, 248, 195, 1) !important;
color: rgba(27, 248, 195, 1) !important;
svg {
fill: rgba(27, 248, 195, 1) !important;
}
}
.cease {
background:
linear-gradient(180deg, rgba(241, 108, 85, 0.2) 0%, rgba(241, 108, 85, 0) 100%),
rgba(0, 0, 0, 0.5) !important;
border: 1px solid rgba(241, 108, 85, 1) !important;
color: rgba(241, 108, 85, 1) !important;
svg {
fill: rgba(241, 108, 85, 1) !important;
}
}
.video {
background:
linear-gradient(
180deg,
rgba(71, 27, 5, 0.3) 0%,
rgba(71, 27, 5, 0.3) 0%,
rgba(255, 143, 87, 0) 100%
),
rgba(0, 0, 0, 0.5) !important;
border: 1px solid rgba(255, 165, 92, 1) !important;
color: rgba(255, 165, 92, 1) !important;
}
::v-deep .content input.YJ-custom-checkbox[type='checkbox'] {
border: 1px solid rgba(var(--color-base1), 1) !important;
background-color: rgba(0, 0, 0, 0.5) !important;
background-color: unset !important;
}
::v-deep .iconBut {
background: unset !important;
border: unset !important;
padding: unset !important;
}
</style>

View File

@ -20,9 +20,26 @@
</div>
<div class="div-item item" data-type="0" v-show="isShowing">
<span class="custom-divider"></span>
<p style="font-size: 16px; padding-bottom: 6px; margin-top: 10px; margin-bottom: 5px">
<p
style="
font-size: 16px;
padding-bottom: 6px;
margin-top: 10px;
margin-bottom: 5px;
display: flex;
justify-content: space-between;
"
>
<div>
<span style="margin-right: 10px"></span>
<span style="font-size: 12px; margin-bottom: 5px; color: #f16c55">例如116.6°, 39.9°</span>
<span style="font-size: 12px; margin-bottom: 5px; color: #f16c55"
>例如116.6°, 39.9°</span
>
</div>
<div style="display: flex; ">
<button class="pickUp"> </button>
<button class="convert" style="margin-left: 10px"> </button>
</div>
</p>
<div class="row">
<div class="col">
@ -45,17 +62,23 @@
<use xlink:href="#yj-icon-copy"></use>
</svg>
</i>
<button class="convert" style="margin-left: 10px"> </button>
<!-- <button class="convert" style="margin-left: 10px"> </button> -->
</div>
</div>
</div>
<div class="div-item item" data-type="1" v-show="isShowing">
<span class="custom-divider"></span>
<p style="font-size: 16px; padding-bottom: 6px; margin-top: 10px; margin-bottom: 5px">
<p style="font-size: 16px; padding-bottom: 6px; margin-top: 10px; margin-bottom: 5px;display: flex; justify-content: space-between;">
<div>
<span style="margin-right: 10px">度分</span>
<span style="font-size: 12px; margin-bottom: 5px; color: #f16c55"
>例如95°10.1702', 49°12.4015'</span
>
</div>
<div style="display: flex; ">
<button class="pickUp"> </button>
<button class="convert" style="margin-left: 10px"> </button>
</div>
</p>
<div class="row">
<div class="col" style="flex-direction: column">
@ -120,17 +143,23 @@
<use xlink:href="#yj-icon-copy"></use>
</svg>
</i>
<button class="convert" style="margin-left: 10px"> </button>
<!-- <button class="convert" style="margin-left: 10px"> </button> -->
</div>
</div>
</div>
<div class="div-item item" data-type="2" v-show="isShowing">
<span class="custom-divider"></span>
<p style="font-size: 16px; padding-bottom: 6px; margin-top: 10px; margin-bottom: 5px">
<p style="font-size: 16px; padding-bottom: 6px; margin-top: 10px; margin-bottom: 5px;display: flex; justify-content: space-between;">
<div>
<span style="margin-right: 10px">度分秒</span>
<span style="font-size: 12px; margin-bottom: 5px; color: #f16c55"
>例如11°18'54.37", 39°13'46.57"</span
>
</div>
<div style="display: flex; ">
<button class="pickUp">拾 取</button>
<button class="convert" style="margin-left: 10px">转 换</button>
</div>
</p>
<div class="row">
<div class="col" style="flex-direction: column">
@ -215,7 +244,7 @@
<use xlink:href="#yj-icon-copy"></use>
</svg>
</i>
<button class="convert" style="margin-left: 10px">转 换</button>
<!-- <button class="convert" style="margin-left: 10px">转 换</button> -->
</div>
</div>
</div>

View File

@ -0,0 +1,463 @@
<template>
<Dialog
ref="baseDialog"
class="RoutePlanning"
title="路径规划"
left="180px"
top="100px"
width="527px"
:closeCallback="closeCallBack"
>
<template #content>
<div class="row">
<div class="col" style="flex: 0 0 66px">
<span class="label" style="color: rgba(var(--color-base1), 1)">起点</span>
</div>
<div class="col">
<span class="label">经度</span>
<input
class="input"
id="startLng"
type="number"
title=""
min="-180"
max="180"
@model="startLng"
v-model="startLng"
@change="changeStartLng"
@input="inputStartLng"
/>
</div>
<div class="col">
<span class="label">纬度</span>
<input
class="input"
id="startLat"
type="number"
title=""
min="-90"
max="90"
@model="startLat"
v-model="startLat"
@change="changeStartLat"
@input="inputStartLat"
/>
</div>
<div class="col" style="flex: 0 0 95px">
<button class="end-pick-btn" @click="pickStartPos" style="margin-left: 10px">拾取</button>
<svg-icon
name="posiFly"
class="icon"
:size="18"
style="margin: 5px"
title="定位"
></svg-icon>
</div>
</div>
<!-- 避让区域 -->
<div class="row" v-for="i in yieldNum" :key="i">
<div class="col" style="flex: 0 0 66px">
<span class="label">避让区域</span>
</div>
<div class="col">
<span style="font-size: 12px; color: rgba(204, 204, 204, 1)">请绘制避让区域范围</span>
</div>
<div class="col" style="flex: 0 0 95px">
<button class="end-pick-btn" style="margin-left: 10px">绘制</button>
<svg-icon name="posiFly" class="icon" :size="18" style="margin: 5px"></svg-icon>
<svg-icon
name="close"
class="icon"
style="margin-right: -12px"
:size="12"
@click="deleteYieldArea()"
></svg-icon>
</div>
</div>
<!-- 途径点 -->
<div class="row" v-for="i in crossNum" :key="i">
<div class="col" style="flex: 0 0 66px">
<svg-icon
name="crossPoint"
class="icon"
style="margin-left: -18px"
:size="12"
@click="deleteYieldArea()"
></svg-icon>
<span class="label">{{ '途径点' + i }}</span>
</div>
<div class="col">
<span class="label">经度</span>
<input
class="input"
id="endLng"
type="number"
title=""
min="-180"
max="180"
@model="endLng"
v-model="endLng"
@change="changeEndLng"
@input="inputEndLng"
/>
</div>
<div class="col">
<span class="label">纬度</span>
<input
class="input"
id="endLat"
type="number"
title=""
min="-180"
max="180"
@model="endLat"
v-model="endLat"
@change="changeEndLat"
@input="inputEndLat"
/>
</div>
<div class="col" style="flex: 0 0 95px">
<button class="end-pick-btn" @click="pickEndPos" style="margin-left: 10px">拾取</button>
<svg-icon name="posiFly" class="icon" :size="18" style="margin: 5px"></svg-icon>
<svg-icon
name="close"
class="icon"
style="margin-right: -12px"
:size="12"
@click="deleteCrossPoint()"
></svg-icon>
</div>
</div>
<div class="row">
<div class="col" style="flex: 0 0 66px">
<span class="label" style="color: rgba(var(--color-base1), 1)">终点</span>
</div>
<div class="col">
<span class="label">经度</span>
<input
class="input"
id="endLng"
type="number"
title=""
min="-180"
max="180"
@model="endLng"
v-model="endLng"
@change="changeEndLng"
@input="inputEndLng"
/>
</div>
<div class="col">
<span class="label">纬度</span>
<input
class="input"
id="endLat"
type="number"
title=""
min="-180"
max="180"
@model="endLat"
v-model="endLat"
@change="changeEndLat"
@input="inputEndLat"
/>
</div>
<div class="col" style="flex: 0 0 95px">
<button class="end-pick-btn" @click="pickEndPos" style="margin-left: 10px">拾取</button>
<svg-icon name="posiFly" class="icon" :size="18" style="margin: 5px"></svg-icon>
</div>
</div>
<div
class="row"
style="align-items: flex-start; display: flex; justify-content: space-between"
>
<div class="col start-col">
<button
class="crossPoint"
@mouseenter="svgHover[0] = true"
@mouseleave="svgHover[0] = false"
@click="addCrossPoint()"
>
<svg-icon
name="add"
:size="12"
:color="svgHover[0] ? 'rgba(0, 255, 255, 1)' : 'rgba(255, 255, 255, 1)'"
></svg-icon>
途径点
</button>
<button
class="crossPoint"
@mouseenter="svgHover[1] = true"
@mouseleave="svgHover[1] = false"
@click="addYieldArea()"
style="margin-left: 10px"
>
<svg-icon
name="add"
:size="12"
:color="svgHover[1] ? 'rgba(0, 255, 255, 1)' : 'rgba(255, 255, 255, 1)'"
></svg-icon
>避让区域
</button>
</div>
<button @clik="routeQuery">
<svg class="icon-query"><use xlink:href="#yj-icon-query"></use></svg>查询
</button>
</div>
<span class="custom-divider"></span>
<div class="row" style="margin-top: 20px">
<p class="lable-left-line">路径规划</p>
</div>
<!-- 路线 -->
<div class="row">
<div class="col">
<span class="label">{{ '路线' }}</span>
</div>
<div class="col">
<span class="label">{{ '52分钟' }}</span>
</div>
<div class="col">
<span class="label">{{ '50公里' }}</span>
</div>
<div class="col">
<span class="label">{{ '中间有路段维修' }}</span>
</div>
<div class="col">
<button class="end-pick-btn">保存</button>
</div>
</div>
</template>
<!-- <template #footer>
<button id="routeQuery" @clik="routeQuery">
<svg class="icon-query"><use xlink:href="#yj-icon-query"></use></svg>查询
</button>
<button id="clearRoute" @click="clearRoute">
<svg class="icon-route"><use xlink:href="#yj-icon-route"></use></svg>清除路线
</button>
<button @click="close">取消</button>
</template> -->
</Dialog>
</template>
<script setup lang="ts">
import { ref, reactive, onBeforeUnmount } from 'vue'
import { inject } from 'vue'
import Dialog from '@/components/dialog/baseDialog.vue'
import { RouteApi } from '@/api/route/index'
import { add } from 'date-fns'
const baseDialog: any = ref(null)
const eventBus: any = inject('bus')
//避让区域
var yieldNum: any = ref(0)
const addYieldArea = () => {
console.log('addYieldArea')
yieldNum.value++
}
const deleteYieldArea = () => {
yieldNum.value > 0 ? yieldNum.value-- : (yieldNum.value = 0)
}
//途径点
var crossNum: any = ref(0)
const addCrossPoint = () => {
crossNum.value++
}
const deleteCrossPoint = () => {
crossNum.value > 0 ? crossNum.value-- : (crossNum.value = 0)
}
//属性
var startLng: any = ref(null)
var startLat: any = ref(null)
var endLng: any = ref(null)
var endLat: any = ref(null)
var routePlanning: any = reactive([])
var svgHover: any = reactive([false, false])
eventBus.on('routePlanningDialog', () => {
baseDialog.value?.open()
setTimeout(() => {
//加载路网数据
let host = 'http://192.168.110.25:8848'
routePlanning = new YJ.Obj.RoutePlanning(window.earth, {
gps: false,
host
})
routePlanning.Dialog.queryCallBack = async (v) => {
// await queryRoute(params, (response) => {
// if (response) {
// routePlanning.createRoute(response.list[0].positions)
// }
// })
let res = await RouteApi.queryRoute({
startLng: startLng.value,
startLat: startLat.value,
endLng: endLng.value,
endLat: endLat.value,
waypoints: []
})
if (res.code === 200) {
routePlanning.createRoute(res.data.pathPoints)
}
}
}, 100)
})
const open = () => {
baseDialog.value?.open()
setTimeout(() => {
//加载路网数据
let host = 'http://192.168.110.25:8848'
routePlanning = new YJ.Obj.RoutePlanning(window.earth, {
gps: false,
host
})
routePlanning.Dialog.queryCallBack = async (v) => {
// await queryRoute(params, (response) => {
// if (response) {
// routePlanning.createRoute(response.list[0].positions)
// }
// })
let res = await RouteApi.queryRoute({
startLng: startLng.value,
startLat: startLat.value,
endLng: endLng.value,
endLat: endLat.value,
waypoints: []
})
if (res.code === 200) {
routePlanning.createRoute(res.data.pathPoints)
}
}
}, 100)
}
//加载路网数据
const addRoute = async (fileId) => {
let res = await RouteApi.loadRoute({ fileId })
}
const getList = async () => {
let list = await RouteApi.getRouteList()
if (list.data.length > 0) {
let file = list.data[list.data.length - 1]
addRoute(file.id)
}
}
const closeCallBack = (e) => {
startLng.value = null
startLat.value = null
endLng.value = null
endLat.value = null
}
onBeforeUnmount(() => {
closeCallBack('')
})
const routeQuery = async (e) => {
let res = await RouteApi.queryRoute({
startLng: startLng.value,
startLat: startLat.value,
endLng: endLng.value,
endLat: endLat.value,
waypoints: []
})
}
const clearRoute = (e) => {}
const pickStartPos = () => {
routePlanning.pickStartPos((position) => {
startLng.value = position.lng
startLat.value = position.lat
})
}
const pickEndPos = () => {
routePlanning.pickEndPos((position) => {
endLng.value = position.lng
endLat.value = position.lat
})
}
const close = (e) => {
baseDialog.value?.close()
}
const changeStartLng = () => {
routePlanning.startLng = startLng.value
}
const inputStartLng = () => {
let dom: any = document.getElementById('startLng')
if (startLng.value < dom.min * 1) {
startLng.value = dom.min * 1
} else if (startLng.value > dom.max * 1) {
startLng.value = dom.max * 1
}
}
const changeStartLat = () => {
routePlanning.startLat = startLat.value
}
const inputStartLat = () => {
let dom: any = document.getElementById('startLat')
if (startLat.value < dom.min * 1) {
startLat.value = dom.min * 1
} else if (startLat.value > dom.max * 1) {
startLat.value = dom.max * 1
}
}
const changeEndLng = () => {
routePlanning.endLng = endLng.value
}
const inputEndLng = () => {
let dom: any = document.getElementById('endLng')
if (endLng.value < dom.min * 1) {
endLng.value = dom.min * 1
} else if (endLng.value > dom.max * 1) {
endLng.value = dom.max * 1
}
}
const changeEndLat = () => {
routePlanning.endLat = endLat.value
}
const inputEndLat = () => {
let dom: any = document.getElementById('endLat')
if (endLat.value < dom.min * 1) {
endLat.value = dom.min * 1
} else if (endLat.value > dom.max * 1) {
endLat.value = dom.max * 1
}
}
defineExpose({
open
})
</script>
<style scoped lang="scss">
#routeQuery {
position: absolute;
left: 10px;
display: flex;
}
#clearRoute {
position: absolute;
left: 95px;
display: flex;
}
.YJ-custom-base-dialog > .content .row > .col {
margin: 0 5px !important;
}
.crossPoint:hover {
color: rgba(var(--color-base1), 1);
}
.icon {
cursor: pointer;
}
</style>

View File

@ -9,7 +9,7 @@
:closeCallback="closeCallBack"
>
<template #content>
<div class="row" style="align-items: flex-start">
<!-- <div class="row" style="align-items: flex-start">
<div class="col start-col">
<button
class="crossPoint"
@ -37,7 +37,7 @@
>避让点
</button>
</div>
</div>
</div> -->
<div class="row">
<p class="lable-left-line">路径规划</p>
</div>
@ -195,6 +195,7 @@ const open = () => {
// routePlanning.createRoute(response.list[0].positions)
// }
// })
try {
let res = await RouteApi.queryRoute({
startLng: startLng.value,
startLat: startLat.value,
@ -203,7 +204,10 @@ const open = () => {
waypoints: []
})
if (res.code === 200) {
routePlanning.createRoute(res.data.pathPoints)
routePlanning.createRoute(res.data.routes[0]?.points)
}
} catch (error) {
document.getElementById('clearRoute').click()
}
}
}, 100)

View File

@ -1,171 +0,0 @@
<template>
<Dialog
ref="baseDialog"
class="RoutePlanning"
title="路径规划"
left="180px"
top="100px"
width="527px"
:closeCallback="closeCallBack"
>
<template #content>
<div class="row" style="align-items: flex-start">
<div class="col start-col">
<button
class="crossPoint"
@mouseenter="svgHover[0] = true"
@mouseleave="svgHover[0] = false"
>
<svg-icon
name="add"
:size="12"
:color="svgHover[0] ? 'rgba(0, 255, 255, 1)' : 'rgba(255, 255, 255, 1)'"
></svg-icon>
途径点
</button>
<button
class="crossPoint"
@mouseenter="svgHover[1] = true"
@mouseleave="svgHover[1] = false"
style="margin-left: 10px"
>
<svg-icon
name="add"
:size="12"
:color="svgHover[1] ? 'rgba(0, 255, 255, 1)' : 'rgba(255, 255, 255, 1)'"
></svg-icon
>避让点
</button>
</div>
</div>
<div class="row">
<p class="lable-left-line">路径规划</p>
</div>
<div class="row">
<div class="col" style="flex: 0 0 50px">
<span class="label">起点</span>
</div>
<div class="col">
<span class="label">经度</span>
<input class="input" type="number" title="" min="-180" max="180" @model="endLng" />
</div>
<div class="col">
<span class="label">纬度</span>
<input class="input" type="number" title="" min="-180" max="180" @model="endLng" />
</div>
<div class="col" style="flex: 0 0 80px">
<button class="end-pick-btn" @click="pickEndPos" style="margin-left: 10px">拾取</button>
</div>
</div>
<!-- 途径点 -->
<div class="row" v-for="(item, index) in positionList.waypoints" :key="index">
<div class="col" style="flex: 0 0 50px">
<span class="label">途径点</span>
</div>
<div class="col">
<span class="label">经度</span>
<input
class="input"
type="number"
title=""
min="-180"
max="180"
@model="endLng"
v-model="item.lng"
/>
</div>
<div class="col">
<span class="label">纬度</span>
<input
class="input"
type="number"
title=""
min="-180"
max="180"
@model="endLng"
v-model="item.lat"
/>
</div>
<div class="col" style="flex: 0 0 80px">
<button class="end-pick-btn" @click="pickEndPos" style="margin-left: 10px">拾取</button>
</div>
</div>
<div class="row">
<div class="col" style="flex: 0 0 50px">
<span class="label">终点</span>
</div>
<div class="col">
<span class="label">经度</span>
<input class="input" type="number" title="" min="-180" max="180" @model="endLng" />
</div>
<div class="col">
<span class="label">纬度</span>
<input class="input" type="number" title="" min="-180" max="180" @model="endLng" />
</div>
<div class="col" style="flex: 0 0 80px">
<button class="end-pick-btn" @click="pickEndPos" style="margin-left: 10px">拾取</button>
</div>
</div>
</template>
<template #footer>
<button @click="draw">绘制</button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { inject } from 'vue'
import Dialog from '@/components/dialog/baseDialog.vue'
const baseDialog: any = ref(null)
const eventBus: any = inject('bus')
var positionList: any = reactive([
{
startlng: 0,
startlat: 0,
endlng: 0,
endlat: 0,
waypoints: [
{
lat: 0,
lng: 0
}
]
}
])
//属性
var startLng: any = ref(null)
var startLat: any = ref(null)
var endLng: any = ref(null)
var endLat: any = ref(null)
var svgHover: any = reactive([false, false])
eventBus.on('routePlanningDialog', () => {
baseDialog.value?.open()
})
const closeCallBack = (e) => {}
function pickStartPos() {}
function pickEndPos() {}
const draw = (e) => {}
</script>
<style scoped lang="scss">
// ::v-deep .RoutePlanning > .content > div > .row .col {
// margin: 0 10px;
// }
// ::v-deep .RoutePlanning > .content .row .label {
// flex: auto;
// }
.YJ-custom-base-dialog > .content .row > .col {
margin: 0 5px !important;
}
.crossPoint:hover {
color: rgba(var(--color-base1), 1);
}
</style>

View File

@ -42,9 +42,9 @@
</div>
</div>
</template>
<template #footer>
<!-- <template #footer>
<button @click="close">关闭</button>
</template>
</template> -->
</Dialog>
</template>

View File

@ -10,32 +10,36 @@
<template #content>
<el-form label-width="100px" :model="addForm" :rules="peopleRules" ref="peopleFormRef">
<el-form-item label="名称" prop="cameraName">
<el-input v-model="addForm.cameraName" clearable placeholder="请输入设备名称" />
<el-input v-model.trim="addForm.cameraName" clearable placeholder="请输入设备名称" />
</el-form-item>
<el-form-item label="设备IP" prop="ip">
<el-input v-model="addForm.ip" clearable placeholder="请输入设备IP地址"></el-input>
<el-input v-model.trim="addForm.ip" clearable placeholder="请输入设备IP地址"></el-input>
</el-form-item>
<el-form-item label="设备端口" prop="port">
<el-input v-model="addForm.port" clearable placeholder="请输入设备端口"></el-input>
<el-input v-model.trim="addForm.port" clearable placeholder="请输入设备端口"></el-input>
</el-form-item>
<el-form-item label="用户名" prop="username">
<el-input v-model="addForm.username" clearable placeholder="请输入用户名"></el-input>
<el-input v-model.trim="addForm.username" clearable placeholder="请输入用户名"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="addForm.password" clearable placeholder="请输入密码"></el-input>
<el-input v-model.trim="addForm.password" clearable placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item label="设备类型" prop="type">
<el-select v-model="addForm.type" filterable placeholder="请选择设备类型">
<el-select v-model.trim="addForm.type" filterable placeholder="请选择设备类型">
<el-option label="海康" value="海康"> </el-option>
<el-option label="大华" value="大华"> </el-option>
<!-- <el-option label="手动录入" value="3"> </el-option> -->
</el-select>
</el-form-item>
<el-form-item v-if="addForm.type === '3'" label="视频流地址" prop="flvUrl">
<el-input v-model="addForm.flvUrl" clearable placeholder="请输入视频流地址"></el-input>
<el-input
v-model.trim="addForm.flvUrl"
clearable
placeholder="请输入视频流地址"
></el-input>
</el-form-item>
<el-form-item label="通道号" prop="channel">
<el-input v-model="addForm.channel" clearable placeholder="请输入通道号"></el-input>
<el-input v-model.trim="addForm.channel" clearable placeholder="请输入通道号"></el-input>
</el-form-item>
</el-form>
</template>
@ -77,9 +81,38 @@ var addForm: any = ref({
const peopleRules: any = reactive({
cameraName: [{ required: true, message: '请输入名称', trigger: 'blur' }],
ip: [{ required: true, message: '请输入ip', trigger: 'blur' }],
port: [{ required: true, message: '请输入设备端口号', trigger: 'blur' }],
port: [
{ required: true, message: '请输入设备端口号', trigger: 'blur' },
{
validator: (rule, value, callback) => {
if (!value) {
callback(new Error('请输入设备端口'))
return
}
const portNum = Number(value)
if (isNaN(portNum)) {
callback(new Error('端口号必须为数字'))
return
}
if (portNum < 1 || portNum > 65535) {
callback(new Error('端口号范围必须在1-65535之间'))
return
}
if (!Number.isInteger(portNum)) {
callback(new Error('端口号必须为整数'))
return
}
callback()
},
trigger: 'blur'
}
],
username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
password: [{ required: true, message: '请channel', trigger: 'blur' }],
password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
type: [{ required: true, message: '请选择设备类型', trigger: 'blur' }],
channel: [{ required: true, message: '请输入通道号', trigger: 'blur' }]
})

View File

@ -16,7 +16,7 @@
ref="peopleFormRef"
>
<el-form-item label="" prop="name">
<el-input v-model="addForm.name" placeholder="请输入物资名称" clearable />
<el-input v-model.trim="addForm.name" placeholder="请输入物资名称" clearable />
</el-form-item>
</el-form>
</template>
@ -86,6 +86,7 @@ var submitProtal = () => {
})
}
eventBus.on('openAddMaterial', (params) => {
console.log(params, 'iuiuuiuiu')
addTitle.value = params.title
if (addTitle.value != '添加物资') {
addForm.value.name = params.data.name

View File

@ -45,11 +45,11 @@
<textarea class="input link-edit" type="text" v-model="linkEditActive.url"></textarea>
</div>
<div class="td" v-else>{{ item.url }}</div>
<div class="td" 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)">{{ t('general.确认') }}</button>
<button style="width: 76px;flex: 0 0 76px" @click="linkCancelEdit">{{ t('general.取消') }}</button>
</div>
<div class="td" v-else>
<div class="td operation" v-else>
<button style="width: 76px;flex: 0 0 76px" @click="linkEdit(index, item)">{{ t('general.编辑') }}</button>
<button style="width: 76px;flex: 0 0 76px" @click="linkDelete(index)">{{ t('general.删除') }}</button>
</div>
@ -172,13 +172,57 @@
<textarea class="input link-edit" type="text" v-model="vrEditActive.url"></textarea>
</div>
<div class="td" v-else>{{ item.url }}</div>
<div class="td" v-if="vrEditActive.index === index">
<button style="width: 76px;flex: 0 0 76px" @click="vrConfirmEdit(index)">{{ t('general.确认') }}</button>
<button style="width: 76px;flex: 0 0 76px" @click="vrCancelEdit">{{ t('general.取消') }}</button>
<div class="td operation" v-if="vrEditActive.index === index">
<button @click="vrConfirmEdit(index)">{{ t('general.确认') }}</button>
<button @click="vrCancelEdit">{{ t('general.取消') }}</button>
</div>
<div class="td" v-else>
<button style="width: 76px;flex: 0 0 76px" @click="vrEdit(index, item)">{{ t('general.编辑') }}</button>
<button style="width: 76px;flex: 0 0 76px" @click="vrDelete(index)">{{ t('general.删除') }}</button>
<div class="td operation" v-else>
<button @click="vrEdit(index, item)">{{ t('general.编辑') }}</button>
<button @click="vrDelete(index)">{{ t('general.删除') }}</button>
</div>
</div>
</div>
<div class="table-empty" v-else>
<div class="empty-img"></div>
<p>{{ t('general.暂无数据') }}</p>
</div>
</div>
</div>
<div class="row attribute-content attribute-content-rtmp" v-show="attributeType === 'rtmp'">
<div class="col">
<span class="label">{{ t('general.添加链接') }}</span>
<div style="flex: 1; position: relative">
<input class="input rtmp_add" type="text" v-model="addRtmpInput" />
<i class="rtmp_add_btn" @click="_addRtmp"></i>
</div>
</div>
</div>
<div class="attribute-content attribute-content-rtmp" v-show="attributeType === 'rtmp'">
<div class="table">
<div class="table-head">
<div class="tr">
<div class="th">{{ t('general.名称') }}</div>
<div class="th">{{ t('general.链接') }}</div>
<div class="th">{{ t('general.操作') }}</div>
</div>
</div>
<div class="table-body" v-if="attribute.rtmp && attribute.rtmp.content && attribute.rtmp.content.length > 0">
<div class="tr" v-for="(item, index) in attribute.rtmp.content">
<div class="td" v-if="rtmpEditActive.index === index">
<input class="input" type="text" v-model="rtmpEditActive.name" />
</div>
<div class="td" v-else>{{ item.name }}</div>
<div class="td" v-if="rtmpEditActive.index === index">
<textarea class="input link-edit" type="text" v-model="rtmpEditActive.url"></textarea>
</div>
<div class="td" v-else>{{ item.url }}</div>
<div class="td operation" v-if="rtmpEditActive.index === index">
<button @click="rtmpConfirmEdit(index)">{{ t('general.确认') }}</button>
<button @click="rtmpCancelEdit">{{ t('general.取消') }}</button>
</div>
<div class="td operation" v-else>
<button @click="rtmpEdit(index, item)">{{ t('general.编辑') }}</button>
<button @click="rtmpDelete(index)">{{ t('general.删除') }}</button>
</div>
</div>
</div>
@ -386,6 +430,11 @@ if (props.entityOptions.type === 'BillboardObject') {
// value: '传感器',
// key: 'sensor'
// },
// {
// name: 'rtmp',
// value: 'rtmp',
// key: 'rtmp'
// },
{
name: '全景图',
value: '全景图',
@ -404,8 +453,10 @@ if (props.entityOptions.type === 'BillboardObject') {
const addlinkInput = ref('')
const addvrInput = ref('')
const addRtmpInput = ref('')
const linkEditActive: any = ref({})
const vrEditActive: any = ref({})
const rtmpEditActive: any = ref({})
const openRichTextEditor = () => {
eventBus.emit('openRichText', props.entityOptions.name, richTextContent.value, (val: any) => {
@ -571,6 +622,38 @@ const vrCancelEdit = () => {
vrEditActive.value = {}
}
const _addRtmp = () => {
if (addRtmpInput.value) {
let link = {
name: t('general.rtmp'),
url: addRtmpInput.value,
id: Date.now()
}
attribute.value.rtmp.content.push(link)
addRtmpInput.value = ''
}
}
const rtmpEdit = (index: any, item: { name: any; url: any; }) => {
let active = {
index: index,
name: item.name,
url: item.url,
id: item.id,
}
rtmpEditActive.value = active
}
const rtmpDelete = (index: any) => {
attribute.value.rtmp.content.splice(index, 1)
}
const rtmpConfirmEdit = (index: string | number) => {
attribute.value.rtmp.content[index] = rtmpEditActive.value
rtmpEditActive.value = {}
}
const rtmpCancelEdit = () => {
rtmpEditActive.value = {}
}
const attributeChange = () => { }
const changeAttributeGoods = (item) => {
@ -633,7 +716,9 @@ const changeAttributeCamera = (e) => {
.YJ-custom-base-dialog>.content .attribute-content-link .table .tr .th:nth-child(1),
.YJ-custom-base-dialog>.content .attribute-content-link .table .tr .td:nth-child(1),
.YJ-custom-base-dialog>.content .attribute-content-vr .table .tr .th:nth-child(1),
.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 .td:nth-child(1) {
width: 164px;
flex: 0 0 164px;
}
@ -641,7 +726,9 @@ const changeAttributeCamera = (e) => {
.YJ-custom-base-dialog>.content .attribute-content-link .table .tr .th:nth-child(2),
.YJ-custom-base-dialog>.content .attribute-content-link .table .tr .td:nth-child(2),
.YJ-custom-base-dialog>.content .attribute-content-vr .table .tr .th:nth-child(2),
.YJ-custom-base-dialog>.content .attribute-content-vr .table .tr .td:nth-child(2) {
.YJ-custom-base-dialog>.content .attribute-content-vr .table .tr .td:nth-child(2),
.YJ-custom-base-dialog>.content .attribute-content-rtmp .table .tr .th:nth-child(2),
.YJ-custom-base-dialog>.content .attribute-content-rtmp .table .tr .td:nth-child(2) {
width: 226px;
flex: 0 0 226px;
}
@ -649,7 +736,9 @@ const changeAttributeCamera = (e) => {
.YJ-custom-base-dialog>.content .attribute-content-link .table .tr .th:nth-child(3),
.YJ-custom-base-dialog>.content .attribute-content-link .table .tr .td:nth-child(3),
.YJ-custom-base-dialog>.content .attribute-content-vr .table .tr .th:nth-child(3),
.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 .td:nth-child(3) {
flex: 0 0 150px;
width: 150px;
justify-content: center;
@ -657,14 +746,17 @@ const changeAttributeCamera = (e) => {
.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-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 .td:nth-child(3) {
flex: 0 0 190px;
width: 190px;
justify-content: center;
}
.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,
.YJ-custom-base-dialog>.content .attribute-content-rtmp .table .tr .td .input-group .input {
border-radius: 5px 0 0 5px;
}

View File

@ -86,7 +86,7 @@
</div>
<span class="custom-divider"></span>
<div class="div-item">
<!-- <setStyle type="点" :sourceType="sourceType" :entityOptions="entityOptions"></setStyle> -->
<setStyle type="点" :sourceType="sourceType" :entityOptions="entityOptions"></setStyle>
<div class="row" style="padding-left: 12px;">
<div class="col">
<span class="label" style="flex: none">{{ t('dialog.point.icon.show') }}</span>
@ -339,6 +339,7 @@
</el-tabs>
</div>
</div>
<span class="custom-divider"></span>
</template>
<template #footer>
<div style="position: absolute; left: 24px; display: flex">
@ -467,47 +468,48 @@ const open = async (id, type) => {
entityOptions.value.labelColor = 'rgba(255,255,255,1)'
} //点击清空按钮事件回调
})
let iconTextBold = document.getElementsByClassName('bold')[0]
let iconTextItalic = document.getElementsByClassName('italic')[0]
let iconTextLineBottom = document.getElementsByClassName('line-bottom')[0]
let iconTextLineThrough = document.getElementsByClassName('line-through')[0]
let tip: any = document.getElementsByClassName('customized-tip')[0]
iconTextBold.addEventListener('mouseleave', (event:any) => {
tip.style.display = 'none'
})
iconTextBold.addEventListener('mousemove', (event:any) => {
tip.innerHTML = t('general.text.bold')
tip.style.left = (event.layerX + 8) + 'px'
tip.style.top = (event.layerY + 18) + 'px'
tip.style.display = 'block'
})
iconTextItalic.addEventListener('mouseleave', (event:any) => {
tip.style.display = 'none'
})
iconTextItalic.addEventListener('mousemove', (event:any) => {
tip.innerHTML = t('general.text.italic')
tip.style.left = (event.layerX + 8) + 'px'
tip.style.top = (event.layerY + 18) + 'px'
tip.style.display = 'block'
})
iconTextLineBottom.addEventListener('mouseleave', (event:any) => {
tip.style.display = 'none'
})
iconTextLineBottom.addEventListener('mousemove', (event:any) => {
tip.innerHTML = t('general.text.underline')
tip.style.left = (event.layerX + 8) + 'px'
tip.style.top = (event.layerY + 18) + 'px'
tip.style.display = 'block'
})
iconTextLineThrough.addEventListener('mouseleave', (event:any) => {
tip.style.display = 'none'
})
iconTextLineThrough.addEventListener('mousemove', (event:any) => {
tip.innerHTML = t('general.text.strikethrough')
tip.style.left = (event.layerX + 8) + 'px'
tip.style.top = (event.layerY + 18) + 'px'
tip.style.display = 'block'
})
// let iconTextBold = document.getElementsByClassName('bold')[0]
// let iconTextItalic = document.getElementsByClassName('italic')[0]
// let iconTextLineBottom = document.getElementsByClassName('line-bottom')[0]
// let iconTextLineThrough = document.getElementsByClassName('line-through')[0]
// let tip: any = document.getElementsByClassName('customized-tip')[0]
// iconTextBold.addEventListener('mouseleave', (event:any) => {
// tip.style.display = 'none'
// })
// iconTextBold.addEventListener('mousemove', (event:any) => {
// tip.innerHTML = t('general.text.bold')
// tip.style.left = (event.layerX + 8) + 'px'
// tip.style.top = (event.layerY + 18) + 'px'
// tip.style.display = 'block'
// })
// iconTextItalic.addEventListener('mouseleave', (event:any) => {
// tip.style.display = 'none'
// })
// iconTextItalic.addEventListener('mousemove', (event:any) => {
// tip.innerHTML = t('general.text.italic')
// tip.style.left = (event.layerX + 8) + 'px'
// tip.style.top = (event.layerY + 18) + 'px'
// tip.style.display = 'block'
// })
// iconTextLineBottom.addEventListener('mouseleave', (event:any) => {
// tip.style.display = 'none'
// })
// iconTextLineBottom.addEventListener('mousemove', (event:any) => {
// tip.innerHTML = t('general.text.underline')
// tip.style.left = (event.layerX + 8) + 'px'
// tip.style.top = (event.layerY + 18) + 'px'
// tip.style.display = 'block'
// })
// iconTextLineThrough.addEventListener('mouseleave', (event:any) => {
// tip.style.display = 'none'
// })
// iconTextLineThrough.addEventListener('mousemove', (event:any) => {
// tip.innerHTML = t('general.text.strikethrough')
// tip.style.left = (event.layerX + 8) + 'px'
// tip.style.top = (event.layerY + 18) + 'px'
// tip.style.display = 'block'
// })
}
const closeCallback = () => {
@ -698,6 +700,7 @@ const confirm = () => {
baseDialog.value?.close()
let params = structuredClone(that.options)
delete params.host
delete params.attribute.rtmp
let params2 = {
id: params.id,
sourceName: params.name,
@ -812,10 +815,18 @@ defineExpose({
.attribute-content-link .table .tr .th:nth-child(2),
.attribute-content-link .table .tr .td:nth-child(2),
.attribute-content-vr .table .tr .th:nth-child(2),
.attribute-content-vr .table .tr .td:nth-child(2) {
.attribute-content-vr .table .tr .td:nth-child(2),
.attribute-content-rtmp .table .tr .th:nth-child(2),
.attribute-content-rtmp .table .tr .td:nth-child(2) {
width: 284px;
flex: 0 0 284px;
}
.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;
}
}
}

View File

@ -1,12 +1,5 @@
<template>
<Dialog
ref="baseDialog"
title="曲线标注"
left="180px"
top="100px"
className="polyline"
:closeCallback="closeCallback"
>
<Dialog ref="baseDialog" title="曲线标注" left="180px" top="100px" className="polyline" :closeCallback="closeCallback">
<template #content>
<span class="custom-divider"></span>
<div class="div-item">
@ -35,6 +28,84 @@
</div>
</div>
</div>
<span class="custom-divider"></span>
<div class="div-item">
<setStyle type="折线" :sourceType="sourceType" :entityOptions="entityOptions"></setStyle>
<div class="row">
<div class="col">
<span class="label">线条颜色</span>
<div class="color" ref="colorRef"></div>
</div>
<div class="col" style="flex: 0 0 33%">
<span class="label">线条宽度</span>
<div class="input-number input-number-unit-1" style="width: 80px">
<input class="input" type="number" title="" min="1" max="999" @input="$handleInputLimit"
v-model="entityOptions.lineWidth" />
<span class="unit">px</span>
<span class="arrow"></span>
</div>
</div>
<div class="col input-select-line-type-box" style="flex: 0 0 37%">
<span class="label">线条形式</span>
<el-select class="input input-select input-select-line-type" style="margin-left: 20px"
v-model="entityOptions.lineType" @change="lineTypechange">
<el-option v-for="item in lineTypeData" :key="item.key" :label="item.name" :value="item.key">
<i class="yj-custom-icon" :class="item.icon"></i>
{{ item.name }}
</el-option>
</el-select>
</div>
</div>
<div class="row">
<div class="col">
<span class="label">线段缓冲</span>
<input class="btn-switch" type="checkbox" v-model="entityOptions.extend" />
</div>
<div class="col" style="flex: 0 0 33%">
<span class="label">缓冲宽度</span>
<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="$handleInputLimit" v-model="entityOptions.extendWidth" />
<span class="unit">m</span>
<span class="arrow"></span>
</div>
</div>
<div class="col" style="flex: 0 0 37%">
<span class="label">缓冲颜色</span>
<div class="extendColor" ref="extendColorRef"></div>
</div>
</div>
<div class="row" v-show="entityOptions.lineType > 2 && entityOptions.lineType < 13">
<div class="col">
<span class="label">首尾反向</span>
<input class="btn-switch" type="checkbox" v-model="entityOptions.rotate" />
</div>
<div class="col" style="flex: 0 0 33%">
<span class="label">流动速率</span>
<div class="input-number input-number-unit-1" style="width: 80px">
<input class="input" type="number" title="" min="0" max="999999" step="1" @input="$handleInputLimit"
v-model="entityOptions.speed" />
<span class="arrow"></span>
</div>
</div>
<div class="col" style="flex: 0 0 37%">
<span class="label lineSpace" v-show="entityOptions.lineType > 2 && entityOptions.lineType >= 5">线条间距</span>
<div class="input-number input-number-unit-1 lineSpace" style="width: 80px"
v-show="entityOptions.lineType > 2 && entityOptions.lineType >= 5">
<input class="input" type="number" title="" min="0" max="4.5" step="0.1" @input="$handleInputLimit"
v-model="entityOptions.space" />
<span class="unit"></span>
<span class="arrow"></span>
</div>
</div>
</div>
<div class="row">
<div class="col">
<span class="label">首尾相连</span>
<input class="btn-switch" type="checkbox" v-model="entityOptions.noseToTail" />
</div>
</div>
</div>
<div class="div-item">
<div class="row">
<el-tabs v-model="activeName">
@ -45,46 +116,22 @@
<div class="row">
<div class="col height-mode-box">
<span class="label" style="flex: 0 0 56px">高度模式</span>
<el-select
class="input input-select height-mode-scelect"
style="width: 155px; margin-left: 20px"
v-model="heightMode"
@change="heightModeChange"
placeholder="请选择"
>
<el-option
v-for="item in heightModeData"
:key="item.key"
:label="item.name"
:value="item.key"
>
<el-select class="input input-select height-mode-scelect" style="width: 155px; margin-left: 20px"
v-model="heightMode" @change="heightModeChange" placeholder="请选择">
<el-option v-for="item in heightModeData" :key="item.key" :label="item.name" :value="item.key">
</el-option>
</el-select>
</div>
<div class="col">
<span class="label">Z值统一增加</span>
<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"
@input="$handleInputLimit"
v-model="height"
/>
<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"
@input="$handleInputLimit" v-model="height" />
<span class="unit">m</span>
<span class="arrow"></span>
</div>
<button
class="confirm height-confirm"
style="margin-left: 5px"
@click="heightConfirm"
:disabled="heightMode == 2"
>
<button class="confirm height-confirm" style="margin-left: 5px" @click="heightConfirm"
:disabled="heightMode == 2">
应用
</button>
</div>
@ -103,42 +150,21 @@
<div class="tr" v-for="(item, i) in entityOptions.options.positions" :key="i">
<div class="td">{{ i + 1 }}</div>
<div class="td lng align-center" @dblclick="inputDblclick($event, i, 'lng')">
<input
class="input"
@blur="inputBlurCallBack($event, i, 'lng', 8)"
type="number"
v-model="item.lng"
min="-180"
max="180"
@input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'lng'"
/>
<input class="input" @blur="inputBlurCallBack($event, i, 'lng', 8)" type="number"
v-model="item.lng" min="-180" max="180" @input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'lng'" />
<span style="pointer-events: none" v-else>{{ item.lng.toFixed(8) }}</span>
</div>
<div class="td lat align-center" @dblclick="inputDblclick($event, i, 'lat')">
<input
class="input"
@blur="inputBlurCallBack($event, i, 'lat', 8)"
type="number"
v-model="item.lat"
min="-180"
max="180"
@input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'lat'"
/>
<input class="input" @blur="inputBlurCallBack($event, i, 'lat', 8)" type="number"
v-model="item.lat" min="-180" max="180" @input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'lat'" />
<span style="pointer-events: none" v-else>{{ item.lat.toFixed(8) }}</span>
</div>
<div class="td alt align-center" @dblclick="inputDblclick($event, i, 'alt')">
<input
class="input"
@blur="inputBlurCallBack($event, i, 'alt', 2)"
type="number"
v-model="item.alt"
min="-9999999"
max="999999999"
@input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'alt'"
/>
<input class="input" @blur="inputBlurCallBack($event, i, 'alt', 2)" type="number"
v-model="item.alt" min="-9999999" max="999999999" @input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'alt'" />
<span style="pointer-events: none" v-else>{{ item.alt.toFixed(2) }}</span>
</div>
</div>
@ -146,130 +172,7 @@
</div>
</div>
</el-tab-pane>
<el-tab-pane label="线条风格" name="3">
<div class="row">
<div class="col">
<span class="label">线条颜色</span>
<div class="color" ref="colorRef"></div>
</div>
<div class="col" style="flex: 0 0 33%">
<span class="label">线条宽度</span>
<div class="input-number input-number-unit-1" style="width: 80px">
<input
class="input"
type="number"
title=""
min="1"
max="999"
@input="$handleInputLimit"
v-model="entityOptions.lineWidth"
/>
<span class="unit">px</span>
<span class="arrow"></span>
</div>
</div>
<div class="col input-select-line-type-box" style="flex: 0 0 37%">
<span class="label">线条形式</span>
<el-select
class="input input-select input-select-line-type"
style="margin-left: 20px"
v-model="entityOptions.lineType"
@change="lineTypechange"
>
<el-option
v-for="item in lineTypeData"
:key="item.key"
:label="item.name"
:value="item.key"
>
<i class="yj-custom-icon" :class="item.icon"></i>
{{ item.name }}
</el-option>
</el-select>
</div>
</div>
<div class="row">
<div class="col">
<span class="label">线段缓冲</span>
<input class="btn-switch" type="checkbox" v-model="entityOptions.extend" />
</div>
<div class="col" style="flex: 0 0 33%">
<span class="label">缓冲宽度</span>
<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="$handleInputLimit"
v-model="entityOptions.extendWidth"
/>
<span class="unit">m</span>
<span class="arrow"></span>
</div>
</div>
<div class="col" style="flex: 0 0 37%">
<span class="label">缓冲颜色</span>
<div class="extendColor" ref="extendColorRef"></div>
</div>
</div>
<div class="row" v-show="entityOptions.lineType > 2 && entityOptions.lineType < 13">
<div class="col">
<span class="label">首尾反向</span>
<input class="btn-switch" type="checkbox" v-model="entityOptions.rotate" />
</div>
<div class="col" style="flex: 0 0 33%">
<span class="label">流动速率</span>
<div class="input-number input-number-unit-1" style="width: 80px">
<input
class="input"
type="number"
title=""
min="0"
max="999999"
step="1"
@input="$handleInputLimit"
v-model="entityOptions.speed"
/>
<span class="arrow"></span>
</div>
</div>
<div class="col" style="flex: 0 0 37%">
<span
class="label lineSpace"
v-show="entityOptions.lineType > 2 && entityOptions.lineType >= 5"
>线条间距</span
>
<div
class="input-number input-number-unit-1 lineSpace"
style="width: 80px"
v-show="entityOptions.lineType > 2 && entityOptions.lineType >= 5"
>
<input
class="input"
type="number"
title=""
min="0"
max="4.5"
step="0.1"
@input="$handleInputLimit"
v-model="entityOptions.space"
/>
<span class="unit"></span>
<span class="arrow"></span>
</div>
</div>
</div>
<div class="row">
<div class="col">
<span class="label">首尾相连</span>
<input class="btn-switch" type="checkbox" v-model="entityOptions.noseToTail" />
</div>
</div>
</el-tab-pane>
<el-tab-pane label="标签风格" name="4">
<el-tab-pane label="标签风格" name="3">
<labelStyle type="线" :entityOptions="entityOptions"></labelStyle>
</el-tab-pane>
</el-tabs>
@ -280,7 +183,8 @@
<div style="position: absolute; left: 24px; display: flex">
<button @click="nodeEdit">
<svg class="icon-edit">
<use xlink:href="#yj-icon-edit"></use></svg>二次编辑
<use xlink:href="#yj-icon-edit"></use>
</svg>二次编辑
</button>
<button style="margin-left: 10px" @click="translate">平移</button>
</div>
@ -300,6 +204,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import Dialog from '@/components/dialog/baseDialog.vue'
import { getFontList } from './fontSelect'
import attribute from './attribute.vue'
import setStyle from './defaultStyle/index.vue'
import labelStyle from './labelStyle.vue'
import { useTreeNode } from '@/views/components/tree/hooks/treeNode'
@ -309,6 +214,7 @@ const { cusUpdateNode, getSelectedNodes, cusRemoveNode } = useTreeNode()
const baseDialog: any = ref(null)
const eventBus: any = inject('bus')
const sourceType = ref('')
const length = ref(0)
const lengthUnit = ref('m')
const fontList = ref(getFontList())
@ -425,8 +331,9 @@ const wordsName = ref(0)
let originalOptions
let that
const open = async (id) => {
const open = async (id, type) => {
that = window.earth.entityMap.get(id)
sourceType.value = type
originalOptions = structuredClone(that.options)
entityOptions.value = that
wordsName.value = Number(entityOptions.value.wordsName)
@ -513,7 +420,7 @@ const changeWordsName = (val) => {
const lineTypechange = () => {}
const lineTypechange = () => { }
const nodeEdit = () => {
entityOptions.value.positionEditing = false
entityOptions.value.noseToTail = false

View File

@ -0,0 +1,126 @@
<template>
<div class="row">
<div class="col">
<span class="lable-left-line">新增{{ props.type }}标签风格设置</span>
<div style="display: flex;align-items: center;margin-right: 30px;">
<button style="margin-right: 10px;" @click="setInitialStyle">初始风格</button>
<el-tooltip effect="customized" :hide-after="0" placement="top">
<template #content>初始系统默认的{{ props.type }}标签风格<br />点击初始风格按钮{{ props.type }}系统初始风格设置为新增{{ props.type
}}的标签风格</template>
<svg class="icon-prompt">
<use xlink:href="#icon-prompt"></use>
</svg>
</el-tooltip>
</div>
<div style="display: flex;align-items: center;">
<button style="margin-right: 10px;" @click="setCurrentStyle">当前风格</button>
<el-tooltip effect="customized" :hide-after="0" placement="top">
<template #content>当前面板设置的{{ props.type }}标签风格<br />点击当前风格按钮{{ props.type }}当前面板风格设置为新增{{ props.type
}}的标签风格</template>
<svg class="icon-prompt">
<use xlink:href="#icon-prompt"></use>
</svg>
</el-tooltip>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { getdefaultLabelStyle } from './style'
const props = defineProps({
type: {
type: String,
default: ''
},
sourceType: {
type: String,
default: ''
},
entityOptions: {
type: Object,
default: {}
}
})
const setInitialStyle = () => {
let style = getdefaultLabelStyle(props.sourceType)
let defaultStyle = JSON.parse(localStorage.getItem('defaultStyle') || '{}')
defaultStyle[props.sourceType] = style
localStorage.setItem('defaultStyle', JSON.stringify(defaultStyle))
ElMessage({
message: `新增${props.type}风格设置成功!`,
type: "success",
});
}
const setCurrentStyle = () => {
let options = props.entityOptions.options
let defaultStyle = JSON.parse(localStorage.getItem('defaultStyle') || '{}')
switch (props.sourceType) {
case 'point':
defaultStyle[props.sourceType] = {
billboard: {
show: options.billboard.show,
image: options.billboard.image,
scale: options.billboard.scale,
},
label: {
show: options.label.show,
fontSize: options.label.fontSize,
color: options.label.color,
fontFamily: options.label.fontFamily,
}
}
break
case 'line':
defaultStyle[props.sourceType] = {
color: options.color,
width: options.width,
type: options.type,
noseToTail: options.noseToTail,
smooth: options.smooth,
extend: options.extend,
extendWidth: options.extendWidth,
extendColor: options.extendColor,
rotate: options.rotate,
speed: options.speed,
space: options.space,
}
break
case 'curve':
defaultStyle[props.sourceType] = {
color: options.color,
width: options.width,
type: options.type,
noseToTail: options.noseToTail,
extend: options.extend,
extendWidth: options.extendWidth,
extendColor: options.extendColor,
rotate: options.rotate,
speed: options.speed,
space: options.space,
}
break
}
localStorage.setItem('defaultStyle', JSON.stringify(defaultStyle))
ElMessage({
message: `新增${props.type}风格设置成功!`,
type: "success",
});
}
</script>
<style scoped>
.lable-left-line {
margin-right: 10px;
}
.icon-prompt {
fill: rgba(241, 108, 85, 1) !important;
width: 16px;
height: 16px;
margin: 0;
}
</style>

View File

@ -0,0 +1,12 @@
let defaultLabelStyle = {
point: {
},
line: {
},
curve: {
}
}
//@ts-ignore
export const getdefaultLabelStyle = (type) => {
return (type ? defaultLabelStyle[type] : defaultLabelStyle)
}

View File

@ -4,9 +4,9 @@
<span class="lable-left-line">新增{{ props.type }}风格设置</span>
<div style="display: flex;align-items: center;margin-right: 30px;">
<button style="margin-right: 10px;" @click="setInitialStyle">初始风格</button>
<el-tooltip
effect="customized" :hide-after="0" placement="top">
<template #content>初始系统默认的{{props.type}}风格<br />点击初始风格按钮{{props.type}}系统初始风格设置为新增{{props.type}}风格</template>
<el-tooltip effect="customized" :hide-after="0" placement="top">
<template #content>初始系统默认的{{ props.type }}风格<br />点击初始风格按钮{{ props.type }}系统初始风格设置为新增{{ props.type
}}风格</template>
<svg class="icon-prompt">
<use xlink:href="#icon-prompt"></use>
</svg>
@ -14,10 +14,10 @@
</div>
<div style="display: flex;align-items: center;">
<button style="margin-right: 10px;">当前风格</button>
<el-tooltip
effect="customized" :hide-after="0" placement="top">
<template #content>当前面板设置的{{props.type}}风格<br />点击当前风格按钮{{props.type}}当前面板风格设置为新增{{props.type}}风格</template>
<button style="margin-right: 10px;" @click="setCurrentStyle">当前风格</button>
<el-tooltip effect="customized" :hide-after="0" placement="top">
<template #content>当前面板设置的{{ props.type }}风格<br />点击当前风格按钮{{ props.type }}当前面板风格设置为新增{{ props.type
}}风格</template>
<svg class="icon-prompt">
<use xlink:href="#icon-prompt"></use>
</svg>
@ -50,6 +50,65 @@ const setInitialStyle = () => {
let defaultStyle = JSON.parse(localStorage.getItem('defaultStyle') || '{}')
defaultStyle[props.sourceType] = style
localStorage.setItem('defaultStyle', JSON.stringify(defaultStyle))
ElMessage({
message: `新增${props.type}风格设置成功!`,
type: "success",
});
}
const setCurrentStyle = () => {
let options = props.entityOptions.options
let defaultStyle = JSON.parse(localStorage.getItem('defaultStyle') || '{}')
switch (props.sourceType) {
case 'point':
defaultStyle[props.sourceType] = {
billboard: {
show: options.billboard.show,
image: options.billboard.image,
scale: options.billboard.scale,
},
label: {
show: options.label.show,
fontSize: options.label.fontSize,
color: options.label.color,
fontFamily: options.label.fontFamily,
}
}
break
case 'line':
defaultStyle[props.sourceType] = {
color: options.color,
width: options.width,
type: options.type,
noseToTail: options.noseToTail,
smooth: options.smooth,
extend: options.extend,
extendWidth: options.extendWidth,
extendColor: options.extendColor,
rotate: options.rotate,
speed: options.speed,
space: options.space,
}
break
case 'curve':
defaultStyle[props.sourceType] = {
color: options.color,
width: options.width,
type: options.type,
noseToTail: options.noseToTail,
extend: options.extend,
extendWidth: options.extendWidth,
extendColor: options.extendColor,
rotate: options.rotate,
speed: options.speed,
space: options.space,
}
break
}
localStorage.setItem('defaultStyle', JSON.stringify(defaultStyle))
ElMessage({
message: `新增${props.type}风格设置成功!`,
type: "success",
});
}
</script>

View File

@ -3,11 +3,9 @@ let availablePort = 55110
ipcRenderer.invoke('get-available-port').then((port) => {
availablePort = port
})
//@ts-ignore
export const getdefaultStyle = (type) => {
switch (type) {
case 'point':
return {
let defaultStyle = {
point: {
billboard: {
show: true,
image: "http://localhost:" +
@ -20,18 +18,36 @@ export const getdefaultStyle = (type) => {
show: true,
fontSize: 39,
color: 'rgba(0, 255, 255, 1)',
fontFamily: 'Helvetica',
}
}
case 'line':
return {
color: 'rgba(241, 108, 85, 1)',
fontSize: 12,
fontName: '微软雅黑',
fontWeight: '400',
fontStyle: 'normal',
textDecoration: 'none',
background: 'rgba(0, 0, 0, 0.5)',
fontFamily: 0,
}
},
line: {
color: '#ff0000',
width: 3,
type: 0,
noseToTail: false,
smooth: false,
extend: false,
extendWidth: 10,
extendColor: "rgba(255,255,80,0.3)",
rotate: true,
speed: 10,
space: 1
},
curve: {
color: '#ff0000',
width: 3,
type: 0,
noseToTail: false,
extend: false,
extendWidth: 10,
extendColor: "rgba(255,255,80,0.3)",
rotate: true,
speed: 10,
space: 1
}
}
//@ts-ignore
export const getdefaultStyle = (type) => {
return (type ? defaultStyle[type] : defaultStyle)
}

View File

@ -916,6 +916,32 @@ function attributeElm(that) {
</div>
</div>
</div>
<div class="row attribute-content attribute-content-rtmp">
<div class="col">
<span class="label">添加链接</span>
<div style="flex: 1;position: relative;">
<input class="input rtmp_add" type="text">
<i class="rtmp_add_btn" @click="_addRtmp"></i>
</div>
</div>
</div>
<div class="attribute-content attribute-content-rtmp">
<div class="table">
<div class="table-head">
<div class="tr">
<div class="th">名称</div>
<div class="th">链接</div>
<div class="th">操作</div>
</div>
</div>
<div class="table-body">
</div>
<div class="table-empty">
<div class="empty-img"></div>
<p>暂无数据</p>
</div>
</div>
</div>
<div class="attribute-content attribute-content-goods">
<div>
<div class="row">

View File

@ -1,6 +1,8 @@
<template>
<div>
<div class="row"></div>
<div class="row">
<setLabelStyle :type="type" :entityOptions="entityOptions" />
</div>
<div class="row">
<div class="col">
<span class="label" style="margin-right: 42px">标签设置</span>
@ -16,15 +18,8 @@
<div class="col">
<span class="label">最近距离</span>
<div class="input-number input-number-unit-1">
<input
class="input"
type="number"
title=""
min="1"
max="99999999"
@input="$handleInputLimit"
v-model="entityOptions.labelNear"
/>
<input class="input" type="number" title="" min="1" max="99999999" @input="$handleInputLimit"
v-model="entityOptions.labelNear" />
<span class="unit">m</span>
<span class="arrow"></span>
</div>
@ -32,15 +27,8 @@
<div class="col">
<span class="label">最远距离</span>
<div class="input-number input-number-unit-1">
<input
class="input"
type="number"
title=""
min="1"
max="99999999"
@input="$handleInputLimit"
v-model="entityOptions.labelFar"
/>
<input class="input" type="number" title="" min="1" max="99999999" @input="$handleInputLimit"
v-model="entityOptions.labelFar" />
<span class="unit">m</span>
<span class="arrow"></span>
</div>
@ -54,22 +42,15 @@
</div>
</div>
<div class="row">
<div class="col" style="flex: 0 0 114px">
<div class="col">
<span class="label">字体颜色</span>
<div class="labelColor" ref="labelColorRef"></div>
</div>
<div class="col">
<span class="label">字体大小</span>
<div class="input-number input-number-unit-2">
<input
class="input"
type="number"
title=""
min="1"
max="99"
@input="$handleInputLimit"
v-model="entityOptions.labelFontSize"
/>
<input class="input" type="number" title="" min="1" max="99" @input="$handleInputLimit"
v-model="entityOptions.labelFontSize" />
<span class="unit">px</span>
<span class="arrow"></span>
</div>
@ -82,12 +63,52 @@
</el-select>
</div>
</div>
<!-- <div class="row">
<div class="col" style="flex: 0 0 114px;">
<span class="label">轮廓颜色</span>
<div class="outlineColor"></div>
<div class="row">
<div class="col">
<div class="customized-tip"></div>
<span class="label" style="flex: none;">{{ t('general.text.style') }}</span>
<svg class="icon-text bold">
<use xlink:href="#icon-text-bold"></use>
</svg>
<svg class="icon-text italic">
<use xlink:href="#icon-text-italic"></use>
</svg>
<svg class="icon-text line-bottom">
<use xlink:href="#icon-text-line-bottom"></use>
</svg>
<svg class="icon-text line-through">
<use xlink:href="#icon-text-line-through"></use>
</svg>
</div>
</div> -->
<div class="col">
<span class="label" style="flex: none;">{{ t('general.text.letterSpacing') }}</span>
<div class="input-number input-number-unit-2">
<input class="input" type="number" title="" min="0" max="99" style="min-width: 70px;"
@input="$handleInputLimit" />
<span class="unit">px</span>
<span class="arrow"></span>
</div>
</div>
<div class="col"></div>
</div>
<div class="row">
<div class="col">
<span class="label" style="flex: none;">{{ t('general.outline.color') }}</span>
<div class="labelOutlineColorColor" ref="labelOutlineColorRef"></div>
</div>
<div class="col">
<span class="label" style="flex: none;">{{ t('general.outline.width') }}</span>
<div class="input-number input-number-unit-2">
<input class="input" type="number" title="" min="0" max="99" style="min-width: 70px;"
@input="$handleInputLimit" />
<span class="unit">px</span>
<span class="arrow"></span>
</div>
</div>
<div class="col"></div>
</div>
<span class="custom-divider"></span>
<div class="row"></div>
<div class="row">
<div class="col">
<span class="label">标签样式</span>
@ -115,15 +136,8 @@
<div class="col">
<span class="label">引线宽度</span>
<div class="input-number input-number-unit-2">
<input
class="input"
type="number"
title=""
min="1"
max="999"
@input="$handleInputLimit"
v-model="entityOptions.labelLineWidth"
/>
<input class="input" type="number" title="" min="1" max="999" @input="$handleInputLimit"
v-model="entityOptions.labelLineWidth" />
<span class="unit">px</span>
<span class="arrow"></span>
</div>
@ -131,15 +145,8 @@
<div class="col">
<span class="label">引线长度</span>
<div class="input-number input-number-unit-2">
<input
class="input"
type="number"
title=""
min="0"
max="999"
@input="$handleInputLimit"
v-model="entityOptions.labelPixelOffset"
/>
<input class="input" type="number" title="" min="0" max="999" @input="$handleInputLimit"
v-model="entityOptions.labelPixelOffset" />
<span class="unit">px</span>
<span class="arrow"></span>
</div>
@ -152,6 +159,9 @@
import { ref } from 'vue'
import { inject } from 'vue'
import { getFontList } from './fontSelect'
import setLabelStyle from './defaultLabelStyle/index.vue'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const props = defineProps({
type: {

View File

@ -361,7 +361,7 @@ const modelClick = (index, row) => {
} else if (butActiveIndex.value === 1) {
selectedImg = 'http://localhost:' + availablePort.value + '/' + row.data
} else if (butActiveIndex.value === 2) {
selectedImg = service.value + row.data
selectedImg = service.value + row.iconDataUrl
}
selectCallback(selectedImg)
}

View File

@ -1,12 +1,5 @@
<template>
<Dialog
ref="baseDialog"
title="线标注"
left="180px"
top="100px"
className="polyline"
:closeCallback="closeCallback"
>
<Dialog ref="baseDialog" title="线标注" left="180px" top="100px" className="polyline" :closeCallback="closeCallback">
<template #content>
<span class="custom-divider"></span>
<div class="div-item">
@ -35,118 +28,9 @@
</div>
</div>
</div>
<span class="custom-divider"></span>
<div class="div-item">
<div class="row">
<el-tabs v-model="activeName">
<el-tab-pane label="属性信息" name="1">
<attribute :entityOptions="entityOptions"></attribute>
</el-tab-pane>
<el-tab-pane label="空间信息" name="2">
<div class="row">
<div class="col height-mode-box">
<span class="label" style="flex: 0 0 56px">高度模式</span>
<el-select
class="input input-select height-mode-scelect"
style="width: 155px; margin-left: 20px"
v-model="heightMode"
@change="heightModeChange"
placeholder="请选择"
>
<el-option
v-for="item in heightModeData"
:key="item.key"
:label="item.name"
:value="item.key"
>
</el-option>
</el-select>
</div>
<div class="col">
<span class="label">Z值统一增加</span>
<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"
/>
<span class="unit">m</span>
<span class="arrow"></span>
</div>
<button
class="confirm height-confirm"
style="margin-left: 5px"
@click="heightConfirm"
:disabled="heightMode == 2"
>
应用
</button>
</div>
</div>
<div class="row">
<div class="table spatial-info-table">
<div class="table-head">
<div class="tr">
<div class="th"></div>
<div class="th">经度X</div>
<div class="th">纬度Y</div>
<div class="th">高度Z</div>
</div>
</div>
<div class="table-body">
<div class="tr" v-for="(item, i) in entityOptions.options.positions" :key="i">
<div class="td">{{ i + 1 }}</div>
<div class="td lng align-center" @dblclick="inputDblclick($event, i, 'lng')">
<input
class="input"
@blur="inputBlurCallBack($event, i, 'lng', 8)"
type="number"
v-model="item.lng"
min="-180"
max="180"
@input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'lng'"
/>
<span style="pointer-events: none" v-else>{{ item.lng.toFixed(8) }}</span>
</div>
<div class="td lat align-center" @dblclick="inputDblclick($event, i, 'lat')">
<input
class="input"
@blur="inputBlurCallBack($event, i, 'lat', 8)"
type="number"
v-model="item.lat"
min="-180"
max="180"
@input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'lat'"
/>
<span style="pointer-events: none" v-else>{{ item.lat.toFixed(8) }}</span>
</div>
<div class="td alt align-center" @dblclick="inputDblclick($event, i, 'alt')">
<input
class="input"
@blur="inputBlurCallBack($event, i, 'alt', 2)"
type="number"
v-model="item.alt"
min="-9999999"
max="999999999"
@input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'alt'"
/>
<span style="pointer-events: none" v-else>{{ item.alt.toFixed(2) }}</span>
</div>
</div>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="线条风格" name="3">
<setStyle type="线" :sourceType="sourceType" :entityOptions="entityOptions"></setStyle>
<div class="row">
<div class="col">
<span class="label">线条颜色</span>
@ -155,33 +39,17 @@
<div class="col" style="flex: 0 0 33%">
<span class="label">线条宽度</span>
<div class="input-number input-number-unit-1" style="width: 80px">
<input
class="input"
type="number"
title=""
min="1"
max="999"
@input="$handleInputLimit"
v-model="entityOptions.lineWidth"
/>
<input class="input" type="number" title="" min="1" max="999" @input="$handleInputLimit"
v-model="entityOptions.lineWidth" />
<span class="unit">px</span>
<span class="arrow"></span>
</div>
</div>
<div class="col input-select-line-type-box" style="flex: 0 0 37%">
<span class="label">线条形式</span>
<el-select
class="input input-select input-select-line-type"
style="margin-left: 20px"
v-model="entityOptions.lineType"
@change="lineTypechange"
>
<el-option
v-for="item in lineTypeData"
:key="item.key"
:label="item.name"
:value="item.key"
>
<el-select class="input input-select input-select-line-type" style="margin-left: 20px"
v-model="entityOptions.lineType" @change="lineTypechange">
<el-option v-for="item in lineTypeData" :key="item.key" :label="item.name" :value="item.key">
<i class="yj-custom-icon" :class="item.icon"></i>
{{ item.name }}
</el-option>
@ -207,16 +75,8 @@
<div class="col" style="flex: 0 0 33%">
<span class="label">缓冲宽度</span>
<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="$handleInputLimit"
v-model="entityOptions.extendWidth"
/>
<input class="input" type="number" title="" min="0" data-min="0.01" max="999999"
@input="$handleInputLimit" v-model="entityOptions.extendWidth" />
<span class="unit">m</span>
<span class="arrow"></span>
</div>
@ -234,62 +94,108 @@
<div class="col" style="flex: 0 0 33%">
<span class="label">流动速率</span>
<div class="input-number input-number-unit-1" style="width: 80px">
<input
class="input"
type="number"
title=""
min="0"
max="999999"
step="1"
@input="$handleInputLimit"
v-model="entityOptions.speed"
/>
<input class="input" type="number" title="" min="0" max="999999" step="1" @input="$handleInputLimit"
v-model="entityOptions.speed" />
<span class="arrow"></span>
</div>
</div>
<div class="col" style="flex: 0 0 37%">
<span
class="label lineSpace"
v-show="entityOptions.lineType > 2 && entityOptions.lineType >= 5"
>线条间距</span
>
<div
class="input-number input-number-unit-1 lineSpace"
style="width: 80px"
v-show="entityOptions.lineType > 2 && entityOptions.lineType >= 5"
>
<input
class="input"
type="number"
title=""
min="0"
max="4.5"
step="0.1"
@input="$handleInputLimit"
v-model="entityOptions.space"
/>
<span class="label lineSpace" v-show="entityOptions.lineType > 2 && entityOptions.lineType >= 5">线条间距</span>
<div class="input-number input-number-unit-1 lineSpace" style="width: 80px"
v-show="entityOptions.lineType > 2 && entityOptions.lineType >= 5">
<input class="input" type="number" title="" min="0" max="4.5" step="0.1" @input="$handleInputLimit"
v-model="entityOptions.space" />
<span class="unit"></span>
<span class="arrow"></span>
</div>
</div>
</div>
</div>
<div class="div-item">
<div class="row">
<el-tabs v-model="activeName">
<el-tab-pane label="属性信息" name="1">
<attribute :entityOptions="entityOptions"></attribute>
</el-tab-pane>
<el-tab-pane label="标签风格" name="4">
<el-tab-pane label="空间信息" name="2">
<div class="row">
<div class="col height-mode-box">
<span class="label" style="flex: 0 0 56px">高度模式</span>
<el-select class="input input-select height-mode-scelect" style="width: 155px; margin-left: 20px"
v-model="heightMode" @change="heightModeChange" placeholder="请选择">
<el-option v-for="item in heightModeData" :key="item.key" :label="item.name" :value="item.key">
</el-option>
</el-select>
</div>
<div class="col">
<span class="label">Z值统一增加</span>
<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" />
<span class="unit">m</span>
<span class="arrow"></span>
</div>
<button class="confirm height-confirm" style="margin-left: 5px" @click="heightConfirm"
:disabled="heightMode == 2">
应用
</button>
</div>
</div>
<div class="row">
<div class="table spatial-info-table">
<div class="table-head">
<div class="tr">
<div class="th"></div>
<div class="th">经度X</div>
<div class="th">纬度Y</div>
<div class="th">高度Z</div>
</div>
</div>
<div class="table-body">
<div class="tr" v-for="(item, i) in entityOptions.options.positions" :key="i">
<div class="td">{{ i + 1 }}</div>
<div class="td lng align-center" @dblclick="inputDblclick($event, i, 'lng')">
<input class="input" @blur="inputBlurCallBack($event, i, 'lng', 8)" type="number"
v-model="item.lng" min="-180" max="180" @input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'lng'" />
<span style="pointer-events: none" v-else>{{ item.lng.toFixed(8) }}</span>
</div>
<div class="td lat align-center" @dblclick="inputDblclick($event, i, 'lat')">
<input class="input" @blur="inputBlurCallBack($event, i, 'lat', 8)" type="number"
v-model="item.lat" min="-180" max="180" @input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'lat'" />
<span style="pointer-events: none" v-else>{{ item.lat.toFixed(8) }}</span>
</div>
<div class="td alt align-center" @dblclick="inputDblclick($event, i, 'alt')">
<input class="input" @blur="inputBlurCallBack($event, i, 'alt', 2)" type="number"
v-model="item.alt" min="-9999999" max="999999999" @input="$handleInputLimit"
v-if="activeTd.index == i && activeTd.name == 'alt'" />
<span style="pointer-events: none" v-else>{{ item.alt.toFixed(2) }}</span>
</div>
</div>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="标签风格" name="3">
<labelStyle type="线" :entityOptions="entityOptions"></labelStyle>
</el-tab-pane>
</el-tabs>
</div>
</div>
<span class="custom-divider"></span>
</template>
<template #footer>
<div style="position: absolute; left: 24px; display: flex">
<button @click="nodeEdit">
<svg class="icon-edit">
<use xlink:href="#yj-icon-edit"></use></svg>二次编辑
<use xlink:href="#yj-icon-edit"></use>
</svg>二次编辑
</button>
<button style="margin-left: 10px" @click="translate">
<svg class="icon-py">
<use xlink:href="#yj-icon-py"></use></svg>平移
<use xlink:href="#yj-icon-py"></use>
</svg>平移
</button>
</div>
<button @click="remove">删除</button>
@ -307,6 +213,7 @@ import { TreeApi } from '@/api/tree'
import { ElMessage, ElMessageBox } from 'element-plus'
import Dialog from '@/components/dialog/baseDialog.vue'
import attribute from './attribute.vue'
import setStyle from './defaultStyle/index.vue'
import labelStyle from './labelStyle.vue'
import { useTreeNode } from '@/views/components/tree/hooks/treeNode'
@ -316,6 +223,7 @@ const { cusUpdateNode, getSelectedNodes, cusRemoveNode } = useTreeNode()
const baseDialog: any = ref(null)
const eventBus: any = inject('bus')
const sourceType = ref('')
const length = ref(0)
const lengthUnit = ref('m')
const height = ref(10)
@ -431,8 +339,9 @@ const wordsName = ref(0)
let originalOptions: any
let that: any
const open = async (id: any) => {
const open = async (id: any, type) => {
that = window.earth.entityMap.get(id)
sourceType.value = type
originalOptions = structuredClone(that.options)
entityOptions.value = that
heightMode.value = entityOptions.value.heightMode
@ -519,7 +428,7 @@ const changeWordsName = (val) => {
entityOptions.value.wordsName = wordsName.value
}
const lineTypechange = () => {}
const lineTypechange = () => { }
const nodeEdit = () => {
entityOptions.value.positionEditing = false
entityOptions.value.noseToTail = false

View File

@ -52,6 +52,11 @@ function leftClick(options) {
? options.attribute.vr.content
: []
: [],
rtmp: options.attribute
? options.attribute.rtmp
? options.attribute.rtmp.content
: []
: [],
goods: options.attribute
? options.attribute.goods
? options.attribute.goods.content
@ -79,6 +84,7 @@ function leftClick(options) {
!options.richTextContent &&
!info.hrefs.length &&
!info.vr.length &&
!info.rtmp.length &&
!info.goods.length &&
!info.camera.length
) {
@ -96,7 +102,6 @@ function leftClick(options) {
) {
tankuang(id, node, info);
}
console.log('info.camera', info.camera)
if (info.camera && info.camera.length) {
if (index == 0) {
ElMessage.success("摄像头打开中请稍后");
@ -161,6 +166,50 @@ function leftClick(options) {
}
//if (info.type == "vr")
}
if (info.rtmp && info.rtmp.length) {
let isExistent = false
let isNoExistent = false
for(let i=0;i<info.rtmp.length;i++) {
if(!(window as any)._winMap.has(info.rtmp[i].id)) {
isNoExistent = true;
(window as any)._winMap.set(info.rtmp[i].id, info.rtmp[i].id);
ipcRenderer.send("openFFPlay", {
id: info.rtmp[i].id,
url: info.rtmp[i].url,
name: info.rtmp[i].name,
});
ipcRenderer.once(
"openFFPlayOut_"+info.rtmp[i].id,
(e, err, id) => {
if (err) {
ElMessage({
message: "视频流错误,打开失败!",
type: "error",
});
}
if(id) {
(window as any)._winMap.delete(id);
}
}
);
}
else {
isExistent = true
}
}
if(isNoExistent) {
ElMessage({
message: "视频流打开中请稍后",
type: "success",
});
}
if(isExistent) {
ElMessage({
message: "视频已打开",
type: "info",
});
}
}
}
}
}

View File

@ -121,6 +121,19 @@ export const useTreeNode = () => {
// render: () => {},
allowChildren: true,
},
folder: {
rightMenus: [
'addDirectory',
'addResource',
'pictureLocation',
'importPanorama',
'edit',
'del'
],
// detailFun: get_detail_null,
// render: () => {},
allowChildren: true,
},
tileset: {
rightMenus: [
'edit',
@ -440,7 +453,7 @@ export const useTreeNode = () => {
const cusNodeIcon = async (node) => {
let availablePort = await ipcRenderer.invoke('get-available-port');
let type
if(node.sourcePath || node.sourceType === 'vector') {
if (node.sourcePath || node.sourceType === 'vector') {
let path = node.sourcePath ? node.sourcePath : JSON.parse(node.params).path
// 获取最后一个点的位置
const lastDotIndex = path.lastIndexOf('.');
@ -468,12 +481,12 @@ export const useTreeNode = () => {
name = "lineDrawing";
let strokeWidth = 0.1
if(type === 'ellipse') {
if (type === 'ellipse') {
strokeWidth = 1.5;
}
// return (type === 'directory' || type === 'FeatureCollection') ? undefined : `http://localhost:${availablePort}/icon/${name}.png`;
return (type === 'directory' || type === 'FeatureCollection') ? undefined : `
return (type === 'directory' || type === 'FeatureCollection' || type === 'folder') ? undefined : `
<svg class="svg-icon" style="color: rgba(var(--color-base2), 1);margin-top: 1px;width:100%;height:100%;fill: currentColor !important;stroke: currentColor !important;stroke-width: ${strokeWidth} !important;shape-rendering: geometricPrecision;">
<use xlink:href="#icon-${name}" />
</svg>
@ -537,7 +550,7 @@ export const useTreeNode = () => {
allNodes = allNodes.concat(treeObj.transformToArray(node))
})
allNodes.forEach((node: any) => {
if(node.sourceType !== 'FeatureCollection' && node.sourceType !== 'Feature') {
if (node.sourceType !== 'FeatureCollection' && node.sourceType !== 'Feature') {
_idSet.add(node.id)
}
treeObj.removeNode(node)

View File

@ -178,12 +178,12 @@ eventBus.on('openDialog', async (sourceType: any, id: any) => {
case 'line':
currentComponent.value = polylineObject
await nextTick()
dynamicComponentRef.value?.open(id)
dynamicComponentRef.value?.open(id, sourceType)
break
case 'curve':
currentComponent.value = curvelineObject
await nextTick()
dynamicComponentRef.value?.open(id)
dynamicComponentRef.value?.open(id, sourceType)
break
case 'panel':
currentComponent.value = polygonObject
@ -455,30 +455,30 @@ const createEarth = async () => {
window.earth = await new YJ.YJEarth('earthContainer')
let openLeftClick = await new YJ.Global.openLeftClick(window.earth)
let openRightClick = await new YJ.Global.openRightClick(window.earth)
YJ.Global.MouseRightMenu(window.earth, true, (text, object) => {
switch (text) {
case 'rotateAround':
YJ.Global.rotateAround(window.earth, object.position)
break
case 'textBox':
let id = new YJ.Tools().randomString()
let name = '文本框'
addMapSource({
type: 'textBox',
id: id,
sourceName: name,
opt: {
id: id,
position: object.position
}
})
break
case 'attribute':
let node = window.treeObj.getNodeByParam('id', object.id, null)
rightMenus.edit.callback(eventBus, node)
break
}
})
// YJ.Global.MouseRightMenu(window.earth, true, (text, object) => {
// switch (text) {
// case 'rotateAround':
// YJ.Global.rotateAround(window.earth, object.position)
// break
// case 'textBox':
// let id = new YJ.Tools().randomString()
// let name = '文本框'
// addMapSource({
// type: 'textBox',
// id: id,
// sourceName: name,
// opt: {
// id: id,
// position: object.position
// }
// })
// break
// case 'attribute':
// let node = window.treeObj.getNodeByParam('id', object.id, null)
// rightMenus.edit.callback(eventBus, node)
// break
// }
// })
tree.value.initTreeCallBack()
utilsSysChange(eventBus)