rt-sim-training-client/src/jmapNew/shape/StationStand/index.js

242 lines
8.6 KiB
JavaScript

import Group from 'zrender/src/container/Group';
// 站台元素
import ESolidStand from './safeStand/ESolidStand';
import EHollowStand from './safeStand/EHollowStand';
import EGapStand from './safeStand/EGapStand';
// 扣车元素
import EDetain from './detain/EDetain';
import EDetainHollow from './detain/EDetainHollow';
import EDetainCircle from './detain/EDetainCircle';
import EDetainRect from './detain/EDetainRect';
// 跳停元素
import EJump from './jump/EJump';
import EJumpCircle from './jump/EJumpCircle';
import ETime from './ETime';
import ELevel from './ELevel';
import EReentry from './EReentry';
// 紧急停车
import EEmergentCross from './emergent/EEmergentCross';
import EEmergentArrow from './emergent/EEmergentArrow';
import EEmergentRhombus from './emergent/EEmergentRhombus';
import EMouse from './EMouse';
import EHighlight from '../element/EHighlight';
import ETrainStop from './ETrainStop';
import ETrainDepart from './ETrainDepart';
import EPatternFilter from './EPatternFilter';
import EStopJumpLamp from './functionButton/EStopJumpLamp';
import ECancelStopJumpLamp from './functionButton/ECancelStopJumpLamp';
import EUpDetainLamp from './functionButton/EUpDetainLamp';
import EDownDetainLamp from './functionButton/EDownDetainLamp';
import ETrainSetButton from './ETrainSetButton';
import EStationPlatform from './EStationPlatform';
import {isShowThePrdType} from '../../utils/handlePath';
import {traverseLineElements, traverseStatusElements} from '../utils/ShapeStatusCovert';
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.isShowShape = true;
this.create();
this.createMouseEvent();
this.setVisible(model.visible);
this.setShowMode();
this.setState(model);
}
create() {
// 加载皮肤控制的元素
const model = this.model;
const style = this.style;
// // 站台所有的绘图元素
const elementTypeList = {
'solidStand':ESolidStand, // 矩形实心站台 (普通站台样式)
'hollowStand':EHollowStand, // 矩形空心站台 (西安二号线站台样式)
'gapStand':EGapStand, // 分割站台(哈尔滨站台特有)
'emergentCross':EEmergentCross, // 站台紧急关闭 西安二号线 正八边形
'emergentArrow':EEmergentArrow, // 站台紧急关闭 哈尔滨 箭头型
'emergentRhombus':EEmergentRhombus, // 站台紧急关闭 普通 菱形
'jump':EJump, // 列车跳停
'jumpCircle':EJumpCircle, // 列车跳停(带圆圈)
'detainNormal':EDetain, // 普通扣车图标
'detainHollow':EDetainHollow, // 含空心圆的扣车图标
'detainCircle':EDetainCircle, // 圆形扣车图标
'detainRect':EDetainRect, // 矩形扣车图标
'stopTime':ETime, // 停站时间
'level':ELevel, // 运行等级
'patternFilter':EPatternFilter, // 模式筛选标识(西安二号线特殊的情况)
'reentry':EReentry, // 站台折返策略
'trainStop':ETrainStop, // 列车停车点标识 哈尔滨一号线
'trainDepart':ETrainDepart, // 列车停站时间 哈尔滨一号线
'trainSetButton':ETrainSetButton, // 站台 扣车/取消扣车,越站/取消越站 设置按钮 哈尔滨一号线
'stationPlatform':EStationPlatform // 站台 月台 南京二号线 使用
};
// 遍历当前线路下的绘图元素 组合模式
traverseLineElements(style.StationStand, elementTypeList, model, style, this);
// 加载后端返回的状态控制的绘图
const statusElementList = {
'stopJumpLamp':EStopJumpLamp,
'cancelStopJumpLamp':ECancelStopJumpLamp,
'upDetainLamp':EUpDetainLamp,
'downDetainLamp':EDownDetainLamp
};
// 遍历后端返回的状态控制的绘图
if (model.previewOrMapDraw || isShowThePrdType(model.prdType, style.StationStand.common.functionButtonShow)) {
traverseStatusElements(statusElementList, model, style, this);
}
}
createMouseEvent() {
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(); });
} else {
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); });
}
if (this.style.StationStand.common.bgShow) {
this.highlight = new EHighlight(this);
this.add(this.highlight);
}
}
}
setVisible(visible) {
if (visible) {
this.eachChild(elem => { elem.show(); });
} else {
this.eachChild(elem => { elem.hide(); });
}
}
/** 恢复初始状态*/
recover() {
const currentTypeList = this.style.StationStand.elemnetType;
currentTypeList.forEach(element => {
this[element].recover();
});
}
setState(model) {
if (!this.isShowShape) return;
// // 新版地图使用新版状态变更方式
this.recover();
// 更新状态
const currentTypeList = this.style.StationStand.elemnetType;
currentTypeList.forEach(element => {
this[element].setState(model);
});
}
getBoundingRect() {
const element = this.style.StationStand.elemnetType[0];
const rect = this[element].getBoundingRect().clone();
return rect;
}
getShapeTipPoint(opts) {
let rect;
if (opts.subDeviceType == 'DetainLamp') {
if (this.model.right) {
opts.subDeviceType = 'UpDetainLamp';
} else {
opts.subDeviceType = 'DownDetainLamp';
}
}
switch (opts.subDeviceType) {
case 'StopJumpLamp': {
rect = this.stopJumpLamp.getBoundingRect();
break;
}
case 'CancelStopJumpLamp': {
rect = this.cancelStopJumpLamp.getBoundingRect();
break;
}
case 'UpDetainLamp': {
rect = this.upDetainLamp.getBoundingRect();
break;
}
case 'DownDetainLamp': {
rect = this.downDetainLamp.getBoundingRect();
break;
}
case 'trainSetButton': {
rect = this.trainSetButton.getBoundingRect();
break;
}
default: {
rect = this.getBoundingRect();
break;
}
}
if (rect) {
return {
x: rect.x + rect.width / 2,
y: rect.y
};
}
return null;
}
drawSelected(selected) {
this.highlight && this.highlight.drawSelected(selected);
}
// 设置显示模式
setShowMode() {
const showMode = this.model.showMode;
const showConditions = this.style.StationStand.common.functionButtonShow;
if (!showConditions || showConditions === '01' || showMode === showConditions) {
this.stopJumpLamp && this.stopJumpLamp.show();
this.cancelStopJumpLamp && this.cancelStopJumpLamp.show();
this.upDetainLamp && this.upDetainLamp.show();
this.downDetainLamp && this.downDetainLamp.show();
} else {
this.stopJumpLamp && this.stopJumpLamp.hide();
this.cancelStopJumpLamp && this.cancelStopJumpLamp.hide();
this.upDetainLamp && this.upDetainLamp.hide();
this.downDetainLamp && this.downDetainLamp.hide();
}
}
setShowStation(stationCode) {
if ((!stationCode || this.model.deviceStationCode === stationCode) && this.model.visible) {
this.eachChild(item => {
item.show();
});
this.isShowShape = true;
this.setState(this.model);
} else {
this.eachChild(item => {
item.hide();
});
this.isShowShape = false;
}
}
}
export default StationStand;