From ed95a2486d399250aa967e2ec859b1e8c5980513 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Wed, 14 Sep 2016 08:40:50 +0200
Subject: [PATCH] validating input data using vecto 3 core

---
 VECTO/Input Files/Vehicle.vb | 187 ++++++++++++++++++++++++++++++++++-
 1 file changed, 184 insertions(+), 3 deletions(-)

diff --git a/VECTO/Input Files/Vehicle.vb b/VECTO/Input Files/Vehicle.vb
index e36d83fbb7..e282fd90d1 100644
--- a/VECTO/Input Files/Vehicle.vb	
+++ b/VECTO/Input Files/Vehicle.vb	
@@ -16,13 +16,19 @@ Imports System.IO
 Imports System.Linq
 Imports Newtonsoft.Json.Linq
 Imports TUGraz.VECTO.Input_Files
+Imports TUGraz.VectoCommon.InputData
 Imports TUGraz.VectoCommon.Models
 Imports TUGraz.VectoCommon.Utils
 Imports TUGraz.VectoCore.InputData.FileIO.JSON
+Imports TUGraz.VectoCore.InputData.Impl
+Imports TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 Imports TUGraz.VectoCore.Models.Declaration
+Imports TUGraz.VectoCore.Models.SimulationComponent.Data
+Imports TUGraz.VectoCore.Utils
 
 <CustomValidation(GetType(Vehicle), "ValidateVehicle")>
 Public Class Vehicle
+	Implements IVehicleEngineeringInputData, IVehicleDeclarationInputData
 	'V2 MassMax is now saved in [t] instead of [kg]
 	Private Const FormatVersion As Short = 7
 	Private _fileVersion As Integer
@@ -86,7 +92,32 @@ Public Class Vehicle
 
 
 	Public Shared Function ValidateVehicle(vehicle As Vehicle, validationContext As ValidationContext) As ValidationResult
-		Return New ValidationResult("bla")
+
+		Dim vehicleData As VehicleData
+
+		Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), ExecutionModeServiceContainer)
+		Dim mode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode)
+
+		Try
+			If mode = ExecutionMode.Declaration Then
+				Dim doa = New DeclarationDataAdapter()
+				Dim segment = DeclarationData.Segments.Lookup(vehicle.VehicleCategory, vehicle.AxleConfiguration,
+															vehicle.GrossVehicleMassRating, vehicle.CurbWeightChassis)
+				vehicleData = doa.CreateVehicleData(vehicle, segment.Missions.First(),
+													segment.Missions.First().Loadings.First().Value)
+			Else
+				Dim doa = New EngineeringDataAdapter()
+				vehicleData = doa.CreateVehicleData(vehicle)
+			End If
+
+			Dim result = vehicleData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering))
+
+			If Not result.Any() Then Return ValidationResult.Success
+
+			Return New ValidationResult("Vehicle Configuration is invalid", result.Select(Function(r) r.ErrorMessage).ToList())
+		Catch ex As Exception
+			Return New ValidationResult(ex.Message)
+		End Try
 	End Function
 
 	Private Sub SetDefault()
@@ -260,7 +291,9 @@ Public Class Vehicle
 		Dim validationResults = Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering))
 
 		If validationResults.Count > 0 Then
-			MsgBox(String.Format("Invalid input: \n{0}", String.Join("; ", validationResults)), MsgBoxStyle.OkOnly, "Failed to save vehicle")
+			Dim messages = validationResults.Select(Function(r) r.ErrorMessage + String.Join(", ", r.MemberNames.Distinct()))
+			MsgBox(String.Format("Invalid input: \n{0}", String.Join("; ", messages)), MsgBoxStyle.OkOnly,
+					"Failed to save vehicle")
 			Return False
 		End If
 
@@ -304,7 +337,11 @@ Public Class Vehicle
 				{"AxleWeightShare", axle.Share},
 				{"TwinTyres", axle.TwinTire},
 				{"RRCISO", axle.RRC},
-				{"FzISO", axle.FzISO}})}}}
+				{"FzISO", axle.FzISO}
+				}
+				)}
+				}
+				}
 				}
 
 		json.Content = JToken.FromObject(New Dictionary(Of String, Object) From {{"Header", header}, {"Body", body}})
@@ -329,5 +366,149 @@ Public Class Vehicle
 		End Set
 	End Property
 
