From 020ecfd57060dead30acdbe29c16f1e15f528cbb Mon Sep 17 00:00:00 2001 From: Jozef Daxner Date: Mon, 7 Apr 2025 13:08:04 +0200 Subject: [PATCH 1/2] [NAB-375] Variables with no init values referenced in arcs will cause arcs not to load - arcs which referenced data has non integer value will be displayed/represented with value 0 in edit + simulation mode --- src/app/modeler/services/model/model.service.ts | 6 ++++-- .../modeler/simulation-mode/simulation-mode.service.ts | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/app/modeler/services/model/model.service.ts b/src/app/modeler/services/model/model.service.ts index 210ceef..1dcf27e 100644 --- a/src/app/modeler/services/model/model.service.ts +++ b/src/app/modeler/services/model/model.service.ts @@ -483,8 +483,10 @@ export class ModelService { const referencedData = model.getData(id); if (referencedData) { if (referencedData.init.value) { - return Number(referencedData.init.value); - // TODO: NAB-326 check if isFinite and >= 0 + if (/^[1-9]\d*$/.test(referencedData.init.value.trim())) { + return Number(referencedData.init.value); + } + return 0; } return 0; } diff --git a/src/app/modeler/simulation-mode/simulation-mode.service.ts b/src/app/modeler/simulation-mode/simulation-mode.service.ts index bba93bb..b57e6e1 100644 --- a/src/app/modeler/simulation-mode/simulation-mode.service.ts +++ b/src/app/modeler/simulation-mode/simulation-mode.service.ts @@ -87,7 +87,13 @@ export class SimulationModeService extends CanvasModeService { this.originalModel = new BehaviorSubject(this.modelService.model.clone()); this.originalModel.subscribe(model => { this.data = new Map(model.getArcs().filter(a => !!a.reference && !!model.getData(a.reference)) - .map(a => [a.reference, Number.parseInt(model.getData(a.reference).init?.value, 10) || 0])); + .map(a => { + const data = model.getData(a.reference); + if (!!data.init && !!data.init.value && /^[1-9]\d*$/.test(data.init.value)) { + return [a.reference, Number.parseInt(data.init.value, 10)]; + } + return [a.reference, 0]; + })); this.simulation = new BasicSimulation(model, this.data); this.renderModel(model); }); From e5daa2f0f41fd4fdbf1765e4106cd504b1b43002 Mon Sep 17 00:00:00 2001 From: Milan Mladoniczky <6153201+tuplle@users.noreply.github.com> Date: Wed, 14 May 2025 11:33:49 +0200 Subject: [PATCH 2/2] [NAB-375] Variables with no init values referenced in arcs will cause arcs not to load - Improved usage of ImportUtils.isInitValueNumber to replace regex checks for initialization values. --- .../modeler/services/model/model.service.ts | 23 ++++++++++--------- .../simulation-mode.service.ts | 10 ++++---- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/app/modeler/services/model/model.service.ts b/src/app/modeler/services/model/model.service.ts index 1dcf27e..6e73b31 100644 --- a/src/app/modeler/services/model/model.service.ts +++ b/src/app/modeler/services/model/model.service.ts @@ -6,12 +6,13 @@ import { DataType, DataVariable, I18nString, + ImportUtils, NodeElement, PetriNet, Place, Role, Transition, - XmlArcType + XmlArcType, } from '@netgrif/petriflow'; import {ModelConfig} from './model-config'; import {CanvasConfiguration} from '@netgrif/petri.svg'; @@ -29,7 +30,7 @@ import {ChangedRole} from '../../role-mode/role-detail/changed-role'; import {ModelerUtils} from '../../modeler-utils'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class ModelService { private readonly _model: BehaviorSubject; @@ -59,7 +60,7 @@ export class ModelService { ]); constructor( - private arcFactory: ArcFactory + private arcFactory: ArcFactory, ) { this._model = new BehaviorSubject(undefined); this._placeChange = new Subject(); @@ -113,7 +114,7 @@ export class ModelService { this.alignPositionCoordinate(x, CanvasConfiguration.WIDTH), this.alignPositionCoordinate(y, CanvasConfiguration.HEIGHT), false, - this.nextPlaceId() + this.nextPlaceId(), ); if (this.model.getPlaces().length === 0) { place.marking = 1; @@ -177,7 +178,7 @@ export class ModelService { const transition = new Transition( this.alignPositionCoordinate(x, CanvasConfiguration.WIDTH), this.alignPositionCoordinate(y, CanvasConfiguration.HEIGHT), - this.nextTransitionId() + this.nextTransitionId(), ); this.addTransition(transition); return transition; @@ -272,10 +273,10 @@ export class ModelService { return arc; } - public newArcBreakpoint(arc: Arc, position: DOMPoint, index: number,): void { + public newArcBreakpoint(arc: Arc, position: DOMPoint, index: number): void { const breakPoint = new Breakpoint( this.alignPositionX(position.x), - this.alignPositionY(position.y) + this.alignPositionY(position.y), ); arc.breakpoints.splice(index, 0, breakPoint); this.model.lastChanged = Date.now(); @@ -455,7 +456,7 @@ export class ModelService { public alignPosition(position: DOMPoint): DOMPoint { return new DOMPoint( this.alignPositionX(position.x), - this.alignPositionY(position.y) + this.alignPositionY(position.y), ); } @@ -483,7 +484,7 @@ export class ModelService { const referencedData = model.getData(id); if (referencedData) { if (referencedData.init.value) { - if (/^[1-9]\d*$/.test(referencedData.init.value.trim())) { + if (ImportUtils.isInitValueNumber(referencedData.init)) { return Number(referencedData.init.value); } return 0; @@ -533,8 +534,8 @@ export class ModelService { .map(dg => dg.getDataRefs() .map(ref => - ModelerUtils.numberOfEventActions(ref.getEvents()) - ).reduce((sum, current) => sum + current, 0) + ModelerUtils.numberOfEventActions(ref.getEvents()), + ).reduce((sum, current) => sum + current, 0), ).reduce((sum, current) => sum + current, 0); return eventActions + dataRefActions; } diff --git a/src/app/modeler/simulation-mode/simulation-mode.service.ts b/src/app/modeler/simulation-mode/simulation-mode.service.ts index b57e6e1..9c95d00 100644 --- a/src/app/modeler/simulation-mode/simulation-mode.service.ts +++ b/src/app/modeler/simulation-mode/simulation-mode.service.ts @@ -1,6 +1,6 @@ import {Injectable, Injector} from '@angular/core'; import {BehaviorSubject} from 'rxjs'; -import {Arc, BasicSimulation, PetriNet, Place, Transition} from '@netgrif/petriflow'; +import {Arc, BasicSimulation, ImportUtils, PetriNet, Place, Transition} from '@netgrif/petriflow'; import {TutorialService} from '../../tutorial/tutorial-service'; import {ModelService} from '../services/model/model.service'; import {EventSimulationTool} from './tool/event-simulation.tool'; @@ -24,7 +24,7 @@ import {SimulationMode} from './simulation-mode'; import {CanvasPlace} from '../edit-mode/domain/canvas-place'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class SimulationModeService extends CanvasModeService { @@ -74,7 +74,7 @@ export class SimulationModeService extends CanvasModeService { new ChangeDataTool(modelService, dialog, this, router, transitionService), new ResetPositionAndZoomTool(modelService, dialog, this, router, transitionService), new GridTool(modelService, dialog, this, router, transitionService), - new SwitchLabelTool(modelService, dialog, this, router, transitionService) + new SwitchLabelTool(modelService, dialog, this, router, transitionService), ); this.switchTools.tools.forEach(t => t.bind()); this.tools = [ @@ -82,14 +82,14 @@ export class SimulationModeService extends CanvasModeService { this.defaultTool, new EventSimulationTool(modelService, dialog, this, router, transitionService), ), - this.switchTools + this.switchTools, ]; this.originalModel = new BehaviorSubject(this.modelService.model.clone()); this.originalModel.subscribe(model => { this.data = new Map(model.getArcs().filter(a => !!a.reference && !!model.getData(a.reference)) .map(a => { const data = model.getData(a.reference); - if (!!data.init && !!data.init.value && /^[1-9]\d*$/.test(data.init.value)) { + if (ImportUtils.isInitValueNumber(data.init)) { return [a.reference, Number.parseInt(data.init.value, 10)]; } return [a.reference, 0];