From 7db7849b85d01bbe7d9b3a91b4ca2b4f5b245bf8 Mon Sep 17 00:00:00 2001 From: Regenhardt Date: Tue, 4 Jan 2022 18:55:40 +0100 Subject: [PATCH] Enable max tokens in a place --- src/scripts/models/nets/petriNet.coffee | 2 ++ src/scripts/models/points/nodes/place.coffee | 11 ++++++----- src/scripts/models/tools/tokenTool.coffee | 13 +++++++++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/scripts/models/nets/petriNet.coffee b/src/scripts/models/nets/petriNet.coffee index dbe64f5..de38df6 100644 --- a/src/scripts/models/nets/petriNet.coffee +++ b/src/scripts/models/nets/petriNet.coffee @@ -38,7 +38,9 @@ class @PetriNet extends @Net isFirable: (transition) -> return false if transition.type isnt "transition" preset = @getPreset(transition) + postset = @getPostset(transition) return false for place in preset when parseInt(place.tokens) < @getEdgeWeight(place, transition) + return false for place in postset when parseInt(place.tokens) + @getEdgeWeight(transition, place) > parseInt(place.tokensCap) return true # Gets the weight of an edge between two nodes diff --git a/src/scripts/models/points/nodes/place.coffee b/src/scripts/models/points/nodes/place.coffee index 38b53de..5b012d0 100644 --- a/src/scripts/models/points/nodes/place.coffee +++ b/src/scripts/models/points/nodes/place.coffee @@ -1,14 +1,14 @@ ### - Petri nets places may have a label and a number of tokens + Petri nets places may have a label, a number of tokens and a token capacity ### class @Place extends @Node constructor: (point) -> super(point) - {@tokens = 0} = point + {@tokens = 0, @tokensCap = 255} = point @type = "place" @connectableTypes = ["transition"] - @labelYoffset = 30 + @labelYoffset = 50 @radius = 18 getText: -> @@ -16,5 +16,6 @@ class @Place extends @Node return "p#{@id}" getTokenLabel: -> - return "" if @tokens is 0 - return @tokens + return "" if @tokens is 0 and @tokensCap is 255 + return @tokens if @tokensCap is 255 + return "#{@tokens}/#{@tokensCap}" diff --git a/src/scripts/models/tools/tokenTool.coffee b/src/scripts/models/tools/tokenTool.coffee index c1cf1c5..88951f2 100644 --- a/src/scripts/models/tools/tokenTool.coffee +++ b/src/scripts/models/tools/tokenTool.coffee @@ -17,18 +17,27 @@ class @TokenTool extends @Tool text: "Enter a number of tokens for this place" formElements: [ { - name: "Integer ≥ 0" + name: "Current tokens" type: "number" min: 0 value: parseInt(mouseDownNode.tokens) + }, + { + name: "Max tokens" + type: "number" + min: 1 + value: parseInt(mouseDownNode.tokensCap) } ] }) .then (formElements) -> if formElements tokens = formElements[0].value - if tokens >= 0 + cap = formElements[1].value + if tokens >= 0 or cap >= 1 mouseDownNode.tokens = tokens + mouseDownNode.tokensCap = cap + mouseDownNode.radius = if cap is 255 then 18 else 25 restart() else if mouseDownNode.type is "transition"