From f0accc8df88c2d3607924e7918e31466e5e3368c Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Tue, 11 Aug 2026 00:26:27 +0200 Subject: [PATCH] Add fast select buttons --- PamhagenSysCtrl/Helpers/PamhagenGraph.cs | 97 +++++++----- PamhagenSysCtrl/Helpers/Pipeline/Graph.cs | 8 + PamhagenSysCtrl/Helpers/Pipeline/Valve.cs | 4 +- .../Windows/PlantSchemeWindow.xaml | 87 ++++++++++- .../Windows/PlantSchemeWindow.xaml.cs | 145 +++++++++++++++--- 5 files changed, 276 insertions(+), 65 deletions(-) diff --git a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs index ec88b03..58a2c41 100644 --- a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs +++ b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs @@ -18,6 +18,17 @@ namespace PamhagenSysCtrl.Helpers { public readonly Pump P6; public readonly EncasedAuger Auger1; public readonly EncasedAuger Auger3; + public readonly Press Press1; + public readonly Press Press2; + public readonly Tank Tank1; + public readonly Tank Tank2; + public readonly Tank Tank3; + public readonly Tank Tank4; + public readonly Tank Tank5; + public readonly Tank Tank6; + public readonly Tank Tank7; + public readonly Tank Tank8; + public readonly Tank Tank9; public PamhagenGraph() { double mw2X = 180; @@ -180,37 +191,37 @@ namespace PamhagenSysCtrl.Helpers { var xv23 = new PipeJoin(t1X + 15, ltg6Y); var v22 = CreateValve(22, t1X - 15, tValveY); var v23 = CreateValve(23, t1X + 15, tValveY); - var t1 = CreateTank(1, t1X, tanksY, 35000); + Tank1 = CreateTank(1, t1X, tanksY, 35000); CreatePipe(xv20, xv22, true, label: "Ltg. 7", labelOffsetX: 50); CreatePipe(xv21, xv23, true, label: "Ltg. 6", labelOffsetX: 20); CreatePipe(xv22, v22); CreatePipe(xv23, v23); - CreateInlet(v22, t1); - CreateInlet(v23, t1); + CreateInlet(v22, Tank1); + CreateInlet(v23, Tank1); var xv24 = new PipeJoin(t2X - 15, ltg7Y); var xv25 = new PipeJoin(t2X + 15, ltg6Y); var v24 = CreateValve(24, t2X - 15, tValveY); var v25 = CreateValve(25, t2X + 15, tValveY); - var t2 = CreateTank(2, t2X, tanksY, 35000); + Tank2 = CreateTank(2, t2X, tanksY, 35000); CreatePipe(xv22, xv24); CreatePipe(xv23, xv25); CreatePipe(xv24, v24); CreatePipe(xv25, v25); - CreateInlet(v24, t2); - CreateInlet(v25, t2); + CreateInlet(v24, Tank2); + CreateInlet(v25, Tank2); var xv26 = new PipeJoin(t3X - 15, ltg7Y); var xv27 = new PipeJoin(t3X + 15, ltg6Y); var v26 = CreateValve(26, t3X - 15, tValveY); var v27 = CreateValve(27, t3X + 15, tValveY); - var t3 = CreateTank(3, t3X, tanksY, 35000); + Tank3 = CreateTank(3, t3X, tanksY, 35000); CreatePipe(xv24, xv26); CreatePipe(xv25, xv27); CreatePipe(xv26, v26); CreatePipe(xv27, v27); - CreateInlet(v26, t3); - CreateInlet(v27, t3); + CreateInlet(v26, Tank3); + CreateInlet(v27, Tank3); var v28 = CreateValve(28, (t3X + t4X) / 2, ltg7Y); var v29 = CreateValve(29, (t3X + t4X) / 2, ltg6Y); @@ -221,25 +232,25 @@ namespace PamhagenSysCtrl.Helpers { var xv31 = new PipeJoin(t4X + 15, ltg6Y); var v30 = CreateValve(30, t4X - 15, tValveY); var v31 = CreateValve(31, t4X + 15, tValveY); - var t4 = CreateTank(4, t4X, tanksY, 35000); + Tank4 = CreateTank(4, t4X, tanksY, 35000); CreatePipe(v28, xv30); CreatePipe(v29, xv31); CreatePipe(xv30, v30); CreatePipe(xv31, v31); - CreateInlet(v30, t4); - CreateInlet(v31, t4); + CreateInlet(v30, Tank4); + CreateInlet(v31, Tank4); var xv32 = new PipeJoin(t5X - 15, ltg7Y); var xv33 = new PipeJoin(t5X + 15, ltg6Y); var v32 = CreateValve(32, t5X - 15, tValveY); var v33 = CreateValve(33, t5X + 15, tValveY); - var t5 = CreateTank(5, t5X, tanksY, 35000); + Tank5 = CreateTank(5, t5X, tanksY, 35000); CreatePipe(xv30, xv32, label: "Ltg. 7", labelOffsetX: 30); CreatePipe(xv31, xv33, label: "Ltg. 6", labelOffsetX: 0); CreatePipe(xv32, v32); CreatePipe(xv33, v33); - CreateInlet(v32, t5); - CreateInlet(v33, t5); + CreateInlet(v32, Tank5); + CreateInlet(v33, Tank5); var v34 = CreateValve(34, (t5X + t6X) / 2, ltg7Y); var v35 = CreateValve(35, (t5X + t6X) / 2, ltg6Y); @@ -250,58 +261,58 @@ namespace PamhagenSysCtrl.Helpers { var xv37 = new PipeJoin(t6X - 15, ltg7Y); var v36 = CreateValve(36, t6X + 15, tValveY); var v37 = CreateValve(37, t6X - 15, tValveY); - var t6 = CreateTank(6, t6X, tanksY, 35000); + Tank6 = CreateTank(6, t6X, tanksY, 35000); CreatePipe(v34, xv37); CreatePipe(v35, xv36); CreatePipe(xv37, v37); CreatePipe(xv36, v36); - CreateInlet(v36, t6); - CreateInlet(v37, t6); + CreateInlet(v36, Tank6); + CreateInlet(v37, Tank6); var xv38 = new PipeJoin(t7X + 15, ltg6Y); var xv39 = new PipeJoin(t7X - 15, ltg7Y); var v38 = CreateValve(38, t7X + 15, tValveY); var v39 = CreateValve(39, t7X - 15, tValveY); - var t7 = CreateTank(7, t7X, tanksY, 35000); + Tank7 = CreateTank(7, t7X, tanksY, 35000); CreatePipe(xv37, xv39); CreatePipe(xv36, xv38); CreatePipe(xv38, v38); CreatePipe(xv39, v39); - CreateInlet(v38, t7); - CreateInlet(v39, t7); + CreateInlet(v38, Tank7); + CreateInlet(v39, Tank7); var xv40 = new PipeJoin(t8X + 15, ltg6Y); var xv41 = new PipeJoin(t8X - 15, ltg7Y); var v40 = CreateValve(40, t8X + 15, tValveY); var v41 = CreateValve(41, t8X - 15, tValveY); - var t8 = CreateTank(8, t8X, tanksY, 35000); + Tank8 = CreateTank(8, t8X, tanksY, 35000); CreatePipe(xv38, xv40, label: "Ltg. 6", labelOffsetX: 0); CreatePipe(xv39, xv41, label: "Ltg. 7", labelOffsetX: 30); CreatePipe(xv40, v40); CreatePipe(xv41, v41); - CreateInlet(v40, t8); - CreateInlet(v41, t8); + CreateInlet(v40, Tank8); + CreateInlet(v41, Tank8); var v42 = CreateValve(42, t9X + 15, tValveY); var v43 = CreateValve(43, t9X - 15, tValveY); - var t9 = CreateTank(9, t9X, tanksY, 35000); + Tank9 = CreateTank(9, t9X, tanksY, 35000); CreatePipe(xv40, v42); CreatePipe(xv41, v43); - CreateInlet(v42, t9); - CreateInlet(v43, t9); + CreateInlet(v42, Tank9); + CreateInlet(v43, Tank9); var xp12 = new PipeJoin((t1X + t2X) / 2, tanksY + 80); P12 = new Pump("P1/2", (t1X + t2X) / 2, tanksY + 110, () => App.Plant?.P12 ?? default, () => App.Plant?.P12HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); - CreateOutlet(t1, xp12); - CreateOutlet(t2, xp12); + CreateOutlet(Tank1, xp12); + CreateOutlet(Tank2, xp12); CreatePipe(xp12, P12); P3 = new Pump("P3", t3X, tanksY + 110, () => App.Plant?.P3 ?? default, () => App.Plant?.P3HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); P4 = new Pump("P4", t4X, tanksY + 110, () => App.Plant?.P4 ?? default, () => App.Plant?.P4HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); P5 = new Pump("P5", t5X, tanksY + 110, () => App.Plant?.P5 ?? default, () => App.Plant?.P5HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); - CreateOutlet(t3, P3); - CreateOutlet(t4, P4); - CreateOutlet(t5, P5); + CreateOutlet(Tank3, P3); + CreateOutlet(Tank4, P4); + CreateOutlet(Tank5, P5); var v44 = CreateValve(44, (t1X + t2X) / 2, tanksY + 150); var v45 = CreateValve(45, t3X, tanksY + 150); @@ -329,10 +340,10 @@ namespace PamhagenSysCtrl.Helpers { var xt7 = new PipeJoin(t7X, tanksY + 110); var xt8 = new PipeJoin(t8X, tanksY + 110); P6 = new Pump("P6", t6X, tanksY + 150, () => App.Plant?.P6 ?? default, () => App.Plant?.P6HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); - CreateOutlet(t6, xt6); - CreateOutlet(t7, xt7); - CreateOutlet(t8, xt8); - CreateOutlet(t9, xt8); + CreateOutlet(Tank6, xt6); + CreateOutlet(Tank7, xt7); + CreateOutlet(Tank8, xt8); + CreateOutlet(Tank9, xt8); CreatePipe(xt8, xt7); CreatePipe(xt7, xt6); CreatePipe(xt6, P6); @@ -343,8 +354,8 @@ namespace PamhagenSysCtrl.Helpers { var prX = (pr1X + pr2X) / 2; var pr1cX = prX - 15; var pr2cX = prX + 15; - var press1 = new Press("Presse 1", pr1X, prY, 20000, () => FillState.Unknown); - var press2 = new Press("Presse 2", pr2X, prY, 15000, () => FillState.Unknown); + Press1 = new Press("Presse 1", pr1X, prY, 20000, () => FillState.Unknown); + Press2 = new Press("Presse 2", pr2X, prY, 15000, () => FillState.Unknown); var v50 = CreateValve(50, pr2cX + 30, 580); var v51 = CreateValve(51, pr1cX - 30, 580); var v52 = CreateValve(52, pr1cX - 30, 610); @@ -390,8 +401,8 @@ namespace PamhagenSysCtrl.Helpers { var zv2 = new CenterValve("ZV2", pr2cX, prY - 40, () => App.Plant?.Press2HasClearance ?? false); CreatePipe(xp6, zv1, true); CreatePipe(xp8, zv2, true); - CreateInlet(zv1, press1, true); - CreateInlet(zv2, press2, true); + CreateInlet(zv1, Press1, true); + CreateInlet(zv2, Press2, true); } protected Valve CreateValve(int n, double x, double y) { @@ -455,7 +466,11 @@ namespace PamhagenSysCtrl.Helpers { private void UpdateValvesAdjacientToPath(Path path, bool locked, bool? wantOpen = null) { foreach (var (edge, node) in path.Hops) { TraverseSubgraph(node, (n) => n is Valve || n is ISink || n is Pump, valveAction: (v) => { - v.IsLocked = locked; + if (locked) { + v.LockedForPaths.Add(path); + } else { + v.LockedForPaths.Remove(path); + } if (wantOpen.HasValue) { if (wantOpen.Value) { App.Plant?.OpenV(v.Nr); diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs b/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs index 5a49e57..83f9683 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs @@ -54,6 +54,14 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { return p; } + public Path? GetFreePath(IEnumerable points, bool overrideStart = false) { + if (overrideStart) { + return GetPath(points, (n) => n is not ISink && (n is not Valve v || !v.LockedForPaths.Any(p => p.Start != points.First()))); + } else { + return GetPath(points, (n) => n is not ISink && (n is not Valve v || !v.IsLocked)); + } + } + public Path? GetPath(IEnumerable points, Func? valid = null) { if (points.Count() < 2) return null; var start = points.First(); diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Valve.cs b/PamhagenSysCtrl/Helpers/Pipeline/Valve.cs index 85d56b3..3768ec0 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Valve.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Valve.cs @@ -14,7 +14,9 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public string Label => $"V{Nr}"; public Brush? Highlight { get; set; } - public bool IsLocked { get; set; } + public readonly ISet LockedForPaths = new HashSet(); + + public bool IsLocked => LockedForPaths.Any(); public bool IsOpen => CallbackIsOpen(); public bool WantOpen => CallbackWantOpen(this); public ISet Inputs { get; init; } diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml index 5a6f623..ef4c2c8 100644 --- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml +++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml @@ -57,11 +57,96 @@ + + + + + + + + + + + + + + + + + + + + + + + +