From 3523283f22cc5610f01982ccf0607331b40b994f Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Wed, 3 May 2017 10:52:48 +0200 Subject: [PATCH] make engineering xml writing tests work --- .../XMLEngineeringJobInputDataProvider.cs | 44 +++----- .../OutputData/XML/AbstractXMLWriter.cs | 24 +--- .../OutputData/XML/XMLDeclarationWriter.cs | 96 ++++++++++------ .../OutputData/XML/XMLEngineeringWriter.cs | 105 +++++++++++++----- VectoCore/VectoCore/Resources/XMLNames.resx | 66 +++++++++++ .../XSD/VectoEngineeringDefinitions.0.7.xsd | 86 +++++++------- VectoCore/VectoCoreTest/XML/XMLWritingTest.cs | 8 +- 7 files changed, 271 insertions(+), 158 deletions(-) diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringJobInputDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringJobInputDataProvider.cs index 0de4146d14..863989dab0 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringJobInputDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringJobInputDataProvider.cs @@ -38,8 +38,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering public IList<ICycleData> Cycles { - get - { + get { var retVal = new List<ICycleData>(); var cycles = Navigator.Select(Helper.Query(XBasePath, XMLNames.VectoJob_MissionCycles, Helper.QueryConstraint(XMLNames.Missions_Cycle, XMLNames.ExtResource_Type_Attr, @@ -72,8 +71,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering public bool EngineOnlyMode { - get - { + get { return ElementExists(XMLNames.VectoJob_EngineOnlyMode) && XmlConvert.ToBoolean(GetElementValue(XMLNames.VectoJob_EngineOnlyMode)); } @@ -81,8 +79,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering protected internal Second DownshiftAfterUpshiftDelay { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, "DownshiftAfterUpshiftDelay")) @@ -94,8 +91,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering protected internal Second UpshiftAfterDownshiftDelay { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, "UpshiftAfterDownshiftDelay")) @@ -107,8 +103,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering protected internal MeterPerSquareSecond UpshiftMinAcceleration { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, "UpshiftMinAcceleration")) @@ -122,18 +117,16 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering public string JobName { - get - { + get { return InputData.JobInputData().EngineOnlyMode - ? InputData.EngineInputData.TechnicalReportId + ? InputData.EngineInputData.Model : InputData._vehicleInputData.GetVehicleID; } } public double TorqueReserve { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, XMLNames.DriverModel_ShiftStrategyParameters_TorqueReserve)) @@ -145,8 +138,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering public Second MinTimeBetweenGearshift { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, XMLNames.DriverModel_ShiftStrategyParameters_TimeBetweenGearshift)) @@ -158,8 +150,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering public MeterPerSecond StartSpeed { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, XMLNames.DriverModel_ShiftStrategyParameters_StartSpeed)) @@ -171,8 +162,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering public MeterPerSquareSecond StartAcceleration { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, XMLNames.DriverModel_ShiftStrategyParameters_StartAcceleration)) @@ -184,8 +174,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering public double StartTorqueReserve { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, XMLNames.DriverModel_ShiftStrategyParameters_StartTorqueReserve)) @@ -198,8 +187,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering public Second PowershiftShiftTime { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, "PowershiftShiftTime")) @@ -211,8 +199,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering public MeterPerSquareSecond CCUpshiftMinAcceleration { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, "CCUpshiftMinAcceleration")) @@ -224,8 +211,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering public MeterPerSquareSecond CLUpshiftMinAcceleration { - get - { + get { return ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters, "CLUpshiftMinAcceleration")) diff --git a/VectoCore/VectoCore/OutputData/XML/AbstractXMLWriter.cs b/VectoCore/VectoCore/OutputData/XML/AbstractXMLWriter.cs index 216a296f2e..9f84f91c41 100644 --- a/VectoCore/VectoCore/OutputData/XML/AbstractXMLWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/AbstractXMLWriter.cs @@ -20,7 +20,7 @@ namespace TUGraz.IVT.VectoXML.Writer protected XNamespace rootNamespace; protected XNamespace di; - private const string Creator = "TU Graz, IVT-EM XML Exporter"; + protected const string Creator = "TU Graz, IVT-EM XML Exporter"; protected readonly string Vendor; protected readonly string BasePath; @@ -34,28 +34,6 @@ namespace TUGraz.IVT.VectoXML.Writer di = "http://www.w3.org/2000/09/xmldsig#"; } - protected XElement[] GetDefaultComponentElements(string componentId, string makeAndModel) - { - return new[] { - new XElement(tns + XMLNames.Component_Manufacturer, string.Format("{0,-5}", Vendor)), - new XElement(tns + XMLNames.Component_Model, string.Format("{0,-10}", makeAndModel)), - new XElement(tns + XMLNames.Component_TechnicalReportId, string.Format("{0,-10}", componentId)), - new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)), - new XElement(tns + XMLNames.Component_AppVersion, "VectoCore"), - }; - } - - protected XElement[] GetDefaultComponentElements(string vin, string makeAndModel, string address) - { - return new[] { - new XElement(tns + XMLNames.Component_Manufacturer, String.Format("{0,-5}", Vendor)), - new XElement(tns + XMLNames.Component_ManufacturerAddress, address), - new XElement(tns + XMLNames.Component_Model, string.Format("{0,-10}", makeAndModel)), - new XElement(tns + XMLNames.Vehicle_VIN, string.Format("{0,-10}", vin)), - new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)), - }; - } - protected object[] EmbedDataTable(DataTable table, Dictionary<string, string> mapping, string tagName = "Entry", Dictionary<string, uint> precision = null) { diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs index 85ed7e47fa..725b98ead0 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Xml; using System.Xml.Linq; using DocumentFormat.OpenXml.Drawing.Diagrams; using TUGraz.IVT.VectoXML; @@ -98,20 +99,20 @@ namespace TUGraz.VectoCore.OutputData.XML return new XElement(tns + XMLNames.Component_Vehicle, new XAttribute(XMLNames.Component_ID_Attr, "VEH-" + vehicle.Model), GetDefaultComponentElements(vehicle.TechnicalReportId, vehicle.Model, "N.A."), - new XElement(tns + "LegislativeClass", "N3"), + new XElement(tns + XMLNames.Vehicle_LegislativeClass, "N3"), new XElement(tns + XMLNames.Vehicle_VehicleCategory, GetVehicleCategoryXML(vehicle.VehicleCategory)), new XElement(tns + XMLNames.Vehicle_AxleConfiguration, vehicle.AxleConfiguration.GetName()), new XElement(tns + XMLNames.Vehicle_CurbMassChassis, vehicle.CurbMassChassis.ToXMLFormat(0)), new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, vehicle.GrossVehicleMassRating.ToXMLFormat(0)), - new XElement(tns + "IdlingSpeed", data.EngineInputData.IdleSpeed.ToXMLFormat(0)), + new XElement(tns + XMLNames.Vehicle_IdlingSpeed, data.EngineInputData.IdleSpeed.ToXMLFormat(0)), new XElement(tns + XMLNames.Vehicle_RetarderType, GetRetarterTypeXML(retarder.Type)), retarder.Type.IsDedicatedComponent() ? new XElement(tns + XMLNames.Vehicle_RetarderRatio, retarder.Ratio.ToXMLFormat(3)) : null, new XElement(tns + XMLNames.Vehicle_AngledriveType, angledrive.Type.ToXMLFormat()), - new XElement(tns + "PTO", - new XElement(tns + "PTOShaftsGearWheels", "none"), - new XElement(tns + "PTOOtherElements", "none")), + new XElement(tns + XMLNames.Vehicle_PTO, + new XElement(tns + XMLNames.Vehicle_PTO_ShaftsGearWheels, "none"), + new XElement(tns + XMLNames.Vehicle_PTO_OtherElements, "none")), // ToDo: TorqueLimits new XElement(tns + XMLNames.Vehicle_Components, CreateEngine(data.EngineInputData), @@ -131,22 +132,22 @@ namespace TUGraz.VectoCore.OutputData.XML var id = string.Format("ENG-{0}", data.Model.RemoveWhitespace()); var fld = EngineFullLoadCurve.Create(data.FullLoadCurve, true); return new XElement(tns + XMLNames.Component_Engine, - new XAttribute("certificationNumber", string.Format("ENG-{0}", data.Model)), + new XAttribute(XMLNames.Component_CertificationNumber, string.Format("ENG-{0}", data.Model)), new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, id), GetDefaultComponentElements(string.Format("ENG-{0}", data.Model), data.Model), new XElement(tns + XMLNames.Engine_Displacement, (data.Displacement.Value() * 1000 * 1000).ToXMLFormat(0)), new XElement(tns + XMLNames.Engine_IdlingSpeed, data.IdleSpeed.AsRPM.ToXMLFormat(0)), - new XElement(tns + "RatedSpeed", fld.RatedSpeed.AsRPM.ToXMLFormat(0)), - new XElement(tns + "RatedPower", fld.FullLoadStationaryPower(fld.RatedSpeed).ToXMLFormat(0)), - new XElement(tns + "MaxEngineTorque", fld.MaxLoadTorque.ToXMLFormat(0)), + new XElement(tns + XMLNames.Engine_RatedSpeed, fld.RatedSpeed.AsRPM.ToXMLFormat(0)), + new XElement(tns + XMLNames.Engine_RatedPower, fld.FullLoadStationaryPower(fld.RatedSpeed).ToXMLFormat(0)), + new XElement(tns + XMLNames.Engine_MaxTorque, fld.MaxLoadTorque.ToXMLFormat(0)), new XElement(tns + XMLNames.Engine_WHTCUrban, data.WHTCUrban.ToXMLFormat(4)), new XElement(tns + XMLNames.Engine_WHTCRural, data.WHTCRural.ToXMLFormat(4)), new XElement(tns + XMLNames.Engine_WHTCMotorway, data.WHTCMotorway.ToXMLFormat(4)), new XElement(tns + XMLNames.Engine_ColdHotBalancingFactor, data.ColdHotBalancingFactor.ToXMLFormat(4)), - new XElement(tns + "CFRegPer", "1.0000"), - new XElement(tns + "CFNCV", "1.0000"), - new XElement(tns + "FuelType", "Diesel CI"), + new XElement(tns + XMLNames.Engine_CorrectionFactor_RegPer, "1.0000"), + new XElement(tns + XMLNames.Engine_CorrecionFactor_NCV, "1.0000"), + new XElement(tns + XMLNames.Engine_FuelType, "Diesel CI"), new XElement(tns + XMLNames.Engine_FuelConsumptionMap, EmbedDataTable(data.FuelConsumptionMap, AttributeMappings.FuelConsumptionMapMapping)), new XElement(tns + XMLNames.Engine_FullLoadAndDragCurve, @@ -177,12 +178,12 @@ namespace TUGraz.VectoCore.OutputData.XML } var id = string.Format("GBX-{0}", gbxData.Model.RemoveWhitespace()); return new XElement(tns + XMLNames.Component_Gearbox, - new XAttribute("certificationNumber", string.Format("GBX-{0}", gbxData.Model)), + new XAttribute(XMLNames.Component_CertificationNumber, string.Format("GBX-{0}", gbxData.Model)), new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, id), GetDefaultComponentElements(string.Format("GBX-{0}", gbxData.Model), gbxData.Model), new XElement(tns + XMLNames.Gearbox_TransmissionType, gbxData.Type.ToXMLFormat()), - new XElement(tns + "MainCertificationMethod", "Standard values"), + new XElement(tns + XMLNames.Component_Gearbox_CertificationMethod, "Standard values"), gears ), AddSignatureDummy(id), @@ -198,11 +199,11 @@ namespace TUGraz.VectoCore.OutputData.XML } var id = string.Format("TC-{0}", data.Model.RemoveWhitespace()); return new XElement(tns + XMLNames.Component_TorqueConverter, - new XAttribute("certificationNumber", id), + new XAttribute(XMLNames.Component_CertificationNumber, id), new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, id), GetDefaultComponentElements(data.TechnicalReportId, data.Model), - new XElement(tns + "CertificationMethod", "Standard values"), + new XElement(tns + XMLNames.Component_CertificationMethod, "Standard values"), new XElement(tns + XMLNames.TorqueConverter_Characteristics, EmbedDataTable(data.TCData, AttributeMappings.TorqueConverterDataMapping, precision: new Dictionary<string, uint>() { @@ -217,12 +218,12 @@ namespace TUGraz.VectoCore.OutputData.XML { var id = string.Format("ANGL-{0}", data.Model.RemoveWhitespace()); return new XElement(tns + XMLNames.Component_Angledrive, - new XAttribute("certificationNumber", "ANGL-" + data.Model), + new XAttribute(XMLNames.Component_CertificationNumber, "ANGL-" + data.Model), new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, id), GetDefaultComponentElements(data.TechnicalReportId, data.Model), new XElement(tns + XMLNames.AngleDrive_Ratio, data.Ratio.ToXMLFormat(3)), - new XElement(tns + "CertificationMethod", "Standard values"), + new XElement(tns + XMLNames.Component_CertificationMethod, "Standard values"), new XElement(tns + XMLNames.AngleDrive_TorqueLossMap, EmbedDataTable(data.LossMap, AttributeMappings.TransmissionLossmapMapping))), AddSignatureDummy(id)); @@ -232,11 +233,11 @@ namespace TUGraz.VectoCore.OutputData.XML { var id = string.Format("RET-{0}", data.Model.RemoveWhitespace()); return new XElement(tns + XMLNames.Component_Retarder, - new XAttribute("certificationNumber", "RET-none"), + new XAttribute(XMLNames.Component_CertificationNumber, "RET-none"), new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, id), GetDefaultComponentElements(data.TechnicalReportId, data.Model), - new XElement(tns + "CertificationMethod", "Standard values"), + new XElement(tns + XMLNames.Component_CertificationMethod, "Standard values"), new XElement(tns + XMLNames.Retarder_RetarderLossMap, EmbedDataTable(data.LossMap, AttributeMappings.RetarderLossmapMapping) ) @@ -249,13 +250,13 @@ namespace TUGraz.VectoCore.OutputData.XML { var typeId = string.Format("AXLGEAR-{0:0.000}", data.Ratio); return new XElement(tns + XMLNames.Component_Axlegear, - new XAttribute("certificationNumber", string.Format("AXL-{0}", data.Model)), + new XAttribute(XMLNames.Component_CertificationNumber, string.Format("AXL-{0}", data.Model)), new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, typeId), GetDefaultComponentElements(typeId, "N.A."), new XElement(tns + "LineType", "Single portal axle"), new XElement(tns + XMLNames.Axlegear_Ratio, data.Ratio.ToXMLFormat(3)), - new XElement(tns + "CertificationMethod", "Standard values"), + new XElement(tns + XMLNames.Component_CertificationMethod, "Standard values"), new XElement(tns + XMLNames.Axlegear_TorqueLossMap, EmbedDataTable(data.LossMap, AttributeMappings.TransmissionLossmapMapping))), AddSignatureDummy(typeId) @@ -274,7 +275,7 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement(tns + XMLNames.AxleWheels_Axles_Axle_AxleType_Attr, i == 1 ? AxleType.VehicleDriven.ToString() : AxleType.VehicleNonDriven.ToString()), new XElement(tns + XMLNames.AxleWheels_Axles_Axle_TwinTyres_Attr, axle.TwinTyres), - new XElement(tns + "Steered", i == 0), + new XElement(tns + XMLNames.AxleWheels_Axles_Axle_Steered, i == 0), CreateTyre(axle) )); } @@ -291,7 +292,7 @@ namespace TUGraz.VectoCore.OutputData.XML { var id = string.Format("TYRE-{0}", axle.Wheels).RemoveWhitespace().Replace("/", "_"); return new XElement(tns + "Tyre", - new XAttribute("certificationNumber", id), + new XAttribute(XMLNames.Component_CertificationNumber, id), new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, id), GetDefaultComponentElements(string.Format("TYRE-{0}", axle.Wheels), axle.Wheels), @@ -326,7 +327,7 @@ namespace TUGraz.VectoCore.OutputData.XML { var id = string.Format("Airdrag-{0}", data.Model); return new XElement(tns + XMLNames.Component_AirDrag, - new XAttribute("certificationNumber", string.Format("TYRE-{0}", data.Model)), + new XAttribute(XMLNames.Component_CertificationNumber, string.Format("AD-{0}", data.Model)), new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, id), GetDefaultComponentElements(data.Model, "N.A."), @@ -345,20 +346,43 @@ namespace TUGraz.VectoCore.OutputData.XML private XElement AddSignatureDummy(string id) { - return new XElement(tns + "Signature", - new XElement(di + "Reference", - new XAttribute("URI", "#" + id), - new XElement(di + "Transforms", - new XElement(di + "Transform", - new XAttribute("Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithoutComments")), - new XElement(di + "Transform", - new XAttribute("Algorithm", "urn:vecto:xml:2017:canonicalization")) + return new XElement(tns + XMLNames.DI_Signature, + new XElement(di + XMLNames.DI_Signature_Reference, + new XAttribute(XMLNames.DI_Signature_Reference_URI_Attr, "#" + id), + new XElement(di + XMLNames.DI_Signature_Reference_Transforms, + new XElement(di + XMLNames.DI_Signature_Reference_Transforms_Transform, + new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, + "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithoutComments")), + new XElement(di + XMLNames.DI_Signature_Reference_Transforms_Transform, + new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "urn:vecto:xml:2017:canonicalization")) ), - new XElement(di + "DigestMethod", - new XAttribute("Algorithm", "http://www.w3.org/2001/04/xmlenc#sha256")), - new XElement(di + "DigestValue", "") + new XElement(di + XMLNames.DI_Signature_Reference_DigestMethod, + new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "http://www.w3.org/2001/04/xmlenc#sha256")), + new XElement(di + XMLNames.DI_Signature_Reference_DigestValue, "") ) ); } + + protected XElement[] GetDefaultComponentElements(string componentId, string makeAndModel) + { + return new[] { + new XElement(tns + XMLNames.Component_Manufacturer, Vendor), + new XElement(tns + XMLNames.Component_Model, makeAndModel), + new XElement(tns + XMLNames.Component_TechnicalReportId, componentId), + new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)), + new XElement(tns + XMLNames.Component_AppVersion, "VectoCore"), + }; + } + + protected XElement[] GetDefaultComponentElements(string vin, string makeAndModel, string address) + { + return new[] { + new XElement(tns + XMLNames.Component_Manufacturer, Vendor), + new XElement(tns + XMLNames.Component_ManufacturerAddress, address), + new XElement(tns + XMLNames.Component_Model, makeAndModel), + new XElement(tns + XMLNames.Vehicle_VIN, vin), + new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)), + }; + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/XML/XMLEngineeringWriter.cs b/VectoCore/VectoCore/OutputData/XML/XMLEngineeringWriter.cs index 1c55475b19..e65e761ece 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLEngineeringWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLEngineeringWriter.cs @@ -3,12 +3,15 @@ using System.Collections.Generic; using System.Data; using System.IO; using System.Text.RegularExpressions; +using System.Xml; using System.Xml.Linq; using TUGraz.IVT.VectoXML; using TUGraz.IVT.VectoXML.Writer; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Resources; using TUGraz.VectoCore.Utils; @@ -182,7 +185,6 @@ namespace TUGraz.VectoCore.OutputData.XML var retarder = data.RetarderInputData; var gearbox = data.GearboxInputData; var vehicle = data.VehicleInputData; - var airdrag = data.AirdragInputData; var angledrive = data.AngledriveInputData; var pto = data.PTOTransmissionInputData; @@ -191,18 +193,18 @@ namespace TUGraz.VectoCore.OutputData.XML GetDefaultComponentElements(vehicle.TechnicalReportId, vehicle.Model), new XElement(tns + XMLNames.Vehicle_VehicleCategory, GetVehicleCategoryXML(vehicle.VehicleCategory)), new XElement(tns + XMLNames.Vehicle_AxleConfiguration, vehicle.AxleConfiguration.GetName()), - new XElement(tns + XMLNames.Vehicle_CurbWeightChassis, vehicle.CurbMassChassis.Value()), - new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, vehicle.GrossVehicleMassRating.Value()), - new XElement(tns + XMLNames.Vehicle_AirDragArea, airdrag.AirDragArea.Value()), + new XElement(tns + XMLNames.Vehicle_CurbMassChassis, vehicle.CurbMassChassis.Value().ToXMLFormat(0)), + new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, vehicle.GrossVehicleMassRating.Value().ToXMLFormat(0)), + //new XElement(tns + XMLNames.Vehicle_AirDragArea, airdrag.AirDragArea.Value()), new XElement(tns + XMLNames.Vehicle_RetarderType, GetRetarterTypeXML(retarder.Type)), - retarder.Type.IsDedicatedComponent() ? new XElement(tns + XMLNames.Vehicle_RetarderRatio, retarder.Ratio) : null, - new XElement(tns + XMLNames.Vehicle_AngledriveType, angledrive.Type), + retarder.Type.IsDedicatedComponent() + ? new XElement(tns + XMLNames.Vehicle_RetarderRatio, retarder.Ratio.ToXMLFormat(3)) + : null, + new XElement(tns + XMLNames.Vehicle_AngledriveType, angledrive.Type.ToXMLFormat()), new XElement(tns + XMLNames.Vehicle_PTOType, pto.PTOTransmissionType), GetPTOData(pto), - new XElement(tns + XMLNames.Vehicle_CurbWeightExtra, vehicle.CurbMassExtra.Value()), + new XElement(tns + XMLNames.Vehicle_CurbMassExtra, vehicle.CurbMassExtra.Value()), new XElement(tns + XMLNames.Vehicle_Loading, vehicle.Loading.Value()), - new XElement(tns + XMLNames.Vehicle_CrossWindCorrectionMode, GetCorrectionModeXML(airdrag.CrossWindCorrectionMode)), - GetCrossWindCorrectionData(airdrag), new XElement(tns + XMLNames.Vehicle_Components, CreateEngine(data.EngineInputData), CreateGearbox(gearbox, gearbox.TorqueConverter), @@ -210,7 +212,8 @@ namespace TUGraz.VectoCore.OutputData.XML retarder.Type.IsDedicatedComponent() ? CreateRetarder(retarder) : null, CreateAxlegear(data.AxleGearInputData), CreateAxleWheels(data.VehicleInputData), - CreateAuxiliaries(data.AuxiliaryInputData(), RemoveInvalidFileCharacters(data.VehicleInputData.Model)) + CreateAuxiliaries(data.AuxiliaryInputData(), RemoveInvalidFileCharacters(data.VehicleInputData.Model)), + CreateAirdrag(data.AirdragInputData) ), new XElement(tns + XMLNames.Vehicle_AdvancedDriverAssist, new XElement(tns + XMLNames.Vehicle_AdvancedDriverAssist_EngineStartStop, @@ -267,9 +270,10 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, "ANGL-" + data.Model), GetDefaultComponentElements(data.TechnicalReportId, data.Model), - new XElement(tns + XMLNames.AngleDrive_Ratio, data.Ratio), + new XElement(tns + XMLNames.AngleDrive_Ratio, data.Ratio.ToXMLFormat(3)), data.LossMap == null - ? new XElement(tns + XMLNames.AngleDrive_Efficiency, data.Efficiency) + ? new XElement(tns + XMLNames.AngleDrive_TorqueLossMap, + new XElement(tns + XMLNames.AngleDrive_Efficiency, data.Efficiency)) : new XElement(tns + XMLNames.AngleDrive_TorqueLossMap, GetTransmissionLossMap(data.LossMap)))); //if (_singleFile) { return angledrive; @@ -308,7 +312,9 @@ namespace TUGraz.VectoCore.OutputData.XML } var aux = new XElement(tns + XMLNames.Component_Auxiliaries, - new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, "AUX-none"), auxList)); + new XElement(tns + XMLNames.ComponentDataWrapper, + //new XAttribute(XMLNames.Component_ID_Attr, "AUX-none"), + auxList)); if (_singleFile) { return aux; } @@ -324,10 +330,11 @@ namespace TUGraz.VectoCore.OutputData.XML var axle = axleData[i]; axles.Add(new XElement(tns + XMLNames.AxleWheels_Axles_Axle, new XAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, i + 1), - new XAttribute(XMLNames.AxleWheels_Axles_Axle_TwinTyres_Attr, axle.TwinTyres), - new XAttribute(XMLNames.AxleWheels_Axles_Axle_AxleType_Attr, - i == 1 ? AxleType.VehicleDriven.ToString() : AxleType.VehicleNonDriven.ToString()), GetDefaultComponentElements(string.Format("WHEEL-{0}_{1}", i, axle.Wheels), axle.Wheels), + new XElement(tns + XMLNames.AxleWheels_Axles_Axle_AxleType, + i == 1 ? AxleType.VehicleDriven.ToString() : AxleType.VehicleNonDriven.ToString()), + new XElement(tns + XMLNames.AxleWheels_Axles_Axle_TwinTyres_Attr, axle.TwinTyres), + new XElement(tns + XMLNames.AxleWheels_Axles_Axle_Steered, i == 0), string.IsNullOrWhiteSpace(axle.Wheels) ? null : new XElement(tns + XMLNames.AxleWheels_Axles_Axle_Dimension, axle.Wheels), @@ -351,14 +358,32 @@ namespace TUGraz.VectoCore.OutputData.XML String.Format("AXLWHL-{0}.xml", data.AxleConfiguration.GetName())); } + //private XElement CreateTyre(IAxleDeclarationInputData axle) + //{ + // var id = string.Format("TYRE-{0}", axle.Wheels).RemoveWhitespace().Replace("/", "_"); + // return new XElement(tns + "Tyre", + // new XAttribute(XMLNames.Component_CertificationNumber, id), + // new XElement(tns + XMLNames.ComponentDataWrapper, + // GetDefaultComponentElements(string.Format("TYRE-{0}", axle.Wheels), axle.Wheels), + // string.IsNullOrWhiteSpace(axle.Wheels) + // ? null + // : new XElement(tns + XMLNames.AxleWheels_Axles_Axle_Dimension, axle.Wheels), + // new XElement(tns + XMLNames.AxleWheels_Axles_Axle_RRCISO, axle.RollResistanceCoefficient.ToXMLFormat(4)), + // new XElement(tns + XMLNames.AxleWheels_Axles_Axle_FzISO, axle.TyreTestLoad.Value().ToXMLFormat(0)) + // ) + // ); + //} + public XElement CreateAxlegear(IAxleGearInputData data) { var typeId = string.Format("AXLGEAR-{0:0.000}", data.Ratio); var axl = new XElement(tns + XMLNames.Component_Axlegear, new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, typeId), - GetDefaultComponentElements(typeId, "N.A."), new XElement(tns + XMLNames.Axlegear_Ratio, data.Ratio), + GetDefaultComponentElements(typeId, "N.A."), + new XElement(tns + XMLNames.Axlegear_Ratio, data.Ratio.ToXMLFormat(3)), data.LossMap == null - ? new XElement(tns + XMLNames.Axlegear_Efficiency, data.Efficiency) + ? new XElement(tns + XMLNames.Axlegear_TorqueLossMap, + new XElement(tns + XMLNames.Axlegear_Efficiency, data.Efficiency)) : new XElement(tns + XMLNames.Axlegear_TorqueLossMap, GetTransmissionLossMap(data.LossMap)))); if (_singleFile) { return axl; @@ -390,14 +415,15 @@ namespace TUGraz.VectoCore.OutputData.XML foreach (var gearData in data.Gears) { var gear = new XElement(tns + XMLNames.Gearbox_Gears_Gear, new XAttribute(XMLNames.Gearbox_Gear_GearNumber_Attr, i++), - new XElement(tns + XMLNames.Gearbox_Gear_Ratio, gearData.Ratio), + new XElement(tns + XMLNames.Gearbox_Gear_Ratio, gearData.Ratio.ToXMLFormat(3)), gearData.MaxTorque != null ? new XElement(tns + XMLNames.Gearbox_Gears_MaxTorque, gearData.MaxTorque.Value()) : null); if (gearData.LossMap != null) { gear.Add(new XElement(tns + XMLNames.Gearbox_Gear_TorqueLossMap, GetTransmissionLossMap(gearData.LossMap))); } else { - gear.Add(new XElement(tns + XMLNames.Gearbox_Gear_Efficiency, gearData.Efficiency)); + gear.Add(new XElement(tns + XMLNames.Gearbox_Gear_TorqueLossMap, + new XElement(tns + XMLNames.Gearbox_Gear_Efficiency, gearData.Efficiency))); } if (gearData.ShiftPolygon != null) { gear.Add(new XElement(tns + XMLNames.Gearbox_Gears_Gear_ShiftPolygon, CreateShiftPolygon(gearData.ShiftPolygon))); @@ -424,10 +450,15 @@ namespace TUGraz.VectoCore.OutputData.XML { var tc = new XElement(tns + XMLNames.Component_TorqueConverter, new XElement(tns + XMLNames.ComponentDataWrapper, - new XElement(tns + XMLNames.TorqueConverter_ReferenceRPM, torqueConverterData.ReferenceRPM.AsRPM), + new XAttribute(XMLNames.Component_ID_Attr, string.Format("TC-{0}", torqueConverterData.Model)), + GetDefaultComponentElements(string.Format("TC-{0}", torqueConverterData.Model), torqueConverterData.Model), + new XElement(tns + XMLNames.TorqueConverter_ReferenceRPM, torqueConverterData.ReferenceRPM.AsRPM.ToXMLFormat()), new XElement(tns + XMLNames.TorqueConverter_Characteristics, _singleFile - ? EmbedDataTable(torqueConverterData.TCData, AttributeMappings.TorqueConverterDataMapping) + ? EmbedDataTable(torqueConverterData.TCData, AttributeMappings.TorqueConverterDataMapping, + precision: new Dictionary<string, uint>() { + { TorqueConverterDataReader.Fields.SpeedRatio, 4 } + }) : ExtCSVResource(torqueConverterData.TCData, Path.GetFileName(torqueConverterData.TCData.Source))), new XElement(tns + XMLNames.TorqueConverter_Inertia, torqueConverterData.Inertia.Value()))); if (_singleFile) { @@ -459,10 +490,10 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, string.Format("ENG-{0}", data.Model)), GetDefaultComponentElements(string.Format("ENG-{0}", data.Model), data.Model), - new XElement(tns + XMLNames.Engine_Displacement, data.Displacement.Value() * 1000 * 1000), - new XElement(tns + XMLNames.Engine_IdlingSpeed, data.IdleSpeed.AsRPM), + new XElement(tns + XMLNames.Engine_Displacement, (data.Displacement.Value() * 1000 * 1000).ToXMLFormat(0)), + new XElement(tns + XMLNames.Engine_IdlingSpeed, data.IdleSpeed.AsRPM.ToXMLFormat(0)), new XElement(tns + XMLNames.Engine_Inertia, data.Inertia.Value()), - new XElement(tns + XMLNames.Engine_WHTCEngineering, data.WHTCEngineering), + new XElement(tns + XMLNames.Engine_WHTCEngineering, data.WHTCEngineering.ToXMLFormat(4)), new XElement(tns + XMLNames.Engine_FuelConsumptionMap, GetFuelConsumptionMap(data)), new XElement(tns + XMLNames.Engine_FullLoadAndDragCurve, GetFullLoadDragCurve(data)))); if (!allowSeparateFile || _singleFile) { @@ -471,6 +502,19 @@ namespace TUGraz.VectoCore.OutputData.XML return ExtComponent(XMLNames.Component_Engine, engine, string.Format("ENG-{0}.xml", data.Model)); } + private XElement CreateAirdrag(IAirdragEngineeringInputData data) + { + var id = string.Format("Airdrag-{0}", data.Model); + return new XElement(tns + XMLNames.Component_AirDrag, + new XElement(tns + XMLNames.ComponentDataWrapper, + new XAttribute(XMLNames.Component_ID_Attr, id), + GetDefaultComponentElements(data.Model, "N.A."), + new XElement(tns + XMLNames.Vehicle_CrossWindCorrectionMode, GetCorrectionModeXML(data.CrossWindCorrectionMode)), + new XElement(tns + XMLNames.Vehicle_AirDragArea, data.AirDragArea.Value().ToXMLFormat(2))), + GetCrossWindCorrectionData(data) + ); + } + private XElement ExtComponent(string component, XElement componentXML, string filename) { GenerateComponentDocument(componentXML).Save(Path.Combine(BasePath, filename)); @@ -511,5 +555,16 @@ namespace TUGraz.VectoCore.OutputData.XML new XAttribute(XMLNames.ExtResource_File_Attr, filename)) }; } + + protected XElement[] GetDefaultComponentElements(string componentId, string makeAndModel) + { + return new[] { + new XElement(tns + XMLNames.Component_Manufacturer, Vendor), + new XElement(tns + XMLNames.Component_Model, makeAndModel), + new XElement(tns + XMLNames.Component_Creator, Creator), + new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)), + new XElement(tns + XMLNames.Component_AppVersion, "VectoCore"), + }; + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Resources/XMLNames.resx b/VectoCore/VectoCore/Resources/XMLNames.resx index 8129ff050d..ad6df583b3 100644 --- a/VectoCore/VectoCore/Resources/XMLNames.resx +++ b/VectoCore/VectoCore/Resources/XMLNames.resx @@ -686,5 +686,71 @@ </data> <data name="Component_AppVersion" xml:space="preserve"> <value>AppVersion</value> + </data> + <data name="Component_CertificationMethod" xml:space="preserve"> + <value>CertificationMethod</value> + </data> + <data name="Component_Gearbox_CertificationMethod" xml:space="preserve"> + <value>MainCertificationMethod</value> + </data> + <data name="Engine_RatedSpeed" xml:space="preserve"> + <value>RatedSpeed</value> + </data> + <data name="Engine_RatedPower" xml:space="preserve"> + <value>RatedPower</value> + </data> + <data name="Engine_MaxTorque" xml:space="preserve"> + <value>MaxEngineTorque</value> + </data> + <data name="Engine_FuelType" xml:space="preserve"> + <value>FuelType</value> + </data> + <data name="Engine_CorrecionFactor_NCV" xml:space="preserve"> + <value>CFNCV</value> + </data> + <data name="Engine_CorrectionFactor_RegPer" xml:space="preserve"> + <value>CFRegPer</value> + </data> + <data name="Vehicle_PTO" xml:space="preserve"> + <value>PTO</value> + </data> + <data name="Vehicle_PTO_ShaftsGearWheels" xml:space="preserve"> + <value>PTOShaftsGearWheels</value> + </data> + <data name="Vehicle_PTO_OtherElements" xml:space="preserve"> + <value>PTOOtherElements</value> + </data> + <data name="Vehicle_IdlingSpeed" xml:space="preserve"> + <value>IdlingSpeed</value> + </data> + <data name="Vehicle_LegislativeClass" xml:space="preserve"> + <value>LegislativeClass</value> + </data> + <data name="DI_Signature" xml:space="preserve"> + <value>Signature</value> + </data> + <data name="DI_Signature_Reference" xml:space="preserve"> + <value>Reference</value> + </data> + <data name="DI_Signature_Reference_URI_Attr" xml:space="preserve"> + <value>URI</value> + </data> + <data name="DI_Signature_Reference_Transforms" xml:space="preserve"> + <value>Transforms</value> + </data> + <data name="DI_Signature_Reference_Transforms_Transform" xml:space="preserve"> + <value>Transform</value> + </data> + <data name="DI_Signature_Algorithm_Attr" xml:space="preserve"> + <value>Algorithm</value> + </data> + <data name="DI_Signature_Reference_DigestMethod" xml:space="preserve"> + <value>DigestMethod</value> + </data> + <data name="DI_Signature_Reference_DigestValue" xml:space="preserve"> + <value>DigestValue</value> + </data> + <data name="Component_ManufacturerAddress" xml:space="preserve"> + <value>ManufacturerAddress</value> </data> </root> \ No newline at end of file diff --git a/VectoCore/VectoCore/Resources/XSD/VectoEngineeringDefinitions.0.7.xsd b/VectoCore/VectoCore/Resources/XSD/VectoEngineeringDefinitions.0.7.xsd index 71af0f8f68..a97b44deb6 100644 --- a/VectoCore/VectoCore/Resources/XSD/VectoEngineeringDefinitions.0.7.xsd +++ b/VectoCore/VectoCore/Resources/XSD/VectoEngineeringDefinitions.0.7.xsd @@ -579,47 +579,51 @@ </xs:complexType> <xs:complexType name="TorqueConverterComponentEngineeringType"/> <xs:complexType name="TorqueConverterEngineeringDataType"> - <xs:sequence> - <xs:element name="ReferenceRPM" type="tns:TorqueConverterReferenceRPMType"> - <xs:annotation> - <xs:documentation>P092 - [1/min]</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Characteristics"> - <xs:complexType> - <xs:choice> - <xs:element name="Entry" type="vdecdef:TorqueConverterCharacteristicsEntryType" minOccurs="2" maxOccurs="unbounded"/> - <xs:element name="Resource" type="tns:ExtResourceEngineeringType"> - <xs:annotation> - <xs:documentation>P091</xs:documentation> - </xs:annotation> - </xs:element> - </xs:choice> - </xs:complexType> - </xs:element> - <xs:element name="Inertia" type="tns:TorqueConverterInertiaType"> - <xs:annotation> - <xs:documentation>P127 - [kgm²]</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ShiftPolygon" minOccurs="0"> - <xs:complexType> - <xs:choice> - <xs:element name="Entry" type="tns:ShiftPolygonEntryType" minOccurs="2" maxOccurs="unbounded"/> - <xs:element name="Resource" type="tns:ExtResourceEngineeringType"> - <xs:annotation> - <xs:documentation>P091</xs:documentation> - </xs:annotation> - </xs:element> - </xs:choice> - </xs:complexType> - </xs:element> - <xs:element name="MaxInputSpeed" type="tns:TorqueConverterMaxInputSpeedType" minOccurs="0"> - <xs:annotation> - <xs:documentation>P187 - [rpm]</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> + <xs:complexContent> + <xs:extension base="tns:EngineeringPowertrainComponentType"> + <xs:sequence> + <xs:element name="ReferenceRPM" type="tns:TorqueConverterReferenceRPMType"> + <xs:annotation> + <xs:documentation>P092 - [1/min]</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Characteristics"> + <xs:complexType> + <xs:choice> + <xs:element name="Entry" type="vdecdef:TorqueConverterCharacteristicsEntryType" minOccurs="2" maxOccurs="unbounded"/> + <xs:element name="Resource" type="tns:ExtResourceEngineeringType"> + <xs:annotation> + <xs:documentation>P091</xs:documentation> + </xs:annotation> + </xs:element> + </xs:choice> + </xs:complexType> + </xs:element> + <xs:element name="Inertia" type="tns:TorqueConverterInertiaType"> + <xs:annotation> + <xs:documentation>P127 - [kgm²]</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ShiftPolygon" minOccurs="0"> + <xs:complexType> + <xs:choice> + <xs:element name="Entry" type="tns:ShiftPolygonEntryType" minOccurs="2" maxOccurs="unbounded"/> + <xs:element name="Resource" type="tns:ExtResourceEngineeringType"> + <xs:annotation> + <xs:documentation>P091</xs:documentation> + </xs:annotation> + </xs:element> + </xs:choice> + </xs:complexType> + </xs:element> + <xs:element name="MaxInputSpeed" type="tns:TorqueConverterMaxInputSpeedType" minOccurs="0"> + <xs:annotation> + <xs:documentation>P187 - [rpm]</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:extension> + </xs:complexContent> </xs:complexType> <xs:complexType name="VectoComponentEngineeringType"> <xs:choice> diff --git a/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs b/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs index 7fae8803fa..e4f1700e34 100644 --- a/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs @@ -43,7 +43,7 @@ namespace TUGraz.VectoCore.Tests.XML var xml = new XMLEngineeringInputDataProvider(outFile, true); Assert.IsNotNull(xml); - Assert.AreEqual("ENG-175kW 6.8l Engine", xml.JobInputData().JobName); + Assert.AreEqual("175kW 6.8l Engine", xml.JobInputData().JobName); } [TestMethod] @@ -59,7 +59,7 @@ namespace TUGraz.VectoCore.Tests.XML var xml = new XMLEngineeringInputDataProvider(outFile, true); Assert.IsNotNull(xml); - Assert.AreEqual("VEH-N/A", xml.JobInputData().JobName); + Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName); } [TestMethod] @@ -75,7 +75,7 @@ namespace TUGraz.VectoCore.Tests.XML var xml = new XMLEngineeringInputDataProvider(outFile, true); Assert.IsNotNull(xml); - Assert.AreEqual("VEH-N/A", xml.JobInputData().JobName); + Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName); } [TestMethod] @@ -93,7 +93,7 @@ namespace TUGraz.VectoCore.Tests.XML var xml = new XMLEngineeringInputDataProvider(Path.Combine(outDir, outFile), true); Assert.IsNotNull(xml); - Assert.AreEqual("VEH-N/A", xml.JobInputData().JobName); + Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName); } [TestMethod] -- GitLab