From 4ab5527e54745332460dafe5784d4b0ba21c9d01 Mon Sep 17 00:00:00 2001
From: "VKMTHD\\franzjosefkober" <franz.josef.kober@ivt.tugraz.at>
Date: Wed, 15 Sep 2021 17:25:56 +0200
Subject: [PATCH] changed powertrain position handling

---
 .../VectoCommon/Models/PowertrainPosition.cs  |  45 +----
 .../XMLDeclarationVehicleDataProvider.cs      | 171 +++++++++++++-----
 ...ricMachinesDeclarationInputDataProvider.cs |   5 +-
 3 files changed, 133 insertions(+), 88 deletions(-)

diff --git a/VectoCommon/VectoCommon/Models/PowertrainPosition.cs b/VectoCommon/VectoCommon/Models/PowertrainPosition.cs
index 6634cbe8d8..cf25a4c8e7 100644
--- a/VectoCommon/VectoCommon/Models/PowertrainPosition.cs
+++ b/VectoCommon/VectoCommon/Models/PowertrainPosition.cs
@@ -25,13 +25,12 @@ namespace TUGraz.VectoCommon.InputData {
 		public const string HybridPrefix = "Hybrid";
 		public const string BatteryElectriPrefix = "BatteryElectric";
 
-		public static PowertrainPosition Parse(string pos, string schemaName)
-		{
-			return pos == nameof(PowertrainPosition.GEN) ? PowertrainPosition.GEN : Parse(GetPowertrainPositionType(pos, schemaName));
-		}
-
 		public static PowertrainPosition Parse(string pos)
 		{
+			if (pos.EndsWith(nameof(PowertrainPosition.GEN))) {
+				return PowertrainPosition.GEN;
+			}
+
 			if (pos.StartsWith("P",StringComparison.InvariantCultureIgnoreCase)) {
 				return (HybridPrefix + pos).Replace(".", "_").ParseEnum<PowertrainPosition>();
 			}
@@ -87,41 +86,5 @@ namespace TUGraz.VectoCommon.InputData {
 					return false;
 			}
 		}
-
-		private static string GetPowertrainPositionType(string pos, string schemaName)
-		{
-			switch (schemaName) {
-				case "Vehicle_HEV-Px_HeavyLorryDeclarationType":
-				case "Vehicle_HEV-Px_MediumLorryDeclarationType":
-				case "Vehicle_HEV-Px_PrimaryBusDeclarationType":
-				case "Components_HEV-Px_LorryType":
-				case "Components_HEV-Px_PrimaryBusType":
-					return $"P{pos}";
-				case "Vehicle_HEV-Sx_HeavyLorryDeclarationType":
-				case "Vehicle_HEV-Sx_MediumLorryDeclarationType":
-				case "Vehicle_HEV-Sx_PrimaryBusDeclarationType":
-				case "Vehicle_HEV-IEPC-S_HeavyLorryDeclarationType":
-				case "Vehicle_HEV-IEPC-S_MediumLorryDeclarationType":
-				case "Vehicle_HEV-IEPC-S_PrimaryBusDeclarationType":
-				case "Vehicle_PEV_HeavyLorryDeclarationType":
-				case "Vehicle_PEV_MediumLorryDeclarationType":
-				case "Vehicle_PEV_PrimaryBusDeclarationType":
-				case "Components_HEV-S2_LorryType":
-				case "Components_HEV-S3_LorryType":
-				case "Components_HEV-S4_LorryType":
-				case "Components_HEV-S2_PrimaryBusType":
-				case "Components_HEV-S3_PrimaryBusType":
-				case "Components_HEV-S4_PrimaryBusType":
-				case "Components_PEV-E2_LorryType":
-				case "Components_PEV-E3_LorryType":
-				case "Components_PEV-E4_LorryType":
-				case "Components_PEV-E2_PrimaryBusType":
-				case "Components_PEV-E3_PrimaryBusType":
-				case "Components_PEV-E4_PrimaryBusType":
-					return $"E{pos}";
-				default:
-					return null;
-			}
-		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
index f1b59dbac9..581ed04d6f 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
@@ -1153,63 +1153,43 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 	// ---------------------------------------------------------------------------------------
 
-	public class XMLDeclarationHEVPxHeavyLorryDataProviderV210 : XMLDeclarationVehicleDataProviderV20
+	public abstract class XMLVehicleDataProviderHelperV201 : XMLDeclarationVehicleDataProviderV20
 	{
-		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V210_JOBS;
-		public new const string XSD_TYPE = "Vehicle_HEV-Px_HeavyLorryDeclarationType";
-		public new static readonly string QUALIFIED_XSD_TYPE =
-			XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+		public virtual string PowertrainPositionPrefix => "P";
 
-		public XMLDeclarationHEVPxHeavyLorryDataProviderV210(
-			IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile)
+		protected XMLVehicleDataProviderHelperV201(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile) 
 			: base(jobData, xmlNode, sourceFile) { }
 
-		#region Overrides of XMLDeclarationVehicleDataProviderV20
-
-		public override TankSystem? TankSystem =>
-			ElementExists(XMLNames.Vehicle_NgTankSystem)
-				? EnumHelper.ParseEnum<TankSystem>(GetString(XMLNames.Vehicle_NgTankSystem))
-				: (TankSystem?)null;
-
-		#endregion
-
-
-		#region Overrides of XMLDeclarationVehicleDataProviderV10
-
-		public override IList<ITorqueLimitInputData> TorqueLimits =>
-			ElementExists(XMLNames.Vehicle_TorqueLimits) ? base.TorqueLimits : null;
-
-		public override Dictionary<PowertrainPosition,  List<Tuple<int, TableData>>> ElectricMotorTorqueLimits
+		
+		public override Dictionary<PowertrainPosition, List<Tuple<int, TableData>>> ElectricMotorTorqueLimits
 			=> ElementExists(XMLNames.ElectricMotorTorqueLimits) ? ReadElectricMotorTorqueLimits() : null;
-
+		
 		private Dictionary<PowertrainPosition, List<Tuple<int, TableData>>> ReadElectricMotorTorqueLimits()
 		{
 			var torqueLimitNodes = GetNodes(XMLNames.ElectricMotorTorqueLimits);
 			var motorTorqueLimits = new Dictionary<PowertrainPosition, List<Tuple<int, TableData>>>();
 
-			foreach (XmlNode torqueLimitNode in torqueLimitNodes) {
-
+			foreach (XmlNode torqueLimitNode in torqueLimitNodes)
+			{
 				var electricMachineNodes = GetNodes(XMLNames.ElectricMotorTorqueLimit_ElectricMachine, torqueLimitNode);
 				if (electricMachineNodes == null || electricMachineNodes.Count == 0)
 					return null;
-
 				
-				foreach (XmlNode electricMachineNode in electricMachineNodes) {
+				foreach (XmlNode electricMachineNode in electricMachineNodes)
+				{
 					var powertrainPosition =
-						PowertrainPositionHelper.Parse(
-							GetString(XMLNames.ElectricMachine_Position, electricMachineNode),
-							BaseNode.SchemaInfo.SchemaType.Name);
-					
-					if(!motorTorqueLimits.ContainsKey(powertrainPosition))
+						PowertrainPositionHelper.Parse(PowertrainPositionPrefix + GetString(XMLNames.ElectricMachine_Position, electricMachineNode));
+
+					if (!motorTorqueLimits.ContainsKey(powertrainPosition))
 						motorTorqueLimits.Add(powertrainPosition, new List<Tuple<int, TableData>>());
-					
-					var voltageLevelNodes = GetNodes( XMLNames.ElectricMachine_VoltageLevel, electricMachineNode);
-					foreach (XmlNode voltageLevelNode in voltageLevelNodes) {
+
+					var voltageLevelNodes = GetNodes(XMLNames.ElectricMachine_VoltageLevel, electricMachineNode);
+					foreach (XmlNode voltageLevelNode in voltageLevelNodes)
+					{
 						var voltageLevel = ReadVoltageLevelNode(voltageLevelNode);
 						motorTorqueLimits[powertrainPosition].Add(voltageLevel);
 					}
 				}
-
 			}
 
 			return motorTorqueLimits.IsNullOrEmpty() ? null : motorTorqueLimits;
@@ -1227,6 +1207,43 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			var maxTorqueCurve = XMLHelper.ReadTableData(mapping, entries);
 			return new Tuple<int, TableData>(voltage, maxTorqueCurve);
 		}
+	}
+
+
+	// ---------------------------------------------------------------------------------------
+
+	public class XMLDeclarationHEVPxHeavyLorryDataProviderV210 : XMLVehicleDataProviderHelperV201
+	{
+		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V210_JOBS;
+		public new const string XSD_TYPE = "Vehicle_HEV-Px_HeavyLorryDeclarationType";
+		public new static readonly string QUALIFIED_XSD_TYPE =
+			XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		#region Overrides of VehicleDataProviderHelper
+
+		public override string PowertrainPositionPrefix => "P";
+
+		#endregion
+		
+		public XMLDeclarationHEVPxHeavyLorryDataProviderV210(
+			IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile)
+			: base(jobData, xmlNode, sourceFile) { }
+
+		#region Overrides of XMLDeclarationVehicleDataProviderV20
+
+		public override TankSystem? TankSystem =>
+			ElementExists(XMLNames.Vehicle_NgTankSystem)
+				? EnumHelper.ParseEnum<TankSystem>(GetString(XMLNames.Vehicle_NgTankSystem))
+				: (TankSystem?)null;
+
+		#endregion
+
+
+		#region Overrides of XMLDeclarationVehicleDataProviderV10
+
+		public override IList<ITorqueLimitInputData> TorqueLimits =>
+			ElementExists(XMLNames.Vehicle_TorqueLimits) ? base.TorqueLimits : null;
+
 		
 		public override TableData MaxPropulsionTorque 
 			=> ElementExists(XMLNames.Vehicle_BoostingLimitation)
@@ -1252,6 +1269,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public XMLDeclarationHEVPxMediumLorryDataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile) 
 			: base(jobData, xmlNode, sourceFile) { }
 
+		#region Overrides of XMLDeclarationHEVPxHeavyLorryDataProviderV210
+
+		public override string PowertrainPositionPrefix => "P";
+
+		#endregion
+
 
 		#region Overrides of XMLDeclarationVehicleDataProviderV10
 
@@ -1268,7 +1291,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V210_JOBS;
 		public new const string XSD_TYPE = "Vehicle_HEV-Px_PrimaryBusDeclarationType";
 		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
-		
+
+		#region Overrides of XMLDeclarationHEVPxMediumLorryDataProviderV210
+
+		public override string PowertrainPositionPrefix => "P";
+
+		#endregion
+
 		public XMLDeclarationHEVPxPrimaryBusDataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile) 
 			: base(jobData, xmlNode, sourceFile) { }
 	}
@@ -1280,7 +1309,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V210_JOBS;
 		public new const string XSD_TYPE = "Vehicle_HEV-Sx_PrimaryBusDeclarationType";
 		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
-		
+
+		#region Overrides of XMLDeclarationHEVPxMediumLorryDataProviderV210
+
+		public override string PowertrainPositionPrefix => "E"; 
+
+		#endregion
+
 		public XMLDeclarationHEVSxPrimaryBusDataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile) 
 			: base(jobData, xmlNode, sourceFile) { }
 
@@ -1302,7 +1337,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public new const string XSD_TYPE = "Vehicle_HEV-Sx_HeavyLorryDeclarationType";
 		public new static readonly string QUALIFIED_XSD_TYPE =
 			XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
-		
+
+		#region Overrides of XMLDeclarationHEVPxHeavyLorryDataProviderV210
+
+		public override string PowertrainPositionPrefix => "E";
+
+		#endregion
+
 		public XMLDeclarationHEVSxHeavyLorryDataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile) 
 			: base(jobData, xmlNode, sourceFile) { }
 		
@@ -1327,7 +1368,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V210_JOBS;
 		public new const string XSD_TYPE = "Vehicle_HEV-Sx_MediumLorryDeclarationType";
 		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
-		
+
+		#region Overrides of XMLDeclarationHEVSxHeavyLorryDataProviderV210
+
+		public override string PowertrainPositionPrefix => "E";
+
+		#endregion
+
 		public XMLDeclarationHEVSxMediumLorryDataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile) 
 			: base(jobData, xmlNode, sourceFile) { }
 
