/**/ import Group from 'zrender/src/container/Group'; import ETime from './ETime'; import ELevel from './ELevel'; import EReentry from './EReentry'; import EDetain from './EDetain'; import ESafeStand from './ESafeStand'; import ESafeEmergent from './ESafeEmergent'; import EMouse from './EMouse'; import EJump from './EJump'; import EHighlight from '../element/EHighlight'; class StationStand extends Group { constructor(model, style) { super(); this._code = model.code; this._type = model._type; this.model = model; this.style = style; this.zlevel = model.zlevel; this.z = 1; this.doors = new Group(); this.create(); this.createMouseEvent(); this.setVisible(model.visible); this.setState(model); this.checkIsDrawMap(); } create() { const model = this.model; const style = this.style; const drict = 1; /** 列车站台*/ const standX = model.position.x - model.width / 2; const standY = model.position.y - model.height / 2; this.safeStand = new ESafeStand({ zlevel: this.zlevel, z: this.z, style: style, x: standX, y: standY, width: model.width, height: model.height }); this.add(this.safeStand); /** 站台紧急关闭*/ const emergentH = model.right ? 1 : -1; const emergentX = model.position.x + drict * (style.StationStand.standEmergent.offset.x); const emergentY = model.position.y + emergentH * (model.height / 2 + style.StationStand.standEmergent.mergentR); this.emergent = new ESafeEmergent({ zlevel: this.zlevel, z: this.z + 1, style: style, x: emergentX, y: emergentY, r: style.StationStand.standEmergent.mergentR, n: 4 }); /** 站台折返策略*/ const reentryH = style.StationStand.standEmergent.mergentR; const reentryX = model.position.x - (style.StationStand.reentry.position || drict) * (style.StationStand.reentry.offset.x - model.width / 2); const reentryY = model.position.y + (style.StationStand.reentry.position || drict) * (style.StationStand.reentry.offset.y) + drict * reentryH; this.reentry = new EReentry({ zlevel: this.zlevel, z: this.z + 1, style: style, drict: drict, x: reentryX, y: reentryY, lineWidth: 0, fill: style.StationStand.reentry.noHumanColor }); // const distance = style.StationStand.safetyDoor.height * 2 - style.StationStand.stand.headFontSize / 2 - 2; /** 站台扣车*/ const detainD = model.right ? 1 : -1; const detainX = model.position.x - (style.StationStand.stopTime.position || detainD) * (style.StationStand.detainCar.offset.x - model.width / 2); const detainY = model.position.y + (style.StationStand.stopTime.position || detainD) * (style.StationStand.detainCar.offset.y - model.height / 2); this.detain = new EDetain({ zlevel: this.zlevel, z: this.z, style: style, x: detainX, y: detainY, textAlign: 'middle', textVerticalAlign: 'top' }); /** 停站时间*/ const timeH = style.StationStand.standEmergent.mergentR; const timeX = model.position.x - (style.StationStand.stopTime.position || drict) * (style.StationStand.stopTime.offset.x - model.width / 2); const timeY = model.position.y + (style.StationStand.stopTime.position || drict) * (style.StationStand.stopTime.offset.y) + drict * timeH; this.time = new ETime({ zlevel: this.zlevel, z: this.z + 1, style: style, x: timeX, y: timeY, name: model.parkingTime || '30' }); /** 运行等级*/ const levelH = style.StationStand.standEmergent.mergentR; const levelX = model.position.x - (style.StationStand.level.position || drict) * (style.StationStand.level.offset.x - model.width / 2); const levelY = model.position.y + (style.StationStand.level.position || drict) * (style.StationStand.level.offset.y) + drict * levelH; this.level = new ELevel({ zlevel: this.zlevel, z: this.z + 1, style: style, x: levelX, y: levelY, name: model.runLevelTime || '5' }); /** 列车停跳 */ if (style.StationStand.common.haveJumpShow) { const jumpH = style.StationStand.standEmergent.mergentR; const jumpX = model.position.x - (style.StationStand.jump.position || drict) * (style.StationStand.jump.offset.x - model.width / 2); const jumpY = model.position.y + (style.StationStand.jump.position || drict) * (style.StationStand.jump.offset.y) + drict * jumpH; const jumpCX = model.position.x - (style.StationStand.jump.position || drict) * (style.StationStand.jump.offset.x - model.width / 2); const jumpCY = model.position.y + (style.StationStand.jump.position || drict) * (style.StationStand.jump.offset.y - style.StationStand.common.textFontSize / 2) + drict * jumpH; this.jump = new EJump({ zlevel: this.zlevel, z: this.z + 1, style: style, x: jumpX, y: jumpY, cx: jumpCX, cy: jumpCY, textAlign: 'middle', textVerticalAlign: 'top', allSkip: model.allSkip, assignSkip: model.assignSkip }); this.add(this.jump); } this.add(this.emergent); this.add(this.detain); this.add(this.reentry); this.add(this.time); this.add(this.level); } createMouseEvent() { if (this.style.StationStand.mouseOverStyle) { this.mouseEvent = new EMouse(this); this.add(this.mouseEvent); this.on('mouseout', (e) => { this.mouseEvent.mouseout(e); }); this.on('mouseover', (e) => { this.mouseEvent.mouseover(e); }); } } setVisible(visible) { if (visible) { this.eachChild(elem => { elem.show(); }); } else { this.eachChild(elem => { elem.hide(); }); } } /** 恢复初始状态*/ recover() { this.time && this.time.hide(); this.level && this.level.hide(); this.detain && this.detain.hide(); this.reentry && this.reentry.hide(); this.emergent && this.emergent.hide(); this.jump && this.jump.hide(); } /** 空闲*/ spare() { this.safeStand && this.safeStand.setColor(this.style.StationStand.stand.spareColor); } /** 列车停站*/ stop() { this.safeStand && this.safeStand.setColor(this.style.StationStand.stand.stopColor); } /** 站台紧急关闭*/ emergentClose() { this.safeStand && this.safeStand.setColor(this.style.StationStand.stand.spareColor); this.emergent && this.emergent.show(); } /** 指定列车跳站*/ designatedJumpStop() { this.safeStand && this.safeStand.setColor(this.style.StationStand.stand.designatedJumpStopColor); this.jump && this.jump.show(); this.jump && this.jump.setStatus(0, 1); } /** 未设置跳停*/ unJumpStop() { this.jump && this.jump.hide(); this.jump && this.jump.setStatus(0, 0); } /** 站台跳停*/ jumpStop() { this.safeStand && this.safeStand.setColor(this.style.StationStand.stand.jumpStopColor); this.jump && this.jump.show(); this.jump && this.jump.setStatus(1, 0); } /** 未设置扣车*/ unDetainTrain() { this.detain && this.detain.hide(); } /** 车站扣车*/ standDetainTrain() { this.detain && this.detain.show(); this.detain && this.detain.setColor(this.style.StationStand.detainCar.detainTrainTextColor); } /** 中心扣车*/ centerDetainTrain() { this.detain && this.detain.show(); this.detain && this.detain.setColor(this.style.StationStand.detainCar.centerTrainColor); } /** 中心+车站扣车*/ standAndCenterDetainTrain() { this.detain && this.detain.show(); this.detain && this.detain.setColor(this.style.StationStand.detainCar.andCenterTrainColor); } /** 人工设置停战时间*/ setManuallyArmisticeTime(val) { this.time && this.time.show(); this.time && this.time.setName(val); } /** 人工设置运行等级*/ setManuallyOperationLevel(val) { this.level && this.level.show(); this.level && this.level.setName(val); } /** 无折返(默认)*/ noReentry() { this.reentry && this.reentry.hide(); } /** 无人折返*/ noHumanReentry() { this.reentry && this.reentry.show(); this.reentry && this.reentry.setColor(this.style.StationStand.reentry.noHumanColor); } /** 自动换端*/ autoChangeEnds() { this.reentry && this.reentry.show(); this.reentry && this.reentry.setColor(this.style.StationStand.reentry.autoChangeEndsColor); } setState(model) { // 新版地图使用新版状态变更方式 this.recover(); model.free && this.spare(); /** 空闲*/ model.trainParking && this.stop(); /** 列车停站*/ model.emergencyClosed && this.emergentClose(); /** 站台紧急关闭*/ if (Number(model.parkingTime) > 0) { this.setManuallyArmisticeTime(model.parkingTime); // 设置站台停车时间 } if (Number(model.runLevelTime) > 0) { this.setManuallyOperationLevel(model.runLevelTime); // 设置站台间运行等级 } /** 设置跳停*/ this.unJumpStop(); // 未设置跳停 model.assignSkip && this.designatedJumpStop(); // 指定站台跳停 model.allSkip && this.jumpStop(); // 站台全部跳停 /** 设置扣车*/ this.unDetainTrain(); // 默认状态 if (model.stationHoldTrain && model.centerHoldTrain) { this.standAndCenterDetainTrain(); // 中心+车站扣车 } else if (model.stationHoldTrain) { this.standDetainTrain(); // 车站扣车 } else if (model.centerHoldTrain) { this.centerDetainTrain(); // 中心扣车 } /** 设置折返策略*/ switch (model.reentryStrategy) { case '04': /** 默认*/ case '01': this.noReentry(); /** 无折返策略*/ break; case '02': this.noHumanReentry(); /** 无人折返*/ break; case '03': this.autoChangeEnds(); /** 自动换端*/ break; } } getBoundingRect() { const rect = this.safeStand.getBoundingRect().clone(); return rect; } getShapeTipPoint() { const rect = this.getBoundingRect(); if (rect) { return { x: rect.x + rect.width / 2, y: rect.y }; } return null; } drawSelected(selected) { this.highlight && this.highlight.drawSelected(selected); } checkIsDrawMap() { const path = window.location.href; if (path.includes('/map/draw')) { this.highlight = new EHighlight(this); this.add(this.highlight); this.on('mouseout', () => { this.highlight.mouseout(); }); this.on('mouseover', () => { this.highlight.mouseover(); }); } } } export default StationStand;