Skip to content

Commit 43e67a3

Browse files
committed
asymmetry: propagate times for non-stop trainruns + better locks use
Signed-off-by: Louis Greiner <[email protected]>
1 parent d785057 commit 43e67a3

File tree

6 files changed

+178
-176
lines changed

6 files changed

+178
-176
lines changed

src/app/services/data/node.service.ts

Lines changed: 66 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -479,74 +479,74 @@ export class NodeService implements OnDestroy {
479479
trainrunSection.setTargetPortId(targetPortId);
480480
}
481481

482-
hasPathAnyDepartureOrArrivalTimeLock(node: Node, trainrunSection: TrainrunSection): boolean {
483-
const iterator = this.trainrunService.getIterator(node, trainrunSection);
484-
while (iterator.hasNext()) {
485-
iterator.next();
486-
const currentTrainrunSection = iterator.current().trainrunSection;
487-
if (
488-
currentTrainrunSection.getSourceDepartureLock() ||
489-
currentTrainrunSection.getTargetArrivalLock()
490-
) {
491-
return true;
482+
propagateTimes(nodeId: number, transitionId: number, isForward: boolean) {
483+
const node = this.getNodeFromId(nodeId);
484+
const sections = node.getTrainrunSections(transitionId);
485+
const node1 = node.getOppositeNode(sections.trainrunSection1);
486+
const node2 = node.getOppositeNode(sections.trainrunSection2);
487+
488+
let isSection1Locked = false;
489+
let isSection2Locked = false;
490+
// Note: the source->target chain allows to check only the source or target locks based on isForward value
491+
if (isForward) {
492+
// Forward propagation (A->B->C): check A and B sides locks (sourceDepartures)
493+
isSection1Locked = sections.trainrunSection1.getSourceDepartureLock();
494+
isSection2Locked = sections.trainrunSection2.getSourceDepartureLock();
495+
496+
// order is important: section1 then section2
497+
if (!isSection1Locked) {
498+
this.trainrunSectionService.iterateAlongTrainrunUntilEndAndPropagateTime(
499+
node1,
500+
sections.trainrunSection1.getId(),
501+
);
502+
}
503+
if (!isSection2Locked) {
504+
this.trainrunSectionService.iterateAlongTrainrunUntilEndAndPropagateTime(
505+
node2,
506+
sections.trainrunSection2.getId(),
507+
);
508+
}
509+
} else {
510+
// Backward propagation (A<-B<-C): check B and C sides locks (targetDepartures)
511+
isSection1Locked = sections.trainrunSection1.getTargetDepartureLock();
512+
isSection2Locked = sections.trainrunSection2.getTargetDepartureLock();
513+
514+
// order is important: section2 then section1
515+
if (!isSection2Locked) {
516+
this.trainrunSectionService.iterateAlongTrainrunUntilEndAndPropagateTime(
517+
node2,
518+
sections.trainrunSection2.getId(),
519+
);
520+
}
521+
if (!isSection1Locked) {
522+
this.trainrunSectionService.iterateAlongTrainrunUntilEndAndPropagateTime(
523+
node1,
524+
sections.trainrunSection1.getId(),
525+
);
492526
}
493527
}
494-
return false;
495-
}
496-
497-
toggleNonStop(nodeId: number, transitionId: number) {
498-
const node = this.getNodeFromId(nodeId);
499-
node.toggleNonStop(transitionId);
500-
const trainrunSections = node.getTrainrunSections(transitionId);
501-
const node1 = node.getOppositeNode(trainrunSections.trainrunSection1);
502-
const node2 = node.getOppositeNode(trainrunSections.trainrunSection2);
503-
const isForwardPathLocked = this.hasPathAnyDepartureOrArrivalTimeLock(
504-
node1,
505-
trainrunSections.trainrunSection1,
506-
);
507-
const isBackwardPathLocked = this.hasPathAnyDepartureOrArrivalTimeLock(
508-
node2,
509-
trainrunSections.trainrunSection2,
510-
);
511528

512-
if (!isForwardPathLocked) {
513-
this.trainrunSectionService.iterateAlongTrainrunUntilEndAndPropagateTime(
514-
node1,
515-
trainrunSections.trainrunSection1.getId(),
516-
);
517-
}
518-
if (!isBackwardPathLocked) {
519-
this.trainrunSectionService.iterateAlongTrainrunUntilEndAndPropagateTime(
520-
node2,
521-
trainrunSections.trainrunSection2.getId(),
522-
);
529+
if (isSection1Locked) {
530+
this.createTransitionWarning(sections.trainrunSection1, node);
523531
}
524-
525-
if (isForwardPathLocked && isBackwardPathLocked) {
526-
const warningTitle = $localize`:@@app.services.data.node.transit-modified.title:Transition changed`;
527-
const warningDescription = $localize`:@@app.services.data.node.transit-modified.description:Times cannot be adjusted, lock found on both sides`;
528-
this.trainrunSectionService.setWarningOnNode(
529-
trainrunSections.trainrunSection1.getId(),
530-
node.getId(),
531-
warningTitle,
532-
warningDescription,
533-
);
534-
this.trainrunSectionService.setWarningOnNode(
535-
trainrunSections.trainrunSection2.getId(),
536-
node.getId(),
537-
warningTitle,
538-
warningDescription,
539-
);
532+
if (isSection2Locked) {
533+
this.createTransitionWarning(sections.trainrunSection2, node);
540534
}
541535

542536
TransitionValidator.validateTransition(node, transitionId);
543537
this.transitionsUpdated();
544538
this.nodesUpdated();
545539
this.operation.emit(
546-
new TrainrunOperation(OperationType.update, trainrunSections.trainrunSection1.getTrainrun()),
540+
new TrainrunOperation(OperationType.update, sections.trainrunSection1.getTrainrun()),
547541
);
548542
}
549543

544+
toggleNonStop(nodeId: number, transitionId: number) {
545+
const node = this.getNodeFromId(nodeId);
546+
node.toggleNonStop(transitionId);
547+
this.propagateTimes(nodeId, transitionId, true);
548+
}
549+
550550
checkExistsNoCycleTrainrunAfterFreePortsConnecting(
551551
node: Node,
552552
port1: Port,
@@ -1176,4 +1176,15 @@ export class NodeService implements OnDestroy {
11761176
});
11771177
return labelIDCauntMap;
11781178
}
1179+
1180+
private createTransitionWarning(trainrunSection: TrainrunSection, node: Node) {
1181+
const warningTitle = $localize`:@@app.services.data.node.transit-modified.title:Transition changed`;
1182+
const warningDescription = $localize`:@@app.services.data.node.transit-modified.description:Times cannot be adjusted, the departure time is locked.`;
1183+
this.trainrunSectionService.setWarningOnNode(
1184+
trainrunSection.getId(),
1185+
node.getId(),
1186+
warningTitle,
1187+
warningDescription,
1188+
);
1189+
}
11791190
}

0 commit comments

Comments
 (0)