From 0a1bf56909464e938a68c29b26ab88ff51380fad Mon Sep 17 00:00:00 2001 From: Shuxia Ning <NingShuxia0927@outlook.com> Date: 星期三, 08 一月 2025 13:56:17 +0800 Subject: [PATCH] 能效分析水力图表 装置点显示文字 --- WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs | 446 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 398 insertions(+), 48 deletions(-) diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs index 6152026..e24c35a 100644 --- a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs +++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs @@ -1,5 +1,7 @@ -锘縰sing System.Data; +锘縰sing DevExpress.Spreadsheet; +using Yw.Geometry; using Yw.Pump; +using Yw.WinFrmUI.Phart; namespace HStation.WinFrmUI { @@ -8,78 +10,425 @@ public PumpChartViewCtrl() { InitializeComponent(); + this.barCekEqVisible.Checked = true; + this.barCekEqulEffVisible.Checked = true; + this.bar2.Visible = false; + this.barCekEqulEffVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; } + + private Yw.Vmo.PhartDiagramExGraphListVmo _vmo = null; + private Yw.WinFrmUI.Phart.PumpPerformCurveViewModel _model = null; + private Yw.WinFrmUI.Phart.PumpCurveViewModel _vm = null; + + private bool _default_visible = true; + private bool _power_visible = true; + private bool _eff_visible = true; + private bool _equal_eff_visible = true; + private bool _split_panel = true; + private double _nr; + + /// <summary> + /// 鏁版嵁鍙樻洿浜嬩欢 + /// </summary> + public event Action<Yw.Vmo.PhartDiagramExGraphListVmo> DataChangedEvent; /// <summary> /// 缁戝畾鏁版嵁 /// </summary> public void SetBindingData(Yw.Vmo.PhartDiagramExGraphListVmo vmo, double nr) { + _vmo = vmo; + _nr = nr; + if (vmo == null) + { + ClearBindingData(); + return; + } var vm_list = vmo.GetPumpCurveViewMdoelList(); - var vm_defult = vm_list.OrderBy(x => x.Hz).LastOrDefault(); - var vm_ee_list = vmo.GetCurveEqualEViewMdoelList(); + if (vm_list == null || !vm_list.Any()) + { + ClearBindingData(); + return; + } + _model = vmo.GetDefaultPumpCurveViewMdoel(); + if (_model == null) + return; - var vm = new Yw.WinFrmUI.Phart.PumpChartViewModel(); + var vm_equal_eff_list = vmo.GetCurveEqualEViewMdoelList(); + var vm_variable_speed_eff_list = vmo.GetVariableSpeedPumpCurveViewMdoelList(); + + var vm = new Yw.WinFrmUI.Phart.PumpCurveViewModel(); vm.Id = ""; vm.ColorQH = Color.Blue; vm.ColorQE = Color.Green; vm.ColorQP = Color.Red; - vm.CurveQHName = "QE"; - vm.CurveQPName = "QP"; - vm.CurveQH = vm_defult.CurveQH.FeatCurve.GetPointList(50); - vm.CurveQE = vm_defult.CurveQE?.FeatCurve.GetPointList(50); - vm.CurveQP = vm_defult.CurveQP?.FeatCurve.GetPointList(50); + vm.CurveQHName = $"{_nr}rpm({50}hz)"; + vm.CurveQPName = $"{_nr}rpm({50}hz)"; + vm.CurveQH = _model.CurveQH.FeatCurve.GetPointList(50); + vm.CurveQE = _model.CurveQE?.FeatCurve.GetPointList(50); + vm.CurveQP = _model.CurveQP?.FeatCurve.GetPointList(50); vm.PointListQH = vm.CurveQH; vm.PointListQE = vm.CurveQE; vm.PointListQP = vm.CurveQP; vm.Equip = null; - vm.VariableSpeedList = new List<Yw.WinFrmUI.Phart.PumpChartVariableSpeedViewModel>(); - vm.EqualEffList = new List<Yw.WinFrmUI.Phart.PumpChartEqualEffViewModel>(); - vm.EqualPowerList = new List<Yw.WinFrmUI.Phart.PumpChartEqualPowerViewModel>(); - - for (int eff = 30; eff < 90; eff += 1) + if (vm_equal_eff_list != null && vm_equal_eff_list.Any()) { - var ve = new Yw.WinFrmUI.Phart.PumpChartEqualEffViewModel(); - //ve.Id = rhs.Id; - ve.CurveName = $"{eff}"; - ve.Color = Color.ForestGreen; - ve.CurveEqualEff = new List<Yw.Geometry.Point2d>(); - for (int hz = 30; hz <= 50; hz += 5) + vm.EqualEffList = new(); + foreach (var item in vm_equal_eff_list) { - var qe = vm_defult.CurveQE.ToNewByN(50, hz); - var q_array = qe.FeatCurve.GetPointsX(eff); - if (q_array == null || !q_array.Any()) + var eff_vm = new Yw.WinFrmUI.Phart.PumpCurveEqualEffViewModel(); + eff_vm.Id = Guid.NewGuid().ToString(); + eff_vm.CurveName = $"{item.Eff:N1}"; + eff_vm.Color = Color.DarkGreen; + eff_vm.CurveEqualEff = item.DefinePoints; + eff_vm.Tension = item.Tension; + eff_vm.IsClosed = item.IsClosed; + vm.EqualEffList.Add(eff_vm); + } + } + + if (vm_variable_speed_eff_list != null && vm_variable_speed_eff_list.Any()) + { + vm.VariableSpeedList = new(); + var index = 0; + foreach (var item in vm_variable_speed_eff_list) + { + var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index); + var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel(); + vs_vm.Id = Guid.NewGuid().ToString(); + vs_vm.ColorQH = vs_color; + vs_vm.ColorQE = vs_color; + vs_vm.ColorQP = vs_color; + vs_vm.CurveQHName = $"{item.N}rpm({item.Hz}hz)"; + vs_vm.CurveQPName = $"{item.N}rpm({item.Hz}hz)"; + vs_vm.CurveQH = item.CurveQH.FeatCurve.GetPointList(30); + vs_vm.CurveQE = item.CurveQE.FeatCurve.GetPointList(30); + vs_vm.CurveQP = item.CurveQP.FeatCurve.GetPointList(30); + vs_vm.N = item.N; + vs_vm.Hz = item.Hz; + vm.VariableSpeedList.Add(vs_vm); + index++; + } + } + + vm.VariableSpeedList = new List<PumpCurveVariableSpeedViewModel>(); + vm.EqualEffList = new List<PumpCurveEqualEffViewModel>(); + vm.EqualPowerList = new(); + + SetBindingData(vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + } + + /// <summary> + /// 缁戝畾鏁版嵁 + /// </summary> + public void SetBindingData(Yw.WinFrmUI.Phart.PumpCurveViewModel vm, bool default_visible, bool split_panel, bool eff_visible, bool power_visible, bool equal_eff_visible) + { + _vm = vm; + if (vm == null) + { + ClearBindingData(); + return; + } + if (vm.VariableSpeedList != null && vm.VariableSpeedList.Any()) + { + vm.ColorQH = vm.ColorQE = vm.ColorQP = Color.Black; + } + this.pumpViewChart1.SetBindingData(vm, default_visible, split_panel, eff_visible, power_visible, equal_eff_visible); + } + + + /// <summary> + /// 娓呯┖缁戝畾鏁版嵁 + /// </summary> + public void ClearBindingData() + { + this.pumpViewChart1.ClearBindingData(); + } + + + private void SetEquip() + { + if (_vm == null) + return; + if (!_vm.IsValid()) + return; + if (this.barTxtStartHead.EditValue == null) + return; + if (this.barTxtPipeHead.EditValue == null) + return; + if (this.barTxtPipeQ.EditValue == null) + return; + + var start_head = Convert.ToDouble(this.barTxtStartHead.EditValue); + var pipe_head = Convert.ToDouble(this.barTxtPipeHead.EditValue); + var pipe_flow = Convert.ToDouble(this.barTxtPipeQ.EditValue); + + var equip_pt = new Yw.Geometry.Point2d(pipe_flow, pipe_head); + var qh_line = new Yw.Ahart.CurveQH(Yw.Ahart.eFeatType.Cubic, _vm.CurveQH); + var equip_line = Yw.Pump.PerformParabolaHelper.GetEquipCurvePointListByQH(qh_line, equip_pt, start_head, 30, true, out Yw.Geometry.Point2d sect_pt); + if (equip_line == null || sect_pt == null) + { + XtraMessageBox.Show("璁$畻澶辫触,璁捐鐐逛笉鍚堢悊!"); + return; + } + + _vm.Equip = new Yw.WinFrmUI.Phart.PumpCurveEquipViewModel(); + _vm.Equip.Id = Guid.NewGuid().ToString(); + _vm.Equip.Color = Color.Black; + _vm.Equip.StartH = start_head; + _vm.Equip.PipeQ = pipe_flow; + _vm.Equip.PipeH = pipe_head; + + _vm.Equip.SectQ = sect_pt.X; + _vm.Equip.SectH = sect_pt.Y; + + if (_vm.CurveQP != null && _vm.CurveQP.Any()) + { + _vm.Equip.SectP = _vm.CurveQP.GetInterPointsY(sect_pt.X)?.FirstOrDefault(); + } + + if (_vm.CurveQE != null && _vm.CurveQE.Any()) + { + _vm.Equip.SectE = _vm.CurveQE.GetInterPointsY(sect_pt.X)?.FirstOrDefault(); + } + + _vm.Equip.CurveEquip = equip_line.GetPointList(Yw.Ahart.eFeatType.Cubic); + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + } + + private void barCekEffVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + _eff_visible = this.barCekEffVisible.Checked; + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + } + + private void barCekPowerVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + _power_visible = this.barCekPowerVisible.Checked; + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + } + + private void barCekSplitPanel_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + _split_panel = this.barCekSplitPanel.Checked; + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + } + + private void barCekEqVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + if (this.barCekEqVisible.Checked) + { + SetEquip(); + } + else + { + _vm.Equip = null; + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + } + } + + private void barCekEqulEffVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + _equal_eff_visible = this.barCekEqulEffVisible.Checked; + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + } + + private void barBtnEqClear_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + this.barTxtStartHead.EditValue = 0; + this.barTxtPipeQ.EditValue = null; + this.barTxtPipeHead.EditValue = null; + + _vm.Equip = null; + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + } + + private void barBtnSetEqPt_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + SetEquip(); + } + + private void barBtnAddVariableSpeedByN_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + AddByN(); + } + + private void barBtnAddVariableSpeedByHz_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + AddByHz(); + } + + private void barBtnAddVariableSpeedByPoint_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + AddByPoint(); + } + + private void barBtnAddEqualEffByEff_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + AddByEff(); + } + + private void AddByN() + { + if (_vm == null) + return; + var dlg = new SetValueDlg(); + dlg.SetBindingData(_nr); + dlg.VerifyValueChanged += (speed) => + { + var hz = Math.Round(speed / _nr * 50, 1); + if (hz > 50 || hz < 10) + { + return false; + } + + var index = _vm.VariableSpeedList?.Count + 1 ?? 1; + var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index); + var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel(); + vs_vm.Id = Guid.NewGuid().ToString(); + vs_vm.ColorQH = vs_color; + vs_vm.ColorQE = vs_color; + vs_vm.ColorQP = vs_color; + vs_vm.CurveQHName = $"{speed}rpm({hz}hz)"; + vs_vm.CurveQPName = $"{speed}rpm({hz}hz)"; + vs_vm.CurveQH = _vm.CurveQH.GetQHPointListByN(50, hz); + vs_vm.CurveQE = _vm.CurveQE.GetQEPointListByN(50, hz); + vs_vm.CurveQP = _vm.CurveQP.GetQEPointListByN(50, hz); + vs_vm.N = speed; + vs_vm.Hz = hz; + _vm.VariableSpeedList.Add(vs_vm); + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + + //this.DataChangedEvent?.Invoke(); + return true; + }; + dlg.ShowDialog(); + } + + private void AddByHz() + { + if (_vm == null) + return; + var dlg = new SetValueDlg(); + dlg.VerifyValueChanged += (hz) => + { + if (hz > 50 || hz < 10) + { + return false; + } + var speed = Math.Round(hz / 50 * _nr); + var index = _vm.VariableSpeedList?.Count + 1 ?? 1; + var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index); + var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel(); + vs_vm.Id = Guid.NewGuid().ToString(); + vs_vm.ColorQH = vs_color; + vs_vm.ColorQE = vs_color; + vs_vm.ColorQP = vs_color; + vs_vm.CurveQHName = $"{speed}rpm({hz}hz)"; + vs_vm.CurveQPName = $"{speed}rpm({hz}hz)"; + vs_vm.CurveQH = _vm.CurveQH.GetQHPointListByN(50, hz); + vs_vm.CurveQE = _vm.CurveQE.GetQEPointListByN(50, hz); + vs_vm.CurveQP = _vm.CurveQP.GetQEPointListByN(50, hz); + vs_vm.N = speed; + vs_vm.Hz = hz; + _vm.VariableSpeedList.Add(vs_vm); + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + + return true; + }; + dlg.ShowDialog(); + } + + private void AddByPoint() + { + if (_vm == null) + return; + if (!_vm.IsValid()) + return; + var dlg = new SetPointDlg(); + dlg.SetBindingData(); + dlg.VerifyValueChanged += (x, y) => + { + var pt = new Yw.Geometry.Point2d(x, y); + var sect_pt = Yw.Pump.PerformParabolaHelper.GetQHSectPoint(_model.CurveQH, pt); + if (sect_pt == null || sect_pt.IsZeroPoint()) + return false; + + var speed = sect_pt.Y.CalculateSimuByH(_nr, pt.Y); + var hz = Math.Round(speed / _nr * 50, 1); + if (hz > 50 || hz < 20) + { + return false; + } + speed = Math.Round(speed, 1); + var index = _vm.VariableSpeedList?.Count + 1 ?? 1; + var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index); + var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel(); + vs_vm.Id = Guid.NewGuid().ToString(); + vs_vm.ColorQH = vs_color; + vs_vm.ColorQE = vs_color; + vs_vm.ColorQP = vs_color; + vs_vm.CurveQHName = $"{speed}rpm({hz}hz)"; + vs_vm.CurveQPName = $"{speed}rpm({hz}hz)"; + vs_vm.CurveQH = _vm.CurveQH.GetQHPointListByN(50, hz); + vs_vm.CurveQE = _vm.CurveQE.GetQEPointListByN(50, hz); + vs_vm.CurveQP = _vm.CurveQP.GetQEPointListByN(50, hz); + vs_vm.N = speed; + vs_vm.Hz = hz; + _vm.VariableSpeedList.Add(vs_vm); + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); + + return true; + }; + dlg.ShowDialog(); + } + + private void AddByEff() + { + if (_vm == null) + return; + if (!_vm.IsValid()) + return; + if (_vm.CurveQE == null || !_vm.CurveQE.Any()) + return; + var dlg = new SetEffDlg(); + dlg.SetBindingData(); + dlg.VerifyValueChanged += (eff_double_list) => + { + double max_hz = 50; + double min_hz = 30; + if (_vm.VariableSpeedList != null && _vm.VariableSpeedList.Any()) + { + max_hz = Math.Max(max_hz, _vm.VariableSpeedList.Max(x => x.Hz)); + min_hz = Math.Min(min_hz, _vm.VariableSpeedList.Min(x => x.Hz)); + } + + foreach (var eff in eff_double_list) + { + var eff_list = EqualParaCurveEListHelper.CalcEqualParaCurveE(_model.CurveQH, _model.CurveQE, max_hz, min_hz, eff); + if (eff_list != null && eff_list.Any()) { - continue; + foreach (var item in eff_list) + { + var def_pt_list = item.DefinePoints; + var eff_vm = new Yw.WinFrmUI.Phart.PumpCurveEqualEffViewModel(); + eff_vm.Id = Guid.NewGuid().ToString(); + eff_vm.CurveName = $"{item.Eff:N1}"; + eff_vm.Color = Color.DarkGreen; + eff_vm.CurveEqualEff = item.DefinePoints; + eff_vm.Tension = item.Tension; + eff_vm.IsClosed = item.IsClosed; + _vm.EqualEffList.Add(eff_vm); + } } - var qh = vm_defult.CurveQH.ToNewByN(50, hz); - var flow = q_array.FirstOrDefault(); - var head = qh.FeatCurve.GetPointY(flow); - ve.CurveEqualEff.Add(new Yw.Geometry.Point2d(flow, head)); - } - if (!ve.CurveEqualEff.Any()) - { - continue; } - vm.EqualEffList.Add(ve); - } + SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); - for (int hz = 30; hz < 50; hz += 5) - { - var tN = nr * hz / 50; - var vs = new Yw.WinFrmUI.Phart.PumpChartVariableSpeedViewModel(); - vs.CurveQHName = $"{tN}"; - vs.CurveQPName = $"{tN}"; - vs.CurveQH = vm_defult.CurveQH.GetPointListByN(nr, tN, 50); - vs.CurveQE = vm_defult.CurveQE.GetPointListByN(nr, tN, 50); - vs.CurveQP = vm_defult.CurveQP.GetPointListByN(nr, tN, 50); - vs.Hz = hz; - vs.N = tN; - vm.VariableSpeedList.Add(vs); - } + return true; + }; + dlg.ShowDialog(); - this.pumpChart1.SetChart(vm); } /// <summary> @@ -90,5 +439,6 @@ return new Yw.Vmo.PhartDiagramExGraphListVmo(); } + } } -- Gitblit v1.9.3