From 503c51af10751d6fa90f6788d892192709d16c58 Mon Sep 17 00:00:00 2001 From: fan <18706759286@163.com> Date: Thu, 21 May 2020 15:58:23 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E8=A5=BF=E5=AE=89=E4=B8=80=E4=B8=89?= =?UTF-8?q?=E5=AE=81=E6=B3=A2=E4=B8=80=E7=A6=8F=E5=B7=9E=E4=B8=80=E4=BD=9B?= =?UTF-8?q?=E5=B1=B1=E5=BB=B6=E7=BB=AD=E4=BF=9D=E6=8A=A4=E5=8C=BA=E6=AE=B5?= =?UTF-8?q?=E9=97=AA=E7=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../foshan_01/menus/dialog/routeSelection.vue | 24 +++++++- .../fuzhou_01/menus/dialog/routeSelection.vue | 55 +++++++++++++++---- .../ningbo_01/menus/dialog/routeSelection.vue | 24 +++++++- .../xian_01/menus/dialog/routeSelection.vue | 24 +++++++- src/store/modules/map.js | 16 +++++- src/utils/loaddata.js | 2 + 6 files changed, 129 insertions(+), 16 deletions(-) diff --git a/src/jmapNew/theme/foshan_01/menus/dialog/routeSelection.vue b/src/jmapNew/theme/foshan_01/menus/dialog/routeSelection.vue index cef88c6bc..1615c7058 100644 --- a/src/jmapNew/theme/foshan_01/menus/dialog/routeSelection.vue +++ b/src/jmapNew/theme/foshan_01/menus/dialog/routeSelection.vue @@ -42,6 +42,7 @@ import { OperationEvent } from '@/scripts/cmdPlugin/OperationHandler'; import NoticeInfo from './childDialog/childDialog/noticeInfo'; import CMD from '@/scripts/cmdPlugin/CommandEnum'; import { deepAssign } from '@/utils/index'; +import { mapGetters } from 'vuex'; export default { name: 'RouteSelection', @@ -64,6 +65,9 @@ export default { }; }, computed: { + ...mapGetters('map', [ + 'overlapData' + ]), show() { return this.dialogShow && !this.$store.state.menuOperation.break; }, @@ -156,7 +160,25 @@ export default { } }); } - + if (this.overlapData[row.overlapCode] && this.overlapData[row.overlapCode].pathList && this.overlapData[row.overlapCode].pathList.length) { + this.overlapData[row.overlapCode].pathList.forEach(item => { + if (item.sectionList && item.sectionList.length) { + item.sectionList.forEach(elem => { + const section = deepAssign({}, this.$store.getters['map/getDeviceByCode'](elem)); + if (section.logicSectionCodeList && section.logicSectionCodeList.length) { + section.logicSectionCodeList.forEach(logicSectionCode => { + const sec = deepAssign({}, this.$store.getters['map/getDeviceByCode'](logicSectionCode)); + sec.cutOff = true; + containSectionList.push(sec); + }); + } else { + section.cutOff = true; + containSectionList.push(section); + } + }); + } + }); + } this.$store.dispatch('training/updateMapState', [...containSectionList]); this.beforeSectionList = containSectionList || []; diff --git a/src/jmapNew/theme/fuzhou_01/menus/dialog/routeSelection.vue b/src/jmapNew/theme/fuzhou_01/menus/dialog/routeSelection.vue index 14a6c0c34..dc9c48b2d 100644 --- a/src/jmapNew/theme/fuzhou_01/menus/dialog/routeSelection.vue +++ b/src/jmapNew/theme/fuzhou_01/menus/dialog/routeSelection.vue @@ -49,6 +49,8 @@ import { OperationEvent } from '@/scripts/cmdPlugin/OperationHandler'; import ConfirmControl from './childDialog/confirmControl'; import NoticeInfo from './childDialog/childDialog/noticeInfo'; +import { deepAssign } from '@/utils/index'; +import { mapGetters } from 'vuex'; export default { name: 'RouteSelection', @@ -70,6 +72,9 @@ export default { }; }, computed: { + ...mapGetters('map', [ + 'overlapData' + ]), show() { return this.dialogShow && !this.$store.state.menuOperation.break; }, @@ -161,30 +166,56 @@ export default { this.row = row; if (row) { // 恢复进路区段的切除状态 + this.row.canSetting = true; this.restoreBeforeDevices(); - + const containSectionList = []; if (row.canSetting) { // 设置选中区段为切除状态 - if (row.containSectionList && row.containSectionList.length) { + if (row.routeSectionList && row.routeSectionList.length) { // 设置新选的进路区段为切除状态 - row.containSectionList.forEach(elem => { - elem.cutOff = true; + row.routeSectionList.forEach(elem => { + const section = deepAssign({}, this.$store.getters['map/getDeviceByCode'](elem)); + if (section.logicSectionCodeList && section.logicSectionCodeList.length) { + section.logicSectionCodeList.forEach(item => { + const sec = deepAssign({}, this.$store.getters['map/getDeviceByCode'](item)); + sec.cutOff = true; + containSectionList.push(sec); + }); + } else { + section.cutOff = true; + containSectionList.push(section); + } }); } - - this.$store.dispatch('training/updateMapState', [...row.containSectionList]); - this.beforeSectionList = row.containSectionList || []; + if (this.overlapData[row.overlapCode] && this.overlapData[row.overlapCode].pathList && this.overlapData[row.overlapCode].pathList.length) { + this.overlapData[row.overlapCode].pathList.forEach(item => { + if (item.sectionList && item.sectionList.length) { + item.sectionList.forEach(elem => { + const section = deepAssign({}, this.$store.getters['map/getDeviceByCode'](elem)); + if (section.logicSectionCodeList && section.logicSectionCodeList.length) { + section.logicSectionCodeList.forEach(logicSectionCode => { + const sec = deepAssign({}, this.$store.getters['map/getDeviceByCode'](logicSectionCode)); + sec.cutOff = true; + containSectionList.push(sec); + }); + } else { + section.cutOff = true; + containSectionList.push(section); + } + }); + } + }); + } + this.$store.dispatch('training/updateMapState', [...containSectionList]); + this.beforeSectionList = containSectionList || []; // 设置选中指令 const operate = { operation: OperationEvent.Signal.arrangementRoute.choose.operation, - val: row.code, - param: { - Route_Code: row.code - } + val: row.code }; - this.$store.dispatch('training/next', operate).then(({ valid }) => { + this.$store.dispatch('training/nextNew', operate).then(({ valid }) => { if (valid) { this.$store.dispatch('menuOperation/handleBreakFlag', { break: true }); } diff --git a/src/jmapNew/theme/ningbo_01/menus/dialog/routeSelection.vue b/src/jmapNew/theme/ningbo_01/menus/dialog/routeSelection.vue index f62ef0f73..81f3ba9cf 100644 --- a/src/jmapNew/theme/ningbo_01/menus/dialog/routeSelection.vue +++ b/src/jmapNew/theme/ningbo_01/menus/dialog/routeSelection.vue @@ -38,6 +38,7 @@ import { OperationEvent } from '@/scripts/cmdPlugin/OperationHandler'; import NoticeInfo from './childDialog/childDialog/noticeInfo'; import {menuOperate, commitOperate} from '../utils/menuOperate'; import { deepAssign } from '@/utils/index'; +import { mapGetters } from 'vuex'; export default { name: 'RouteSelection', @@ -62,6 +63,9 @@ export default { }; }, computed: { + ...mapGetters('map', [ + 'overlapData' + ]), show() { return this.dialogShow && !this.$store.state.menuOperation.break; }, @@ -166,7 +170,25 @@ export default { } }); } - + if (this.overlapData[row.overlapCode] && this.overlapData[row.overlapCode].pathList && this.overlapData[row.overlapCode].pathList.length) { + this.overlapData[row.overlapCode].pathList.forEach(item => { + if (item.sectionList && item.sectionList.length) { + item.sectionList.forEach(elem => { + const section = deepAssign({}, this.$store.getters['map/getDeviceByCode'](elem)); + if (section.logicSectionCodeList && section.logicSectionCodeList.length) { + section.logicSectionCodeList.forEach(logicSectionCode => { + const sec = deepAssign({}, this.$store.getters['map/getDeviceByCode'](logicSectionCode)); + sec.cutOff = true; + containSectionList.push(sec); + }); + } else { + section.cutOff = true; + containSectionList.push(section); + } + }); + } + }); + } this.$store.dispatch('training/updateMapState', [...containSectionList]); this.beforeSectionList = containSectionList || []; diff --git a/src/jmapNew/theme/xian_01/menus/dialog/routeSelection.vue b/src/jmapNew/theme/xian_01/menus/dialog/routeSelection.vue index 92d949ef7..f30ba1a60 100644 --- a/src/jmapNew/theme/xian_01/menus/dialog/routeSelection.vue +++ b/src/jmapNew/theme/xian_01/menus/dialog/routeSelection.vue @@ -51,6 +51,7 @@ import ConfirmControl from './childDialog/confirmControl'; import NoticeInfo from './childDialog/childDialog/noticeInfo'; import { deepAssign } from '@/utils/index'; import { menuOperate, commitOperate } from '../utils/menuOperate'; +import { mapGetters } from 'vuex'; export default { name: 'RouteSelection', @@ -72,6 +73,9 @@ export default { }; }, computed: { + ...mapGetters('map', [ + 'overlapData' + ]), show() { return this.dialogShow && !this.$store.state.menuOperation.break; }, @@ -184,7 +188,25 @@ export default { } }); } - + if (this.overlapData[row.overlapCode] && this.overlapData[row.overlapCode].pathList && this.overlapData[row.overlapCode].pathList.length) { + this.overlapData[row.overlapCode].pathList.forEach(item => { + if (item.sectionList && item.sectionList.length) { + item.sectionList.forEach(elem => { + const section = deepAssign({}, this.$store.getters['map/getDeviceByCode'](elem)); + if (section.logicSectionCodeList && section.logicSectionCodeList.length) { + section.logicSectionCodeList.forEach(logicSectionCode => { + const sec = deepAssign({}, this.$store.getters['map/getDeviceByCode'](logicSectionCode)); + sec.cutOff = true; + containSectionList.push(sec); + }); + } else { + section.cutOff = true; + containSectionList.push(section); + } + }); + } + }); + } this.$store.dispatch('training/updateMapState', [...containSectionList]); this.beforeSectionList = containSectionList || []; diff --git a/src/store/modules/map.js b/src/store/modules/map.js index eb5687328..f956fe8cc 100644 --- a/src/store/modules/map.js +++ b/src/store/modules/map.js @@ -207,7 +207,9 @@ const map = { trainListUpdate:0, // 列车列表更新标识, runPlanStatus:false, // 是否正处于按计划行车 showCentralizedStationCode: '', // 现地分集中站显示(集中站code) - showCentralizedStationNum: 0 // 现地分集中站显示判断 + showCentralizedStationNum: 0, // 现地分集中站显示判断 + overlapList: [], // 延续保护list + overlapData: {} // 延续保护数据 }, getters: { @@ -226,6 +228,9 @@ const map = { routeData: (state) => { return state.routeData; }, + overlapData: (state) => { + return state.overlapData; + }, autoReentryData: (state) => { return state.autoReentryData; }, @@ -716,6 +721,12 @@ const map = { }); state.routeList = routeDataList; }, + setOverlapData: (state, overlapList) => { + overlapList.forEach(data => { + state.overlapData[data.code] = data; + }); + state.overlapList = overlapList; + }, setAutoReentryData: (state, autoReentryList) => { autoReentryList.forEach(data => { state.autoReentryData[data.code] = data; @@ -790,6 +801,9 @@ const map = { setRouteData: ({ commit }, routeData) => { // 设置进路数据 commit('setRouteData', routeData); }, + setOverlapData: ({ commit }, overlapData) => { + commit('setOverlapData', overlapData); + }, setAutoReentryData: ({ commit }, autoReentryData) => { commit('setAutoReentryData', autoReentryData); }, diff --git a/src/utils/loaddata.js b/src/utils/loaddata.js index 08d695429..d9e160dae 100644 --- a/src/utils/loaddata.js +++ b/src/utils/loaddata.js @@ -48,9 +48,11 @@ export function loadNewMapDataByGroup(group) { }); }); const routeData = resp.data.logicDataNew.routeList; // 设置进路数据 + const overlapData = resp.data.logicDataNew.overlapList; const autoReentryData = resp.data.logicDataNew.autoReentryList; // 自动折返数据 const signalApproachSectionData = resp.data.logicDataNew.signalApproachSectionList; // 信号机接近区段数据 store.dispatch('map/setRouteData', routeData); + store.dispatch('map/setOverlapData', overlapData); store.dispatch('map/setAutoReentryData', autoReentryData); store.dispatch('map/setSignalApproachSectionData', signalApproachSectionData); const mapConfig = resp.data.configVO; From e4bdd9c829445f013baa23451c92640b99758535 Mon Sep 17 00:00:00 2001 From: fan <18706759286@163.com> Date: Thu, 21 May 2020 16:34:05 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=A5=BF=E5=AE=89?= =?UTF-8?q?=E4=B8=80ats=E4=BA=BA=E5=B7=A5=E6=8E=A7=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/jmapNew/config/skinCode/xian_01.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/jmapNew/config/skinCode/xian_01.js b/src/jmapNew/config/skinCode/xian_01.js index 4bc436b0f..1e39ae986 100644 --- a/src/jmapNew/config/skinCode/xian_01.js +++ b/src/jmapNew/config/skinCode/xian_01.js @@ -164,10 +164,11 @@ class SkinCode extends defaultStyle { route: { direction: false, // 自动进路方向 offset: { x: -4, y: 0 }, // 自动进路偏移量 - routeColor: '#00FF00' // 自动进路 + routeColor: '#00FF00', // 自动进路 + radiusR: 6 }, auto: { - signalFrontTriangle: false, // 信号灯前三角展示 + signalFrontTriangle: true, // 信号灯前三角展示 direction: false, // 自动通过方向 offset: { x: -4, y: 0}, // 自动通过偏移量 width: 5, // 自动宽度 From e0fd1ece86e71bce0ee8946a8be85472ba10ccce Mon Sep 17 00:00:00 2001 From: sunzhenyu Date: Thu, 21 May 2020 16:48:59 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BD=A6=E7=AB=99?= =?UTF-8?q?=E8=B4=B4=E5=9B=BE=EF=BC=8C=E4=BF=AE=E6=94=B9=E9=A9=BE=E9=A9=B6?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/jlmap3d/jl3ddevice/config.js | 2 +- src/jlmap3d/jl3ddevice/jl3ddeviceNew.js | 49 +- src/jlmap3d/jl3ddevice/standtextureload.js | 114 +++ src/jlmap3d/jl3dsimulation/jlmap3d.js | 2 - src/jlmap3d/main/loaders/SimulationLoadNew.js | 2 + src/views/jlmap3d/device/jl3ddevice.vue | 9 +- .../drive/drivecontrol/drivecontrol.vue | 78 +- src/views/jlmap3d/drive/jl3ddrive.vue | 13 +- .../device/stationstand/stationstand.FBX | Bin 0 -> 638432 bytes .../device/stationstand/stationstand.bak.FBX | Bin 71104 -> 0 bytes .../device/stationstand/stationstand1.FBX | Bin 0 -> 638352 bytes static/model/station/station3.FBX | Bin 4349984 -> 4269616 bytes static/model/station/station333.FBX | Bin 0 -> 4349984 bytes static/texture/heb/devicelist.jpg | Bin 0 -> 99209 bytes static/texture/heb/pingbimen.png | Bin 0 -> 137488 bytes static/texture/xian3/devicelist.jpg | Bin 0 -> 99394 bytes static/texture/xian3/pingbimen.png | Bin 0 -> 86864 bytes static/workertest/maintainerworker.js | 744 ++++++++++++++++++ 18 files changed, 967 insertions(+), 46 deletions(-) create mode 100644 src/jlmap3d/jl3ddevice/standtextureload.js create mode 100644 static/model/device/stationstand/stationstand.FBX delete mode 100644 static/model/device/stationstand/stationstand.bak.FBX create mode 100644 static/model/device/stationstand/stationstand1.FBX create mode 100644 static/model/station/station333.FBX create mode 100644 static/texture/heb/devicelist.jpg create mode 100644 static/texture/heb/pingbimen.png create mode 100644 static/texture/xian3/devicelist.jpg create mode 100644 static/texture/xian3/pingbimen.png create mode 100644 static/workertest/maintainerworker.js diff --git a/src/jlmap3d/jl3ddevice/config.js b/src/jlmap3d/jl3ddevice/config.js index 0284592ab..94b03a1dc 100644 --- a/src/jlmap3d/jl3ddevice/config.js +++ b/src/jlmap3d/jl3ddevice/config.js @@ -22,7 +22,7 @@ var Staticmodel = { deviceType: "stationstand", type: "low", picUrl: "", - assetUrl: "../../static/model/device/stationstand/stationstandhrb.FBX" + assetUrl: "../../static/model/device/stationstand/stationstand.FBX" //https://joylink.club/oss/wx/stationstand/stationstand.FBX //../../static/model/device/stationstand.FBX diff --git a/src/jlmap3d/jl3ddevice/jl3ddeviceNew.js b/src/jlmap3d/jl3ddevice/jl3ddeviceNew.js index ef50b4292..cd4ad75f9 100644 --- a/src/jlmap3d/jl3ddevice/jl3ddeviceNew.js +++ b/src/jlmap3d/jl3ddevice/jl3ddeviceNew.js @@ -4,14 +4,18 @@ import { FBXLoader } from '@/jlmap3d/main/loaders/FBXLoader'; import { OrbitControls } from '@/jlmap3d/main/control/OrbitControls'; import { ModelManager } from '@/jlmap3d/jl3ddevice/loader.js'; +import { Standtextureload } from '@/jlmap3d/jl3ddevice/standtextureload.js'; import { Signallightload } from '@/jlmap3d/jl3ddevice/component/signallight.js'; import { Moveanimate } from '@/jlmap3d/jl3ddevice/component/moveanimate.js'; import { Textconfig } from '@/jlmap3d/jl3ddevice/component/textconfig.js'; +import { getPublish3dMapDetail} from '@/api/jlmap3d/load3ddata'; + + import StompClient from '@/utils/sock'; var clock = new THREE.Clock(); -export function Jl3ddeviceNew(dom,group,token) { +export function Jl3ddeviceNew(dom,group,token,skinCode) { var scope = this; this.dom = dom; @@ -24,6 +28,8 @@ export function Jl3ddeviceNew(dom,group,token) { let helpbox,textplane; let daochamodel; + + let psdtexturemap = []; //点击事件状态 this.raycasterstatus = false; //动画状态 @@ -33,6 +39,7 @@ export function Jl3ddeviceNew(dom,group,token) { //当前动画播放模型 this.animationmodel = null; + this.stationtexture = []; this.devicetext = new Textconfig(); this.windowstatus = '0'; @@ -90,6 +97,7 @@ export function Jl3ddeviceNew(dom,group,token) { this.controls.update(); + document.addEventListener( "mousedown", onselect, false ); let teststomp = new StompClient(); @@ -134,11 +142,31 @@ export function Jl3ddeviceNew(dom,group,token) { this.anime = null; this.modelmanager = new ModelManager(); - this.modelmanager.loadpromise(Staticmodel, scope.mixers).then(function (data) { - moveanima.initlistnew(scope.modelmanager.switchmodel.mesh); - daochamodel = scope.modelmanager.switchmodel.mesh.getObjectByName("DAOCHA"); - animate(); - }) + getPublish3dMapDetail(skinCode).then(netdata => { + console.log(JSON.parse(netdata.data.stands)); + setpsdstationmap(JSON.parse(netdata.data.stands)); + Standtextureload(scope,JSON.parse(netdata.data.assets)); + console.log(scope.stationtexture); + scope.modelmanager.loadpromise(Staticmodel, scope.mixers).then(function (data) { + moveanima.initlistnew(scope.modelmanager.switchmodel.mesh); + daochamodel = scope.modelmanager.switchmodel.mesh.getObjectByName("DAOCHA"); + scope.modelmanager.standmodel.mesh.getObjectByName("zhantailiebiao").material.map =scope.stationtexture["stationlist"]; + scope.modelmanager.standmodel.mesh.getObjectByName("zhantailiebiao").material.map.needsUpdate = true; + scope.modelmanager.standmodel.mesh.getObjectByName("pingbimen1").material.map =scope.stationtexture["pingbimen"]; + scope.modelmanager.standmodel.mesh.getObjectByName("pingbimen1").material.map.needsUpdate = true; + + console.log(scope.modelmanager); + // scope.stationtexture + animate(); + }) + }); + + function setpsdstationmap(stationlist){ + for(let i=0,leni=stationlist.length;i { + this.selVal = selVal; + this.dialogVisible = true; + // this.groupnum = selVal; + for(let i=0;i { - - console.log(error); + this.groupnum = oldgroupnum; + this.selVal = oldgroupnum; + this.$emit('warningmsg',error.message); + this.value = this.nowdrive; }); }, clickselect(e){ @@ -125,26 +132,35 @@ import axios from 'axios'; getSimulationMemberNew(this.group).then(netdata => { this.userrole = netdata.data.role; }); - getSimulationTrainlistNew(this.group).then(netdata => { - this.options = []; - this.trainlist = netdata.data; - for(let i=0;i { + this.options = []; + this.trainlist = netdata.data; + + for(let i=0;i diff --git a/src/views/jlmap3d/drive/jl3ddrive.vue b/src/views/jlmap3d/drive/jl3ddrive.vue index 427ef654a..bbf4807aa 100644 --- a/src/views/jlmap3d/drive/jl3ddrive.vue +++ b/src/views/jlmap3d/drive/jl3ddrive.vue @@ -33,7 +33,7 @@ - + @@ -265,6 +265,15 @@ export default { updatestatus(newdata){ this.trainnum = newdata.groupNumber; this.$refs.mmiui.updatetrainstatus(newdata); + }, + warningmsg(nowmsg){ + this.controlmsg = nowmsg; + this.msgshow = true; + setTimeout(this.warningmsgoff,3000); + }, + warningmsgoff(){ + this.msgshow = false; + }, } @@ -377,7 +386,7 @@ export default { position:absolute; } .msgtext{ - width:400px; + width:100%; height:50px; border-radius:5px; background:#C0C0C0; diff --git a/static/model/device/stationstand/stationstand.FBX b/static/model/device/stationstand/stationstand.FBX new file mode 100644 index 0000000000000000000000000000000000000000..72a69eb88265733dcbb362525497765a8a5ab662 GIT binary patch literal 638432 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