diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs index 1ce4728..e0301f7 100644 --- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs +++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs @@ -69,6 +69,7 @@ namespace PamhagenSysCtrl.Windows { [FastSelectButton_MW2_Tank5] = (Graph.MW2, Graph.MP2, Graph.Tank5), }; App.Plant?.Update += OnUpdate; + InitializePaths(); } private void OnClosed(object sender, EventArgs evt) { @@ -94,6 +95,8 @@ namespace PamhagenSysCtrl.Windows { } Menu_Settings_OverridePathClearances.IsChecked = false; Menu_Settings_OverrideDryRunClearances.IsChecked = false; + + InitializePaths(); } OnUpdate(null, null); } @@ -593,5 +596,32 @@ namespace PamhagenSysCtrl.Windows { if (sender is not PamhagenPlant plant) return; UpdateScheme(Mouse.GetPosition(SchemeCanvas), Mouse.LeftButton == MouseButtonState.Pressed); } + + public void InitializePaths() { + var add = ReconstructSelectedPaths().ToList(); + var remove = Graph.SelectedPaths.ToList(); + foreach (var p in remove) Graph.RemovePath(p); + for (int i = 1; i <= 57; i++) { + App.Plant?.CloseV(i); + } + foreach (var p in add) { + if (p.Hops.Any(h => h.Node is Valve v && v.IsLocked)) continue; + Graph.AddPath(p); + } + } + + public IEnumerable ReconstructSelectedPaths() { + if (App.Plant is not PamhagenPlant p) yield break; + var sources = Graph.Nodes.Where(n => n is ISource).ToList(); + var sinks = Graph.Nodes.Where(n => n is ISink).ToList(); + foreach (var src in sources) { + var paths = new List(); + foreach (var sink in sinks) { + paths.AddRange(Graph.GetPaths(src, sink, null, (n) => n is not ISink && (n is not Valve v || p.WantValveOpen(v.Nr)))); + } + if (paths.Count == 1) + yield return paths.First(); + } + } } }