/// <summary> /// Build a List of Columns from a PetriNet /// </summary> /// <param name="petriNet"></param> /// <returns></returns> /// <author>Jannik Arndt</author> public static List<Column> Build(PetriNet petriNet) { // Initialize GlobalColumnList.Clear(); Column firstColumn = new Column(0); Place startPlace = (Place) petriNet.GetSources()[0]; firstColumn.HashSetOfNodes.Add(startPlace); GlobalColumnList.Add(firstColumn); // Recursively add all columns AddPlace(startPlace, 1); // Correct the end-place Place endPlace = (Place) petriNet.GetSinks()[0]; Column temp = FindNode(endPlace); if (temp != null && temp.ColumnNumber < GlobalColumnList.Count) { temp.HashSetOfNodes.Remove(endPlace); TrimGlobalColumnList(); GetOrCreateColumn(GlobalColumnList.Count).HashSetOfNodes.Add(endPlace); } return GlobalColumnList; }
/// <summary> /// Remove old "End"-Places, combine sinks and add new "End"-Place /// </summary> /// <param name="petriNet">The petrinet to work on</param> /// <author>Jannik Arndt</author> public void FixEnding(PetriNet petriNet) { foreach (Place endPlace in petriNet.Places.Where(place => place.Name.Equals("End"))) endPlace.Name = ""; List<Place> endPlaces = (from sink in petriNet.GetSinks() where sink.GetType() == typeof(Place) select sink as Place).ToList(); if (endPlaces.Count > 1) foreach (Place endPlace in endPlaces.Skip(1)) { foreach (Transition incomingTransition in endPlace.IncomingTransitions) { endPlaces[0].IncomingTransitions.Add(incomingTransition); incomingTransition.OutgoingPlaces.Clear(); incomingTransition.OutgoingPlaces.Add(endPlaces[0]); } petriNet.Places.Remove(endPlace); } endPlaces[0].Name = "End"; }