using DevExpress.Spreadsheet; using Mapster; using StackExchange.Profiling.Internal; using Yw.Ahart; using Yw.Geometry; using Yw.Pump; using Yw.WinFrmUI.Phart; namespace HStation.WinFrmUI { public partial class PumpChartViewCtrl : DevExpress.XtraEditors.XtraUserControl { public PumpChartViewCtrl() { InitializeComponent(); this.barCekEqVisible.Checked = true; this.barCekEqulEffVisible.Checked = true; this.barCekPowerVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; this.barCekEqVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; this.barBtnAddVariableSpeedMenu.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; this.barBtnAddEqualEffMenu.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; this.barCekEqulEffVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; } private Yw.Vmo.PhartDiagramExGraphListVmo _vmo = null; private List _vm_list = null; private string _coordinate = null; private bool _power_visible = true; private bool _eff_visible = true; private bool _equal_eff_visible = true; private bool _split_panel = true; private double _nr; /// /// 绑定数据 /// public void SetBindingData(Yw.Vmo.PhartDiagramExGraphListVmo vmo, double nr) { _vmo = vmo; _nr = nr; _vm_list = null; _coordinate = null; if (vmo == null) { ClearBindingData(); return; } var vm_list = new List(); if (vmo.GraphList == null || !vmo.GraphList.Any()) { ClearBindingData(); return; } _coordinate = vmo.DispParas; foreach (var graph in vmo.GraphList) { double hz = 50; double n = nr; var curve_type = (Yw.Ahart.eCurveType)graph.GraphType; switch (curve_type) { case Yw.Ahart.eCurveType.QH: { var paras = PhartGraphHelper.GetGraphParas(curve_type, graph.GraphParas); hz = paras.Hz; n = paras.N; } break; case Yw.Ahart.eCurveType.QP: { var paras = PhartGraphHelper.GetGraphParas(curve_type, graph.GraphParas); hz = paras.Hz; n = paras.N; } break; case Yw.Ahart.eCurveType.QE: { var paras = PhartGraphHelper.GetGraphParas(curve_type, graph.GraphParas); hz = paras.Hz; n = paras.N; } break; } var feat_curve = PhartGraphHelper.GetPerformCurve(curve_type, graph.GeometryInfo); var geometry_paras = PhartGraphHelper.GetGeometryParas(curve_type, graph.GeometryParas); var annotation_list = PhartGraphHelper.GetAnnotationParasList(curve_type, graph.AnnotationParas); if (curve_type == eCurveType.QE) annotation_list = null; var vm = new Yw.WinFrmUI.Phart.PumpViewChartViewModel(); vm.Id = graph.ID.ToString(); vm.Hz = hz; vm.N = n; vm.AnnotationList = annotation_list; vm.CurveType = feat_curve.CurveType; vm.FeatType = feat_curve.FeatType; vm.DefPointList = geometry_paras?.DefinePoints; vm.FitPointList = feat_curve.FeatCurve.GetPointList(100); if (vm.CurveType== eCurveType.EqualE) vm.FitPointList = feat_curve.FeatCurve.GetPointList(10); vm.GraphParas = graph.GraphParas; vm_list.Add(vm); } _vm_list = vm_list; _vm_list[0].IsSelect = true; SetColor(_vm_list); SetBindingData(_vm_list, _coordinate, _split_panel, _eff_visible, _power_visible, _equal_eff_visible); } /// /// /// private void SetColor(List vm_list) { if (vm_list == null || !vm_list.Any()) return; var group = vm_list.GroupBy(x => x.Hz); if (group.Count() > 1) { for (int i = 0; i < group.Count(); i++) { var color = Yw.WinFrmUI.PhartColorHelper.Get(i); var item = group.ElementAt(i); foreach (var vm in item) { vm.Color = color; if (vm.CurveType == eCurveType.EqualE) vm.Color = Color.DarkGreen; } } } else { var item = group.ElementAt(0); foreach (var vm in item) { switch (vm.CurveType) { case Yw.Ahart.eCurveType.QH: vm.Color = Yw.WinFrmUI.Phart.PumpChartDisplay.CurveColorQH; break; case Yw.Ahart.eCurveType.QP: vm.Color = Yw.WinFrmUI.Phart.PumpChartDisplay.CurveColorQP; break; case Yw.Ahart.eCurveType.QE: vm.Color = Yw.WinFrmUI.Phart.PumpChartDisplay.CurveColorQE; break; } } } } /// /// 绑定数据 /// private void SetBindingData(List vm_list, string coordinate, bool split_panel, bool eff_visible, bool power_visible, bool equal_eff_visible) { if (IsInvalidData()) { ClearBindingData(); return; } var list = new List(); foreach (var item in vm_list) { if (!eff_visible) { if (item.CurveType == eCurveType.QE) { continue; }; } if (!power_visible) { if (item.CurveType == eCurveType.QP) { continue; }; } if (!equal_eff_visible) { if (item.CurveType == eCurveType.EqualE) { continue; }; } list.Add(item); } this.pumpViewChart1.SetBindingData(list, coordinate, split_panel, eff_visible, power_visible, equal_eff_visible); } //是否是无效数据 private bool IsInvalidData() { if (_vm_list == null || !_vm_list.Any()) { return true; } if (!_vm_list.Exists(x => x.CurveType == Yw.Ahart.eCurveType.QH)) { return true; } return false; } /// /// 清空绑定数据 /// public void ClearBindingData() { this.pumpViewChart1.Clear(); } private void SetEquip() { if (_vmo == null) return; if (_vm_list == null || !_vm_list.Any()) return; if (this.barTxtStartHead.EditValue == null) return; if (this.barTxtPipeHead.EditValue == null) return; if (this.barTxtPipeQ.EditValue == null) return; var qh50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QH); if (qh50 == 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 equip_pt_list = Yw.Pump.PerformParabolaHelper.GetEquipCurvePointListByQH(qh50.FitPointList, equip_pt, start_head, 30, true, out Yw.Geometry.Point2d sect_pt); if (equip_pt_list == null || sect_pt == null) { XtraMessageBox.Show("计算失败,设计点不合理!"); return; } var pump_sect_pt = new Yw.WinFrmUI.Phart.PumpSectPointViewModel(); pump_sect_pt.Q = sect_pt.X; pump_sect_pt.H = sect_pt.Y; var qe50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QE); if (qe50 != null) { pump_sect_pt.E = qe50?.FitPointList?.GetInterPointsY(sect_pt.X)?.FirstOrDefault(); } var qp50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QP); if (qp50 != null) { pump_sect_pt.P = qp50?.FitPointList?.GetInterPointsY(sect_pt.X)?.FirstOrDefault(); } this.pumpViewChart1.SetEquip(equip_pt_list, pump_sect_pt); } private void barCekEffVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { _eff_visible = this.barCekEffVisible.Checked; SetBindingData(_vm_list,_coordinate, _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_list,_coordinate, _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_list,_coordinate, _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 { this.pumpViewChart1.SetEquip(null,null); } } private void barCekEqulEffVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { _equal_eff_visible = this.barCekEqulEffVisible.Checked; SetBindingData(_vm_list,_coordinate, _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; this.pumpViewChart1.SetEquip(null, null); } 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 (IsInvalidData()) return; var qh50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QH); if (qh50 == null) return; var qe50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QE); var qp50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QP); var dlg = new Yw.WinFrmUI.Phart.SetValueDlg(); dlg.SetBindingData(_nr); dlg.VerifyValueChanged += (speed) => { var hz = Math.Round(speed / _nr * 50, 1); if (hz > 50 || hz < 10) { return false; } if (_vm_list.Exists(x => x.N == speed)) { TipFormHelper.ShowWarn("转速已存在"); return false; } hz = Math.Round(hz, 1); var pt_qh_list = qh50.FitPointList.GetQHPointListByN(50, hz); var pt_qe_list = qe50?.FitPointList?.GetQEPointListByN(50, hz); var pt_qp_list = qp50?.FitPointList?.GetQPPointListByN(50, hz); Insert(hz,speed,pt_qh_list,pt_qe_list,pt_qp_list); return true; }; dlg.ShowDialog(); } private void AddByHz() { if (IsInvalidData()) return; var qh50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QH); if (qh50 == null) return; var qe50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QE); var qp50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QP); var dlg = new Yw.WinFrmUI.Phart.SetValueDlg(); dlg.VerifyValueChanged += (hz) => { if (hz > 50 || hz < 10) { return false; } if (_vm_list.Exists(x => x.Hz == hz)) { TipFormHelper.ShowWarn("频率已存在"); return false; } var speed = Math.Round(hz / 50 * _nr); speed = Math.Round(speed, 1); var pt_qh_list = qh50.FitPointList.GetQHPointListByN(50, hz); var pt_qe_list = qe50?.FitPointList?.GetQEPointListByN(50, hz); var pt_qp_list = qp50?.FitPointList?.GetQPPointListByN(50, hz); Insert(hz, speed, pt_qh_list, pt_qe_list, pt_qp_list); return true; }; dlg.ShowDialog(); } private void AddByPoint() { if (IsInvalidData()) return; var qh50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QH); if (qh50 == null) return; var qe50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QE); var qp50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QP); var dlg = new Yw.WinFrmUI.Phart.SetPointDlg(); dlg.SetBindingData(); dlg.VerifyValueChanged += (x, y) => { var pt = new Yw.Geometry.Point2d(x, y); var curve = new Yw.Pump. CurveQH(qh50.FeatType, qh50.DefPointList); var sect_pt = Yw.Pump.PerformParabolaHelper.GetQHSectPoint(curve, 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); if (_vm_list.Exists(x => x.N == speed)) { TipFormHelper.ShowWarn("转速已存在"); return false; } var pt_qh_list = qh50.FitPointList.GetQHPointListByN(50, hz); var pt_qe_list = qe50?.FitPointList?.GetQEPointListByN(50, hz); var pt_qp_list = qp50?.FitPointList?.GetQPPointListByN(50, hz); Insert(hz, speed, pt_qh_list, pt_qe_list, pt_qp_list); return true; }; dlg.ShowDialog(); } private void AddByEff() { if (IsInvalidData()) return; var qh50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QH); if (qh50 == null) return; var qe50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QE); if (qe50 == null) return; var dlg = new SetEffDlg(); dlg.SetBindingData(); dlg.VerifyValueChanged += (eff_double_list) => { double max_hz = 50; double min_hz = 30; max_hz = Math.Max(max_hz, _vm_list.Max(x => x.Hz)); min_hz = Math.Min(min_hz, _vm_list.Min(x => x.Hz)); var qh = new Yw.Pump.CurveQH(qh50.FeatType, qh50.DefPointList); var qe = new Yw.Pump.CurveQE(qe50.FeatType, qe50.DefPointList); foreach (var eff in eff_double_list) { var eff_list = EqualParaCurveEListHelper.CalcEqualParaCurveE(qh, qe, max_hz, min_hz, eff); if (eff_list != null && eff_list.Any()) { foreach (var item in eff_list) { Insert(item.Eff,item.Tension,item.IsClosed,item.IsUShaped,item.DefinePoints); } } } return true; }; dlg.ShowDialog(); } private async void Insert(double hz, double speed, List pt_qh_list, List pt_qe_list, List pt_qp_list) { var list = new List(); var graph_qh = new Yw.Vmo.PhartGraphVmo() { Name = "扬程线", GraphType = (int)Yw.Ahart.eCurveType.QH, GraphParas = new QHGraphParasViewModel() { Hz = hz, N = speed, }.ToJson(), GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel { DefinePoints = pt_qh_list }.ToJson(), GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve, GeometryInfo = pt_qh_list.ToDbString(Yw.Ahart.eCurveType.QH, Yw.Ahart.eFeatType.Cubic), AnnotationParas = new List() { new () { X = pt_qh_list.Last().X, Y = pt_qh_list.Last().Y, Text = $"{speed}rpm({hz}hz)", Aligment = eTextAligment.Right } }.ToJson() }; list.Add(graph_qh); if (pt_qe_list != null && pt_qe_list.Any()) { var graph_qe = new Yw.Vmo.PhartGraphVmo() { Name = "效率线", GraphType = (int)Yw.Ahart.eCurveType.QE, GraphParas = new QEGraphParasViewModel() { Hz = hz, N = speed, }.ToJson(), GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel { DefinePoints = pt_qe_list }.ToJson(), GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve, GeometryInfo = pt_qe_list.ToDbString(Yw.Ahart.eCurveType.QE, Yw.Ahart.eFeatType.Cubic), AnnotationParas = new List() { new () { X = pt_qe_list.Last().X, Y = pt_qe_list.Last().Y, Text = $"{speed}rpm({hz}hz)", Aligment = eTextAligment.Right } }.ToJson() }; list.Add(graph_qe); } if (pt_qp_list != null && pt_qp_list.Any()) { var graph_qp = new Yw.Vmo.PhartGraphVmo() { Name = "功率线", GraphType = (int)Yw.Ahart.eCurveType.QP, GraphParas = new QPGraphParasViewModel() { Hz = hz, N = speed, }.ToJson(), GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel { DefinePoints = pt_qp_list }.ToJson(), GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve, GeometryInfo = pt_qp_list.ToDbString(Yw.Ahart.eCurveType.QP, Yw.Ahart.eFeatType.Cubic), AnnotationParas = new List() { new () { X = pt_qp_list.Last().X, Y = pt_qp_list.Last().Y, Text = $"{speed}rpm({hz}hz)", Aligment = eTextAligment.Right } }.ToJson() }; list.Add(graph_qp); } list.ForEach(x => x.DiagramID = _vmo.ID); var bol = await new Yw.BLL.PhartGraph().Inserts(list); if (!bol) { TipFormHelper.ShowWarn("添加失败!"); return; } var newVmo = await new Yw.BLL.PhartDiagramExtensions().GetByID(_vmo.ID); if (newVmo == null) { TipFormHelper.ShowWarn("获取失败!"); return; } SetBindingData(newVmo, _nr); SetEquip(); } private async void Insert(double eff, double tension, bool is_closed,bool is_u, List pt_equal_e_list) { if (tension<=0) { tension = 0.5; } var list = new List(); var graph_equal_e = new Yw.Vmo.PhartGraphVmo() { Name = "扬程线", GraphType = (int)Yw.Ahart.eCurveType.EqualE, GraphParas = new EqualEGraphParasViewModel() { Eff = eff, Tension = tension, IsClosed = is_closed, }.ToJson(), GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel { DefinePoints = pt_equal_e_list }.ToJson(), GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve, GeometryInfo = pt_equal_e_list.ToDbString(Yw.Ahart.eCurveType.EqualE, Yw.Ahart.eFeatType.Cubic), }; var annotation_list = new List(); annotation_list.Add(new() { X = pt_equal_e_list.Last().X, Y = pt_equal_e_list.Last().Y, Text = $"{eff}%", Aligment = eTextAligment.Right }); if (is_u) { var first = pt_equal_e_list.First(); annotation_list.Add(new() { X = first.X, Y = first.Y, Text = $"{eff}%", Aligment = eTextAligment.Right }); } graph_equal_e.AnnotationParas = annotation_list.ToJson(); list.Add(graph_equal_e); list.ForEach(x => x.DiagramID = _vmo.ID); var bol = await new Yw.BLL.PhartGraph().Inserts(list); if (!bol) { TipFormHelper.ShowWarn("添加失败!"); return; } var newVmo = await new Yw.BLL.PhartDiagramExtensions().GetByID(_vmo.ID); if (newVmo == null) { TipFormHelper.ShowWarn("获取失败!"); return; } SetBindingData(newVmo, _nr); SetEquip(); } /// /// 获取 /// public Yw.Vmo.PhartDiagramExGraphListVmo Get() { return new Yw.Vmo.PhartDiagramExGraphListVmo(); } } }