using DevExpress.Charts.Native;
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.Runtime;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace IStation.WinFrmUI.Monitor
{
public partial class TimeValueChartView : DevExpress.XtraEditors.XtraUserControl
{
public TimeValueChartView()
{
InitializeComponent();
InitialDiagarm();
InitialDefaultAxis();
InitialBoxSelHelper();
}
#region Initial
///
/// 初始化图表
///
private void InitialDiagarm()
{
//this.moniotrChartControl.Series.Clear();
//this.moniotrChartControl.Titles.Add(new ChartTitle());
//this.moniotrChartControl.Titles[0].Text = "A Point Chart";
//this.moniotrChartControl.Legend.AlignmentHorizontal = LegendAlignmentHorizontal.RightOutside; //获取或设置图表控件中的图例的水平对齐方式。
//this.moniotrChartControl.Legend.AlignmentVertical = LegendAlignmentVertical.Top;//获取或设置图表控件中的图例的竖直对齐方式。
//this.moniotrChartControl.Legend.Direction = LegendDirection.BottomToTop;//获取或设置在该图例中显示系列名称的方向。
//this.moniotrChartControl.Legend.Visibility = DevExpress.Utils.DefaultBoolean.True;//是否在图表上显示图例
this.moniotrChartControl.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;//是否在图表上显示图例
// Access the diagram's properties.把 Diagram 对象转换为所需的图象类型
_diagram = (XYDiagram)this.moniotrChartControl.Diagram;
_diagram.Rotated = false;//图像是否旋转
_diagram.EnableAxisXScrolling = true;//X轴是否允许滚动
_diagram.EnableAxisXZooming = true;//X轴是否允许缩放
_diagram.PaneLayout.Direction = PaneLayoutDirection.Vertical;//窗格的对齐方式
//默认面板
_defaultDiagramPane = _diagram.DefaultPane;
// Customize the appearance of the X-axis title.调整 X-轴
_defaultAxisX = _diagram.AxisX;//获取X轴
_defaultAxisX.Alignment = AxisAlignment.Near;//指定轴相对于另一主轴的位置。属性 AxisAlignment.Zero 设置仅对主轴可用
_defaultAxisX.Title.Text = "X轴";//设置轴标题
_defaultAxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.True; //是否显示轴标题
_defaultAxisX.Label.TextPattern = "";
//防止过长的轴标签产生重叠
_defaultAxisX.Label.Angle = 0;//设置轴标签文本旋转的角度
_defaultAxisX.Label.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.Default;//获取或设置是否对轴标签的文本应用反走样(平滑)
_defaultAxisX.Label.Staggered = false;//轴标签是否是交错排列的
//轴取值的范围是自动确定的(当启用了 xAxis.WholeRange.Auto 属性时),也可以人工指定两个轴取值来限定轴的范围
//xAxis.WholeRange.Auto = false;
//xAxis.WholeRange.MaxValue = 70;
//xAxis.WholeRange.MinValue = -70;
//通过 AxisBase.Logarithmic 和 AxisBase.LogarithmicBase 属性,以对数来呈现轴的取值。
//xAxis.Logarithmic = true;
//xAxis.LogarithmicBase = 10;
// Create a constant line. 设置常数线
//ConstantLine constantLine1 = new ConstantLine("Constant Line 1");
//_defaultAxisX.ConstantLines.Add(constantLine1);
// Create a strip with its maximum and minimum axis value defined.数值带
//_defaultAxisX.Strips.Add(new Strip("Strip 1", 2, 9));
_defaultAxisY = _diagram.AxisY;
// Enable automatic scale breaks creation, and define their maximum number.启用自动刻度分隔线
_defaultAxisY.AutoScaleBreaks.Enabled = true;
//_axisY.AutoScaleBreaks.MaxCount = 559;
// // Add scale breaks to the Y-axis collection, with their Edge1 and Edge2 properties defined in the constructor.人工把刻度分隔线插入到轴中
//_axisY.ScaleBreaks.Add(new ScaleBreak("Scale Break 1", 110, 100));
//_axisY.ScaleBreaks.Add(new ScaleBreak("Scale Break 2", 110, 2000));
// Customize the appearance of the axes' grid lines.网格显示和设置
_defaultAxisY.GridLines.Visible = true;
_defaultAxisY.GridLines.MinorVisible = false;
_defaultAxisX.GridLines.Visible = false;
_defaultAxisX.GridLines.MinorVisible = false;
// Customize the appearance of the axes' tickmarks.刻度线显示和设置
_defaultAxisY.Tickmarks.Visible = false;
_defaultAxisY.Tickmarks.MinorVisible = false;
//定制窗格的滚动条的外观
ScrollBarOptions scrollBarOptions = _defaultDiagramPane.ScrollBarOptions;
scrollBarOptions.BackColor = Color.White;
scrollBarOptions.BarColor = Color.LightSlateGray;
scrollBarOptions.BorderColor = Color.DarkGray;
scrollBarOptions.BarThickness = 15;
scrollBarOptions.XAxisScrollBarAlignment = ScrollBarAlignment.Far;
scrollBarOptions.XAxisScrollBarVisible = true;
}
///
/// 初始化默认轴线
///
private void InitialDefaultAxis()
{
//x轴为时间轴
/* _defaultAxisX.DateTimeScaleOptions.MeasureUnit = DateTimeMeasureUnit.Millisecond;
_defaultAxisX.DateTimeScaleOptions.ScaleMode = ScaleMode.Continuous;
_defaultAxisX.Label.TextPattern = "{A:yyyy-MM-dd}";
//_defaultAxisX.Title.Font = new System.Drawing.Font("Tahoma", 9F);*/
_defaultAxisX.Title.Text = "时间";
_defaultAxisX.Title.Visibility = 0;
//_defaultAxisX.VisibleInPanesSerializable = "-1";//???
_defaultAxisX.WholeRange.Auto = false;
//_defaultAxisX.WholeRange.SideMarginsValue = 1;
_defaultAxisX.Interlaced = false;//X轴交叉允许
_diagram.AxisY.WholeRange.AlwaysShowZeroLevel = false;//始终显示0水平线
//_diagram.AxisY.Title.Font = new System.Drawing.Font("Tahoma", 9F);
_diagram.AxisY.Title.Text = "未知";
_diagram.AxisY.Title.Visibility = 0;
//_diagram.AxisY.VisibleInPanesSerializable = "-1";//????
}
///
/// 初始化框选辅助类
///
private void InitialBoxSelHelper()
{
_boxSelHelper = new ChartBoxSelHelper(this.moniotrChartControl);
_boxSelHelper.BoxSelCompletedEvent += _boxSelHelper_BoxSelCompletedEvent;
}
#endregion
public void InitialDefaultAxisX()
{
_defaultAxisX.DateTimeScaleOptions.MeasureUnit = DateTimeMeasureUnit.Millisecond;
_defaultAxisX.DateTimeScaleOptions.ScaleMode = ScaleMode.Manual;
}
#region BoxSelHelper
private string _boxSelTag;//框选标签
//开始框选
public void StartBoxSel(string tag)
{
_boxSelTag = tag;
_diagram.EnableAxisXScrolling = false;
_diagram.EnableAxisXZooming = false;
_boxSelHelper.StartBoxSel();
}
//结束框选
public void CloseBoxSel()
{
this._boxSelHelper.CloseBoxSel();
}
//框选辅助类
private void _boxSelHelper_BoxSelCompletedEvent(MouseEventArgs obj)
{
_diagram.EnableAxisXScrolling = true;
_diagram.EnableAxisXZooming = true;
if (_boxSelHelper == null)
return;
var boxSelSeriesPointList = _boxSelHelper.CalcuDataTimeSelSeriesPoints(new List() { _defaultSeries });
if (boxSelSeriesPointList == null || boxSelSeriesPointList.Count < 1)
{
_boxSelHelper.CloseBoxSel();
return;
}
if (this.BoxSelCompleteEvent != null)
{
var list = boxSelSeriesPointList.Select(x => x.Tag as TimeValue).ToList();
this.BoxSelCompleteEvent.Invoke(_boxSelTag, list);
}
}
#endregion
private XYDiagram _diagram;//图表
private XYDiagramDefaultPane _defaultDiagramPane;//默认面板
private AxisX _defaultAxisX; //默认X轴
private AxisY _defaultAxisY; //默认Y轴
private Series _defaultSeries; //默认系列
private ChartBoxSelHelper _boxSelHelper = null;//框选辅助类
public event Action> BoxSelCompleteEvent = null;//框选完成事件
///
/// 初始化默认系列
///
/// 系列的Name(唯一)
/// 系列的数据源
public void InitialDefaultSeries(string seriesName, IEnumerable timeValues)
{
_defaultSeries = this.moniotrChartControl.Series[0];
_defaultSeries.Name = seriesName;
if (timeValues == null || timeValues.Count() < 1)
{
_defaultSeries.BindToData(timeValues, null);
}
else
{
_defaultSeries.BindToData(timeValues, "Time", "Value");
}
}
public void SetAxisXTitle(string title)
{
_defaultAxisX.Title.Text = title;
}
public void SetAxisYTitle(string title)
{
_diagram.AxisY.Title.Text = title;
}
public void SetTimeAxisX(DateTimeMeasureUnit unit)
{
_defaultAxisX.DateTimeScaleOptions.MeasureUnit = unit;
}
#region Create
///
/// 创建系列
///
private Series CreateLineSeries(string name, string caption)
{
//创建一个线系列
Series series = new Series(name, ViewType.Line);
series.CrosshairEnabled = DevExpress.Utils.DefaultBoolean.True; //获取或设置一个值,该值指定此系列是否启用十字准线游标。
series.CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True;//指定是否在特定的2D DEVExt.xCARTARTSs系列的图表上显示十字准线标签。
series.CrosshairLabelPattern = "坐标:({A},{V})";//获取或设置一个字符串表示指定要在当前系列的瞄准线标签中显示的文本的模式
series.CrosshairHighlightPoints = DevExpress.Utils.DefaultBoolean.Default;//获取或设置一个值,该值指定当十字准线光标悬停时,系列点是否突出显示。
series.ArgumentScaleType = ScaleType.Numerical; //指定系列的参数刻度类型。默认为(ScaleType.Auto)X轴
series.ValueScaleType = ScaleType.Numerical; //指定系列的取值刻度类型 Y轴
series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True; //是否显示系列点标签
series.LegendText = caption;//设置标志系列的图例文本
//调整 系列点标签
PointSeriesLabel label = (PointSeriesLabel)series.Label;
label.Angle = 0;//获取或设置控制数据点标签位置的角度
label.TextPattern = "{S}({A},{V})";//获取或设置一个字符串,该字符串表示指定要在系列标注标签中显示的文本的模式。
label.Position = PointLabelPosition.Outside;//获取或设置点标记所在的位置。
label.ResolveOverlappingMode = ResolveOverlappingMode.Default;//启用系列标签的自动冲突检测和解决
// 调整 系列视图属性设置
var view = (LineSeriesView)series.View;//转换系列的视图类型为点类型
view.PointMarkerOptions.Kind = MarkerKind.Star;//标记的形状
view.PointMarkerOptions.StarPointCount = 5;//设置星形标记具有的点数
view.PointMarkerOptions.Size = 8;//标记大小
var emptyPointOptions = view.EmptyPointOptions;//设置空值
emptyPointOptions.ProcessPoints = ProcessEmptyPointsMode.Interpolate;
emptyPointOptions.LineStyle.DashStyle = DashStyle.Dash;
emptyPointOptions.LineStyle.Thickness = view.LineStyle.Thickness;
return series;
}
///
/// 创建图表的第二坐标系
///
/// Series对象
///
private SecondaryAxisY CreateAxisY(Series series, string title = "Y轴")
{
var axisY = new SecondaryAxisY(series.Name);
((PointSeriesView)series.View).AxisY = axisY;//为当前系列指定Y轴
axisY.Title.Text = title;
axisY.Title.Alignment = StringAlignment.Far; //顶部对齐
axisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
//axisY.Title.Font = new Font("宋体", 9.0f);
series.View.Color = Color.Green;
Color color = series.View.Color;//设置坐标的颜色和图表线条颜色一致
axisY.Title.TextColor = color;
axisY.Label.TextColor = color;
axisY.Color = color;
return axisY;
}
#endregion
}
}