using LiveCharts.Configurations; using NEIntelligentControl2.Models.AGC; using NEIntelligentControl2.Models.Datas; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.ConstrainedExecution; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace NEIntelligentControl2.Views.AGC { /// /// AGC卡片 /// public partial class AGCCard2 : UserControl { // ------------依赖属性------------ public static readonly DependencyProperty StatusProperty = DependencyProperty.Register("Status", typeof(double), typeof(AGCCard2)); public static readonly DependencyProperty RestrictionValueProperty = DependencyProperty.Register("RestrictionValue", typeof(string), typeof(AGCCard2)); public static readonly DependencyProperty CurveDeviationRateProperty = DependencyProperty.Register("CurveDeviationRate", typeof(string), typeof(AGCCard2)); /// /// 状态 /// public double Status { get => (double)GetValue(StatusProperty); set => SetValue(StatusProperty, value); } /// /// 限电值 /// public string RestrictionValue { get => GetValue(RestrictionValueProperty) as string; set => SetValue(RestrictionValueProperty, value); } /// /// 偏差率 /// public string CurveDeviationRate { get => GetValue(CurveDeviationRateProperty) as string; set => SetValue(CurveDeviationRateProperty, value); } private AGCInfo info; /// /// 信息 /// public AGCInfo Info { get => info; set { info = value; InitInfo(); } } private ViewModel _ViewModel; /// /// 实发有功 /// private TagInfo _ActualPower; private List _PowerSetList; private List _ActualPowerList; private List _IdeaPowerList; private List _StatusList; public AGCCard2() { InitializeComponent(); _ViewModel = new ViewModel(); _pv.Model = _ViewModel; } /// /// 初始化 /// private void InitInfo() { if (info == null) { return; } _UGMain.Children.Clear(); info.Status.ValueChanged = (v) => Status = v; foreach (var v in info.AiPoints) { AGCTag at = new AGCTag() { Info = v }; _UGMain.Children.Add(at); } foreach (var v in info.DiPoints) { AGCTag at = new AGCTag() { Info = v, IsDiPoint = true }; _UGDiPoint.Children.Add(at); } var vs = info.AiPoints.Where(ap => ap.Type == TagType.PowerSet || ap.Type == TagType.ActualPower || ap.Type == TagType.IdeaPower); //_PowerTags = vs; foreach (var v in vs) { v.HistoryValueChanged = HistoryValueChanged; } info.Status.HistoryValueChanged = HistoryValueChanged; var rv = info.AiPoints.Where(ap => ap.Type == TagType.PowerSet).FirstOrDefault(); rv.ValueChanged += PowerSetChanged; _ActualPower = info.AiPoints.Where(ap => ap.Type == TagType.ActualPower).FirstOrDefault(); } /// /// 有功设定值改变 /// private void PowerSetChanged(double obj) { RestrictionValue = (1 - (obj / info.InstalledCapacity)).ToString("p"); if (_ActualPower == null || obj == 0) return; double cdr = Math.Abs((obj - _ActualPower.Value) / obj); CurveDeviationRate = cdr.ToString("p"); _c.Margin = new Thickness(_pv.ActualModel.PlotArea.Left, 0, 9, 0); _cdr.Foreground = cdr > 0.03 ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Color.FromRgb(0x31, 0xB9, 0xFB)); } /// /// 历史值改变 /// private void HistoryValueChanged(TagInfo arg1, List arg2) { if (arg2 == null || arg2.Count <= 0) return; if (arg1.Type == TagType.Other) { _StatusList = arg2; return; } _ViewModel.SetValueNow(arg1, arg2); _pv.Model = null; _pv.Model = _ViewModel; if (arg1.Type == TagType.PowerSet) { _PowerSetList = arg2; return; } else if (arg1.Type == TagType.ActualPower) { _ActualPowerList = arg2; } else if (arg1.Type == TagType.IdeaPower) { _IdeaPowerList = arg2; } if (Status != 1) return; InitCurveDeviationRate(); } private void InitCurveDeviationRate() { if (_PowerSetList == null || _ActualPowerList == null || _StatusList == null) return; List ls = GetCurveDeviationRateList(); InitCanvas(ls); } private void InitCanvas(List ls) { _c.Children.Clear(); var maxVal = ls.Max(x => x.Value); var minTime = ls.Min(x => x.Ts); var maxTime = ls.Max(x => x.Ts); var totalTime = maxTime - minTime; var awidth = _c.ActualWidth; var aheight = _c.ActualHeight; var width = awidth / ls.Count; var ct = Math.Min(ls.Count, _StatusList.Count); for (int i = 0; i < ct; ++i) { var v = ls[i]; Rectangle r = new Rectangle(); if (_StatusList[i]?.Value == 0) { r.Fill = new SolidColorBrush(Color.FromArgb(0x77, 0x77, 0x77, 0x77)); } else { r.Fill = v.Value > 3 ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.WhiteSmoke); } r.Width = width; r.Height = v.Value * aheight / maxVal; var left = awidth * (v.Ts - minTime) / totalTime; Canvas.SetLeft(r, left); Canvas.SetBottom(r, 0); r.ToolTip = Math.Round(v.Value, 2); _c.Children.Add(r); } TextBlock tb = new TextBlock() { Text = Math.Round(maxVal, 2).ToString(), Foreground = new SolidColorBrush(Colors.WhiteSmoke) }; Canvas.SetRight(tb, 2); Canvas.SetTop(tb, 2); _c.Children.Add(tb); } private List GetCurveDeviationRateList() { List ls = new List(); int count = Math.Min(_PowerSetList.Count, _ActualPowerList.Count); for (int i = 0; i < count; i++) { double ps = _PowerSetList[i].Value; double ap = _ActualPowerList[i].Value; double cdr = ps == 0 ? 0 : Math.Abs((ps - ap) / ps) * 100; TsData td = new TsData() { Ts = _ActualPowerList[i].Ts, Value = cdr }; ls.Add(td); } return ls; } private void _pv_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.ClickCount < 1) return; Windows.AGCLineWindow.ShowWindow(_ViewModel, info); } } }