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 baf227ee authored by Markus Quaritsch's avatar Markus Quaritsch Committed by Franz KOBER josef
Browse files

refactoring completed bus segmentation table reading, refactoring testcases

parent d55401db
No related branches found
No related tags found
No related merge requests found
...@@ -7,13 +7,14 @@ using System.ServiceModel.Description; ...@@ -7,13 +7,14 @@ using System.ServiceModel.Description;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.BusAuxiliaries;
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils; using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Utils; using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.Declaration namespace TUGraz.VectoCore.Models.Declaration
{ {
public sealed class CompletedBusSegments : LookupData<int , VehicleCode, string , Segment> public sealed class CompletedBusSegments : LookupData<int , VehicleCode, RegistrationClass, int, Meter, bool, Segment>
{ {
private const string COMPLETED_BUS_SEGMENTS_CSV = ".CompletedBusSegmentationTable.csv"; private const string COMPLETED_BUS_SEGMENTS_CSV = ".CompletedBusSegmentationTable.csv";
...@@ -37,35 +38,60 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -37,35 +38,60 @@ namespace TUGraz.VectoCore.Models.Declaration
_segmentTable = table.Copy(); _segmentTable = table.Copy();
} }
public override Segment Lookup(int numberOfAxles, VehicleCode vehicleCode, string vehicleParameterGroup) public override Segment Lookup(int numberOfAxles, VehicleCode vehicleCode, RegistrationClass registrationClass, int passengersLowerDeck, Meter bodyHeight, bool lowEntry)
{ {
return LookupCompletedBusVehicle(numberOfAxles, vehicleCode, vehicleParameterGroup); return LookupCompletedBusVehicle(numberOfAxles, vehicleCode, registrationClass, passengersLowerDeck, bodyHeight, lowEntry);
} }
#endregion #endregion
private Segment LookupCompletedBusVehicle(int numberOfAxles, VehicleCode vehicleCode, string vehicleParameterGroup) private Segment LookupCompletedBusVehicle(int numberOfAxles, VehicleCode vehicleCode, RegistrationClass registrationClass, int passengersLowerDeck, Meter bodyHeight, bool lowEntry)
{ {
var rows = _segmentTable.AsEnumerable().Where( var rows = _segmentTable.AsEnumerable().Where(
r => { r => {
var currentNumberOfAxles = r.Field<string>("numaxles").ToInt(0); var currentNumberOfAxles = r.Field<string>("numaxles").ToInt(0);
var currentVehicleCode = VehicleCodeHelper.Parse(r.Field<string>("vehiclecode")); var currentVehicleCode = VehicleCodeHelper.Parse(r.Field<string>("vehiclecode"));
var currentVehicleParam = r.Field<string>("vehicleparametergroup"); var registrationClasses = RegistrationClassHelper.Parse(r.Field<string>("registrationclasses"));
return currentNumberOfAxles == numberOfAxles return currentNumberOfAxles == numberOfAxles
&& currentVehicleCode == vehicleCode && currentVehicleCode == vehicleCode && registrationClasses.Contains(registrationClass);
&& currentVehicleParam == vehicleParameterGroup;
}).ToList(); }).ToList();
if (rows.Count == 0) { if (rows.Count == 0) {
return new Segment { Found = false }; return new Segment { Found = false };
} }
var segment = new Segment if (rows.Count > 1) {
{ if (rows.Any(r => r.Field<string>("passengerslowerdeck") != "-")) {
rows = rows.Where(
r => {
var limits = r.Field<string>("passengerslowerdeck").Split('-');
return passengersLowerDeck.IsBetween(limits[0].ToInt(), limits[1].ToInt());
}).ToList();
} else if (rows.Any(r => r.Field<string>("bodyheight") != "-")) {
rows = rows.Where(
r => {
var limits = r.Field<string>("bodyheight").Split('-');
return bodyHeight > limits[0].ToDouble().SI<Meter>() && bodyHeight <= limits[1].ToDouble().SI<Meter>();
}).ToList();
} else if (rows.All(r => r.Field<string>("lowentry") != "-")) {
rows = rows.Where(
r => {
var isLowEntry = r.Field<string>("lowentry") == "1";
return isLowEntry == lowEntry;
}).ToList();
} else {
throw new VectoException("Multiple segments found! {0}", rows.Count);
}
}
var row = rows.First();
var segment = new Segment {
Found = true, Found = true,
Missions = CreateMissions(rows) Missions = CreateMissions(rows),
VehicleClass = VehicleClassHelper.Parse("CB" + row.Field<string>("vehicleparametergroup")),
}; };
return segment; return segment;
...@@ -87,35 +113,21 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -87,35 +113,21 @@ namespace TUGraz.VectoCore.Models.Declaration
continue; continue;
} }
var lowEntry = row.Field<string>("lowentry"); var passengerDensity = row.ParseDouble(missionType.ToString()).SI<PerSquareMeter>();
var bodyHeight = row.Field<string>("bodyheight");
var passengersLowerDeck = row.Field<string>("passengerslowerdeck");
var vehicleCode = VehicleCodeHelper.Parse(row.Field<string>("vehiclecode"));
var vehicleParameterGroup = row.Field<string>("vehicleparametergroup");
var mission = new Mission { var mission = new Mission {
MissionType = missionType, MissionType = missionType,
MinLoad = null,
MaxLoad = null,
RefLoad = 100.SI<Kilogram>(), // dummy value to trigger simulation with ref load
LowLoad = 10.SI<Kilogram>(), // dummy value to trigger simulation with low load
AxleWeightDistribution = GetAxleWeightDistribution(row),
DefaultCDxA = row.ParseDouble("cdxastandard").SI<SquareMeter>(), DefaultCDxA = row.ParseDouble("cdxastandard").SI<SquareMeter>(),
AirDragMeasurement = row.ParseBoolean("airdragmeasurement"), AirDragMeasurement = row.ParseBoolean("airdragmeasurement"),
BusParameter = new BusParameters { BusParameter = new BusParameters {
NumberOfAxles = row.Field<string>("numaxles").ToInt(0), PassengerDensity = row.ParseDouble(missionType.ToString()).SI<PerSquareMeter>(),
IsArticulated = int.Parse(row.Field<string>("articulated")) != 0, VehicleEquipment = GetVehicleEquipment(row),
FloorType = GetFloorType(row.Field<string>("floortype")), AirDragMeasurementAllowed = row.Field<string>("airdragmeasurement") == "1"
VehicleCode = vehicleCode,
RegistrationClasses = RegistrationClassHelper.Parse(row.Field<string>("registrationclasses")),
LowEntry = lowEntry == "-" ? (bool?)null : int.Parse(lowEntry) != 0,
NumberPassengersLowerDeck = passengersLowerDeck == "-" ? 0 : row.ParseDouble("passengerslowerdeck"),
PassengersSeatsLowerOrEqual = GetPassengersLowerOrEqualValue(passengersLowerDeck, vehicleParameterGroup, vehicleCode),
BodyHeight = bodyHeight == "-" ? null : row.ParseDouble("bodyheight").SI<Meter>(),
BodyHeightLowerOrEqual = GetBodyHeightLowerOrEqualValue(bodyHeight, vehicleParameterGroup, vehicleCode),
VehicleParameterGroup = vehicleParameterGroup,
PassengersHeavyUrban = row.Field<string>("heavyurban") == string.Empty ? 0 : row.ParseDouble("heavyurban"),
PassengersUrban = row.Field<string>("urban") == string.Empty ? 0 : row.ParseDouble("urban"),
PassengersSuburban = row.Field<string>("suburban") == string.Empty ? 0 : row.ParseDouble("suburban"),
PassengersInterurban = row.Field<string>("interurban") == string.Empty ? 0 : row.ParseDouble("interurban"),
PassengersCoach = row.Field<string>("coach") == string.Empty ? 0 : row.ParseDouble("coach"),
AxleLoadDistribution = GetAxleLoadDistribution(row.Field<string>("axleloaddistribution")),
VehicleEquipment = GetVehicleEquipment(row)
} }
}; };
...@@ -126,6 +138,16 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -126,6 +138,16 @@ namespace TUGraz.VectoCore.Models.Declaration
return missions.ToArray(); return missions.ToArray();
} }
private double[] GetAxleWeightDistribution(DataRow row)
{
var axleDistribution = row.Field<string>("axleloaddistribution");
if (string.IsNullOrWhiteSpace(axleDistribution)) {
return new double[] { };
}
return axleDistribution.Split('/').ToDouble().Select(x => x / 100.0).ToArray();
}
private bool? GetPassengersLowerOrEqualValue(string numberOfPassengers, string vehicleParameterGroup, VehicleCode vehicleCode) private bool? GetPassengersLowerOrEqualValue(string numberOfPassengers, string vehicleParameterGroup, VehicleCode vehicleCode)
{ {
......
...@@ -139,4 +139,9 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -139,4 +139,9 @@ namespace TUGraz.VectoCore.Models.Declaration
{ {
public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4, TKey5 key5, TKey6 key6); public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4, TKey5 key5, TKey6 key6);
} }
public abstract class LookupData<TKey1, TKey2, TKey3, TKey4, TKey5, TKey6, TKey7, TValue> : LookupData where TValue : struct
{
public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4, TKey5 key5, TKey6 key6, TKey7 key7);
}
} }
...@@ -127,21 +127,19 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -127,21 +127,19 @@ namespace TUGraz.VectoCore.Models.Declaration
public VehicleClass BusGroup { get; internal set; } public VehicleClass BusGroup { get; internal set; }
//Completed Bus //Completed Bus
public int NumberOfAxles { get; internal set; } //public VehicleCode VehicleCode { get; internal set; }
public bool IsArticulated { get; internal set; }
public VehicleCode VehicleCode { get; internal set; } //public double PassengerDensity{ get; internal set; }
public RegistrationClass[] RegistrationClasses { get; internal set; } //public double PassengerDensityUrban { get; internal set; }
public bool? LowEntry { get; internal set; } //public double PassengersSuburban { get; internal set; }
public string VehicleParameterGroup { get; internal set; } //public double PassengersInterurban { get; internal set; }
public double PassengersHeavyUrban { get; internal set; } //public double PassengersCoach { get; internal set; }
public double PassengersUrban { get; internal set; }
public double PassengersSuburban { get; internal set; } //public bool? BodyHeightLowerOrEqual { get; internal set; }
public double PassengersInterurban { get; internal set; } //public bool? PassengersSeatsLowerOrEqual { get; internal set; }
public double PassengersCoach { get; internal set; }
public bool AirDragMeasurementAllowed { get; internal set; }
public bool? BodyHeightLowerOrEqual { get; internal set; }
public bool? PassengersSeatsLowerOrEqual { get; internal set; }
public AxleLoadDistribution AxleLoadDistribution { get; internal set; }
public VehicleEquipment VehicleEquipment { get; internal set; } public VehicleEquipment VehicleEquipment { get; internal set; }
} }
......
...@@ -85,7 +85,19 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -85,7 +85,19 @@ namespace TUGraz.VectoCore.Models.Declaration
ClassPB42, ClassPB42,
ClassPB43, ClassPB43,
ClassPB44, ClassPB44,
ClassPB45 ClassPB45,
ClassCB31a,
ClassCB31b,
ClassCB31c,
ClassCB31d,
ClassCB31e,
ClassCB32a,
ClassCB32b,
ClassCB32c,
ClassCB32d,
ClassCB32e,
ClassCB32f,
} }
public static class VehicleClassHelper public static class VehicleClassHelper
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment