From 1f124642185c3b9d868d98e4c5c196857fa140aa Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Tue, 28 Jun 2022 12:26:01 +0200 Subject: [PATCH] TBF.UI.Procedures.Formulas static class, refactorization. --- Config/Utils.cs | 115 ------------- TBF/TBF.csproj | 1 + TBF/UI/Procedures/Formulas.cs | 154 ++++++++++++++++++ TBF/UI/Procedures/ProceduresCtrl.cs | 36 +--- .../TestWizard/TestProfileSelection.cs | 31 +--- 5 files changed, 160 insertions(+), 177 deletions(-) create mode 100644 TBF/UI/Procedures/Formulas.cs diff --git a/Config/Utils.cs b/Config/Utils.cs index 4855b11cc..96c3669e2 100644 --- a/Config/Utils.cs +++ b/Config/Utils.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; -using Common; namespace Config { @@ -65,119 +64,5 @@ namespace Config /// pattern NOT found return string.Empty; } - - /// - /// Get either Q1 or Qmin flow for a given Qn and metrological class - /// - /// Nominal flow in m3/h - /// Metrological class ("A" ,"B", "C" or "R#") - /// NotSpecified, ColdWater or HotWater - /// Default flow when metrologic does not match pattern - /// Q1 or Qmin flow in m3/h - public static double GetQ1Qmin(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0) - { - if (string.IsNullOrEmpty(metroClass)) return Qdflt; - - int metroClassRatio; - if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0)) - { - return Qn / (double)metroClassRatio; - } - else - { - if (medium == Medium.HotWater) - { - switch (metroClass) - { - case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn); - case "B": return (Qn < 15) ? (0.02 * Qn) : (0.04 * Qn); - case "C": return (Qn < 15) ? (0.01 * Qn) : (0.02 * Qn); - case "D": return (Qn < 15) ? (0.01 * Qn) : Qdflt; - default: break; - } - } - else - { - switch (metroClass) - { - case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn); - case "B": return (Qn < 15) ? (0.02 * Qn) : (0.03 * Qn); - case "C": return (Qn < 15) ? (0.01 * Qn) : (0.006 * Qn); - default: break; - } - } - } - - return Qdflt; - } - - /// - /// Get either Q2 or Qt flow for a given Qn and metrological class - /// - /// Nominal flow in m3/h - /// Metrological class ("A" ,"B", "C" or "R#") - /// NotSpecified, ColdWater or HotWater - /// Default flow when metrologic does not match pattern - /// Q2 or Qt flow in m3/h - public static double GetQ2Qt(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0) - { - if (string.IsNullOrEmpty(metroClass)) return Qdflt; - - int metroClassRatio; - if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0)) - { - return 1.6 * Qn / (double)metroClassRatio; - } - - if (medium == Medium.HotWater) - { - switch (metroClass) - { - case "A": return (Qn < 15) ? (0.1 * Qn) : (0.2 * Qn); - case "B": return (Qn < 15) ? (0.08 * Qn) : (0.15 * Qn); - case "C": return (Qn < 15) ? (0.06 * Qn) : (0.1 * Qn); - case "D": return (Qn < 15) ? (0.015 * Qn) : Qdflt; - default: break; - } - } - else - { - switch (metroClass) - { - case "A": return (Qn < 15) ? (0.1 * Qn) : (0.3 * Qn); - case "B": return (Qn < 15) ? (0.08 * Qn) : (0.2 * Qn); - case "C": return (Qn < 15) ? (0.015 * Qn) : (0.015 * Qn); - default: break; - } - } - - return Qdflt; - } - - /// - /// Get either Q4 or Qmax flow for a given Qn and metrological class - /// - /// Nominal flow in m3/h - /// Metrological class ("A" ,"B", "C" or "R#") - /// NotSpecified, ColdWater or HotWater - /// Default flow when metrologic does not match pattern - /// Q4 or Qmax flow in m3/h - public static double GetQ4Qmax(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0) - { - if (string.IsNullOrEmpty(metroClass)) return Qdflt; - - switch (metroClass[0]) - { - case 'A': - case 'B': - case 'C': - case 'D': - return 2 * Qn; - case 'R': - return 1.25 * Qn; - default: - return Qdflt; - } - } } } diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index b1b8363d2..52138c75d 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -2445,6 +2445,7 @@ MainWnd.cs + Form diff --git a/TBF/UI/Procedures/Formulas.cs b/TBF/UI/Procedures/Formulas.cs new file mode 100644 index 000000000..e23f1ecbc --- /dev/null +++ b/TBF/UI/Procedures/Formulas.cs @@ -0,0 +1,154 @@ + +using Common; + +namespace TBF.UI.Procedures +{ + public static class Formulas + { + public static double GetTargetQ(Config.Entities.PTest ptest, double qN, double qpQiRatio, string metroClass, Medium medium) + { + if (ptest.Name.ToLower().Contains("q4") || ptest.Name.ToLower().Contains("qmax")) + { + return Formulas.GetQ4Qmax(qN, metroClass, medium, ptest.CoefQto); + } + else if (ptest.Name.ToLower().Contains("q3") || ptest.Name.ToLower().Contains("qn") || ptest.Name.ToLower().Equals("qp")) + { + return qN; + } + else if (ptest.Name.ToLower().Contains("q2") || ptest.Name.ToLower().Contains("qt")) + { + return Formulas.GetQ2Qt(qN, metroClass, medium, ptest.CoefQto); + } + else if (ptest.Name.ToLower().Contains("q1") || ptest.Name.ToLower().Contains("qmin")) + { + return Formulas.GetQ1Qmin(qN, metroClass, medium, ptest.CoefQto); + } + else if (ptest.Name.ToLower().Contains("0,1qp") || ptest.Name.ToLower().Contains("0.1qp")) + { + return 0.1 * qN; + } + else if (ptest.Name.ToLower().Contains("qi")) + { + return qN / qpQiRatio; + } + else + { + return qN; /// Manual flow selection: CoefQfrom and CoefQto are used to calculate Qfrom and Qto from Qn + } + } + + /// + /// Get either Q1 or Qmin flow for a given Qn and metrological class + /// + /// Nominal flow in m3/h + /// Metrological class ("A" ,"B", "C" or "R#") + /// NotSpecified, ColdWater or HotWater + /// Default flow when metrologic does not match pattern + /// Q1 or Qmin flow in m3/h + public static double GetQ1Qmin(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0) + { + if (string.IsNullOrEmpty(metroClass)) return Qdflt; + + int metroClassRatio; + if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0)) + { + return Qn / (double)metroClassRatio; + } + else + { + if (medium == Medium.HotWater) + { + switch (metroClass) + { + case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn); + case "B": return (Qn < 15) ? (0.02 * Qn) : (0.04 * Qn); + case "C": return (Qn < 15) ? (0.01 * Qn) : (0.02 * Qn); + case "D": return (Qn < 15) ? (0.01 * Qn) : Qdflt; + default: break; + } + } + else + { + switch (metroClass) + { + case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn); + case "B": return (Qn < 15) ? (0.02 * Qn) : (0.03 * Qn); + case "C": return (Qn < 15) ? (0.01 * Qn) : (0.006 * Qn); + default: break; + } + } + } + + return Qdflt; + } + + /// + /// Get either Q2 or Qt flow for a given Qn and metrological class + /// + /// Nominal flow in m3/h + /// Metrological class ("A" ,"B", "C" or "R#") + /// NotSpecified, ColdWater or HotWater + /// Default flow when metrologic does not match pattern + /// Q2 or Qt flow in m3/h + public static double GetQ2Qt(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0) + { + if (string.IsNullOrEmpty(metroClass)) return Qdflt; + + int metroClassRatio; + if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0)) + { + return 1.6 * Qn / (double)metroClassRatio; + } + + if (medium == Medium.HotWater) + { + switch (metroClass) + { + case "A": return (Qn < 15) ? (0.1 * Qn) : (0.2 * Qn); + case "B": return (Qn < 15) ? (0.08 * Qn) : (0.15 * Qn); + case "C": return (Qn < 15) ? (0.06 * Qn) : (0.1 * Qn); + case "D": return (Qn < 15) ? (0.015 * Qn) : Qdflt; + default: break; + } + } + else + { + switch (metroClass) + { + case "A": return (Qn < 15) ? (0.1 * Qn) : (0.3 * Qn); + case "B": return (Qn < 15) ? (0.08 * Qn) : (0.2 * Qn); + case "C": return (Qn < 15) ? (0.015 * Qn) : (0.015 * Qn); + default: break; + } + } + + return Qdflt; + } + + /// + /// Get either Q4 or Qmax flow for a given Qn and metrological class + /// + /// Nominal flow in m3/h + /// Metrological class ("A" ,"B", "C" or "R#") + /// NotSpecified, ColdWater or HotWater + /// Default flow when metrologic does not match pattern + /// Q4 or Qmax flow in m3/h + public static double GetQ4Qmax(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0) + { + if (string.IsNullOrEmpty(metroClass)) return Qdflt; + + switch (metroClass[0]) + { + case 'A': + case 'B': + case 'C': + case 'D': + return 2 * Qn; + case 'R': + return 1.25 * Qn; + default: + return Qdflt; + } + } + } +} diff --git a/TBF/UI/Procedures/ProceduresCtrl.cs b/TBF/UI/Procedures/ProceduresCtrl.cs index fc0a401d2..1bfafb36b 100644 --- a/TBF/UI/Procedures/ProceduresCtrl.cs +++ b/TBF/UI/Procedures/ProceduresCtrl.cs @@ -738,10 +738,10 @@ namespace TBF.UI.Procedures if (wmParams != null) { wmParams.NewQnames = (pt == ProfileType.Q3R); - wmParams.Qmax = (float)((pt == ProfileType.Manual) ? 0 : Config.Utils.GetQ4Qmax(dlg.Qn, dlg.MetroClass, medium)); + wmParams.Qmax = (float)((pt == ProfileType.Manual) ? 0 : Formulas.GetQ4Qmax(dlg.Qn, dlg.MetroClass, medium)); wmParams.Qn = (float)dlg.Qn; - wmParams.Qt = (float)((pt == ProfileType.Manual) ? 0 : (pt == ProfileType.QpQi) ? (0.1 * dlg.Qn) : Config.Utils.GetQ2Qt(dlg.Qn, dlg.MetroClass, medium)); - wmParams.Qmin = (float)((pt == ProfileType.Manual) ? 0 : (pt == ProfileType.QpQi) ? dlg.Qn / dlg.QpQiRatio : Config.Utils.GetQ1Qmin(dlg.Qn, dlg.MetroClass, medium)); + wmParams.Qt = (float)((pt == ProfileType.Manual) ? 0 : (pt == ProfileType.QpQi) ? (0.1 * dlg.Qn) : Formulas.GetQ2Qt(dlg.Qn, dlg.MetroClass, medium)); + wmParams.Qmin = (float)((pt == ProfileType.Manual) ? 0 : (pt == ProfileType.QpQi) ? dlg.Qn / dlg.QpQiRatio : Formulas.GetQ1Qmin(dlg.Qn, dlg.MetroClass, medium)); wmParams.MetrologicalClass = dlg.MetroClass; wmParams.WaterTemp = medium; } @@ -754,35 +754,7 @@ namespace TBF.UI.Procedures int itemNr = 0; foreach (var ptest in dlg.SelectedProfile.Tests) { - double Qtg; - if (ptest.Name.ToLower().Contains("q4") || ptest.Name.ToLower().Contains("qmax")) - { - Qtg = Config.Utils.GetQ4Qmax(dlg.Qn, dlg.MetroClass, medium, ptest.CoefQto); - } - else if (ptest.Name.ToLower().Contains("q3") || ptest.Name.ToLower().Contains("qn") || ptest.Name.ToLower().Equals("qp")) - { - Qtg = dlg.Qn; - } - else if (ptest.Name.ToLower().Contains("q2") || ptest.Name.ToLower().Contains("qt")) - { - Qtg = Config.Utils.GetQ2Qt(dlg.Qn, dlg.MetroClass, medium, ptest.CoefQto); - } - else if (ptest.Name.ToLower().Contains("q1") || ptest.Name.ToLower().Contains("qmin")) - { - Qtg = Config.Utils.GetQ1Qmin(dlg.Qn, dlg.MetroClass, medium, ptest.CoefQto); - } - else if (ptest.Name.ToLower().Contains("0,1qp") || ptest.Name.ToLower().Contains("0.1qp")) - { - Qtg = 0.1 * dlg.Qn; - } - else if (ptest.Name.ToLower().Contains("qi")) - { - Qtg = dlg.Qn / dlg.QpQiRatio; - } - else - { - Qtg = dlg.Qn; /// Manual flow selection: CoefQfrom and CoefQto are used to calculate Qfrom and Qto from Qn - } + double Qtg = Formulas.GetTargetQ(ptest, dlg.Qn, dlg.QpQiRatio, dlg.MetroClass, medium); Test test = new Test(ptest.Name, itemNr++, newProcedure); test.Part = ptest.Part; diff --git a/TBF/UI/Procedures/TestWizard/TestProfileSelection.cs b/TBF/UI/Procedures/TestWizard/TestProfileSelection.cs index d22f05288..3aca90400 100644 --- a/TBF/UI/Procedures/TestWizard/TestProfileSelection.cs +++ b/TBF/UI/Procedures/TestWizard/TestProfileSelection.cs @@ -129,36 +129,7 @@ namespace TBF.UI.Procedures.TestWizard { Medium medium = (profile.ProfileType == ProfileType.QnClassHotWater) ? Medium.HotWater : Medium.ColdWater; - double Qtg; - if (ptest.Name.ToLower().Contains("q4") || ptest.Name.ToLower().Contains("qmax")) - { - Qtg = Config.Utils.GetQ4Qmax(Qn, MetroClass, medium, ptest.CoefQto); - } - else if (ptest.Name.ToLower().Contains("q3") || ptest.Name.ToLower().Contains("qn") || ptest.Name.ToLower().Equals("qp")) - { - Qtg = Qn; - } - else if (ptest.Name.ToLower().Contains("q2") || ptest.Name.ToLower().Contains("qt")) - { - Qtg = Config.Utils.GetQ2Qt(Qn, MetroClass, medium, ptest.CoefQto); - } - else if (ptest.Name.ToLower().Contains("q1") || ptest.Name.ToLower().Contains("qmin")) - { - Qtg = Config.Utils.GetQ1Qmin(Qn, MetroClass, medium, ptest.CoefQto); - } - else if (ptest.Name.ToLower().Contains("0,1qp") || ptest.Name.ToLower().Contains("0.1qp")) - { - Qtg = 0.1 * Qn; - } - else if (ptest.Name.ToLower().Contains("qi")) - { - Qtg = Qn / QpQiRatio; - } - else - { - Qtg = Qn; /// Manual flow selection: CoefQfrom and CoefQto are used to calculate Qfrom and Qto from Qn - } - + double Qtg = TBF.UI.Procedures.Formulas.GetTargetQ(ptest, Qn, QpQiRatio, MetroClass, medium); double Qfrom = Qtg * ptest.CoefQfrom; double Qto = Qtg * ptest.CoefQto;