using DevExpress.XtraCharts; using DevExpress.XtraEditors; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using IStation.Untity; using DevExpress.Utils; using System.Runtime; using DevExpress.XtraSplashScreen; namespace IStation.WinFormUI.MonitorDataSet { public partial class CurveCompareChartMgr : DocumentPage { public CurveCompareChartMgr() { InitializeComponent(); this.multiSelectMonitorPointTreeListCtrl1.SelectedEvent += MultiSelectMonitorPointTreeListCtrl1_SelectedEvent; this.multiSelectMonitorPointTreeListCtrl1.UncheckEvent += MultiSelectMonitorPointTreeListCtrl1_UncheckEvent; this.PageTitle.Caption = "曲线比较"; } #region 当前视图类 public class CurrentViewModel { public CurrentViewModel() { } public CurrentViewModel(Model.SignalRecord rhs) { this.DataTime = rhs.Time; this.DataValue = rhs.Value; } public DateTime DataTime { get; set; } public double DataValue { get; set; } } #endregion private long _projectId; private long _sceneId; private Model.LogicTree _logic; private SwiftPlotDiagram _diagram { get { return this.chartControl1.Diagram as SwiftPlotDiagram; } } /// /// 初始化数据 /// public void InitialDataSource(long projectId,long sceneId, Model.LogicTree logic) { _projectId = projectId; _sceneId = sceneId; SetBindingData(logic); } private void SetBindingData(Model.LogicTree obj) { _logic = obj; if (_logic == null) { this.multiSelectMonitorPointTreeListCtrl1.SetBindingData(); } else { this.multiSelectMonitorPointTreeListCtrl1.SetBindingData(_projectId, _logic.LogicType, _logic.LogicId); } } private void MultiSelectMonitorPointTreeListCtrl1_SelectedEvent(Model.MonitorPointExSignalList obj, Color color) { var signal = obj.SignalList.First(); var lays = this.chartControl1.ShowOverlay(); var packet = new BLL.MonitorDataSet().GetSignalRecordPacket(_projectId, _sceneId, obj.Id, signal.Id); if (packet == null || packet.RecordList == null) { XtraMessageBox.Show("无数据!"); lays.Close(); return; } var list = packet.RecordList.Where(x => x.Value != IStation.Default.Abnormal && x.Value != IStation.Default.Error); CreateSeries(signal, list); lays.Close(); } //添加系列 private void CreateSeries(Model.Signal signal, IEnumerable records) { try { var count = this.chartControl1.Series.Where(x => Convert.ToInt64(x.Tag) == signal.Id).Count(); if (count > 0) return; //var unitValue = UnitValueHelper.Get(_projectId, signal); var unitValue = "高度/m"; var view = new SwiftPlotSeriesView(); view.AxisX = _diagram.AxisX; if (this.chartControl1.Series.Count < 1) { _diagram.AxisY.Title.Text = unitValue; view.AxisY = _diagram.AxisY; } else { if (_diagram.AxisY.Title.Text == unitValue) { view.AxisY = _diagram.AxisY; } else { var axisy = _diagram.SecondaryAxesY.GetAxisByName(unitValue); if (axisy == null) { axisy = new SwiftPlotDiagramSecondaryAxisY(); axisy.Name = unitValue; axisy.Alignment = AxisAlignment.Far; axisy.Title.Text = unitValue; axisy.Title.Alignment = StringAlignment.Far; axisy.Title.Visibility = DefaultBoolean.True; _diagram.SecondaryAxesY.Add(axisy); } view.AxisY = axisy; } } Series series = new Series(); series.Tag = signal.Id; series.Name = signal.Name; series.View = view; var list = records.Select(x => new { Time = x.Time, Value = x.Value }); series.BindToData(list, "Time", "Value"); this.chartControl1.Series.Add(series); } catch (OutOfMemoryException) { } finally { Gc(); } } private void MultiSelectMonitorPointTreeListCtrl1_UncheckEvent(Model.MonitorPointExSignalList obj) { var signal = obj.SignalList.First(); var lays = this.chartControl1.ShowOverlay(); List seriesList = new List(this.chartControl1.Series.ToArray()); var index = seriesList.FindIndex(x => Convert.ToInt64(x.Tag) == signal.Id); if (index != -1) { this.chartControl1.BeginInit(); var unitValue = UnitValueHelper.Get(_projectId, signal); var axisy = _diagram.SecondaryAxesY.GetAxisByName(unitValue); if (axisy != null) { _diagram.SecondaryAxesY.Remove(axisy); } this.chartControl1.Series.RemoveAt(index); this.chartControl1.EndInit(); } Gc(); lays.Close(); } private void Gc() { GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(2, GCCollectionMode.Forced); GC.WaitForFullGCComplete(); } } }