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();
}
}
}