using DevExpress.Utils; using DevExpress.XtraCharts; using DevExpress.XtraCharts.Native; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace IStation.WinFrmUI.Curve { /// /// /// public partial class MultiCurveExpressChart : DevExpress.XtraEditors.XtraUserControl { public MultiCurveExpressChart() { InitializeComponent(); InitialChart(); this.chartControl1.RuntimeHitTesting = true; } #region Private Variable private class CurrentViewModel { public long ID { get; set; } public string Name { get; set; } public Model.CurveExpress CurveExpressQH { get; set; } public Model.CurveExpress CurveExpressQE { get; set; } public Model.CurveExpress CurveExpressQP { get; set; } public List PointsQH { get; set; } public List PointsQE { get; set; } public List PointsQP { get; set; } public Color Color { get; set; } } private List _allCurves = new List(); private string _tagQH = "CurveQH", _tagQE = "CurveQE", _tagQP = "CurveQP"; private XYDiagram _mainChartDiagram; private XYDiagramPane _bottomPanel; private AxisX _axisXQ; private AxisY _axisYQH; private SecondaryAxisY _axisYQE, _axisYQP; private ConstantLine _workPointLine; private Model.CurveCoordinateParas _coordinateParas; private bool _isDisplayCurveQH = true; private bool _isDisplayCurveQP = true; private bool _isDisplayCurveQE = true; private bool _initialData = false; #endregion #region Public Variable /// /// 工作线是否可见 /// public bool LineVisible { get => _lineVisible; set { _lineVisible = value; this.barCekLineVisible.Checked = _lineVisible; } } private bool _lineVisible = false; #endregion #region Public Evnet public event Action OnCurveCoordinateParasChanged; public event Action OnCalcQueryPoint = null; #endregion #region Initial /// /// 初始化图表 /// private void InitialChart() { this.chartControl1.SetChartDisplay(); this.chartControl1.Legend.Direction = DevExpress.XtraCharts.LegendDirection.TopToBottom; _mainChartDiagram = (XYDiagram)chartControl1.Diagram; _bottomPanel = (XYDiagramPane)_mainChartDiagram.FindPaneByName("BottomPanel"); _axisXQ = _mainChartDiagram.AxisX; _axisXQ.SetAxisXQDisplay(); _axisYQH = _mainChartDiagram.AxisY; _axisYQH.SetAxisYQHDisplay(); _axisYQH.GridLines.Color = Color.DarkGray; _axisYQE = _mainChartDiagram.SecondaryAxesY.GetAxisByName("AxisYQE"); _axisYQE.SetSecondaryAxisYQEDisplay(); _axisYQE.GridLines.Color = Color.DarkGray; _axisYQP = _mainChartDiagram.SecondaryAxesY.GetAxisByName("AxisYQP"); _axisYQP.SetSecondaryAxisYQPDisplay(); _axisYQP.GridLines.Color = Color.DarkGray; _workPointLine = (ConstantLine)_mainChartDiagram.AxisX.ConstantLines.GetElementByName("WorkPointLine"); _workPointLine.SetWorkPointLineDisplay(); _axisXQ.Visibility = DefaultBoolean.False; _axisXQ.GridLines.Visible = false; _axisYQH.Visibility = DefaultBoolean.False; _axisYQH.GridLines.Visible = false; _axisYQE.Visibility = DefaultBoolean.False; _axisYQE.GridLines.Visible = false; _axisYQP.Visibility = DefaultBoolean.False; _axisYQP.GridLines.Visible = false; _workPointLine.Visible = false; this.chartControl1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chartControl1_MouseMove); this.chartControl1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.chartControl1_MouseUp); this.chartControl1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chartControl1_MouseDown); } /// /// 初始化图表数据 /// public void InitialChartData() { _initialData = false; _coordinateParas = null; UpdateChart(false); } #endregion /// /// 添加曲线 /// /// /// /// /// /// /// /// /// public void AddCurve(long id, string name, Model.CurveExpress curveQH, Model.CurveExpress curveQE, Model.CurveExpress curveQP, Color color, List definePointsQH = null, List definePointsQE = null, List definePointsQP = null) { if (curveQH == null) return; if (_allCurves.Exists(x => x.ID == id)) return; _initialData = true; CurrentViewModel curve = new CurrentViewModel(); curve.ID = id; curve.Name = name; curve.CurveExpressQH = curveQH; curve.CurveExpressQE = curveQE; curve.CurveExpressQP = curveQP; if (definePointsQH == null) { curve.PointsQH = curveQH.GetFitPoints(); } else { curve.PointsQH = definePointsQH; } if (curveQE != null && definePointsQE == null) { curve.PointsQE = curveQE.GetFitPoints(); } else { curve.PointsQE = definePointsQE; } if (curveQP != null && definePointsQP == null) { curve.PointsQP = curveQP.GetFitPoints(); } else { curve.PointsQP = definePointsQP; } curve.Color = color; _allCurves.Add(curve); UpdateChart(true); } /// /// 设置曲线 /// /// /// public void SetCurve(long id, Color color) { var exist = _allCurves.FirstOrDefault(x => x.ID == id); if (exist == null) return; foreach (Series series in this.chartControl1.Series) { var tag = series.Tag; if (tag == null) continue; if (tag.ToString() != exist.ID.ToString()) continue; series.View.Color = color; } } /// /// 设置曲线 /// /// /// public void SetCurve(long id, Model.CurveExpress curveQH, Model.CurveExpress curveQE, Model.CurveExpress curveQP) { var exist = _allCurves.FirstOrDefault(x => x.ID == id); if (exist == null) return; exist.CurveExpressQH = curveQH; exist.CurveExpressQE = curveQE; exist.CurveExpressQP = curveQP; exist.PointsQH = Model.FitCurveHelper.GetFitPoints(curveQH, 12); exist.PointsQE = Model.FitCurveHelper.GetFitPoints(curveQE, 12); exist.PointsQP = Model.FitCurveHelper.GetFitPoints(curveQP, 12); } /// /// 删除曲线 /// /// public void DeleteCurve(long id) { var exist = _allCurves.FirstOrDefault(x => x.ID == id); if (exist == null) return; _allCurves.Remove(exist); UpdateChart(true); } /// /// 更新图表 /// /// 计算坐标 public void UpdateChart(bool calcCoordinate = false) { if (calcCoordinate || _coordinateParas == null) { //不强迫计算,就用上次更新的坐标系 CalcCoordinate(); } CalcSeries(); CalcChartAxis(this.barCekSetSplitPanel.Checked); CalcWorkPointByQ(); } #region Calc private double _minQ, _maxQ; private double _maxH = 0, _minH = 10000; private double _maxE = 0, _minE = 0; private double _maxP = 0, _minP = 1000; /// /// 计算坐标 /// private void CalcCoordinate() { if (_allCurves == null || !_allCurves.Any()) { //设置成白板坐标 _coordinateParas = new Model.CurveCoordinateParas(); _coordinateParas.GridNumberX = 30; _coordinateParas.GridNumberY = 16; //显示的坐标线号 _coordinateParas.StartLineNoH = 10; _coordinateParas.EndLineNoH = 15; _coordinateParas.StartLineNoE = 0; _coordinateParas.EndLineNoE = 10; _coordinateParas.StartLineNoP = 2; _coordinateParas.EndLineNoP = 9; //坐标最小值和间隔 _coordinateParas.CoordMinQ = 0; _coordinateParas.CoordSpaceQ = 1000; _coordinateParas.CoordMinH = 10; _coordinateParas.CoordSpaceH = 100; _coordinateParas.CoordMinE = 0; _coordinateParas.CoordSpaceE = 100; _coordinateParas.CoordMinP = 10; _coordinateParas.CoordSpaceP = 100; return; } _maxQ = 0; _minQ = 10000; _maxH = 0; _minH = 10000; _maxE = 0; _minE = 0; _maxP = 0; _minP = 1000; double _scaleMinH = 1, _scaleMaxH = 1; foreach (var curve in _allCurves) { var xxx = curve.PointsQH.Select(x => x.X); var yyy = curve.PointsQH.Select(x => x.Y); _minQ = Math.Min(_minQ, xxx.Min()); _maxQ = Math.Max(_maxQ, xxx.Max()); _minH = Math.Min(_minH, yyy.Min()); _maxH = Math.Max(_maxH, yyy.Max()); } foreach (CurrentViewModel info in _allCurves) { var yyy = info.PointsQE.Select(x => x.Y); _maxE = Math.Max(_maxE, yyy.Max()); } foreach (CurrentViewModel info in _allCurves) { var yyy = info.PointsQP.Select(x => x.Y); _minP = Math.Min(_minP, yyy.Min()); _maxP = Math.Max(_maxP, yyy.Max()); } _coordinateParas = Model.CurveCoordinateParas.CalcCoordinate(_minQ, _maxQ, _minH * _scaleMinH, _maxH * _scaleMaxH, _minE, _maxE, _minP, _maxP); if (_coordinateParas == null) return; if (_coordinateParas.CoordMinQ + _coordinateParas.CoordSpaceQ * this._coordinateParas.GridNumberX < _maxQ * 1.05) { _coordinateParas.GridNumberX++; } } /// /// 计算图表轴 /// private void CalcChartAxis(bool splitPanel) { if (_coordinateParas == null) { _axisXQ.Visibility = DefaultBoolean.False; _axisXQ.GridLines.Visible = false; _axisYQH.Visibility = DefaultBoolean.False; _axisYQH.GridLines.Visible = false; _axisYQE.Visibility = DefaultBoolean.False; _axisYQE.GridLines.Visible = false; _axisYQP.Visibility = DefaultBoolean.False; _axisYQP.GridLines.Visible = false; _workPointLine.Visible = false; _bottomPanel.Visibility = ChartElementVisibility.Hidden; return; } _bottomPanel.Visibility = splitPanel ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden; //计算刻度 Q var axisQLabels = new List(); var disQ = _coordinateParas.CoordMinQ; for (int i = 0; i < _coordinateParas.GridNumberX + 1; i++) { axisQLabels.Add(new CustomAxisLabel(disQ.ToString("N0"), disQ)); disQ = disQ + _coordinateParas.CoordSpaceQ; } _axisXQ.CustomLabels.Clear(); _axisXQ.CustomLabels.AddRange(axisQLabels.ToArray()); _axisXQ.Visibility = DefaultBoolean.True; _axisXQ.GridLines.Visible = true; //计算刻度 var axisQHLabels = new List(); var disH = _coordinateParas.CoordMinH + _coordinateParas.CoordSpaceH * _coordinateParas.StartLineNoH; for (int i = _coordinateParas.StartLineNoH; i < _coordinateParas.EndLineNoH + 1; i++) { axisQHLabels.Add(new CustomAxisLabel(disH.ToString(), disH)); disH = disH + _coordinateParas.CoordSpaceH; } _axisYQH.CustomLabels.Clear(); _axisYQH.CustomLabels.AddRange(axisQHLabels.ToArray()); _axisYQH.Visibility = DefaultBoolean.True; _axisYQH.GridLines.Visible = true; //效率 if (_maxE > _minE) { //计算刻度 var axisQELabels = new List(); var disE = _coordinateParas.CoordMinE + _coordinateParas.CoordSpaceE * _coordinateParas.StartLineNoE; for (int i = _coordinateParas.StartLineNoE; i < _coordinateParas.EndLineNoE + 1; i++) { axisQELabels.Add(new CustomAxisLabel(disE.ToString(), disE)); disE = disE + _coordinateParas.CoordSpaceE; } _axisYQE.CustomLabels.Clear(); _axisYQE.CustomLabels.AddRange(axisQELabels.ToArray()); _axisYQE.Visibility = DefaultBoolean.True; _axisYQE.GridLines.Visible = true; } //功率 if (_maxP > _minP) { //计算刻度 var axisQPLabels = new List(); double disP = _coordinateParas.CoordMinP + _coordinateParas.CoordSpaceP * _coordinateParas.StartLineNoP; for (int i = _coordinateParas.StartLineNoP; i < _coordinateParas.EndLineNoP + 1; i++) { axisQPLabels.Add(new CustomAxisLabel(disP.ToString(), disP)); disP = disP + _coordinateParas.CoordSpaceP; } _axisYQP.CustomLabels.Clear(); _axisYQP.CustomLabels.AddRange(axisQPLabels.ToArray()); _axisYQP.Visibility = DefaultBoolean.True; _axisYQP.GridLines.Visible = true; } if (splitPanel) { var gridNumH = _coordinateParas.EndLineNoH - _coordinateParas.StartLineNoH; var gridNumE = _coordinateParas.EndLineNoE - _coordinateParas.StartLineNoE; int gridNumUp = Math.Max(gridNumH, gridNumE) + 2;//多两条 var maxAxisH = _coordinateParas.CoordMinH + _coordinateParas.EndLineNoH * _coordinateParas.CoordSpaceH; var minAxisH = maxAxisH - gridNumUp * _coordinateParas.CoordSpaceH; _axisYQH.SetAxisRange(minAxisH, maxAxisH); var minAxisE = _coordinateParas.CoordMinE + _coordinateParas.StartLineNoE * _coordinateParas.CoordSpaceE; var maxAxisE = minAxisE + gridNumUp * _coordinateParas.CoordSpaceE; _axisYQE.SetAxisRange(minAxisE, maxAxisE); var gridNumP = _coordinateParas.EndLineNoP - _coordinateParas.StartLineNoP; var minAxisP = _coordinateParas.CoordMinP + _coordinateParas.StartLineNoP * _coordinateParas.CoordSpaceP; var maxAxisP = minAxisP + gridNumP * _coordinateParas.CoordSpaceP; _axisYQP.SetAxisRange(minAxisP, maxAxisP); } else { _axisXQ.SetAxisRange(_coordinateParas.CoordMinQ, _coordinateParas.CoordMinQ + _coordinateParas.GridNumberX * _coordinateParas.CoordSpaceQ); _axisYQH.SetAxisRange(_coordinateParas.CoordMinH, _coordinateParas.CoordMinH + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceH); _axisYQE.SetAxisRange(_coordinateParas.CoordMinE, _coordinateParas.CoordMinE + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceE); _axisYQP.SetAxisRange(_coordinateParas.CoordMinP, _coordinateParas.CoordMinP + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceP); } foreach (Series series in this.chartControl1.Series) { if (!series.Name.Contains("QP")) continue; if (series.View is SplineSeriesView view) { if (splitPanel) { view.Pane = _bottomPanel; } else { view.Pane = _mainChartDiagram.DefaultPane; } } } } /// /// 计算系列 /// private void CalcSeries() { this.chartControl1.BeginInit(); this.chartControl1.Series.Clear(); this.chartControl1.Legend.CustomItems.Clear(); foreach (var curve in _allCurves) { CreateSeries(curve); } this.chartControl1.EndInit(); } /// /// 计算工作点 /// /// public void CalcWorkPointByQ(double? workQ = null) { if (!_lineVisible) { _mainChartDiagram.DefaultPane.Title.Text = "*"; _workPointLine.Visible = false; _workPointLine.Title.Visible = false; return; } else { _workPointLine.Visible = true; _workPointLine.Title.Visible = true; } if (_allCurves == null || !_allCurves.Any()) return; if (workQ == null) { workQ = (_minQ + _maxQ) / 2; } if (workQ < _minQ || workQ > _maxQ) return; foreach (var curve in _allCurves) { var curveMinQ = curve.CurveExpressQH.Min; var curveMaxQ = curve.CurveExpressQH.Max; if (curveMinQ > workQ.Value || workQ.Value > curveMaxQ) continue; var workPoint = new Model.GroupPoint(0, workQ.Value, 0, 0, 0); workPoint.H = Common.FitCurveHelper.GetFitPointY(curve.CurveExpressQH, workQ.Value); var workInfoStringBuilder = new StringBuilder(); workInfoStringBuilder.AppendFormat("流量:{0:N1} 扬程:{1:N1}", workPoint.Q, workPoint.H); if (curve.CurveExpressQE != null) { workPoint.E = Model.FitCurveHelper.GetFitPointY(curve.CurveExpressQE, workPoint.Q); workInfoStringBuilder.AppendFormat(" 效率:{0:N1}", workPoint.E); } if (curve.CurveExpressQP != null) { workPoint.P = Model.FitCurveHelper.GetFitPointY(curve.CurveExpressQP, workPoint.Q); workInfoStringBuilder.AppendFormat(" 功率:{0:N1}", workPoint.P); } if (curve.ID == -1) { _mainChartDiagram.DefaultPane.Title.Text = workInfoStringBuilder.ToString(); } else { if (OnCalcQueryPoint != null) { OnCalcQueryPoint(curve.ID, workPoint); } } } _workPointLine.AxisValue = workQ; _workPointLine.Title.Text = workQ.Value.ToString("N1"); } /// /// 创建系列 /// private void CreateSeries(CurrentViewModel curve) { var seriesCurveQH = new DevExpress.XtraCharts.Series(); seriesCurveQH.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; seriesCurveQH.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; seriesCurveQH.Name = _tagQH + curve.ID.ToString(); seriesCurveQH.ShowInLegend = false; seriesCurveQH.CrosshairEnabled = DefaultBoolean.False; seriesCurveQH.Tag = curve.ID.ToString(); seriesCurveQH.ShowInLegend = true; seriesCurveQH.LegendTextPattern = curve.Name; var seriesCurveQHView = new DevExpress.XtraCharts.SplineSeriesView(); seriesCurveQHView.LineStyle.Thickness = 2; seriesCurveQHView.Color = curve.Color; seriesCurveQH.SeriesPointsSorting = SortingMode.None; seriesCurveQH.SeriesPointsSortingKey = SeriesPointKey.Value_1; seriesCurveQH.View = seriesCurveQHView; seriesCurveQH.Visible = _isDisplayCurveQH; var pointsQH = Model.FitCurveHelper.GetFitPoints(curve.CurveExpressQH, 12); for (int i = 0; i < pointsQH.Count; i++) { seriesCurveQH.Points.Add(new SeriesPoint(pointsQH[i].X, new double[] { pointsQH[i].Y })); } this.chartControl1.Series.Add(seriesCurveQH); if (curve.CurveExpressQE != null) { var seriesCurveQE = new DevExpress.XtraCharts.Series(); seriesCurveQE.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; seriesCurveQE.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; seriesCurveQE.Name = _tagQE + curve.ID.ToString(); seriesCurveQE.ShowInLegend = false; seriesCurveQE.CrosshairEnabled = DefaultBoolean.False; seriesCurveQE.Tag = curve.ID.ToString(); var seriesCurveQEView = new DevExpress.XtraCharts.SplineSeriesView(); seriesCurveQEView.LineStyle.Thickness = 2; seriesCurveQEView.Color = curve.Color; seriesCurveQEView.AxisY = _axisYQE; seriesCurveQE.SeriesPointsSorting = SortingMode.None; seriesCurveQE.SeriesPointsSortingKey = SeriesPointKey.Value_1; seriesCurveQE.View = seriesCurveQEView; seriesCurveQE.Visible = _isDisplayCurveQE; var pointsQE = Model.FitCurveHelper.GetFitPoints(curve.CurveExpressQE, 12); for (int i = 0; i < pointsQE.Count; i++) { seriesCurveQE.Points.Add(new SeriesPoint(pointsQE[i].X, new double[] { pointsQE[i].Y })); } this.chartControl1.Series.Add(seriesCurveQE); } if (curve.CurveExpressQP != null) { var seriesCurveQP = new DevExpress.XtraCharts.Series(); seriesCurveQP.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; seriesCurveQP.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; seriesCurveQP.Name = _tagQP + curve.ID.ToString(); seriesCurveQP.ShowInLegend = false; seriesCurveQP.CrosshairEnabled = DefaultBoolean.False; seriesCurveQP.Tag = curve.ID.ToString(); var seriesCurveQPView = new DevExpress.XtraCharts.SplineSeriesView(); seriesCurveQPView.LineStyle.Thickness = 2; seriesCurveQPView.Color = curve.Color; seriesCurveQPView.AxisY = _axisYQP; seriesCurveQP.SeriesPointsSorting = SortingMode.None; seriesCurveQP.SeriesPointsSortingKey = SeriesPointKey.Value_1; seriesCurveQP.View = seriesCurveQPView; seriesCurveQP.Visible = _isDisplayCurveQP; var pointsQP = Model.FitCurveHelper.GetFitPoints(curve.CurveExpressQP, 12); for (int i = 0; i < pointsQP.Count; i++) { seriesCurveQP.Points.Add(new SeriesPoint(pointsQP[i].X, new double[] { pointsQP[i].Y })); } this.chartControl1.Series.Add(seriesCurveQP); } } #endregion #region ChartEvent // 右键对象 private object _rightClickObj = null; private bool _onMoveWorkPointLine = false; private void chartControl1_MouseDown(object sender, MouseEventArgs e) { if (!_initialData) return; var hitInfo = chartControl1.CalcHitInfo(e.Location); if (e.Button == MouseButtons.Left) { if (hitInfo.InSeries) { _rightClickObj = hitInfo.Series; } else if (hitInfo.InAxis) { _rightClickObj = hitInfo.Axis; } else if (hitInfo.InConstantLine) { if (hitInfo.ConstantLine == _workPointLine) { _onMoveWorkPointLine = true; } } else if (hitInfo.InAnnotation) { _rightClickObj = hitInfo.Annotation; } else { _rightClickObj = null; } } else if (e.Button == MouseButtons.Right) { if (hitInfo.InConstantLine) { this.popMenuLine.ShowPopup(MousePosition); } else { this.popMenuChart.ShowPopup(MousePosition); } } } private void chartControl1_MouseMove(object sender, MouseEventArgs e) { if (!_initialData) return; if (_onMoveWorkPointLine) { var diagramCoordinates = _mainChartDiagram.PointToDiagram(e.Location); var axisValue = diagramCoordinates.GetAxisValue(_axisXQ); if (axisValue == null) return; double chartQ = axisValue.NumericalValue; CalcWorkPointByQ(chartQ); } } private void chartControl1_MouseUp(object sender, MouseEventArgs e) { if (!_initialData) return; _onMoveWorkPointLine = false; } #endregion #region Right Click Menu #region Event private void barBtnSetAxisQValue_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (_allCurves == null || !_allCurves.Any()) return; var dlg = new AxisValueDlg(); dlg.SetBindingData(); dlg.VerifyValueChanged += (value) => { if (value < _minQ || value > _maxQ) return false; CalcWorkPointByQ(value); return true; }; dlg.ShowDialog(); } private void barCekLineVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { SetLineVisible(this.barCekLineVisible.Checked); } 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 barCekSetSplitPanel_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { CalcChartAxis(this.barCekSetSplitPanel.Checked); } private void barBtnSetChartAxis_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { SetChartAxis(); } private void barCekCurveQHVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { _isDisplayCurveQH = this.barCekCurveQHVisible.Checked; CalcSeries(); } private void barCekCurveQEVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { _isDisplayCurveQE = this.barCekCurveQEVisible.Checked; CalcSeries(); } private void barCekCurveQPVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { _isDisplayCurveQP = this.barCekCurveQPVisible.Checked; CalcSeries(); } #endregion /// /// 设置工作点显示 /// public void SetLineVisible(bool visible) { if (!_initialData) return; _lineVisible = visible; CalcWorkPointByQ(); } /// /// 设置图例显示 /// public void SetLegendVisible(bool visible) { this.chartControl1.Legend.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False; } /// /// 设置轴名称显示 /// public void SetAxisNameVisible(bool visible) { _axisXQ.Title.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False; _axisYQH.Title.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False; _axisYQE.Title.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False; _axisYQP.Title.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False; } /// /// 设置坐标轴 /// public void SetChartAxis() { var dlg = new ChartCoordinateDlg(); dlg.SetBindingData(_coordinateParas); dlg.OnChangedCoord += (rhs) => { _coordinateParas = rhs; CalcChartAxis(this.barCekSetSplitPanel.Checked); this.OnCurveCoordinateParasChanged?.Invoke(_coordinateParas); }; dlg.ShowDialog(); } #endregion } }