using DevExpress.Utils; using DevExpress.XtraCharts; using IStation.Model; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; namespace IStation.WinFrmUI.Curve { public partial class ChartFeatCurveViewCtrl : DevExpress.XtraEditors.XtraUserControl { #region 显示 //是否显示点 private bool _isDispCurrentPoint = false; public bool IsDispCurvePoint { get { return _isDispCurrentPoint; } set { _isDispCurrentPoint = value; } } //是否显示曲线标签 private bool _isDispCurveName = true; /// /// 是否显示曲线标签 /// public bool IsDispCurveName { get { return _isDispCurveName; } set { _isDispCurveName = value; if (TextAnnotationQH != null) TextAnnotationQH.Visible = _isDispCurveName; if (TextAnnotationQE != null) TextAnnotationQE.Visible = _isDispCurveName; if (TextAnnotationQP != null) TextAnnotationQP.Visible = _isDispCurveName; } } public void SetCurveNameVisible(bool isDisp) { this._isDispCurveName = isDisp; if (TextAnnotationQH != null) TextAnnotationQH.Visible = isDisp; if (TextAnnotationQE != null) TextAnnotationQE.Visible = isDisp; if (TextAnnotationQP != null) TextAnnotationQP.Visible = isDisp; } // private void InitialChartDisplay() { SetSettingColor(); } public void SetSettingColor() { XtraChartHelper.SetDisplay(AxisQ, QHAxisY, QEAxisY, QPAxisY); XtraChartHelper.SetCurveDisplay(SeriesQHcurve, SeriesQEcurve, SeriesQPcurve); XtraChartHelper.SetPointDisplay(SeriesQHpoint, SeriesQEpoint, SeriesQPpoint); //XtraChartHelper.SetSeriesQH(SeriesQHline); XtraChartHelper.SetDisplay(WorkRegionStrip); if (_isDispCurveName) { XtraChartHelper.SetDisplay(TextAnnotationQH, TextAnnotationQE, TextAnnotationQP); } TextAnnotationQH.Visible = _isDispCurveName; TextAnnotationQE.Visible = _isDispCurveName; TextAnnotationQP.Visible = _isDispCurveName; } #endregion #region 曲线 private bool _isOnlyCurveQH = false; double _CurveMaxQ = 0, _CurveMinQ = 0; double _CurveMaxH = 0, _CurveMinH = 0; private List CurveInfoQH = null; private List PointInfoQH = null; public Model.CurveExpress CurveExprQH = null; private List CurveInfoQE = null; private List PointInfoQE = null; public Model.CurveExpress CurveExprQE = null; private List CurveInfoQP = null; private Model.CurveExpress CurveExprQP = null; private List PointInfoQP = null; Unit.eUnitH _unitH = Unit.eUnitH.M; public void SetCurveInfo( Model.CurveExpress curveQH, Model.CurveExpress curveQE, Model.CurveExpress curveQP) { if (curveQH == null) { EmptyGroupPoint(); return; } this.CurveExprQH = curveQH; this.CurveExprQE = curveQE; this.CurveExprQP = curveQP; this.CurveInfoQH = Model.FitCurveHelper.GetFitPoints(curveQH, 11); this.CurveInfoQE = Model.FitCurveHelper.GetFitPoints(curveQE, 11); this.CurveInfoQP = Model.FitCurveHelper.GetFitPoints(curveQP, 11); _isOnlyCurveQH = false; if (curveQE == null && curveQP == null) { _isOnlyCurveQH = true; } //每次都设置为不显示。且重新计算 WorkRegionMax = (from r in this.CurveInfoQH select r.X).Max(); WorkRegionMin = WorkRegionMax * 0.9; isDispWorkRegion = false; } public void SetPointInfo(FeatCurvePointGroup pointInfo) { this.PointInfoQH = pointInfo.PointQH ; this.PointInfoQE = pointInfo.PointQE; this.PointInfoQP = pointInfo.PointQP; } //清理 public void EmptyGroupPoint() { CurveExprQH = null; CurveInfoQH = null; CurveExprQE = null; CurveInfoQE = null; CurveExprQP = null; CurveInfoQP = null; } #endregion #region CHART变量 //测试的原始点 private Series SeriesQHpoint = null; private Series SeriesQEpoint = null; private Series SeriesQPpoint = null; //拟合后的曲线上的点 private Series SeriesQHcurve = null; private Series SeriesQEcurve = null; private Series SeriesQPcurve = null; private Series SeriesQHline = null; // private DevExpress.XtraCharts.XYDiagram mainChartDiagram; private DevExpress.XtraCharts.Strip WorkRegionStrip = null; private DevExpress.XtraCharts.ConstantLine RatedParasLine = null; private DevExpress.XtraCharts.ConstantLine WorkParasLine = null; // private DevExpress.XtraCharts.TextAnnotation TextAnnotationQH = null; private DevExpress.XtraCharts.TextAnnotation TextAnnotationQE = null; private DevExpress.XtraCharts.TextAnnotation TextAnnotationQP = null; private DevExpress.XtraCharts.TextAnnotation TextAnnotationEquip = null; private DevExpress.XtraCharts.TextAnnotation TextAnnoWorkPoint = null; private DevExpress.XtraCharts.TextAnnotation TextAnnotationMaxE = null; // AxisX AxisQ = null; AxisY QHAxisY = null; SecondaryAxisY QEAxisY = null; SecondaryAxisY QPAxisY = null; #endregion #region 构造函数和加载函数 public ChartFeatCurveViewCtrl() { InitializeComponent(); _unitH = Unit.eUnitH.M; InitialChart(); //if (Eventech.Localization.UICulture.IsEnglish) //{//英语 // //资源文件 // System.ComponentModel.ComponentResourceManager resources // = new System.ComponentModel.ComponentResourceManager(typeof(ChartTestDataCtrl)); // Eventech.Localization.SetResource.ContextMenuStrip(chartRightMenu, resources); // QHAxisY.Title.Text = "Head(m)"; // QEAxisY.Title.Text = "Efficiency(%)"; // QPAxisY.Title.Text = "Power(kw)"; // RatedParasLine.Title.Text = "Work"; //} } private void LoadWindow(object sender, EventArgs e) { InitialChartDisplay(); XtraChartHelper.SetAxisName(QHAxisY, "扬程", _unitH); } private void InitialChart() { SeriesQHpoint = chartControl1.Series["SeriesQHpoint"]; SeriesQEpoint = chartControl1.Series["SeriesQEpoint"]; SeriesQPpoint = chartControl1.Series["SeriesQPpoint"]; SeriesQHcurve = chartControl1.Series["SeriesQHcurve"]; SeriesQEcurve = chartControl1.Series["SeriesQEcurve"]; SeriesQPcurve = chartControl1.Series["SeriesQPcurve"]; SeriesQHline = chartControl1.Series["SeriesQHline"]; mainChartDiagram = (XYDiagram)chartControl1.Diagram; SeriesQHpoint.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; SeriesQEpoint.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; SeriesQPpoint.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; SeriesQHcurve.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; SeriesQEcurve.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; SeriesQPcurve.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; SeriesQHpoint.Visible = false; SeriesQEpoint.Visible = false; SeriesQPpoint.Visible = false; SeriesQHline.Visible = false; SeriesQHcurve.CrosshairEnabled = DefaultBoolean.False; SeriesQEcurve.CrosshairEnabled = DefaultBoolean.False; SeriesQPcurve.CrosshairEnabled = DefaultBoolean.False; SeriesQHpoint.CrosshairEnabled = DefaultBoolean.False; SeriesQEpoint.CrosshairEnabled = DefaultBoolean.False; SeriesQPpoint.CrosshairEnabled = DefaultBoolean.False; SeriesQHline.CrosshairHighlightPoints = DefaultBoolean.False; SeriesQHline.CrosshairEnabled = DefaultBoolean.False; // AxisQ = mainChartDiagram.AxisX; QHAxisY = mainChartDiagram.AxisY; AxisQ.Visibility = DefaultBoolean.False; QHAxisY.Visibility = DefaultBoolean.False; QEAxisY = mainChartDiagram.SecondaryAxesY.GetAxisByName("QEAxisY"); QPAxisY = mainChartDiagram.SecondaryAxesY.GetAxisByName("QPAxisY"); QEAxisY.Visibility = DefaultBoolean.False; QPAxisY.Visibility = DefaultBoolean.False; // WorkRegionStrip = AxisQ.Strips.GetStripByName("WorkRegion"); WorkRegionStrip.Visible = false; RatedParasLine = (DevExpress.XtraCharts.ConstantLine)mainChartDiagram.AxisX.ConstantLines.GetElementByName("RatedParasLine"); RatedParasLine.Visible = false; WorkParasLine = (DevExpress.XtraCharts.ConstantLine)mainChartDiagram.AxisX.ConstantLines.GetElementByName("WorkParasLine"); WorkParasLine.Visible = false; //SeriesQHline.Visible = false; TextAnnotationQH = chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation; TextAnnotationQH.Visible = false; TextAnnotationQE = chartControl1.AnnotationRepository[1] as DevExpress.XtraCharts.TextAnnotation; TextAnnotationQE.Visible = false; TextAnnotationQP = chartControl1.AnnotationRepository[2] as DevExpress.XtraCharts.TextAnnotation; TextAnnotationQP.Visible = false; TextAnnoWorkPoint = chartControl1.AnnotationRepository[3] as DevExpress.XtraCharts.TextAnnotation; TextAnnotationEquip = chartControl1.AnnotationRepository[4] as DevExpress.XtraCharts.TextAnnotation; TextAnnotationMaxE = chartControl1.AnnotationRepository[5] as DevExpress.XtraCharts.TextAnnotation; TextAnnotationMaxE.Visible = false; TextAnnoWorkPoint.Visible = false; TextAnnotationEquip.Visible = false; LineSeriesView view1 = (SplineSeriesView)SeriesQHcurve.View; view1.MarkerVisibility = DevExpress.Utils.DefaultBoolean.False; LineSeriesView view2 = (SplineSeriesView)SeriesQEcurve.View; view2.MarkerVisibility = DevExpress.Utils.DefaultBoolean.False; LineSeriesView view3 = (SplineSeriesView)SeriesQPcurve.View; view3.MarkerVisibility = DevExpress.Utils.DefaultBoolean.False; this.chartControl1.SeriesSelectionMode = SeriesSelectionMode.Point;//设置此属性 表示可以选择CHART上物体 // this.chartControl1.RuntimeSeriesSelectionMode = SeriesSelectionMode.Point;//系列选择是选择其中的点而不是整个系列 this.SeriesQHpoint.CrosshairHighlightPoints = DefaultBoolean.True; //this.chartControl1.RuntimeSeriesSelectionMode = SeriesSelectionMode.Series; //添加重绘事件 this.chartControl1.CustomPaint += new DevExpress.XtraCharts.CustomPaintEventHandler(this.chartControl_CustomPaint); this.chartControl1.ObjectHotTracked += new DevExpress.XtraCharts.HotTrackEventHandler(this.chartControl1_ObjectHotTracked); ////this.chartControl1.MouseLeave += new System.EventHandler(this.chartControl1_MouseLeave); 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); this.chartControl1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.chartControl_MouseClick); this.chartControl1.AnimationStartMode = DevExpress.XtraCharts.ChartAnimationMode.OnLoad; } #endregion #region 设置额定参数 private ViewModel.RatedParas _ratedParas = null; private bool isDispRatedLine = false; private string ratedParasAnno = ""; public ViewModel.RatedParas RatedParas { get { return _ratedParas; } set { _ratedParas = value; isDispRatedLine = false; if (_ratedParas != null) { StringBuilder builder = new StringBuilder(); builder.AppendFormat("额定点 流量:{0:N1}; ", _ratedParas.Q); builder.AppendFormat("扬程:{0:N1}; ", _ratedParas.H); builder.AppendLine(""); builder.AppendFormat(" 效率:{0:N1}; ", _ratedParas.E); builder.AppendFormat("功率:{0:N1} ", _ratedParas.P); ratedParasAnno = builder.ToString(); isDispRatedLine = true; } } } #endregion #region 设置工作点 private bool isDispWorkPt = false; private Model.GroupPoint workPt = new Model.GroupPoint(0, 0, 0, 0, 0); public void SetWorkPointQ(double wrkQ) { if (this.CurveInfoQH != null && this.CurveInfoQH.Count > 3) { workPt.Q = wrkQ; isDispWorkPt = true; SeriesQHline.Visible = true; WorkParasLine.Visible = true; WorkParasLine.Title.Visible = true; SeriesQHline.Visible = true; TextAnnoWorkPoint.Visible = true; CalcWorkPtByQ(wrkQ); SetQHLineByWorkPt(); } } public void SetWorkPointQ_Auto() { if (this.CurveInfoQH != null && this.CurveInfoQH.Count > 3) { double wrkQ = (_CurveMinQ + _CurveMaxQ) / 2; SetWorkPointQ(wrkQ); } } public void SetWorkPointH(double wrkH) { if (this.CurveInfoQH != null && this.CurveInfoQH.Count > 3) { workPt.H = wrkH; isDispWorkPt = true; SeriesQHline.Visible = true; WorkParasLine.Visible = true; WorkParasLine.Title.Visible = true; SeriesQHline.Visible = true; TextAnnoWorkPoint.Visible = true; double wrkQ = 0; if (CalcWorkQByH(wrkH, ref wrkQ)) { CalcWorkPtByQ(wrkQ); SetQHLineByWorkPt(); } } } public Model.GroupPoint GetWorkPoint() { return workPt; } public void IsNotDispWorkPt() { isDispWorkPt = false; WorkParasLine.Visible = false; WorkParasLine.Title.Visible = false; TextAnnoWorkPoint.Visible = false; SeriesQHline.Visible = false; } #endregion #region 坐标 //坐标 private Model.CurveCoordinateParas _coordinateParas = null; public Model.CurveCoordinateParas CoordinateParas { get { return _coordinateParas; } set { _coordinateParas = value; } } //更新图表坐标 public void UpdateCoordinate() { //先设置为不显示 AxisQ.Visibility = DefaultBoolean.False; QHAxisY.GridLines.Visible = false; QHAxisY.Visibility = DefaultBoolean.False; QPAxisY.GridLines.Visible = false; QPAxisY.Visibility = DefaultBoolean.False; QEAxisY.GridLines.Visible = false; QEAxisY.Visibility = DefaultBoolean.False; WorkRegionStrip.Visible = false; RatedParasLine.Visible = false; if (CoordinateParas == null) return; var nfi = new NumberFormatInfo(); nfi.NumberGroupSeparator = " "; // set the group separator to a space nfi.NumberDecimalSeparator = ","; // set decimal separator to comma //流量 if (CurveInfoQH != null) { //坐标刻度 List q_Label_List = new List(); AxisQ.CustomLabels.Clear(); double disQ = CoordinateParas.CoordMinQ; for (int i = 0; i < CoordinateParas.GridNumberX + 1; i++) { q_Label_List.Add(new CustomAxisLabel(disQ.ToString("N0", nfi), disQ)); disQ = disQ + CoordinateParas.CoordSpaceQ; } AxisQ.CustomLabels.AddRange(q_Label_List.ToArray()); //设置显示 AxisQ.Visibility = DefaultBoolean.True; AxisQ.GridLines.Visible = true; XtraChartHelper.SetAxisRange(AxisQ, CoordinateParas.CoordMinQ, CoordinateParas.CoordMinQ + CoordinateParas.GridNumberX * CoordinateParas.CoordSpaceQ); } //扬程 int h_grid_count = 0; if (CurveInfoQH != null) { //坐标刻度 QHAxisY.CustomLabels.Clear(); List h_Label_List = new List(); double disH = CoordinateParas.CoordMinH + CoordinateParas.CoordSpaceH * CoordinateParas.StartLineNoH; for (int i = CoordinateParas.StartLineNoH; i < CoordinateParas.EndLineNoH + 1; i++) { h_Label_List.Add(new CustomAxisLabel(disH.ToString(), disH)); disH = disH + CoordinateParas.CoordSpaceH; } QHAxisY.CustomLabels.AddRange(h_Label_List.ToArray()); //设置显示 //QHAxisY.GridLines.Visible = true; QHAxisY.Visibility = DefaultBoolean.True; if (_isOnlyCurveQH) { h_grid_count = h_Label_List.Count(); XtraChartHelper.SetAxisRange(QHAxisY, CoordinateParas.DispMinH(), CoordinateParas.DispMaxH()); } else { h_grid_count = h_Label_List.Count() + 3; XtraChartHelper.SetAxisRange(QHAxisY, CoordinateParas.DispMinH() - 3 * CoordinateParas.CoordSpaceH, CoordinateParas.DispMaxH()); } QHAxisY.GridLines.Visible = true; } //效率 if (CurveInfoQE != null) { QEAxisY.CustomLabels.Clear(); List E_Label_List = new List(); double disE = CoordinateParas.CoordMinE + CoordinateParas.CoordSpaceE * CoordinateParas.StartLineNoE; for (int i = CoordinateParas.StartLineNoE; i < CoordinateParas.EndLineNoE + 1; i++) { E_Label_List.Add(new CustomAxisLabel(disE.ToString(), disE)); disE = disE + CoordinateParas.CoordSpaceE; } QEAxisY.CustomLabels.AddRange(E_Label_List.ToArray()); //设置显示 QEAxisY.GridLines.Visible = true; QEAxisY.Visibility = DefaultBoolean.True; XtraChartHelper.SetAxisRange(QEAxisY, CoordinateParas.DispMinE(), CoordinateParas.DispMinE() + (h_grid_count - 1) * CoordinateParas.CoordSpaceE); } //功率 if (CurveInfoQP != null) { //坐标刻度 QPAxisY.CustomLabels.Clear(); List P_Label_List = new List(); double disP = CoordinateParas.DispMinP(); double maxP = disP; for (int i = CoordinateParas.StartLineNoP; i < CoordinateParas.EndLineNoP + 1; i++) { P_Label_List.Add(new CustomAxisLabel(disP.ToString(), disP)); disP = disP + CoordinateParas.CoordSpaceP; maxP = disP; } QPAxisY.CustomLabels.AddRange(P_Label_List.ToArray()); //设置显示 QPAxisY.Visibility = DefaultBoolean.True; QPAxisY.GridLines.Visible = true ; XtraChartHelper.SetAxisRange(QPAxisY, CoordinateParas.DispMinP(), maxP); } } #endregion #region 更新 //更新所有 public void UpdateChart(bool isCalcCoordinate = false) { //要依次更新 if (this.CurveInfoQH == null || this.CurveInfoQH.Count < 3) return; if (isCalcCoordinate || CoordinateParas == null) {//不强迫计算,就用上次更新的坐标系 CalcCoordinate(); } UpdateCoordinate(); UpdateCurve(); UpdatePoint(); UpdateRatedParas(); UpdateWorkParas(); if (isDispMaxE) { ShowMaxEffPt(); } else if (isDispMaxH) { ShowMaxQPoint(); } else { if (isDispWorkPt && workPt != null && this.CurveInfoQH != null && this.CurveInfoQH.Count > 2) { if (workPt.Q < _CurveMaxQ && workPt.Q > _CurveMinQ) { SetWorkPointQ(workPt.Q); } } } } //计算坐标 public void CalcCoordinate() { if (CurveInfoQH != null && CurveInfoQH.Count() > 3) { CoordinateParas = Model.CurveCoordinateParas.CalcCoordinate(CurveInfoQH, CurveInfoQE, CurveInfoQP); _CurveMinQ = (from x in CurveInfoQH select x.X).Min(); _CurveMaxQ = (from x in CurveInfoQH select x.X).Max(); _CurveMinH = (from x in CurveInfoQH select x.Y).Min(); _CurveMaxH = (from x in CurveInfoQH select x.Y).Max(); } else { CoordinateParas = GetBlankCoordinate(); if (_CurveMinQ > _CurveMaxQ - 1) { _CurveMinQ = _CurveMinQ * 0.8; _CurveMaxQ = _CurveMaxQ * 1.2; } if (_CurveMinH > _CurveMaxH - 0.1) { _CurveMinH = _CurveMinH * 0.8; _CurveMaxH = _CurveMaxH * 1.2; } } } /// /// 获取空白坐标 /// private Model.CurveCoordinateParas GetBlankCoordinate() { var para = new Model.CurveCoordinateParas(); para.GridNumberX = 30; para.GridNumberY = 16; //显示的坐标线号 para.StartLineNoH = 10; para.EndLineNoH = 15; para.StartLineNoE = 0; para.EndLineNoE = 10; para.StartLineNoP = 2; para.EndLineNoP = 9; //坐标最小值和间隔 para.CoordMinQ = 0; para.CoordSpaceQ = 1000; para.CoordMinH = 10; para.CoordSpaceH = 100; para.CoordMinE = 0; para.CoordSpaceE = 100; para.CoordMinP = 10; para.CoordSpaceP = 100; return para; } /// /// 清除数据 /// public void ClearData() { CurveExprQH = null; CurveInfoQH = null; CurveExprQE = null; CurveInfoQE = null; CurveExprQP = null; CurveInfoQP = null; UpdateCurve(); } //更新所有点 public void UpdateCurve() { int i = 0; //更新所有曲线 if (CurveInfoQH != null && CurveInfoQH.Count > 3) { SeriesQHcurve.Visible = true; SeriesQHcurve.Points.Clear(); for (i = 0; i < CurveInfoQH.Count(); i++) { SeriesQHcurve.Points.Add(new SeriesPoint(CurveInfoQH[i].X, new double[] { CurveInfoQH[i].Y })); } DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPoint1 = TextAnnotationQH.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint; paneAnchorPoint1.AxisXCoordinate.AxisValue = CurveInfoQH[CurveInfoQH.Count() - 2].X.ToString(); paneAnchorPoint1.AxisYCoordinate.AxisValue = CurveInfoQH[CurveInfoQH.Count() - 2].Y.ToString(); TextAnnotationQH.Visible = _isDispCurveName; } else { SeriesQHcurve.Visible = false; TextAnnoWorkPoint.Visible = false; TextAnnotationQH.Visible = false; WorkParasLine.Visible = false; SeriesQHline.Visible = false; SeriesQHcurve.Points.Clear(); } if (CurveInfoQE != null && CurveInfoQE.Count > 3) { SeriesQEcurve.Visible = true; SeriesQEcurve.Points.Clear(); for (i = 0; i < CurveInfoQE.Count(); i++) { SeriesQEcurve.Points.Add(new SeriesPoint(CurveInfoQE[i].X, new double[] { CurveInfoQE[i].Y })); } DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPoint2 = TextAnnotationQE.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint; var x = CurveInfoQE[CurveInfoQE.Count() - 2].X.ToString(); var y = CurveInfoQE[CurveInfoQE.Count() - 2].Y.ToString(); paneAnchorPoint2.AxisXCoordinate.AxisValue = CurveInfoQE[CurveInfoQE.Count() - 2].X.ToString(); paneAnchorPoint2.AxisYCoordinate.AxisValue = CurveInfoQE[CurveInfoQE.Count() - 2].Y.ToString(); TextAnnotationQE.Visible = _isDispCurveName; } else { SeriesQEcurve.Visible = false; TextAnnotationQE.Visible = false; SeriesQEcurve.Points.Clear(); } if (CurveInfoQP != null && CurveInfoQP.Count > 3) { SeriesQPcurve.Visible = true; SeriesQPcurve.Points.Clear(); for (i = 0; i < CurveInfoQP.Count(); i++) { SeriesQPcurve.Points.Add(new SeriesPoint(CurveInfoQP[i].X, new double[] { CurveInfoQP[i].Y })); } DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPoint3 = TextAnnotationQP.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint; paneAnchorPoint3.AxisXCoordinate.AxisValue = CurveInfoQP[CurveInfoQP.Count() - 2].X.ToString(); paneAnchorPoint3.AxisYCoordinate.AxisValue = CurveInfoQP[CurveInfoQP.Count() - 2].Y.ToString(); TextAnnotationQP.Visible = _isDispCurveName; } else { SeriesQPcurve.Visible = false; TextAnnotationQP.Visible = false; SeriesQEcurve.Points.Clear(); } //stopwatchH.Stop(); //TimeSpan timespanH = stopwatchH.Elapsed; // 获取当前实例测量得出的总时间 //double milliseconds1 = timespanH.TotalMilliseconds; // 总毫秒数 // MessageBox.Show("单独添加点:"+milliseconds1.ToString() + "ms"); } public void UpdatePoint() { if (_isDispCurrentPoint) { SeriesQHpoint.Visible = true; SeriesQEpoint.Visible = true; SeriesQPpoint.Visible = true; } else { SeriesQHpoint.Visible = false; SeriesQEpoint.Visible = false; SeriesQPpoint.Visible = false; return; } int i = 0; //更新所有曲线 if (PointInfoQH != null && PointInfoQH.Count > 3) { SeriesQHpoint.Visible = true; SeriesQHpoint.Points.Clear(); for (i = 0; i < PointInfoQH.Count(); i++) { SeriesQHpoint.Points.Add(new SeriesPoint(PointInfoQH[i].X, new double[] { PointInfoQH[i].Y })); } } if (PointInfoQE != null && PointInfoQE.Count > 3) { SeriesQEpoint.Visible = true; SeriesQEpoint.Points.Clear(); for (i = 0; i < PointInfoQE.Count(); i++) { SeriesQEpoint.Points.Add(new SeriesPoint(PointInfoQE[i].X, new double[] { PointInfoQE[i].Y })); } } if (PointInfoQP != null && PointInfoQP.Count > 3) { SeriesQPpoint.Visible = true; SeriesQPpoint.Points.Clear(); for (i = 0; i < PointInfoQP.Count(); i++) { SeriesQPpoint.Points.Add(new SeriesPoint(PointInfoQP[i].X, new double[] { PointInfoQP[i].Y })); } } } //更新区域 public void UpdateWorkRegion() { WorkRegionStrip.Visible = isDispWorkRegion; if (isDispWorkRegion) { WorkRegionStrip.MinLimit.AxisValue = 0; //因为会重复赋值,所以先设个小值,这样不会报错 WorkRegionStrip.MaxLimit.AxisValue = WorkRegionMax; WorkRegionStrip.MinLimit.AxisValue = WorkRegionMin; } } //更新额定参数 public void UpdateRatedParas() { if (RatedParasLine == null || _ratedParas == null) { RatedParasLine.Visible = false; return; } RatedParasLine.AxisValue = _ratedParas.Q; RatedParasLine.Visible = isDispRatedLine; } //更新工作参数 public void UpdateWorkParas() { if (WorkParasLine == null) return; if (isDispWorkPt && this.CurveInfoQH != null && this.CurveInfoQH.Count > 3) { if (workPt.Q > 2) { WorkParasLine.AxisValue = workPt.Q; WorkParasLine.Visible = true; } else { WorkParasLine.Visible = false; } } else { WorkParasLine.Visible = false; } } #endregion #region 重绘 //private float curveWidth = 2F; Rectangle CalculateDiagramBounds() { Point p1 = mainChartDiagram.DiagramToPoint((double)mainChartDiagram.AxisX.VisualRange.MinValue, (double)mainChartDiagram.AxisY.VisualRange.MinValue).Point; Point p2 = mainChartDiagram.DiagramToPoint((double)mainChartDiagram.AxisX.VisualRange.MaxValue, (double)mainChartDiagram.AxisY.VisualRange.MaxValue).Point; return GeomHelper.CreateRectangle(p1, p2); } void chartControl_CustomPaint(object sender, CustomPaintEventArgs e) { if (_coordinateParas == null) return; if (!(e is DXCustomPaintEventArgs dxArgs)) return; //chartControl1.DrawGridLineY(dxArgs, _coordinateParas, IStation.WinFrmUI.Curve.Cookie.ChartDisp.Default.GridLinesColorY, 0.2f, true); #region 绘制装配曲线 //if (_equipmentCurveParas != null && _equipmentCurveParas.CurveInfo != null) //{ // if (isDispEquipmentCurve) // chartControl1.DrawEquipmentCurve(g, _equipmentCurveParas.CurveInfo); //} #endregion } #endregion #region 右击菜单 private bool isMonoColor = false; private void chartRightMenu_Opening(object sender, CancelEventArgs e) { if (isMonoColor) { 单色显示MenuItem.Text = "多色显示"; } else { 单色显示MenuItem.Text = "单色显示"; } if (OnChangeAxisTypeH == null) { 转化为压差曲线MenuItem.Visible = false; } else {//_hIsPress = false;//H表示是false扬程还是true压差 if (_hIsPress) { 转化为压差曲线MenuItem.Text = "转化为扬程曲线"; } else { 转化为压差曲线MenuItem.Text = "转化为压差曲线"; } } if (WorkParasLine.Visible) { isDispWorkPt = true; 不显示工况点Item.Text = "不显示工况点"; } else { isDispWorkPt = false; 不显示工况点Item.Text = "显示工况点"; } } private void 修改Anno名称MenuItem_Click(object sender, EventArgs e) { var anno = _rightClickObj as DevExpress.XtraCharts.TextAnnotation; if (anno == null) return; //SetCurveNameDlg theDlg = new SetCurveNameDlg(); //theDlg.CurveName = anno.Text; //if (theDlg.ShowDialog() == DialogResult.OK) //{ // anno.Text = theDlg.CurveName; //} } private void 设置颜色AnnoMenuItem_Click(object sender, EventArgs e) { var anno = _rightClickObj as DevExpress.XtraCharts.TextAnnotation; if (anno == null) return; System.Windows.Forms.ColorDialog colorDialog1; colorDialog1 = new System.Windows.Forms.ColorDialog(); colorDialog1.Color = anno.TextColor; if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { anno.TextColor = colorDialog1.Color; anno.Border.Color = colorDialog1.Color; } } private bool isDispCoodText = true; private void DispCoodTextMenu_Click(object sender, EventArgs e) { isDispCoodText = !isDispCoodText; if (isDispCoodText) { DispCoodTextMenu.Text = "不显示坐标说明"; } else { DispCoodTextMenu.Text = "显示坐标说明"; } AxisQ.Title.Visibility = isDispCoodText ? DefaultBoolean.True : DefaultBoolean.False; QHAxisY.Title.Visibility = isDispCoodText ? DefaultBoolean.True : DefaultBoolean.False; QEAxisY.Title.Visibility = isDispCoodText ? DefaultBoolean.True : DefaultBoolean.False; QPAxisY.Title.Visibility = isDispCoodText ? DefaultBoolean.True : DefaultBoolean.False; } private void 导出图片Item_Click(object sender, EventArgs e) { this.chartControl1.ExportPictByDlg(); } private void 设置坐标Menu_Click(object sender, EventArgs e) { SetCoordinateAllDlg theSetDlg = new SetCoordinateAllDlg(); theSetDlg.CoordinateParas = this._coordinateParas; theSetDlg.OnChangedCoord += (coord) => { this._coordinateParas = coord; UpdateCoordinate(); }; theSetDlg.Show(); } public void SetCoordinateParas(Model.CurveCoordinateParas curveCoordinateParas) { this._coordinateParas = curveCoordinateParas; UpdateCoordinate(); } private void 不显示曲线标签Item_Click(object sender, EventArgs e) { _isDispCurveName = !_isDispCurveName; if (_isDispCurveName) { 不显示曲线标签Item.Text = "不显示曲线名称"; } else { 不显示曲线标签Item.Text = "显示曲线名称"; } TextAnnotationQH.Visible = _isDispCurveName; TextAnnotationQE.Visible = _isDispCurveName; TextAnnotationQP.Visible = _isDispCurveName; } private void 不显示测试点Item_Click(object sender, EventArgs e) { _isDispCurrentPoint = !_isDispCurrentPoint; if (_isDispCurrentPoint) { 不显示测试点Item.Text = "不显示测试点"; SeriesQHpoint.Visible = true; SeriesQEpoint.Visible = true; SeriesQPpoint.Visible = true; } else { 不显示测试点Item.Text = "显示测试点"; SeriesQHpoint.Visible = false; SeriesQEpoint.Visible = false; SeriesQPpoint.Visible = false; } } private bool isDispPointPara = false; private void 显示测试点参数MenuItem_Click(object sender, EventArgs e) { isDispPointPara = !isDispPointPara; if (isDispPointPara) { 显示测试点参数MenuItem.Text = "不显示测试点参数"; } else { 显示测试点参数MenuItem.Text = "显示测试点参数"; } SeriesQHpoint.Label.LineVisibility = isDispPointPara ? DefaultBoolean.True : DefaultBoolean.False; SeriesQEpoint.Label.LineVisibility = isDispPointPara ? DefaultBoolean.True : DefaultBoolean.False; SeriesQPpoint.Label.LineVisibility = isDispPointPara ? DefaultBoolean.True : DefaultBoolean.False; SeriesQHpoint.LabelsVisibility = isDispPointPara ? DefaultBoolean.True : DefaultBoolean.False; SeriesQEpoint.LabelsVisibility = isDispPointPara ? DefaultBoolean.True : DefaultBoolean.False; SeriesQPpoint.LabelsVisibility = isDispPointPara ? DefaultBoolean.True : DefaultBoolean.False; } private void 不显示工况点Item_Click(object sender, EventArgs e) { isDispWorkPt = !isDispWorkPt; if (isDispWorkPt) { 不显示工况点Item.Text = "不显示工况点"; WorkParasLine.Visible = true; TextAnnoWorkPoint.Visible = true; SeriesQHline.Visible = true; } else { 不显示工况点Item.Text = "显示工况点"; WorkParasLine.Visible = false; TextAnnoWorkPoint.Visible = false; SeriesQHline.Visible = false; } } private void 设置图形显示Item_Click(object sender, EventArgs e) { // SetChartDisplayDlg theDlg = new SetChartDisplayDlg(); ////theDlg.IsDispCurveQE = SeriesConnectCurveQE.Visible; ////theDlg.IsDispCurveQP = SeriesConnectCurveQP.Visible; //if (theDlg.ShowDialog() == DialogResult.OK) //{ // // SeriesConnectCurveQE.Visible = theDlg.IsDispCurveQE; // // SeriesConnectCurveQP.Visible = theDlg.IsDispCurveQP; // SetChartDisplay(); // chartControl1.Refresh(); //} } private void 显示曲线方程Item_Click(object sender, EventArgs e) { DispCurveEquationDlg theSetDlg = new DispCurveEquationDlg(); theSetDlg.SetCurveInfo(this.CurveExprQH, this.CurveExprQE, this.CurveExprQP); theSetDlg.Show(); } private void 保存曲线文件Item_Click(object sender, EventArgs e) { if (CurveExprQH == null) return; System.Windows.Forms.SaveFileDialog saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); saveFileDialog1.Filter = "*.csv|*.csv"; //saveFileDialog1.CheckFileExists = true; //saveFileDialog1.CheckPathExists = true; DialogResult ret = saveFileDialog1.ShowDialog(); if (ret != System.Windows.Forms.DialogResult.OK) return; var fileName = saveFileDialog1.FileName; StreamWriter streamWriter = new StreamWriter(fileName, false, System.Text.Encoding.GetEncoding("gb2312")); streamWriter.WriteLine("流量,扬程"); for (int i = 0; i < 10; i++) { var q = CurveExprQH.Min + (CurveExprQH.Max - CurveExprQH.Min) * i / 9; var h = Model.FitCurveHelper.GetFitPointY(CurveExprQH, q); streamWriter.WriteLine(string.Format("{0},{1}", q, h)); } streamWriter.Flush(); streamWriter.Close(); } bool isDispWorkRegion = false; double WorkRegionMin = 0, WorkRegionMax = 0; private void 设置运行区域Item_Click(object sender, EventArgs e) { //SetRegionParasDlg theDlg = new SetRegionParasDlg(); //theDlg.IsDispRegion = true; //theDlg.RegionMax = WorkRegionMax; //theDlg.RegionMin = WorkRegionMin; //if (theDlg.ShowDialog() == DialogResult.OK) //{ // isDispWorkRegion = theDlg.IsDispRegion; // WorkRegionMax = theDlg.RegionMax; // WorkRegionMin = theDlg.RegionMin; // XtraChartHelper.SetDisplay(WorkRegionStrip); // UpdateWorkRegion(); //} } private void 显示额定点MenuItem_Click(object sender, EventArgs e) { isDispRatedLine = !isDispRatedLine; if (isDispRatedLine) { 显示额定点MenuItem.Text = "不显示额定点"; } else { 显示额定点MenuItem.Text = "显示额定点"; } RatedParasLine.Visible = isDispRatedLine; } private void 单色显示MenuItem_Click(object sender, EventArgs e) { isMonoColor = !isMonoColor; if (isMonoColor) { 单色显示MenuItem.Text = "多色显示"; XtraChartHelper.SetMonoColor(chartControl1); } else { 单色显示MenuItem.Text = "单色显示"; SetSettingColor(); } } private void 设置颜色LineMenuItem_Click(object sender, EventArgs e) { var refLine = _rightClickObj as DevExpress.XtraCharts.ConstantLine; if (refLine == null) return; System.Windows.Forms.ColorDialog colorDialog1; colorDialog1 = new System.Windows.Forms.ColorDialog(); colorDialog1.Color = refLine.Color; if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { refLine.Color = colorDialog1.Color; refLine.Title.TextColor = colorDialog1.Color; } } private void 设置值SeriesMenuItem_Click(object sender, EventArgs e) { //SetRefLineValueDlg theDlg = new SetRefLineValueDlg(); //if (_hIsPress) //{ // theDlg.RefLineValue = Convert.ToDecimal(Math.Round(workPt.H,4)); //} //else //{ // theDlg.RefLineValue = Convert.ToDecimal(Math.Round(workPt.H,1)); //} //if (theDlg.ShowDialog() == DialogResult.OK) //{ // double refH = Convert.ToDouble(theDlg.RefLineValue); // double refQ = 0; // if (CalcWorkQByH(refH, ref refQ)) // { // CalcWorkPtByQ(refQ); // SetQHLineByWorkPt(); // } // else // { // XtraMessageBox.Show("没有交点"); // } //} } private void 设置值LineMenuItem_Click(object sender, EventArgs e) { var refLine = _rightClickObj as DevExpress.XtraCharts.ConstantLine; if (refLine == null) return; if (refLine == WorkParasLine) { SetWorkPointDlg theDlg = new SetWorkPointDlg(); theDlg.WorkQ = Math.Round(Convert.ToDecimal(WorkParasLine.AxisValue), 1); if (theDlg.ShowDialog() == DialogResult.OK) { SetWorkPointQ(Convert.ToDouble(theDlg.WorkQ)); if (OnChangeWorkPt != null) { OnChangeWorkPt(this, new TagEventArgs(workPt)); } } } else if (refLine == RatedParasLine) { if (_ratedParas == null) return; //Eventech.ModuleBaseData.DispRatedParaDlg theDlg = new Eventech.ModuleBaseData.DispRatedParaDlg(); //theDlg.SetDispPump(_ratedParas); //theDlg.Show(); } } private void 设置颜色AxisMenuItem_Click(object sender, EventArgs e) { var axis = _rightClickObj as DevExpress.XtraCharts.Axis; if (axis == null) return; System.Windows.Forms.ColorDialog colorDialog1; colorDialog1 = new System.Windows.Forms.ColorDialog(); colorDialog1.Color = axis.Label.TextColor; if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { axis.Title.TextColor = colorDialog1.Color; axis.Label.TextColor = colorDialog1.Color; axis.Color = colorDialog1.Color; } } private void 设置坐标值MenuItem_Click(object sender, EventArgs e) { var axis = _rightClickObj as DevExpress.XtraCharts.Axis; if (axis == null) return; SetCoordinateAllDlg theSetDlg = new SetCoordinateAllDlg(); theSetDlg.CoordinateParas = CoordinateParas; if (theSetDlg.ShowDialog() == DialogResult.OK) { UpdateCoordinate(); // UpdateChart(false); } } private void 设置颜色SeriesMenuItem_Click(object sender, EventArgs e) { var series = _rightClickObj as DevExpress.XtraCharts.Series; if (series == null) return; System.Windows.Forms.ColorDialog colorDialog1; colorDialog1 = new System.Windows.Forms.ColorDialog(); colorDialog1.Color = series.View.Color; if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { series.View.Color = colorDialog1.Color; } } #endregion #region 获取图片 public System.IO.Stream GetChartImageStream() { System.IO.Stream stream = new MemoryStream(); chartControl1.ExportToImage(stream, System.Drawing.Imaging.ImageFormat.Png); return stream; } #endregion #region chartControl事件 object _rightClickObj = null; SeriesPoint _rightSeriesPoint = null; private void chartControl_MouseClick(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) { ChartHitInfo hitInfo = chartControl1.CalcHitInfo(e.Location); if (hitInfo.InAnnotation) { _rightClickObj = hitInfo.Annotation; annoRightMenu.Show(chartControl1, e.Location); } else if (hitInfo.InSeries) { _rightClickObj = hitInfo.Series; _rightSeriesPoint = hitInfo.SeriesPoint; if ((_rightClickObj as DevExpress.XtraCharts.Series).Name == "SeriesQHline") { 删除此点SeriesMenuItem.Visible = false; 编辑此点SeriesMenuItem.Visible = false; 设置值SeriesMenuItem.Visible = true; } else { 删除此点SeriesMenuItem.Visible = true; 编辑此点SeriesMenuItem.Visible = true; 设置值SeriesMenuItem.Visible = false; } seriesRightMenu.Show(chartControl1, e.Location); } else if (hitInfo.InAxis) { _rightClickObj = hitInfo.Axis; axisRightMenu.Show(chartControl1, e.Location); } else if (hitInfo.InConstantLine) { _rightClickObj = hitInfo.ConstantLine; lineMenuStrip.Show(chartControl1, e.Location); } else { _rightClickObj = null; chartRightMenu.Show(chartControl1, e.Location); } } else if (e.Button == System.Windows.Forms.MouseButtons.Left) { //if (_isDispRefConstantLineQ) //{ // DiagramCoordinates coordPt = mainChartDiagram.PointToDiagram(e.Location); // double refQ = coordPt.NumericalArgument; // // FeatPoint ftPoint = new FeatPoint(coordPt.NumericalArgument, coordPt.NumericalValue); //} } } ToolTipController toolTipController1 = new ToolTipController(); private void chartControl1_ObjectHotTracked(object sender, HotTrackEventArgs e) { if (SeriesQHcurve == e.Object) { toolTipController1.ShowHint("流量扬程曲线"); } else if (SeriesQEcurve == e.Object) { toolTipController1.ShowHint("流量效率曲线"); } else if (SeriesQPcurve == e.Object) { toolTipController1.ShowHint("流量功率曲线"); } else if (RatedParasLine == e.Object) { if (_ratedParas == null) return; toolTipController1.ShowHint(ratedParasAnno); } else if (e.AdditionalObject is SeriesPoint) { SeriesPoint point = e.AdditionalObject as SeriesPoint; if (point != null) { ChartHitInfo hitInfo = e.HitInfo; string s = string.Format("{0} , {1}", point.Argument, point.Values[0]); toolTipController1.ShowHint(s); } } //else if (e.AdditionalObject is Series) //{ // if (SeriesTestCurveQH == e.AdditionalObject) // { // toolTipController1.ShowHint("流量扬程曲线"); // } //} //else if (e.AdditionalObject is TextAnnotation) //{ // if (e.AdditionalObject == TextAnnotationMaxE) // { // toolTipController1.ShowHint("aaaa"); // } //} else { toolTipController1.HideHint(); } } private void chartControl1_MouseClick(object sender, MouseEventArgs e) { //if (e.Button == System.Windows.Forms.MouseButtons.Right) //{ // chartRightMenu.Show(chartControl1, e.Location); //} //else if (e.Button == System.Windows.Forms.MouseButtons.Left) //{ // //if (_isDispRefConstantLineQ) // //{ // // DiagramCoordinates coordPt = mainChartDiagram.PointToDiagram(e.Location); // // double refQ = coordPt.NumericalArgument; // // // FeatPoint ftPoint = new FeatPoint(coordPt.NumericalArgument, coordPt.NumericalValue); // //} //} } public class TagEventArgs : EventArgs { private object tag; public TagEventArgs(object tag) { this.tag = tag; } public object GetTag() { return tag; } } public delegate void TagEventHandler(object sender, TagEventArgs e); public event TagEventHandler OnChangeWorkPt = null; private void CalcWorkPtByQ_old(double refQ) { if (!isDispWorkPt) return; if (CurveInfoQH == null) return; if (refQ < _CurveMinQ || refQ > _CurveMaxQ) return; workPt.Q = refQ; WorkParasLine.AxisValue = refQ; StringBuilder builder = new StringBuilder(); builder.AppendLine("---工作点参数---"); builder.AppendFormat("流量:{0:N1}", workPt.Q); workPt.H = Model.FitCurveHelper.GetFitPointY(CurveExprQH, refQ); builder.AppendLine(""); if (_hIsPress) { builder.AppendFormat("压差:{0:N4}", workPt.H); } else { builder.AppendFormat("扬程:{0:N3}", workPt.H); } if (CurveInfoQE != null) { workPt.E = Model.FitCurveHelper.GetFitPointY(CurveExprQE, refQ); builder.AppendLine(""); builder.AppendFormat("效率:{0:N1}", workPt.E); } if (CurveInfoQP != null) { workPt.P = Model.FitCurveHelper.GetFitPointY(CurveExprQP, refQ); builder.AppendLine(""); builder.AppendFormat("功率:{0:N1}", workPt.P); } TextAnnoWorkPoint.Visible = true; TextAnnoWorkPoint.Text = builder.ToString(); } private int? _calcuType = null; public void SetCalcuType(int calcuType) { _calcuType = calcuType; } public void CalcWorkPtByQ() { if (workPt.Q > 100) { CalcWorkPtByQ(workPt.Q); } } public void CalcWorkPtByQ(double refQ) { if (!isDispWorkPt) return; if (CurveInfoQH == null) return; if (workPt == null) return; if (refQ < _CurveMinQ || refQ > _CurveMaxQ) return; workPt.Q = refQ; WorkParasLine.AxisValue = refQ; StringBuilder builder = new StringBuilder(); builder.AppendLine("---工作点参数---"); workPt.H = Model.FitCurveHelper.GetFitPointY(CurveExprQH, workPt.Q); var h = Math.Round(workPt.H, 2); if (_calcuType.HasValue) { var calcuType = _calcuType.Value; builder.AppendFormat("流量:{0:N1}", workPt.Q); builder.AppendLine(""); if (_hIsPress) { builder.AppendFormat("压差:{0:N4}", workPt.H); } else { builder.AppendFormat("扬程:{0}", h); } if (calcuType == 0) { if (CurveInfoQE != null) { workPt.E = Model.FitCurveHelper.GetFitPointY(CurveExprQE, workPt.Q); builder.AppendLine(""); builder.AppendFormat("效率:{0:N1}", workPt.E); } if (CurveInfoQP != null) { workPt.P = Model.FitCurveHelper.GetFitPointY(CurveExprQP, workPt.Q); builder.AppendLine(""); builder.AppendFormat("功率:{0:N1}", workPt.P); } } else if (CurveInfoQE != null && CurveInfoQE != null) { if (calcuType == 1) { workPt.E = Model.FitCurveHelper.GetFitPointY(CurveExprQE, workPt.Q); workPt.P = Model.CurveCalcuHelper.CalculateP(workPt.Q, h, workPt.E); } else { workPt.P = Model.FitCurveHelper.GetFitPointY(CurveExprQP, workPt.Q); workPt.E = Model.CurveCalcuHelper.CalculateE(workPt.Q, h, workPt.P); } builder.AppendLine(""); builder.AppendFormat("效率:{0:N1}", workPt.E); builder.AppendLine(""); builder.AppendFormat("功率:{0:N1}", workPt.P); } } else { builder.AppendFormat("流量:{0:N1}", workPt.Q); builder.AppendLine(""); if (_hIsPress) { builder.AppendFormat("压差:{0:N4}", workPt.H); } else { builder.AppendFormat("扬程:{0}", h); } if (CurveInfoQE != null) { workPt.E = Model.FitCurveHelper.GetFitPointY(CurveExprQE, refQ); builder.AppendLine(""); builder.AppendFormat("效率:{0:N1}", workPt.E); } if (CurveInfoQP != null) { workPt.P = Model.FitCurveHelper.GetFitPointY(CurveExprQP, refQ); builder.AppendLine(""); builder.AppendFormat("功率:{0:N1}", workPt.P); } } TextAnnoWorkPoint.Visible = true; TextAnnoWorkPoint.Text = builder.ToString(); } private bool CalcWorkQByH(double wrkH, ref double wrkQ) { if (this.CurveInfoQH == null) return false; if (wrkH < _CurveMinH * 1.01 || wrkH > _CurveMaxH * 0.999) return false; List intrPts = Model.FitCurveHelper.GetInterPointX(CurveExprQH, wrkH); if (intrPts == null || intrPts.Count == 0) { return false; } else { wrkQ = intrPts.Last().X; return true; } } private void SetQHLineByWorkPt() { SeriesQHline.Visible = true; SeriesQHline.Points.Clear(); if (CoordinateParas == null) { SeriesQHline.Points.Add(new SeriesPoint(0, workPt.H)); } else { SeriesQHline.Points.Add(new SeriesPoint(CoordinateParas.CoordMinQ, workPt.H)); } SeriesQHline.Points.Add(new SeriesPoint(workPt.Q, workPt.H)); } bool isMoveWorkRefLine = false; bool isMoveSeriesQHline = false; private void chartControl1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { ChartHitInfo hitInfo = chartControl1.CalcHitInfo(e.Location); if (hitInfo.InConstantLine) { if (hitInfo.ConstantLine == WorkParasLine) isMoveWorkRefLine = true; } else if (hitInfo.InSeries) { if (hitInfo.Series == SeriesQHline) isMoveSeriesQHline = true; } else { DiagramCoordinates coordPt = mainChartDiagram.PointToDiagram(e.Location); double refQ = coordPt.NumericalArgument; double refH = coordPt.NumericalValue; } } //if (isRectSel) //{//进行框选删除点 // Rectangle bounds = CalculateDiagramBounds(); // if (bounds.Contains(e.Location)) // { // selCornerFirstPt = selCornerLastPt = e.Location; // selRectangleIng = Rectangle.Empty; // } //} } private void chartControl1_MouseMove(object sender, MouseEventArgs e) { if (isMoveWorkRefLine) { DiagramCoordinates coordPt = mainChartDiagram.PointToDiagram(e.Location); double refQ = coordPt.NumericalArgument; CalcWorkPtByQ(refQ); SetQHLineByWorkPt(); } else if (isMoveSeriesQHline) { DiagramCoordinates coordPt = mainChartDiagram.PointToDiagram(e.Location); double refH = coordPt.NumericalValue; double refQ = 0; if (CalcWorkQByH(refH, ref refQ)) { CalcWorkPtByQ(refQ); SetQHLineByWorkPt(); } } } private void chartControl1_MouseUp(object sender, MouseEventArgs e) { if (isMoveWorkRefLine || isMoveSeriesQHline) { if (OnChangeWorkPt != null) { OnChangeWorkPt(this, new TagEventArgs(workPt)); } } isMoveWorkRefLine = false; isMoveSeriesQHline = false; //if (isRectSel) //{ // isRectSel = false; // #region 框选删除 // if (isRectSelDelPts) // {// // isRectSelDelPts = false; // DiagramCoordinates firstCoordinate = theXYDiagram.PointToDiagram(selCornerFirstPt); // DiagramCoordinates lastCoordinate = theXYDiagram.PointToDiagram(selCornerLastPt); // if (firstCoordinate.IsEmpty || lastCoordinate.IsEmpty) // return; // PointF firstPoint = new PointF((float)firstCoordinate.NumericalArgument, (float)firstCoordinate.NumericalValue); // PointF lastPoint = new PointF((float)lastCoordinate.NumericalArgument, (float)lastCoordinate.NumericalValue); // //foreach (var pt in clickPointInfo) // //{ // // if (pt.X < lastPoint.X && pt.X > firstPoint.X && pt.Y > lastPoint.Y && pt.Y < firstPoint.Y) // // { // // clickPointInfo.Remove(pt); // // } // //} // for (int i = clickPointInfo.Count - 1; i >= 0; i--) // { // var pt = clickPointInfo[i]; // if (pt.X < lastPoint.X && pt.X > firstPoint.X && pt.Y > lastPoint.Y && pt.Y < firstPoint.Y) // { // clickPointInfo.Remove(pt); // } // } // SeriesPoint.Points.Clear(); // foreach (var ftPoint in clickPointInfo) // { // SeriesPoint.Points.Add(new SeriesPoint(ftPoint.X, new double[] { ftPoint.Y })); // } // } // #endregion //} //selCornerFirstPt = Point.Empty; //selCornerLastPt = Point.Empty; //selRectangleIng = Rectangle.Empty; } #endregion #region 定位高效点 protected Model.CurvePoint ShowMaxEffPt() { if (SeriesQEcurve.Visible && CurveInfoQE != null && CurveInfoQE.Count > 3) { var maxE = Model.FitCurveHelper.GetMaxPoint(CurveExprQE); DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPoint1 = TextAnnotationMaxE.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint; paneAnchorPoint1.AxisXCoordinate.AxisValue = maxE.X.ToString(); paneAnchorPoint1.AxisYCoordinate.AxisValue = maxE.Y.ToString(); StringBuilder builder = new StringBuilder(); builder.AppendFormat("高效点 流量:{0:N1}; ", maxE.X); double H = Model.FitCurveHelper.GetFitPointY(CurveExprQH, maxE.X); if (_hIsPress) { builder.AppendFormat("压差:{0:N4}", H); } else { builder.AppendFormat("扬程:{0:N1}", H); } builder.AppendLine(""); builder.AppendFormat(" 效率:{0:N1}; ", maxE.Y); if (CurveInfoQP != null) { double P = Model.FitCurveHelper.GetFitPointY(CurveExprQP, maxE.X); builder.AppendFormat("功率:{0:N1} ", P); } TextAnnotationMaxE.Visible = true; TextAnnotationMaxE.Text = builder.ToString(); SetWorkPointQ(maxE.X); return maxE; } return null; } private bool isDispMaxE = false; private void 定位最高效率点MenuItem_Click(object sender, EventArgs e) { isDispMaxE = !isDispMaxE; if (isDispMaxE) { 定位最高效率点MenuItem.Text = "不定位最高效率点"; ShowMaxEffPt(); 定位最高流量点MenuItem.Text = "定位最高流量点"; isDispMaxH = false; } else { 定位最高效率点MenuItem.Text = "定位最高效率点"; TextAnnotationMaxE.Visible = false; } } #endregion #region 定位最高流量点 private bool isDispMaxH = false; private void 定位最高流量点MenuItem_Click(object sender, EventArgs e) { isDispMaxH = !isDispMaxH; if (isDispMaxH) { 定位最高流量点MenuItem.Text = "不定位最高流量点"; ShowMaxQPoint(); 定位最高效率点MenuItem.Text = "定位最高效率点"; isDispMaxE = false; } else { 定位最高流量点MenuItem.Text = "定位最高流量点"; TextAnnotationMaxE.Visible = false; } } protected Model.CurvePoint ShowMaxQPoint() { if (SeriesQEcurve.Visible && CurveExprQH != null && CurveInfoQH.Count > 3) { var maxQ = CurveInfoQH.OrderBy(x => x.X).Last(); DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPoint1 = TextAnnotationMaxE.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint; paneAnchorPoint1.AxisXCoordinate.AxisValue = maxQ.X.ToString(); paneAnchorPoint1.AxisYCoordinate.AxisValue = maxQ.Y.ToString(); StringBuilder builder = new StringBuilder(); builder.AppendFormat("最大 流量:{0:N1}; ", maxQ.X); double H = Model.FitCurveHelper.GetFitPointY(CurveExprQH, maxQ.X); if (_hIsPress) { builder.AppendFormat("压差:{0:N4}", H); } else { builder.AppendFormat("扬程:{0:N1}", H); } builder.AppendLine(""); builder.AppendFormat(" 效率:{0:N1}; ", maxQ.Y); if (CurveInfoQP != null) { double P = Model.FitCurveHelper.GetFitPointY(CurveExprQP, maxQ.X); builder.AppendFormat("功率:{0:N1} ", P); } TextAnnotationMaxE.Visible = true; TextAnnotationMaxE.Text = builder.ToString(); SetWorkPointQ(maxQ.X); return maxQ; } return null; } #endregion #region 压差曲线还是扬程曲线 private bool _hIsPress = false;//H表示是false扬程还是true压差 public bool HIsPress { get { return _hIsPress; } } public TagEventHandler OnChangeAxisTypeH = null; private void 转化为压差曲线MenuItem_Click(object sender, EventArgs e) { _hIsPress = !_hIsPress; if (OnChangeAxisTypeH != null) { if (_hIsPress) { _unitH = Unit.eUnitH.MPa; XtraChartHelper.SetAxisName(QHAxisY, "压差", _unitH); } else { _unitH = Unit.eUnitH.M; XtraChartHelper.SetAxisName(QHAxisY, "扬程", _unitH); } OnChangeAxisTypeH(this, new TagEventArgs(_hIsPress)); } } #endregion #region 装置曲线 //EquipCurveParas _equipmentCurveParas = null; //bool isDispEquipmentCurve = false; private void 设置装置曲线MenuItem_Click(object sender, EventArgs e) { SetEquipmentCurve(); } private void 显示装置曲线MenuItem_Click(object sender, EventArgs e) { /* if (_equipmentCurveParas == null) { SetEquipmentCurve(); } else { 显示装置曲线MenuItem.Checked = !显示装置曲线MenuItem.Checked; isDispEquipmentCurve = 显示装置曲线MenuItem.Checked; TextAnnotationEquip.Visible = isDispEquipmentCurve; 设置装置曲线MenuItem.Visible = isDispEquipmentCurve; chartControl1.Refresh(); }*/ } public void SetEquipmentCurve() { //SetEquipmentCurveDlg theDlg = new SetEquipmentCurveDlg(); //if (_equipmentCurveParas != null) //{ // theDlg.SetEquipmentCurve(_equipmentCurveParas); //} //if (theDlg.ShowDialog() == DialogResult.OK) //{ // _equipmentCurveParas = theDlg.GetEquipmentCurve(); // if (!isDispEquipmentCurve) // { // 显示装置曲线MenuItem.Checked = true; // 设置装置曲线MenuItem.Visible = true; // isDispEquipmentCurve = true; // } // TextAnnotationEquip.Visible = true; // DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPoint1 = TextAnnotationEquip.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint; // paneAnchorPoint1.AxisXCoordinate.AxisValue = _equipmentCurveParas.CurveInfo[2].X.ToString(); // paneAnchorPoint1.AxisYCoordinate.AxisValue = _equipmentCurveParas.CurveInfo[2].Y.ToString(); // chartControl1.Refresh(); //} } public void ClearEquipmentCurve() { //_equipmentCurveParas = null; chartControl1.Refresh(); TextAnnotationEquip.Visible = false; } #endregion #region 延长曲线 //public event EventHandler OnExtendCurve = null; private void 延长曲线Item_Click(object sender, EventArgs e) { //if (_groupPoints == null || _groupPoints.Count < 4) // return; //var testPointMaxQ = (from x in _groupPoints select x.Q).Max(); //SetCurveExtendParasDlg theDlg = new SetCurveExtendParasDlg(); //theDlg.MaxQ = Convert.ToDecimal(Math.Round(_CurveMaxQ, 0)); //if (theDlg.ShowDialog() == DialogResult.OK) //{ // double extendRatio = Convert.ToDouble(theDlg.MaxQ) / testPointMaxQ; // List PointInfoQH = new List(); // List PointInfoQE = new List(); // List PointInfoQP = new List(); // foreach ( Model.GroupPoint pt in _groupPoints) // { // PointInfoQH.Add(new Model.CurvePoint(pt.Q, pt.H)); // PointInfoQE.Add(new Model.CurvePoint(pt.Q, pt.E)); // PointInfoQP.Add(new Model.CurvePoint(pt.Q, pt.P)); // } // this.CurveInfoQH = Model.FitCurveHelper.GetFitPointsByExtend(PointInfoQH, extendRatio); // this.CurveInfoQE = Model.FitCurveHelper.GetFitPointsByExtend(PointInfoQE, extendRatio); // this.CurveInfoQP = Model.FitCurveHelper.GetFitPointsByExtend(PointInfoQP, extendRatio); // this.CurveExprQH = CurveExpressConver.ToParameter(this.CurveInfoQH); // _CurveMinQ = (from x in this.CurveInfoQH select x.X).Min(); // _CurveMaxQ = (from x in this.CurveInfoQH select x.X).Max(); // _CurveMinH = (from x in this.CurveInfoQH select x.Y).Min(); // _CurveMaxH = (from x in this.CurveInfoQH select x.Y).Max(); // UpdateChart(false); // if (OnExtendCurve != null) // OnExtendCurve(this, e); //} } #endregion private void MenuItem导出曲线上的点12个点_Click(object sender, EventArgs e) { ExportToXLS.Export(this.CurveExprQH, this.CurveExprQE, this.CurveExprQP, 12); } /// /// 导出Excel /// public void ExportExcel() { IStation.WinFrmUI.Curve.ExportToXLS.Export(this.CurveExprQH, this.CurveExprQE, this.CurveExprQP, 12); } } }