duheng
2025-03-28 9be9ba4e159969fb5e32648c2c34e912ccc3ae6d
WinFrmUI/Yw.WinFrmUI.Phart.Core/02-universal/02-edit/UniversalEditChart.cs
@@ -17,17 +17,17 @@
        #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
@@ -63,7 +63,7 @@
                _axis_y.Title.Text = value;
            }
        }
        /// <summary>
        /// 鼠标模式
        /// </summary>
@@ -75,7 +75,7 @@
            }
            set
            {
                _mouse_mode = value;
                _mouse_mode = value;
            }
        }
@@ -93,9 +93,13 @@
        /// </summary>
        public event Action<List<Yw.Geometry.Point2d>> DefinePointChangedEvent;
        /// <summary>
        /// 选中点
        /// </summary>
        public event Action<int> SelectedPointIndexChangedEvent;
        #endregion 
        #region Initial
        #region Private Initial
        /// <summary>
        /// 初始化图表
@@ -114,122 +118,334 @@
            _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;
@@ -237,271 +453,46 @@
                _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
    }
}