diff --git a/VectoCore/VectoCore/Models/Declaration/Payloads.cs b/VectoCore/VectoCore/Models/Declaration/Payloads.cs index 1203a2743e97da58e26745287bd0808b86a2d8b6..0eb13d39a771cbffd0a3bb723b517d3d3fada781 100644 --- a/VectoCore/VectoCore/Models/Declaration/Payloads.cs +++ b/VectoCore/VectoCore/Models/Declaration/Payloads.cs @@ -29,72 +29,72 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.Data; -using System.Linq; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Models.Declaration -{ - public sealed class Payloads : LookupData<Kilogram, Payloads.PayloadEntry> - { - protected override string ResourceId - { - get { return DeclarationData.DeclarationDataResourcePrefix + ".Payloads.csv"; } - } - - protected override string ErrorMessage - { - get { throw new InvalidOperationException("ErrorMessage not applicable."); } - } - - public Kilogram Lookup10Percent(Kilogram grossVehicleWeight) - { - var section = Data.GetSection(d => d.Key > grossVehicleWeight); - return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, - section.Item1.Value.Payload10Percent, section.Item2.Value.Payload10Percent, - grossVehicleWeight); - } - - public Kilogram Lookup50Percent(Kilogram grossVehicleWeight) - { - var section = Data.GetSection(d => d.Key > grossVehicleWeight); - return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, - section.Item1.Value.Payload50Percent, section.Item2.Value.Payload50Percent, - grossVehicleWeight); - } - - public Kilogram Lookup75Percent(Kilogram grossVehicleWeight) - { - var section = Data.GetSection(d => d.Key > grossVehicleWeight); - return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, - section.Item1.Value.Payload75Percent, section.Item2.Value.Payload75Percent, - grossVehicleWeight); - } - - public Kilogram LookupTrailer(Kilogram grossVehicleWeight, Kilogram curbWeight) - { - return 0.75 * (grossVehicleWeight - curbWeight); - } - - protected override void ParseData(DataTable table) - { - Data = table.Rows.Cast<DataRow>() - .ToDictionary( - kv => kv.ParseDouble("grossvehicleweight").SI<Kilogram>(), - kv => new PayloadEntry { - Payload10Percent = kv.ParseDouble("payload10%").SI<Kilogram>(), - Payload50Percent = kv.ParseDouble("payload50%").SI<Kilogram>(), - Payload75Percent = kv.ParseDouble("payload75%").SI<Kilogram>() - }); - } - - public sealed class PayloadEntry - { - public Kilogram Payload10Percent; - public Kilogram Payload50Percent; - public Kilogram Payload75Percent; - } - } +using System; +using System.Data; +using System.Linq; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public sealed class Payloads : LookupData<Kilogram, Payloads.PayloadEntry> + { + protected override string ResourceId + { + get { return DeclarationData.DeclarationDataResourcePrefix + ".Payloads.csv"; } + } + + protected override string ErrorMessage + { + get { throw new InvalidOperationException("ErrorMessage not applicable."); } + } + + public Kilogram Lookup10Percent(Kilogram grossVehicleWeight) + { + var section = Data.GetSection(d => d.Key > grossVehicleWeight); + return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, + section.Item1.Value.Payload10Percent, section.Item2.Value.Payload10Percent, + grossVehicleWeight); + } + + public Kilogram Lookup50Percent(Kilogram grossVehicleWeight) + { + var section = Data.GetSection(d => d.Key > grossVehicleWeight); + return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, + section.Item1.Value.Payload50Percent, section.Item2.Value.Payload50Percent, + grossVehicleWeight); + } + + public Kilogram Lookup75Percent(Kilogram grossVehicleWeight) + { + var section = Data.GetSection(d => d.Key > grossVehicleWeight); + return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, + section.Item1.Value.Payload75Percent, section.Item2.Value.Payload75Percent, + grossVehicleWeight); + } + + public Kilogram LookupTrailer(Kilogram grossVehicleWeight, Kilogram curbWeight) + { + return 0.75 * (grossVehicleWeight - curbWeight); + } + + protected override void ParseData(DataTable table) + { + Data = table.Rows.Cast<DataRow>() + .ToDictionary( + kv => kv.ParseDouble("grossvehicleweight").SI<Kilogram>(), + kv => new PayloadEntry { + Payload10Percent = kv.ParseDouble("payload10%").SI<Kilogram>(), + Payload50Percent = kv.ParseDouble("payload50%").SI<Kilogram>(), + Payload75Percent = kv.ParseDouble("payload75%").SI<Kilogram>() + }); + } + + public sealed class PayloadEntry + { + public Kilogram Payload10Percent; + public Kilogram Payload50Percent; + public Kilogram Payload75Percent; + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs index f070c9e29b1c41c2d2131dc48e2165dbcc551461..dcd94bade05daea51c1aa2b70af60de8bcbb4aad 100644 --- a/VectoCore/VectoCore/Models/Declaration/Segments.cs +++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs @@ -210,12 +210,13 @@ namespace TUGraz.VectoCore.Models.Declaration trailers.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0); var payloads = row.Field<string>(missionType.ToString()).Split('/'); + var vehicleWeight = curbWeight + body.CurbWeight; Kilogram refLoad, lowLoad = 0.SI<Kilogram>(); if (payloads.Length == 2) { - lowLoad = GetLoading(payloads[0], grossVehicleWeight, trailers, true); - refLoad = GetLoading(payloads[1], grossVehicleWeight, trailers, false); + lowLoad = GetLoading(payloads[0], grossVehicleWeight, vehicleWeight, trailers, true); + refLoad = GetLoading(payloads[1], grossVehicleWeight, vehicleWeight, trailers, false); } else { - refLoad = GetLoading(row.Field<string>(missionType.ToString()), grossVehicleWeight, trailers, false); + refLoad = GetLoading(row.Field<string>(missionType.ToString()), grossVehicleWeight, vehicleWeight, trailers, false); } refLoad = refLoad.LimitTo(0.SI<Kilogram>(), maxLoad); @@ -242,15 +243,17 @@ namespace TUGraz.VectoCore.Models.Declaration return missions.ToArray(); } - private static Kilogram GetLoading(string payloadStr, Kilogram grossVehicleWeight, + private static Kilogram GetLoading(string payloadStr, Kilogram grossVehicleWeight, Kilogram vehicleWeight, IEnumerable<MissionTrailer> trailers, bool lowLoading) { var refLoadValue = payloadStr.ToDouble(double.NaN); if (double.IsNaN(refLoadValue)) { - return DeclarationData.GetPayloadForGrossVehicleWeight(grossVehicleWeight, payloadStr) + - trailers.Sum( - t => DeclarationData.GetPayloadForTrailerWeight(t.TrailerGrossVehicleWeight, t.TrailerCurbWeight, lowLoading)) - .DefaultIfNull(0); + var vehiclePayload = DeclarationData.GetPayloadForGrossVehicleWeight(grossVehicleWeight, payloadStr) + .LimitTo(0.SI<Kilogram>(), grossVehicleWeight - vehicleWeight); + var trailerPayload = trailers.Sum( + t => DeclarationData.GetPayloadForTrailerWeight(t.TrailerGrossVehicleWeight, t.TrailerCurbWeight, lowLoading)) + .DefaultIfNull(0); + return vehiclePayload + trailerPayload; } return refLoadValue.SI<Kilogram>(); }