using DevExpress.Utils; using DevExpress.XtraCharts; using DevExpress.XtraRichEdit.Model; using IStation.CalcModel; using IStation.WinFrmUI.Curve; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace IStation.WinFrmUI.CalcErQu { public partial class AnaResultInfoCtrl : UserControl { DevExpress.XtraCharts.ConstantLine _moveConstantLine = null; public AnaResultInfoCtrl() { InitializeComponent(); this.chartControl运行区段.ObjectHotTracked += new DevExpress.XtraCharts.HotTrackEventHandler(this.chartControl运行区段_ObjectHotTracked); this.chartControl运行区段.MouseClick += new System.Windows.Forms.MouseEventHandler(this.chartControl运行区段_MouseClick); this.barChartToolTipController.InitialDelay = 100; this.barChartToolTipController.BeforeShow += new DevExpress.Utils.ToolTipControllerBeforeShowEventHandler(this.barChartToolTipController_BeforeShow); SetEndAnimationCmdVisible(false); var ganttDiagram1 = this.chartControl运行区段.Diagram as GanttDiagram; _moveConstantLine = ganttDiagram1.AxisY.ConstantLines[0]; _moveConstantLine.Visible = false; } private void SetEndAnimationCmdVisible(bool isVisble) { for (int i = 0; i < tabbedControlGroup1.CustomHeaderButtons.Count; i++) { var btn = tabbedControlGroup1.CustomHeaderButtons[i]; if (btn.Tag == null) continue; if (btn.Tag.ToString() == "EndAnimation") { btn.Visible = isVisble; } } } List _waterLevels长江; public void SetRiverWaterLevels(List waterLevels长江) { this._waterLevels长江 = waterLevels长江; } IStation.CalcModel.AnaPrj _anaPrj = null; DateTime _startTime, _endTime; public void SetBindingData( DateTime startTime, DateTime endTime, IStation.CalcModel.AnaPrj anaPrj) { if (anaPrj == null) return; this._startTime = startTime; this._endTime = endTime; this._anaPrj = anaPrj; IntialChart运行时间(anaPrj); InitialChart实时数据(anaPrj); InitialChart累计数据(anaPrj); } #region 累计数据 private void InitialChart累计数据(IStation.CalcModel.AnaPrj anaPrj) { var series累计流量 = chartControl累计数据.Series[0]; var series累计电量 = chartControl累计数据.Series[1]; var series累计电费 = chartControl累计数据.Series[2]; series累计流量.Points.Clear(); series累计电量.Points.Clear(); series累计电费.Points.Clear(); double total_flow = 0; double total_power = 0; double total_money = 0; foreach (var item in anaPrj.Items) { if (item.SumData != null) foreach (var sd in item.SumData) { total_flow += sd.SFlow; total_power+= sd.Power; total_money += sd.Money; series累计流量.Points.Add(new SeriesPoint(sd.Time, new double[] { total_flow })); series累计电量.Points.Add(new SeriesPoint(sd.Time, new double[] { total_power })); series累计电费.Points.Add(new SeriesPoint(sd.Time, new double[] { total_money })); } } var diagram = chartControl累计数据.Diagram as DevExpress.XtraCharts.XYDiagram; var axis = diagram.AxisX; axis.VisualRange.Auto = false; axis.WholeRange.Auto = false; axis.WholeRange.SideMarginsValue = 0; axis.VisualRange.SideMarginsValue = 0; axis.WholeRange.SetMinMaxValues(_startTime, _endTime); axis.VisualRange.SetMinMaxValues(_startTime, _endTime); axis.WholeRange.AlwaysShowZeroLevel = false; } #endregion #region 实时数据 private void InitialChart实时数据(IStation.CalcModel.AnaPrj anaPrj) { var series1 = chartControl实时数据.Series[0]; var series2 = chartControl实时数据.Series[1]; var series4 = chartControl实时数据.Series[3]; series1.Points.Clear(); series2.Points.Clear(); series4.Points.Clear(); foreach (var item in anaPrj.Items) { if (item.SumData != null) foreach (var sd in item.SumData) { series1.Points.Add(new SeriesPoint(sd.Time, new double[] { sd.Flow })); series2.Points.Add(new SeriesPoint(sd.Time, new double[] { sd.Power })); series4.Points.Add(new SeriesPoint(sd.Time, new double[] { sd.WaterLevelQ })); } } var series3 = chartControl实时数据.Series[2]; series3.Points.Clear(); if (_waterLevels长江 != null) { foreach (var sd in _waterLevels长江) { series3.Points.Add(new SeriesPoint(sd.Time, new double[] { sd.Level })); } } var diagram = chartControl实时数据.Diagram as DevExpress.XtraCharts.XYDiagram; var axis = diagram.AxisX; axis.VisualRange.Auto = false; axis.WholeRange.Auto = false; axis.WholeRange.SideMarginsValue = 0; axis.VisualRange.SideMarginsValue = 0; axis.WholeRange.SetMinMaxValues(_startTime, _endTime); axis.VisualRange.SetMinMaxValues(_startTime, _endTime); axis.WholeRange.AlwaysShowZeroLevel = false; } #endregion #region 运行时间 class CurrentGridViewModel { public string PumpName { get; set; } public string StartTime { get; set; } public string EndTime { get; set; } public string SpanTime { get; set; } public double SumFlow { get; set; }//已经考虑时间段 (累计值) public double SumPower { get; set; }//已经考虑时间段 (累计值 度) public double SumMoney { get; set; }//已经考虑时间段 (累计值) } private object _rightClickObj = null; private void chartControl运行区段_MouseClick(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) { ChartHitInfo hitInfo = chartControl运行区段.CalcHitInfo(e.Location); // if (hitInfo.InSeries) //{ // _rightClickObj = hitInfo.Series; // if (_rightClickObj == QueryLineHorizontal) // { // lineMenuStrip.Show(chartControl1, e.Location); // } // else // { // curveRightMenu.Show(chartControl1, e.Location); // } //} if (hitInfo.InAxis) { //if( hitInfo.Axis == gridView1.a // axisRightMenu.Show(chartControl1, e.Location); } //else if (hitInfo.InChartTitle) //{ // rightClickObj = hitInfo.AxisTitle; // lineMenuStrip.Show(chartControl1, e.locationType); //} //else if(hitInfo.InSeriesLabel) //else if (hitInfo.InConstantLine) //{ // _rightClickObj = hitInfo.ConstantLine; // lineMenuStrip.Show(chartControl1, e.Location); //} //else //{ // _rightClickObj = null; // chartRightMenu.Show(chartControl1, e.Location); //} } } private void chartControl运行区段_ObjectHotTracked(object sender, HotTrackEventArgs e) { if(e.AdditionalObject is AxisLabel) { } if (e.Object is AxisLabel) { } //if (SeriesQHmax == e.Object) //{ // toolTipController1.ShowHint("流量扬程曲线"); //} //else if (SeriesQEmax == e.Object) //{ // toolTipController1.ShowHint("流量效率曲线"); //} //else if (SeriesQPmax == e.Object) //{ // toolTipController1.ShowHint("流量功率曲线"); //} //else if (RatedParasLine == e.Object) //{ // if (ratedParas == null) // return; // toolTipController1.ShowHint(ratedParasAnno); //} if (e.AdditionalObject is SeriesPoint) { //SeriesPoint spect = e.AdditionalObject as SeriesPoint; //if (spect != null) //{ // ChartHitInfo hitInfo = e.HitInfo; // string s = string.Format("{0} , {1}", spect.Argument, spect.Values[0]); // toolTipController1.ShowHint(s); //} } //else if (e.AdditionalObject is Series) //{ // if (SeriesQHmax == e.AdditionalObject) // { // toolTipController1.ShowHint("流量扬程曲线"); // } //} //if (e.AdditionalObject == SeriesDesignPoint) //{ // toolTipController1.ShowHint(string.Format("设计点:流量{0},扬程{1}", DesignPointList.First().X, DesignPointList.First().Y)); //} //if (e.AdditionalObject is Series) //{ //} //else //{ // toolTipController1.HideHint(); //} } void barChartToolTipController_BeforeShow(object sender, ToolTipControllerShowEventArgs e) { ToolTipController controller = sender as ToolTipController; SeriesPoint seriesPoint = controller.ActiveObject as SeriesPoint; if (seriesPoint == null) return; //CategorySaleItem categorySaleItem = seriesPoint.Tag as CategorySaleItem; //if (categorySaleItem == null) // return; //if (tooltipShowImage) //{ // e.ToolTipType = ToolTipType.Standard; // e.ToolTipImage = CreateChart(categorySaleItem.SaleItems, categorySaleItem.Category, GetColorFromPaletteByNumber(categorySaleItem.OrderIndex)); // e.ToolTip = ""; //} //else //{ // e.ToolTipType = ToolTipType.SuperTip; // e.SuperTip = Create(categorySaleItem); //} } class SpanTimeBlock { public SpanTimeBlock(int pumpIndx, DateTime start, DateTime end) { this.PumpIndx = pumpIndx; this.Start = start; this.End = end; } public SpanTimeBlock(int pumpIndx, DateTime start, DateTime end,double flow,double power,double money) { this.PumpIndx = pumpIndx; this.Start = start; this.End = end; this.TotalFlow = flow; this.TotalPower = power; this.TotalMoney = money; } public int PumpIndx { get; set; } public DateTime Start { get; set; } public DateTime End { get; set; } public double TotalFlow { get; set; } public double TotalPower { get; set; } public double TotalMoney { get;set; } } private string BuildPumpName(int pumpIndx) { var pumpName = " 泵"; if (pumpIndx == 0) { pumpName = "1号泵"; } if (pumpIndx == 1) { pumpName = "2号泵"; } if (pumpIndx == 2) { pumpName = "3号泵"; } if (pumpIndx == 3) { pumpName = "4号泵"; } if (pumpIndx == 4) { pumpName = "5号泵"; } return pumpName; } public Action OnRefreshTimeSpan = null; private void tabbedControlGroup1_CustomHeaderButtonClick(object sender, DevExpress.XtraTab.ViewInfo.CustomHeaderButtonEventArgs e) { if (e.Button.Tag == null) return; if (e.Button.Tag.ToString() == "Setting") { if (OnRefreshTimeSpan != null) { OnRefreshTimeSpan.Invoke(this._anaPrj); } } if (e.Button.Tag.ToString() == "Export") { SaveFileDialog dlg = new SaveFileDialog(); dlg.Title = "导出信息列表"; dlg.FileName = "信息列表.xls"; dlg.Filter = "excel文件 (*.xls)|*.xls"; if (dlg.ShowDialog() == DialogResult.OK) this.gridControl运行列表.ExportToXls(dlg.FileName); } if (e.Button.Tag.ToString() == "StartAnimation") { _moveConstantLine.Visible = true ; timer = new System.Timers.Timer(); timer.Enabled = true; timer.Interval = 200;//执行间隔时间,单位为毫秒 timer.Start(); //指定每天时间1执行 timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer1_Elapsed); count = 0; SetEndAnimationCmdVisible(true ); } if (e.Button.Tag.ToString() == "EndAnimation") { timer.Stop(); timer.Dispose(); timer = null; SetEndAnimationCmdVisible(false ); } } System.Timers.Timer timer; int count = 0; private void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { count++; var time = this._startTime.AddMinutes(count * 2); if (time >= this._endTime) { timer.Stop(); timer.Dispose(); timer = null; return; } if (this.IsHandleCreated) { this.Invoke(new Action(() => { if (timer == null) return; _moveConstantLine.Title.Text = time.ToString("HH:mm"); _moveConstantLine.AxisValueSerializable = time.ToString(); })); } } private void IntialChart运行时间(IStation.CalcModel.AnaPrj anaPrj) { var diagram = chartControl运行区段.Diagram as DevExpress.XtraCharts.GanttDiagram; var axis = diagram.AxisY; axis.VisualRange.Auto = false; axis.WholeRange.Auto = false; axis.WholeRange.SideMarginsValue = 0; axis.VisualRange.SideMarginsValue = 0; axis.WholeRange.SetMinMaxValues(_startTime, _endTime); axis.VisualRange.SetMinMaxValues(_startTime, _endTime); axis.WholeRange.AlwaysShowZeroLevel = false; var series开机 = this.chartControl运行区段.Series[0]; List gridBidings = new List(); series开机.Points.Clear(); for (int pumpIndx = 0; pumpIndx < 5; pumpIndx++) { var pumpName = BuildPumpName(pumpIndx); List openTimeSpan = new List(); List closeTimeSpan = new List(); var items = (from x in anaPrj.Items where x.OpenPumpIndexs.Contains(pumpIndx) select x).ToList(); if (items.Count() == 0) { DevExpress.XtraCharts.SeriesPoint seriesPoint开机 = new DevExpress.XtraCharts.SeriesPoint( pumpName, new object[] { ((object)_startTime), ((object)_startTime)}, 0); series开机.Points.AddRange(new DevExpress.XtraCharts.SeriesPoint[] { seriesPoint开机 }); continue; } List splitTimes = new List(); for (int i = 0; i < items.Count(); i++) { var item = items.ElementAt(i); if (!splitTimes.Contains(item.StartTime)) splitTimes.Add(item.StartTime); if (!splitTimes.Contains(item.EndTime)) splitTimes.Add(item.EndTime); } splitTimes.Sort(); if (splitTimes[0] != _startTime) { closeTimeSpan.Add(new SpanTimeBlock(pumpIndx, _startTime, splitTimes[0])); } for (int i = 0; i < splitTimes.Count() - 1; i++) { var isStartTimeSplit = items.Find(x => x.StartTime == splitTimes[i]) != null ? true : false; if (isStartTimeSplit) { if (openTimeSpan.Count() > 0) { if (openTimeSpan[openTimeSpan.Count - 1].End == splitTimes[i] ) { openTimeSpan[openTimeSpan.Count - 1].End = splitTimes[i + 1]; continue; } } openTimeSpan.Add(new SpanTimeBlock(pumpIndx, splitTimes[i], splitTimes[i + 1])); } else { if (closeTimeSpan.Count() > 0) { if (closeTimeSpan[closeTimeSpan.Count - 1].End == splitTimes[i] && closeTimeSpan[closeTimeSpan.Count - 1].PumpIndx == pumpIndx) { closeTimeSpan[closeTimeSpan.Count - 1].End = splitTimes[i + 1]; continue; } } closeTimeSpan.Add(new SpanTimeBlock(pumpIndx, splitTimes[i], splitTimes[i + 1])); } } if (splitTimes[splitTimes.Count() - 1] != _endTime) { closeTimeSpan.Add(new SpanTimeBlock(pumpIndx, splitTimes[splitTimes.Count() - 1], _endTime)); } if (openTimeSpan.Count == 0) { DevExpress.XtraCharts.SeriesPoint seriesPoint开机 = new DevExpress.XtraCharts.SeriesPoint( pumpName, new object[] { ((object)_startTime), ((object)_startTime)}, 0); series开机.Points.AddRange(new DevExpress.XtraCharts.SeriesPoint[] { seriesPoint开机 }); } else { for (int i = 0; i < openTimeSpan.Count; i++) { var op = openTimeSpan[i]; DateTime endTime = op.End; DevExpress.XtraCharts.SeriesPoint seriesPoint开机 = new DevExpress.XtraCharts.SeriesPoint(pumpName, new object[] { ((object)op.Start), ((object)endTime)}, 0); series开机.Points.AddRange(new DevExpress.XtraCharts.SeriesPoint[] { seriesPoint开机 }); var pd = new CurrentGridViewModel() { PumpName = pumpName, StartTime = op.Start.ToString("HH:mm"), EndTime = endTime.ToString("HH:mm"), SpanTime = (endTime - op.Start).TotalMinutes.ToString() }; foreach (var it in items) { foreach (var t in it.SumData) { if (t.Time >= op.Start && t.Time <= op.End) { var td = t.PumpDatas[pumpIndx]; pd.SumFlow += td.SumFlow; pd.SumPower += td.SumPower; pd.SumMoney += td.SumMoney; } } } gridBidings.Add(pd); } } } this.bindingSourceGrid.DataSource = gridBidings; _moveConstantLine.AxisValueSerializable = this._startTime.ToString(); } #endregion private void tabbedControlGroup2_CustomHeaderButtonClick(object sender, DevExpress.XtraTab.ViewInfo.CustomHeaderButtonEventArgs e) { if (chartControl实时数据.Legend.Visibility == DevExpress.Utils.DefaultBoolean.True) { chartControl实时数据.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False; chartControl累计数据.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False; } else { chartControl实时数据.Legend.Visibility = DevExpress.Utils.DefaultBoolean.True; chartControl累计数据.Legend.Visibility = DevExpress.Utils.DefaultBoolean.True; } } } }