@@ -1342,12 +1389,18 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 	// ---------------------------------------------------------------------------------------
 
-	public class XMLDeclarationHEVIEPCSHeavyLorryDataProviderV210 : XMLDeclarationVehicleDataProviderV20
+	public class XMLDeclarationHEVIEPCSHeavyLorryDataProviderV210 : XMLVehicleDataProviderHelperV201
 	{
 		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V210_JOBS;
 		public new const string XSD_TYPE = "Vehicle_HEV-IEPC-S_HeavyLorryDeclarationType";
 		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
-		
+
+		#region Overrides of VehicleDataProviderHelper
+
+		public override string PowertrainPositionPrefix => "E";
+
+		#endregion
+
 		public XMLDeclarationHEVIEPCSHeavyLorryDataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile) 
 			: base(jobData, xmlNode, sourceFile) { }
 
@@ -1380,6 +1433,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public new const string XSD_TYPE = "Vehicle_HEV-IEPC-S_MediumLorryDeclarationType";
 		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
 
+		#region Overrides of XMLDeclarationHEVIEPCSHeavyLorryDataProviderV210
+
+		public override string PowertrainPositionPrefix => "E";
+
+		#endregion
+
 		public XMLDeclarationHEVIEPCSMediumLorryDataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile)
 			: base(jobData, xmlNode, sourceFile) { }
 