+#End Region
+
+#Region "IInputData"
+
+	Public ReadOnly Property SavedInDeclarationMode As Boolean Implements IComponentInputData.SavedInDeclarationMode
+		Get
+			Return Cfg.DeclMode
+		End Get
+	End Property
+
+	Public ReadOnly Property Vendor As String Implements IComponentInputData.Vendor
+		Get
+			Return "N.A."  ' TODO: MQ  20160908
+		End Get
+	End Property
+
+	Public ReadOnly Property ModelName As String Implements IComponentInputData.ModelName
+		Get
+			Return "N.A."  ' Todo: MQ 20160908
+		End Get
+	End Property
+
+	Public ReadOnly Property Creator As String Implements IComponentInputData.Creator
+		Get
+			Return Lic.LicString
+		End Get
+	End Property
+
+	Public ReadOnly Property [Date] As String Implements IComponentInputData.[Date]
+		Get
+			Now.ToUniversalTime().ToString("o")
+		End Get
+	End Property
+
+	Public ReadOnly Property TypeId As String Implements IComponentInputData.TypeId
+		Get
+			Return "N.A."	' ToDo: MQ 20160908
+		End Get
+	End Property
+
+	Public ReadOnly Property DigestValue As String Implements IComponentInputData.DigestValue
+		Get
+			Return ""
+		End Get
+	End Property
+
+	Public ReadOnly Property IntegrityStatus As IntegrityStatus Implements IComponentInputData.IntegrityStatus
+		Get
+			Return IntegrityStatus.NotChecked
+		End Get
+	End Property
+
+	Public ReadOnly Property IVehicleDeclarationInputData_VehicleCategory As VehicleCategory _
+		Implements IVehicleDeclarationInputData.VehicleCategory
+		Get
+			Return VehicleCategory
+		End Get
+	End Property
+
+	Public ReadOnly Property IVehicleDeclarationInputData_AxleConfiguration As AxleConfiguration _
+		Implements IVehicleDeclarationInputData.AxleConfiguration
+		Get
+			Return AxleConfiguration
+		End Get
+	End Property
+
+	Public ReadOnly Property CurbWeightChassis As Kilogram Implements IVehicleDeclarationInputData.CurbWeightChassis
+		Get
+			Return MassExtra.SI(Of Kilogram)()
+		End Get
+	End Property
+
+	Public ReadOnly Property GrossVehicleMassRating As Kilogram _
+		Implements IVehicleDeclarationInputData.GrossVehicleMassRating
+		Get
+			Return MassMax.SI().Ton.Cast(Of Kilogram)()
+		End Get
+	End Property
+
+	Public ReadOnly Property AirDragArea As SquareMeter Implements IVehicleDeclarationInputData.AirDragArea
+		Get
+			Return CdA0.SI(Of SquareMeter)()
+		End Get
+	End Property
+
+	Public ReadOnly Property IVehicleEngineeringInputData_Axles As IList(Of IAxleEngineeringInputData) _
+		Implements IVehicleEngineeringInputData.Axles
+		Get
+			Return AxleWheels().Cast(Of IAxleEngineeringInputData)().ToList()
+		End Get
+	End Property
+
+	Public ReadOnly Property IVehicleDeclarationInputData_Axles As IList(Of IAxleDeclarationInputData) _
+		Implements IVehicleDeclarationInputData.Axles
+		Get
+			Return AxleWheels().Cast(Of IAxleDeclarationInputData)().ToList()
+		End Get
+	End Property
+
+	Private Function AxleWheels() As IEnumerable(Of AxleInputData)
+		Return Axles.Select(Function(axle) New AxleInputData With {
+								.Inertia = axle.Inertia.SI(Of KilogramSquareMeter)(),
+								.Wheels = axle.Wheels,
+								.AxleWeightShare = axle.Share,
+								.TwinTyres = axle.TwinTire,
+								.RollResistanceCoefficient = axle.RRC,
+								.TyreTestLoad = axle.FzISO.SI(Of Newton)()
+								})
+	End Function
+
+	Public ReadOnly Property CurbWeightExtra As Kilogram Implements IVehicleEngineeringInputData.CurbWeightExtra
+		Get
+			Return Mass.SI(Of Kilogram)()
+		End Get
+	End Property
+
+	Public ReadOnly Property CrosswindCorrectionMap As DataTable _
+		Implements IVehicleEngineeringInputData.CrosswindCorrectionMap
+		Get
+			Return VectoCSVFile.Read(CrossWindCorrectionFile.FullPath)
+		End Get
+	End Property
+
+	Public ReadOnly Property IVehicleEngineeringInputData_CrossWindCorrectionMode As CrossWindCorrectionMode _
+		Implements IVehicleEngineeringInputData.CrossWindCorrectionMode
+		Get
+			Return CrossWindCorrectionMode.DeclarationModeCorrection
+		End Get
+	End Property
+
+	Public ReadOnly Property IVehicleEngineeringInputData_DynamicTyreRadius As Meter _
+		Implements IVehicleEngineeringInputData.DynamicTyreRadius
+		Get
+			Return DynamicTyreRadius.SI().Milli.Meter.Cast(Of Meter)()
+		End Get
+	End Property
+
+	Public ReadOnly Property IVehicleEngineeringInputData_Loading As Kilogram _
+		Implements IVehicleEngineeringInputData.Loading
+		Get
+			Return Loading.SI(Of Kilogram)()
+		End Get
+	End Property
+
 #End Region
 End Class
\ No newline at end of file
-- 
GitLab