|
| 1 | +import {AfterViewInit, Component, Input} from '@angular/core'; |
| 2 | +import { |
| 3 | + PetriflowArc, |
| 4 | + PetriflowCanvasConfigurationService, |
| 5 | + PetriflowCanvasFactoryService, |
| 6 | + PetriflowCanvasService, |
| 7 | + PetriflowInhibitorArc, |
| 8 | + PetriflowPlace, |
| 9 | + PetriflowPlaceTransitionArc, PetriflowReadArc, |
| 10 | + PetriflowResetArc, |
| 11 | + PetriflowTransition, PetriflowTransitionPlaceArc |
| 12 | +} from '@netgrif/petriflow.svg'; |
| 13 | +import { |
| 14 | + Arc, |
| 15 | + InhibitorArc, |
| 16 | + ReadArc, |
| 17 | + RegularPlaceTransitionArc, |
| 18 | + RegularTransitionPlaceArc, |
| 19 | + ResetArc |
| 20 | +} from '@netgrif/petri.svg'; |
| 21 | +import {CaseRefField} from './models/case-ref-field'; |
| 22 | +import {PetriNetResourceService} from '../../resources/engine-endpoint/petri-net-resource.service'; |
| 23 | +import {CaseResourceService} from '../../resources/engine-endpoint/case-resource.service'; |
| 24 | +import {TransitionImport} from '../../resources/interface/transition-import'; |
| 25 | +import {PlaceImport} from '../../resources/interface/place-import'; |
| 26 | +import {ArcImport} from '../../resources/interface/arc-import'; |
| 27 | +import {ArcType} from '../../resources/interface/arc-type'; |
| 28 | + |
| 29 | +@Component({ |
| 30 | + selector: 'ncc-abstract-case-ref-field', |
| 31 | + template: '' |
| 32 | +}) |
| 33 | +export abstract class AbstractCaseRefFieldComponent implements AfterViewInit { |
| 34 | + |
| 35 | + @Input() public dataField: CaseRefField; |
| 36 | + |
| 37 | + constructor(protected _petriflowCanvasService: PetriflowCanvasService, protected _petriflowFactoryService: PetriflowCanvasFactoryService, |
| 38 | + protected _petriflowConfigService: PetriflowCanvasConfigurationService, protected _caseResourceService: CaseResourceService, |
| 39 | + protected _petriNetResourceService: PetriNetResourceService){ |
| 40 | + } |
| 41 | + |
| 42 | + ngAfterViewInit(): void { |
| 43 | + this._petriNetResourceService.getNetByCaseId(this.dataField.value).subscribe(net => { |
| 44 | + if (net) { |
| 45 | + const trans: Array<PetriflowTransition> = []; |
| 46 | + const places: Array<PetriflowPlace> = []; |
| 47 | + let minX: number = Number.MAX_SAFE_INTEGER; |
| 48 | + let minY: number = Number.MAX_SAFE_INTEGER; |
| 49 | + net.transitions.forEach((value) => { |
| 50 | + trans.push(this.createTransitions(value)); |
| 51 | + minX = Math.min(minX, value.position.x); |
| 52 | + minY = Math.min(minY, value.position.y); |
| 53 | + }) |
| 54 | + net.places.forEach((value) => { |
| 55 | + places.push(this.createPlace(value)); |
| 56 | + minX = Math.min(minX, value.position.x); |
| 57 | + minY = Math.min(minY, value.position.y); |
| 58 | + }) |
| 59 | + net.arcs.forEach((arc) => { |
| 60 | + this.createArcs(trans, places, arc); |
| 61 | + arc.breakpoints?.forEach(value => { |
| 62 | + minX = Math.min(minX, value.x); |
| 63 | + minY = Math.min(minY, value.y); |
| 64 | + }); |
| 65 | + }); |
| 66 | + this._petriflowCanvasService.panzoom?.moveTo(-minX+20, -minY+20); |
| 67 | + setTimeout(() => { |
| 68 | + this._petriflowCanvasService.panzoom?.pause(); |
| 69 | + }) |
| 70 | + } |
| 71 | + }); |
| 72 | + } |
| 73 | + |
| 74 | + protected createTransitions(value: TransitionImport): PetriflowTransition { |
| 75 | + const transition = this._petriflowFactoryService.createTransition(new DOMPoint(value.position.x, value.position.y)); |
| 76 | + transition.changeId(value.stringId); |
| 77 | + this._petriflowConfigService.addTransitionEvents(transition); |
| 78 | + return transition; |
| 79 | + } |
| 80 | + |
| 81 | + protected createPlace(value: PlaceImport): PetriflowPlace { |
| 82 | + const place = this._petriflowFactoryService.createPlace(value.tokens, new DOMPoint(value.position.x, value.position.y)); |
| 83 | + place.changeId(value.stringId); |
| 84 | + this._petriflowConfigService.addPlaceEvents(place); |
| 85 | + return place; |
| 86 | + } |
| 87 | + |
| 88 | + protected createArcs(trans: Array<PetriflowTransition>, places: Array<PetriflowPlace>, arc: ArcImport) { |
| 89 | + let source: PetriflowPlace | PetriflowTransition = trans.find(value => value.canvasElement.label.textContent === arc.sourceId); |
| 90 | + let destination: PetriflowPlace | PetriflowTransition; |
| 91 | + if (source === undefined) { |
| 92 | + source = places.find(value => value.canvasElement.label.textContent === arc.sourceId); |
| 93 | + destination = trans.find(value => value.canvasElement.label.textContent === arc.destinationId); |
| 94 | + } else { |
| 95 | + destination = places.find(value => value.canvasElement.label.textContent === arc.destinationId); |
| 96 | + } |
| 97 | + if (source === undefined || destination === undefined) { |
| 98 | + console.error("Can't find source or destination for arc [" + arc.importId + "]"); |
| 99 | + } else { |
| 100 | + const newArc: Arc = this.createArc(arc, source, destination); |
| 101 | + const petriflowArc: PetriflowArc<Arc> = this.createPetriflowArc(arc, newArc, source); |
| 102 | + this._petriflowCanvasService.canvas.container.appendChild(newArc.container); |
| 103 | + this._petriflowCanvasService.petriflowElementsCollection.arcs.push(petriflowArc); |
| 104 | + } |
| 105 | + } |
| 106 | + |
| 107 | + protected createArc(arc: ArcImport, source: PetriflowTransition | PetriflowPlace, destination: PetriflowPlace | PetriflowTransition) { |
| 108 | + if (source instanceof PetriflowPlace) { |
| 109 | + switch (arc.type) { |
| 110 | + case ArcType.ARC: { |
| 111 | + return this._petriflowFactoryService.createArc(RegularPlaceTransitionArc, source.canvasElement, destination.canvasElement, arc.breakpoints, arc.multiplicity); |
| 112 | + } |
| 113 | + case ArcType.RESET: { |
| 114 | + return this._petriflowFactoryService.createArc(ResetArc, source.canvasElement, destination.canvasElement, arc.breakpoints, arc.multiplicity); |
| 115 | + } |
| 116 | + case ArcType.INHIBITOR: { |
| 117 | + return this._petriflowFactoryService.createArc(InhibitorArc, source.canvasElement, destination.canvasElement, arc.breakpoints, arc.multiplicity); |
| 118 | + } |
| 119 | + case ArcType.READ: { |
| 120 | + return this._petriflowFactoryService.createArc(ReadArc, source.canvasElement, destination.canvasElement, arc.breakpoints, arc.multiplicity); |
| 121 | + } |
| 122 | + default: { |
| 123 | + return undefined; |
| 124 | + } |
| 125 | + } |
| 126 | + } else if (arc.type === ArcType.ARC) { |
| 127 | + return this._petriflowFactoryService.createArc(RegularTransitionPlaceArc, source.canvasElement, destination.canvasElement, arc.breakpoints, arc.multiplicity); |
| 128 | + } else { |
| 129 | + return undefined; |
| 130 | + } |
| 131 | + } |
| 132 | + |
| 133 | + protected createPetriflowArc(arc: ArcImport, newArc: Arc, source: PetriflowTransition | PetriflowPlace) { |
| 134 | + if (source instanceof PetriflowPlace) { |
| 135 | + switch (arc.type) { |
| 136 | + case ArcType.ARC: { |
| 137 | + return this._petriflowFactoryService.createArc(PetriflowPlaceTransitionArc, newArc); |
| 138 | + } |
| 139 | + case ArcType.RESET: { |
| 140 | + return this._petriflowFactoryService.createArc(PetriflowResetArc, newArc); |
| 141 | + } |
| 142 | + case ArcType.INHIBITOR: { |
| 143 | + return this._petriflowFactoryService.createArc(PetriflowInhibitorArc, newArc); |
| 144 | + } |
| 145 | + case ArcType.READ: { |
| 146 | + return this._petriflowFactoryService.createArc(PetriflowReadArc, newArc); |
| 147 | + } |
| 148 | + default: { |
| 149 | + return undefined; |
| 150 | + } |
| 151 | + } |
| 152 | + } else if (arc.type === ArcType.ARC) { |
| 153 | + return this._petriflowFactoryService.createArc(PetriflowTransitionPlaceArc, newArc); |
| 154 | + } else { |
| 155 | + return undefined; |
| 156 | + } |
| 157 | + } |
| 158 | +} |
0 commit comments