| | |
| | | #region Private Variable |
| | | |
| | | private XYDiagram _diagram; |
| | | private XYDiagramDefaultPane _default_pane; |
| | | private AxisX _axis_x; |
| | | private AxisY _axis_y; |
| | | |
| | | private Series _series_line; |
| | | private Series _series_point; |
| | | private Series _series_edit_pt; |
| | | |
| | | private List<Yw.Geometry.Point2d> _point_pt_list; |
| | | private List<Yw.Geometry.Point2d> _line_pt_list; |
| | | private List<Yw.Geometry.Point2d> _def_pt_list; |
| | | private List<Yw.Geometry.Point2d> _fit_pt_list; |
| | | |
| | | private UniversalCoordinate _coordinate; |
| | | private bool _initial_data = false; |
| | | private bool _initial_data = false; |
| | | private bool _mouse_mode = false;//鼠标模式 |
| | | |
| | | #endregion |
| | |
| | | _axis_y.Title.Text = value; |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 鼠标模式 |
| | | /// </summary> |
| | |
| | | } |
| | | set |
| | | { |
| | | _mouse_mode = value; |
| | | _mouse_mode = value; |
| | | } |
| | | } |
| | | |
| | |
| | | /// </summary> |
| | | public event Action<List<Yw.Geometry.Point2d>> DefinePointChangedEvent; |
| | | |
| | | /// <summary> |
| | | /// 选中点 |
| | | /// </summary> |
| | | public event Action<int> SelectedPointIndexChangedEvent; |
| | | #endregion |
| | | |
| | | #region Initial |
| | | #region Private Initial |
| | | |
| | | /// <summary> |
| | | /// 初始化图表 |
| | |
| | | |
| | | |
| | | _diagram = (XYDiagram)chartControl1.Diagram; |
| | | _default_pane = _diagram.DefaultPane; |
| | | _axis_x = _diagram.AxisX; |
| | | //_axis_x.SetAxisXQDisplay(); |
| | | _axis_x.SetAxisXQDisplay(); |
| | | _axis_y = _diagram.AxisY; |
| | | //_axis_y.SetAxisYQLDisplay(); |
| | | |
| | | _series_line = this.chartControl1.GetSeriesByName("SeriesLine"); |
| | | //_series_line.SetCurveQLDisplay(); |
| | | |
| | | _series_point = this.chartControl1.GetSeriesByName("SeriesPoint"); |
| | | //_series_point.SetPointQLDisplay(); |
| | | _axis_y.SetAxisYQHDisplay(); |
| | | |
| | | _axis_x.Visibility = DefaultBoolean.False; |
| | | _axis_x.GridLines.Visible = false; |
| | | _axis_y.Visibility = DefaultBoolean.False; |
| | | _axis_y.GridLines.Visible = false; |
| | | |
| | | _series_point.Visible = false; |
| | | |
| | | this.chartControl1.SetChartMonoColorDisplay(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 初始化坐标轴 |
| | | /// </summary> |
| | | private void InitialCoordinate() |
| | | { |
| | | //设置成白板坐标 |
| | | _coordinate = new UniversalCoordinate(); |
| | | _coordinate.GridNumberX = 30; |
| | | _coordinate.GridNumberY = 16; |
| | | _coordinate.StartLineNoY = 10; |
| | | _coordinate.EndLineNoY = 15; |
| | | _coordinate.CoordMinX = 0; _coordinate.CoordSpaceX = 1000; |
| | | _coordinate.CoordMinY = 10; _coordinate.CoordSpaceY = 100; |
| | | } |
| | | |
| | | #endregion Initial |
| | | |
| | | #region SetBindingData |
| | | #region Private Chart Event |
| | | |
| | | private int _pick_point_index = -1; |
| | | private void chartControl1_MouseDown(object sender, MouseEventArgs e) |
| | | { |
| | | if (!_initial_data) |
| | | return; |
| | | var hitInfo = chartControl1.CalcHitInfo(e.Location); |
| | | _pick_point_index = -1; |
| | | if (e.Button == MouseButtons.Left) |
| | | { |
| | | if (hitInfo.InSeriesPoint && hitInfo.SeriesPoint.Tag is int index) |
| | | { |
| | | _pick_point_index = index; |
| | | this.SelectedPointIndexChangedEvent?.Invoke(_pick_point_index); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void chartControl1_MouseMove(object sender, MouseEventArgs e) |
| | | { |
| | | if (!_mouse_mode) |
| | | return; |
| | | if (_pick_point_index < 0) |
| | | return; |
| | | if (IsInvalidData()) |
| | | return; |
| | | var diagram_coordinates = _diagram.PointToDiagram(e.Location); |
| | | var axis_value = diagram_coordinates.GetAxisValue(_axis_y); |
| | | if (axis_value == null) |
| | | return; |
| | | _series_edit_pt.Points[_pick_point_index].Values[0] = axis_value.NumericalValue; |
| | | _series_edit_pt.Points[_pick_point_index].NumericalArgument = diagram_coordinates.NumericalArgument; |
| | | } |
| | | |
| | | |
| | | private void chartControl1_MouseUp(object sender, MouseEventArgs e) |
| | | { |
| | | if (!_mouse_mode) |
| | | return; |
| | | if (_pick_point_index < 0) |
| | | return; |
| | | if (IsInvalidData()) |
| | | return; |
| | | var x = _series_edit_pt.Points[_pick_point_index].NumericalArgument; |
| | | var y = _series_edit_pt.Points[_pick_point_index].Values[0]; |
| | | x = Math.Round(x, 2); |
| | | y = Math.Round(y, 2); |
| | | SetPointValue(_pick_point_index, x, y); |
| | | _pick_point_index = -1; |
| | | } |
| | | |
| | | private void chartControl1_KeyUp(object sender, KeyEventArgs e) |
| | | { |
| | | if (_mouse_mode) |
| | | return; |
| | | if (_pick_point_index < 0) |
| | | return; |
| | | if (IsInvalidData()) |
| | | return; |
| | | double space_x = _coordinate.CoordSpaceX / 50; |
| | | double space_y = _coordinate.CoordSpaceY / 50; |
| | | double x = _series_edit_pt.Points[_pick_point_index].NumericalArgument; |
| | | double y = _series_edit_pt.Points[_pick_point_index].Values[0]; |
| | | if (e.KeyCode == Keys.Up) |
| | | { |
| | | y += space_y; |
| | | } |
| | | else if (e.KeyCode == Keys.Down) |
| | | { |
| | | y -= space_y; |
| | | } |
| | | else if (e.KeyCode == Keys.Left) |
| | | { |
| | | x -= space_x; |
| | | } |
| | | else if (e.KeyCode == Keys.Right) |
| | | { |
| | | x += space_x; |
| | | } |
| | | x = Math.Round(x, 2); |
| | | y = Math.Round(y, 2); |
| | | _series_edit_pt.Points[_pick_point_index].NumericalArgument = x; |
| | | _series_edit_pt.Points[_pick_point_index].Values[0] = y; |
| | | SetPointValue(_pick_point_index, x, y); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 更新数据 |
| | | /// </summary> |
| | | private void SetPointValue(int index, double x, double y) |
| | | { |
| | | if (IsInvalidData()) |
| | | return; |
| | | _def_pt_list[index].X = x; |
| | | _def_pt_list[index].Y = y; |
| | | this.DefinePointChangedEvent?.Invoke(_def_pt_list); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region Set |
| | | |
| | | /// <summary> |
| | | /// 绑定数据 |
| | | /// </summary> |
| | | public void SetBindingData(List<Yw.Geometry.Point2d> point_pt_list, List<Yw.Geometry.Point2d> line_pt_list, string coordinate = null) |
| | | public void Clear() |
| | | { |
| | | _initial_data = false; |
| | | _point_pt_list = point_pt_list; |
| | | _line_pt_list = line_pt_list; |
| | | _def_pt_list = null; |
| | | _fit_pt_list = null; |
| | | _coordinate = null; |
| | | _series_edit_pt = null; |
| | | |
| | | this.chartControl1.BeginInit(); |
| | | this.chartControl1.Series.Clear(); |
| | | this.chartControl1.AnnotationRepository.Clear(); |
| | | this.chartControl1.Legend.CustomItems.Clear(); |
| | | this.chartControl1.EndInit(); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 绑定数据 |
| | | /// </summary> |
| | | public void SetBindingData(List<Yw.Geometry.Point2d> def_pt_list, List<Yw.Geometry.Point2d> fit_pt_list, string coordinate = null, Color? color = null) |
| | | { |
| | | _initial_data = false; |
| | | _def_pt_list = def_pt_list?.Select(x => new Geometry.Point2d(x.X, x.Y)).ToList(); |
| | | _fit_pt_list = fit_pt_list?.Select(x => new Geometry.Point2d(x.X, x.Y)).ToList(); |
| | | _coordinate = UniversalCoordinate.ToModel(coordinate); |
| | | if (line_pt_list == null || !line_pt_list.Any()) |
| | | _series_edit_pt = null; |
| | | |
| | | if (color == null) |
| | | color = Color.DodgerBlue; |
| | | |
| | | this.chartControl1.BeginInit(); |
| | | this.chartControl1.Series.Clear(); |
| | | this.chartControl1.AnnotationRepository.Clear(); |
| | | this.chartControl1.Legend.CustomItems.Clear(); |
| | | if (IsInvalidData()) |
| | | { |
| | | return; |
| | | } |
| | | if (point_pt_list == null || !point_pt_list.Any()) |
| | | { |
| | | point_pt_list = line_pt_list.Select(x => x.Clone()).ToList(); |
| | | } |
| | | |
| | | _initial_data = true; |
| | | UpdateChart(); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region Update |
| | | |
| | | /// <summary> |
| | | /// 更新曲线 |
| | | /// </summary> |
| | | public void UpdateCurve(List<Yw.Geometry.Point2d> point_pt_list) |
| | | { |
| | | if (point_pt_list == null || !point_pt_list.Any()) |
| | | return; |
| | | |
| | | _point_pt_list = point_pt_list; |
| | | _line_pt_list = point_pt_list.GetFitPointList(); |
| | | |
| | | UpdateChart(true); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 更新图表 |
| | | /// </summary> |
| | | /// <param name="calc_coordinate">计算坐标</param> |
| | | public void UpdateChart(bool calc_coordinate = false) |
| | | { |
| | | if (calc_coordinate || _coordinate == null) |
| | | { |
| | | //不强迫计算,就用上次更新的坐标系 |
| | | CalcCoordinate(); |
| | | } |
| | | |
| | | CalcChartAxis(); |
| | | |
| | | CalcSeries(); |
| | | } |
| | | |
| | | #endregion Update |
| | | |
| | | #region Calc |
| | | |
| | | /// <summary> |
| | | /// 计算坐标 |
| | | /// </summary> |
| | | public void CalcCoordinate() |
| | | { |
| | | if (_line_pt_list == null || _line_pt_list.Count < 4) |
| | | { |
| | | //设置成白板坐标 |
| | | _coordinate = new UniversalCoordinate(); |
| | | _coordinate.GridNumberX = 30; |
| | | _coordinate.GridNumberY = 16; |
| | | //显示的坐标线号 |
| | | _coordinate.StartLineNoY = 10; |
| | | _coordinate.EndLineNoY = 15; |
| | | //坐标最小值和间隔 |
| | | _coordinate.CoordMinX = 0; _coordinate.CoordSpaceX = 1000; |
| | | _coordinate.CoordMinY = 10; _coordinate.CoordSpaceY = 100; |
| | | _initial_data = false; |
| | | this.chartControl1.EndInit(); |
| | | return; |
| | | } |
| | | |
| | | _coordinate = UniversalCoordinate.CalcCoordinate(_line_pt_list); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 计算图表轴 |
| | | /// </summary> |
| | | public void CalcChartAxis() |
| | | { |
| | | _series_edit_pt = AddPointSeries(color.Value, _axis_x, _axis_y, _default_pane, _def_pt_list); |
| | | AddLineSeries(color.Value, _axis_x, _axis_y, _default_pane, _fit_pt_list); |
| | | if (_coordinate == null) |
| | | SetCoordinate(); |
| | | |
| | | SetChartAxis(); |
| | | this.chartControl1.EndInit(); |
| | | _initial_data = true; |
| | | } |
| | | |
| | | //是否是无效数据 |
| | | private bool IsInvalidData() |
| | | { |
| | | if (_def_pt_list == null || !_def_pt_list.Any()) |
| | | { |
| | | return true; |
| | | } |
| | | if (_fit_pt_list == null || !_fit_pt_list.Any()) |
| | | { |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | #region Add Chart Data |
| | | |
| | | private Series AddPointSeries(Color color, AxisXBase axis_x, AxisYBase axis_y, XYDiagramPaneBase pane, List<Yw.Geometry.Point2d> pt_list) |
| | | { |
| | | if (pt_list == null || !pt_list.Any()) |
| | | return null; |
| | | |
| | | var view = new DevExpress.XtraCharts.PointSeriesView(); |
| | | view.PointMarkerOptions.Size = 8; |
| | | view.PointMarkerOptions.Kind = MarkerKind.Circle; |
| | | view.PointMarkerOptions.BorderColor = color; |
| | | view.Color = color; |
| | | view.AxisX = axis_x; |
| | | view.AxisY = axis_y; |
| | | view.EmptyPointOptions.Color = Color.Transparent; |
| | | view.Pane = pane; |
| | | |
| | | var series_pt_list = new List<SeriesPoint>(); |
| | | for (int i = 0; i < pt_list.Count; i++) |
| | | { |
| | | var pt = pt_list[i]; |
| | | var series_pt = new DevExpress.XtraCharts.SeriesPoint(pt.X, new double[] { pt.Y }); |
| | | series_pt.Tag = i; |
| | | series_pt_list.Add(series_pt); |
| | | } |
| | | |
| | | var series = new DevExpress.XtraCharts.Series(); |
| | | series.ShowInLegend = false; |
| | | series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; |
| | | series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; |
| | | series.CrosshairEnabled = DefaultBoolean.False; |
| | | series.CrosshairLabelVisibility = DefaultBoolean.False; |
| | | series.ToolTipEnabled = DefaultBoolean.False; |
| | | series.SeriesPointsSorting = SortingMode.None; |
| | | series.Visible = true; |
| | | series.View = view; |
| | | series.CrosshairLabelPattern = "{A}"; |
| | | series.Points.AddRange(series_pt_list.ToArray()); |
| | | this.chartControl1.Series.Add(series); |
| | | |
| | | return series; |
| | | } |
| | | |
| | | private void AddLineSeries(Color color, AxisXBase axis_x, AxisYBase axis_y, XYDiagramPaneBase pane, List<Yw.Geometry.Point2d> pt_list, DashStyle dash = DashStyle.Solid) |
| | | { |
| | | if (pt_list == null || !pt_list.Any()) |
| | | return; |
| | | |
| | | var view = new DevExpress.XtraCharts.LineSeriesView(); |
| | | view.LineStyle.DashStyle = dash; |
| | | view.LineStyle.LineJoin = System.Drawing.Drawing2D.LineJoin.Round; |
| | | view.LineStyle.Thickness = 2; |
| | | view.Color = color; |
| | | view.EnableAntialiasing = DefaultBoolean.True; |
| | | view.MarkerVisibility = DefaultBoolean.False; |
| | | view.AxisX = axis_x; |
| | | view.AxisY = axis_y; |
| | | view.EmptyPointOptions.Color = Color.Transparent; |
| | | view.Pane = pane; |
| | | |
| | | var series_pt_list = pt_list.Select(x => x.ToSeriesPoint()).ToArray(); |
| | | var series = new DevExpress.XtraCharts.Series(); |
| | | series.ShowInLegend = false; |
| | | series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; |
| | | series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; |
| | | series.CrosshairEnabled = DefaultBoolean.False; |
| | | series.ToolTipEnabled = DefaultBoolean.False; |
| | | series.SeriesPointsSorting = SortingMode.None; |
| | | series.Visible = true; |
| | | series.View = view; |
| | | series.Points.AddRange(series_pt_list); |
| | | |
| | | this.chartControl1.Series.Add(series); |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | |
| | | #endregion |
| | | |
| | | #region Set Axis |
| | | |
| | | private double _minX, _maxX; |
| | | private double _maxY = 0, _minY = 10000; |
| | | |
| | | /// <summary> |
| | | /// 设置坐标 |
| | | /// </summary> |
| | | private void SetCoordinate() |
| | | { |
| | | if (IsInvalidData()) |
| | | { |
| | | InitialCoordinate(); |
| | | return; |
| | | } |
| | | |
| | | _minX = _def_pt_list.Min(x => x.X); |
| | | _maxX = _def_pt_list.Max(x => x.X); |
| | | |
| | | _minY = _def_pt_list.Min(x => x.Y); |
| | | _maxY = _def_pt_list.Max(x => x.Y); |
| | | |
| | | _minX = Math.Min(_fit_pt_list.Min(x => x.X), _minX); |
| | | _maxX = Math.Min(_fit_pt_list.Max(x => x.X), _maxX); |
| | | |
| | | _minY = Math.Min(_fit_pt_list.Min(x => x.Y), _minY); |
| | | _maxY = Math.Min(_fit_pt_list.Max(x => x.Y), _maxY); |
| | | |
| | | |
| | | _coordinate = UniversalCoordinate.CalcCoordinate(_minX, _maxX, _minY, _maxY); |
| | | if (_coordinate == null) |
| | | return; |
| | | if (_coordinate.CoordMinX + _coordinate.CoordSpaceX * this._coordinate.GridNumberX < _maxX * 1.05) |
| | | { |
| | | _coordinate.GridNumberX++; |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置图表轴 |
| | | /// </summary> |
| | | public void SetChartAxis() |
| | | { |
| | | if (_coordinate == null || IsInvalidData()) |
| | | { |
| | | _axis_x.Visibility = DefaultBoolean.False; |
| | | _axis_x.GridLines.Visible = false; |
| | |
| | | _axis_y.GridLines.Visible = false; |
| | | return; |
| | | } |
| | | if (_line_pt_list != null && _line_pt_list.Any()) |
| | | { |
| | | |
| | | //计算刻度 X |
| | | var axis_x_labels = new List<CustomAxisLabel>(); |
| | | var display_x = _coordinate.CoordMinX; |
| | | for (int i = 0; i < _coordinate.GridNumberX + 1; i++) |
| | | { |
| | | axis_x_labels.Add(new CustomAxisLabel(display_x.ToString("N0"), display_x)); |
| | | display_x = display_x + _coordinate.CoordSpaceX; |
| | | } |
| | | |
| | | //流量 |
| | | if (_line_pt_list != null) |
| | | _axis_x.CustomLabels.Clear(); |
| | | _axis_x.CustomLabels.AddRange(axis_x_labels.ToArray()); |
| | | _axis_x.Visibility = DefaultBoolean.True; |
| | | _axis_x.GridLines.Visible = true; |
| | | |
| | | |
| | | //计算刻度 Y |
| | | var axis_y_labels = new List<CustomAxisLabel>(); |
| | | var display_y = _coordinate.CoordMinY + _coordinate.CoordSpaceY * _coordinate.StartLineNoY; |
| | | for (int i = _coordinate.StartLineNoY; i < _coordinate.EndLineNoY + 1; i++) |
| | | { |
| | | //计算刻度 |
| | | var labels = new List<CustomAxisLabel>(); |
| | | var disX = _coordinate.CoordMinX; |
| | | for (int i = 0; i < _coordinate.GridNumberX + 1; i++) |
| | | { |
| | | labels.Add(new CustomAxisLabel(disX.ToString("N0"), disX)); |
| | | disX = disX + _coordinate.CoordSpaceX; |
| | | } |
| | | |
| | | //坐标刻度 |
| | | _axis_x.CustomLabels.Clear(); |
| | | _axis_x.CustomLabels.AddRange(labels.ToArray()); |
| | | _axis_x.Visibility = DefaultBoolean.True; |
| | | _axis_x.GridLines.Visible = true; |
| | | _axis_x.SetAxisRange(_coordinate.CoordMinX, _coordinate.CoordMinX + _coordinate.GridNumberX * _coordinate.CoordSpaceX); |
| | | axis_y_labels.Add(new CustomAxisLabel(display_y.ToString(), display_y)); |
| | | display_y = display_y + _coordinate.CoordSpaceY; |
| | | } |
| | | |
| | | |
| | | { |
| | | //计算刻度 |
| | | var labels = new List<CustomAxisLabel>(); |
| | | var display_head = _coordinate.CoordMinY + _coordinate.CoordSpaceY * _coordinate.StartLineNoY; |
| | | for (int i = _coordinate.StartLineNoY; i < _coordinate.EndLineNoY + 1; i++) |
| | | { |
| | | labels.Add(new CustomAxisLabel(display_head.ToString(), display_head)); |
| | | display_head = display_head + _coordinate.CoordSpaceY; |
| | | } |
| | | _axis_y.CustomLabels.Clear(); |
| | | _axis_y.CustomLabels.AddRange(axis_y_labels.ToArray()); |
| | | _axis_y.Visibility = DefaultBoolean.True; |
| | | _axis_y.GridLines.Visible = true; |
| | | |
| | | _axis_y.CustomLabels.Clear(); |
| | | _axis_y.CustomLabels.AddRange(labels.ToArray()); |
| | | _axis_y.Visibility = DefaultBoolean.True; |
| | | _axis_y.GridLines.Visible = true; |
| | | } |
| | | |
| | | |
| | | _axis_x.SetAxisRange(_coordinate.CoordMinX, _coordinate.CoordMinX + _coordinate.GridNumberX * _coordinate.CoordSpaceX); |
| | | _axis_x.SetAxisRange(_coordinate.CoordMinX, _coordinate.DispMaxX()); |
| | | _axis_y.SetAxisRange(_coordinate.DispMinY(), _coordinate.DispMaxY()); |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 计算系列 |
| | | /// </summary> |
| | | public void CalcSeries() |
| | | { |
| | | if (_line_pt_list != null && _line_pt_list.Count > 3) |
| | | { |
| | | _series_line.Visible = true; |
| | | _series_line.Points.Clear(); |
| | | foreach (var curvePoint in _line_pt_list) |
| | | { |
| | | var seriesPoint = new SeriesPoint(curvePoint.X, curvePoint.Y); |
| | | _series_line.Points.Add(seriesPoint); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | _series_line.Points.Clear(); |
| | | _series_line.Visible = false; |
| | | } |
| | | |
| | | if (_point_pt_list != null && _point_pt_list.Any()) |
| | | { |
| | | _series_point.Points.Clear(); |
| | | for (int i = 0; i < _point_pt_list.Count; i++) |
| | | { |
| | | var definePoint = _point_pt_list[i]; |
| | | var seriesPoint = new SeriesPoint(definePoint.X, definePoint.Y); |
| | | seriesPoint.Tag = i; |
| | | _series_point.Points.Add(seriesPoint); |
| | | } |
| | | _series_point.Visible = true; |
| | | } |
| | | else |
| | | { |
| | | _series_point.Visible = false; |
| | | } |
| | | } |
| | | |
| | | #endregion Calc |
| | | |
| | | #region ChartEvent |
| | | |
| | | private SeriesPoint _pick_point = null;// 选中点 |
| | | |
| | | private void chartControl1_MouseDown(object sender, MouseEventArgs e) |
| | | { |
| | | if (!_initial_data) |
| | | return; |
| | | var hitInfo = chartControl1.CalcHitInfo(e.Location); |
| | | if (e.Button == MouseButtons.Left) |
| | | { |
| | | if (hitInfo.InSeriesPoint) |
| | | { |
| | | |
| | | _pick_point = hitInfo.SeriesPoint; |
| | | } |
| | | else |
| | | { |
| | | _pick_point = null; |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void chartControl1_MouseMove(object sender, MouseEventArgs e) |
| | | { |
| | | if (!_initial_data) |
| | | return; |
| | | if (!_mouse_mode) |
| | | return; |
| | | if (_pick_point == null) |
| | | return; |
| | | var diagramCoordinates = _diagram.PointToDiagram(e.Location); |
| | | var axisValue = diagramCoordinates.GetAxisValue(_axis_y); |
| | | if (axisValue == null) |
| | | return; |
| | | _pick_point.Values[0] = axisValue.NumericalValue; |
| | | _pick_point.NumericalArgument = diagramCoordinates.NumericalArgument; |
| | | } |
| | | |
| | | private void chartControl1_MouseUp(object sender, MouseEventArgs e) |
| | | { |
| | | if (!_initial_data) |
| | | return; |
| | | if (_mouse_mode) |
| | | { |
| | | _pick_point = null; |
| | | ChartUpdateCurve(); |
| | | } |
| | | } |
| | | |
| | | private void chartControl1_KeyUp(object sender, KeyEventArgs e) |
| | | { |
| | | if (!_initial_data) |
| | | return; |
| | | if (_pick_point == null) |
| | | return; |
| | | double spaceX = _coordinate.CoordSpaceX / 50; |
| | | double spaceY = 0; |
| | | |
| | | spaceY = _coordinate.CoordSpaceX / 50; |
| | | |
| | | double x = _pick_point.NumericalArgument; |
| | | double y = _pick_point.Values[0]; |
| | | if (e.KeyCode == Keys.Up) |
| | | { |
| | | y += spaceY; |
| | | } |
| | | else if (e.KeyCode == Keys.Down) |
| | | { |
| | | y -= spaceY; |
| | | } |
| | | else if (e.KeyCode == Keys.Left) |
| | | { |
| | | x -= spaceX; |
| | | } |
| | | else if (e.KeyCode == Keys.Right) |
| | | { |
| | | x += spaceX; |
| | | } |
| | | _pick_point.Values[0] = y; |
| | | _pick_point.NumericalArgument = x; |
| | | ChartUpdateCurve(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 更新曲线 |
| | | /// </summary> |
| | | private void ChartUpdateCurve() |
| | | { |
| | | _point_pt_list = _series_point.Points.Select(x => new Yw.Geometry.Point2d(x.ArgumentX.NumericalArgument, x.NumericalValue)).ToList(); |
| | | _line_pt_list = _point_pt_list.GetFitPointList(); |
| | | |
| | | _series_line.Points.Clear(); |
| | | foreach (var curvePoint in _line_pt_list) |
| | | { |
| | | var seriesPoint = new SeriesPoint(curvePoint.X, curvePoint.Y); |
| | | _series_line.Points.Add(seriesPoint); |
| | | } |
| | | DefinePointChangedEvent?.Invoke(_point_pt_list); |
| | | |
| | | CalcChartAxis(); |
| | | } |
| | | |
| | | #endregion ChartEvent |
| | | |
| | | #region Right Click Menu |
| | | |
| | | //#region Event |
| | | |
| | | //private void barCekChartEditMode_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) |
| | | //{ |
| | | // _mouseMode = this.barCekChartEditMode.Checked; |
| | | // var text = "修改模式:鼠标 / 键盘☑"; |
| | | // if (_mouseMode) |
| | | // { |
| | | // text = "修改模式:鼠标☑ / 键盘"; |
| | | // } |
| | | // _diagram.DefaultPane.Title.Text = text; |
| | | //} |
| | | |
| | | //private void BarBtnCalcCoordinate_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) |
| | | //{ |
| | | // CalcCoordinate(); |
| | | // CalcChartAxis(); |
| | | //} |
| | | |
| | | //private void barCekLegendVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) |
| | | //{ |
| | | // SetLegendVisible(this.barCekLegendVisible.Checked); |
| | | //} |
| | | |
| | | //private void barCekSetAxisNameVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) |
| | | //{ |
| | | // SetAxisNameVisible(this.barCekSetAxisNameVisible.Checked); |
| | | //} |
| | | |
| | | //private void barBtnSetChartAxis_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) |
| | | //{ |
| | | // SetChartAxis(); |
| | | //} |
| | | |
| | | //#endregion Event |
| | | |
| | | /// <summary> |
| | | /// 设置图例显示 |
| | | /// </summary> |
| | | public void SetLegendVisible(bool visible) |
| | | { |
| | | this.chartControl1.Legend.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置轴名称显示 |
| | | /// </summary> |
| | | public void SetAxisNameVisible(bool visible) |
| | | { |
| | | _axis_x.Title.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False; |
| | | _axis_y.Title.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置坐标轴 |
| | | /// </summary> |
| | | public void SetChartAxis() |
| | | { |
| | | //var dlg = new UniversalChartCoordinateDlg(); |
| | | //dlg.SetBindingData(_coordinate); |
| | | //dlg.OnChangedCoord += (rhs) => |
| | | //{ |
| | | // _coordinate = rhs; |
| | | // CalcChartAxis(); |
| | | // this.CoordinateChangedEvent?.Invoke(_coordinate); |
| | | //}; |
| | | //dlg.ShowDialog(); |
| | | } |
| | | |
| | | #endregion Right Click Menu |
| | | } |
| | | } |