diff --git a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs index 740b5c2..c1f6f96 100644 --- a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs +++ b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs @@ -11,17 +11,20 @@ namespace PamhagenSysCtrl.Helpers { public readonly Trough MW2; public PamhagenGraph() { - double mw2X = 100; - double mw1X = 250; - double mpY = 280; - double ltg1Y = 410; + double mw2X = 180; + double mw1X = 300; + double mpY = 380; + double ltg1Y = 510; double ltg2Y = ltg1Y + 30; double ltg1X = 600; double ltg2X = ltg1X + 30; - double ltg6Y = 60; + double ltg6Y = 160; double ltg7Y = ltg6Y - 30; - double tanksY = 180; + double tanksY = 280; double tValveY = ((tanksY - 50) + ltg6Y) / 2 + 5; + double wtX = ltg1X - 180; + double wt2Y = 225; + double wt1Y = wt2Y + 135; double t1X = 735; double t2X = t1X + 80; double t3X = t2X + 80; @@ -31,11 +34,22 @@ 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 trough = new EntryTrough("Übernahme-Trog", mw1X + 80, 20); + var trough = new EntryTrough("Auffangwanne", mw1X + 70, 100); Nodes.Add(trough); - var rebler = new Rebler("Rebler", (mw1X + mw2X) / 2, 100); + var auger1 = new EncasedAuger("", (mw1X + mw2X) / 2 - 100, 200); + var auger2 = new EncasedAuger("Pressen-\nQuerschnecke", 40, 200, 180); + var auger3 = new EncasedAuger("", 120, 80, 135); + var belt = new ConveyorBelt("", 90, 160); + Nodes.Add(belt); + Nodes.Add(auger1); + Nodes.Add(auger2); + Nodes.Add(auger3); + var rebler = new Rebler("Rebler", (mw1X + mw2X) / 2, 200); Nodes.Add(rebler); MW1 = new Trough("MW1", mw1X, mpY - 70, () => App.Plant?.FillLevelA1 ?? FillState.Unknown); @@ -76,7 +90,7 @@ namespace PamhagenSysCtrl.Helpers { var v6 = CreateValve(6, mw1X, ltg2Y + 40); var v7 = CreateValve(7, (mw2X + mw1X) / 2, ltg2Y); var v8 = CreateValve(8, mw2X, ltg2Y + 40); - var v9 = CreateValve(9, ltg2X, 400); + var v9 = CreateValve(9, ltg2X, 500); CreatePipe(x4, v5); CreatePipe(x4, v6); @@ -84,54 +98,54 @@ namespace PamhagenSysCtrl.Helpers { CreatePipe(x6, v8); CreatePipe(v7, v9); - var xv15 = new PipeJoin(ltg1X, 300); - var xv11 = new PipeJoin(ltg2X, 330); - var x7 = new PipeJoin(ltg2X, 360); + var xv15 = new PipeJoin(ltg1X, wt1Y + 40); + var xv11 = new PipeJoin(ltg2X, wt1Y + 70); + var x7 = new PipeJoin(ltg2X, 460); CreatePipe(v5, xv15); CreatePipe(v9, x7); CreatePipe(x7, xv11); - var v10 = CreateValve(10, ltg2X + 40, 360); - var v11 = CreateValve(11, ltg1X - 30, 330); - var v12 = CreateValve(12, ltg1X, 260); - var v13 = CreateValve(13, ltg2X, 260); - var v14 = CreateValve(14, ltg1X - 30, 220); - var v15 = CreateValve(15, ltg1X - 30, 300); - var v16 = CreateValve(16, ltg1X - 30, 190); + var v10 = CreateValve(10, ltg2X + 40, 460); + var v11 = CreateValve(11, ltg1X - 30, wt1Y + 70); + var v12 = CreateValve(12, ltg1X, wt1Y); + var v13 = CreateValve(13, ltg2X, wt1Y); + var v14 = CreateValve(14, ltg1X - 30, wt1Y - 40); + var v15 = CreateValve(15, ltg1X - 30, wt1Y + 40); + var v16 = CreateValve(16, ltg1X - 30, wt1Y - 70); CreatePipe(v10, x7); CreatePipe(xv11, v11); CreatePipe(xv15, v15); CreatePipe(xv15, v12); CreatePipe(xv11, v13); - var xv16 = new PipeJoin(ltg1X, 190); - var xv14 = new PipeJoin(ltg2X, 220); + var xv16 = new PipeJoin(ltg1X, wt1Y - 70); + var xv14 = new PipeJoin(ltg2X, wt1Y - 40); CreatePipe(v12, xv16); CreatePipe(v13, xv14); CreatePipe(v16, xv16); CreatePipe(v14, xv14); - var v20 = CreateValve(20, ltg1X - 30, 60); - var v21 = CreateValve(21, ltg1X - 30, 90); - var xv20 = new PipeJoin(ltg1X, 60); - var xv21 = new PipeJoin(ltg2X, 90); + var v20 = CreateValve(20, ltg1X - 30, wt2Y - 70); + var v21 = CreateValve(21, ltg1X - 30, wt2Y - 40); + var xv20 = new PipeJoin(ltg1X, wt2Y - 70); + var xv21 = new PipeJoin(ltg2X, wt2Y - 40); CreatePipe(xv16, xv20); CreatePipe(xv14, xv21); CreatePipe(v20, xv20); CreatePipe(v21, xv21); - var wt1 = new HeatExchanger("WT Most", ltg1X - 180, 260); - var wt2 = new HeatExchanger("WT Warmwasser", ltg1X - 180, 125); - var v17 = CreateValve(17, ltg1X - 110, 260); - var v18 = CreateValve(18, ltg1X - 140, 300); - var v19 = CreateValve(19, ltg1X - 140, 190); - var xwt1 = new PipeJoin(ltg1X - 60, 300); - var xwt2 = new PipeJoin(ltg1X - 110, 300); - var xwt3 = new PipeJoin(ltg1X - 140, 220); - var xwt4 = new PipeJoin(ltg1X - 60, 220); - var xwt5 = new PipeJoin(ltg1X - 140, 160); - var xwt6 = new PipeJoin(ltg1X - 60, 90); + var wt1 = new HeatExchanger("WT Most", wtX, wt1Y); + var wt2 = new HeatExchanger("WT Warmwasser", wtX, wt2Y); + var v17 = CreateValve(17, wtX + 70, wt1Y); + var v18 = CreateValve(18, wtX + 40, wt1Y + 40); + var v19 = CreateValve(19, wtX + 40, (wt1Y + wt2Y) / 2); + var xwt1 = new PipeJoin(wtX + 120, wt1Y + 40); + var xwt2 = new PipeJoin(wtX + 70, wt1Y + 40); + var xwt3 = new PipeJoin(wtX + 40, wt1Y - 40); + var xwt4 = new PipeJoin(wtX + 120, wt1Y - 40); + var xwt5 = new PipeJoin(wtX + 40, wt2Y + 40); + var xwt6 = new PipeJoin(wtX + 120, wt2Y - 40); CreatePipe(v11, xwt1); CreatePipe(v15, xwt1); CreatePipe(xwt1, xwt2); @@ -314,9 +328,6 @@ namespace PamhagenSysCtrl.Helpers { var v49 = CreateValve(49, t4X, tanksY + 220); CreatePipe(xv47, v49); - var prY = 680; - var pr1X = 750; - var pr2X = 900; var press1 = new Press("Presse 1", pr1X, prY, 200000, () => App.Plant?.FillLevelPress1 ?? FillState.Unknown); var press2 = new Press("Presse 2", pr2X, prY, 150000, () => App.Plant?.FillLevelPress1 ?? FillState.Unknown); var v50 = CreateValve(50, pr1X - 45, prY - 100); @@ -327,10 +338,10 @@ namespace PamhagenSysCtrl.Helpers { 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, 510); - var xp2 = new PipeJoin(pr1X + 15, 540); - var xp3 = new PipeJoin(pr2X - 45, 450); - var xp4 = new PipeJoin(pr2X + 45, 480); + 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); CreatePipe(v6, xp1, true); CreatePipe(v8, xp2, true); diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Auger.cs b/PamhagenSysCtrl/Helpers/Pipeline/Auger.cs index 3f0b259..089b919 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Auger.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Auger.cs @@ -11,6 +11,7 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public double CenterY { get; set; } public double Width { get; set; } public double Height { get; set; } + public double Angle { get; set; } public bool IsActive { set { @@ -25,11 +26,12 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { private Polyline? _polyline; private Storyboard? _storyboard; - public Auger(double x, double y, double width, double height) { + public Auger(double x, double y, double width, double height, double angle = 0) { CenterX = x; CenterY = y; Width = width; Height = height; + Angle = angle; } public void Draw(Canvas canvas) { @@ -60,6 +62,7 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { Width = Width, Height = Height, ClipToBounds = true, + RenderTransform = new RotateTransform(Angle, Width / 2, Height / 2), }; clipCanvas.SetValue(Canvas.TopProperty, CenterY - Height / 2); clipCanvas.SetValue(Canvas.LeftProperty, CenterX - Width / 2); diff --git a/PamhagenSysCtrl/Helpers/Pipeline/ConveyorBelt.cs b/PamhagenSysCtrl/Helpers/Pipeline/ConveyorBelt.cs new file mode 100644 index 0000000..3f8d0ec --- /dev/null +++ b/PamhagenSysCtrl/Helpers/Pipeline/ConveyorBelt.cs @@ -0,0 +1,109 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Media3D; +using System.Windows.Shapes; + +namespace PamhagenSysCtrl.Helpers.Pipeline { + public class ConveyorBelt : INode { + + public const double WIDTH = 35; + public const double HEIGHT = 120; + + public double CenterX { get; set; } + public double CenterY { get; set; } + public string Label { get; set; } + public ISet Inputs { get; init; } + public ISet Outputs { get; init; } + + public bool IsActive { + get => _active; + set { + _active = value; + if (value) { + _storyboard?.Resume(); + } else { + _storyboard?.Pause(); + } + } + } + + private bool _active; + private Shape? _rect; + private Polyline? _polyline; + private Storyboard? _storyboard; + + public ConveyorBelt(string label, double x, double y) { + CenterX = x; + CenterY = y; + Label = label; + Inputs = new HashSet(); + Outputs = new HashSet(); + } + + public void Draw(Canvas canvas) { + _rect = new Rectangle() { + Width = WIDTH, + Height = HEIGHT, + Stroke = Brushes.Black, + StrokeThickness = 2, + Fill = Brushes.WhiteSmoke, + StrokeLineJoin = PenLineJoin.Round, + }; + _rect.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); + _rect.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2); + + var d = 20; + int n = (int)(HEIGHT / d) + 2; + _polyline = new Polyline() { + Points = [.. Enumerable.Range(0, n).SelectMany(i => new List() { + new(-WIDTH, i * d), new(WIDTH, i * d), new(-WIDTH, i * d) + })], + Fill = Brushes.Transparent, + Stroke = Brushes.Black, + StrokeThickness = 2, + }; + _polyline.SetValue(Canvas.TopProperty, 0.0); + + var slideUp = new DoubleAnimation { + From = 0, + To = -d, + Duration = new Duration(TimeSpan.FromSeconds(1)), + RepeatBehavior = RepeatBehavior.Forever, + }; + _storyboard = new Storyboard(); + _storyboard.Children.Add(slideUp); + Storyboard.SetTarget(slideUp, _polyline); + Storyboard.SetTargetProperty(slideUp, new PropertyPath(Canvas.TopProperty)); + var clipCanvas = new Canvas() { + Width = WIDTH - 20, + Height = HEIGHT - 2, + ClipToBounds = true, + }; + clipCanvas.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2 + 2); + clipCanvas.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2 + 10); + clipCanvas.Children.Add(_polyline); + + canvas.Children.Add(_rect); + canvas.Children.Add(clipCanvas); + _storyboard.Begin(); + _storyboard.Pause(); + + } + + public bool IsInside(double x, double y) { + return Math.Abs(x - CenterX) <= WIDTH / 2 && Math.Abs(y - CenterY) <= HEIGHT / 2; + } + + public void Update(bool isHovering, bool isPressed) { + _rect?.Fill = + IsActive && isHovering && isPressed ? PamhagenBrushes.Red : + IsActive && isHovering ? PamhagenBrushes.Red : + !IsActive && isHovering && isPressed ? PamhagenBrushes.Green : + !IsActive && isHovering ? PamhagenBrushes.Green : + IsActive ? PamhagenBrushes.Green : + Brushes.WhiteSmoke; + } + } +} diff --git a/PamhagenSysCtrl/Helpers/Pipeline/EncasedAuger.cs b/PamhagenSysCtrl/Helpers/Pipeline/EncasedAuger.cs new file mode 100644 index 0000000..3f66391 --- /dev/null +++ b/PamhagenSysCtrl/Helpers/Pipeline/EncasedAuger.cs @@ -0,0 +1,92 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Shapes; + +namespace PamhagenSysCtrl.Helpers.Pipeline { + public class EncasedAuger : INode { + + public const double WIDTH = 80; + public const double HEIGHT = 20; + + public double CenterX { get; set; } + public double CenterY { get; set; } + public double Angle { get; set; } + public string Label { get; set; } + public ISet Inputs { get; init; } + public ISet Outputs { get; init; } + + public bool IsActive { + get => _active; + set { + _active = value; + _auger?.IsActive = value; + } + } + + private bool _active; + private Shape? _inner; + private Shape? _outer; + private Auger? _auger; + private TextBlock? _text; + + public EncasedAuger(string label, double x, double y, double angle = 0) { + CenterX = x; + CenterY = y; + Label = label; + Angle = angle; + Inputs = new HashSet(); + Outputs = new HashSet(); + } + + public void Draw(Canvas canvas) { + var c = new Canvas() { + RenderTransform = new RotateTransform(Angle, WIDTH / 2, HEIGHT / 2), + }; + _outer = new Rectangle() { + Width = WIDTH, + Height = HEIGHT, + Fill = Brushes.Black, + }; + _inner = new Rectangle() { + Width = WIDTH, + Height = HEIGHT - 4, + Fill = Brushes.WhiteSmoke, + }; + c.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); + c.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2); + _inner.SetValue(Canvas.TopProperty, 2.0); + c.Children.Add(_outer); + c.Children.Add(_inner); + canvas.Children.Add(c); + + _text = new() { + Text = Label, + Width = WIDTH, + FontSize = 12, + TextAlignment = TextAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }; + _text.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); + _text.SetValue(Canvas.TopProperty, CenterY + HEIGHT / 2); + canvas.Children.Add(_text); + + _auger = new Auger(CenterX, CenterY, WIDTH, 12, Angle); + _auger.Draw(canvas); + } + + public bool IsInside(double x, double y) { + return Math.Sqrt(Math.Pow(CenterX - x, 2) + Math.Pow(CenterY - y, 2)) <= WIDTH / 2; + } + + public void Update(bool isHovering, bool isPressed) { + _inner?.Fill = + IsActive && isHovering && isPressed ? PamhagenBrushes.Red : + IsActive && isHovering ? PamhagenBrushes.Red : + !IsActive && isHovering && isPressed ? PamhagenBrushes.Green : + !IsActive && isHovering ? PamhagenBrushes.Green : + IsActive ? PamhagenBrushes.Green : + Brushes.WhiteSmoke; + } + } +} diff --git a/PamhagenSysCtrl/Helpers/Pipeline/EntryTrough.cs b/PamhagenSysCtrl/Helpers/Pipeline/EntryTrough.cs index 4ff5c87..6167f04 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/EntryTrough.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/EntryTrough.cs @@ -41,14 +41,6 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { } } - public EntryTrough(string label, double x, double y) { - CenterX = x; - CenterY = y; - Label = label; - Inputs = new HashSet(); - Outputs = new HashSet(); - } - private bool _active; private Shape? _inner; private Shape? _outer; @@ -57,6 +49,14 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { private Shape? _door; private RotateTransform? _doorTransform; + public EntryTrough(string label, double x, double y) { + CenterX = x; + CenterY = y; + Label = label; + Inputs = new HashSet(); + Outputs = new HashSet(); + } + public void Draw(Canvas canvas) { var top = CenterY - HEIGHT / 2; var right = CenterX + WIDTH / 2; @@ -85,7 +85,7 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { VerticalAlignment = VerticalAlignment.Center, }; _text.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _text.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 6 - 8); + _text.SetValue(Canvas.TopProperty, CenterY - 7.5 - 8); canvas.Children.Add(_outer); canvas.Children.Add(_inner); canvas.Children.Add(_text); diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Rebler.cs b/PamhagenSysCtrl/Helpers/Pipeline/Rebler.cs index 433bddd..309ae1d 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Rebler.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Rebler.cs @@ -1,5 +1,4 @@ -using System.Reflection; -using System.Windows; +using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml index 32f432c..332fd9d 100644 --- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml +++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml @@ -4,9 +4,9 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:PamhagenSysCtrl.Windows" - Title="Schema - Anlagensteuerung Pamhagen" Height="800" Width="1600" MinWidth="1500" MinHeight="800"> + Title="Schema - Anlagensteuerung Pamhagen" Height="900" Width="1600" MinWidth="1500" MinHeight="900"> - diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs index 398bc9f..d4e6044 100644 --- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs +++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs @@ -61,6 +61,10 @@ namespace PamhagenSysCtrl.Windows { trough.IsActive = !trough.IsActive; } else if (c is Rebler rebler) { rebler.IsActive = !rebler.IsActive; + } else if (c is EncasedAuger auger) { + auger.IsActive = !auger.IsActive; + } else if (c is ConveyorBelt belt) { + belt.IsActive = !belt.IsActive; } } UpdateScheme(pos, evt.LeftButton == MouseButtonState.Pressed);