/* * 信号机 */ import ESigPost from './ESigPost'; import ESigLmap from './ESigLmap'; import ESigPass from './ESigPass'; import ESigRoute from './ESigRoute'; import ESigButton from './ESigButton'; import ESigDelay from './ESigDelay'; import ESigName from './ESigName'; // import Text from 'zrender/src/graphic/Text'; import Group from 'zrender/src/container/Group'; class Signal extends Group { constructor({ _code, _type, zlevel, model, state }, style) { super(); this._code = _code; this._type = _type; this.model = model; this.state = state; this.style = style; this.count = parseInt(model.lampPositionType); this.lamps = new Array(this.count); this.zlevel = zlevel; this.z = 1; this.create(); this.setState(state); } 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.signalDistance + style.Section.sectionWidth + style.Signal.signalR) }); // 信号灯 const endPoint = this.sigPost.getLampPosition(model.lampPostType); this.lamps = []; for (let i = 0; i < this.count; i++) { const lamp = new ESigLmap({ zlevel: this.zlevel, z: this.z, style: style, index: i + 1, drict: drict, x: endPoint.x + i * drict * style.Signal.signalR * 2, y: endPoint.y, originX: model.position.x, originY: model.position.y }); this.lamps.push(lamp); } // 信号机名称 const sigNameX = model.position.x + model.namePosition.x; const sigNameY = model.position.y + posit * (style.Signal.signalDistance + style.Section.sectionWidth + style.Signal.signalR * 2 + model.namePosition.y); this.sigName = new ESigName({ zlevel: this.zlevel, z: this.z, style: style, x: sigNameX, y: sigNameY, text: model.name, textFont: `bold ${style.Signal.signalTextFontSize} px ${style.textFontFormat}`, textFill: style.Signal.sigTextGreen, textAlign: 'middle', textVerticalAlign: posit == 1 ? 'top' : 'bottom' }); // 自动进路 const sigRouteH = style.Signal.signalSigRouteDirection ? this.count * style.Signal.signalR * 2 : -style.Signal.signalR * 2; const sigRouteX = endPoint.x + (style.Signal.signalSigRouteOffset.x + sigRouteH) * drict; const sigRouteY = endPoint.y + (style.Signal.signalSigRouteOffset.y); this.sigRoute = new ESigRoute({ zlevel: this.zlevel, z: this.z, style: style, x: sigRouteX, y: sigRouteY, drict: drict }); // 自动通过 const sigPassH = style.Signal.signalSigPassDirection ? this.count * style.Signal.signalR * 2 : -style.Signal.signalR * 2; const sigPassX = endPoint.x + (style.Signal.signalSigPassOffset.x + sigPassH) * drict; const sigPassY = endPoint.y + (style.Signal.signalSigPassOffset.y); this.sigPass = new ESigPass({ zlevel: this.zlevel, z: this.z, style: style, count: this.count, drict: drict, x: sigPassX, y: sigPassY, width: style.Signal.signalSigPassWidth, fill: style.Signal.signalLampGreenColor, lineWidth: 0.6, stroke: style.sidelineColor }); // 延迟解锁 const sigDelayH = style.Signal.signalSigDelayDirection ? this.count * style.Signal.signalR * 2 : -style.Signal.signalR * 2; const sigDelayX = endPoint.x + (style.Signal.signalSigDelayOffset.x + sigDelayH) * drict; const sigDelayY = endPoint.y - (style.Signal.signalSigDelayOffset.y) * posit; this.sigDelay = new ESigDelay({ zlevel: this.zlevel, z: this.z, style: style, x: sigDelayX, y: sigDelayY, text: this.state.delayCount || '0', textFont: `bold ${style.Signal.signalDelayTextFontSize} px ${style.textFontFormat}`, textFill: style.Signal.signalTextRed, 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.signalButtonDistance + style.Signal.signalR * 2) }); this.add(this.sigPost); this.lamps.forEach(lamp => { this.add(lamp); }); this.add(this.sigName); this.add(this.sigPass); this.add(this.sigRoute); this.add(this.sigDelay); // this.add(this.sigButton); } // 关闭 close() { if (this.count === 1) { if (this.model.useType === '05') { /** 单灯 调车信号机*/ this.lamps[0] && this.lamps[0].setColor(this.style.Signal.signalLampBlueColor); } else { /** 单灯 出站信号机 */ /** 单灯 阻挡信号机*/ /** 单灯 阻挡兼调车信号 */ /** 单灯 列兼调信号机 */ this.lamps[0] && this.lamps[0].setColor(this.style.Signal.signalLampRedColor); } } } // 开放 open() { if (this.count === 1) { /** 单灯 出站信号机*/ /** 单灯 阻隔信号机*/ this.lamps[0] && this.lamps[0].setColor(this.style.Signal.signalLampGreenColor); } } // 列车进路 trainRoute() { if (this.count === 1) { /** 单灯 列兼调信号*/ this.lamps[0] && this.lamps[0].setColor(this.style.Signal.signalLampYellowColor); } } // 调车进路 shuntRoute() { if (this.count === 1) { /** 单灯 列兼调信号*/ /** 单灯 阻挡兼调车信号*/ this.lamps[0] && this.lamps[0].setColor(this.style.Signal.signalLampWhiteColor); } } // 引导 guid() { } // 封锁 block() { this.lamps[0] && this.lamps[0].setColor(this.style.Signal.signalLampRedColor); this.sigName.setColor(this.style.Signal.sectionBlockTextColor); } // 功能封锁 functionBlock() { } // 信号保护区段监视状态显示 signalblock() { } // 故障 fault() { } // 物理点灯 logicalLight() { this.lamps.forEach(lamp => { lamp.setStop(false); }); } // 逻辑点灯 physicsLight() { this.lamps.forEach(lamp => { lamp.setStop(true); }); } // 设置自动进路模式状态类型 setAutoRouteOpen() { if (this.model.linkageAutoRouteShow) { this.sigPass.show(); } else { this.sigPass.hide(); } this.recover(); this.sigPass.setColor(this.style.Signal.signalLampGreenColor); } // 信号机进路自动触发模式状态类型 setAutoAccessOpen() { if (this.model.atsAutoTriggerShow) { this.sigPass.show(); } else { this.sigPass.hide(); } this.recover(); this.sigPass.setColor(this.style.Signal.signalLampYellowColor); } // 设置自动信号模式状态类型 setAutoSignalOpen() { this.sigRoute.show(); } // 隐藏自动信号和自动进路 setAutoClose() { this.sigPass.hide(); this.sigPass.setColor(this.style.backgroundColor); this.sigRoute.hide(); } // 自动信号和自动进路开始动画 setAutoFlicker() { this.sigPass.arrowsAnimation(); } // 设置延时解锁 setDelayUnlock() { this.sigDelay.show(); } // 恢复状态 recover() { this.sigDelay.hide(); this.sigPass.animationRecover(); this.sigName.setColor(this.style.Signal.signalTextGreen); } setState(state) { this.recover(); /** 设置状态 (点灯类型)*/ switch (state.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.signalblock(); break; // 信号保护区段检测 } /** 进路性质类型*/ switch (state.natureType) { case '01': this.trainRoute(); break; // 列车进路 case '02': this.shuntRoute(); break; // 调车进路 } /** 设置点灯类型*/ switch (state.lightType) { case '01': this.logicalLight(); break; // 设置逻辑点灯 case '02': this.physicsLight(); break; // 设置物理点灯 } /** 设置自动类型*/ switch (state.autoType) { case '01': this.setAutoClose(); break; // 隐藏 隐藏自动信号和自动进路 case '02': this.setAutoSignalOpen(); break; // 显示 设置自动信号模式状态类型 case '03': this.setAutoRouteOpen(); break; // 显示 设置自动进路模式状态类型 case '04': this.setAutoAccessOpen(); break; // 显示 信号机进路自动触发模式状态类型 } /** 延时解锁*/ state.delayType = '02'; switch (state.delayType) { case '01': break; // 未延时解锁 case '02': break; // 人工闭塞延时解锁 case '03': break; // 自动闭塞延时解锁 } /** 信号机进路办理,先停止动画,再判断当前颜色是否闪烁*/ if (state.routeSetting && (state.autoType == '03' || state.autoType == '04')) { this.setAutoFlicker(); } } getShapeTipPoint(val) { if (val === '1' || val === '2') { // return this.sigButton.getShapeTipPoint(val); } else { // return this.siglamp.getShapeTipPoint(val); } } } export default Signal;