@@ -1404,6 +1463,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public new const string XSD_TYPE = "Vehicle_HEV-IEPC-S_PrimaryBusDeclarationType";
 		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
 
+		#region Overrides of XMLDeclarationHEVIEPCSHeavyLorryDataProviderV210
+
+		public override string PowertrainPositionPrefix => "E";
+
+		#endregion
+
 		public XMLDeclarationHEVIEPCSPrimaryBusDataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile)
 			: base(jobData, xmlNode, sourceFile) { }
 
@@ -1425,6 +1490,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public new const string XSD_TYPE = "Vehicle_PEV_HeavyLorryDeclarationType";
 		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
 
+		#region Overrides of XMLDeclarationHEVPxHeavyLorryDataProviderV210
+
+		public override string PowertrainPositionPrefix => "E";
+
+		#endregion
 
 		public XMLDeclarationPEVHeavyLorryE2DataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile) 
 			: base(jobData, xmlNode, sourceFile) { }
@@ -1453,7 +1523,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V210_JOBS;
 		public new const string XSD_TYPE = "Vehicle_PEV_MediumLorryDeclarationType";
 		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
-		
+
+		#region Overrides of XMLDeclarationHEVPxHeavyLorryDataProviderV210
+
+		public override string PowertrainPositionPrefix => "E";
+
+		#endregion
+
 		public XMLDeclarationPEVMediumLorryExDataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile)
 			: base(jobData, xmlNode, sourceFile) { }
 		
