using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using DevExpress.XtraCharts;
namespace IStation.WinFrmUI.River
{
public partial class ViewRealTimeRiverWaterLevelCtrl : DevExpress.XtraEditors.XtraUserControl
{
public ViewRealTimeRiverWaterLevelCtrl()
{
InitializeComponent();
this.chartControl1.CustomPaint += new DevExpress.XtraCharts.CustomPaintEventHandler(this.ChartControl实时数据_CustomPaint);
}
private Model.eTideSouce _tideSouce = Model.eTideSouce.Book;
public void SetTideSouce(Model.eTideSouce tideSouce)
{
_tideSouce = tideSouce;
}
private Series _areaSeries;
private bool _isDispStrip = false;
DateTime _rangDay1, _rangDay2, _rangDay3;
DateTime _calcDay;
private bool _isDay3 = false;
///
/// 初始化默认系列
///
/// 数据源
//public void SetBindingData(List timeValues)
//{
// _areaSeries = this.chartControl1.Series[0];
// if (timeValues == null || timeValues.Count() < 1)
// {
// // _defaultSeries.BindToData(timeValues, null);
// }
// else
// {
// timeValueBindingSource.DataSource = timeValues;
// // _defaultSeries.BindToData(timeValues, "Time", "Level");
// }
// //GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
// //GC.Collect(2, GCCollectionMode.Forced);
// //GC.WaitForFullGCComplete();
//}
public List SetBindingData3Day (DateTime calc_day, out string benchmark)
{
_isDay3 = true;
benchmark = null;
_calcDay = calc_day;
string error1, error2, error3;
List waterLevels长江1, waterLevels长江2, waterLevels长江3;
if (calc_day == DateTime.Today)
{
_rangDay1 = calc_day.AddDays(-1);
_rangDay2 = calc_day;
_rangDay3 = calc_day.AddDays(1);
}
else if (calc_day == DateTime.Today.AddDays(1))
{
_rangDay1 = calc_day.AddDays(-2);
_rangDay2 = calc_day.AddDays(-1);
_rangDay3 = calc_day;
}
else
{
_rangDay1 = calc_day.AddDays(-1);
_rangDay2 = calc_day;
_rangDay3 = calc_day.AddDays(1);
}
waterLevels长江1 = IStation.BLL.TideHelper.GetByDay (_tideSouce, _rangDay1, out error1);
waterLevels长江2 = IStation.BLL.TideHelper.GetByDay (_tideSouce, _rangDay2, out error2);
waterLevels长江3 = IStation.BLL.TideHelper.GetByDay (_tideSouce, _rangDay3, out error3);
List timeValues = new List();
if (waterLevels长江1 != null)
{
timeValues.AddRange(waterLevels长江1);
}
else if(!string.IsNullOrEmpty(error1) && _rangDay1 <= DateTime.Today.AddDays(1))
{
MessageBox.Show(error1);
}
if (waterLevels长江2 != null)
{
timeValues.AddRange(waterLevels长江2);
}
else if (!string.IsNullOrEmpty(error2) && _rangDay2 <= DateTime.Today.AddDays(1))
{
MessageBox.Show(error1);
}
if (waterLevels长江3 != null)
{
timeValues.AddRange(waterLevels长江3);
}
else if (!string.IsNullOrEmpty(error3) && _rangDay3 <= DateTime.Today.AddDays(1))
{
MessageBox.Show(error3);
}
_isDispStrip = true;
_areaSeries = this.chartControl1.Series[0];
if (timeValues == null || timeValues.Count() < 1)
{
// _defaultSeries.BindToData(timeValues, null);
}
else
{
timeValueBindingSource.DataSource = timeValues;
// _defaultSeries.BindToData(timeValues, "Time", "Level");
// this.chartControl1.AnnotationRepository[]
DevExpress.XtraCharts.TextAnnotation textAnnotationMax = this.chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation;
DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPointMax = textAnnotationMax.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint;
DevExpress.XtraCharts.TextAnnotation textAnnotationMin = this.chartControl1.AnnotationRepository[1] as DevExpress.XtraCharts.TextAnnotation;
DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPointMin = textAnnotationMin.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint;
var list22 = timeValues.Where(x => x.Time >= calc_day && x.Time <= calc_day.AddDays(1));
var maxLevel = list22.FindObjMaxBy(x => x.Level);
paneAnchorPointMax.AxisXCoordinate.AxisValueSerializable = maxLevel.Time.ToString();
paneAnchorPointMax.AxisYCoordinate.AxisValueSerializable = maxLevel.Level.ToString();
textAnnotationMax.Text = string.Format("max:{0}", maxLevel.Level);
var minLevel = list22.FindObjMinBy(x => x.Level);
paneAnchorPointMin.AxisXCoordinate.AxisValueSerializable = minLevel.Time.ToString();
paneAnchorPointMin.AxisYCoordinate.AxisValueSerializable = minLevel.Level.ToString();
textAnnotationMin.Text = string.Format("min:{0}", minLevel.Level);
}
SetStripRange( );
return timeValues;
}
public List SetBindingData1Day(DateTime start, DateTime end, out string benchmark)
{
benchmark = null;
string error;
var waterLevels长江1 = IStation.BLL.TideHelper.GetByDay(_tideSouce, start, out error);
List timeValues = new List();
if (waterLevels长江1 != null)
{
timeValues.AddRange(waterLevels长江1);
}
_areaSeries = this.chartControl1.Series[0];
if (timeValues == null || timeValues.Count() < 1)
{
// _defaultSeries.BindToData(timeValues, null);
}
else
{
timeValueBindingSource.DataSource = timeValues;
// _defaultSeries.BindToData(timeValues, "Time", "Level");
// this.chartControl1.AnnotationRepository[]
DevExpress.XtraCharts.TextAnnotation textAnnotationMax = this.chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation;
DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPointMax = textAnnotationMax.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint;
DevExpress.XtraCharts.TextAnnotation textAnnotationMin = this.chartControl1.AnnotationRepository[1] as DevExpress.XtraCharts.TextAnnotation;
DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPointMin = textAnnotationMin.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint;
var maxLevel = timeValues.Where(x => x.Time >= start && x.Time <= end).FindObjMaxBy(x => x.Level);
paneAnchorPointMax.AxisXCoordinate.AxisValueSerializable = maxLevel.Time.ToString();
paneAnchorPointMax.AxisYCoordinate.AxisValueSerializable = maxLevel.Level.ToString();
textAnnotationMax.Text = string.Format("max:{0}", maxLevel.Level);
var minLevel = timeValues.Where(x => x.Time >= start && x.Time <= end).FindObjMinBy(x => x.Level);
paneAnchorPointMin.AxisXCoordinate.AxisValueSerializable = minLevel.Time.ToString();
paneAnchorPointMin.AxisYCoordinate.AxisValueSerializable = minLevel.Level.ToString();
textAnnotationMin.Text = string.Format("min:{0}", minLevel.Level);
}
return timeValues;
}
private bool isInitialRange = false;
private void SetStripRange( )
{
var xyDiagram = this.chartControl1.Diagram as DevExpress.XtraCharts.XYDiagram;
var strp1 = xyDiagram.AxisX.Strips[0];
//strp1.MinLimit.AxisValueSerializable = start.ToString();// "01/01/0001 00:00:00.000";
//strp1.MaxLimit.AxisValueSerializable = start.AddDays(1).ToString();// "01/01/0001 01:00:00.000";
var strp2 = xyDiagram.AxisX.Strips[1];
//strp2.MinLimit.AxisValueSerializable = start.AddDays(1).ToString();// "01/01/0001 00:00:00.000";
//strp2.MaxLimit.AxisValueSerializable = start.AddDays(2).ToString();// "01/01/0001 01:00:00.000";
if (!isInitialRange)
{
isInitialRange = true;
strp1.MaxLimit.AxisValueSerializable = _rangDay1.AddDays(1).ToString();// "01/01/0001 01:00:00.000";
strp1.MinLimit.AxisValueSerializable = _rangDay1.ToString();// "01/01/0001 00:00:00.000";
strp2.MaxLimit.AxisValueSerializable = _rangDay2.AddDays(1).AddDays(2).ToString();// "01/01/0001 01:00:00.000";
strp2.MinLimit.AxisValueSerializable = _rangDay2.AddDays(1).ToString();// "01/01/0001 00:00:00.000";
}
else
{
if (DateTime.Parse(strp1.MinLimit.AxisValueSerializable) > _rangDay1.AddDays(1))
{
isInitialRange = true;
strp1.MinLimit.AxisValueSerializable = _rangDay1.ToString();// "01/01/0001 00:00:00.000";
strp1.MaxLimit.AxisValueSerializable = _rangDay1.AddDays(1).ToString();// "01/01/0001 01:00:00.000";
}
else
{
isInitialRange = true;
strp1.MaxLimit.AxisValueSerializable = _rangDay1.AddDays(1).ToString();// "01/01/0001 01:00:00.000";
strp1.MinLimit.AxisValueSerializable = _rangDay1.ToString();// "01/01/0001 00:00:00.000";
}
if (DateTime.Parse(strp2.MinLimit.AxisValueSerializable) > _rangDay2.AddDays(1))
{
isInitialRange = true;
strp2.MinLimit.AxisValueSerializable = _rangDay2.ToString();// "01/01/0001 00:00:00.000";
strp2.MaxLimit.AxisValueSerializable = _rangDay2.AddDays(1).ToString();// "01/01/0001 01:00:00.000";
}
else
{
isInitialRange = true;
strp2.MaxLimit.AxisValueSerializable = _rangDay2.AddDays(1).ToString();// "01/01/0001 01:00:00.000";
strp2.MinLimit.AxisValueSerializable = _rangDay2.ToString();// "01/01/0001 00:00:00.000";
}
}
}
private void ChartControl实时数据_CustomPaint(object sender, CustomPaintEventArgs e)
{
if (_isDay3 == false)
return;
if (_isDispStrip == false) return;
Graphics g = e.Graphics;
//g.SetClip(CalculateDiagramBounds());
g.SmoothingMode = SmoothingMode.AntiAlias;
var mainDiagram = this.chartControl1.Diagram as DevExpress.XtraCharts.XYDiagram;
double rang_max = Convert.ToDouble(mainDiagram.AxisY.WholeRange.MaxValue);
using (Font fontDay普通 = new Font("黑体", 14, FontStyle.Regular))
using (Font fontDay加粗 = new Font("黑体", 16, FontStyle.Bold))
using (SolidBrush brushDay普通 = new SolidBrush(Color.PaleVioletRed))
using (SolidBrush brushDay加粗 = new SolidBrush(Color. DarkRed))
{
StringFormat StrF = new StringFormat();
StrF.Alignment = StringAlignment.Center;
StrF.LineAlignment = StringAlignment.Far;
//StrF.FormatFlags = StringFormatFlags.DirectionVertical;
var pt1 = mainDiagram.DiagramToPoint(_rangDay1.AddHours(12).ToString(), rang_max);
var pt2 = mainDiagram.DiagramToPoint(_rangDay2.AddHours(12).ToString(), rang_max);
var pt3 = mainDiagram.DiagramToPoint(_rangDay3.AddHours(12).ToString(), rang_max);
var str1 = _rangDay1.ToString("MM月dd日");
if(_rangDay1==DateTime.Today)
{
str1 = string.Format("{0}(今日)", _rangDay1.ToString("MM月dd日"));
}
var str2 = _rangDay2.ToString("MM月dd日");
if (_rangDay2 == DateTime.Today)
{
str2 = string.Format("{0}(今日)", _rangDay2.ToString("MM月dd日"));
}
var str3 = _rangDay3.ToString("MM月dd日");
if (_rangDay3 == DateTime.Today)
{
str3 = string.Format("{0}(今日)", _rangDay3.ToString("MM月dd日"));
}
if (_rangDay1 == _calcDay)
{
g.DrawString(str1, fontDay加粗, brushDay加粗, new Point(pt1.Point.X - 5, pt1.Point.Y - 8), StrF);
}
else
{
g.DrawString(str1, fontDay普通, brushDay普通, new Point(pt1.Point.X - 5, pt1.Point.Y - 8), StrF);
}
if (_rangDay2 == _calcDay)
{
g.DrawString(str2, fontDay加粗, brushDay加粗, new Point(pt2.Point.X - 5, pt2.Point.Y - 8), StrF);
}
else
{
g.DrawString(str2, fontDay普通, brushDay普通, new Point(pt2.Point.X - 5, pt2.Point.Y - 8), StrF);
}
if (_rangDay3 == _calcDay)
{
g.DrawString(str3, fontDay加粗, brushDay加粗, new Point(pt3.Point.X - 5, pt3.Point.Y - 8), StrF);
}
else
{
g.DrawString(str3, fontDay普通, brushDay普通, new Point(pt3.Point.X - 5, pt3.Point.Y - 8), StrF);
}
}
}
}
}