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
Select Git revision
  • 4c61541549ea600945392ebe15c35294436469cf
  • stable default
  • amdm3/develop
  • fix-h2-ice-bus
  • feat-fchv-bus
  • powertrains-multiple-axles
  • issue-1039
  • amdm3/main
  • test/nuget_publish
  • IEPC-experiments
  • amdm2/main
  • amdm2/develop
  • aptngearbox-not-auto
  • playground
  • official/main
  • official/develop
  • issue-templates
  • pdf-reports
  • HEV-timeruns-dev
  • timerun-empower-hybrids
  • timerun-pwheel-hybrids
  • Release/v5.0.3
  • Release/v5.0.1
  • Release/5.0.0-RC
  • Nuget/v0.11.4-DEV
  • Release/v0.11.4-DEV
  • Release/4.3.4-DEV
  • Release/4.3.3
  • Release/4.3.2-RC
  • Release/v4.3.0-DEV
  • Release/4.2.7
  • XMLConverterTool/4.2.6.0
  • Release/4.2.6-RC
  • Release/v4.2.5
  • Release/v4.2.3
  • Release/v4.2.2.3539-RC
  • Release/v4.2.1.3469
  • Release/v0.11.2.3456-DEV
  • Release/v4.2.0.3448-RC
  • Release/v4.1.3.3415
  • Release/v4.1.1.3413
41 results

VectoCoreTest.csproj

