using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.IO; using DevExpress.XtraEditors; using IStation.Extensions; namespace IStation.WinFrmUI.Curve { /// /// 图片导入曲线控件窗体 /// 下次优化 /// 1.上一步下一步 记住选择范围 /// 2.曲线来源带入 /// 3.保存 /// 4.代码整理 /// public partial class SetCurveInfoByPictureDlg : DevExpress.XtraBars.Ribbon.RibbonForm { /// /// 构造函数 /// public SetCurveInfoByPictureDlg() { InitializeComponent(); InitialSelDisplayMode(); InitialCurveFitType(); InitialUnitQ(); InitialEvent(); } /// /// 数据返回事件 /// public event Action ReloadDataEvent; private List _picQHPoints=null; private List _picQEPoints =null; private List _picQPPoints =null; private Model.eCurveFitType _fitTypeQH= Model.eCurveFitType.ConicCurve; private Model.eCurveFitType _fitTypeQE = Model.eCurveFitType.ConicCurve; private Model.eCurveFitType _fitTypeQP = Model.eCurveFitType.ConicCurve; /// /// 绑定数据 /// public void SetBindingData() { LoadRibPage(this.PageQH); } #region 初始化事件 /// /// 初始化事件 /// private void InitialEvent() { this.setCurveInfoByPictureCtrl1.AllowSelBoundaryEvent += SetCurveInfoByPictureCtrl_AllowSelBoundaryEvent; this.setCurveInfoByPictureCtrl1.AllowSelPickPointEvent += SetCurveInfoByPictureCtrl1_AllowSelPickPointEvent; } //允许设置坐标事件 private void SetCurveInfoByPictureCtrl_AllowSelBoundaryEvent(bool obj) { this.barCekSetCoord.Checked = obj; } //允许设置打点事件 private void SetCurveInfoByPictureCtrl1_AllowSelPickPointEvent(bool obj) { this.barCekPickPoint.Checked = obj; } #endregion #region 初始化下拉按钮 /// /// 初始化图片选中方式按钮 /// private void InitialSelDisplayMode() { foreach (PictureBoxSizeMode item in Enum.GetValues(typeof(PictureBoxSizeMode))) { var btn = new DevExpress.XtraBars.BarCheckItem(); btn.Caption = item.ToString(); btn.Id = (int)item; btn.Name = $"barBtn{btn.Caption}"; btn.ItemClick += (object sender, DevExpress.XtraBars.ItemClickEventArgs e) => { foreach (DevExpress.XtraBars.BarCheckItemLink link in barSelDisplayMode.ItemLinks) { ((DevExpress.XtraBars.BarCheckItem)link.Item).Checked = false; } var current_btn = (DevExpress.XtraBars.BarCheckItem)e.Item; current_btn.Checked = true; this.setCurveInfoByPictureCtrl1.SetPictureSizeMode((PictureBoxSizeMode)current_btn.Id); }; if (item == PictureBoxSizeMode.StretchImage) { btn.Checked = true; this.setCurveInfoByPictureCtrl1.SetPictureSizeMode(item); } this.barSelDisplayMode.AddItem(btn); } } /// /// 初始化曲线拟合方式 /// private void InitialCurveFitType() { foreach (Model.eCurveFitType item in Enum.GetValues(typeof(Model.eCurveFitType))) { var btn = new DevExpress.XtraBars.BarCheckItem(); btn.Caption = item.GetDisplayText(); btn.Id = (int)item; btn.Name = $"barBtn{btn.Caption}"; btn.ItemClick += (object sender, DevExpress.XtraBars.ItemClickEventArgs e) => { foreach (DevExpress.XtraBars.BarCheckItemLink link in barSubCurveFitType.ItemLinks) { ((DevExpress.XtraBars.BarCheckItem)link.Item).Checked = false; } var current_btn = (DevExpress.XtraBars.BarCheckItem)e.Item; current_btn.Checked = true; this.setCurveInfoByPictureCtrl1.CurrentCaptureCruveFitType = (Model.eCurveFitType)current_btn.Id; this.setCurveInfoByPictureCtrl1.RefreshPictureShape(); }; if (item == Model.eCurveFitType.CubicCurve) { btn.Checked = true; this.setCurveInfoByPictureCtrl1.CurrentCaptureCruveFitType = item; } this.barSubCurveFitType.AddItem(btn); } } /// /// 初始化流量单位 /// private void InitialUnitQ() { foreach (Unit.eUnitQ item in Enum.GetValues(typeof(Unit.eUnitQ))) { var btn = new DevExpress.XtraBars.BarCheckItem(); btn.Caption = item.ToString(); btn.Id = (int)item; btn.Name = $"barBtn{btn.Caption}"; btn.ItemClick += (object sender, DevExpress.XtraBars.ItemClickEventArgs e) => { foreach (DevExpress.XtraBars.BarCheckItemLink link in barSubUnitQ.ItemLinks) { ((DevExpress.XtraBars.BarCheckItem)link.Item).Checked = false; } var current_btn = (DevExpress.XtraBars.BarCheckItem)e.Item; current_btn.Checked = true; this.setCurveInfoByPictureCtrl1.UnitQ = (Unit.eUnitQ)current_btn.Id; }; if (item == Unit.eUnitQ.M3H) { btn.Checked = true; this.setCurveInfoByPictureCtrl1.UnitQ = item; } this.barSubUnitQ.AddItem(btn); } } #endregion /// /// 初始化图表坐标 /// private bool InitialChartCoord() { switch (this.setCurveInfoByPictureCtrl1.CurrentCaptureCruve) { case Model.eFeatCurveType.QH: { if (this.barTxtMaxQ.EditValue == null || this.barTxtMinQ.EditValue == null || this.barTxtMaxH.EditValue == null || this.barTxtMinH.EditValue == null) { XtraMessageBox.Show("请将输入坐标!"); return false; } this.setCurveInfoByPictureCtrl1.ChartMaxX = Convert.ToDouble(this.barTxtMaxQ.EditValue); this.setCurveInfoByPictureCtrl1.ChartMinX = Convert.ToDouble(this.barTxtMinQ.EditValue); this.setCurveInfoByPictureCtrl1.ChartMaxY = Convert.ToDouble(this.barTxtMaxH.EditValue); this.setCurveInfoByPictureCtrl1.ChartMinY = Convert.ToDouble(this.barTxtMinH.EditValue); } break; case Model.eFeatCurveType.QE: { if (this.barTxtMaxE.EditValue == null || this.barTxtMinE.EditValue == null) { XtraMessageBox.Show("请将输入坐标!"); return false; } this.setCurveInfoByPictureCtrl1.ChartMaxY = Convert.ToDouble(this.barTxtMaxE.EditValue); this.setCurveInfoByPictureCtrl1.ChartMinY = Convert.ToDouble(this.barTxtMinE.EditValue); } break; case Model.eFeatCurveType.QP: { if (this.barTxtMaxP.EditValue == null || this.barTxtMinP.EditValue == null) { XtraMessageBox.Show("请将输入坐标!"); return false; } this.setCurveInfoByPictureCtrl1.ChartMaxY = Convert.ToDouble(this.barTxtMaxP.EditValue); this.setCurveInfoByPictureCtrl1.ChartMinY = Convert.ToDouble(this.barTxtMinP.EditValue); } break; } return true; } //打开文件 private void barBtnOpenFile_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var dlg = new System.Windows.Forms.OpenFileDialog(); dlg.Filter = "*.BMP;*.JPG;*.GIF;*.PNG|*.BMP;*.JPG;*.GIF;*.PNG"; DialogResult ret = dlg.ShowDialog(); if (ret != System.Windows.Forms.DialogResult.OK) return; this.setCurveInfoByPictureCtrl1.SetBindingData(dlg.FileName); } #region 基础操作 /// /// 设置坐标 /// private void barCekSetCoord_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this.barCekSetCoord.Checked) this.setCurveInfoByPictureCtrl1.StartSelectionRange(); } /// /// 获取点 /// private void barCekPickPoint_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this.barCekPickPoint.Checked) { if (!(this.setCurveInfoByPictureCtrl1.CurrentCaptureCruve == Model.eFeatCurveType.QE && this.barCheckItem打点等效线.Checked)) { if (!InitialChartCoord()) { this.barCekPickPoint.Checked = false; return; } } if (!this.setCurveInfoByPictureCtrl1.StartPickPoint()) { this.barCekPickPoint.Checked = false; this.setCurveInfoByPictureCtrl1.EndPickPoint(); return; } } else { this.setCurveInfoByPictureCtrl1.EndPickPoint(); } } /// /// 清空点 /// private void barBtnClear_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.setCurveInfoByPictureCtrl1.ClearPickPoint(); } /// /// 刷新 /// private void barBtnReload_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.setCurveInfoByPictureCtrl1.RefreshPictureShape(); } #endregion /// /// 加载页面 /// /// 当前页 private void LoadRibPage(DevExpress.XtraBars.Ribbon.RibbonPage selPage) { selPage.Visible = true; foreach (DevExpress.XtraBars.Ribbon.RibbonPage tab in this.RibbCtrl.Pages) { if (tab != selPage) tab.Visible = false; } if (selPage == this.PageQH) { this.setCurveInfoByPictureCtrl1.CurrentCaptureCruve = Model.eFeatCurveType.QH; if (_picQHPoints != null) this.setCurveInfoByPictureCtrl1.RefreshPictureShape(_picQHPoints); } else if (selPage == this.PageQE) { this.setCurveInfoByPictureCtrl1.CurrentCaptureCruve = Model.eFeatCurveType.QE; if (_picQEPoints != null) this.setCurveInfoByPictureCtrl1.RefreshPictureShape(_picQEPoints); } else if (selPage == this.PageQP) { this.setCurveInfoByPictureCtrl1.CurrentCaptureCruve = Model.eFeatCurveType.QP; if (_picQPPoints != null) this.setCurveInfoByPictureCtrl1.RefreshPictureShape(_picQPPoints); } this.RibbCtrl.SelectedPage = selPage; } /// /// 上一步 /// private void barBtnPreviousStep_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this.RibbCtrl.SelectedPage == this.PageQE) { this.LoadRibPage(this.PageQH); } else if (this.RibbCtrl.SelectedPage == this.PageQP) { this.LoadRibPage(this.PageQE); } } /// /// 下一步 /// private void barBtnNextStep_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this.RibbCtrl.SelectedPage == this.PageQH) { if (!SaveQH()) return; this.LoadRibPage(this.PageQE); } else if (this.RibbCtrl.SelectedPage == this.PageQE) { if (!SaveQE()) return; this.LoadRibPage(this.PageQP); } } /// /// 保存 /// private void barBtnSave_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (XtraMessageBox.Show("是否导入?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) != DialogResult.OK) return; if (!SaveQP()) return; #region 临时作废 后续再维护 //var unitQ = this.setCurveInfoByPictureCtrl1.UnitQ; //var pointsQH = new List(); //var pointsQE = new List(); //var pointsQP = new List(); //double rQmin = 0, rQmax = 0; //var picPointInfoQH = _picQHPoints; //var picPointInfoQE = _picQEPoints; //var picPointInfoQP = _picQPPoints; //if (this.setCurveInfoByPictureCtrl1.ChartMinX == 0) // rQmin = 0; //else // rQmin = _picQHPoints.Min(x => x.X); //rQmax = _picQHPoints.Max(x => x.X); ////换算单位 //List m3hPointInfoQH = null; //List m3hPointInfoQE = null; //List m3hPointInfoQP = null; //if (unitQ == Unit.eUnitQ.M3H) //{ // m3hPointInfoQH = picPointInfoQH; // m3hPointInfoQE = picPointInfoQE; // m3hPointInfoQP = picPointInfoQP; //} //else //{ // rQmin = Unit.UnitQHelper.Convert(unitQ, Unit.eUnitQ.M3H, rQmin); // rQmax = Unit.UnitQHelper.Convert(unitQ, Unit.eUnitQ.M3H, rQmax); // m3hPointInfoQH = ToM3H(unitQ, picPointInfoQH); // m3hPointInfoQE = ToM3H(unitQ, picPointInfoQE); // m3hPointInfoQP = ToM3H(unitQ, picPointInfoQP); //} //if (_fitTypeQH == Model.eCurveFitType.ThroughPoint) //{ // if (m3hPointInfoQP == null) // { // pointsQE = m3hPointInfoQE; // pointsQH = m3hPointInfoQH; // pointsQP = new List(); // for (int i = 0; i < m3hPointInfoQE.Count(); i++) // { // var Q = m3hPointInfoQE[i].X; // List resultH = Model.FitCurveHelper.GetInterPointY(m3hPointInfoQH, Q); // if (resultH == null || resultH.Count == 0) // continue; // var H = resultH.Last().Y; // var E = m3hPointInfoQE[i].Y; // var P = Model.CurveCalcuHelper.CalculateP(Q, H, E); // pointsQP.Add(new Model.CurvePoint(Q, P)); // } // } // double startE = 0;//起始点 // if (rQmin > 0.2) // startE = Model.CurveLineHelper.GetYbyX(pointsQE[0].X, pointsQE[0].Y, pointsQE[1].X, pointsQE[1].Y, rQmin); // else // startE = 0; // pointsQE.Insert(0, new Model.CurvePoint(rQmin, startE)); //} //else //{ // //均匀插值点,计算点坐标,首尾2点用延长的方法得到 // int insert_num = 15; // double space = (rQmax - rQmin) / (insert_num - 1); // int i = 0; // double Q = rQmin; // double H, E, P; // for (i = 1; i < insert_num - 1; i++) // { // Q = Q + space; // List resultH = Model.FitCurveHelper.GetInterPointY(m3hPointInfoQH, Q); // if (resultH == null || resultH.Count == 0) // continue; // H = resultH.First().Y; // pointsQH.Add(new Model.CurvePoint(Q, H)); // if (picPointInfoQE != null) // { // List resultE = Model.FitCurveHelper.GetInterPointY(m3hPointInfoQE, Q); // if (resultE == null || resultE.Count == 0) // continue; // E = resultE.First().Y; // P = ViewModel.Model.CurveCalcuHelper.CalculateP(Q, H, E); // } // else // { // List resultP = Model.FitCurveHelper.GetInterPointY(m3hPointInfoQP, Q); // if (resultP == null || resultP.Count == 0) // continue; // P = resultP.First().Y; // E = ViewModel.Model.CurveCalcuHelper.CalculateE(Q, H, P); // } // pointsQP.Add(new Model.CurvePoint(Q, P)); // pointsQE.Add(new Model.CurvePoint(Q, E)); // } // if (!(this.barCekAutoAnalyQP.Checked && this.barCekAutoAnalyQP.Checked)) // { // if (pointsQH.Count < 3 || pointsQE.Count < 3 || pointsQP.Count < 3) // { // pointsQH = null; // pointsQE = null; // pointsQP = null; // XtraMessageBox.Show("未导入足够多的性能曲线点"); // return; // } // } // else // { // if (pointsQH.Count < 3) // { // XtraMessageBox.Show("未导入足够多的性能曲线点"); // return; // } // } // #region 首尾两点的处理:因为首尾2点按流量扬程获取范围,而点击不一定正好首尾2点流量一样 // //流量扬程首尾两点 // double startH = Model.CurveLineHelper.GetYbyX(pointsQH[0].X, pointsQH[0].Y, pointsQH[1].X, pointsQH[1].Y, rQmin); // pointsQH.Insert(0, new Model.CurvePoint(rQmin, startH)); // int point_num = pointsQH.Count;//不一定和insert_num一样 // double endH = Model.CurveLineHelper.GetYbyX(pointsQH[point_num - 2].X, pointsQH[point_num - 2].Y, // pointsQH[point_num - 1].X, pointsQH[point_num - 1].Y, rQmax); // pointsQH.Add(new Model.CurvePoint(rQmax, endH)); // if (pointsQE != null && pointsQE.Count > 0) // { // //流量效率首尾两点 // double startE = 0;//起始点 // if (rQmin > 0.2) // startE = Model.CurveLineHelper.GetYbyX(pointsQE[0].X, pointsQE[0].Y, pointsQE[1].X, pointsQE[1].Y, rQmin); // else // startE = 0; // pointsQE.Insert(0, new Model.CurvePoint(rQmin, startE)); // point_num = pointsQE.Count;//末尾点 // double endE = Model.CurveLineHelper.GetYbyX(pointsQE[point_num - 2].X, pointsQE[point_num - 2].Y, // pointsQE[point_num - 1].X, pointsQE[point_num - 1].Y, rQmax); // pointsQE.Add(new Model.CurvePoint(rQmax, endE)); // } // if (pointsQE != null && pointsQE.Count > 0) // { // //流量功率首尾两点 // double startP = Model.CurveLineHelper.GetYbyX(pointsQP[0].X, pointsQP[0].Y, pointsQP[1].X, pointsQP[1].Y, rQmin); // pointsQP.Insert(0, new Model.CurvePoint(rQmin, startP)); // point_num = pointsQP.Count; // double endP = Model.CurveLineHelper.GetYbyX(pointsQP[point_num - 2].X, pointsQP[point_num - 2].Y, // pointsQP[point_num - 1].X, pointsQP[point_num - 1].Y, rQmax); // pointsQP.Add(new Model.CurvePoint(rQmax, endP)); // } // #endregion //} ////圆整 //pointsQH = Regulate(pointsQH, 2); //pointsQE = Regulate(pointsQE, 2); //pointsQP = Regulate(pointsQP, 2); //var pointListGroup = new Model.FeatCurvePointGroup(); //pointListGroup.PointQH = pointsQH; //pointListGroup.PointQE = pointsQE; //pointListGroup.PointQP = pointsQP; //var curveExpressGroup = new Model.FeatCurveExpressGroup(); //curveExpressGroup.CurveQH = new Model.CurveExpress(pointsQH, _fitTypeQH); //curveExpressGroup.CurveQE = new Model.CurveExpress(pointsQE, _fitTypeQE); //curveExpressGroup.CurveQP = new Model.CurveExpress(pointsQP, _fitTypeQP); //this.ReloadDataEvent?.Invoke(pointListGroup, curveExpressGroup); //this.DialogResult = DialogResult.OK; //this.Close(); #endregion Save(); } /// /// 保存 /// private void Save() { var unitQ = this.setCurveInfoByPictureCtrl1.UnitQ; List pointsQH = new List(); List pointsQE = new List(); List pointsQP = new List(); double MinQ = 0; double MaxQ = 0; if (this.setCurveInfoByPictureCtrl1.ChartMinX == 0) MinQ = 0; else MinQ = _picQHPoints.Min(x => x.X); MaxQ = _picQHPoints.Max(x => x.X); //换算单位 if (unitQ != Unit.eUnitQ.M3H) { MinQ = Unit.UnitQHelper.Convert(unitQ, Unit.eUnitQ.M3H, MinQ); MaxQ = Unit.UnitQHelper.Convert(unitQ, Unit.eUnitQ.M3H, MaxQ); _picQHPoints = ToM3H(unitQ, _picQHPoints); _picQEPoints = ToM3H(unitQ, _picQEPoints); _picQPPoints = ToM3H(unitQ, _picQPPoints); } if (_fitTypeQH == Model.eCurveFitType.ThroughPoint) { if (_picQPPoints == null || _picQPPoints.Count < 1) { pointsQH = _picQHPoints; pointsQE = _picQEPoints; pointsQP = new List(); for (int i = 0; i < _picQEPoints.Count(); i++) { var Q = _picQEPoints[i].X; List resultH = Model.FitCurveHelper.GetInterPointY(_picQHPoints, Q); if (resultH == null || resultH.Count == 0) continue; var H = resultH.Last().Y; var E = _picQEPoints[i].Y; var P = Model.CurveCalcuHelper.CalculateP(Q, H, E); pointsQP.Add(new Model.CurvePoint(Q, P)); } } else { pointsQH = _picQHPoints; pointsQE = _picQEPoints; pointsQP = _picQPPoints; } double startE = 0;//起始点 if (MinQ > 0.2) startE = Model.CurveLineHelper.GetYbyX(pointsQE[0].X, pointsQE[0].Y, pointsQE[1].X, pointsQE[1].Y, MinQ); else startE = 0; pointsQE.Insert(0, new Model.CurvePoint(MinQ, startE)); } else { //均匀插值点,计算点坐标,首尾2点用延长的方法得到 int insert_num = 15; double space = (MaxQ - MinQ) / (insert_num - 1); int i = 0; double Q = MinQ; double H, E=0, P=0; for (i = 1; i < insert_num - 1; i++) { Q = Q + space; List resultH = Model.FitCurveHelper.GetInterPointY(_picQHPoints, Q); if (resultH == null || resultH.Count == 0) continue; H = resultH.First().Y; pointsQH.Add(new Model.CurvePoint(Q, H)); if (!(this.barCekAutoAnalyQP.Checked && this.barCekAutoAnalyQP.Checked)) { List resultE = Model.FitCurveHelper.GetInterPointY(_picQEPoints, Q); List resultP = Model.FitCurveHelper.GetInterPointY(_picQPPoints, Q); E = resultE.First().Y; P = resultP.First().Y; } else if (this.barCekAutoAnalyQP.Checked) { E = Model.FitCurveHelper.GetEventechFitPointY(_picQEPoints, _fitTypeQH, Q); P = Model.CurveCalcuHelper.CalculateP(Q, H, E); } else if (this.barCekAutoAnalyQE.Checked) { List resultP = Model.FitCurveHelper.GetInterPointY(_picQPPoints, Q); if (resultP == null || resultP.Count == 0) continue; P = resultP.First().Y; E = Model.CurveCalcuHelper.CalculateE(Q, H, P); } pointsQP.Add(new Model.CurvePoint(Q, P)); pointsQE.Add(new Model.CurvePoint(Q, E)); } if (!(this.barCekAutoAnalyQP.Checked && this.barCekAutoAnalyQP.Checked)) { if (pointsQH.Count < 3 || pointsQE.Count < 3 || pointsQP.Count < 3) { pointsQH = null; pointsQE = null; pointsQP = null; XtraMessageBox.Show("未导入足够多的性能曲线点"); return; } } else { if (pointsQH.Count < 3) { XtraMessageBox.Show("未导入足够多的性能曲线点"); return; } } #region 首尾两点的处理:因为首尾2点按流量扬程获取范围,而点击不一定正好首尾2点流量一样 //流量扬程首尾两点 double startH = Model.CurveLineHelper.GetYbyX(pointsQH[0].X, pointsQH[0].Y, pointsQH[1].X, pointsQH[1].Y, MinQ); pointsQH.Insert(0, new Model.CurvePoint(MinQ, startH)); int point_num = pointsQH.Count;//不一定和insert_num一样 double endH = Model.CurveLineHelper.GetYbyX(pointsQH[point_num - 2].X, pointsQH[point_num - 2].Y, pointsQH[point_num - 1].X, pointsQH[point_num - 1].Y, MaxQ); pointsQH.Add(new Model.CurvePoint(MaxQ, endH)); if (pointsQE != null && pointsQE.Count > 0) { //流量效率首尾两点 double startE = 0;//起始点 if (MinQ > 0.2) startE = Model.CurveLineHelper.GetYbyX(pointsQE[0].X, pointsQE[0].Y, pointsQE[1].X, pointsQE[1].Y, MinQ); else startE = 0; pointsQE.Insert(0, new Model.CurvePoint(MinQ, startE)); point_num = pointsQE.Count;//末尾点 double endE = Model.CurveLineHelper.GetYbyX(pointsQE[point_num - 2].X, pointsQE[point_num - 2].Y, pointsQE[point_num - 1].X, pointsQE[point_num - 1].Y, MaxQ); pointsQE.Add(new Model.CurvePoint(MaxQ, endE)); } if (pointsQP != null && pointsQP.Count > 0) { //流量功率首尾两点 double startP = Model.CurveLineHelper.GetYbyX(pointsQP[0].X, pointsQP[0].Y, pointsQP[1].X, pointsQP[1].Y, MinQ); pointsQP.Insert(0, new Model.CurvePoint(MinQ, startP)); point_num = pointsQP.Count; double endP = Model.CurveLineHelper.GetYbyX(pointsQP[point_num - 2].X, pointsQP[point_num - 2].Y, pointsQP[point_num - 1].X, pointsQP[point_num - 1].Y, MaxQ); pointsQP.Add(new Model.CurvePoint(MaxQ, endP)); } #endregion } //圆整 pointsQH = Regulate(pointsQH, 2); pointsQE = Regulate(pointsQE, 2); pointsQP = Regulate(pointsQP, 2); var pointListGroup = new Model.FeatCurvePointGroup(); pointListGroup.PointQH = pointsQH; pointListGroup.PointQE = pointsQE; pointListGroup.PointQP = pointsQP; var curveExpressGroup = new Model.FeatCurveExpressGroup(); curveExpressGroup.CurveQH = new Model.CurveExpress(pointsQH, _fitTypeQH); curveExpressGroup.CurveQE = new Model.CurveExpress(pointsQE, _fitTypeQE); curveExpressGroup.CurveQP = new Model.CurveExpress(pointsQP, _fitTypeQP); this.ReloadDataEvent?.Invoke(pointListGroup, curveExpressGroup); this.DialogResult = DialogResult.OK; this.Close(); } #region 保存 /// /// 保存扬程线 /// private bool SaveQH() { _fitTypeQH = this.setCurveInfoByPictureCtrl1.CurrentCaptureCruveFitType; if (!this.setCurveInfoByPictureCtrl1.GetPicPointInCurve(out List QH)) return false; _picQHPoints = QH; return true; } /// /// 保存效率线 /// private bool SaveQE() { _picQEPoints = null; _fitTypeQE = this.setCurveInfoByPictureCtrl1.CurrentCaptureCruveFitType; if (!this.barCekAutoAnalyQE.Checked) { if (!this.setCurveInfoByPictureCtrl1.GetPicPointInCurve(out List QE)) return false; _picQEPoints = QE; } return true; } /// /// 保存功率线 /// private bool SaveQP() { _picQPPoints = null; _fitTypeQP = this.setCurveInfoByPictureCtrl1.CurrentCaptureCruveFitType; if (!this.barCekAutoAnalyQP.Checked) { if (!this.setCurveInfoByPictureCtrl1.GetPicPointInCurve(out List QP)) return false; var fitType = this.setCurveInfoByPictureCtrl1.CurrentCaptureCruveFitType; _picQPPoints = QP; } return true; } #endregion /// /// 打点等效线 /// private void barCheckItem打点等效线_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.setCurveInfoByPictureCtrl1.IsCaputueEtaPtInEqupCurve = this.barCheckItem打点等效线.Checked; } private List ToM3H(Unit.eUnitQ unit, List points) { if (unit == Unit.eUnitQ.M3H) { return points; } if (points == null) { return null; } var list = new List(); for (int i = 0; i < points.Count; i++) { var point = new Model.CurvePoint(points[i]); point.X = Unit.UnitQHelper.Convert(unit, Unit.eUnitQ.M3H, point.X); list.Add(point); } return list; } //四舍五入圆整,如 0.44 -> 0.4 , 0.46 -> 0.5//flag--小数点后位数 public static List Regulate(List inPoints, int flag) { if (inPoints == null) return null; List outPoints = new List(); for (int i = 0; i < inPoints.Count(); i++) { outPoints.Add(new Model.CurvePoint(Regulate(inPoints[i].X, flag), Regulate(inPoints[i].Y, flag))); } return outPoints; } //四舍五入圆整,如 0.44 -> 0.4 , 0.46 -> 0.5//flag--小数点后位数 public static double Regulate(double v, int flag) { bool isNegative = false; //如果是负数 if (v < 0) { isNegative = true; v = Math.Abs(v); } else { isNegative = false; } double value = Math.Round(v, flag); if (isNegative) { value = -value; } return value; } private void barCekAutoAnalyQP_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { } } }