using DevExpress.XtraCharts; using DevExpress.XtraEditors; using IStation.Model; using IStation.WinFrmUI.Curve; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Runtime; using System.Windows.Forms; namespace IStation.WinFrmUI.Monitor { /// /// 单泵分析步骤图表控件 /// public partial class AnaSingleStepMgrPage : DocumentPage { public AnaSingleStepMgrPage() { InitializeComponent(); bci结束手动打点.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; bbi结束框选拟合.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; bbi计算曲线.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; this.chartControl1.OnCompleteRectSelect += ChartBoxSelHelper_BoxSelCompletedEvent; } public AnaSingleStepMgrPage(SurfaceGuid sguid, string pageCaption) : this() { this.SurfaceGuid = sguid; this.PageTitle.Caption = pageCaption; this.ribbonControl1.Pages[0].Text = pageCaption; } private long _projectId, _sceneId; private Model.CurveAnaStep _analyStep; private Model.CurveAnaStepResult _analyStepResult; private List _allAnaPoints = null; private Model.eFeatCurveType _currentCurveType = eFeatCurveType.QH; private FeatCurveExpressGroupEx _curveFitCurveInfo = null; private Model.FeatCurveExMapping _referenceCurve = null; private class FeatCurveExpressGroupEx : Model.FeatCurveExpressGroup { public FeatCurveExpressGroupEx() { } public FeatCurveExpressGroupEx(string dsString) : base(dsString) { if (this.CurveQH != null) FitTypeQH = this.CurveQH.FitType; if (this.CurveQE != null) FitTypeQE = this.CurveQE.FitType; if (this.CurveQP != null) FitTypeQP = this.CurveQP.FitType; } public IStation.Model.eCurveFitType FitTypeQH = eCurveFitType.CubicCurve; public IStation.Model.eCurveFitType FitTypeQE = eCurveFitType.CubicCurve; public IStation.Model.eCurveFitType FitTypeQP = eCurveFitType.CubicCurve; public void SetPickSelPoint(Model.eFeatCurveType currentCurveType, List points) { if (currentCurveType == eFeatCurveType.QH) { this.CurveQH = new CurveExpress(points, FitTypeQH, true); this.PointMethodQH = eCurveFitPointMethod.ManuPick; } if (currentCurveType == eFeatCurveType.QE) { this.CurveQE = new CurveExpress(points, FitTypeQE, true); this.PointMethodQE = eCurveFitPointMethod.ManuPick; } if (currentCurveType == eFeatCurveType.QP) { this.CurveQP = new CurveExpress(points, FitTypeQP, true); this.PointMethodQP = eCurveFitPointMethod.ManuPick; } } public void SetBoxSelPoint(Model.eFeatCurveType currentCurveType, List points) { if (currentCurveType == eFeatCurveType.QH) { this.CurveQH = new CurveExpress(points, FitTypeQH, true); this.PointMethodQH = eCurveFitPointMethod.ManuBox; } if (currentCurveType == eFeatCurveType.QE) { this.CurveQE = new CurveExpress(points, FitTypeQE, true); this.PointMethodQE = eCurveFitPointMethod.ManuBox; } if (currentCurveType == eFeatCurveType.QP) { this.CurveQP = new CurveExpress(points, FitTypeQP, true); this.PointMethodQP = eCurveFitPointMethod.ManuBox; } } //拟合线 public List GetFitCurvePointInfo(Model.eFeatCurveType currentCurveType, List _allAnaPoints) { if (_allAnaPoints == null || _allAnaPoints.Count < 4) return null; switch (currentCurveType) { case eFeatCurveType.QH: { if (this.CurveQH != null && this.CurveQH.DefinePoints != null) { if (this.PointMethodQH == eCurveFitPointMethod.ManuPick || this.PointMethodQH == eCurveFitPointMethod.ManuBox) return FitCurveHelper.GetFitPoints(this.CurveQH.DefinePoints, this.FitTypeQH, 10); } var allPoints = _allAnaPoints.Select(x => new Model.CurvePoint(x.Qa, x.Ha)).ToList(); var points = FitCurveHelper.GetFitPoints(allPoints, this.FitTypeQH, 10); this.CurveQH = new CurveExpress(points, this.FitTypeQH); return points; } case eFeatCurveType.QE: { if (this.CurveQE != null && this.CurveQE.DefinePoints != null) { if (this.PointMethodQE == eCurveFitPointMethod.ManuPick || this.PointMethodQE == eCurveFitPointMethod.ManuBox) return FitCurveHelper.GetFitPoints(this.CurveQE.DefinePoints, this.FitTypeQE, 10); if (this.PointMethodQE == eCurveFitPointMethod.QHEP) return FitCurveHelper.GetFitPoints(this.CurveQE.DefinePoints, this.FitTypeQE, 10); } var allPoints = _allAnaPoints.Select(x => new Model.CurvePoint(x.Qa, x.Ea)).ToList(); var points = FitCurveHelper.GetFitPoints(allPoints, this.FitTypeQE, 10); this.CurveQE = new CurveExpress(points, this.FitTypeQE); return points; } case eFeatCurveType.QP: { if (this.CurveQP != null && this.CurveQP.DefinePoints != null) { if (this.PointMethodQP == eCurveFitPointMethod.ManuPick || this.PointMethodQP == eCurveFitPointMethod.ManuBox) return FitCurveHelper.GetFitPoints(this.CurveQP.DefinePoints, this.FitTypeQP, 10); if (this.PointMethodQP == eCurveFitPointMethod.QHEP) return FitCurveHelper.GetFitPoints(this.CurveQP.DefinePoints, this.FitTypeQP, 10); } var allPoints = _allAnaPoints.Select(x => new Model.CurvePoint(x.Qa, x.Pa)).ToList(); var points = FitCurveHelper.GetFitPoints(allPoints, this.FitTypeQP, 10); this.CurveQP = new CurveExpress(points, this.FitTypeQP); return points; } } return null; } } /// /// 初始化数据 /// public void SetBindingData(long projectId, long seneId, Model.CurveAnaStep analyStep) { if (analyStep == null) return; WaitFrmHelper.ShowWaitForm(); _projectId = projectId; _sceneId = seneId; _analyStep = analyStep; _analyStepResult = new BLL.CurveAnaStepResult().GetByAnaStepId(_projectId, _sceneId, _analyStep.AnaSchemeId, _analyStep.Id); if (_analyStepResult == null) { _analyStepResult = new Model.CurveAnaStepResult(); _analyStepResult.Caption = _analyStep.Name; _curveFitCurveInfo = new FeatCurveExpressGroupEx(); } else { _curveFitCurveInfo = new FeatCurveExpressGroupEx(_analyStepResult.CurveInfo); if (_curveFitCurveInfo.CurveQE == null) { this.barCekQE.Checked = true; } if (_curveFitCurveInfo.CurveQP == null) { this.barCekQP.Checked = true; } } if (_curveFitCurveInfo != null) { this.barCekFitCurveShow.Checked = true; } InitialPoints(); InitialFeatCurveType(Model.eFeatCurveType.QH); WaitFrmHelper.HideWaitForm(); this.barCekQP.Checked = false; this.barCekQH.Checked = true; this.barCekQE.Checked = false; } #region 删除 //清除负值 private void barBtnClearNegative_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (XtraMessageBox.Show("确认清除所有负值吗?", "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) { return; } var TimeList = _allAnaPoints?.Where(x => x.Qa < 0).Select(x => x.Time).ToList(); if (TimeList == null || TimeList.Count < 1) { XtraMessageBox.Show("未检索到负值!"); return; } DeleteByTimeList(TimeList); UpdateCoordinate(); } //清除零值 private void barBtnClearZero_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (XtraMessageBox.Show("确认清除所有零值吗?", "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) { return; } var TimeList = _allAnaPoints?.Where(x => x.Qa == 0).Select(x => x.Time).ToList(); if (TimeList == null || TimeList.Count < 1) { XtraMessageBox.Show("未检索到零值!"); return; } DeleteByTimeList(TimeList); } private void DeleteByTimeList(List dateTimes) { if (dateTimes == null || dateTimes.Count < 1) { XtraMessageBox.Show("无数据!"); return; } var lays = this.chartControl1.ShowOverlay(); dateTimes = dateTimes.OrderByDescending(x => x).ToList(); var minTime = dateTimes.Min(); var maxTime = dateTimes.Max(); var minIndex = _allAnaPoints.FindIndex(x => x.Time == minTime); var maxIndex = _allAnaPoints.FindIndex(x => x.Time == maxTime); var delIndex = 0; for (int i = maxIndex; i >= minIndex; i--) { var item = _allAnaPoints[i]; for (int j = delIndex; j < dateTimes.Count; j++) { var delItem = dateTimes[j]; if (item.Time == delItem) { _allAnaPoints.RemoveAt(i); delIndex = j++; break; } } } this.chartControl1.RefreshPointInfo(_allAnaPoints); if (this.barCekFitCurveShow.Checked) { RefreshFitCurve(); } var result = new BLL.CurveAnaRecord().Disabled(_projectId, _sceneId, _analyStep.AnaSchemeId, _analyStep.StructureId, _analyStep.RunningFlag, _analyStep.RunningCount, dateTimes); if (!result) { lays.Close(); XtraMessageBox.Show("数据设置无效失败!"); return; } lays.Close(); } #endregion #region 拟合曲线 private void bbi计算曲线_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this._curveFitCurveInfo == null) return; if (_curveFitCurveInfo.CurveQP == null || _curveFitCurveInfo.CurveQH == null) return; var qe = new Model.CurveExpress(); var min_q = Math.Min(_curveFitCurveInfo.CurveQH.Min, _curveFitCurveInfo.CurveQP.Min); var max_q = Math.Max(_curveFitCurveInfo.CurveQH.Max, _curveFitCurveInfo.CurveQP.Max); double space_q = (max_q - min_q) / 9; if (space_q <= 0.1) return; List pts = new List(); for (int i = 0; i < 10; i++) { var q = min_q + i * space_q; var h = IStation.Common.FitCurveHelper.GetFitPointY(_curveFitCurveInfo.CurveQH, q); var p = IStation.Common.FitCurveHelper.GetFitPointY(_curveFitCurveInfo.CurveQP, q); var eta = IStation.Common.PumpParaHelper.CalculateE(q, h, p); if (eta < 100) { pts.Add(new CurvePoint(q, eta)); } } _curveFitCurveInfo.PointMethodQE = eCurveFitPointMethod.QHEP; _curveFitCurveInfo.CurveQE = new CurveExpress(pts, _curveFitCurveInfo.FitTypeQE, true); this.barCekFitCurveShow.Checked = true; this.chartControl1.SetCustomerPointInfo(pts); RefreshFitCurve(); } private void InitialPoints() { _allAnaPoints = new List(); var etaRecords = new BLL.CurveAnaRecord().GetUseContentByRunningFlagAndRunningCount(_projectId, _sceneId, _analyStep.AnaSchemeId, _analyStep.RunningFlag, _analyStep.RunningCount, _analyStep.MinTime, _analyStep.MaxTime); if (etaRecords != null && etaRecords.Count > 0) { var single = Model.CurveAnaStep.Single.ToModel(_analyStep.StepConfig); if (single != null) { if (single.MinTime != null) { etaRecords = etaRecords.Where(x => x.Time >= single.MinTime).ToList(); } if (single.MaxTime != null) { etaRecords = etaRecords.Where(x => x.Time <= single.MaxTime).ToList(); } if (single.MinHz != null) { etaRecords = etaRecords.Where(x => x.HZ[0] >= single.MinHz.Value).ToList(); } if (single.MaxHz != null) { etaRecords = etaRecords.Where(x => x.HZ[0] <= single.MaxHz.Value).ToList(); } } for (int i = 0; i < etaRecords.Count; i++) { var record = etaRecords[i]; var analyPoint = CurveAnaPointHelper.GetAnaPoint(record); _allAnaPoints.Add(analyPoint); } } this.barCekQH.Checked = true; GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(2, GCCollectionMode.Forced); GC.WaitForFullGCComplete(); this.chartControl1.InitialPointInfo(_allAnaPoints); } private void RefreshFitCurve() { var curvePointList = this._curveFitCurveInfo.GetFitCurvePointInfo(this._currentCurveType, this._allAnaPoints); this.chartControl1.SetCurveInfo(curvePointList); if (this._currentCurveType == eFeatCurveType.QH) { if (this._curveFitCurveInfo.CurveQH != null && _curveFitCurveInfo.PointMethodQH == eCurveFitPointMethod.ManuPick) { this.chartControl1.SetCustomerPointInfo(_curveFitCurveInfo.CurveQH.DefinePoints); } } else if (this._currentCurveType == eFeatCurveType.QE) { if (this._curveFitCurveInfo.CurveQE != null && _curveFitCurveInfo.PointMethodQE == eCurveFitPointMethod.ManuPick) { this.chartControl1.SetCustomerPointInfo(_curveFitCurveInfo.CurveQE.DefinePoints); } } else if (this._currentCurveType == eFeatCurveType.QP) { if (this._curveFitCurveInfo.CurveQP != null && _curveFitCurveInfo.PointMethodQP == eCurveFitPointMethod.ManuPick) { this.chartControl1.SetCustomerPointInfo(_curveFitCurveInfo.CurveQP.DefinePoints); } } if (_referenceCurve != null) { var curveInfo = _referenceCurve.CurveInfo; switch (_currentCurveType) { case eFeatCurveType.QH: this.chartControl1.InitialReferenceCurve(curveInfo?.CurveQH.GetFitPoints()); break; case eFeatCurveType.QE: this.chartControl1.InitialReferenceCurve(curveInfo?.CurveQE.GetFitPoints()); break; case eFeatCurveType.QP: this.chartControl1.InitialReferenceCurve(curveInfo?.CurveQP.GetFitPoints()); break; } } } #endregion /// /// /// /// private void InitialFeatCurveType(Model.eFeatCurveType curveType) { this._currentCurveType = curveType; this.chartControl1.SetCurveType(_currentCurveType); if (curveType == eFeatCurveType.QH) { InitialCurveFitType(curveType, this._curveFitCurveInfo.FitTypeQH, (curveNewFitType) => { this._curveFitCurveInfo.FitTypeQH = curveNewFitType; this.barCekFitCurveShow.Checked = true; RefreshFitCurve(); }); if (this.barCekFitCurveShow.Checked) { RefreshFitCurve(); } } if (curveType == eFeatCurveType.QE) { InitialCurveFitType(curveType, this._curveFitCurveInfo.FitTypeQE, (curveNewFitType) => { this._curveFitCurveInfo.FitTypeQE = curveNewFitType; this.barCekFitCurveShow.Checked = true; RefreshFitCurve(); }); if (this.barCekFitCurveShow.Checked) { RefreshFitCurve(); } } if (curveType == eFeatCurveType.QP) { InitialCurveFitType(curveType, this._curveFitCurveInfo.FitTypeQP, (curveNewFitType) => { this._curveFitCurveInfo.FitTypeQP = curveNewFitType; this.barCekFitCurveShow.Checked = true; RefreshFitCurve(); }); if (this.barCekFitCurveShow.Checked) { RefreshFitCurve(); } } } /// /// 初始化曲线拟合方式 /// private void InitialCurveFitType( Model.eFeatCurveType curveType, Model.eCurveFitType curveFitType, Action OnChangeFitType) { this.barSubCurveFitType.ClearLinks(); var btn4 = new DevExpress.XtraBars.BarCheckItem(); btn4.Caption = "四次曲线拟合"; btn4.Id = 4; btn4.Name = $"barBtnCurveFitType{btn4.Id}"; btn4.ItemClick += (object sender, DevExpress.XtraBars.ItemClickEventArgs e) => { foreach (DevExpress.XtraBars.BarCheckItemLink link in barSubCurveFitType.ItemLinks) { ((DevExpress.XtraBars.BarCheckItem)link.Item).Checked = false; } btn4.Checked = true; OnChangeFitType(eCurveFitType.FourM); }; btn4.Checked = curveFitType == eCurveFitType.FourM ? true : false; this.barSubCurveFitType.AddItem(btn4); var btn3 = new DevExpress.XtraBars.BarCheckItem(); btn3.Caption = "三次曲线拟合"; btn3.Id = 3; btn3.Name = $"barBtnCurveFitType{btn3.Id}"; btn3.ItemClick += (object sender, DevExpress.XtraBars.ItemClickEventArgs e) => { foreach (DevExpress.XtraBars.BarCheckItemLink link in barSubCurveFitType.ItemLinks) { ((DevExpress.XtraBars.BarCheckItem)link.Item).Checked = false; } btn3.Checked = true; OnChangeFitType(eCurveFitType.CubicCurve); }; btn3.Checked = curveFitType == eCurveFitType.CubicCurve ? true : false; this.barSubCurveFitType.AddItem(btn3); var btn2 = new DevExpress.XtraBars.BarCheckItem(); btn2.Caption = "二次曲线拟合"; btn2.Id = 2; btn2.Name = $"barBtnCurveFitType{btn2.Id}"; btn2.ItemClick += (object sender, DevExpress.XtraBars.ItemClickEventArgs e) => { foreach (DevExpress.XtraBars.BarCheckItemLink link in barSubCurveFitType.ItemLinks) { ((DevExpress.XtraBars.BarCheckItem)link.Item).Checked = false; } btn2.Checked = true; OnChangeFitType(eCurveFitType.ConicCurve); }; btn2.Checked = curveFitType == eCurveFitType.ConicCurve ? true : false; this.barSubCurveFitType.AddItem(btn2); var btn20 = new DevExpress.XtraBars.BarCheckItem(); btn20.Caption = "二次曲线拟合(一次项系数为零)"; btn20.Id = 20; btn20.Name = $"barBtnCurveFitType{btn2.Id}"; btn20.ItemClick += (object sender, DevExpress.XtraBars.ItemClickEventArgs e) => { foreach (DevExpress.XtraBars.BarCheckItemLink link in barSubCurveFitType.ItemLinks) { ((DevExpress.XtraBars.BarCheckItem)link.Item).Checked = false; } btn20.Checked = true; OnChangeFitType(eCurveFitType.ConicCurveB0); }; btn20.Checked = curveFitType == eCurveFitType.ConicCurveB0 ? true : false; this.barSubCurveFitType.AddItem(btn20); } #region 更新坐标 private void UpdateCoordinate() { if (_allAnaPoints != null && _allAnaPoints.Count > 0) { switch (_currentCurveType) { case eFeatCurveType.QH: { var MaxValue = _allAnaPoints.Max(x => x.Ha) + 2; var MinValue = _allAnaPoints.Min(x => x.Ha) - 2; this.chartControl1.UpdateAxisRangeY(MinValue, MaxValue); } break; case eFeatCurveType.QE: { var MaxValue = _allAnaPoints.Max(x => x.Ea) + 2; var MinValue = _allAnaPoints.Min(x => x.Ea) - 2; this.chartControl1.UpdateAxisRangeY(MinValue, MaxValue); } break; case eFeatCurveType.QP: { var MaxValue = _allAnaPoints.Max(x => x.Pa) + 2; var MinValue = _allAnaPoints.Min(x => x.Pa) - 2; this.chartControl1.UpdateAxisRangeY(MinValue, MaxValue); } break; } } } #endregion #region 保存 private void barBtnSave_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (_allAnaPoints == null || _allAnaPoints.Count < 1) { XtraMessageBox.Show("无分析点数据!"); return; } if (this._curveFitCurveInfo == null) { XtraMessageBox.Show("无流量扬程线数据!"); return; } if (this._curveFitCurveInfo.CurveQH == null) { var allPoints = _allAnaPoints.Select(x => new Model.CurvePoint(x.Qa, x.Ha)).ToList(); var qpCurvePointList = FitCurveHelper.GetFitPoints(allPoints, _curveFitCurveInfo.FitTypeQH, 10); this._curveFitCurveInfo.CurveQH = new CurveExpress(qpCurvePointList, _curveFitCurveInfo.FitTypeQH); } if (this._curveFitCurveInfo.CurveQP == null) { var allPoints = _allAnaPoints.Where(x => x.Pa != IStation.Default.Error).Select(x => new Model.CurvePoint(x.Qa, x.Pa)).ToList(); var qpCurvePointList = FitCurveHelper.GetFitPoints(allPoints, _curveFitCurveInfo.FitTypeQP, 10); this._curveFitCurveInfo.CurveQP = new CurveExpress(qpCurvePointList, _curveFitCurveInfo.FitTypeQP); } if (this._curveFitCurveInfo.CurveQE == null) { var allPoints = _allAnaPoints.Where(x => x.Ea != IStation.Default.Error).Select(x => new Model.CurvePoint(x.Qa, x.Ea)).ToList(); var qpCurvePointList = FitCurveHelper.GetFitPoints(allPoints, _curveFitCurveInfo.FitTypeQE, 10); this._curveFitCurveInfo.CurveQE = new CurveExpress(qpCurvePointList, _curveFitCurveInfo.FitTypeQE); } if (this.barCekNotSaveQE.Checked) { _curveFitCurveInfo.CurveQE = null; } if (this.barCekNotSaveQP.Checked) { _curveFitCurveInfo.CurveQP = null; } var lays = this.chartControl1.ShowOverlay(); var curvePointGroup = new Model.FeatCurvePointGroup(this._curveFitCurveInfo); var curveExpressGroup = new Model.FeatCurveExpressGroup(this._curveFitCurveInfo); var bll = new BLL.CurveAnaStepResult(); _analyStepResult.AnaStepId = _analyStep.Id; _analyStepResult.AnaPointList = _allAnaPoints; _analyStepResult.CurveInfo = curveExpressGroup.ToDsString(); _analyStepResult.PointInfo = curvePointGroup.ToDsString(); lays.Close(); var dlg = new SaveAnaStepResultDlg(); dlg.SetBindingData(_projectId, _sceneId, _analyStep.AnaSchemeId, _analyStepResult); if (dlg.ShowDialog() == DialogResult.OK) { if (!new BLL.CurveAnaStep().Update(_projectId, _sceneId, _analyStep.AnaSchemeId, _analyStep)) { XtraMessageBox.Show("步骤更新失败!"); return; } } } #endregion #region 框选数据 //框选删除 private void bbi框选删除Start_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { _boxSelectPoints = null; this.chartControl1.StartRectSelect("Delete"); } //框选数据 private void bbi框选查询点Start_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { _boxSelectPoints = null; this.chartControl1.StartRectSelect("View"); } //框选完成 List _boxSelectPoints = null; private void ChartBoxSelHelper_BoxSelCompletedEvent(string tag, List points) { _boxSelectPoints = points; if (points == null || points.Count < 1) { this.chartControl1.CloseBoxSel(); return; } if (tag == "Delete") { barBtnDeleteBoxPt.Visibility = DevExpress.XtraBars.BarItemVisibility.Always; barBtnShowBoxPtInfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; this.popBoxBoxSel.ShowPopup(MousePosition); } else if (tag == "View") { barBtnDeleteBoxPt.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; barBtnShowBoxPtInfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Always; this.popBoxBoxSel.ShowPopup(MousePosition); } else if (tag == "BoxFit") { this.chartControl1.CloseBoxSel(); var pts = from x in points select x.Tag as Model.CurveAnaPoint; if (this._currentCurveType == eFeatCurveType.QH) { var q = (from x in pts select x.Qa).Average(); var h = (from x in pts select x.Ha).Average(); this.chartControl1.AddCustormPoint(new CurvePoint(q, h)); this.chartControl1.StartBoxPoint4Fit(_curveFitCurveInfo.FitTypeQH);//继续框选 } if (this._currentCurveType == eFeatCurveType.QE) { var q = (from x in pts select x.Qa).Average(); var h = (from x in pts select x.Ea).Average(); this.chartControl1.AddCustormPoint(new CurvePoint(q, h)); this.chartControl1.StartBoxPoint4Fit(_curveFitCurveInfo.FitTypeQE);//继续框选 } if (this._currentCurveType == eFeatCurveType.QP) { var q = (from x in pts select x.Qa).Average(); var h = (from x in pts select x.Pa).Average(); this.chartControl1.AddCustormPoint(new CurvePoint(q, h)); this.chartControl1.StartBoxPoint4Fit(_curveFitCurveInfo.FitTypeQP);//继续框选 } return; } else { this.chartControl1.CloseBoxSel(); return; } } //删除 private void barBtnDeleteBoxPtFinish_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (_boxSelectPoints == null || _boxSelectPoints.Count < 1) return; var TimeList = _boxSelectPoints.Select(x => x.Tag as Model.CurveAnaPoint).Select(x => x.Time).ToList(); DeleteByTimeList(TimeList); } //查看 private void barBtnShowBoxPtInfoFinish_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (_boxSelectPoints == null || _boxSelectPoints.Count < 1) return; var list = _boxSelectPoints.Select(x => x.Tag as Model.CurveAnaPoint).ToList(); var dlg = new AnaSingleStepGridDlg(); dlg.SetBindingData(_projectId, _sceneId, _analyStep.Name, list); dlg.ReloadDataEvent += (time) => { DeleteByTimeList(new List() { time }); }; dlg.Show(); } #endregion #region 界面 //关闭 private void popBoxBoxSel_CloseUp(object sender, EventArgs e) { this.chartControl1.CloseBoxSel(); } //图表点击事件 private void chartAnaPoints_MouseClick(object sender, MouseEventArgs e) { //if (e.Button == MouseButtons.Right) //{ // // this.popMain.ShowPopup(MousePosition); //} } //拟合曲线 private void barCekCurveDisp_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.chartControl1.SetCurveVisible(this.barCekFitCurveShow.Checked); if (this.barCekFitCurveShow.Checked) { RefreshFitCurve(); } } private void barCekQH_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this.barCekQH.Checked == true) { InitialFeatCurveType(Model.eFeatCurveType.QH); bbi计算曲线.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; this.barCekQP.Checked = false; this.barCekQH.Checked = true; this.barCekQE.Checked = false; } } private void barCekQP_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this.barCekQP.Checked == true) { InitialFeatCurveType(Model.eFeatCurveType.QP); bbi计算曲线.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; this.barCekQP.Checked = true; this.barCekQH.Checked = false; this.barCekQE.Checked = false; } } private void barCekQE_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this.barCekQE.Checked == true) { InitialFeatCurveType(Model.eFeatCurveType.QE); bbi计算曲线.Visibility = DevExpress.XtraBars.BarItemVisibility.Always; this.barCekQE.Checked = true; this.barCekQH.Checked = false; this.barCekQP.Checked = false; } } //预览 private void barBtnPreview_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (_allAnaPoints == null || _allAnaPoints.Count < 1) return; var curveExpressGroup = new Model.FeatCurveExpressGroup(this._curveFitCurveInfo); var dlg = new CurveViewDlg(); dlg.SetBindingData(curveExpressGroup.CurveQH, curveExpressGroup.CurveQE, curveExpressGroup.CurveQP, _analyStepResult.CurveCoordinateParas); dlg.ReloadDataEvent += (rhs) => { if (rhs != null) { _analyStepResult.CurveCoordinateParas = rhs; } }; dlg.ShowDialog(); } // private void barCekLableDisplay_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.chartControl1.SetCurveLabelVisible(this.barCekLableDisplay.Checked); } private void bci开始手动打点_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this._currentCurveType == eFeatCurveType.QH) this.chartControl1.StartPickPoint4Fit(_curveFitCurveInfo.FitTypeQH); else if (this._currentCurveType == eFeatCurveType.QE) this.chartControl1.StartPickPoint4Fit(_curveFitCurveInfo.FitTypeQE); else if (this._currentCurveType == eFeatCurveType.QP) this.chartControl1.StartPickPoint4Fit(_curveFitCurveInfo.FitTypeQP); else this.chartControl1.StartPickPoint4Fit(_curveFitCurveInfo.FitTypeQH); this.chartControl1.SetCurveVisible(false); for (int j = 0; j < this.ribbonControl1.Items.Count; j++) { if (this.ribbonControl1.Items[j] != bsi打点拟合 && this.ribbonControl1.Items[j] != bci结束手动打点) this.ribbonControl1.Items[j].Enabled = false; } bci结束手动打点.Visibility = DevExpress.XtraBars.BarItemVisibility.Always; } private void bci结束手动打点_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var points = this.chartControl1.EndPickPoint4Fit(); for (int j = 0; j < this.ribbonControl1.Items.Count; j++) { this.ribbonControl1.Items[j].Enabled = true; } if (points != null && points.Count > 3) { this._curveFitCurveInfo.SetPickSelPoint(this._currentCurveType, points); } bci结束手动打点.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; } private void bbi清理框选打点_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.chartControl1.SetCustomerPointInfo(null); if (this._currentCurveType == eFeatCurveType.QH) { this._curveFitCurveInfo.CurveQH.DefinePoints = null; } if (this._currentCurveType == eFeatCurveType.QE) { this._curveFitCurveInfo.CurveQE.DefinePoints = null; } if (this._currentCurveType == eFeatCurveType.QP) { this._curveFitCurveInfo.CurveQP.DefinePoints = null; } this.chartControl1.SetCurveVisible(false); MessageBox.Show("已清理"); } private void bbi清理手动打点_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.chartControl1.SetCustomerPointInfo(null); if (this._currentCurveType == eFeatCurveType.QH) { this._curveFitCurveInfo.CurveQH.DefinePoints = null; } if (this._currentCurveType == eFeatCurveType.QE) { this._curveFitCurveInfo.CurveQE.DefinePoints = null; } if (this._currentCurveType == eFeatCurveType.QP) { this._curveFitCurveInfo.CurveQP.DefinePoints = null; } this.chartControl1.SetCurveVisible(false); MessageBox.Show("已清理"); } private void bbi开始框选拟合_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this._currentCurveType == eFeatCurveType.QH) this.chartControl1.StartBoxPoint4Fit(_curveFitCurveInfo.FitTypeQH); else if (this._currentCurveType == eFeatCurveType.QE) this.chartControl1.StartBoxPoint4Fit(_curveFitCurveInfo.FitTypeQE); else if (this._currentCurveType == eFeatCurveType.QP) this.chartControl1.StartBoxPoint4Fit(_curveFitCurveInfo.FitTypeQP); else this.chartControl1.StartBoxPoint4Fit(_curveFitCurveInfo.FitTypeQH); this.chartControl1.SetCurveVisible(false); for (int j = 0; j < this.ribbonControl1.Items.Count; j++) { if (this.ribbonControl1.Items[j] != bsi手动框选拟合 && this.ribbonControl1.Items[j] != bbi结束框选拟合) this.ribbonControl1.Items[j].Enabled = false; } bbi结束框选拟合.Visibility = DevExpress.XtraBars.BarItemVisibility.Always; } private void bbi结束框选拟合_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var points = this.chartControl1.EndBoxPoint4Fit(); for (int j = 0; j < this.ribbonControl1.Items.Count; j++) { this.ribbonControl1.Items[j].Enabled = true; } if (points != null && points.Count > 3) { this._curveFitCurveInfo.SetPickSelPoint(this._currentCurveType, points); } bbi结束框选拟合.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; } #endregion #region 导出 //Excel private void barBtnExportExcel_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var express = GetFeatCurveExpressGroup(); if (express == null) return; IStation.WinFrmUI.Curve.ExportToXLS.Export(express.CurveQH, express.CurveQE, express.CurveQP, 12); } private void barBtnSystem_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var express = GetFeatCurveExpressGroup(); if (express == null) return; var dlg = new SaveFileDialog(); dlg.Filter = "express 文件|*.express"; if (dlg.ShowDialog() != DialogResult.OK) return; if (!CurveExpressFileHelper.ExportCurveExpress(dlg.FileName, express, out string msg)) { XtraMessageBox.Show(msg); return; } XtraMessageBox.Show("导出成功!"); } private Model.FeatCurveExpressGroup GetFeatCurveExpressGroup() { if (_allAnaPoints == null || _allAnaPoints.Count < 1) { XtraMessageBox.Show("无分析点数据!"); return default; } if (this._curveFitCurveInfo == null) { XtraMessageBox.Show("无流量扬程线数据!"); return default; } if (this._curveFitCurveInfo.CurveQH == null) { var allPoints = _allAnaPoints.Select(x => new Model.CurvePoint(x.Qa, x.Ha)).ToList(); var qpCurvePointList = FitCurveHelper.GetFitPoints(allPoints, _curveFitCurveInfo.FitTypeQH, 10); this._curveFitCurveInfo.CurveQH = new CurveExpress(qpCurvePointList, _curveFitCurveInfo.FitTypeQH); } if (this._curveFitCurveInfo.CurveQP == null) { var allPoints = _allAnaPoints.Select(x => new Model.CurvePoint(x.Qa, x.Pa)).ToList(); var qpCurvePointList = FitCurveHelper.GetFitPoints(allPoints, _curveFitCurveInfo.FitTypeQP, 10); this._curveFitCurveInfo.CurveQP = new CurveExpress(qpCurvePointList, _curveFitCurveInfo.FitTypeQP); } if (this._curveFitCurveInfo.CurveQE == null) { var allPoints = _allAnaPoints.Select(x => new Model.CurvePoint(x.Qa, x.Ea)).ToList(); var qpCurvePointList = FitCurveHelper.GetFitPoints(allPoints, _curveFitCurveInfo.FitTypeQE, 10); this._curveFitCurveInfo.CurveQE = new CurveExpress(qpCurvePointList, _curveFitCurveInfo.FitTypeQE); } var curveExpressGroup = new Model.FeatCurveExpressGroup(this._curveFitCurveInfo); return curveExpressGroup; } //点视图 private void barBtnVEtaRecordView_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { WaitFrmHelper.ShowWaitForm(); var dlg = new ViewSingleStepChartDlg(); dlg.Shown += delegate { WaitFrmHelper.HideWaitForm(); }; dlg.SetBindingData(_projectId, _sceneId, _analyStep); dlg.ShowDialog(); } private void barBtnSelectReferenceCurve_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { WaitFrmHelper.ShowWaitForm(); var dlg = new WinFrmUI.Product.SelectPumpCurveDlg(); dlg.Shown += delegate { WaitFrmHelper.HideWaitForm(); }; var scene = new BLL.Scene().GetById(_projectId, _sceneId); dlg.SetBindingData(_projectId, scene.BelongType, scene.BelongId); if (dlg.ShowDialog() != DialogResult.OK) return; _referenceCurve = dlg.Seleted; RefreshFitCurve(); } private void barCekReferenceCurveVisble_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.chartControl1.SetReferenceCurveVisible(this.barCekReferenceCurveVisble.Checked); } private void barBtnDelPoint_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var dlg = new AnalySingleStepGridDelDlg(); var list = _allAnaPoints.Select(x => x).ToList(); dlg.SetBindingData(_projectId, _sceneId, _analyStep.Name, list); dlg.ReloadDataEvent += (rhs) => { _allAnaPoints = rhs; this.chartControl1.InitialPointInfo(_allAnaPoints); }; dlg.ShowDialog(); } #endregion //还原 private void barBtnRestore_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (_analyStep == null) return; if (XtraMessageBox.Show("确认还原能效数据?", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) { var bol = new BLL.CurveAnaRecord().RestoreByRunningFlagAndRunningCount(_projectId, _sceneId, _analyStep.AnaSchemeId, _analyStep.RunningFlag, _analyStep.RunningCount, _analyStep.MinTime, _analyStep.MaxTime); if (bol) { var bll = new BLL.CurveAnaStepResult(); if (bll.IsExistByAnaStepId(_projectId, _sceneId, _analyStep.AnaSchemeId, _analyStep.Id)) { if (!new BLL.CurveAnaStepResult().DeleteById(_projectId, _sceneId, _analyStep.AnaSchemeId, _analyStep.Id)) { TipFrmHelper.ShowWaining("步骤结论删除失败!", 2000); return; } } SetBindingData(_projectId, _sceneId, _analyStep); InitialFeatCurveType(_currentCurveType); } else { TipFrmHelper.ShowWaining("还原失败", 1000); } } } private void barBtnCurveExpress_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this._curveFitCurveInfo.CurveQH == null) { var allPoints = _allAnaPoints.Select(x => new Model.CurvePoint(x.Qa, x.Ha)).ToList(); var qpCurvePointList = FitCurveHelper.GetFitPoints(allPoints, _curveFitCurveInfo.FitTypeQH, 10); this._curveFitCurveInfo.CurveQH = new CurveExpress(qpCurvePointList, _curveFitCurveInfo.FitTypeQH); } if (this._curveFitCurveInfo.CurveQP == null) { var allPoints = _allAnaPoints.Where(x => x.Pa != IStation.Default.Error).Select(x => new Model.CurvePoint(x.Qa, x.Pa)).ToList(); var qpCurvePointList = FitCurveHelper.GetFitPoints(allPoints, _curveFitCurveInfo.FitTypeQP, 10); this._curveFitCurveInfo.CurveQP = new CurveExpress(qpCurvePointList, _curveFitCurveInfo.FitTypeQP); } if (this._curveFitCurveInfo.CurveQE == null) { var allPoints = _allAnaPoints.Where(x => x.Ea != IStation.Default.Error).Select(x => new Model.CurvePoint(x.Qa, x.Ea)).ToList(); var qpCurvePointList = FitCurveHelper.GetFitPoints(allPoints, _curveFitCurveInfo.FitTypeQE, 10); this._curveFitCurveInfo.CurveQE = new CurveExpress(qpCurvePointList, _curveFitCurveInfo.FitTypeQE); } var theSetDlg = new DispCurveEquationDlg(); theSetDlg.SetCurveInfo(this._curveFitCurveInfo.CurveQH, this._curveFitCurveInfo.CurveQE, this._curveFitCurveInfo.CurveQP); theSetDlg.Show(); } private void barBtnMonth_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { /* var dlg = new ViewDiffMonthChartDlg(); dlg.SetBindingData(_currentCurveType, _allAnaPoints); dlg.ShowDialog();*/ var dlg = new ViewTimeFilterChartDlg(); dlg.SetBindingData(_currentCurveType, _allAnaPoints); dlg.ShowDialog(); } } }