/* * 信号机 */ import ESigPost from './ESigPost'; import ESigLamp from './ESigLamp'; import ESigAuto from './ESigAuto'; import ESigRoute from './ESigRoute'; import ESigButton from './ESigButton'; import ESigDelay from './ESigDelay'; import ESigName from './ESigName'; import EMouse from './EMouse'; import Group from 'zrender/src/container/Group'; import BoundingRect from 'zrender/src/core/BoundingRect'; class Signal extends Group { constructor(model, style) { super(); this._code = model.code; this._type = model._type; this.model = model; this.style = style; this.count = parseInt(model.lampPositionType); this.lamps = new Array(this.count); this.zlevel = model.zlevel; this.z = 7; this.create(); this.createMouseEvent(); this.transformRotation(this); this.setState(model); } create() { const model = this.model; const style = this.style; const drict = this.model.directionType == '01' ? -1 : 1; // 朝向 左:右 const posit = this.model.positionType == '01' ? -1 : 1; // 位置 上:下 // 信号机高柱矮柱 this.sigPost = new ESigPost({ zlevel: this.zlevel, z: this.z, style: style, drict: drict, type: model.lampPostType, x: model.position.x, y: model.position.y + posit * (style.Signal.distance + style.Section.line.width + style.Signal.lamp.radiusR) }); // 信号灯 const endPoint = this.sigPost.getLampPosition(model.lampPostType); this.lamps = []; for (let i = 0; i < this.count; i++) { const lamp = new ESigLamp({ zlevel: this.zlevel, z: this.z, style: style, drict: drict, x: endPoint.x + i * drict * style.Signal.lamp.radiusR * 2, y: endPoint.y, originX: model.position.x, originY: model.position.y }); this.lamps.push(lamp); } // 信号机名称 const sigNameX = model.position.x - drict * (style.Signal.post.standardWidth) + model.namePosition.x; const sigNameY = model.position.y + posit * (style.Signal.distance + style.Section.line.width + style.Signal.lamp.radiusR * 2 + model.namePosition.y + style.Signal.text.distance); const textAlign = style.Signal.text.isAlignCenter ? 'middle': this.model.directionType == '01'? 'right': 'left'; const textVerticalAlign = posit == 1 ? 'top' : 'bottom'; this.sigName = new ESigName({ zlevel: this.zlevel, z: this.z, silent: false, isNoRotation: style.Signal.text.isNoRotation, style: style, x: sigNameX, y: sigNameY, text: model.name, fontWeight: style.Signal.text.fontWeight, fontSize: style.Signal.text.fontSize, fontFamily: style.fontFamily, textFill: style.Signal.text.defaultColor, textAlign: textAlign, textVerticalAlign: textVerticalAlign }); // 自动进路 const sigRouteH = style.Signal.route.direction ? this.count * style.Signal.lamp.radiusR * 2 : -style.Signal.lamp.radiusR * 2; const sigRouteX = endPoint.x + (style.Signal.route.offset.x + sigRouteH) * drict; const sigRouteY = endPoint.y + (style.Signal.route.offset.y); this.sigRoute = new ESigRoute({ zlevel: this.zlevel, z: this.z, style: style, x: sigRouteX, y: sigRouteY, drict: drict }); // 自动通过 const sigAutoH = style.Signal.auto.direction ? this.count * style.Signal.lamp.radiusR * 2 : -style.Signal.lamp.radiusR * 2; const sigAutoX = endPoint.x + (style.Signal.auto.offset.x + sigAutoH) * drict; const sigAutoY = endPoint.y + (style.Signal.auto.offset.y); this.sigAuto = new ESigAuto({ zlevel: this.zlevel, z: this.z, style: style, count: this.count, drict: drict, x: sigAutoX, y: sigAutoY, width: style.Signal.auto.width, fill: style.Signal.auto.autoRoute, lineWidth: 0.6, stroke: style.sidelineColor }); // 延迟解锁 const sigDelayH = style.Signal.delay.direction ? this.count * style.Signal.lamp.radiusR * 2 : -style.Signal.lamp.radiusR * 2; const sigDelayX = endPoint.x + (style.Signal.delay.offset.x + sigDelayH) * drict; const sigDelayY = endPoint.y - (style.Signal.delay.offset.y) * posit; this.sigDelay = new ESigDelay({ zlevel: this.zlevel, z: this.z, style: style, x: sigDelayX, y: sigDelayY, fontWeight: style.Signal.delay.fontWeight, fontSize: style.Signal.delay.fontSize, fontFamily: style.fontFamily, text: this.model.delayCount || '0', textFill: style.Signal.delay.fontColor, textAlign: drict > 0 ? 'right' : 'left', textVerticalAlign: 'middle' }); // 信号灯按钮 this.sigButton = new ESigButton({ zlevel: this.zlevel, z: this.z, style: style, posit: posit, show: model.buttonShow, x: model.buttonPosition.x, y: model.buttonPosition.y - posit * (style.Signal.button.distance + style.Signal.lamp.radiusR * 2) }); this.add(this.sigPost); this.lamps.forEach(lamp => { this.add(lamp); }); this.style.Signal.text.show ? this.add(this.sigName) : null; this.add(this.sigAuto); this.add(this.sigRoute); this.add(this.sigDelay); // this.add(this.sigButton); } createMouseEvent() { if (this.style.Signal.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); }); } } // 整体旋转信号灯 transformRotation(device) { if (this.model.rotate) { device.eachChild(item => { if (item instanceof Group) { this.transformRotation(item); } else if (item && item.model && item.model.isNoRotation) { item.origin = [this.model.position.x, this.model.position.y]; item.rotation = -Math.PI / 180 * Number(this.model.rotate); item.dirty(); } }); } } // 关闭 close() { if (this.count == 2 && this.model.lightType == '01') { // 双灯 物理点灯 if (this.lamps[0]) { this.lamps[0].setStop(false); this.lamps[0].setColor(this.style.Signal.lamp.redColor); } if (this.lamps[1]) { this.lamps[1].setStop(false); this.lamps[1].setColor(this.style.backgroundColor); } } else if (this.count == 2 && this.model.lightType == '02') { // 双灯 逻辑点灯 if (this.lamps[0]) { this.lamps[0].setStop(true); this.lamps[0].setColor(this.style.Signal.lamp.redColor); } if (this.lamps[1]) { this.lamps[1].setStop(true); this.lamps[1].setColor(this.style.backgroundColor); } } else if (this.count == 1 && this.model.lightType == '01') { // 单灯 物理点灯 if (this.lamps[0]) { this.lamps[0].setStop(false); if (this.model.useType == '05') { this.lamps[0].setColor(this.style.Signal.lamp.blueColor); } else { this.lamps[0].setColor(this.style.Signal.lamp.redColor); } } } else if (this.count == 1 && this.model.lightType == '02') { // 单灯 逻辑点灯 if (this.lamps[0]) { this.lamps[0].setStop(true); if (this.model.useType == '05') { this.lamps[0].setColor(this.style.Signal.lamp.blueColor); } else { this.lamps[0].setColor(this.style.Signal.lamp.redColor); } } } else if (this.count == 1) { if (this.lamps[0]) { if (this.model.useType == '05') { this.lamps[0].setColor(this.style.Signal.lamp.blueColor); } else { this.lamps[0].setColor(this.style.Signal.lamp.redColor); } } } } // 开放 open() { if (this.count == 2 && this.model.lightType == '01' && this.model.switchLocateType == '01') { // 双灯 物理点灯 道岔定位 if (this.lamps[0]) { this.lamps[0].setStop(false); this.lamps[0].setColor(this.style.Signal.lamp.greenColor); } if (this.lamps[1]) { this.lamps[1].setStop(false); this.lamps[1].setColor(this.style.backgroundColor); } } else if (this.count == 2 && this.model.lightType == '02' && this.model.switchLocateType == '01') { // 双灯 逻辑点灯 道岔定位 if (this.lamps[0]) { this.lamps[0].setStop(true); this.lamps[0].setColor(this.style.Signal.lamp.greenColor); } if (this.lamps[1]) { this.lamps[1].setStop(true); this.lamps[1].setColor(this.style.backgroundColor); } } else if (this.count == 2 && this.model.lightType == '01' && this.model.switchLocateType == '02') { // 双灯 物理点灯 道岔反位 if (this.lamps[0]) { this.lamps[0].setStop(false); this.lamps[0].setColor(this.style.backgroundColor); } if (this.lamps[1]) { this.lamps[1].setStop(false); this.lamps[1].setColor(this.style.Signal.lamp.yellowColor); } } else if (this.count == 2 && this.model.lightType == '02' && this.model.switchLocateType == '02') { // 双灯 逻辑点灯 道岔反位 if (this.lamps[0]) { this.lamps[0].setStop(true); this.lamps[0].setColor(this.style.backgroundColor); } if (this.lamps[1]) { this.lamps[1].setStop(true); this.lamps[1].setColor(this.style.Signal.lamp.yellowColor); } } else if (this.count == 1 && this.model.lightType == '01' && this.model.switchLocateType == '02') { // 单灯 物理点灯 允许调车 if (this.lamps[0]) { this.lamps[0].setStop(false); // 出站信号机/阻隔信号机 if (['02', '06'].includes(this.model.useType)) { this.lamps[0].setColor(this.style.Signal.lamp.greenColor); } else { this.lamps[0].setColor(this.style.Signal.lamp.whiteColor); } } } else if (this.count == 1 && this.model.lightType == '01' && this.model.switchLocateType == '01') { if (this.lamps[0]) { this.lamps[0].setStop(false); this.lamps[0].setColor(this.style.Signal.lamp.greenColor); } } else if (this.count == 1 && this.model.lightType == '02' && this.model.switchLocateType == '02') { if (this.lamps[0]) { this.lamps[0].setStop(true); this.lamps[0].setColor(this.style.Signal.lamp.greenColor); } } else if (this.count == 1 && this.model.lightType == '02' && this.model.switchLocateType == '01' ) { if (this.lamps[0]) { this.lamps[0].setStop(true); this.lamps[0].setColor(this.style.Signal.lamp.greenColor); } } } // 列车进路 trainRoute() { if (this.count == 1) { /** 单灯 列兼调信号*/ this.lamps[0] && this.lamps[0].setColor(this.style.Signal.lamp.yellowColor); } } // 调车进路 shuntRoute() { if (this.count == 1) { /** 单灯 列兼调信号*/ /** 单灯 阻挡兼调车信号*/ this.lamps[0] && this.lamps[0].setColor(this.style.Signal.lamp.whiteColor); } } // 引导 guid() { if (this.count == 2 && this.model.lightType == '01') { // 双灯 物理点灯 允许引导信号 if (this.lamps[0]) { this.lamps[0].setStop(false); this.lamps[0].setColor(this.style.Signal.lamp.redColor); } if (this.lamps[1]) { this.lamps[1].setStop(false); this.lamps[1].setColor(this.style.Signal.lamp.yellowColor); } } } // 封锁 block() { if (this.count == 1) { this.lamps[0].setColor(this.style.Signal.lamp.redColor); // this.siglamp.setNameBorder(1) } this.sigName.setColor(this.style.Signal.text.blockColor); if (this.style.Signal.text.nameBorderShow) { this.sigName.setStyle({textBorderWidth: 1}); this.sigName.setColor('#fff'); } } // 功能封锁 functionBlock() { if (this.count == 1) { this.lamps[0].setColor(this.style.Signal.lamp.redColor); // this.siglamp.setRectBlockByIndex(1, true); } } // 信号保护区段监视状态显示 signalCheck() { if (this.count == 1) { this.lamps[0].setColor(this.style.Signal.lamp.redColor); this.sigName.setColor(this.style.Signal.text.checkColor); } } // 故障 fault() { if (this.count == 2 && this.model.lightType == '01') { // 双灯 物理点灯 if (this.lamps[0]) { this.lamps[0].setStop(false); this.lamps[0].setColor(this.style.Signal.lamp.blueColor); } if (this.lamps[1]) { this.lamps[1].setStop(false); this.lamps[1].setColor(this.style.Signal.lamp.blueColor); } } } // 物理点灯 logicalLight() { this.lamps.forEach(lamp => { lamp.setStop(false); }); } // 逻辑点灯 physicsLight() { this.lamps.forEach(lamp => { lamp.setStop(true); }); } // 设置自动进路模式状态类型 setAutoRouteOpen() { this.sigAuto.setColor(this.style.Signal.auto.autoRoute); if (this.model.linkageAutoRouteShow) { this.sigAuto.show(); } else { this.sigAuto.hide(); } } // 信号机进路自动触发模式状态类型 setAutoTriggerOpen() { this.sigAuto.setColor(this.style.Signal.auto.autoTrigger); if (this.model.atsAutoTriggerShow) { this.sigAuto.show(); } else { this.sigAuto.hide(); } } // 设置自动信号模式状态类型 setAutoSignalOpen() { this.sigRoute.show(); } // 隐藏自动信号和自动进路 setAutoClose() { this.sigAuto.hide(); this.sigAuto.setColor(this.style.backgroundColor); this.sigRoute.hide(); } // 自动信号和自动进路开始动画 setAutoFlicker() { this.sigAuto.arrowsAnimation(); } // 设置延时解锁 setDelayUnlock() { this.sigDelay.show(); } // 恢复状态 recover() { this.sigName.setStyle({textBorderWidth: 0}); this.sigAuto.hide(); this.sigRoute.hide(); this.sigDelay.hide(); this.sigAuto.animationRecover(); this.sigName.setColor(this.style.Signal.text.defaultColor); } setState(model) { this.recover(); /** 设置状态 (点灯类型)*/ switch (model.status) { case '01': this.close(); break; // 关闭 case '02': this.open(); break; // 开放 case '03': this.guid(); break; // 引导 case '04': this.block(); break; // 封锁 case '05': this.fault(); break; // 故障 case '06': this.block(); break; // 功能封锁 case '07': this.signalCheck(); break; // 信号保护区段检测 } /** 进路性质类型*/ switch (model.natureType) { case '01': this.trainRoute(); break; // 列车进路 case '02': this.shuntRoute(); break; // 调车进路 } /** 设置点灯类型*/ switch (model.lightType) { case '01': this.logicalLight(); break; // 设置逻辑点灯 case '02': this.physicsLight(); break; // 设置物理点灯 } /** 设置自动类型*/ switch (model.autoType) { case '01': this.setAutoClose(); break; // 隐藏 隐藏自动信号和自动进路 case '02': this.setAutoSignalOpen(); break; // 显示 设置自动信号模式状态类型 case '03': this.setAutoRouteOpen(); break; // 显示 设置自动进路模式状态类型 case '04': this.setAutoTriggerOpen(); break; // 显示 信号机进路自动触发模式状态类型 } /** 延时解锁*/ switch (model.delayType) { case '01': break; // 未延时解锁 case '02': this.setDelayUnlock(); break; // 人工闭塞延时解锁 case '03': this.setDelayUnlock(); break; // 自动闭塞延时解锁 } /** 信号机进路办理,先停止动画,再判断当前颜色是否闪烁*/ if (model.routeSetting && (model.autoType == '03' || model.autoType == '04')) { this.setAutoFlicker(); } } getBoundingRect() { const rect = this.sigPost.getBoundingRect(); this.lamps.forEach(elem => { rect.union(elem.getBoundingRect()); }); return rect; } getShapeTipPoint(opts) { var rect = new BoundingRect(0, 0, 0, 0); var drict = this.model.directionType == '01' ? -1 : 1; // 朝向 左:右 var offsetY = this.model.positionType == '01' ? this.style.Signal.text.fontSize : 0; // 位置 上:下 if (opts.val == '1' || opts.val == '2') { rect = this.sigButton.getBoundingRect(); } else { rect = this.sigPost.getBoundingRect(); } return { x: rect.x + drict * this.style.Signal.post.standardWidth, y: rect.y - offsetY }; } } export default Signal;