TBF.UI.Procedures.Formulas static class, refactorization.
This commit is contained in:
parent
b17282f826
commit
1f12464218
115
Config/Utils.cs
115
Config/Utils.cs
@ -5,7 +5,6 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Common;
|
|
||||||
|
|
||||||
namespace Config
|
namespace Config
|
||||||
{
|
{
|
||||||
@ -65,119 +64,5 @@ namespace Config
|
|||||||
/// pattern NOT found
|
/// pattern NOT found
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get either Q1 or Qmin flow for a given Qn and metrological class
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Qn">Nominal flow in m3/h</param>
|
|
||||||
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
|
||||||
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
|
||||||
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
|
||||||
/// <returns>Q1 or Qmin flow in m3/h</returns>
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get either Q2 or Qt flow for a given Qn and metrological class
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Qn">Nominal flow in m3/h</param>
|
|
||||||
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
|
||||||
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
|
||||||
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
|
||||||
/// <returns>Q2 or Qt flow in m3/h</returns>
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get either Q4 or Qmax flow for a given Qn and metrological class
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="Qn">Nominal flow in m3/h</param>
|
|
||||||
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
|
||||||
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
|
||||||
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
|
||||||
/// <returns>Q4 or Qmax flow in m3/h</returns>
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2445,6 +2445,7 @@
|
|||||||
<Compile Include="UI\MainWnd.designer.cs">
|
<Compile Include="UI\MainWnd.designer.cs">
|
||||||
<DependentUpon>MainWnd.cs</DependentUpon>
|
<DependentUpon>MainWnd.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="UI\Procedures\Formulas.cs" />
|
||||||
<Compile Include="UI\Procedures\IProcParamsCtrl.cs" />
|
<Compile Include="UI\Procedures\IProcParamsCtrl.cs" />
|
||||||
<Compile Include="UI\Procedures\ProcedureDlg.cs">
|
<Compile Include="UI\Procedures\ProcedureDlg.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
|
|||||||
154
TBF/UI/Procedures/Formulas.cs
Normal file
154
TBF/UI/Procedures/Formulas.cs
Normal file
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get either Q1 or Qmin flow for a given Qn and metrological class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Qn">Nominal flow in m3/h</param>
|
||||||
|
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
||||||
|
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
||||||
|
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
||||||
|
/// <returns>Q1 or Qmin flow in m3/h</returns>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get either Q2 or Qt flow for a given Qn and metrological class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Qn">Nominal flow in m3/h</param>
|
||||||
|
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
||||||
|
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
||||||
|
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
||||||
|
/// <returns>Q2 or Qt flow in m3/h</returns>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get either Q4 or Qmax flow for a given Qn and metrological class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Qn">Nominal flow in m3/h</param>
|
||||||
|
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
||||||
|
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
||||||
|
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
||||||
|
/// <returns>Q4 or Qmax flow in m3/h</returns>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -738,10 +738,10 @@ namespace TBF.UI.Procedures
|
|||||||
if (wmParams != null)
|
if (wmParams != null)
|
||||||
{
|
{
|
||||||
wmParams.NewQnames = (pt == ProfileType.Q3R);
|
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.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.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 : Config.Utils.GetQ1Qmin(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.MetrologicalClass = dlg.MetroClass;
|
||||||
wmParams.WaterTemp = medium;
|
wmParams.WaterTemp = medium;
|
||||||
}
|
}
|
||||||
@ -754,35 +754,7 @@ namespace TBF.UI.Procedures
|
|||||||
int itemNr = 0;
|
int itemNr = 0;
|
||||||
foreach (var ptest in dlg.SelectedProfile.Tests)
|
foreach (var ptest in dlg.SelectedProfile.Tests)
|
||||||
{
|
{
|
||||||
double Qtg;
|
double Qtg = Formulas.GetTargetQ(ptest, dlg.Qn, dlg.QpQiRatio, dlg.MetroClass, medium);
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
Test test = new Test(ptest.Name, itemNr++, newProcedure);
|
Test test = new Test(ptest.Name, itemNr++, newProcedure);
|
||||||
test.Part = ptest.Part;
|
test.Part = ptest.Part;
|
||||||
|
|||||||
@ -129,36 +129,7 @@ namespace TBF.UI.Procedures.TestWizard
|
|||||||
{
|
{
|
||||||
Medium medium = (profile.ProfileType == ProfileType.QnClassHotWater) ? Medium.HotWater : Medium.ColdWater;
|
Medium medium = (profile.ProfileType == ProfileType.QnClassHotWater) ? Medium.HotWater : Medium.ColdWater;
|
||||||
|
|
||||||
double Qtg;
|
double Qtg = TBF.UI.Procedures.Formulas.GetTargetQ(ptest, Qn, QpQiRatio, MetroClass, medium);
|
||||||
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 Qfrom = Qtg * ptest.CoefQfrom;
|
double Qfrom = Qtg * ptest.CoefQfrom;
|
||||||
double Qto = Qtg * ptest.CoefQto;
|
double Qto = Qtg * ptest.CoefQto;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user