Shuxia Ning
2025-01-15 0ca8d5739a8074b92997c838f45a18a54c52c4b3
WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs
@@ -1,5 +1,9 @@
using System.Data;
using DevExpress.Spreadsheet;
using StackExchange.Profiling.Internal;
using Yw.Ahart;
using Yw.Geometry;
using Yw.Pump;
using Yw.WinFrmUI.Phart;
namespace HStation.WinFrmUI
{
@@ -8,78 +12,828 @@
        public PumpChartViewCtrl()
        {
            InitializeComponent();
            this.barCekEqulEffVisible.Checked = true;
            this.barCekPowerVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
            this.barCekEqVisible.Checked = true;
            this.barCekEqVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
        }
        private Yw.Vmo.PhartDiagramExGraphListVmo _vmo = null;
        private List<Yw.WinFrmUI.Phart.PumpViewChartViewModel> _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;
        /// <summary>
        /// 绑定数据
        /// </summary>
        public void SetBindingData(Yw.Vmo.PhartDiagramExGraphListVmo vmo, double nr)
        {
            var vm_list = vmo.GetPumpCurveViewMdoelList();
            var vm_defult = vm_list.OrderBy(x => x.Hz).LastOrDefault();
            var vm_ee_list = vmo.GetCurveEqualEViewMdoelList();
            _vmo = vmo;
            _nr = nr;
            _vm_list = null;
            _coordinate = null;
            if (vmo == null)
            {
                ClearBindingData();
                return;
            }
            var vm = new Yw.WinFrmUI.Phart.PumpViewChartViewModel();
            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.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>();
            var vm_list = new List<Yw.WinFrmUI.Phart.PumpViewChartViewModel>();
            if (vmo.GraphList == null || !vmo.GraphList.Any())
            {
                ClearBindingData();
                return;
            }
            //for (int eff = 30; eff < 90; eff += 1)
            //{
            //    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)
            //    {
            //        var qe = vm_defult.CurveQE.ToNewByN(50, hz);
            //        var q_array = qe.FeatCurve.GetPointsX(eff);
            //        if (q_array == null || !q_array.Any())
            //        {
            //            continue;
            //        }
            //        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;
            //    }
            _coordinate = vmo.DispParas;
            foreach (var graph in vmo.GraphList)
            {
                bool is_default = false;
                double hz = 50;
                double n = nr;
                double eff = -1;
                var curve_type = (Yw.Ahart.eCurveType)graph.GraphType;
                switch (curve_type)
                {
                    case Yw.Ahart.eCurveType.QH:
                        {
                            var paras = PhartGraphHelper.GetGraphParas<Yw.WinFrmUI.Phart.QHGraphParasViewModel>(curve_type, graph.GraphParas);
                            hz = paras.Hz;
                            n = paras.N;
                            if (hz == 50)
                                is_default = true;
                        }
                        break;
                    case Yw.Ahart.eCurveType.QP:
                        {
                            var paras = PhartGraphHelper.GetGraphParas<Yw.WinFrmUI.Phart.QPGraphParasViewModel>(curve_type, graph.GraphParas);
                            hz = paras.Hz;
                            n = paras.N;
                            if (hz == 50)
                                is_default = true;
                        }
                        break;
                    case Yw.Ahart.eCurveType.QE:
                        {
                            var paras = PhartGraphHelper.GetGraphParas<Yw.WinFrmUI.Phart.QEGraphParasViewModel>(curve_type, graph.GraphParas);
                            hz = paras.Hz;
                            n = paras.N;
                            if (hz == 50)
                                is_default = true;
                        }
                        break;
                    case Yw.Ahart.eCurveType.EqualE:
                        {
                            var paras = PhartGraphHelper.GetGraphParas<EqualEGraphParasViewModel>(curve_type, graph.GraphParas);
                            eff = paras.Eff;
                        }
                        break;
                }
            //    vm.EqualEffList.Add(ve);
            //}
                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.DbId = graph.ID;
                vm.Hz = hz;
                vm.N = n;
                vm.Eff = eff;
                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);
            //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);
            //}
                vm.IsDefault = is_default;
                vm.GraphParas = graph.GraphParas;
                vm_list.Add(vm);
            }
            this.pumpChart1.SetBindingData(vm);
            _vm_list = vm_list;
            var list = _vm_list.Select(x => x.Hz).OrderByDescending(x => x).ToList();
            list = list.Distinct().ToList();
            this.repImgCmbCurveSel.BeginInit();
            this.repImgCmbCurveSel.Items.Clear();
            foreach (var hz in list)
            {
                this.repImgCmbCurveSel.Items.Add($"{hz}hz", hz, -1);
            }
            this.repImgCmbCurveSel.EndInit();
            this.barImgCmbChartSel.EditValue = null;
            SetColor(_vm_list);
            SetBindingData(_vm_list, _coordinate, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
        }
        /// <summary>
        ///
        /// </summary>
        private void SetColor(List<Yw.WinFrmUI.Phart.PumpViewChartViewModel> 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;
                    }
                }
            }
        }
        /// <summary>
        /// 绑定数据
        /// </summary>
        private void SetBindingData(List<Yw.WinFrmUI.Phart.PumpViewChartViewModel> 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<Yw.WinFrmUI.Phart.PumpViewChartViewModel>();
            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())
            {
                TipFormHelper.ShowInfo("无数据");
                return true;
            }
            if (!_vm_list.Exists(x => x.CurveType == Yw.Ahart.eCurveType.QH))
            {
                TipFormHelper.ShowInfo("无数据");
                return true;
            }
            return false;
        }
        /// <summary>
        /// 清空绑定数据
        /// </summary>
        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 barImgCmbChartSel_EditValueChanged(object sender, EventArgs e)
        {
            if (this.barImgCmbChartSel.EditValue==null)
            {
                return;
            }
            var hz = Convert.ToDouble(this.barImgCmbChartSel.EditValue);
            _vm_list.ForEach(x => x.IsSelect = false);
            foreach (var vm in _vm_list)
            {
                if (vm.Hz != hz)
                    continue;
                switch (vm.CurveType)
                {
                    case Yw.Ahart.eCurveType.QH:
                        {
                            vm.IsSelect = true;
                        }
                        break;
                    case Yw.Ahart.eCurveType.QP:
                        {
                            vm.IsSelect = true;
                        }
                        break;
                    case Yw.Ahart.eCurveType.QE:
                        {
                            vm.IsSelect = true;
                        }
                        break;
                }
            }
            SetBindingData(_vm_list, _coordinate, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
        }
        private void barCekLineVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            this.pumpViewChart1.LineVisible=this.barCekLineVisible.Checked;
        }
        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 barBtnDeleteVariableSpeed_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (IsInvalidData())
            {
                return;
            }
            if (!_vm_list.Exists(x => x.Hz != 50))
            {
                TipFormHelper.ShowInfo("无变速线");
                return;
            }
            var list = _vm_list.Where(x => x.Hz != 50).Select(x => (x.Hz, x.N)).ToList();
            var dlg = new DeleteVariableSpeedDlg();
            dlg.SetBindingData(list);
            dlg.ReloadDataEvent += (del_list) =>
            {
                var del_info_list = _vm_list.Where(x => del_list.Contains(x.Hz)).Select(x => (x.DbId, x.Hz)).ToList();
                Delete(del_info_list);
                return true;
            };
            dlg.ShowDialog();
        }
        private void barBtnDeleteEqualEff_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (IsInvalidData())
            {
                return;
            }
            if (!_vm_list.Exists(x => x.CurveType == eCurveType.EqualE))
            {
                TipFormHelper.ShowInfo("无等效线");
                return;
            }
            var _vm_eff_list = _vm_list.Where(x => x.CurveType == eCurveType.EqualE).ToList();
            var list = _vm_eff_list.Select(x => x.Eff).ToList();
            var dlg = new DeleteEqualEDlg();
            dlg.SetBindingData(list);
            dlg.ReloadDataEvent += (del_list) =>
            {
                var del_info_list = _vm_eff_list.Where(x => del_list.Contains(x.Eff)).Select(x => (x.DbId, x.Eff)).ToList();
                Delete(del_info_list);
                return true;
            };
            dlg.ShowDialog();
        }
        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)
                {
                    if (_vm_list.Exists(x => x.Eff == eff))
                    {
                        continue;
                    }
                    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<Yw.Geometry.Point2d> pt_qh_list, List<Yw.Geometry.Point2d> pt_qe_list, List<Yw.Geometry.Point2d> pt_qp_list)
        {
            var list = new List<Yw.Vmo.PhartGraphVmo>();
            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<Yw.WinFrmUI.Phart.AnnotationParasViewModel>()
                    {
                       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<Yw.WinFrmUI.Phart.AnnotationParasViewModel>()
                    {
                       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<Yw.WinFrmUI.Phart.AnnotationParasViewModel>()
                    {
                       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<Yw.Geometry.Point2d> pt_equal_e_list)
        {
            if (tension <= 0)
            {
                tension = 0.5;
            }
            var list = new List<Yw.Vmo.PhartGraphVmo>();
            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<Yw.WinFrmUI.Phart.AnnotationParasViewModel>();
            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();
        }
        private async void Delete(List<(long Id, double Basis)> graph_ids)
        {
            if (graph_ids == null || !graph_ids.Any())
            {
                return;
            }
            var bll = new Yw.BLL.PhartGraph();
            var err_hz_list = new List<double>();
            foreach (var graph_info in graph_ids)
            {
                var bol = await bll.DeleteByID(graph_info.Id);
                if (!bol)
                {
                    err_hz_list.Add(graph_info.Basis);
                    return;
                }
            }
            if (err_hz_list != null && err_hz_list.Any())
            {
                var info = Yw.Untity.DoubleListHelper.ToString(err_hz_list);
                TipFormHelper.ShowError($"{info}删除失败!");
            }
            var newVmo = await new Yw.BLL.PhartDiagramExtensions().GetByID(_vmo.ID);
            if (newVmo == null)
            {
                TipFormHelper.ShowWarn("获取失败!");
                return;
            }
            SetBindingData(newVmo, _nr);
            SetEquip();
        }
        /// <summary>
@@ -90,5 +844,6 @@
            return new Yw.Vmo.PhartDiagramExGraphListVmo();
        }
    }
}