using DevExpress.Utils; using DevExpress.XtraCharts; using DevExpress.XtraCharts.Native; using NPOI.SS.Formula.Functions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using static NPOI.SS.Formula.PTG.ArrayPtg; namespace IStation.WinFrmUI.Curve { /// /// /// public partial class CurveExpressChart_NotSplitPanel : DevExpress.XtraEditors.XtraUserControl { public CurveExpressChart_NotSplitPanel() { InitializeComponent(); InitialChart(); } #region Private Variable private XYDiagram _mainChartDiagram; private AxisX _axisXQ; private AxisY _axisYQH; private SecondaryAxisY _axisYQE, _axisYQP; private ConstantLine _workPointLine; private ConstantLine _workHLine; private Series _seriesCurveQH, _seriesCurveQE, _seriesCurveQP; private Series _seriesPointQH, _seriesPointQE, _seriesPointQP; private Model.CurveExpress _curveExpressQH; private Model.CurveExpress _curveExpressQE; private Model.CurveExpress _curveExpressQP; private List _curvePointsQH; private List _curvePointsQE; private List _curvePointsQP; private List _definePointsQH; private List _definePointsQE; private List _definePointsQP; private Model.CurveCoordinateParas _coordinateParas; private Model.GroupPoint _workPoint = new Model.GroupPoint(0, 0, 0, 0, 0); private bool _initialData = false; #endregion #region Public Variable /// /// 定义点是否可见 /// public bool DefinePointVisible { get => _definePointVisible; set { _definePointVisible = value; SetDefinePointVisible(_definePointVisible); } } private bool _definePointVisible = false; /// /// 工作线是否可见 /// public bool LineVisible { get => _lineVisible; set { _lineVisible = value; this.barCekLineVisible.Checked = LineVisible; } } private bool _lineVisible = false; #endregion #region Public Evnet public event Action OnCurveCoordinateParasChanged; #endregion #region Initial /// /// 初始化图表 /// private void InitialChart() { this.chartControl1.SetChartDisplay(); this.chartControl1.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False; _mainChartDiagram = (XYDiagram)chartControl1.Diagram; _axisXQ = _mainChartDiagram.AxisX; _axisXQ.SetAxisXQDisplay(); _axisYQH = _mainChartDiagram.AxisY; _axisYQH.SetAxisYQHDisplay(); _axisYQE = _mainChartDiagram.SecondaryAxesY.GetAxisByName("AxisYQE"); _axisYQE.SetSecondaryAxisYQEDisplay(); _axisYQP = _mainChartDiagram.SecondaryAxesY.GetAxisByName("AxisYQP"); _axisYQP.SetSecondaryAxisYQPDisplay(); _workPointLine = (ConstantLine)_mainChartDiagram.AxisX.ConstantLines.GetElementByName("WorkPointLine"); _workPointLine.SetWorkPointLineDisplay(); _workHLine = (ConstantLine)_mainChartDiagram.AxisY.ConstantLines.GetElementByName("WorkHLine"); _workHLine.SetWorkHLineDisplay(); _seriesCurveQH = this.chartControl1.GetSeriesByName("SeriesCurveQH"); _seriesCurveQH.SetCurveQHDisplay(); _seriesCurveQE = this.chartControl1.GetSeriesByName("SeriesCurveQE"); _seriesCurveQE.SetCurveQEDisplay(); _seriesCurveQP = this.chartControl1.GetSeriesByName("SeriesCurveQP"); _seriesCurveQP.SetCurveQPDisplay(); _seriesPointQH = this.chartControl1.GetSeriesByName("SeriesPointQH"); _seriesPointQH.SetPointQHDisplay(); _seriesPointQE = this.chartControl1.GetSeriesByName("SeriesPointQE"); _seriesPointQE.SetPointQEDisplay(); _seriesPointQP = this.chartControl1.GetSeriesByName("SeriesPointQP"); _seriesPointQP.SetPointQPDisplay(); _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; _workHLine.Visible = false; _seriesPointQH.Visible = false; _seriesPointQE.Visible = false; _seriesPointQP.Visible = false; this.chartControl1.ObjectHotTracked += new DevExpress.XtraCharts.HotTrackEventHandler(this.chartControl1_ObjectHotTracked); 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; _curveExpressQH = null; _curveExpressQE = null; _curveExpressQP = null; _curvePointsQH = null; _curvePointsQE = null; _curvePointsQP = null; _definePointsQH = null; _definePointsQE = null; _definePointsQP = null; _coordinateParas = null; _workPoint = new Model.GroupPoint(0, 0, 0, 0, 0); UpdateChart(false); } #endregion /// /// /// /// /// /// /// /// /// /// /// /// /// public void SetBindingData( Model.CurveExpress curveQH, Model.CurveExpress curveQE, Model.CurveExpress curveQP, List definePointsQH = null, List definePointsQE = null, List definePointsQP = null, Model.CurveCoordinateParas coordinateParas = null, bool calcCoordinate = false) { if (curveQH == null) { InitialChartData(); return; } _initialData = true; _curveExpressQH = curveQH; _curveExpressQE = curveQE; _curveExpressQP = curveQP; _curvePointsQH = Model.FitCurveHelper.GetFitPoints(_curveExpressQH, 12); _curvePointsQE = Model.FitCurveHelper.GetFitPoints(_curveExpressQE, 12); _curvePointsQP = Model.FitCurveHelper.GetFitPoints(_curveExpressQP, 12); _definePointsQH = definePointsQH; _definePointsQE = definePointsQE; _definePointsQP = definePointsQP; _coordinateParas = coordinateParas; UpdateChart(calcCoordinate); } /// /// 更新图表 /// /// 计算坐标 public void UpdateChart(bool calcCoordinate = false) { if (_curveExpressQE == null) { this.barBtnPositioningMaxE.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; } else { this.barBtnPositioningMaxE.Visibility = DevExpress.XtraBars.BarItemVisibility.Always; } if (_curveExpressQP == null) { } else { } if (_curveExpressQH == null) return; if (calcCoordinate || _coordinateParas == null) { //不强迫计算,就用上次更新的坐标系 CalcCoordinate(); } CalcChartAxis(); CalcSeries(); CalcWorkPointByQ(); } #region Calc /// /// 计算坐标 /// public void CalcCoordinate() { if (_curvePointsQH == null || _curvePointsQH.Count < 4) { //设置成白板坐标 _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; } _coordinateParas = Model.CurveCoordinateParas.CalcCoordinate(_curveExpressQH, _curveExpressQE, _curveExpressQP); } /// /// 计算图表轴 /// public void CalcChartAxis() { 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; _workHLine.Visible = false; return; } //流量 if (_curvePointsQH != null) { //计算刻度 var labels = new List(); var disQ = _coordinateParas.CoordMinQ; for (int i = 0; i < _coordinateParas.GridNumberX + 1; i++) { labels.Add(new CustomAxisLabel(disQ.ToString("N0"), disQ)); disQ = disQ + _coordinateParas.CoordSpaceQ; } //坐标刻度 _axisXQ.CustomLabels.Clear(); _axisXQ.CustomLabels.AddRange(labels.ToArray()); _axisXQ.Visibility = DefaultBoolean.True; _axisXQ.GridLines.Visible = true; _axisXQ.SetAxisRange(_coordinateParas.CoordMinQ, _coordinateParas.CoordMinQ + _coordinateParas.GridNumberX * _coordinateParas.CoordSpaceQ); } //扬程 if (_curvePointsQH != null) { //计算刻度 var labels = new List(); var disH = _coordinateParas.CoordMinH + _coordinateParas.CoordSpaceH * _coordinateParas.StartLineNoH; disH -= 1; for (int i = _coordinateParas.StartLineNoH; i < _coordinateParas.EndLineNoH + 2; i++) { labels.Add(new CustomAxisLabel(disH.ToString(), disH)); disH = disH + _coordinateParas.CoordSpaceH; } _axisYQH.CustomLabels.Clear(); _axisYQH.CustomLabels.AddRange(labels.ToArray()); _axisYQH.Visibility = DefaultBoolean.True; _axisYQH.GridLines.Visible = true; if (_curveExpressQE == null && _curveExpressQP == null) { _axisYQH.SetAxisRange(_coordinateParas.DispMinH(), _coordinateParas.DispMaxH()); } else { _axisYQH.SetAxisRange(_coordinateParas.CoordMinH, _coordinateParas.CoordMinH + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceH); } } //效率 if (_curvePointsQE != null) { //计算刻度 var labels = new List(); var disE = _coordinateParas.CoordMinE + _coordinateParas.CoordSpaceE * _coordinateParas.StartLineNoE; for (int i = _coordinateParas.StartLineNoE; i < _coordinateParas.EndLineNoE + 1; i++) { labels.Add(new CustomAxisLabel(disE.ToString(), disE)); disE = disE + _coordinateParas.CoordSpaceE; } _axisYQE.CustomLabels.Clear(); _axisYQE.CustomLabels.AddRange(labels.ToArray()); _axisYQE.Visibility = DefaultBoolean.True; _axisYQE.GridLines.Visible = true; _axisYQE.SetAxisRange(_coordinateParas.CoordMinE, _coordinateParas.CoordMinE + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceE); } //功率 if (_curvePointsQP != null) { //计算刻度 var labels = new List(); double disP = _coordinateParas.CoordMinP + _coordinateParas.CoordSpaceP * _coordinateParas.StartLineNoP; for (int i = _coordinateParas.StartLineNoP; i < _coordinateParas.EndLineNoP + 1; i++) { labels.Add(new CustomAxisLabel(disP.ToString(), disP)); disP = disP + _coordinateParas.CoordSpaceP; } _axisYQP.CustomLabels.Clear(); _axisYQP.CustomLabels.AddRange(labels.ToArray()); _axisYQP.SetAxisRange(_coordinateParas.CoordMinP, _coordinateParas.CoordMinP + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceP); _axisYQP.Visibility = DefaultBoolean.True; _axisYQP.GridLines.Visible = true; } } /// /// 计算系列 /// public void CalcSeries() { if (_curvePointsQH != null && _curvePointsQH.Count > 3) { _seriesCurveQH.Visible = true; _seriesCurveQH.Points.Clear(); foreach (var curvePoint in _curvePointsQH) { var seriesPoint = new SeriesPoint(curvePoint.X, curvePoint.Y); _seriesCurveQH.Points.Add(seriesPoint); } } else { _seriesCurveQH.Points.Clear(); _seriesCurveQH.Visible = false; _workPointLine.Visible = false; _workHLine.Visible = false; } if (_curvePointsQE != null && _curvePointsQE.Count > 3) { _seriesCurveQE.Visible = true; _seriesCurveQE.Points.Clear(); foreach (var curvePoint in _curvePointsQE) { var seriesPoint = new SeriesPoint(curvePoint.X, curvePoint.Y); _seriesCurveQE.Points.Add(seriesPoint); } } else { _seriesCurveQE.Points.Clear(); _seriesCurveQE.Visible = false; } if (_curvePointsQP != null && _curvePointsQP.Count > 3) { _seriesCurveQP.Visible = true; _seriesCurveQP.Points.Clear(); foreach (var curvePoint in _curvePointsQP) { var seriesPoint = new SeriesPoint(curvePoint.X, curvePoint.Y); _seriesCurveQP.Points.Add(seriesPoint); } } else { _seriesCurveQP.Points.Clear(); _seriesCurveQP.Visible = false; } if (_definePointsQH != null && _definePointsQH.Any()) { _seriesPointQH.Points.Clear(); foreach (var definePoint in _definePointsQH) { var seriesPoint = new SeriesPoint(definePoint.X, definePoint.Y); _seriesPointQH.Points.Add(seriesPoint); } } if (_definePointsQE != null && _definePointsQE.Any()) { _seriesPointQE.Points.Clear(); foreach (var definePoint in _definePointsQE) { var seriesPoint = new SeriesPoint(definePoint.X, definePoint.Y); _seriesPointQE.Points.Add(seriesPoint); } } if (_definePointsQP != null && _definePointsQP.Any()) { _seriesPointQP.Points.Clear(); foreach (var definePoint in _definePointsQP) { var seriesPoint = new SeriesPoint(definePoint.X, definePoint.Y); _seriesPointQP.Points.Add(seriesPoint); } } } /// /// 计算工作点 /// /// public void CalcWorkPointByQ(double? workQ = null) { if (!_lineVisible) { _mainChartDiagram.DefaultPane.Title.Text = "*"; _workHLine.Visible = false; _workHLine.Title.Visible = false; _workPointLine.Visible = false; _workPointLine.Title.Visible = false; return; } else { _workHLine.Visible = true; _workHLine.Title.Visible = true; _workPointLine.Visible = true; _workPointLine.Title.Visible = true; } if (_curveExpressQH == null) return; var minQ = _curvePointsQH.Min(x => x.X); var maxQ = _curvePointsQH.Max(x => x.X); if (workQ == null) { workQ = (minQ + maxQ) / 2; } else { if (workQ < minQ || workQ > maxQ) return; } _workPoint.Q = workQ.Value; _workPoint.H = Model.FitCurveHelper.GetFitPointY(_curveExpressQH, _workPoint.Q); var workInfoStringBuilder = new StringBuilder(); workInfoStringBuilder.AppendFormat("流量:{0:N1} 扬程:{1:N1}", _workPoint.Q, _workPoint.H); if (_curveExpressQE != null) { _workPoint.E = Model.FitCurveHelper.GetFitPointY(_curveExpressQE, _workPoint.Q); workInfoStringBuilder.AppendFormat(" 效率:{0:N1}", _workPoint.E); } if (_curveExpressQP != null) { _workPoint.P = Model.FitCurveHelper.GetFitPointY(_curveExpressQP, _workPoint.Q); workInfoStringBuilder.AppendFormat(" 功率:{0:N1}", _workPoint.P); } _workPointLine.AxisValue = _workPoint.Q; _workPointLine.Title.Text = _workPoint.Q.ToString("N1"); _workHLine.AxisValue = _workPoint.H; _workHLine.Title.Text = _workPoint.H.ToString("N1"); //测试展示效果 _mainChartDiagram.DefaultPane.Title.Text = workInfoStringBuilder.ToString(); } /// /// 根据扬程计算工作点 /// /// /// /// public void CalcWorkPointByH(double workH) { if (!_lineVisible) return; if (_curveExpressQH == null) return; var minH = _curvePointsQH.Min(x => x.Y); var maxH = _curvePointsQH.Max(x => x.Y); if (workH < minH || workH > maxH) return; var InterPoints = Model.FitCurveHelper.GetInterPointX(_curveExpressQH, workH); if (InterPoints == null || InterPoints.Count == 0) return; var workQ = InterPoints.Last().X; CalcWorkPointByQ(workQ); } /// /// 根据最大效率计算工作点 /// /// /// /// public void CalcWorkPointByMaxE() { if (!_lineVisible) return; if (_curveExpressQE == null) return; var maxE = Model.FitCurveHelper.GetMaxPoint(_curveExpressQE); var workQ = maxE.X; CalcWorkPointByQ(workQ); } /// /// 根据最大流量计算工作点 /// /// /// /// public void CalcWorkPointByMaxQ() { if (!_lineVisible) return; if (_curveExpressQH == null) return; var workQ = _curveExpressQH.Max; CalcWorkPointByQ(workQ); } #endregion #region ChartEvent // 右键对象 private object _rightClickObj = null; ToolTipController toolTip = new ToolTipController(); private void chartControl1_ObjectHotTracked(object sender, HotTrackEventArgs e) { if (!_initialData) return; if (e.AdditionalObject is SeriesPoint seriesPoint) { var tip = string.Format("X:{0:N1} Y:{1:N1}", seriesPoint.Argument, seriesPoint.Values[0]); toolTip.ShowHint(tip); } else { toolTip.HideHint(); } } private bool _onMoveWorkPointLine = false; private bool _onMoveWorkHLine = 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.ConstantLine == _workHLine) { _onMoveWorkHLine = 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); } else if (_onMoveWorkHLine) { var diagramCoordinates = _mainChartDiagram.PointToDiagram(e.Location); var axisValue = diagramCoordinates.GetAxisValue(_axisYQH); double chartH = axisValue.NumericalValue; if (axisValue == null) return; CalcWorkPointByH(chartH); } } private void chartControl1_MouseUp(object sender, MouseEventArgs e) { if (!_initialData) return; _onMoveWorkPointLine = false; _onMoveWorkHLine = false; } #endregion #region Right Click Menu #region Event private void barBtnSetAxisQValue_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (_curvePointsQH == null || !_curvePointsQH.Any()) return; var dlg = new AxisValueDlg(); dlg.SetBindingData(); dlg.VerifyValueChanged += (value) => { var min = _curvePointsQH.Min(x => x.X); var max = _curvePointsQH.Max(x => x.X); if (value < min || value > max) return false; CalcWorkPointByQ(value); return true; }; dlg.ShowDialog(); } private void barBtnSetAxisHValue_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (_curvePointsQH == null || !_curvePointsQH.Any()) return; var dlg = new AxisValueDlg(); dlg.SetBindingData(); dlg.VerifyValueChanged += (value) => { var min = _curvePointsQH.Min(x => x.Y); var max = _curvePointsQH.Max(x => x.Y); if (value < min || value > max) return false; CalcWorkPointByH(value); return true; }; dlg.ShowDialog(); } private void barBtnPositioningMaxQ_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { CalcWorkPointByMaxQ(); } private void barBtnPositioningMaxE_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { CalcWorkPointByMaxE(); } private void barCekDefinePointVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { SetDefinePointVisible(!_definePointVisible); } 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 barCekChartDisplay_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { SetChartDisplay(this.barCekChartDisplay.Checked); } private void barBtnSetChartAxis_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { SetChartAxis(); } private void barBtnSetChartEquation_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { SetChartEquation(); } private void barBtnExportXls_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { ExportXls(); } private void barBtnExportImage_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { ExportImage(); } #endregion /// /// 设置定义点显示 /// public void SetDefinePointVisible(bool visible) { _definePointVisible = visible; _seriesPointQH.Visible = visible; _seriesPointQE.Visible = visible; _seriesPointQP.Visible = visible; } /// /// 设置工作点显示 /// 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 SetChartDisplay(bool monoColor) { if (monoColor) { this.chartControl1.SetChartMonoColorDisplay(); } else { this.chartControl1.SetChartDisplay(); _axisXQ.SetAxisXQDisplay(); _axisYQH.SetAxisYQHDisplay(); _axisYQE.SetSecondaryAxisYQEDisplay(); _axisYQP.SetSecondaryAxisYQPDisplay(); _seriesCurveQH.SetCurveQHDisplay(); _seriesCurveQE.SetCurveQEDisplay(); _seriesCurveQP.SetCurveQPDisplay(); _seriesPointQH.SetPointQHDisplay(); _seriesPointQE.SetPointQEDisplay(); _seriesPointQP.SetPointQPDisplay(); _workPointLine.SetWorkPointLineDisplay(); _workHLine.SetWorkHLineDisplay(); } } /// /// 设置坐标轴 /// public void SetChartAxis() { var dlg = new ChartCoordinateDlg(); var onlyQH = _curveExpressQE == null && _curveExpressQP == null; dlg.SetBindingData(_coordinateParas, onlyQH); dlg.OnChangedCoord += (rhs) => { _coordinateParas = rhs; CalcChartAxis(); this.OnCurveCoordinateParasChanged?.Invoke(_coordinateParas); }; dlg.ShowDialog(); } /// /// 曲线方程 /// public void SetChartEquation() { var dlg = new CurveEquationDlg(); dlg.SetBindingData(_curveExpressQH, _curveExpressQE, _curveExpressQP); dlg.ShowDialog(); } /// /// 导出Excel /// public void ExportXls() { CurveExpressExportXLS.Export(_curveExpressQH, _curveExpressQE, _curveExpressQP, 12); } /// /// 导出图片 /// public void ExportImage() { this.chartControl1.ExportPictByDlg(); } #endregion } }