Blame
  • Forked from VECTO / VECTO Sim
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    VectoJobForm.vb 43.50 KiB
    ' Copyright 2014 European Union.
    ' Licensed under the EUPL (the 'Licence');
    '
    ' * You may not use this work except in compliance with the Licence.
    ' * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl
    ' * Unless required by applicable law or agreed to in writing,
    '   software distributed under the Licence is distributed on an "AS IS" basis,
    '   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    '
    ' See the LICENSE.txt for the specific language governing permissions and limitations.
    'Option Infer On
    
    Imports System.Collections.Generic
    Imports System.Drawing.Imaging
    Imports System.IO
    Imports System.Linq
    Imports System.Text.RegularExpressions
    Imports System.Windows.Forms.DataVisualization.Charting
    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.Reader
    Imports TUGraz.VectoCore.Models.Declaration
    Imports TUGraz.VectoCore.Models.SimulationComponent.Data
    Imports TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
    Imports TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
    
    ''' <summary>
    ''' Job Editor. Create/Edit VECTO job files (.vecto)
    ''' </summary>
    ''' <remarks></remarks>
    Public Class VectoJobForm
    	Public VectoFile As String
    	Private _changed As Boolean = False
    
    	Private _pgDriver As TabPage
    
    	Private _pgDriverOn As Boolean = True
    
    	Private _auxDialog As VehicleAuxiliariesDialog
    
    	'AA-TB
    	'Populate Advanced Auxiliaries
    	Private Sub PopulateAdvancedAuxiliaries()
    		'Scan the program directory for DLL's which are AdvancedAuxiliaries and display
    		Dim aList As Dictionary(Of String, AdvancedAuxiliary) = DiscoverAdvancedAuxiliaries()
    
    		cboAdvancedAuxiliaries.DataSource = aList.Select(Function(x) x.Value).ToList()
    		cboAdvancedAuxiliaries.DisplayMember = "AuxiliaryName"
    	End Sub
    
    
    	'Initialise form
    	Private Sub F02_GEN_Load(sender As Object, e As EventArgs) Handles Me.Load
    		Dim x As Integer
    
    		_auxDialog = New VehicleAuxiliariesDialog
    
    		_pgDriver = TabPgDriver
    
    		For x = 0 To TabControl1.TabCount - 1
    			TabControl1.TabPages(x).Show()
    		Next
    
    		LvAux.Columns(2).Width = -2
    
    		'Declaration Mode
    		If Cfg.DeclMode Then
    			LvAux.Columns(2).Text = "Technology"
    		Else
    			LvAux.Columns(2).Text = "Input File"
    		End If
    
    		CbEngOnly.Enabled = Not Cfg.DeclMode
    		GrCycles.Enabled = Not Cfg.DeclMode
    		GrVACC.Enabled = Not Cfg.DeclMode
    		PnStartStop.Enabled = Not Cfg.DeclMode
    		RdOff.Enabled = Not Cfg.DeclMode
    		GrLAC.Enabled = Not Cfg.DeclMode
    		ButAuxAdd.Enabled = Not Cfg.DeclMode
    		ButAuxRem.Enabled = Not Cfg.DeclMode
    		PnEcoRoll.Enabled = Not Cfg.DeclMode
    
    		_changed = False
    		'AA-TB
    		PopulateAdvancedAuxiliaries()
    
    		'Attempt to select that found in Config
    	End Sub
    
    	'Close - Check for unsaved changes
    	Private Sub F02_GEN_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    		If e.CloseReason <> CloseReason.ApplicationExitCall And e.CloseReason <> CloseReason.WindowsShutDown Then
    			e.Cancel = ChangeCheckCancel()
    		End If
    	End Sub
    
    	'Set generic values for Declaration mode
    	Private Sub DeclInit()
    
    		If Not Cfg.DeclMode Then Exit Sub
    
    		LvCycles.Items.Clear()
    		CbEngOnly.Checked = False
    		TbDesMaxFile.Text = ""
    		If Not RdEcoRoll.Checked Then RdOverspeed.Checked = True
    		CbLookAhead.Checked = True
    
    		TbSSspeed.Text = DeclarationData.Driver.StartStop.MaxSpeed.AsKmph.ToGUIFormat()	'cDeclaration.SSspeed
    		TbSStime.Text = DeclarationData.Driver.StartStop.MinTime.ToGUIFormat()	 'cDeclaration.SStime
    		TbSSdelay.Text = DeclarationData.Driver.StartStop.Delay.ToGUIFormat()	 ' cDeclaration.SSdelay
    		tbLacPreviewFactor.Text = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor.ToGUIFormat()
    		tbLacDfTargetSpeedFile.Text = ""
    		tbLacDfVelocityDropFile.Text = ""
    
    		TbOverspeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.OverSpeed.AsKmph.ToGUIFormat()	 'cDeclaration.Overspeed
    		TbUnderSpeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.UnderSpeed.AsKmph.ToGUIFormat() _
    		' cDeclaration.Underspeed
    		TbVmin.Text = DeclarationData.Driver.OverSpeedEcoRoll.MinSpeed.AsKmph.ToGUIFormat()	 'cDeclaration.ECvmin
    
    		If _
    			LvAux.Items.Count <> 5 OrElse
    			(LvAux.Items(0).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.Fan OrElse
    			LvAux.Items(1).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.SteeringPump OrElse
    			LvAux.Items(2).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.HeatingVentilationAirCondition OrElse
    			LvAux.Items(3).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.ElectricSystem OrElse
    			LvAux.Items(4).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.PneumaticSystem) Then
    			LvAux.Items.Clear()
    
    
    			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.Fan, DeclarationData.Fan))
    
    			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.SteeringPump, DeclarationData.SteeringPump))
    
    			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.HVAC, DeclarationData.HeatingVentilationAirConditioning))
    
    			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.ElectricSystem, DeclarationData.ElectricSystem))
    
    			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.PneumaticSystem, DeclarationData.PneumaticSystem))
    
    		End If
    	End Sub
    
    	Protected Function GetTechListForAux(type As AuxiliaryType, aux As IDeclarationAuxiliaryTable) _
    		As ListViewItem
    		Dim listViewItem As ListViewItem
    
    		listViewItem = New ListViewItem(type.Key())
    		listViewItem.SubItems.Add(type.Name())
    		Dim auxtech As String() = aux.GetTechnologies()
    		If auxtech.Count > 1 Then
    			listViewItem.SubItems.Add("")
    		Else
    			listViewItem.SubItems.Add(auxtech(0))
    		End If
    		Return listViewItem
    	End Function
    
    
    	'Show/Hide "Driver Assist" Tab
    	Private Sub SetDrivertab(onOff As Boolean)
    		If onOff Then
    			If Not _pgDriverOn Then
    				_pgDriverOn = True
    				TabControl1.TabPages.Insert(1, _pgDriver)
    			End If
    		Else
    			If _pgDriverOn Then
    				_pgDriverOn = False
    				TabControl1.Controls.Remove(_pgDriver)
    			End If
    		End If
    	End Sub
    
    
    #Region "Browse Buttons"
    
    	Private Sub ButtonVEH_Click(sender As Object, e As EventArgs) Handles ButtonVEH.Click
    		If VehicleFileBrowser.OpenDialog(FileRepl(TbVEH.Text, GetPath(VectoFile))) Then
    			TbVEH.Text = GetFilenameWithoutDirectory(VehicleFileBrowser.Files(0), GetPath(VectoFile))
    		End If
    	End Sub
    
    	Private Sub ButtonMAP_Click(sender As Object, e As EventArgs) Handles ButtonMAP.Click
    		If EngineFileBrowser.OpenDialog(FileRepl(TbENG.Text, GetPath(VectoFile))) Then
    			TbENG.Text = GetFilenameWithoutDirectory(EngineFileBrowser.Files(0), GetPath(VectoFile))
    		End If
    	End Sub
    
    	Private Sub ButtonGBX_Click(sender As Object, e As EventArgs) Handles ButtonGBX.Click
    		If GearboxFileBrowser.OpenDialog(FileRepl(TbGBX.Text, GetPath(VectoFile))) Then
    			TbGBX.Text = GetFilenameWithoutDirectory(GearboxFileBrowser.Files(0), GetPath(VectoFile))
    		End If
    	End Sub
    
    	Private Sub BtDesMaxBr_Click_1(sender As Object, e As EventArgs) Handles BtDesMaxBr.Click
    		If DriverAccelerationFileBrowser.OpenDialog(FileRepl(TbDesMaxFile.Text, GetPath(VectoFile))) Then
    			TbDesMaxFile.Text = GetFilenameWithoutDirectory(DriverAccelerationFileBrowser.Files(0), GetPath(VectoFile))
    		End If
    	End Sub
    
    	Private Sub BtAccOpen_Click(sender As Object, e As EventArgs) Handles BtAccOpen.Click
    		OpenFiles(FileRepl(TbDesMaxFile.Text, GetPath(VectoFile)))
    	End Sub
    
    #End Region
    
    #Region "Open Buttons"
    
    	'Open Vehicle Editor
    	Private Sub ButOpenVEH_Click(sender As Object, e As EventArgs) Handles ButOpenVEH.Click
    		Dim f As String
    		f = FileRepl(TbVEH.Text, GetPath(VectoFile))
    
    		'Thus Veh-file is returned
    		VehicleForm.JobDir = GetPath(VectoFile)
    		VehicleForm.AutoSendTo = True
    
    		If Not Trim(f) = "" Then
    			If Not File.Exists(f) Then
    				MsgBox("File not found!")
    				Exit Sub
    			End If
    		End If
    
    		If Not VehicleForm.Visible Then
    			VehicleForm.Show()
    		Else
    			If VehicleForm.WindowState = FormWindowState.Minimized Then VehicleForm.WindowState = FormWindowState.Normal
    			VehicleForm.BringToFront()
    		End If
    
    		If Not Trim(f) = "" Then
    			Try
    				VehicleForm.OpenVehicle(f)
    			Catch ex As Exception
    				MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Error loading Vehicle File")
    			End Try
    		End If
    	End Sub
    
    	'Open Engine Editor
    	Private Sub ButOpenENG_Click(sender As Object, e As EventArgs) Handles ButOpenENG.Click
    		Dim f As String
    		f = FileRepl(TbENG.Text, GetPath(VectoFile))
    
    		'Thus Veh-file is returned
    		EngineForm.JobDir = GetPath(VectoFile)
    		EngineForm.AutoSendTo = True
    
    		If Not Trim(f) = "" Then
    			If Not File.Exists(f) Then
    				MsgBox("File not found!")
    				Exit Sub
    			End If
    		End If
    
    		If Not EngineForm.Visible Then
    			EngineForm.Show()
    		Else
    			If EngineForm.WindowState = FormWindowState.Minimized Then EngineForm.WindowState = FormWindowState.Normal
    			EngineForm.BringToFront()
    		End If
    
    		If Not Trim(f) = "" Then EngineForm.OpenEngineFile(f)
    	End Sub
    
    	'Open Gearbox Editor
    	Private Sub ButOpenGBX_Click(sender As Object, e As EventArgs) Handles ButOpenGBX.Click
    		Dim f As String
    		f = FileRepl(TbGBX.Text, GetPath(VectoFile))
    
    		'Thus Veh-file is returned
    		GearboxForm.JobDir = GetPath(VectoFile)
    		GearboxForm.AutoSendTo = True
    
    		If Not Trim(f) = "" Then
    			If Not File.Exists(f) Then
    				MsgBox("File not found!")
    				Exit Sub
    			End If
    		End If
    
    		If Not GearboxForm.Visible Then
    			GearboxForm.Show()
    		Else
    			If GearboxForm.WindowState = FormWindowState.Minimized Then GearboxForm.WindowState = FormWindowState.Normal
    			GearboxForm.BringToFront()
    		End If
    
    		If Not Trim(f) = "" Then GearboxForm.OpenGbx(f)
    	End Sub
    
    #End Region
    
    #Region "Toolbar"
    
    	'New
    	Private Sub ToolStripBtNew_Click(sender As Object, e As EventArgs) Handles ToolStripBtNew.Click
    		VectoNew()
    	End Sub
    
    	'Open
    	Private Sub ToolStripBtOpen_Click(sender As Object, e As EventArgs) Handles ToolStripBtOpen.Click
    		If JobfileFileBrowser.OpenDialog(VectoFile, False, "vecto") Then VECTOload2Form(JobfileFileBrowser.Files(0))
    	End Sub
    
    	'Save
    	Private Sub ToolStripBtSave_Click(sender As Object, e As EventArgs) Handles ToolStripBtSave.Click
    		Save()
    	End Sub
    
    	'Save As
    	Private Sub ToolStripBtSaveAs_Click(sender As Object, e As EventArgs) Handles ToolStripBtSaveAs.Click
    		If JobfileFileBrowser.SaveDialog(VectoFile) Then Call VECTOsave(JobfileFileBrowser.Files(0))
    	End Sub
    
    	'Send to Job file list in main form
    	Private Sub ToolStripBtSendTo_Click(sender As Object, e As EventArgs) Handles ToolStripBtSendTo.Click
    		If ChangeCheckCancel() Then Exit Sub
    		If VectoFile = "" Then
    			MsgBox("File not found!" & ChrW(10) & ChrW(10) & "Save file and try again.")
    		Else
    			MainForm.AddToJobListView(VectoFile)
    		End If
    	End Sub
    
    	'Help
    	Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
    		If File.Exists(MyAppPath & "User Manual\help.html") Then
    			Dim browserRegistryString As String =
    					My.Computer.Registry.ClassesRoot.OpenSubKey("\http\shell\open\command\").GetValue("").ToString
    			Dim defaultBrowserPath As String =
    					Regex.Match(browserRegistryString, "(\"".*?\"")").Captures(0).ToString
    			Process.Start(defaultBrowserPath,
    						String.Format("""{0}{1}""", MyAppPath, "User Manual\help.html#job-editor"))
    		Else
    			MsgBox("User Manual not found!", MsgBoxStyle.Critical)
    		End If
    	End Sub
    
    
    #End Region
    
    	'Save ("Save" or "Save As" when new file)
    	Private Function Save() As Boolean
    		If VectoFile = "" Then
    			If JobfileFileBrowser.SaveDialog("") Then
    				VectoFile = JobfileFileBrowser.Files(0)
    			Else
    				Return False
    			End If
    		End If
    		Try
    			Return VECTOsave(VectoFile)
    		Catch ex As Exception
    			MsgBox("Error when saving file" + Environment.NewLine + ex.Message)
    			Return False
    		End Try
    	End Function
    
    	'Open file
    	Public Sub VECTOload2Form(file As String)
    
    		If ChangeCheckCancel() Then Exit Sub
    
    		VectoNew()
    
    		'Read GEN
    		Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(file), 
    																IEngineeringInputDataProvider)
    		Dim vectoJob As IEngineeringJobInputData = inputData.JobInputData()
    
    		If Cfg.DeclMode <> vectoJob.SavedInDeclarationMode Then
    			Select Case WrongMode()
    				Case 1
    					Close()
    					MainForm.RbDecl.Checked = Not MainForm.RbDecl.Checked
    					MainForm.OpenVectoFile(file)
    				Case -1
    					Exit Sub
    			End Select
    		End If
    
    		VectoFile = file
    		_basePath = Path.GetDirectoryName(file)
    		'Update Form
    
    		'Files -----------------------------
    		TbVEH.Text = GetRelativePath(inputData.VehicleInputData.Source, _basePath)
    		TbENG.Text = GetRelativePath(inputData.EngineInputData.Source, _basePath)
    		TbGBX.Text = GetRelativePath(inputData.GearboxInputData.Source, _basePath)
    
    		'Start/Stop
    		Dim driver As IDriverEngineeringInputData = inputData.DriverInputData
    		ChBStartStop.Checked = driver.StartStop.Enabled
    		TbSSspeed.Text = driver.StartStop.MaxSpeed.AsKmph.ToGUIFormat()
    		TbSStime.Text = driver.StartStop.MinTime.ToGUIFormat()
    		TbSSdelay.Text = driver.StartStop.Delay.ToGUIFormat()
    
    		If (Cfg.DeclMode) Then
    			TbDesMaxFile.Text = ""
    			'AA-TB
    			'Try and Select any previously selected Auxiliary Type
    			Dim declarationInput As IDeclarationInputDataProvider = CType(inputData, IDeclarationInputDataProvider)
    			Dim auxInput As IAuxiliariesDeclarationInputData = declarationInput.AuxiliaryInputData()
    
    			cboAdvancedAuxiliaries.SelectedIndex = 0
    
    			LvAux.Items.Clear()
    			Dim entry As IAuxiliaryDeclarationInputData
    			For Each entry In auxInput.Auxiliaries
    				Dim lv0 As ListViewItem = New ListViewItem
    				lv0.SubItems(0).Text = AuxiliaryTypeHelper.GetAuxKey(entry.Type)
    				lv0.SubItems.Add(AuxiliaryTypeHelper.ToString(entry.Type))
    				lv0.SubItems.Add(String.Join(", ", entry.Technology))
    				LvAux.Items.Add(lv0)
    			Next
    		Else
    			'VACC
    			TbDesMaxFile.Text =
    				If(driver.AccelerationCurve Is Nothing, "", GetRelativePath(driver.AccelerationCurve.Source, _basePath))
    
    
    			Dim auxInput As IAuxiliariesEngineeringInputData = inputData.AuxiliaryInputData()
    			For Each item As AdvancedAuxiliary In cboAdvancedAuxiliaries.Items
    				If _
    					AuxiliaryModelHelper.Parse(item.AssemblyName) = auxInput.AuxiliaryAssembly AndAlso
    					auxInput.AuxiliaryVersion = item.AuxiliaryVersion _
    					Then
    					cboAdvancedAuxiliaries.SelectedItem = item
    					Exit For
    				End If
    			Next
    			'AA-TB
    			'Assign any previously saved Axiliary FilePath
    			txtAdvancedAuxiliaryFile.Text = auxInput.AdvancedAuxiliaryFilePath
    
    			LvAux.Items.Clear()
    			For Each entry As IAuxiliaryEngineeringInputData In auxInput.Auxiliaries
    				Dim lv0 As ListViewItem = New ListViewItem
    				lv0.SubItems(0).Text = entry.ID
    				lv0.SubItems.Add(entry.AuxiliaryType.ToString())
    				lv0.SubItems.Add(If(entry.DemandMap Is Nothing, "", entry.DemandMap.Source))
    				LvAux.Items.Add(lv0)
    			Next
    
    		End If
    
    		Dim sb As ICycleData
    		For Each sb In vectoJob.Cycles
    			Dim lv0 As ListViewItem = New ListViewItem
    			lv0.Text = GetRelativePath(sb.CycleData.Source, Path.GetDirectoryName(Path.GetFullPath(file))) 'sb.Name
    			LvCycles.Items.Add(lv0)
    		Next
    
    		CbEngOnly.Checked = vectoJob.EngineOnlyMode
    
    		If driver.OverSpeedEcoRoll.Mode = DriverMode.EcoRoll Then
    			RdEcoRoll.Checked = True
    		ElseIf driver.OverSpeedEcoRoll.Mode = DriverMode.Overspeed Then
    			RdOverspeed.Checked = True
    		Else
    			RdOff.Checked = True
    		End If
    		TbOverspeed.Text = driver.OverSpeedEcoRoll.OverSpeed.AsKmph.ToGUIFormat()
    		TbUnderSpeed.Text = driver.OverSpeedEcoRoll.UnderSpeed.AsKmph.ToGUIFormat()
    		TbVmin.Text = driver.OverSpeedEcoRoll.MinSpeed.AsKmph.ToGUIFormat()
    		CbLookAhead.Checked = driver.Lookahead.Enabled
    		'TbAlookahead.Text = CStr(VEC0.ALookahead)
    		tbLacMinSpeed.Text = driver.Lookahead.MinSpeed.AsKmph.ToGUIFormat()
    		'TbVminLA.Text = CStr(VEC0.VMinLa)
    		tbLacPreviewFactor.Text = driver.Lookahead.LookaheadDistanceFactor.ToGUIFormat()
    		tbDfCoastingOffset.Text = driver.Lookahead.CoastingDecisionFactorOffset.ToGUIFormat()
    		tbDfCoastingScale.Text = driver.Lookahead.CoastingDecisionFactorScaling.ToGUIFormat()
    
    		tbLacDfTargetSpeedFile.Text = If(driver.Lookahead.CoastingDecisionFactorTargetSpeedLookup Is Nothing, "",
    										GetRelativePath(driver.Lookahead.CoastingDecisionFactorTargetSpeedLookup.Source, _basePath))
    		tbLacDfVelocityDropFile.Text = If(driver.Lookahead.CoastingDecisionFactorVelocityDropLookup Is Nothing, "",
    										GetRelativePath(driver.Lookahead.CoastingDecisionFactorVelocityDropLookup.Source, _basePath))
    
    		'-------------------------------------------------------------
    
    		DeclInit()
    
    
    		EngineForm.AutoSendTo = False
    		GearboxForm.AutoSendTo = False
    		VehicleForm.AutoSendTo = False
    
    
    		Dim x As Integer = Len(file)
    		While Mid(file, x, 1) <> "\" And x > 0
    			x = x - 1
    		End While
    		Text = Mid(file, x + 1, Len(file) - x)
    		_changed = False
    		ToolStripStatusLabelGEN.Text = ""	'file & " opened."
    
    		UpdatePic()
    
    		'-------------------------------------------------------------
    	End Sub
    
    	'Save file
    	Private Function VECTOsave(file As String) As Boolean
    		Dim message As String = String.Empty
    
    		'AA-TB
    		'Validation of Auxiliary Types/Advanced Auxiliaries
    		'if not classic, check the file is valid, if not fail the operation and alert user.
    		If cboAdvancedAuxiliaries.SelectedIndex > 0 Then
    
    			'resolve absolute path for auxiliary file.
    			Dim absoluteAAUxFile As String = ResolveAAUXFilePath(GetPath(VectoFile), txtAdvancedAuxiliaryFile.Text)
    
    			Dim aaAssemblyName As String = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AssemblyName
    			Dim aaAssemblyVersion As String = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AuxiliaryVersion
    
    
    			If Not ValidateAAUXFile(absoluteAAUxFile, aaAssemblyName, aaAssemblyVersion, message) Then
    				MessageBox.Show(
    					String.Format("You have selected an advanced auxiliary *Auxiliary Type*, but the file specified is invalid :{0}",
    								message))
    				Return False
    			End If
    
    		End If
    
    
    		Dim vectoJob As VectoJob = New VectoJob
    		vectoJob.FilePath = file
    
    		'Files ------------------------------------------------- -----------------
    
    		vectoJob.PathVeh = TbVEH.Text
    		vectoJob.PathEng = TbENG.Text
    
    		For Each lv0 As ListViewItem In LvCycles.Items
    			Dim sb As SubPath = New SubPath
    			sb.Init(GetPath(file), lv0.Text)
    			vectoJob.CycleFiles.Add(sb)
    		Next
    
    		vectoJob.PathGbx = TbGBX.Text
    
    
    		'Start/Stop
    		vectoJob.StartStop = ChBStartStop.Checked
    		vectoJob.StartStopMaxSpeed = TbSSspeed.Text.ToDouble()
    		vectoJob.StartStopTime = TbSStime.Text.ToDouble()
    		vectoJob.StartStopDelay = TbSSdelay.Text.ToDouble()
    
    		'a_DesMax
    		vectoJob.DesMaxFile = TbDesMaxFile.Text
    
    		'AA-TB
    		vectoJob.AuxiliaryAssembly = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AssemblyName
    		vectoJob.AuxiliaryVersion = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AuxiliaryVersion
    		vectoJob.AdvancedAuxiliaryFilePath = txtAdvancedAuxiliaryFile.Text
    
    		For Each lv0 As ListViewItem In LvAux.Items
    			Dim auxEntry As VectoJob.AuxEntry = New VectoJob.AuxEntry
    
    			If Cfg.DeclMode Then
    				auxEntry.TechnologyList.Clear()
    				auxEntry.TechnologyList.Add(lv0.SubItems(2).Text)
    			Else
    				auxEntry.Path.Init(GetPath(file), lv0.SubItems(2).Text)
    			End If
    
    			auxEntry.Type = lv0.SubItems(1).Text
    			vectoJob.AuxPaths.Add(lv0.SubItems(0).Text, auxEntry)
    		Next
    
    		vectoJob.EngineOnly = CbEngOnly.Checked
    
    		vectoJob.EcoRollOn = RdEcoRoll.Checked
    		vectoJob.OverSpeedOn = RdOverspeed.Checked
    		vectoJob.OverSpeed = TbOverspeed.Text.ToDouble(0)
    		vectoJob.UnderSpeed = TbUnderSpeed.Text.ToDouble(0)
    		vectoJob.VMin = TbVmin.Text.ToDouble(0)
    		vectoJob.LookAheadOn = CbLookAhead.Checked
    		'vec0.ALookahead = CSng(fTextboxToNumString(TbAlookahead.Text))
    		'vec0.VMinLa = CSng(fTextboxToNumString(TbVminLA.Text))
    		vectoJob.LookAheadMinSpeed = tbLacMinSpeed.Text.ToDouble(0)
    		vectoJob.LacPreviewFactor = tbLacPreviewFactor.Text.ToDouble(0)
    		vectoJob.LacDfOffset = tbDfCoastingOffset.Text.ToDouble(0)
    		vectoJob.LacDfScale = tbDfCoastingScale.Text.ToDouble(0)
    		vectoJob.LacDfTargetSpeedFile = tbLacDfTargetSpeedFile.Text
    		vectoJob.LacDfVelocityDropFile = tbLacDfVelocityDropFile.Text
    		'------------------------------------------------------------
    
    		'SAVE
    		If Not vectoJob.SaveFile Then
    			MsgBox("Cannot safe to " & file, MsgBoxStyle.Critical)
    			Return False
    		End If
    
    		VectoFile = file
    
    		file = GetFilenameWithoutPath(VectoFile, True)
    
    		Text = file
    		ToolStripStatusLabelGEN.Text = ""
    
    		MainForm.AddToJobListView(VectoFile)
    
    		_changed = False
    
    		Return True
    	End Function
    
    	'New file
    	Public Sub VectoNew()
    
    		If ChangeCheckCancel() Then Exit Sub
    
    		'Files
    		TbVEH.Text = ""
    		TbENG.Text = ""
    		LvCycles.Items.Clear()
    		TbGBX.Text = ""
    		TbDesMaxFile.Text = ""
    
    		'Start/Stop
    		TbSSspeed.Text = DeclarationData.Driver.StartStop.MaxSpeed.AsKmph.ToGUIFormat()
    		TbSStime.Text = DeclarationData.Driver.StartStop.MinTime.ToGUIFormat()
    		TbSSdelay.Text = DeclarationData.Driver.StartStop.Delay.ToGUIFormat()
    		ChBStartStop.Checked = False
    
    		LvAux.Items.Clear()
    
    		CbEngOnly.Checked = False
    
    		RdOff.Checked = True
    		CbLookAhead.Checked = True
    		'TbAlookahead.Text = "-0.5"
    		TbOverspeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.OverSpeed.AsKmph.ToGUIFormat()
    		TbUnderSpeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.UnderSpeed.AsKmph.ToGUIFormat()
    		TbVmin.Text = DeclarationData.Driver.OverSpeedEcoRoll.MinSpeed.AsKmph.ToGUIFormat()
    
    		'TbVminLA.Text = "50"
    		tbLacMinSpeed.Text = DeclarationData.Driver.LookAhead.MinimumSpeed.AsKmph.ToGUIFormat()
    		tbLacPreviewFactor.Text = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor.ToGUIFormat()
    		tbDfCoastingOffset.Text = DeclarationData.Driver.LookAhead.DecisionFactorCoastingOffset.ToGUIFormat()
    		tbDfCoastingScale.Text = DeclarationData.Driver.LookAhead.DecisionFactorCoastingScaling.ToGUIFormat()
    		tbLacDfTargetSpeedFile.Text = ""
    		tbLacDfVelocityDropFile.Text = ""
    
    		'---------------------------------------------------
    
    		DeclInit()
    
    		EngineForm.AutoSendTo = False
    
    		VectoFile = ""
    		Text = "Job Editor"
    		ToolStripStatusLabelGEN.Text = ""
    		_changed = False
    		UpdatePic()
    	End Sub
    
    
    #Region "Track changes"
    
    #Region "'Change' Events"
    
    	Private Sub TextBoxVEH_TextChanged(sender As Object, e As EventArgs) _
    		Handles TbVEH.TextChanged
    		UpdatePic()
    		Change()
    	End Sub
    
    	Private Sub TextBoxMAP_TextChanged(sender As Object, e As EventArgs) _
    		Handles TbENG.TextChanged
    		UpdatePic()
    		Change()
    	End Sub
    
    	Private Sub TextBoxFLD_TextChanged(sender As Object, e As EventArgs) _
    		Handles TbGBX.TextChanged
    		UpdatePic()
    		Change()
    	End Sub
    
    	Private Sub TbDesMaxFile_TextChanged_1(sender As Object, e As EventArgs) Handles TbDesMaxFile.TextChanged
    		Change()
    	End Sub
    
    
    	Private Sub TBSSspeed_TextChanged(sender As Object, e As EventArgs) Handles TbSSspeed.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TBSStime_TextChanged(sender As Object, e As EventArgs) _
    		Handles TbSStime.TextChanged, TbSSdelay.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbOverspeed_TextChanged(sender As Object, e As EventArgs) Handles TbOverspeed.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbUnderSpeed_TextChanged(sender As Object, e As EventArgs) Handles TbUnderSpeed.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbVmin_TextChanged(sender As Object, e As EventArgs) _
    		Handles TbVmin.TextChanged
    		Change()
    	End Sub
    
    	Private Sub LvCycles_AfterLabelEdit(sender As Object, e As LabelEditEventArgs) _
    		Handles LvCycles.AfterLabelEdit
    		Change()
    	End Sub
    
    
    #End Region
    
    	Private Sub Change()
    		If Not _changed Then
    			ToolStripStatusLabelGEN.Text = "Unsaved changes in current file"
    			_changed = True
    		End If
    	End Sub
    
    	' "Save changes? "... Returns True if User aborts
    	Private Function ChangeCheckCancel() As Boolean
    
    		If _changed Then
    
    			Select Case MsgBox("Save changes ?", MsgBoxStyle.YesNoCancel)
    				Case MsgBoxResult.Yes
    					Return Not Save()
    				Case MsgBoxResult.Cancel
    					Return True
    				Case Else 'MsgBoxResult.No
    					_changed = False
    					Return False
    			End Select
    
    		Else
    
    			Return False
    
    		End If
    	End Function
    
    #End Region
    
    #Region "Aux Listview"
    
    	Private Sub ButAuxAdd_Click(sender As Object, e As EventArgs) Handles ButAuxAdd.Click
    		Dim id As String
    
    		_auxDialog.VehPath = GetPath(VectoFile)
    		_auxDialog.TbPath.Text = ""
    		_auxDialog.CbType.SelectedIndex = -1
    		_auxDialog.CbType.Text = ""
    		_auxDialog.TbID.Text = ""	'!!! Set Type before ID, because changing the type will overwrite the id !!!
    
    lbDlog:
    		If _auxDialog.ShowDialog = DialogResult.OK Then
    
    			id = UCase(Trim(_auxDialog.TbID.Text))
    
    			Dim lv0 As ListViewItem
    			For Each lv0 In LvAux.Items
    				If lv0.SubItems(0).Text = id Then
    					MsgBox("ID '" & id & "' already defined!", MsgBoxStyle.Critical)
    					_auxDialog.TbID.SelectAll()
    					_auxDialog.TbID.Focus()
    					GoTo lbDlog
    				End If
    			Next
    
    			lv0 = New ListViewItem
    			lv0.SubItems(0).Text = UCase(Trim(_auxDialog.TbID.Text))
    			lv0.SubItems.Add(Trim(_auxDialog.CbType.Text))
    			lv0.SubItems.Add(Trim(_auxDialog.TbPath.Text))
    			LvAux.Items.Add(lv0)
    			Change()
    		End If
    	End Sub
    
    	Private Sub ButAuxRem_Click(sender As Object, e As EventArgs) Handles ButAuxRem.Click
    		RemoveAuxItem()
    	End Sub
    
    	Private Sub LvAux_DoubleClick(sender As Object, e As EventArgs) Handles LvAux.DoubleClick
    		EditAuxItem()
    	End Sub
    
    	Private Sub LvAux_KeyDown(sender As Object, e As KeyEventArgs) Handles LvAux.KeyDown
    		Select Case e.KeyCode
    			Case Keys.Delete, Keys.Back
    				If Not Cfg.DeclMode Then RemoveAuxItem()
    			Case Keys.Enter
    				EditAuxItem()
    		End Select
    	End Sub
    
    	Private Sub EditAuxItem()
    		If LvAux.SelectedItems.Count = 0 Then
    			Exit Sub
    		End If
    
    		Dim selItem As ListViewItem = LvAux.SelectedItems(0)
    
    		_auxDialog.VehPath = GetPath(VectoFile)
    		_auxDialog.CbType.SelectedIndex = -1
    		_auxDialog.CbType.Text = selItem.SubItems(1).Text
    		_auxDialog.TbID.Text = selItem.SubItems(0).Text	'After Type-set!
    
    		If Cfg.DeclMode Then
    			_auxDialog.CbTech.Text = selItem.SubItems(2).Text
    			_auxDialog.TbPath.Text = ""
    		Else
    			_auxDialog.CbTech.SelectedIndex = -1
    			_auxDialog.TbPath.Text = selItem.SubItems(2).Text
    		End If
    
    		If _auxDialog.ShowDialog = DialogResult.OK Then
    			selItem.SubItems(0).Text = UCase(Trim(_auxDialog.TbID.Text))
    			selItem.SubItems(1).Text = Trim(_auxDialog.CbType.Text)
    
    			If Cfg.DeclMode Then
    				selItem.SubItems(2).Text = Trim(_auxDialog.CbTech.Text)
    			Else
    				selItem.SubItems(2).Text = Trim(_auxDialog.TbPath.Text)
    			End If
    
    			Change()
    		End If
    	End Sub
    
    	Private Sub RemoveAuxItem()
    		Dim i As Integer
    
    		If LvAux.SelectedItems.Count = 0 Then
    			If LvAux.Items.Count = 0 Then
    				Exit Sub
    			Else
    				LvAux.Items(LvAux.Items.Count - 1).Selected = True
    			End If
    		End If
    
    		i = LvAux.SelectedItems(0).Index
    
    		LvAux.SelectedItems(0).Remove()
    
    		If LvAux.Items.Count > 0 Then
    			If i < LvAux.Items.Count Then
    				LvAux.Items(i).Selected = True
    			Else
    				LvAux.Items(LvAux.Items.Count - 1).Selected = True
    			End If
    			LvAux.Focus()
    		End If
    
    		Change()
    	End Sub
    
    #End Region
    
    	'OK (Save & Close)
    	Private Sub ButSave_Click(sender As Object, e As EventArgs) Handles ButOK.Click
    		If Not Save() Then Exit Sub
    		Close()
    	End Sub
    
    	'Cancel
    	Private Sub ButCancel_Click(sender As Object, e As EventArgs) Handles ButCancel.Click
    		Close()
    	End Sub
    
    #Region "Cycle list"
    
    	Private Sub LvCycles_DoubleClick(sender As Object, e As EventArgs) Handles LvCycles.DoubleClick
    		If LvCycles.SelectedItems.Count > 0 Then _
    			OpenFiles(FileRepl(LvCycles.SelectedItems(0).SubItems(0).Text, GetPath(VectoFile)))
    	End Sub
    
    	Private Sub LvCycles_KeyDown(sender As Object, e As KeyEventArgs) Handles LvCycles.KeyDown
    		Select Case e.KeyCode
    			Case Keys.Delete, Keys.Back
    				RemoveCycle()
    			Case Keys.Enter
    				If LvCycles.SelectedItems.Count > 0 Then LvCycles.SelectedItems(0).BeginEdit()
    		End Select
    	End Sub
    
    	Private Sub BtDRIadd_Click(sender As Object, e As EventArgs) Handles BtDRIadd.Click
    		Dim genDir As String = GetPath(VectoFile)
    
    		If DrivingCycleFileBrowser.OpenDialog("", True) Then
    			Dim s As String
    			For Each s In DrivingCycleFileBrowser.Files
    				LvCycles.Items.Add(GetFilenameWithoutDirectory(s, genDir))
    			Next
    			Change()
    		End If
    	End Sub
    
    	Private Sub BtDRIrem_Click(sender As Object, e As EventArgs) Handles BtDRIrem.Click
    		RemoveCycle()
    	End Sub
    
    	Private Sub RemoveCycle()
    		Dim i As Integer
    
    		If LvCycles.SelectedItems.Count = 0 Then
    			If LvCycles.Items.Count = 0 Then
    				Exit Sub
    			Else
    				LvCycles.Items(LvCycles.Items.Count - 1).Selected = True
    			End If
    		End If
    
    		i = LvCycles.SelectedItems(0).Index
    
    		LvCycles.SelectedItems(0).Remove()
    
    		If LvCycles.Items.Count > 0 Then
    			If i < LvCycles.Items.Count Then
    				LvCycles.Items(i).Selected = True
    			Else
    				LvCycles.Items(LvCycles.Items.Count - 1).Selected = True
    			End If
    
    			LvCycles.Focus()
    		End If
    
    		Change()
    	End Sub
    
    #End Region
    
    #Region "Enable/Disable GUI controls"
    
    	'Engine only mode changed
    	Private Sub CbEngOnly_CheckedChanged(sender As Object, e As EventArgs) Handles CbEngOnly.CheckedChanged
    		CheckEngOnly()
    		Change()
    	End Sub
    
    	Private Sub CheckEngOnly()
    		Dim onOff As Boolean
    
    		onOff = Not CbEngOnly.Checked
    
    		SetDrivertab(onOff)
    
    		ButOpenVEH.Enabled = onOff
    		TbVEH.Enabled = onOff
    		ButtonVEH.Enabled = onOff
    		ButOpenGBX.Enabled = onOff
    		TbGBX.Enabled = onOff
    		ButtonGBX.Enabled = onOff
    		GrAux.Enabled = onOff
    	End Sub
    
    	'Start/Stop changed 
    	Private Sub ChBStartStop_CheckedChanged_1(sender As Object, e As EventArgs) _
    		Handles ChBStartStop.CheckedChanged
    		Change()
    		If Not Cfg.DeclMode Then PnStartStop.Enabled = ChBStartStop.Checked
    	End Sub
    
    	'LAC changed
    	Private Sub CbLookAhead_CheckedChanged(sender As Object, e As EventArgs) _
    		Handles CbLookAhead.CheckedChanged
    		Change()
    		pnLookAheadCoasting.Enabled = CbLookAhead.Checked
    	End Sub
    
    	'EcoRoll / Overspeed changed
    	Private Sub RdOff_CheckedChanged(sender As Object, e As EventArgs) _
    		Handles RdOff.CheckedChanged, RdOverspeed.CheckedChanged, RdEcoRoll.CheckedChanged
    		Dim ecoRoll As Boolean
    		Dim overspeed As Boolean
    
    		Change()
    
    		ecoRoll = RdEcoRoll.Checked
    		overspeed = RdOverspeed.Checked
    
    		TbOverspeed.Enabled = overspeed Or ecoRoll
    		Label13.Enabled = overspeed Or ecoRoll
    		Label14.Enabled = overspeed Or ecoRoll
    
    		TbUnderSpeed.Enabled = ecoRoll
    		Label22.Enabled = ecoRoll
    		Label20.Enabled = ecoRoll
    
    		TbVmin.Enabled = overspeed Or ecoRoll
    		Label23.Enabled = overspeed Or ecoRoll
    		Label21.Enabled = overspeed Or ecoRoll
    	End Sub
    
    #End Region
    
    	Public Sub UpdatePic()
    
    
    		TbHVCclass.Text = ""
    		TbVehCat.Text = ""
    		TbMass.Text = ""
    		TbAxleConf.Text = ""
    		TbEngTxt.Text = ""
    		TbGbxTxt.Text = ""
    		PicVehicle.Image = Nothing
    		PicBox.Image = Nothing
    
    		UpdateVehiclePic()
    
    		Dim chart As Chart = Nothing
    		UpdateEnginePic(chart)
    
    
    		UpdateGearboxPic(chart)
    
    		If chart Is Nothing Then Return
    
    		Dim chartArea As ChartArea = New ChartArea()
    		chartArea.Name = "main"
    
    		chartArea.AxisX.Title = "engine speed [1/min]"
    		chartArea.AxisX.TitleFont = New Font("Helvetica", 10)
    		chartArea.AxisX.LabelStyle.Font = New Font("Helvetica", 8)
    		chartArea.AxisX.LabelAutoFitStyle = LabelAutoFitStyles.None
    		chartArea.AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Dot
    
    		chartArea.AxisY.Title = "engine torque [Nm]"
    		chartArea.AxisY.TitleFont = New Font("Helvetica", 10)
    		chartArea.AxisY.LabelStyle.Font = New Font("Helvetica", 8)
    		chartArea.AxisY.LabelAutoFitStyle = LabelAutoFitStyles.None
    		chartArea.AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dot
    
    		chartArea.AxisX.Minimum = 300
    		chartArea.BorderDashStyle = ChartDashStyle.Solid
    		chartArea.BorderWidth = 1
    
    		chartArea.BackColor = Color.GhostWhite
    
    		chart.ChartAreas.Add(chartArea)
    		chart.Update()
    
    		Dim img As Bitmap = New Bitmap(chart.Width, chart.Height, PixelFormat.Format32bppArgb)
    		chart.DrawToBitmap(img, New Rectangle(0, 0, PicBox.Width, PicBox.Height))
    
    		PicBox.Image = img
    	End Sub
    
    	Private Sub UpdateGearboxPic(ByRef chartArea As Chart)
    		Dim s As Series
    		Dim i As Integer
    
    		Dim gearbox As IGearboxEngineeringInputData = Nothing
    		Dim gearboxFile As String =
    				If(Not String.IsNullOrWhiteSpace(VectoFile), Path.Combine(Path.GetDirectoryName(VectoFile), TbGBX.Text), TbGBX.Text)
    		If File.Exists(gearboxFile) Then
    			Try
    				Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(gearboxFile), 
    																		IEngineeringInputDataProvider)
    				gearbox = inputData.GearboxInputData
    			Catch
    			End Try
    		End If
    
    		If gearbox Is Nothing Then Return
    
    		TbGbxTxt.Text = String.Format("{0}-Speed {1} {2}", gearbox.Gears.Count, gearbox.Type.ShortName(), gearbox.ModelName)
    
    		If Cfg.DeclMode Then
    			For i = 1 To gearbox.Gears.Count
    				'If FLD0.Init(ENG0.Nidle) Then '' use engine from below...
    
    				'Dim engine As CombustionEngineData = ConvertToEngineData(FLD0, F_VECTO.n_idle)
    				'Dim shiftLines As ShiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(Gear - 1,
    				'																			engine.FullLoadCurve, gears,
    				'																			engine,
    				'																			Double.Parse(LvGears.Items(0).SubItems(F_GBX.GearboxTbl.Ratio).Text,
    				'																						CultureInfo.InvariantCulture),
    				'																			(.rdyn / 1000.0).SI(Of Meter))
    
    				's = New Series
    				's.Points.DataBindXY(shiftLines.Upshift.Select(Function(pt) pt.AngularSpeed.Value() / Constants.RPMToRad).ToList(),
    				'					shiftLines.Upshift.Select(Function(pt) pt.Torque.Value()).ToList())
    				's.ChartType = SeriesChartType.FastLine
    				's.BorderWidth = 2
    				's.Color = Color.DarkRed
    				's.Name = "Upshift curve (" & i & ")"
    				'MyChart.Series.Add(s)
    
    				's = New Series
    				's.Points.DataBindXY(
    				'	shiftLines.Downshift.Select(Function(pt) pt.AngularSpeed.Value() / Constants.RPMToRad).ToList(),
    				'	shiftLines.Downshift.Select(Function(pt) pt.Torque.Value()).ToList())
    				's.ChartType = SeriesChartType.FastLine
    				's.BorderWidth = 2
    				's.Color = Color.DarkRed
    				's.Name = "Downshift curve (" & i & ")"
    				'MyChart.Series.Add(s)
    				'End If
    
    				'	OkCount += 1
    
    				'	pmax = FLD0.Pfull(FLD0.EngineRatedSpeed)
    
    				'End If
    			Next
    		Else
    			For Each gear As ITransmissionInputData In gearbox.Gears
    				If gear.ShiftPolygon Is Nothing OrElse gear.ShiftPolygon.Rows.Count = 0 Then Continue For
    				Dim shiftPolygon As ShiftPolygon = ShiftPolygonReader.Create(gear.ShiftPolygon)
    				s = New Series
    				s.Points.DataBindXY(shiftPolygon.Upshift.Select(Function(x) x.AngularSpeed.AsRPM).ToArray(),
    									shiftPolygon.Upshift.Select(Function(x) x.Torque.Value()).ToArray())
    				s.ChartType = SeriesChartType.FastLine
    				s.BorderWidth = 2
    				s.Color = Color.DarkRed
    				s.Name = "Upshift curve"
    				' MyChart.Series.Add(s) 'MQ 2016-06-20: do not plot shift lines in engine dialog
    
    				s = New Series
    				s.Points.DataBindXY(shiftPolygon.Downshift.Select(Function(x) x.AngularSpeed.AsRPM).ToArray(),
    									shiftPolygon.Downshift.Select(Function(x) x.Torque.Value()).ToArray())
    				s.ChartType = SeriesChartType.FastLine
    				s.BorderWidth = 2
    				s.Color = Color.DarkRed
    				s.Name = "Downshift curve"
    				'MyChart.Series.Add(s) 'MQ 2016-06-20:do not plot shift lines in engine dialog
    			Next
    		End If
    	End Sub
    
    	Private Sub UpdateEnginePic(ByRef chart As Chart)
    		Dim s As Series
    		Dim pmax As Double
    
    		Dim engine As IEngineEngineeringInputData = Nothing
    		Dim engineFile As String =
    				If(Not String.IsNullOrWhiteSpace(VectoFile), Path.Combine(Path.GetDirectoryName(VectoFile), TbENG.Text), TbENG.Text)
    		If File.Exists(engineFile) Then
    			Try
    				Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(engineFile), 
    																		IEngineeringInputDataProvider)
    				engine = inputData.EngineInputData
    			Catch
    				Return
    			End Try
    		End If
    
    		'engine.FilePath = fFileRepl(TbENG.Text, GetPath(VECTOfile))
    
    		'Create plot
    		chart = New Chart
    		chart.Width = PicBox.Width
    		chart.Height = PicBox.Height
    
    
    		'Dim FLD0 As EngineFullLoadCurve = New EngineFullLoadCurve
    
    		If engine Is Nothing Then Return
    
    
    		engine.IdleSpeed.Value()
    
    		Dim fullLoadCurve As FullLoadCurve = EngineFullLoadCurve.Create(engine.FullLoadCurve)
    
    		s = New Series
    		s.Points.DataBindXY(fullLoadCurve.FullLoadEntries.Select(Function(x) x.EngineSpeed.AsRPM).ToArray(),
    							fullLoadCurve.FullLoadEntries.Select(Function(x) x.TorqueFullLoad.Value()).ToArray())
    		s.ChartType = SeriesChartType.FastLine
    		s.BorderWidth = 2
    		s.Color = Color.DarkBlue
    		s.Name = "Full load"
    		chart.Series.Add(s)
    
    		s = New Series
    		s.Points.DataBindXY(fullLoadCurve.FullLoadEntries.Select(Function(x) x.EngineSpeed.AsRPM).ToArray(),
    							fullLoadCurve.FullLoadEntries.Select(Function(x) x.TorqueDrag.Value()).ToArray())
    		s.ChartType = SeriesChartType.FastLine
    		s.BorderWidth = 2
    		s.Color = Color.Blue
    		s.Name = "Motoring"
    		chart.Series.Add(s)
    
    		pmax = fullLoadCurve.MaxPower.Value() / 1000 'FLD0.Pfull(FLD0.EngineRatedSpeed)
    
    
    		TbEngTxt.Text = String.Format("{0} l {1} kw {2}", (engine.Displacement.Value() * 1000).ToString("0.0"),
    									pmax.ToString("#"), engine.ModelName)
    
    		Dim fuelConsumptionMap As FuelConsumptionMap = FuelConsumptionMapReader.Create(engine.FuelConsumptionMap)
    
    		s = New Series
    		s.Points.DataBindXY(fuelConsumptionMap.Entries.Select(Function(x) x.EngineSpeed.AsRPM).ToArray(),
    							fuelConsumptionMap.Entries.Select(Function(x) x.Torque.Value()).ToArray())
    		s.ChartType = SeriesChartType.Point
    		s.MarkerSize = 3
    		s.Color = Color.Red
    		s.Name = "Map"
    		chart.Series.Add(s)
    	End Sub
    
    	Private Sub UpdateVehiclePic()
    		Dim HDVclass As String
    
    		Dim vehicle As IVehicleEngineeringInputData = Nothing
    
    		Dim vehicleFile As String =
    				If(Not String.IsNullOrWhiteSpace(VectoFile), Path.Combine(Path.GetDirectoryName(VectoFile), TbVEH.Text), TbVEH.Text)
    		If File.Exists(vehicleFile) Then
    			Try
    				Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(vehicleFile), 
    																		IEngineeringInputDataProvider)
    				vehicle = inputData.VehicleInputData
    			Catch
    			End Try
    		End If
    
    		If vehicle Is Nothing Then Return
    
    		Dim maxMass As Kilogram = vehicle.GrossVehicleMassRating					'CSng(fTextboxToNumString(TbMassMass.Text))
    
    		Dim s0 As Segment = Nothing
    		Try
    			s0 = DeclarationData.Segments.Lookup(vehicle.VehicleCategory, vehicle.AxleConfiguration, maxMass, 0.SI(Of Kilogram),
    												True)
    		Catch
    		End Try
    		If s0 Is Nothing Then
    			HDVclass = "-"
    		Else
    			HDVclass = s0.VehicleClass.GetClassNumber()
    
    			If Cfg.DeclMode Then
    				LvCycles.Items.Clear()
    				Dim m0 As Mission
    				For Each m0 In s0.Missions
    					LvCycles.Items.Add(m0.MissionType.ToString())
    				Next
    			End If
    
    		End If
    
    		PicVehicle.Image = ConvPicPath(If(s0 Is Nothing, -1, HDVclass.ToInt()), False) _
    		'Image.FromFile(cDeclaration.ConvPicPath(HDVclass, False))
    
    		TbHVCclass.Text = String.Format("HDV Class {0}", HDVclass)
    		TbVehCat.Text = vehicle.VehicleCategory.GetCategoryName()	'ConvVehCat(VEH0.VehCat, True)
    		TbMass.Text = (vehicle.GrossVehicleMassRating.Value() / 1000) & " t"
    		TbAxleConf.Text = vehicle.AxleConfiguration.GetName()	'ConvAxleConf(VEH0.AxleConf)
    	End Sub
    
    
    #Region "Open File Context Menu"
    
    	Private _contextMenuFiles As String()
    	Private _basePath As String = ""
    
    	Private Sub OpenFiles(ParamArray files() As String)
    		If files.Length = 0 Then Exit Sub
    
    		_contextMenuFiles = files
    		OpenWithToolStripMenuItem.Text = "Open with " & Cfg.OpenCmdName
    		CmOpenFile.Show(Windows.Forms.Cursor.Position)
    	End Sub
    
    	Private Sub OpenWithToolStripMenuItem_Click(sender As Object, e As EventArgs) _
    		Handles OpenWithToolStripMenuItem.Click
    		If Not FileOpenAlt(_contextMenuFiles(0)) Then MsgBox("Failed to open file!")
    	End Sub
    
    	Private Sub ShowInFolderToolStripMenuItem_Click(sender As Object, e As EventArgs) _
    		Handles ShowInFolderToolStripMenuItem.Click
    		If File.Exists(_contextMenuFiles(0)) Then
    			Try
    				Process.Start("explorer", "/select,""" & _contextMenuFiles(0) & "")
    			Catch ex As Exception
    				MsgBox("Failed to open file!")
    			End Try
    		Else
    			MsgBox("File not found!")
    		End If
    	End Sub
    
    #End Region
    
    
    	'AA-TB
    	Private Sub picAuxInfo_MouseEnter(sender As Object, e As EventArgs) Handles picAuxInfo.MouseEnter
    
    
    		If cboAdvancedAuxiliaries.SelectedIndex = -1 Then Exit Sub
    
    		'Get tooltip
    		Dim item As AdvancedAuxiliary
    
    		item = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary)
    
    		If item.AuxiliaryVersion = "CLASSIC" Then
    
    			ToolTip1.ToolTipTitle = "Classic Vecto Auxiliaries"
    			ToolTip1.SetToolTip(picAuxInfo, "Uses original basic auxiliaries calculation")
    
    		Else
    
    			ToolTip1.ToolTipTitle = "Advanced Auxiliary Information"
    			ToolTip1.SetToolTip(picAuxInfo, item.AuxiliaryName & " : Version=" & item.AuxiliaryVersion)
    
    		End If
    	End Sub
    
    	'AA-TB
    	Private Sub btnBrowseAAUXFile_Click(sender As Object, e As EventArgs) Handles btnBrowseAAUXFile.Click
    
    		If String.IsNullOrEmpty(VectoFile) Then
    			MessageBox.Show(
    				"Please complete and save a valid new .vecto file before adding/configuring advanced bus auxiliaries.")
    			Return
    		End If
    
    		Dim aauxFileValidated As Boolean = False
    		Dim fbAux As New FileBrowser("aaux", False, False)
    		Dim message As String = String.Empty
    		Dim absoluteAuxPath As String
    		Dim assembly As AdvancedAuxiliary
    
    		'If Classic is selected, then bail
    		If cboAdvancedAuxiliaries.SelectedIndex = 0 Then Return
    
    		'Get Absolute Path for AAUX FILE.
    		absoluteAuxPath = ResolveAAUXFilePath(GetPath(VectoFile), txtAdvancedAuxiliaryFile.Text)
    
    		'Set Extensions
    		fbAux.Extensions = New String() {"AAUX"}
    
    		Try
    
    			assembly = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary)
    
    			Dim validAAUXFile As Boolean = ValidateAAUXFile(absoluteAuxPath, assembly.AssemblyName,
    															assembly.AuxiliaryVersion, message)
    			Dim fileExists As Boolean = File.Exists(absoluteAuxPath)
    
    			If fileExists AndAlso validAAUXFile Then
    				ConfigureAdvancedAuxiliaries(assembly.AssemblyName, assembly.AuxiliaryVersion,
    											txtAdvancedAuxiliaryFile.Text, VectoFile)
    			Else
    
    				Dim needToFindOrCreateFile As Boolean = True
    
    				While needToFindOrCreateFile
    
    					'Find / Create  file and configure.
    					If fbAux.CustomDialog(absoluteAuxPath, False, False, FileBrowserFileExtensionMode.ForceExt, False, String.Empty) _
    						Then
    						txtAdvancedAuxiliaryFile.Text = GetFilenameWithoutDirectory(fbAux.Files(0), GetPath(VectoFile))
    						assembly = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary)
    
    						If _
    							File.Exists(ResolveAAUXFilePath(GetPath(VectoFile), txtAdvancedAuxiliaryFile.Text)) OrElse
    							MsgBox("Do you want to create a new .AAUX file?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
    							needToFindOrCreateFile = False
    							ConfigureAdvancedAuxiliaries(assembly.AssemblyName, assembly.AuxiliaryVersion,
    														txtAdvancedAuxiliaryFile.Text, VectoFile)
    						End If
    					Else
    						needToFindOrCreateFile = False
    					End If
    
    				End While
    
    			End If
    
    		Catch ex As Exception
    			MessageBox.Show("There was an error configuring your Advanced Auxiliary File")
    		End Try
    	End Sub
    
    	'AA-TB
    	Private Sub cboAdvancedAuxiliaries_SelectedIndexChanged(sender As Object, e As EventArgs) _
    		Handles cboAdvancedAuxiliaries.SelectedIndexChanged
    
    		'Enable or otherwise the text box and browser button associated with Advanced Axuiliaries
    		If cboAdvancedAuxiliaries.SelectedIndex = 0 Then
    
    			btnBrowseAAUXFile.Enabled = False
    			txtAdvancedAuxiliaryFile.Enabled = False
    
    		Else
    
    			btnBrowseAAUXFile.Enabled = True
    			txtAdvancedAuxiliaryFile.Enabled = True
    
    		End If
    	End Sub
    
    
    	'AA-TB
    	Private Sub btnAAUXOpen_Click(sender As Object, e As EventArgs) Handles btnAAUXOpen.Click
    
    		OpenFiles(FileRepl(txtAdvancedAuxiliaryFile.Text, GetPath(VectoFile)))
    	End Sub
    
    
    	Private Sub btnDfTargetSpeed_Click(sender As Object, e As EventArgs) Handles btnDfTargetSpeed.Click
    		If DriverDecisionFactorTargetSpeedFileBrowser.OpenDialog(FileRepl(tbLacDfTargetSpeedFile.Text, GetPath(VectoFile))) _
    			Then _
    			tbLacDfTargetSpeedFile.Text = GetFilenameWithoutDirectory(DriverDecisionFactorTargetSpeedFileBrowser.Files(0),
    																	GetPath(VectoFile))
    	End Sub
    
    	Private Sub btnDfVelocityDrop_Click_1(sender As Object, e As EventArgs) Handles btnDfVelocityDrop.Click
    		If DriverDecisionFactorVelocityDropFileBrowser.OpenDialog(FileRepl(tbLacDfVelocityDropFile.Text, GetPath(VectoFile))) _
    			Then _
    			tbLacDfVelocityDropFile.Text = GetFilenameWithoutDirectory(DriverDecisionFactorVelocityDropFileBrowser.Files(0),
    																		GetPath(VectoFile))
    	End Sub
    
    	Private Sub Label6_Click(sender As Object, e As EventArgs) Handles Label6.Click
    	End Sub
    End Class