using Yw.WinFrmUI.Phart; namespace HStation.WinFrmUI { /// /// 图表Vmo 扩展方法 /// public static class PhartVmoExtensions { #region ViewModel #region PumpCurve /// /// 获取默认的泵曲线 /// public static PumpPerformCurveViewModel GetDefaultPumpCurveViewMdoel(this Yw.Vmo.PhartDiagramExGraphListVmo vmo) { if (vmo == null) { return default; } var graph_list = vmo.GraphList; if (graph_list == null || !graph_list.Any()) { return default; } return graph_list.GetDefaultPumpCurveViewMdoel(); } /// /// 获取默认的泵曲线 /// public static PumpPerformCurveViewModel GetDefaultPumpCurveViewMdoel(this List vmo_list) { if (vmo_list == null || !vmo_list.Any()) { return default; } var vm_list = vmo_list.GetPumpCurveViewMdoelList(); if (vmo_list == null || !vm_list.Any()) { return default; } var vm = vm_list.OrderBy(x => x.Hz).Last(); return vm; } /// /// 获取变速泵曲线列表 /// public static List GetVariableSpeedPumpCurveViewMdoelList(this Yw.Vmo.PhartDiagramExGraphListVmo vmo) { if (vmo == null) { return default; } var graph_list = vmo.GraphList; if (graph_list == null || !graph_list.Any()) { return default; } var vm_list = graph_list.GetPumpCurveViewMdoelList(); if (vm_list == null || !vm_list.Any()) { return default; } var vm_default = vm_list.OrderBy(x => x.Hz).LastOrDefault(); vm_list.Remove(vm_default); return vm_list; } /// /// 获取泵曲线列表 /// public static List GetPumpCurveViewMdoelList(this Yw.Vmo.PhartDiagramExGraphListVmo vmo) { if (vmo == null) { return default; } var graph_list = vmo.GraphList; if (graph_list == null || !graph_list.Any()) { return default; } return graph_list.GetPumpCurveViewMdoelList(); } /// /// 获取泵曲线列表 /// public static List GetPumpCurveViewMdoelList(this List vmo_list) { if (vmo_list == null || !vmo_list.Any()) { return default; } var filter_list = new List<(double, double, Yw.Ahart.eCurveType, object)>(); foreach (var vmo in vmo_list) { if (vmo.GraphType == (int)HStation.PhartRelation.eGraphType.QH) { var paras = QHGraphParasViewModel.ToModel(vmo.GraphParas); if (paras != null) { var curve = Yw.Pump.CurveQHHelper.ToModel(vmo.GeometryInfo); filter_list.Add((paras.Hz, paras.N, Yw.Ahart.eCurveType.QH, curve)); } } else if (vmo.GraphType == (int)HStation.PhartRelation.eGraphType.QE) { var paras = QEGraphParasViewModel.ToModel(vmo.GraphParas); if (paras != null) { var curve = Yw.Pump.CurveQEHelper.ToModel(vmo.GeometryInfo); filter_list.Add((paras.Hz, paras.N, Yw.Ahart.eCurveType.QE, curve)); } } else if (vmo.GraphType == (int)HStation.PhartRelation.eGraphType.QP) { var paras = QPGraphParasViewModel.ToModel(vmo.GraphParas); if (paras != null) { var curve = Yw.Pump.CurveQPHelper.ToModel(vmo.GeometryInfo); filter_list.Add((paras.Hz, paras.N, Yw.Ahart.eCurveType.QP, curve)); } } } if (filter_list == null || !filter_list.Any()) { return default; } var vm_list = new List(); var group = filter_list.GroupBy(x => new { x.Item1, x.Item2 }); foreach (var item_list in group) { var hz = item_list.Key.Item1; var n = item_list.Key.Item2; var curve_list = item_list.Select(x => x.Item4).ToList(); var qh = (Yw.Pump.CurveQH)curve_list.Find(x => x is Yw.Pump.CurveQH); var qe = (Yw.Pump.CurveQE)curve_list.Find(x => x is Yw.Pump.CurveQE); var qp = (Yw.Pump.CurveQP)curve_list.Find(x => x is Yw.Pump.CurveQP); if (qh == null) continue; var vm = new PumpPerformCurveViewModel(); vm.Hz = hz; vm.N = n; vm.CurveQH = new QHViewModel(qh); if (qe != null) { vm.CurveQE = new QEViewModel(qe); } if (qp != null) { vm.CurveQP = new QPViewModel(qp); } vm_list.Add(vm); } return vm_list; } /// /// 获取泵曲线列表 /// public static List<(double hz, double n, Yw.Vmo.PhartGraphVmo QH, Yw.Vmo.PhartGraphVmo QE, Yw.Vmo.PhartGraphVmo QP)> GetVmoList(this List vmo_list) { if (vmo_list == null || !vmo_list.Any()) { return default; } var filter_list = new List<(double, double, Yw.Ahart.eCurveType, Yw.Vmo.PhartGraphVmo)>(); foreach (var vmo in vmo_list) { if (vmo.GraphType == (int)HStation.PhartRelation.eGraphType.QH) { var paras = QHGraphParasViewModel.ToModel(vmo.GraphParas); if (paras != null) { var curve = Yw.Pump.CurveQHHelper.ToModel(vmo.GeometryInfo); filter_list.Add((paras.Hz, paras.N, Yw.Ahart.eCurveType.QH, vmo)); } } else if (vmo.GraphType == (int)HStation.PhartRelation.eGraphType.QE) { var paras = QEGraphParasViewModel.ToModel(vmo.GraphParas); if (paras != null) { var curve = Yw.Pump.CurveQEHelper.ToModel(vmo.GeometryInfo); filter_list.Add((paras.Hz, paras.N, Yw.Ahart.eCurveType.QE, vmo)); } } else if (vmo.GraphType == (int)HStation.PhartRelation.eGraphType.QP) { var paras = QPGraphParasViewModel.ToModel(vmo.GraphParas); if (paras != null) { var curve = Yw.Pump.CurveQPHelper.ToModel(vmo.GeometryInfo); filter_list.Add((paras.Hz, paras.N, Yw.Ahart.eCurveType.QP, vmo)); } } } if (filter_list == null || !filter_list.Any()) { return default; } var list = new List<(double hz, double n, Yw.Vmo.PhartGraphVmo QH, Yw.Vmo.PhartGraphVmo QE, Yw.Vmo.PhartGraphVmo QP)>(); var group = filter_list.GroupBy(x => new { x.Item1, x.Item2 }); foreach (var item_list in group) { var hz = item_list.Key.Item1; var n = item_list.Key.Item2; var curve_list = item_list.Select(x => x.Item4).ToList(); var qh = curve_list.Find(x => x.GraphType == (int)HStation.PhartRelation.eGraphType.QH); var qe = curve_list.Find(x => x.GraphType == (int)HStation.PhartRelation.eGraphType.QE); var qp = curve_list.Find(x => x.GraphType == (int)HStation.PhartRelation.eGraphType.QP); if (qh == null) continue; list.Add((hz, n, qh, qe, qp)); } return list; } /// /// 获取泵曲线列表 /// public static (Yw.Vmo.PhartGraphVmo QH, Yw.Vmo.PhartGraphVmo QE, Yw.Vmo.PhartGraphVmo QP) GetDefaultVmo(this Yw.Vmo.PhartDiagramExGraphListVmo vmo) { if (vmo == null) { return default; } var graph_list = vmo.GraphList; if (graph_list == null || !graph_list.Any()) { return default; } var vmo_list = graph_list.GetVmoList(); if (vmo_list == null || !vmo_list.Any()) { return default; } var vmo_def = vmo_list.OrderBy(x => x.hz).LastOrDefault(); return new(vmo_def.QH, vmo_def.QE, vmo_def.QP); } #endregion #region EqualE /// /// 获取等效线列表 /// public static List GetCurveEqualEViewMdoelList(this Yw.Vmo.PhartDiagramExGraphListVmo vmo) { if (vmo == null) { return default; } var graph_list = vmo.GraphList; if (graph_list == null || !graph_list.Any()) { return default; } return graph_list.GetCurveEqualEViewMdoelList(); } /// /// 获取等效线列表 /// public static List GetCurveEqualEViewMdoelList(this List vmo_list) { vmo_list = vmo_list?.Where(x => x.GraphType == (int)HStation.PhartRelation.eGraphType.EqualE).ToList(); if (vmo_list == null || !vmo_list.Any()) { return default; } var vm_list = new List(); foreach (var vmo in vmo_list) { var graph_paras = Yw.WinFrmUI.Phart.EqualEGraphParasViewModel.ToModel(vmo.GraphParas); var geometry_paras = Yw.WinFrmUI.Phart.CurveGeometryParasViewModel.ToModel(vmo.GeometryInfo); var curve = vmo.GetPerformCurve() as Yw.Pump.CurveEqualE; if (curve == null) continue; var vm = new EqualEViewModel(curve, graph_paras, geometry_paras); vm_list.Add(vm); } return vm_list; } #endregion #region EqualP /// /// 获取等功线列表 /// public static List GetCurveEqualPViewMdoelList(this Yw.Vmo.PhartDiagramExGraphListVmo vmo) { if (vmo == null) { return default; } var graph_list = vmo.GraphList; if (graph_list == null || !graph_list.Any()) { return default; } return graph_list.GetCurveEqualPViewMdoelList(); } /// /// 获取等功线列表 /// public static List GetCurveEqualPViewMdoelList(this List vmo_list) { vmo_list = vmo_list?.Where(x => x.GraphType == (int)HStation.PhartRelation.eGraphType.EqualP).ToList(); if (vmo_list == null || !vmo_list.Any()) { return default; } var vm_list = new List(); foreach (var vmo in vmo_list) { var graph_paras = EqualPGraphParasViewModel.ToModel(vmo.GraphParas); var geometry_paras = Yw.WinFrmUI.Phart.CurveGeometryParasViewModel.ToModel(vmo.GeometryInfo); var curve = vmo.GetPerformCurve() as Yw.Pump.CurveEqualP; if (curve == null) continue; var vm = new EqualPViewModel(curve, graph_paras, geometry_paras); vm_list.Add(vm); } return vm_list; } #endregion #endregion #region Perform /// /// 获取特性曲线 /// public static Yw.Ahart.PerformCurveBase GetPerformCurve(this Yw.Vmo.PhartGraphVmo vmo) { if (vmo == null) return default; var performCurve = PhartGraphHelper.GetPerformCurve((Yw.Ahart.eCurveType)vmo.GraphType, vmo.GeometryInfo); return performCurve; } /// /// 获取性能点列表 /// public static List GetFeatPointList(this Yw.Vmo.PhartGraphVmo vmo, int point_number = 12, double min_space = 0.0001) { if (vmo == null) return default; var curve = vmo.GetPerformCurve(); var pts = curve.FeatCurve.GetPointList(point_number, min_space); return pts?.ToList(); } /// /// 获取特性曲线 /// public static (Yw.Ahart.eCurveType curve_type, Yw.Ahart.eFeatType feat_type, List define_pt_list, List line_pt_list) GetCurveInfo(this Yw.Vmo.PhartGraphVmo vmo) { if (vmo == null) return default; var paras = vmo.GeometryParasModel(); var define_pt_list = paras?.DefinePoints; var performCurve = PhartGraphHelper.GetPerformCurve((Yw.Ahart.eCurveType)vmo.GraphType, vmo.GeometryInfo); var curve_type = (Yw.Ahart.eCurveType)vmo.GraphType; var feat_type = performCurve.FeatType; var line_pt_list = performCurve.FeatCurve.GetPointList(50); if (define_pt_list == null) { define_pt_list = line_pt_list?.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList(); } return new(curve_type, feat_type, define_pt_list, line_pt_list); } #endregion /// /// 获取特性曲线 /// public static CurveGeometryParasViewModel GeometryParasModel(this Yw.Vmo.PhartGraphVmo vmo) { if (vmo == null) return default; if (string.IsNullOrEmpty(vmo.GeometryParas)) return default; if (vmo.GeometryStyle != (int)HStation.PhartRelation.eGeometryStyle.FeatCurve) return default; return CurveGeometryParasViewModel.ToModel(vmo.GeometryParas); } } }