namespace Yw.WinFrmUI.Phart { /// /// /// public partial class PumpCoordinate { #region 计算显示参数方法 #region 默认 /// /// 最大流量(显示参数) /// public double DispMaxQ() { return this.CoordMinQ + this.GridNumberX * this.CoordSpaceQ; } /// /// 最小扬程(显示参数) /// public double DispMinH() { return this.CoordMinH + this.StartLineNoH * this.CoordSpaceH; } /// /// 最大扬程(显示参数) /// public double DispMaxH() { return CoordMinH + this.EndLineNoH * this.CoordSpaceH; } /// /// 最小效率(显示参数) /// public double DispMinE() { return this.CoordMinE + this.StartLineNoE * this.CoordSpaceE; } /// /// 最大效率(显示参数) /// public double DispMaxE() { return this.CoordMinE + this.EndLineNoE * this.CoordSpaceE; } /// /// 最小功率(显示参数) /// public double DispMinP() { return this.CoordMinP + this.StartLineNoP * this.CoordSpaceP; } /// /// 最大功率(显示参数) /// public double DispMaxP() { return this.CoordMinP + this.EndLineNoP * this.CoordSpaceP; } #endregion /// /// 重置扬程坐标 /// public void ResetCoordH(double space, double disMinH, double disMaxH) { this.CoordSpaceH = space; this.EndLineNoH = this.GridNumberY; this.StartLineNoH = this.EndLineNoH - (int)((disMaxH - disMinH) / this.CoordSpaceH); this.CoordMinH = disMaxH - this.EndLineNoH * this.CoordSpaceH; } #endregion #region 计算坐标 /// /// 计算坐标 /// /// 流量扬程线 /// 流量效率线 /// 流量功率线 /// public static PumpCoordinate CalcCoordinate(List QH, List QE, List QP) { if (QH == null) return null; double max_flow = 0.0; double min_flow = 1000.0; double max_head = 0.0; double min_head = 1000.0; double max_eff = 0.0; double min_eff = 1000.0; double max_power = 0.0; double min_power = 1000.0; if (QE == null && QP == null) { min_flow = QH.Min(x => x.X); max_flow = QH.Max(x => x.X); if (min_flow > max_flow) { return null; } min_head = QH.Min(x => x.Y); max_head = QH.Max(x => x.Y); if (min_head > max_head) { return null; } } else { CalcMinMaxValue(QH, QE, QP, ref max_flow, ref min_flow, ref max_head, ref min_head, ref max_eff, ref min_eff, ref max_power, ref min_power); } var calc_corrd = CalcCoordinate(min_flow, max_flow, min_head, max_head, min_eff, max_eff, min_power, max_power); #region 修正Y轴 var head_num_y = calc_corrd.EndLineNoH - calc_corrd.StartLineNoH; var eff_num_y = calc_corrd.EndLineNoE - calc_corrd.StartLineNoE; var power_num_y = calc_corrd.EndLineNoP - calc_corrd.StartLineNoP; var sun_num_y = Math.Abs(head_num_y + eff_num_y + power_num_y); if (sun_num_y < calc_corrd.GridNumberY) { calc_corrd.StartLineNoP = 1; } #endregion return calc_corrd; } /// /// 计算最大最小值 /// /// 流量扬程线 /// 流量效率线 /// 流量功率线 /// 最大流量 /// 最小流量 /// 最大扬程 /// 最小扬程 /// 最大效率 /// 最小效率 /// 最大功率 /// 最小功率 /// public static bool CalcMinMaxValue(List QH, List QE, List QP, ref double max_flow, ref double min_flow, ref double max_head, ref double min_head, ref double max_eff, ref double min_eff, ref double max_power, ref double min_power) { max_flow = 0.0; min_flow = 1000.0; max_head = 0.0; min_head = 1000.0; max_eff = 0.0; min_eff = 1000.0; max_power = 0.0; min_power = 1000.0; if (QH == null) { return false; } min_flow = QH.Min(x => x.X); max_flow = QH.Max(x => x.X); if (min_flow > max_flow) { return false; } min_head = QH.Min(x => x.Y); max_head = QH.Max(x => x.Y); if (QE != null && QE.Count > 0) { min_eff = QE.Min(x => x.Y); max_eff = QE.Max(x => x.Y); } if (QP != null && QP.Count > 0) { min_power = QP.Min(x => x.Y); max_power = QP.Max(x => x.Y); } return true; } /// /// 计算坐标 /// /// 最小流量 /// 最大流量 /// 最小扬程 /// 最大扬程 /// 最小效率 /// 最大效率 /// 最小功率 /// 最大功率 /// public static PumpCoordinate CalcCoordinate(double min_flow, double max_flow, double min_head, double max_head, double min_eff, double max_eff, double min_power, double max_power) { if (min_flow > max_flow - 0.01) return null; if (min_head > max_head - 0.01) return null; var valid_grid_num_h = 6; var coordinate_paras = new PumpCoordinate(); coordinate_paras.GridNumberX = 10;//10 coordinate_paras.GridNumberY = 18;//18 CalcCoordinateQ(min_flow, max_flow, ref coordinate_paras, coordinate_paras.GridNumberX); CalcCoordinateH(min_head, max_head, valid_grid_num_h, ref coordinate_paras, out double disMinH, out double disMaxH); if (max_power > min_power + 0.01) CalcCoordinateP(min_power, max_power, disMaxH, 0, ref coordinate_paras); if (max_eff > min_eff + 0.01) CalcCoordinateE(min_eff, max_eff, ref coordinate_paras); return coordinate_paras; } #endregion #region 计算对应线坐标 /// /// 计算流量坐标 /// /// 最小流量 /// 最大流量 /// 坐标Model /// 有效刻度点 /// 放大系数 public static void CalcCoordinateQ(double min_flow, double max_flow, ref PumpCoordinate coordinate_paras, int validGridNum = 10, double default_num = 1.0) { var coordSpaceQ = PhartCoordinateHelper.GetOptimalSpaceMin(min_flow / default_num, max_flow / default_num, validGridNum, out double disMinQ, out double disMaxQ) * default_num; coordSpaceQ = Math.Max(0.5, coordSpaceQ / default_num) * default_num; if (coordSpaceQ == 8.0) coordSpaceQ = 10.0; disMinQ *= default_num; //disMaxQ *= default_num; var gridNumberX = 0; double min_q = disMinQ; while (min_q < max_flow) { gridNumberX++; min_q = disMinQ + gridNumberX * coordSpaceQ; } if (gridNumberX <= 5) { coordSpaceQ *= 0.5; gridNumberX *= 2; } coordinate_paras.CoordSpaceQ = coordSpaceQ; coordinate_paras.CoordMinQ = disMinQ; coordinate_paras.GridNumberX = gridNumberX; } /// /// 计算扬程坐标 含过滤 (Eventech: CalcCoordinateH2) /// /// 最小扬程 /// 最大扬程 /// 有效扬程刻度数 /// 坐标Model /// 最小显示扬程 /// 最大显示扬程 public static void CalcCoordinateH_Filter(double min_head, double max_head, int valid_grid_num_h, ref PumpCoordinate coordinate_paras, out double disMinH, out double disMaxH) { if (max_head < 1.0) { disMinH = 0.0; disMaxH = 1.0; coordinate_paras.ResetCoordH(0.1, disMinH, disMaxH); } else if (max_head < 2.0) { disMinH = 0.0; disMaxH = 2.0; coordinate_paras.ResetCoordH(0.2, disMinH, disMaxH); } else if (max_head < 5.0) { disMinH = 0.0; disMaxH = 5.0; coordinate_paras.ResetCoordH(0.5, disMinH, disMaxH); } else if (max_head < 10.0) { disMinH = 0.0; disMaxH = 10.0; coordinate_paras.ResetCoordH(1.0, disMinH, disMaxH); } else if (max_head < 12.0) { coordinate_paras.CoordSpaceH = 1.0; disMinH = 0.0; disMaxH = 12.0; coordinate_paras.ResetCoordH(1.0, disMinH, disMaxH); } else if (max_head < 15.0) { coordinate_paras.CoordSpaceH = 2.0; disMinH = 0.0; disMaxH = 16.0; coordinate_paras.ResetCoordH(2.0, disMinH, disMaxH); } else if (max_head < 20.0) { coordinate_paras.CoordSpaceH = 2.0; disMinH = 0.0; disMaxH = 20.0; coordinate_paras.ResetCoordH(2.0, disMinH, disMaxH); } else { CalcCoordinateH(min_head, max_head, valid_grid_num_h, ref coordinate_paras, out disMinH, out disMaxH); } } /// /// 计算扬程坐标 /// /// 最小扬程 /// 最大扬程 /// 有效扬程刻度数 /// 坐标Model /// 最小显示扬程 /// 最大显示扬程 public static void CalcCoordinateH(double min_head, double max_head, int valid_grid_num_h, ref PumpCoordinate coordinate_paras, out double disMinH, out double disMaxH) { var coordSpaceH = PhartCoordinateHelper.GetOptimalSpaceMax(min_head, max_head, valid_grid_num_h, out disMinH, out disMaxH); int endLineNoH = coordinate_paras.GridNumberY; int stratLineNoH = endLineNoH; double max_h = disMaxH;//判断条件 while (max_h > min_head * 0.98) { max_h -= coordSpaceH; if (max_h < 0.0) break; stratLineNoH--; } coordinate_paras.CoordSpaceH = coordSpaceH; coordinate_paras.EndLineNoH = endLineNoH; coordinate_paras.StartLineNoH = stratLineNoH; coordinate_paras.CoordMinH = disMaxH - endLineNoH * coordSpaceH; } /// /// 计算功率坐标 /// /// 最小功率 /// 最大功率 /// 最大显示扬程 /// 最低点刻度 /// 坐标Model public static void CalcCoordinateP(double min_power, double max_power, double disMaxH, int downGridNum, ref PumpCoordinate coordinate_paras) { int default_num = 7; int spaceNum = coordinate_paras.StartLineNoH - default_num - downGridNum; if (spaceNum < 3) spaceNum = 3; var coordSpaceP = PhartCoordinateHelper.GetOptimalSpaceMax(min_power, max_power, spaceNum, out double disMinP, out double disMaxP); int endLineNoP = coordinate_paras.StartLineNoH - default_num; int stratLineNoP = endLineNoP; double max_p = disMaxP; while (max_p > min_power) { max_p -= coordSpaceP; if (max_p < 0.0) break; stratLineNoP--; } coordinate_paras.CoordSpaceP = coordSpaceP; coordinate_paras.EndLineNoP = endLineNoP; coordinate_paras.StartLineNoP = stratLineNoP; //如果开始刻度低于最低点刻度 都往上加差值 if (coordinate_paras.StartLineNoP < downGridNum) { int diff_num = downGridNum - coordinate_paras.StartLineNoP; coordinate_paras.EndLineNoP += diff_num; coordinate_paras.StartLineNoP += diff_num; } coordinate_paras.CoordMinH = PhartCoordinateHelper.GetByPlacesLength(disMaxH - coordinate_paras.EndLineNoH * coordinate_paras.CoordSpaceH, 3); coordinate_paras.CoordMinP = PhartCoordinateHelper.GetByPlacesLength(disMaxP - coordinate_paras.EndLineNoP * coordinate_paras.CoordSpaceP, 3); } /// /// 计算效率坐标 /// /// 最小效率 /// 最大效率 /// 坐标Model public static void CalcCoordinateE(double min_eff, double max_eff, ref PumpCoordinate coordinate_paras) { int startLineNoE = coordinate_paras.StartLineNoH - 6; if (max_eff <= 40.0) { coordinate_paras.StartLineNoE = startLineNoE; coordinate_paras.EndLineNoE = coordinate_paras.StartLineNoE + 6; coordinate_paras.CoordSpaceE = 5.0; } else if (max_eff <= 50.0) { coordinate_paras.StartLineNoE = startLineNoE - 5; coordinate_paras.EndLineNoE = coordinate_paras.StartLineNoE + 10; coordinate_paras.CoordSpaceE = 5.0; } else if (max_eff <= 60) { coordinate_paras.StartLineNoE = startLineNoE; coordinate_paras.EndLineNoE = coordinate_paras.StartLineNoE + 6; coordinate_paras.CoordSpaceE = 10.0; } else { coordinate_paras.StartLineNoE = startLineNoE; coordinate_paras.EndLineNoE = coordinate_paras.StartLineNoE + 5; coordinate_paras.CoordSpaceE = 20.0; } coordinate_paras.CoordMinE = (-coordinate_paras.StartLineNoE) * coordinate_paras.CoordSpaceE; } #endregion } }