import { Graphics, IPointData } from 'pixi.js'; import { GraphicData, GraphicRelationParam, JlGraphic, JlGraphicTemplate, VectorText, calculateLineMidpoint, } from 'src/jl-graphic'; import { IRelatedRefData, protoPort2Data } from '../CommonGraphics'; import { SectionPort } from '../section/Section'; export interface ITurnoutPosRefData { get id(): string; //道岔的ID set id(v: string); get position(): number; //道岔的正反为,0是正位,1是反位 set position(v: number); } export interface IAxleCountingSectionData extends GraphicData { get code(): string; // 编号 set code(v: string); get points(): IPointData[]; // 线坐标点 set points(points: IPointData[]); get paRef(): IRelatedRefData | undefined; //区段A端关联的设备 set paRef(ref: IRelatedRefData | undefined); get pbRef(): IRelatedRefData | undefined; //区段B端关联的设备 set pbRef(ref: IRelatedRefData | undefined); get turnoutPosRef(): ITurnoutPosRefData[]; //关联道岔的定反位--0是定位,1是反位 set turnoutPosRef(ref: ITurnoutPosRefData[]); get indexNumber(): number; // 索引编号 set indexNumber(v: number); clone(): IAxleCountingSectionData; copyFrom(data: IAxleCountingSectionData): void; eq(other: IAxleCountingSectionData): boolean; } export const AxleCountingSectionConsts = { lineColor: '0xff0000', lineWidth: 2, }; export class AxleCountingSection extends JlGraphic { static Type = 'AxleCountingSection'; lineGraphic: Graphics; labelGraphic: VectorText; constructor() { super(AxleCountingSection.Type); this.lineGraphic = new Graphics(); this.labelGraphic = new VectorText(); this.labelGraphic.setVectorFontSize(14); this.labelGraphic.anchor.set(0.5); this.labelGraphic.style.fill = '0xff0000'; this.labelGraphic.transformSave = true; this.labelGraphic.name = 'label'; this.transformSave = true; this.addChild(this.lineGraphic); this.addChild(this.labelGraphic); } get datas(): IAxleCountingSectionData { return this.getDatas(); } doRepaint(): void { if (this.datas.points.length < 2) { throw new Error('AxleCountingSection坐标数据异常'); } this.lineGraphic.clear(); this.lineGraphic.lineStyle( AxleCountingSectionConsts.lineWidth, AxleCountingSectionConsts.lineColor ); this.datas.points.forEach((p, i) => { if (i !== 0) { this.lineGraphic.lineTo(p.x, p.y); } else { this.lineGraphic.moveTo(p.x, p.y); } }); this.labelGraphic.text = this.datas.code; const labelPosition = this.datas.childTransforms?.find( (t) => t.name === this.labelGraphic.name )?.transform.position; if (labelPosition) { this.labelGraphic.position.set(labelPosition.x, labelPosition.y); } else { const centerPos = calculateLineMidpoint( this.datas.points[0], this.datas.points[this.datas.points.length - 1] ); this.labelGraphic.position.set(centerPos.x, centerPos.y + 40); } } get linePoints(): IPointData[] { return this.datas.points; } set linePoints(points: IPointData[]) { const old = this.datas.clone(); old.points = points; this.updateData(old); } loadRelations() { if (this.datas?.paRef?.id) { this.relationManage.addRelation( new GraphicRelationParam(this, SectionPort.A), new GraphicRelationParam( this.queryStore.queryById(this.datas.paRef.id), protoPort2Data(this.datas.paRef.devicePort) ) ); } if (this.datas?.pbRef?.id) { this.relationManage.addRelation( new GraphicRelationParam(this, SectionPort.B), new GraphicRelationParam( this.queryStore.queryById(this.datas.pbRef.id), protoPort2Data(this.datas.pbRef.devicePort) ) ); } if (this.datas?.turnoutPosRef.length) { this.datas.turnoutPosRef.forEach((ref) => { this.relationManage.addRelation( this, new GraphicRelationParam( this.queryStore.queryById(ref.id), ref.position ) ); }); } } } export class AxleCountingSectionTemplate extends JlGraphicTemplate { constructor(dataTemplate: IAxleCountingSectionData) { super(AxleCountingSection.Type, { dataTemplate, }); } new(): AxleCountingSection { const axleCountingSection = new AxleCountingSection(); axleCountingSection.loadData(this.datas); return axleCountingSection; } }