From 06dcdd85699960835819ee34dbe2df4876d9052a Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Fri, 7 Aug 2026 01:10:29 +0200 Subject: [PATCH] Add CenterValves to presses --- PamhagenSysCtrl/Helpers/PamhagenGraph.cs | 82 +++++++++++-------- .../Helpers/Pipeline/CenterValve.cs | 69 ++++++++++++++++ PamhagenSysCtrl/Helpers/Pipeline/Graph.cs | 4 +- PamhagenSysCtrl/Helpers/Pipeline/Inlet.cs | 6 +- 4 files changed, 123 insertions(+), 38 deletions(-) create mode 100644 PamhagenSysCtrl/Helpers/Pipeline/CenterValve.cs diff --git a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs index 782af41..bd4fee4 100644 --- a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs +++ b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs @@ -43,9 +43,9 @@ namespace PamhagenSysCtrl.Helpers { double t7X = t6X + 80; double t8X = t7X + 80; double t9X = t8X + 80; - var prY = 780; - var pr1X = 750; - var pr2X = 900; + var prY = 720; + var pr1X = 730; + var pr2X = 920; var trough = new EntryTrough("Auffangwanne", mw1X + 70, 100, () => App.Plant?.IsTroughAugerActive ?? false); Nodes.Add(trough); @@ -339,42 +339,58 @@ namespace PamhagenSysCtrl.Helpers { var v49 = CreateValve(49, t4X, tanksY + 220); CreatePipe(xv47, v49); - var press1 = new Press("Presse 1", pr1X, prY, 20000, () => App.Plant?.FillLevelPress1 ?? FillState.Unknown); - var press2 = new Press("Presse 2", pr2X, prY, 15000, () => App.Plant?.FillLevelPress2 ?? FillState.Unknown); - var v50 = CreateValve(50, pr1X - 45, prY - 100); - var v51 = CreateValve(51, pr1X - 15, prY - 100); - var v52 = CreateValve(52, pr1X + 15, prY - 100); - var v53 = CreateValve(53, pr1X + 45, prY - 100); - var v54 = CreateValve(54, pr2X - 45, prY - 100); - var v55 = CreateValve(55, pr2X - 15, prY - 100); - var v56 = CreateValve(56, pr2X + 15, prY - 100); - var v57 = CreateValve(57, pr2X + 45, prY - 100); - var xp1 = new PipeJoin(pr1X - 15, 610); - var xp2 = new PipeJoin(pr1X + 15, 640); - var xp3 = new PipeJoin(pr2X - 45, 550); - var xp4 = new PipeJoin(pr2X + 45, 580); + 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); + var v50 = CreateValve(50, pr2cX + 30, 580); + var v51 = CreateValve(51, pr1cX - 30, 580); + var v52 = CreateValve(52, pr1cX - 30, 640); + var v53 = CreateValve(53, pr2cX + 30, 640); + var v54 = CreateValve(54, pr2cX + 30, 550); + var v55 = CreateValve(55, pr1cX - 30, 550); + var v56 = CreateValve(56, pr1cX - 30, 610); + var v57 = CreateValve(57, pr2cX + 30, 610); + var xp1 = new PipeJoin(pr1cX - 70, 580); + var xp2 = new PipeJoin(pr1cX - 70, 640); + var xp3 = new PipeJoin(pr2cX + 70, 550); + var xp4 = new PipeJoin(pr2cX + 70, 610); + var xp5 = new PipeJoin(pr1cX, 580); + var xp6 = new PipeJoin(pr1cX, 640); + var xp7 = new PipeJoin(pr2cX, 550); + var xp8 = new PipeJoin(pr2cX, 610); CreatePipe(v6, xp1, true); CreatePipe(v8, xp2, true); CreatePipe(v49, xp3, true); CreatePipe(P6, xp4, true); - CreatePipe(xp1, v51); - CreatePipe(xp1, v55); - CreatePipe(xp2, v52); - CreatePipe(xp2, v56); - CreatePipe(xp3, v50); - CreatePipe(xp3, v54); - CreatePipe(xp4, v53); - CreatePipe(xp4, v57); + CreatePipe(xp1, v51, true); + CreatePipe(xp1, v55, true); + CreatePipe(xp2, v52, true); + CreatePipe(xp2, v56, true); + CreatePipe(xp3, v50, true); + CreatePipe(xp3, v54, true); + CreatePipe(xp4, v53, true); + CreatePipe(xp4, v57, true); - CreateInlet(v50, press1); - CreateInlet(v51, press1); - CreateInlet(v52, press1); - CreateInlet(v53, press1); - CreateInlet(v54, press2); - CreateInlet(v55, press2); - CreateInlet(v56, press2); - CreateInlet(v57, press2); + CreatePipe(v50, xp5); + CreatePipe(v51, xp5); + CreatePipe(v52, xp6); + CreatePipe(v53, xp6); + CreatePipe(v54, xp7); + CreatePipe(v55, xp7); + CreatePipe(v56, xp8); + CreatePipe(v57, xp8); + CreatePipe(xp5, xp6); + CreatePipe(xp7, xp8); + + var zv1 = new CenterValve("ZV1", pr1cX, prY - 40, () => App.Plant?.FillLevelPress1 != FillState.Full); + var zv2 = new CenterValve("ZV2", pr2cX, prY - 40, () => App.Plant?.FillLevelPress2 != FillState.Full); + CreatePipe(xp6, zv1, true); + CreatePipe(xp8, zv2, true); + CreateInlet(zv1, press1, true); + CreateInlet(zv2, press2, true); } protected static Valve CreateValve(int n, double x, double y) { diff --git a/PamhagenSysCtrl/Helpers/Pipeline/CenterValve.cs b/PamhagenSysCtrl/Helpers/Pipeline/CenterValve.cs new file mode 100644 index 0000000..3a0e2ee --- /dev/null +++ b/PamhagenSysCtrl/Helpers/Pipeline/CenterValve.cs @@ -0,0 +1,69 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Shapes; + +namespace PamhagenSysCtrl.Helpers.Pipeline { + public class CenterValve : INode { + + public const double DIAMETER = 24; + + public double CenterX { get; set; } + public double CenterY { get; set; } + public string Label { get; set; } + public Brush? Highlight { get; set; } + + public bool IsOpen => CallbackIsOpen(); + public ISet Inputs { get; init; } + public ISet Outputs { get; init; } + + protected Func CallbackIsOpen; + + private Shape? _circle; + private TextBlock? _text; + + public CenterValve(string label, double x, double y, Func cbOpen) { + CenterX = x; + CenterY = y; + Label = label; + CallbackIsOpen = cbOpen; + Inputs = new HashSet(); + Outputs = new HashSet(); + } + + public void Draw(Canvas canvas) { + _circle = new Ellipse() { + Height = DIAMETER, + Width = DIAMETER, + Fill = Brushes.DarkGray, + Stroke = Brushes.Black, + StrokeThickness = 2, + }; + _circle.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2); + _circle.SetValue(Canvas.TopProperty, CenterY - DIAMETER / 2); + _text = new() { + Text = Label, + FontSize = 10, + Width = DIAMETER, + Height = DIAMETER, + TextAlignment = TextAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }; + _text.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2); + _text.SetValue(Canvas.TopProperty, CenterY - DIAMETER / 2 + 5.5); + canvas.Children.Add(_circle); + canvas.Children.Add(_text); + } + + public bool IsInside(double x, double y) { + return Math.Sqrt(Math.Pow(CenterX - x, 2) + Math.Pow(CenterY - y, 2)) <= DIAMETER / 2; + } + + public void Update(bool isHovering, bool isPressed) { + _circle?.Fill = + !IsOpen ? PamhagenBrushes.Red : + IsOpen ? PamhagenBrushes.Green : + Highlight ?? Brushes.DarkGray; + } + } +} diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs b/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs index 9df71cc..a34a3d8 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs @@ -34,10 +34,10 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { return p; } - public Inlet CreateInlet(INode start, ISink end) { + public Inlet CreateInlet(INode start, ISink end, bool sideways = false) { Nodes.Add(start); Nodes.Add(end); - var p = new Inlet(start, end, start.CenterX > end.CenterX); + var p = new Inlet(start, end, sideways); start.Outputs.Add(p); end.Inputs.Add(p); Edges.Add(p); diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Inlet.cs b/PamhagenSysCtrl/Helpers/Pipeline/Inlet.cs index 1bf60e8..4feacf2 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Inlet.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Inlet.cs @@ -30,9 +30,9 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { var x1 = Start.CenterX; var y1 = Start.CenterY; var x2 = Start.CenterX; - var y2 = Sink.TopY - 10; - var x3 = Start.CenterX + (Orientation ? -20 : 20); - var y3 = Sink.TopY + 20; + var y2 = Orientation ? Sink.CenterY - 10 : Sink.TopY - 10; + var x3 = Orientation ? Sink.CenterX : Start.CenterX + (Start.CenterX == End.CenterX ? 0 : Start.CenterX > End.CenterX ? -20 : 20); + var y3 = Orientation ? Sink.CenterY - 10 : Sink.TopY + 20; _outer1 = new Line() { X1 = x1, Y1 = y1,