@@ -1481,6 +1557,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V210_JOBS;
 		public new const string XSD_TYPE = "Vehicle_PEV_PrimaryBusDeclarationType";
 		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		#region Overrides of XMLDeclarationPEVMediumLorryExDataProviderV210
+
+		public override string PowertrainPositionPrefix => "E";
+
+		#endregion
+
 		public XMLDeclarationPEVPrimaryBusDataProviderV210(IXMLDeclarationJobInputData jobData, XmlNode xmlNode, string sourceFile) 
 			: base(jobData, xmlNode, sourceFile) { }
 
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricMachinesDeclarationInputDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricMachinesDeclarationInputDataProvider.cs
index 5733aea6d9..4a1e7c63a2 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricMachinesDeclarationInputDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricMachinesDeclarationInputDataProvider.cs
@@ -39,9 +39,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		private List<ElectricMachineEntry<IElectricMotorDeclarationInputData>> GetEntries()
 		{
 			var machineEntry = new ElectricMachineEntry<IElectricMotorDeclarationInputData> {
-				Position = PowertrainPositionHelper.Parse(
-					GetString(XMLNames.ElectricMachine_PowertrainPosition),
-					BaseNode.ParentNode.SchemaInfo.SchemaType.Name),
+				Position = PowertrainPositionHelper.Parse(((XMLVehicleDataProviderHelperV201)_vehicle).PowertrainPositionPrefix +
+							GetString(XMLNames.ElectricMachine_PowertrainPosition)),
 				Count = XmlConvert.ToInt32(GetString(XMLNames.ElectricMachine_Count)),
 				ElectricMachine = ElectricMachineSystemReader.CreateElectricMachineSystem(GetNode(XMLNames.ElectricMachineSystem)),
 			};
-- 
GitLab