Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 50c7e514 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

it compiles again after some refactoring

parent c74e28a4
Branches
Tags
No related merge requests found
Showing
with 496 additions and 321 deletions
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using System.Collections.Generic;
using TUGraz.VectoCore.Models.Simulation.Data;
namespace TUGraz.VectoCore.Models.SimulationComponent.Factories
namespace TUGraz.VectoCore.FileIO.Reader
{
//public interface ISimulationDataFactory
//{
// void SetJobFile(string fileName);
public interface ISimulationDataReader
{
void SetJobFile(string fileName);
IEnumerable<VectoRunData> NextRun();
// void SetJobJson(string jsonData, string basePath);
//}
}
//public interface IDataFileReader
//{
// VectoJobData ReadVectoJobFile(string fileName);
// VectoRunData ReadVectoJobFile(string fileName);
// VehicleData ReadVehicleDataFile(string fileName);
......
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.FileIO;
using TUGraz.VectoCore.FileIO.DeclarationFile;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
namespace TUGraz.VectoCore.FileIO.Reader.Impl
{
public abstract class AbstractSimulationRunCreator : InputFileReader
public abstract class AbstractSimulationDataReader : InputFileReader, ISimulationDataReader
{
//protected string JobBasePath = "";
......@@ -27,36 +23,21 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
protected VectoEngineFile Engine;
public void SetJobFile(string filename)
{
//JobBasePath = Path.GetDirectoryName(filenname) + Path.DirectorySeparatorChar;
//SetJobJson(File.ReadAllText(filenname));
ReadJobFile(filename);
ProcessJob((dynamic) Job);
ProcessJob(Job);
}
//public void SetJobJson(string file)
//{
// ReadJobFile(file);
// ProcessJob((dynamic) Job);
//}
public abstract IEnumerable<IVectoRun> NextRun();
public abstract IEnumerable<VectoRunData> NextRun();
protected void ProcessJob(VectoJobFile job)
protected virtual void ProcessJob(VectoJobFile job)
{
throw new VectoException("Invalid JobFile Format");
throw new VectoException("Invalid JobFile Container");
}
protected void ProcessJob(VectoJobFileV2Declaration job)
{
ReadVehicle(Path.Combine(job.BasePath, job.Body.VehicleFile));
ReadEngine(Path.Combine(job.BasePath, job.Body.EngineFile));
ReadGearbox(Path.Combine(job.BasePath, job.Body.GearboxFile));
}
// has to read the file string and create file-container
protected abstract void ReadJobFile(string file);
......@@ -68,22 +49,23 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
protected abstract void ReadGearbox(string file);
protected internal Segment GetVehicleClassification(VectoVehicleFile vehicle)
protected internal virtual Segment GetVehicleClassification(VectoVehicleFile vehicle)
{
throw new NotImplementedException("Vehicleclassification for base-class not possible!");
}
internal VehicleData CreateVehicleData(VectoVehicleFile vehicle, Mission segment, Kilogram loading)
internal virtual VehicleData CreateVehicleData(VectoVehicleFile vehicle, Mission segment, Kilogram loading)
{
throw new NotImplementedException("CreateVehicleData for base-class not possible!");
}
internal CombustionEngineData CreateEngineData(VectoEngineFile engine)
internal virtual CombustionEngineData CreateEngineData(VectoEngineFile engine)
{
throw new NotImplementedException("CreateEngineData for base-class not possible!");
}
internal GearboxData CreateGearboxData(VectoGearboxFile gearbox)
internal virtual GearboxData CreateGearboxData(VectoGearboxFile gearbox)
{
throw new NotImplementedException("CreateGearboxDataFromFile for base-class not possible!");
}
......@@ -116,23 +98,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
};
}
protected T1 SIConvert<T1>(double val) where T1 : SIBase<T1>
{
return val.SI<T1>();
}
internal CombustionEngineData SetCommonCombustionEngineData(EngineFileV2Declaration engine)
{
var data = ((dynamic) engine).Body;
var retVal = new CombustionEngineData() {
SavedInDeclarationMode = data.SavedInDeclarationMode,
ModelName = data.ModelName,
Displacement = SIConvert<>(data.Displacement * 0, 000001),
Displacement = SIConvert<CubicMeter>(data.Displacement * 0.000001), // convert vom ccm to m^3
IdleSpeed = DoubleExtensionMethods.RPMtoRad(data.IdleSpeed),
ConsumptionMap = FuelConsumptionMap.ReadFromFile(Path.Combine(engine.BasePath, data.FuelMap)),
WHTCUrban = data.WHTCUrban.SI(),
WHTCMotorway = data.WHTCMotorway.SI(),
WHTCRural = data.WHTCRural.SI(),
WHTCUrban = SIConvert<KilogramPerWattSecond>(data.WHTCUrban),
WHTCMotorway = SIConvert<KilogramPerWattSecond>(data.WHTCMotorway),
WHTCRural = SIConvert<KilogramPerWattSecond>(data.WHTCRural),
};
return retVal;
}
......@@ -145,5 +122,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
Type = (GearboxData.GearboxType) Enum.Parse(typeof (GearboxData.GearboxType), data.GearboxType, true),
};
}
protected T1 SIConvert<T1>(double val) where T1 : SIBase<T1>
{
return val.SI<T1>();
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.FileIO;
using TUGraz.VectoCore.FileIO.DeclarationFile;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
namespace TUGraz.VectoCore.FileIO.Reader.Impl
{
public class DeclarationModeSimulationComponentFactory : AbstractSimulationRunCreator
public class DeclarationModeSimulationDataReader : AbstractSimulationDataReader
{
public const int PoweredAxle = 1;
internal DeclarationModeSimulationComponentFactory() {}
internal DeclarationModeSimulationDataReader() {}
//public void SetJobFile(string fileName)
//{
......@@ -54,20 +50,41 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
}
}
public override IEnumerable<IVectoRun> NextRun()
public override IEnumerable<VectoRunData> NextRun()
{
var segment = GetVehicleClassification((dynamic) Vehicle);
foreach (var mission in segment.Missions) {
foreach (var loading in mission.Loadings) {
var jobData = new VectoJobData() {
var jobData = new VectoRunData() {
VehicleData = CreateVehicleData((dynamic) Vehicle, mission, loading),
EngineData = CreateEngineData((dynamic) Engine),
GearboxData = CreateGearboxData((dynamic) Gearbox),
// @@@ TODO: cycle
// @@@ TODO: auxiliaries
// @@@ TODO: ...
IsEngineOnly = false,
JobFileName = Job.JobFile,
};
//var builder = new SimulatorFactory.SimulatorBuilder();
yield return jobData;
//var builder = new SimulatorFactory.PowertrainBuilder();
}
}
throw new NotImplementedException();
//throw new NotImplementedException();
}
protected override void ProcessJob(VectoJobFile vectoJob)
{
var declaration = vectoJob as VectoJobFileV2Declaration;
if (declaration == null) {
return;
}
var job = declaration;
ReadVehicle(Path.Combine(job.BasePath, job.Body.VehicleFile));
ReadEngine(Path.Combine(job.BasePath, job.Body.EngineFile));
ReadGearbox(Path.Combine(job.BasePath, job.Body.GearboxFile));
}
protected override void ReadJobFile(string file)
......@@ -89,7 +106,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
protected override void ReadVehicle(string file)
{
var json = File.ReadAllText(Job.BasePath + file);
var json = File.ReadAllText(file);
var fileInfo = GetFileVersion(json);
CheckForDeclarationMode(fileInfo, "Vehicle");
......@@ -104,7 +121,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
protected override void ReadEngine(string file)
{
var json = File.ReadAllText(Job.BasePath + file);
var json = File.ReadAllText(file);
var fileInfo = GetFileVersion(json);
CheckForDeclarationMode(fileInfo, "Engine");
......@@ -119,7 +136,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
protected override void ReadGearbox(string file)
{
var json = File.ReadAllText(Job.BasePath + file);
var json = File.ReadAllText(file);
var fileInfo = GetFileVersion(json);
CheckForDeclarationMode(fileInfo, "Gearbox");
......
......@@ -2,17 +2,11 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices.WindowsRuntime;
using Common.Logging;
using Newtonsoft.Json;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.FileIO;
using TUGraz.VectoCore.FileIO.DeclarationFile;
using TUGraz.VectoCore.FileIO.EngineeringFile;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
......@@ -21,24 +15,39 @@ using TUGraz.VectoCore.Utils;
[assembly: InternalsVisibleTo("VectoCoreTest")]
namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
namespace TUGraz.VectoCore.FileIO.Reader.Impl
{
public class EngineeringModeSimulationComponentFactory : AbstractSimulationRunCreator
public class EngineeringModeSimulationDataReader : AbstractSimulationDataReader
{
internal EngineeringModeSimulationComponentFactory() {}
internal EngineeringModeSimulationDataReader() {}
protected static void CheckForEngineeringMode(VersionInfo info, string msg)
{
if (info.SavedInDeclarationMode) {
LogManager.GetLogger(typeof (EngineeringModeSimulationComponentFactory))
LogManager.GetLogger(typeof (EngineeringModeSimulationDataReader))
.WarnFormat("File was saved in Declaration Mode but is used for Engineering Mode!");
}
}
protected override void ProcessJob(VectoJobFile vectoJob)
{
var declaration = vectoJob as VectoJobFileV2Engineering;
if (declaration == null) {
throw new VectoException("Unhandled Job File Format");
}
var job = declaration;
ReadVehicle(Path.Combine(job.BasePath, job.Body.VehicleFile));
ReadEngine(Path.Combine(job.BasePath, job.Body.EngineFile));
ReadGearbox(Path.Combine(job.BasePath, job.Body.GearboxFile));
}
protected override void ReadVehicle(string file)
{
var json = File.ReadAllText(Job.BasePath + file);
var json = File.ReadAllText(file);
var fileInfo = GetFileVersion(json);
CheckForEngineeringMode(fileInfo, "Vehicle");
......@@ -52,9 +61,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
}
internal VectoJobData CreateVectoJobData(VectoJobFileV2Engineering data, string basePath)
internal VectoRunData CreateVectoJobData(VectoJobFileV2Engineering data, string basePath)
{
return new VectoJobData();
return new VectoRunData();
}
......@@ -80,7 +89,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
return retVal;
}
public override IEnumerable<IVectoRun> NextRun()
public override IEnumerable<VectoRunData> NextRun()
{
throw new NotImplementedException();
}
......@@ -89,19 +98,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Factories.Impl
public static VehicleData CreateVehicleDataFromFile(string file)
{
var data = DoReadVehicleFile(file);
return new EngineeringModeSimulationComponentFactory().CreateVehicleData((dynamic) data);
return new EngineeringModeSimulationDataReader().CreateVehicleData((dynamic) data);
}
public static CombustionEngineData CreateEngineDataFromFile(string file)
{
var data = DoReadEngineFile(file);
return new EngineeringModeSimulationComponentFactory().CreateEngineData((dynamic) data);
return new EngineeringModeSimulationDataReader().CreateEngineData((dynamic) data);
}
public static GearboxData CreateGearboxDataFromFile(string file)
{
var data = DoReadGearboxFile(file);
return new EngineeringModeSimulationComponentFactory().CreateGearboxData((dynamic) data);
return new EngineeringModeSimulationDataReader().CreateGearboxData((dynamic) data);
}
......
......@@ -6,6 +6,7 @@ namespace TUGraz.VectoCore.FileIO
public abstract class VectoJobFile
{
[DataMember] internal string BasePath;
[DataMember] internal string JobFile;
}
public abstract class VectoVehicleFile
......
......@@ -17,7 +17,7 @@ namespace TUGraz.VectoCore.Models.Declaration
{
public static string GetName(this AxleConfiguration self)
{
return self.ToString().Substring(10);
return self.ToString().Substring(11);
}
}
}
\ No newline at end of file
......@@ -13,8 +13,10 @@ namespace TUGraz.VectoCore.Models.Simulation.Cockpit
/// <returns></returns>
MeterPerSecond VehicleSpeed();
double VehicleMass();
Kilogram VehicleMass();
double VehicleLoading();
Kilogram VehicleLoading();
Kilogram TotalMass();
}
}
\ No newline at end of file
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.Simulation.Data
{
/// <summary>
......@@ -11,7 +13,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
/// <param name="data">The modal data.</param>
/// <param name="vehicleMass">The vehicle mass.</param>
/// <param name="vehicleLoading">The vehicle loading.</param>
void Write(IModalDataWriter data, double vehicleMass = 0, double vehicleLoading = 0);
void Write(IModalDataWriter data, Kilogram vehicleMass = null, Kilogram vehicleLoading = null);
/// <summary>
/// Writes the data to the sum file.
......
......@@ -102,8 +102,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
public void WriteFullPowertrain(IModalDataWriter data, string jobFileName, string jobName, string cycleFileName,
double vehicleMass,
double vehicleLoading)
Kilogram vehicleMass,
Kilogram vehicleLoading)
{
_engineOnly = false;
......@@ -141,8 +141,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
//}
//todo get data from vehicle file
row[MASS] = vehicleMass;
row[LOADING] = vehicleLoading;
row[MASS] = vehicleMass == null ? "" : vehicleMass.ToString();
row[LOADING] = vehicleLoading == null ? "" : vehicleLoading.ToString();
var dtValues = data.GetValues<double>(ModalResultField.simulationInterval).ToList();
var accValues = data.GetValues<double?>(ModalResultField.acc);
......@@ -247,7 +247,7 @@ public class SumWriterDecoratorFullPowertrain : SummaryFileWriter, ISummaryDataW
_cycleFileName = cycleFileName;
}
public void Write(IModalDataWriter data, double vehicleMass = 0, double vehicleLoading = 0)
public void Write(IModalDataWriter data, Kilogram vehicleMass = null, Kilogram vehicleLoading = null)
{
_writer.WriteFullPowertrain(data, _jobFileName, _jobName, _cycleFileName, vehicleMass, vehicleLoading);
}
......@@ -272,7 +272,7 @@ public class SumWriterDecoratorEngineOnly : SummaryFileWriter, ISummaryDataWrite
_cycleFileName = cycleFileName;
}
public void Write(IModalDataWriter data, double vehicleMass = 0, double vehicleLoading = 0)
public void Write(IModalDataWriter data, Kilogram vehicleMass = null, Kilogram vehicleLoading = null)
{
_writer.WriteEngineOnly(data, _jobFileName, _jobName, _cycleFileName);
}
......
......@@ -5,12 +5,14 @@ using System.IO;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.SimulationComponent;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Impl;
namespace TUGraz.VectoCore.Models.Simulation.Data
{
[DataContract]
public class VectoJobData : SimulationComponentData
public class VectoRunData : SimulationComponentData
{
public VehicleData VehicleData { get; internal set; }
......@@ -18,12 +20,14 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
public GearboxData GearboxData { get; internal set; }
public IList<string> Cycles { get; internal set; }
public DrivingCycleData Cycle { get; internal set; }
public IList<AuxData> Aux { get; internal set; }
public string AccelerationLimitingFile { get; internal set; }
public DriverData DriverData { get; internal set; }
public bool IsEngineOnly { get; internal set; }
//public StartStopData StartStop { get; internal set; }
......@@ -34,6 +38,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
public string JobFileName { get; set; }
public string BasePath { get; set; }
public class AuxData
{
......@@ -41,6 +47,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
public string Type;
public string Path;
public string Technology;
public AuxiliaryData Data;
}
public class StartStopData
......
using TUGraz.VectoCore.Models.Simulation.Cockpit;
using TUGraz.VectoCore.Models.Connector.Ports;
using TUGraz.VectoCore.Models.Simulation.Cockpit;
using TUGraz.VectoCore.Models.SimulationComponent;
namespace TUGraz.VectoCore.Models.Simulation
......@@ -9,6 +10,8 @@ namespace TUGraz.VectoCore.Models.Simulation
/// </summary>
public interface IVehicleContainer : ICockpit
{
IDrivingCycleOutPort GetCycleOutPort();
/// <summary>
/// Adds a component to the vehicle container.
/// </summary>
......
......@@ -31,10 +31,10 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
}
///// <summary>
///// Initializes a new instance of the <see cref="JobContainer"/> class from a VectoJobData object.
///// Initializes a new instance of the <see cref="JobContainer"/> class from a VectoRunData object.
///// </summary>
///// <param name="data">The data.</param>
//public JobContainer(VectoJobData data)
//public JobContainer(VectoRunData data)
//{
// var sumFileName = Path.GetFileNameWithoutExtension(data.JobFileName);
// var sumFilePath = Path.GetDirectoryName(data.JobFileName);
......@@ -44,10 +44,10 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
//}
///// <summary>
///// Creates and Adds jobs from the VectoJobData object.
///// Creates and Adds jobs from the VectoRunData object.
///// </summary>
///// <param name="data">The data.</param>
//public void AddRuns(VectoJobData data)
//public void AddRuns(VectoRunData data)
//{
// _jobNumber++;
//_runs.AddRange(SimulatorFactory.CreateRuns(data, _sumWriter, _jobNumber));
......
using System;
using System.Collections.Generic;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.SimulationComponent;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Impl;
namespace TUGraz.VectoCore.Models.Simulation.Impl
{
/// <summary>
/// Provides Methods to build a simulator with a powertrain step by step.
/// </summary>
public class PowertrainBuilder
{
private readonly bool _engineOnly;
private readonly VehicleContainer _container;
//private ICombustionEngine _engine;
//private IGearbox _gearBox;
//private IVehicle _vehicle;
//private IWheels _wheels;
//private IDriver _driver;
//private readonly Dictionary<string, AuxiliaryData> _auxDict = new Dictionary<string, AuxiliaryData>();
//private IPowerTrainComponent _retarder;
//private IClutch _clutch;
//private IPowerTrainComponent _axleGear;
public PowertrainBuilder(IModalDataWriter dataWriter, ISummaryDataWriter sumWriter, bool engineOnly)
{
_engineOnly = engineOnly;
_container = new VehicleContainer(dataWriter, sumWriter);
}
public VehicleContainer Build(VectoRunData data)
{
return _engineOnly ? BuildEngineOnly(data) : BuildFullPowertrain(data);
}
private VehicleContainer BuildFullPowertrain(VectoRunData data)
{
//throw new NotImplementedException("FullPowertrain is not fully implemented yet.");
//todo: make distinction between time based and distance based driving cycle!
var cycle = new TimeBasedDrivingCycle(_container, data.Cycle);
var axleGear = new AxleGear(data.GearboxData.AxleGearData);
var wheels = new Wheels(_container, data.VehicleData.DynamicTyreRadius);
var driver = new Driver(_container, data.DriverData);
var vehicle = new Vehicle(_container, data.VehicleData);
var gearBox = new Gearbox(_container, data.GearboxData);
var clutch = new Clutch(_container, data.EngineData);
var retarder = new Retarder(_container, data.VehicleData.Retarder.LossMap);
var engine = new CombustionEngine(_container, data.EngineData);
// connect cycle --> driver --> vehicle --> wheels --> axleGear --> gearBox --> retarder --> clutch
cycle.InShaft().Connect(driver.OutShaft());
driver.InShaft().Connect(vehicle.OutShaft());
vehicle.InPort().Connect(wheels.OutPort());
wheels.InShaft().Connect(axleGear.OutShaft());
axleGear.InShaft().Connect(gearBox.OutShaft());
gearBox.InShaft().Connect(retarder.OutShaft());
retarder.InShaft().Connect(clutch.OutShaft());
// connect directAux --> engine
IAuxiliary directAux = new DirectAuxiliary(_container, new AuxiliaryCycleDataAdapter(data.Cycle));
directAux.InShaft().Connect(engine.OutShaft());
// connect aux --> ... --> aux_XXX --> directAux
var previousAux = directAux;
foreach (var auxData in data.Aux) {
var auxCycleData = new AuxiliaryCycleDataAdapter(data.Cycle, auxData.ID);
IAuxiliary auxiliary = new MappingAuxiliary(_container, auxCycleData, auxData.Data);
auxiliary.InShaft().Connect(previousAux.OutShaft());
previousAux = auxiliary;
}
// connect clutch --> aux
clutch.InShaft().Connect(previousAux.OutShaft());
return _container;
}
private VehicleContainer BuildEngineOnly(VectoRunData data)
{
var cycle = new EngineOnlyDrivingCycle(_container, data.Cycle);
var engine = new CombustionEngine(_container, data.EngineData);
var gearBox = new EngineOnlyGearbox(_container);
IAuxiliary addAux = new DirectAuxiliary(_container, new AuxiliaryCycleDataAdapter(data.Cycle));
addAux.InShaft().Connect(engine.OutShaft());
gearBox.InShaft().Connect(addAux.OutShaft());
cycle.InShaft().Connect(gearBox.OutShaft());
return _container;
//var simulator = new VectoRun(_container, cycle);
//return simulator;
}
// public void AddCycle(string cycleFile) {}
// public void AddEngine(CombustionEngineData data)
// {
// _engine = new CombustionEngine(_container, data);
// AddClutch(data);
// }
// public void AddClutch(CombustionEngineData engineData)
// {
// _clutch = new Clutch(_container, engineData);
// }
public IGearbox AddGearbox(GearboxData gearboxData)
{
//_axleGear = new AxleGear(gearboxData.AxleGearData);
switch (gearboxData.Type) {
case GearboxData.GearboxType.MT:
return new Gearbox(_container, gearboxData);
case GearboxData.GearboxType.AMT:
return new Gearbox(_container, gearboxData);
/* case GearboxData.GearboxType.AT:
_dataWriter.HasTorqueConverter = gearboxData.HasTorqueConverter;
break;
*/
default:
throw new VectoException(String.Format("Gearboxtype {0} not implemented", gearboxData.Type));
}
}
// public void AddAuxiliary(string auxFileName, string auxID)
// {
// _auxDict[auxID] = AuxiliaryData.ReadFromFile(auxFileName);
// }
// public void AddDriver(VectoRunData.StartStopData startStop,
// VectoRunData.OverSpeedEcoRollData overSpeedEcoRoll,
// VectoRunData.LACData lookAheadCoasting, string accelerationLimitingFile)
// {
// if (_engineOnly) {
// return;
// }
// var driverData = new DriverData(startStop, overSpeedEcoRoll, lookAheadCoasting, accelerationLimitingFile);
// _driver = new Driver(driverData);
// }
// public void AddVehicle(VehicleData data)
// {
// if (_engineOnly) {
// return;
// }
// _vehicle = new Vehicle(_container, data);
// }
// public void AddRetarder(string retarderFile)
// {
// var retarderData = RetarderLossMap.ReadFromFile(retarderFile);
// _retarder = new Retarder(_container, retarderData);
// }
}
}
\ No newline at end of file
using System;
using System.IO;
using System.Collections.Generic;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.FileIO.Reader;
using TUGraz.VectoCore.FileIO.Reader.Impl;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.SimulationComponent;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Factories;
using TUGraz.VectoCore.Models.SimulationComponent.Impl;
namespace TUGraz.VectoCore.Models.Simulation.Impl
{
public class SimulatorFactory
{
private static IModalDataWriter _dataWriter;
//private IModalDataWriter _dataWriter;
/// <summary>
/// Creates a simulation run for time based engine only powertrain.
/// </summary>
public static IVectoRun CreateTimeBasedEngineOnlyRun(string engineFile, string cycleFile, string jobFileName,
string jobName, IModalDataWriter dataWriter, SummaryFileWriter sumWriter)
public enum FactoryMode
{
var sumWriterDecorator = new SumWriterDecoratorEngineOnly(sumWriter, jobFileName, jobName, cycleFile);
var builder = new SimulatorBuilder(dataWriter, sumWriterDecorator, engineOnly: true);
EngineeringMode,
DeclarationMode,
EngineOnlyMode,
};
// @@@TODO builder.AddEngine(engineFile);
private FactoryMode _mode;
return builder.Build(cycleFile);
}
/// <summary>
/// Creates powertrains and runs from a VectoJobData Object.
/// </summary>
/// <param name="data">The data.</param>
/// <param name="sumWriter">The sum writer.</param>
/// <param name="jobNumber">The job number.</param>
/// <returns></returns>
public static IEnumerable<IVectoRun> CreateRuns(VectoJobData data, SummaryFileWriter sumWriter, int jobNumber)
public SimulatorFactory(FactoryMode mode)
{
for (var i = 0; i < data.Cycles.Count; i++) {
var cycleFile = data.Cycles[i];
var jobName = string.Format("{0}-{1}", jobNumber, i);
var modFileName = string.Format("{0}_{1}.vmod", Path.GetFileNameWithoutExtension(data.JobFileName),
Path.GetFileNameWithoutExtension(cycleFile));
_dataWriter = new ModalDataWriter(modFileName, data.IsEngineOnly);
var sumWriterDecorator = DecorateSumWriter(data.IsEngineOnly, sumWriter, data.JobFileName, jobName, cycleFile);
var builder = new SimulatorBuilder(_dataWriter, sumWriterDecorator, data.IsEngineOnly);
builder.AddEngine(data.EngineData);
if (!data.IsEngineOnly) {
builder.AddVehicle(data.VehicleData);
builder.AddGearbox(data.GearboxData);
foreach (var aux in data.Aux) {
builder.AddAuxiliary(aux.Path, aux.ID);
}
// @@@ TODO builder.AddDriver(data.StartStop, data.OverSpeedEcoRoll, data.LookAheadCoasting, data.AccelerationLimitingFile);
}
yield return builder.Build(cycleFile);
JobNumber = 0;
_mode = mode;
switch (mode) {
case FactoryMode.DeclarationMode:
DataReader = new DeclarationModeSimulationDataReader();
break;
case FactoryMode.EngineeringMode:
DataReader = new EngineeringModeSimulationDataReader();
break;
case FactoryMode.EngineOnlyMode:
throw new NotImplementedException();
}
}
/// <summary>
/// Decorates the sum writer with a correct decorator (either EngineOnly or FullPowertrain).
/// </summary>
/// <param name="engineOnly">if set to <c>true</c> [engine only].</param>
/// <param name="sumWriter">The sum writer.</param>
/// <param name="jobFileName">Name of the job file.</param>
/// <param name="jobName">Name of the job.</param>
/// <param name="cycleFile">The cycle file.</param>
/// <returns></returns>
private static ISummaryDataWriter DecorateSumWriter(bool engineOnly, SummaryFileWriter sumWriter,
string jobFileName, string jobName, string cycleFile)
{
if (engineOnly) {
return new SumWriterDecoratorEngineOnly(sumWriter, jobFileName, jobName, cycleFile);
}
///// <summary>
///// Creates a simulation run for time based engine only powertrain.
///// </summary>
//public static IVectoRun CreateTimeBasedEngineOnlyRun(string engineFile, string cycleName, string jobFileName,
// string jobName, IModalDataWriter dataWriter, SummaryFileWriter sumWriter)
//{
// var sumWriterDecorator = new SumWriterDecoratorEngineOnly(sumWriter, jobFileName, jobName, cycleName);
// var builder = new PowertrainBuilder(dataWriter, sumWriterDecorator, engineOnly: true);
return new SumWriterDecoratorFullPowertrain(sumWriter, jobFileName, jobName, cycleFile);
}
// // @@@ TODO: builder.AddEngine(engineFile);
/// <summary>
/// Provides Methods to build a simulator with a powertrain step by step.
/// </summary>
public class SimulatorBuilder
{
private readonly bool _engineOnly;
private readonly VehicleContainer _container;
private ICombustionEngine _engine;
private IGearbox _gearBox;
private IVehicle _vehicle;
private IWheels _wheels;
private IDriver _driver;
private readonly Dictionary<string, AuxiliaryData> _auxDict = new Dictionary<string, AuxiliaryData>();
private IPowerTrainComponent _retarder;
private IClutch _clutch;
private IPowerTrainComponent _axleGear;
public SimulatorBuilder(IModalDataWriter dataWriter, ISummaryDataWriter sumWriter, bool engineOnly)
{
_engineOnly = engineOnly;
_container = new VehicleContainer(dataWriter, sumWriter);
}
public IVectoRun Build(string cycleFile)
{
return _engineOnly ? BuildEngineOnly(cycleFile) : BuildFullPowertrain(cycleFile);
}
// return builder.Build(cycleName);
//}
private IVectoRun BuildFullPowertrain(string cycleFile)
{
//throw new NotImplementedException("FullPowertrain is not fully implemented yet.");
var cycleData = DrivingCycleData.ReadFromFileEngineOnly(cycleFile);
//todo: make distinction between time based and distance based driving cycle!
var cycle = new TimeBasedDrivingCycle(_container, cycleData);
_axleGear = null;
_wheels = null;
// connect cycle --> driver --> vehicle --> wheels --> axleGear --> gearBox --> retarder --> clutch
cycle.InShaft().Connect(_driver.OutShaft());
_driver.InShaft().Connect(_vehicle.OutShaft());
_vehicle.InPort().Connect(_wheels.OutPort());
_wheels.InShaft().Connect(_axleGear.OutShaft());
_axleGear.InShaft().Connect(_gearBox.OutShaft());
_gearBox.InShaft().Connect(_retarder.OutShaft());
_retarder.InShaft().Connect(_clutch.OutShaft());
// connect directAux --> engine
IAuxiliary directAux = new DirectAuxiliary(_container, new AuxiliaryCycleDataAdapter(cycleData));
directAux.InShaft().Connect(_engine.OutShaft());
// connect aux --> ... --> aux_XXX --> directAux
var previousAux = directAux;
foreach (var auxData in _auxDict) {
var auxCycleData = new AuxiliaryCycleDataAdapter(cycleData, auxData.Key);
IAuxiliary auxiliary = new MappingAuxiliary(_container, auxCycleData, auxData.Value);
auxiliary.InShaft().Connect(previousAux.OutShaft());
previousAux = auxiliary;
}
public ISimulationDataReader DataReader { get; private set; }
// connect clutch --> aux
_clutch.InShaft().Connect(previousAux.OutShaft());
public SummaryFileWriter SumWriter { get; set; }
var simulator = new VectoRun(_container, cycle);
return simulator;
}
public int JobNumber { get; set; }
private IVectoRun BuildEngineOnly(string cycleFile)
/// <summary>
/// Creates powertrain and initializes it with the component's data.
/// </summary>
/// <returns>new VectoRun Instance</returns>
public IEnumerable<IVectoRun> NextRun()
{
var cycleData = DrivingCycleData.ReadFromFileEngineOnly(cycleFile);
var cycle = new EngineOnlyDrivingCycle(_container, cycleData);
var i = 0;
foreach (var data in DataReader.NextRun()) {
IModalDataWriter modWriter = null;
IAuxiliary addAux = new DirectAuxiliary(_container, new AuxiliaryCycleDataAdapter(cycleData));
addAux.InShaft().Connect(_engine.OutShaft());
if (_gearBox == null) {
_gearBox = new EngineOnlyGearbox(_container);
if (_mode != FactoryMode.DeclarationMode) {
var modFileName = "";
modWriter = new ModalDataWriter(modFileName, _mode == FactoryMode.EngineOnlyMode);
}
var jobName = string.Format("{0}-{1}", JobNumber, i++);
var sumWriterDecorator = DecorateSumWriter(data.IsEngineOnly, SumWriter, data.JobFileName, jobName, data.Cycle.Name);
var builder = new PowertrainBuilder(modWriter, sumWriterDecorator, data.IsEngineOnly);
_gearBox.InShaft().Connect(addAux.OutShaft());
cycle.InShaft().Connect(_gearBox.OutShaft());
var simulator = new VectoRun(_container, cycle);
return simulator;
yield return new VectoRun(builder.Build(data));
}
//_runCreator.SetJobFile(jobFile);
//foreach (var data in _runCreator.NextRun()) {
// //for (var i = 0; i < data.Cycles.Count; i++) {
// var cycleName = data.Cycle;
// var jobName = string.Format("{0}-{1}", jobNumber, i);
// var modFileName = string.Format("{0}_{1}.vmod", Path.GetFileNameWithoutExtension(data.JobFileName),
// Path.GetFileNameWithoutExtension(cycleName));
// _dataWriter = new ModalDataWriter(modFileName, data.IsEngineOnly);
public void AddCycle(string cycleFile) {}
public void AddEngine(CombustionEngineData data)
{
_engine = new CombustionEngine(_container, data);
// var sumWriterDecorator = DecorateSumWriter(data.IsEngineOnly, sumWriter, data.JobFileName, jobName, cycleName);
// var builder = new PowertrainBuilder(_dataWriter, sumWriterDecorator, data.IsEngineOnly);
AddClutch(data);
}
// builder.AddEngine(data.EngineData);
public void AddClutch(CombustionEngineData engineData)
{
_clutch = new Clutch(_container, engineData);
}
// if (!data.IsEngineOnly) {
// builder.AddVehicle(data.VehicleData);
// builder.AddGearbox(data.GearboxData);
public void AddGearbox(GearboxData gearboxData)
{
_axleGear = new AxleGear(gearboxData.AxleGearData);
// foreach (var aux in data.Aux) {
// builder.AddAuxiliary(aux.Path, aux.ID);
// }
switch (gearboxData.Type) {
case GearboxData.GearboxType.MT:
_gearBox = new Gearbox(_container, gearboxData);
break;
case GearboxData.GearboxType.AMT:
_gearBox = new Gearbox(_container, gearboxData);
break;
/* case GearboxData.GearboxType.AT:
_dataWriter.HasTorqueConverter = gearboxData.HasTorqueConverter;
break;
*/
default:
throw new VectoException(String.Format("Gearboxtype {0} not implemented", gearboxData.Type));
}
// // @@@ TODO builder.AddDriver(data.StartStop, data.OverSpeedEcoRoll, data.LookAheadCoasting, data.AccelerationLimitingFile);
// }
// yield return builder.Build(cycleName);
//}
}
public void AddAuxiliary(string auxFileName, string auxID)
{
_auxDict[auxID] = AuxiliaryData.ReadFromFile(auxFileName);
}
public void AddDriver(VectoJobData.StartStopData startStop,
VectoJobData.OverSpeedEcoRollData overSpeedEcoRoll,
VectoJobData.LACData lookAheadCoasting, string accelerationLimitingFile)
{
if (_engineOnly) {
return;
}
var driverData = new DriverData(startStop, overSpeedEcoRoll, lookAheadCoasting, accelerationLimitingFile);
_driver = new Driver(driverData);
}
public void AddVehicle(VehicleData data)
/// <summary>
/// Decorates the sum writer with a correct decorator (either EngineOnly or FullPowertrain).
/// </summary>
/// <param name="engineOnly">if set to <c>true</c> [engine only].</param>
/// <param name="sumWriter">The sum writer.</param>
/// <param name="jobFileName">Name of the job file.</param>
/// <param name="jobName">Name of the job.</param>
/// <param name="cycleName">The cycle file.</param>
/// <returns></returns>
private static ISummaryDataWriter DecorateSumWriter(bool engineOnly, SummaryFileWriter sumWriter,
string jobFileName, string jobName, string cycleName)
{
if (_engineOnly) {
return;
}
_vehicle = new Vehicle(_container, data);
if (engineOnly) {
return new SumWriterDecoratorEngineOnly(sumWriter, jobFileName, jobName, cycleName);
}
public void AddRetarder(string retarderFile)
{
var retarderData = RetarderLossMap.ReadFromFile(retarderFile);
_retarder = new Retarder(_container, retarderData);
}
return new SumWriterDecoratorFullPowertrain(sumWriter, jobFileName, jobName, cycleName);
}
}
}
\ No newline at end of file
......@@ -16,10 +16,10 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
private TimeSpan _absTime = new TimeSpan(seconds: 0, minutes: 0, hours: 0);
private TimeSpan _dt = new TimeSpan(seconds: 1, minutes: 0, hours: 0);
public VectoRun(IVehicleContainer container, IDrivingCycleOutPort cyclePort)
public VectoRun(IVehicleContainer container)
{
Container = container;
CyclePort = cyclePort;
CyclePort = container.GetCycleOutPort();
}
protected SummaryFileWriter SumWriter { get; set; }
......
......@@ -2,6 +2,7 @@
using System.Collections.ObjectModel;
using Common.Logging;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.Connector.Ports;
using TUGraz.VectoCore.Models.Simulation.Cockpit;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.SimulationComponent;
......@@ -15,10 +16,14 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
private IEngineCockpit _engine;
private IGearboxCockpit _gearbox;
private IVehicleCockpit _vehicle;
private ILog _logger;
private IDrivingCycleOutPort _cycle;
private ISummaryDataWriter _sumWriter;
private IModalDataWriter _dataWriter;
private ILog _logger;
#region IGearCockpit
public uint Gear()
......@@ -50,14 +55,19 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
return _vehicle != null ? _vehicle.VehicleSpeed() : 0.SI<MeterPerSecond>();
}
public double VehicleMass()
public Kilogram VehicleMass()
{
return _vehicle != null ? _vehicle.VehicleMass() : 0;
return _vehicle != null ? _vehicle.VehicleMass() : 0.SI<Kilogram>();
}
public double VehicleLoading()
public Kilogram VehicleLoading()
{
return _vehicle != null ? _vehicle.VehicleLoading() : 0;
return _vehicle != null ? _vehicle.VehicleLoading() : 0.SI<Kilogram>();
}
public Kilogram TotalMass()
{
return _vehicle != null ? _vehicle.TotalMass() : 0.SI<Kilogram>();
}
#endregion
......@@ -71,6 +81,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
#region IVehicleContainer
public IDrivingCycleOutPort GetCycleOutPort()
{
return _cycle;
}
public virtual void AddComponent(VectoSimulationComponent component)
{
_components.Add(component);
......@@ -89,6 +104,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
if (vehicle != null) {
_vehicle = vehicle;
}
var cycle = component as IDrivingCycleOutPort;
if (cycle != null) {
_cycle = cycle;
}
}
......
......@@ -41,17 +41,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
/// <summary>
/// [kg/Ws]
/// </summary>
public SI WHTCUrban { get; internal set; }
public KilogramPerWattSecond WHTCUrban { get; internal set; }
/// <summary>
/// [kg/Ws]
/// </summary>
public SI WHTCRural { get; internal set; }
public KilogramPerWattSecond WHTCRural { get; internal set; }
/// <summary>
/// [kg/Ws]
/// </summary>
public SI WHTCMotorway { get; internal set; }
public KilogramPerWattSecond WHTCMotorway { get; internal set; }
public FuelConsumptionMap ConsumptionMap { get; internal set; }
......@@ -76,6 +76,45 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
}
}
protected bool Equals(CombustionEngineData other)
{
return Equals(_fullLoadCurves, other._fullLoadCurves) && string.Equals(ModelName, other.ModelName) &&
Equals(Displacement, other.Displacement) && Equals(IdleSpeed, other.IdleSpeed) && Equals(Inertia, other.Inertia) &&
Equals(WHTCUrban, other.WHTCUrban) && Equals(WHTCRural, other.WHTCRural) &&
Equals(WHTCMotorway, other.WHTCMotorway) && Equals(ConsumptionMap, other.ConsumptionMap);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) {
return false;
}
if (ReferenceEquals(this, obj)) {
return true;
}
if (obj.GetType() != this.GetType()) {
return false;
}
return Equals((CombustionEngineData) obj);
}
public override int GetHashCode()
{
unchecked {
var hashCode = (_fullLoadCurves != null ? _fullLoadCurves.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (ModelName != null ? ModelName.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (Displacement != null ? Displacement.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (IdleSpeed != null ? IdleSpeed.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (Inertia != null ? Inertia.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (WHTCUrban != null ? WHTCUrban.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (WHTCRural != null ? WHTCRural.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (WHTCMotorway != null ? WHTCMotorway.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (ConsumptionMap != null ? ConsumptionMap.GetHashCode() : 0);
return hashCode;
}
}
public class RangeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
......
......@@ -5,9 +5,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
{
public class DriverData
{
public DriverData(VectoJobData.StartStopData startStop,
VectoJobData.OverSpeedEcoRollData overSpeedEcoRoll,
VectoJobData.LACData lookAheadCoasting, string accelerationLimitingFile)
public DriverData(VectoRunData.StartStopData startStop,
VectoRunData.OverSpeedEcoRollData overSpeedEcoRoll,
VectoRunData.LACData lookAheadCoasting, string accelerationLimitingFile)
{
throw new NotImplementedException();
}
......
......@@ -17,7 +17,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
DistanceBased
}
public List<DrivingCycleEntry> Entries { get; set; }
public List<DrivingCycleEntry> Entries { get; internal set; }
public string Name { get; internal set; }
public static DrivingCycleData ReadFromFileEngineOnly(string fileName)
{
......
......@@ -262,11 +262,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
protected bool Equals(FullLoadCurveEntry other)
{
Contract.Requires(other != null);
return EngineSpeed.Equals(other.EngineSpeed)
&& TorqueFullLoad.Equals(other.TorqueFullLoad)
&& TorqueDrag.Equals(other.TorqueDrag);
// && PT1.Equals(other.PT1);
return Equals(EngineSpeed, other.EngineSpeed) && Equals(TorqueFullLoad, other.TorqueFullLoad) &&
Equals(TorqueDrag, other.TorqueDrag);
}
public override bool Equals(object obj)
......@@ -277,17 +274,21 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
if (ReferenceEquals(this, obj)) {
return true;
}
return obj.GetType() == GetType() && Equals((FullLoadCurveEntry) obj);
if (obj.GetType() != this.GetType()) {
return false;
}
return Equals((FullLoadCurveEntry) obj);
}
public override int GetHashCode()
{
var hashCode = EngineSpeed.GetHashCode();
hashCode = (hashCode * 397) ^ TorqueFullLoad.GetHashCode();
hashCode = (hashCode * 397) ^ TorqueDrag.GetHashCode();
//hashCode = (hashCode * 397) ^ PT1.GetHashCode();
unchecked {
var hashCode = (EngineSpeed != null ? EngineSpeed.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (TorqueFullLoad != null ? TorqueFullLoad.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (TorqueDrag != null ? TorqueDrag.GetHashCode() : 0);
return hashCode;
}
}
#endregion
}
......@@ -296,7 +297,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
protected bool Equals(FullLoadCurve other)
{
return _fullLoadEntries.SequenceEqual(other._fullLoadEntries);
return Equals(_fullLoadEntries, other._fullLoadEntries) && Equals(_pt1Data, other._pt1Data);
}
public override bool Equals(object obj)
......@@ -307,12 +308,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
if (ReferenceEquals(this, obj)) {
return true;
}
return obj.GetType() == GetType() && Equals((FullLoadCurve) obj);
if (obj.GetType() != this.GetType()) {
return false;
}
return Equals((FullLoadCurve) obj);
}
public override int GetHashCode()
{
return (_fullLoadEntries != null ? _fullLoadEntries.GetHashCode() : 0);
unchecked {
return ((_fullLoadEntries != null ? _fullLoadEntries.GetHashCode() : 0) * 397) ^
(_pt1Data != null ? _pt1Data.GetHashCode() : 0);
}
}
#endregion
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment