From d23b57ec9aee2926bd73fc4840cd86b70896a78b Mon Sep 17 00:00:00 2001 From: joylink_zhaoerwei Date: Thu, 13 Jul 2023 17:57:13 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A1=E8=BD=B4=E5=8C=BA=E6=AE=B5=E4=B8=80?= =?UTF-8?q?=E9=94=AE=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= =?UTF-8?q?--=E6=8C=89=E6=90=9C=E7=B4=A2=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AxleCountingSectionAssistant.ts | 366 +++++++----------- 1 file changed, 137 insertions(+), 229 deletions(-) diff --git a/src/graphics/axleCountingSection/AxleCountingSectionAssistant.ts b/src/graphics/axleCountingSection/AxleCountingSectionAssistant.ts index 167ce05..f982da7 100644 --- a/src/graphics/axleCountingSection/AxleCountingSectionAssistant.ts +++ b/src/graphics/axleCountingSection/AxleCountingSectionAssistant.ts @@ -1,4 +1,4 @@ -import { FederatedPointerEvent, IHitArea, IPointData, Point } from 'pixi.js'; +import { FederatedPointerEvent, IHitArea, Point } from 'pixi.js'; import { GraphicDrawAssistant, GraphicIdGenerator, @@ -16,32 +16,19 @@ import { ITurnoutPosRefData, } from './AxleCountingSection'; import { AxleCounting } from '../axleCounting/AxleCounting'; -import { Turnout, TurnoutPort } from '../turnout/Turnout'; +import { Section } from '../section/Section'; +import { Turnout } from '../turnout/Turnout'; import { createRelatedRefProto } from '../CommonGraphics'; -function hasCommonElements(arr1: string[], arr2: string[]) { - for (let i = 0; i < arr1.length; i++) { - if (arr2.includes(arr1[i])) { - return arr1[i]; - } +function removePortBC(a: T, b: T): boolean { + if ((a == 'B' && b == 'C') || (a == 'C' && b == 'B')) { + return false; } - return false; + return true; } - -function hasSamePosition(point1: IPointData, point2: IPointData): boolean { - if ( - Math.abs(point1.x - point2.x) < 20 && - Math.abs(point1.y - point2.y) < 20 - ) { - return true; - } - return false; -} - export interface IAxleCountingSectionDrawOptions { newData: () => IAxleCountingSectionData; } - export class AxleCountingSectionDraw extends GraphicDrawAssistant< AxleCountingSectionTemplate, IAxleCountingSectionData @@ -79,13 +66,14 @@ export class AxleCountingSectionDraw extends GraphicDrawAssistant< graphics: AxleCounting[], commonElement: JlGraphic[], map: Map, - turoutPos?: number + turoutPos?: number[] ) { if ( map.has(`${graphics[0].id}+${graphics[1].id}`) || map.has(`${graphics[1].id}+${graphics[0].id}`) ) return; + map.set(`${graphics[0].id}+${graphics[1].id}`, 1); const axleCountingSection = new AxleCountingSection(); axleCountingSection.loadData(this.graphicTemplate.datas); axleCountingSection.datas.points = [ @@ -98,37 +86,10 @@ export class AxleCountingSectionDraw extends GraphicDrawAssistant< const turnoutPosData: ITurnoutPosRefData[] = []; if (commonElement[0].type == 'Turnout') { commonElement.forEach((Turnout, i) => { - if (commonElement.length == 2) { - if (turoutPos == -1) { - if (i == 1) { - turnoutPosData.push({ - id: Turnout.id, - position: 1, - }); - } else { - turnoutPosData.push({ - id: Turnout.id, - position: 0, - }); - } - } else - turnoutPosData.push({ - id: Turnout.id, - position: 0, - }); - } else { - if (turoutPos == 0) { - turnoutPosData.push({ - id: Turnout.id, - position: 0, - }); - } else { - turnoutPosData.push({ - id: Turnout.id, - position: 1, - }); - } - } + turnoutPosData.push({ + id: Turnout.id, + position: (turoutPos as number[])[i], + }); }); } axleCountingSection.datas.paRef = paRef; @@ -137,7 +98,6 @@ export class AxleCountingSectionDraw extends GraphicDrawAssistant< this.storeGraphic(axleCountingSection); axleCountingSection.loadRelations(); } - oneGenerates() { const map = new Map(); const axleCountingSections = @@ -153,188 +113,136 @@ export class AxleCountingSectionDraw extends GraphicDrawAssistant< const axleCountings = this.app.queryStore.queryByType( AxleCounting.Type ); - const hasfourTurnout: AxleCounting[][] = []; axleCountings.forEach((axleCounting) => { - const refDeviceTarget = axleCounting.datas.axleCountingRef.map( - (ref) => ref.id - ); - for (let i = 0; i < axleCountings.length - 1; i++) { - if (axleCountings[i].id == axleCounting.id) return; - const refDevice = axleCountings[i].datas.axleCountingRef.map( - (ref) => ref.id - ); - const commonElementId = hasCommonElements(refDeviceTarget, refDevice); - if (commonElementId) { - const commonElement = this.app.queryStore.queryById(commonElementId); - let draw = true; - let turoutPos = 0; - //道岔BC端处的计轴不构成计轴区段 - if (commonElement.type == 'Turnout') { - let targetPort, port; - axleCounting.datas.axleCountingRef.forEach((ref) => { - if (ref.id == commonElementId) { - targetPort = ref.devicePort; - } - }); - axleCountings[i].datas.axleCountingRef.forEach((ref) => { - if (ref.id == commonElementId) { - port = ref.devicePort; - } - }); - if ( - (targetPort == 1 && port == 2) || - (targetPort == 2 && port == 1) - ) { - draw = false; - } - if (targetPort == 2 || port == 2) { - turoutPos = 1; - } - } - if (draw) { - this.draw( - [axleCounting, axleCountings[i]], - [commonElement], - map, - turoutPos - ); - } - } - if (hasSamePosition(axleCounting, axleCountings[i])) { - hasfourTurnout.push([axleCounting, axleCountings[i]]); - } - } - }); - //补4个道岔处的BB连接处的计轴区段 - const fourAxleCounting: { - axleCounting: AxleCounting; - refTurout: Turnout; - }[] = []; - hasfourTurnout.forEach((axleCountings) => { - axleCountings.forEach((axleCounting) => { - //计轴关联的道岔 - const axleCountingRelations = - axleCounting.relationManage.getRelationsOfGraphicAndOtherType( - axleCounting, - Turnout.Type - ); - axleCountingRelations.forEach((relation) => { - const refTurnout = relation.getOtherGraphic(axleCounting); - //道岔关联的计轴 - const turnoutRelations = - refTurnout.relationManage.getRelationsOfGraphicAndOtherType( - refTurnout, - AxleCounting.Type - ); - turnoutRelations.forEach((relation) => { - const refAxleCounting = - relation.getOtherGraphic(refTurnout); - if ( - refAxleCounting.id !== axleCountings[0].id && - refAxleCounting.id !== axleCountings[1].id - ) { - fourAxleCounting.push({ - axleCounting: refAxleCounting, - refTurout: refTurnout, - }); - } - }); - }); - }); - }); - for (let x = 0; x < fourAxleCounting.length; x += 4) { - const AxleCountings = fourAxleCounting.slice(x, x + 4); - for (let y = 0; y < 4; y++) { - if ( - fourAxleCounting[x].axleCounting.id == - AxleCountings[y].axleCounting.id - ) - continue; - if ( - fourAxleCounting[x].axleCounting.y == AxleCountings[y].axleCounting.y - ) { - this.draw( - [fourAxleCounting[x].axleCounting, AxleCountings[y].axleCounting], - [fourAxleCounting[x].refTurout, AxleCountings[y].refTurout], - map - ); - break; - } - } - for (let y = 0; y < 4; y++) { - if ( - fourAxleCounting[x + 1].axleCounting.id == - AxleCountings[y].axleCounting.id - ) - continue; - if ( - fourAxleCounting[x + 1].axleCounting.y == - AxleCountings[y].axleCounting.y - ) { - this.draw( - [ - fourAxleCounting[x + 1].axleCounting, - AxleCountings[y].axleCounting, - ], - [fourAxleCounting[x + 1].refTurout, AxleCountings[y].refTurout], - map - ); - break; - } - } - } - //补删除计轴后的区段 - const axleCountingAll = this.app.queryStore.queryByType( - AxleCounting.Type - ); - const deleteRefTurout: string[] = []; - const redawAxleCounting: AxleCounting[] = []; - axleCountingAll.forEach((axleCounting) => { - const axleCountingRelations = + //计轴关联的区段 + const axleCountingRefSection = axleCounting.relationManage.getRelationsOfGraphicAndOtherType( axleCounting, - AxleCountingSection.Type + Section.Type ); - if ( - axleCounting.datas.axleCountingRef.length == 2 && - axleCountingRelations.length < 2 - ) { - axleCounting.datas.axleCountingRef.forEach((ref) => { - if (ref.deviceType == 1) { - redawAxleCounting.push(axleCounting); - } - if (ref.deviceType == 1 && !deleteRefTurout.includes(ref.id)) { - deleteRefTurout.push(ref.id); - } - }); - } - }); - deleteRefTurout.forEach((id) => { - const turout = this.app.queryStore.queryById(id); - const turoutRelations = - turout.relationManage.getRelationsOfGraphicAndOtherType( - turout, + axleCountingRefSection.forEach((ref) => { + const refDevice = ref.getOtherGraphic
(axleCounting); + const refDevicePort = ref.getOtherRelationParam(axleCounting).param; + const refDeviceOtherPort = refDevicePort == 'A' ? 'B' : 'A'; + const otherPortRefAxle = refDevice.relationManage + .getRelationsOfGraphicAndOtherType(refDevice, AxleCounting.Type) + .find( + (relation) => + relation.getRelationParam(refDevice).param == refDeviceOtherPort + ) + ?.getOtherGraphic(refDevice); + if (otherPortRefAxle !== undefined) { + this.draw( + [axleCounting, otherPortRefAxle as AxleCounting], + [refDevice], + map + ); + } + }); + //计轴关联的道岔 + const axleCountingRefTurnout = + axleCounting.relationManage.getRelationsOfGraphicAndOtherType( + axleCounting, Turnout.Type ); - const refTurout = turoutRelations[0].getOtherGraphic(turout); - const refs = refTurout.relationManage - .getRelationsOfGraphicAndOtherType(refTurout, AxleCounting.Type) - .find( - (relation) => - relation.getRelationParam(refTurout).param !== TurnoutPort.C - ); - const refAxleCountin = refs?.getOtherGraphic(refTurout) as AxleCounting; - this.draw( - [refAxleCountin, redawAxleCounting[0]], - [refTurout, turout], - map - ); - this.draw( - [refAxleCountin, redawAxleCounting[1]], - [refTurout, turout], - map, - -1 - ); + axleCountingRefTurnout.forEach((ref) => { + const refDevice = ref.getOtherGraphic(axleCounting); + const refDevicePort = ref.getOtherRelationParam(axleCounting).param; + let refDeviceOtherPort: string[] = []; + switch (refDevicePort) { + case 'A': + refDeviceOtherPort = ['B', 'C']; + break; + case 'B': + refDeviceOtherPort = ['A', 'C']; + break; + case 'C': + refDeviceOtherPort = ['A', 'B']; + break; + } + //关联道岔的其它端点--需要找路径 + refDeviceOtherPort.forEach((port) => { + const otherPortRefAxle = refDevice.relationManage + .getRelationsOfGraphicAndOtherType(refDevice, AxleCounting.Type) + .find( + (relation) => relation.getRelationParam(refDevice).param == port + ) + ?.getOtherGraphic(refDevice); + if ( + otherPortRefAxle !== undefined && + removePortBC(refDevicePort, port) + ) { + let turoutPos = 0; + if (refDevicePort == 'C' || port == 'C') { + turoutPos = 1; + } + this.draw( + [axleCounting, otherPortRefAxle as AxleCounting], + [refDevice], + map, + [turoutPos] + ); + } else if (otherPortRefAxle == undefined) { + const refDeviceRefTurnoutRelation = refDevice.relationManage + .getRelationsOfGraphicAndOtherType(refDevice, Turnout.Type) + .find( + (relation) => relation.getRelationParam(refDevice).param == port + ); + const refDeviceRefTurnout = + refDeviceRefTurnoutRelation?.getOtherGraphic(refDevice); + const refDeviceRefTurnoutPort = + refDeviceRefTurnoutRelation?.getRelationParam( + refDeviceRefTurnout as JlGraphic + ).param; + const otherPortRefAxleInfo: { + axle: AxleCounting; + turoutPort: string; + }[] = []; + const otherPortRefAxleRelation = refDeviceRefTurnout?.relationManage + .getRelationsOfGraphicAndOtherType( + refDeviceRefTurnout, + AxleCounting.Type + ) + .filter((relation) => { + return ( + relation.getRelationParam(refDeviceRefTurnout).param !== + refDeviceRefTurnoutPort + ); + }) + .forEach((ref) => { + otherPortRefAxleInfo.push({ + axle: ref.getOtherGraphic(refDeviceRefTurnout), + turoutPort: ref.getRelationParam(refDeviceRefTurnout).param, + }); + }); + const bbConnect = + port == 'B' && refDeviceRefTurnoutPort == 'B' ? true : false; + otherPortRefAxleInfo?.forEach((info) => { + if ( + (refDevicePort !== 'C' && info.turoutPort !== 'C') || + (refDevicePort == 'A' && info.turoutPort == 'C' && !bbConnect) + ) { + let turoutPos: number[] = []; + if ( + refDevicePort == 'A' && + info.turoutPort == 'C' && + !bbConnect + ) { + turoutPos = [0, 1]; + } else { + turoutPos = [0, 0]; + } + this.draw( + [axleCounting, info.axle as AxleCounting], + [refDevice, refDeviceRefTurnout as JlGraphic], + map, + turoutPos + ); + } + }); + } + }); + }); }); } }