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
  • ec1021f28c26b7e4fccd56ce60d1382cb4a5458e
  • tug-dev default
  • amdm3/develop
  • fix/scripts1
  • amdm2/develop
  • amdm2/main
  • playground
  • feat/changelog
  • fix/solution_tests
  • test/full_release_process
  • test/art10_test_execution
  • test/gitlab_files_api
  • test/multiplatform_david
  • trgbot
  • set-sast-config-3
  • set-sast-config-2
  • set-secret-detection-config-2
  • set-secret-detection-config-1
  • set-sast-config-1
  • test-linux-fixes
  • tug-stable
  • Release/v4.3.2
  • v1.0.1
  • v1.0.0
  • Build/v0.7.10.2996
  • v0.7.5b0+2524.multistep
  • Release/v3.3.14.2981-RC
  • Build/v0.7.9.2975
  • Release/v3.3.13.2924
  • Release/v3.3.13.2891-RC
  • Build/0.7.9.2890
  • Build/v0.7.9.2864
  • Build/v0.7.9.2849
  • Build/v0.7.9.2836
  • Release/TrailerTool_V0.9.0.2759
  • Release/TrailerTool_V0.9.0.2735
  • Release/TrailerTool_V0.9.0.2799
  • Release/v3.3.12.2800
  • Release/v3.3.12.2769-RC
  • Build/v0.7.9.2741
  • Build/v0.5.0.1812_VectoFF
41 results

GearboxForm.vb

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.
    GearboxForm.vb 29.28 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.
    Imports System.Collections.Generic
    Imports System.Drawing.Imaging
    Imports System.Globalization
    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.Impl
    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>
    ''' Gearbox Editor
    ''' </summary>
    ''' <remarks></remarks>
    Public Class GearboxForm
    	Private Enum GearboxTbl
    		GearNr = 0
    		'TorqueConverter = 1
    		Ratio = 1
    		LossMapEfficiency = 2
    		ShiftPolygons = 3
    		MaxTorque = 4
    	End Enum
    
    	Private _gbxFile As String = ""
    	Public AutoSendTo As Boolean = False
    	Public JobDir As String = ""
    	Private _gearDialog As GearboxGearDialog
    
    	Private _changed As Boolean = False
    
    	'Before closing Editor: Check if file was changed and ask to save.
    	Private Sub F_GBX_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
    
    	'Initialise.
    	Private Sub F_GBX_Load(sender As Object, e As EventArgs) Handles Me.Load
    
    		_gearDialog = New GearboxGearDialog
    
    		PnInertiaTI.Enabled = Not Cfg.DeclMode
    		GrGearShift.Enabled = Not Cfg.DeclMode
    		'ChTCon.Enabled = Not Cfg.DeclMode
    
    		CbGStype.Items.Clear()
    		CbGStype.ValueMember = "Value"
    		CbGStype.DisplayMember = "Label"
    
    		If Cfg.DeclMode Then
    			CbGStype.DataSource = [Enum].GetValues(GetType(GearboxType)) _
    				.Cast(Of GearboxType)() _
    				.Where(Function(type) type.ManualTransmission()) _
    				.Select(Function(type) New With {Key .Value = type, .Label = type.GetLabel()}).ToList()
    		Else
    			CbGStype.DataSource = [Enum].GetValues(GetType(GearboxType)) _
    				.Cast(Of GearboxType) _
    				.Where(Function(type) type.AutomaticTransmission() OrElse type.ManualTransmission()) _
    				.Select(Function(type) New With {Key .Value = type, .Label = type.GetLabel()}).ToList()
    		End If
    
    		DeclInit()
    
    		_changed = False
    		NewGbx()
    	End Sub
    
    	'Set generic values for Declaration mode.
    	Private Sub DeclInit()
    		Dim gbxType As GearboxType
    		Dim lv0 As ListViewItem
    
    		If Not Cfg.DeclMode Then Exit Sub
    
    		TBI_getr.Text = DeclarationData.Gearbox.Inertia.ToGUIFormat()	'cDeclaration.GbInertia
    
    		gbxType = CType(CbGStype.SelectedValue, GearboxType)	'CType(Me.CbGStype.SelectedIndex, tGearbox)
    
    		TbTracInt.Text = gbxType.TractionInterruption().ToGUIFormat()
    		TbShiftTime.Text = DeclarationData.Gearbox.MinTimeBetweenGearshifts.ToGUIFormat()	'cDeclaration.ShiftTime(GStype)
    
    		TbTqResv.Text = (DeclarationData.Gearbox.TorqueReserve * 100).ToGUIFormat()		' cDeclaration.TqResv
    		TbTqResvStart.Text = (DeclarationData.Gearbox.TorqueReserveStart * 100).ToGUIFormat() 'cDeclaration.TqResvStart
    		TbStartSpeed.Text = DeclarationData.Gearbox.StartSpeed.ToGUIFormat()	'cDeclaration.StartSpeed
    		TbStartAcc.Text = DeclarationData.Gearbox.StartAcceleration.ToGUIFormat()	' cDeclaration.StartAcc
    
    		tbUpshiftMinAcceleration.Text = DeclarationData.Gearbox.UpshiftMinAcceleration.ToGUIFormat()
    		tbDownshiftAfterUpshift.Text = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay.ToGUIFormat()
    		tbUpshiftAfterDownshift.Text = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay.ToGUIFormat()
    
    		'ChTCon.Checked = GStype.AutomaticTransmission()
    		For Each lv0 In LvGears.Items
    			lv0.SubItems(GearboxTbl.ShiftPolygons).Text = ""
    		Next
    	End Sub
    
    #Region "Toolbar"
    
    	Private Sub ToolStripBtNew_Click(sender As Object, e As EventArgs) Handles ToolStripBtNew.Click
    		NewGbx()
    	End Sub
    
    	Private Sub ToolStripBtOpen_Click(sender As Object, e As EventArgs) Handles ToolStripBtOpen.Click
    		If GearboxFileBrowser.OpenDialog(_gbxFile) Then
    			Try
    				OpenGbx(GearboxFileBrowser.Files(0))
    			Catch ex As Exception
    				MsgBox("Failed to open Gearbox File: " + ex.Message)
    			End Try
    		End If
    	End Sub
    
    	Private Sub ToolStripBtSave_Click(sender As Object, e As EventArgs) Handles ToolStripBtSave.Click
    		SaveOrSaveAs(False)
    	End Sub
    
    	Private Sub ToolStripBtSaveAs_Click(sender As Object, e As EventArgs) Handles ToolStripBtSaveAs.Click
    		SaveOrSaveAs(True)
    	End Sub
    
    	Private Sub ToolStripBtSendTo_Click(sender As Object, e As EventArgs) Handles ToolStripBtSendTo.Click
    
    		If ChangeCheckCancel() Then Exit Sub
    
    		If _gbxFile = "" Then
    			If MsgBox("Save file now?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
    				If Not SaveOrSaveAs(True) Then Exit Sub
    			Else
    				Exit Sub
    			End If
    		End If
    
    		If Not VectoJobForm.Visible Then
    			JobDir = ""
    			VectoJobForm.Show()
    			VectoJobForm.VectoNew()
    		Else
    			VectoJobForm.WindowState = FormWindowState.Normal
    		End If
    
    		VectoJobForm.TbGBX.Text = GetFilenameWithoutDirectory(_gbxFile, JobDir)
    	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#gearbox-editor"))
    		Else
    			MsgBox("User Manual not found!", MsgBoxStyle.Critical)
    		End If
    	End Sub
    
    #End Region
    
    	'New file
    	Private Sub NewGbx()
    		'Dim lvi As ListViewItem
    
    		If ChangeCheckCancel() Then Exit Sub
    
    		'CbGStype.SelectedIndex = 0
    
    		TbName.Text = ""
    		TbTracInt.Text = ""
    		TBI_getr.Text = ""
    
    		LvGears.Items.Clear()
    
    		LvGears.Items.Add(CreateListviewItem("Axle", 1, "1", "", ""))
    
    		'Me.ChSkipGears.Checked = False         'set by CbGStype.SelectedIndexChanged
    		'Me.ChShiftInside.Checked = False       'set by CbGStype.SelectedIndexChanged
    		TbTqResv.Text = (DeclarationData.Gearbox.TorqueReserve * 100).ToGUIFormat()
    		TbShiftTime.Text = DeclarationData.Gearbox.MinTimeBetweenGearshifts.ToGUIFormat()
    		TbTqResvStart.Text = (DeclarationData.Gearbox.TorqueReserveStart * 100).ToGUIFormat()
    		TbStartSpeed.Text = DeclarationData.Gearbox.StartSpeed.ToGUIFormat() ' in m/s!
    		TbStartAcc.Text = DeclarationData.Gearbox.StartAcceleration.ToGUIFormat()
    
    		tbUpshiftMinAcceleration.Text = DeclarationData.Gearbox.UpshiftMinAcceleration.ToGUIFormat()
    		tbDownshiftAfterUpshift.Text = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay.ToGUIFormat()
    		tbUpshiftAfterDownshift.Text = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay.ToGUIFormat()
    
    		'ChTCon.Checked = False				'set by CbGStype.SelectedIndexChanged
    		TbTCfile.Text = ""
    		TbTCrefrpm.Text = ""
    		TbTCinertia.Text = ""
    
    		DeclInit()
    
    		_gbxFile = ""
    		Text = "GBX Editor"
    		LbStatus.Text = ""
    
    
    		_changed = False
    		UpdatePic()
    	End Sub
    
    	'Open file
    	Public Sub OpenGbx(file As String)
    
    		If ChangeCheckCancel() Then Exit Sub
    
    		Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(file), 
    																IEngineeringInputDataProvider)
    		Dim gearbox As IGearboxEngineeringInputData = inputData.GearboxInputData
    		Dim axlegear As IAxleGearInputData = inputData.AxleGearInputData
    
    		If Cfg.DeclMode <> gearbox.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
    
    		Dim basePath As String = Path.GetDirectoryName(file)
    		TbName.Text = gearbox.ModelName
    		TbTracInt.Text = gearbox.TractionInterruption.ToGUIFormat()
    		TBI_getr.Text = gearbox.Inertia.ToGUIFormat()
    
    		LvGears.Items.Clear()
    
    		Dim lossmap As String = ""
    		Try
    			lossmap = If(axlegear.LossMap Is Nothing, axlegear.Efficiency.ToGUIFormat(),
    						GetRelativePath(axlegear.LossMap.Source, basePath))
    		Catch ex As Exception
    		End Try
    
    		LvGears.Items.Add(CreateListviewItem("Axle", axlegear.Ratio, lossmap, "", ""))
    
    		For Each gear As ITransmissionInputData In gearbox.Gears
    			lossmap = ""
    			Try
    				lossmap = If(gear.LossMap Is Nothing, gear.Efficiency.ToGUIFormat(), GetRelativePath(gear.LossMap.Source, basePath))
    			Catch ex As Exception
    
    			End Try
    			LvGears.Items.Add(CreateListviewItem(gear.Gear.ToString("00"), gear.Ratio,
    												lossmap,
    												If(gear.ShiftPolygon Is Nothing, "", GetRelativePath(gear.ShiftPolygon.Source, basePath)),
    												If(gear.MaxTorque Is Nothing, "", gear.MaxTorque.ToGUIFormat())))
    		Next
    
    		TbTqResv.Text = (gearbox.TorqueReserve * 100).ToGUIFormat()
    		TbShiftTime.Text = gearbox.ShiftTime.ToGUIFormat()
    		TbTqResvStart.Text = (gearbox.StartTorqueReserve * 100).ToGUIFormat()
    		TbStartSpeed.Text = gearbox.StartSpeed.ToGUIFormat()
    		TbStartAcc.Text = gearbox.StartAcceleration.ToGUIFormat()
    
    		Dim torqueConverter As ITorqueConverterEngineeringInputData = gearbox.TorqueConverter
    		If torqueConverter Is Nothing OrElse gearbox.Type.ManualTransmission() Then
    			TbTCfile.Text = ""
    			TbTCrefrpm.Text = ""
    			TbTCinertia.Text = ""
    			TBTCShiftPolygon.Text = ""
    		Else
    			TbTCfile.Text = If(torqueConverter.TCData Is Nothing, "", GetRelativePath(torqueConverter.TCData.Source, basePath))
    			TbTCrefrpm.Text = If(torqueConverter.ReferenceRPM Is Nothing, "", torqueConverter.ReferenceRPM.AsRPM.ToGUIFormat())
    			TbTCinertia.Text = If(torqueConverter.Inertia Is Nothing, "", torqueConverter.Inertia.ToGUIFormat())
    			TBTCShiftPolygon.Text =
    				If(torqueConverter.ShiftPolygon Is Nothing, "", GetRelativePath(torqueConverter.ShiftPolygon.Source, basePath))
    		End If
    
    		tbUpshiftMinAcceleration.Text = gearbox.UpshiftMinAcceleration.ToGUIFormat()
    		tbDownshiftAfterUpshift.Text = gearbox.DownshiftAferUpshiftDelay.ToGUIFormat()
    		tbUpshiftAfterDownshift.Text = gearbox.UpshiftAfterDownshiftDelay.ToGUIFormat()
    
    		CbGStype.SelectedValue = gearbox.Type
    
    
    		DeclInit()
    
    
    		GearboxFileBrowser.UpdateHistory(file)
    		Text = GetFilenameWithoutPath(file, True)
    		LbStatus.Text = ""
    		_gbxFile = file
    		Activate()
    
    		_changed = False
    		UpdatePic()
    	End Sub
    
    	Private Function CreateListviewItem(gear As String, ratio As Double, getrMap As String,
    										shiftPolygon As String, maxTorque As String) As ListViewItem
    		Dim retVal As ListViewItem = New ListViewItem(gear)
    		'retVal.SubItems.Add(tc)
    		retVal.SubItems.Add(ratio.ToGUIFormat())
    		retVal.SubItems.Add(getrMap)
    		retVal.SubItems.Add(shiftPolygon)
    		retVal.SubItems.Add(maxTorque)
    		Return retVal
    	End Function
    
    	'Save or Save As function = true if file is saved
    	Private Function SaveOrSaveAs(saveAs As Boolean) As Boolean
    		If _gbxFile = "" Or saveAs Then
    			If GearboxFileBrowser.SaveDialog(_gbxFile) Then
    				_gbxFile = GearboxFileBrowser.Files(0)
    			Else
    				Return False
    			End If
    		End If
    		Return SaveGbx(_gbxFile)
    	End Function
    
    	'Save file
    	Private Function SaveGbx(file As String) As Boolean
    		Dim gearbox As Gearbox
    		Dim i As Integer
    
    		gearbox = New Gearbox
    		gearbox.FilePath = file
    
    		gearbox.ModelName = TbName.Text
    		If Trim(gearbox.ModelName) = "" Then gearbox.ModelName = "Undefined"
    
    		gearbox.TracIntrSi = TbTracInt.Text.ToDouble(0)
    		gearbox.GbxInertia = TBI_getr.Text.ToDouble(0)
    
    		For i = 0 To LvGears.Items.Count - 1
    			'GBX0.IsTCgear.Add(Me.LvGears.Items(i).SubItems(GearboxTbl.TorqueConverter).Text = "on" And i > 0)
    			gearbox.GearRatios.Add(LvGears.Items(i).SubItems(GearboxTbl.Ratio).Text.ToDouble(0))
    			gearbox.GearLossmaps.Add(New SubPath)
    			gearbox.GearLossMap(i) = LvGears.Items(i).SubItems(GearboxTbl.LossMapEfficiency).Text
    			gearbox.GearshiftFiles.Add(New SubPath)
    			gearbox.ShiftPolygonFile(i) = LvGears.Items(i).SubItems(GearboxTbl.ShiftPolygons).Text
    			'GBX0.FldFiles.Add(New cSubPath)
    			'GBX0.FldFile(i) = Me.LvGears.Items(i).SubItems(GearboxTbl.MaxTorque).Text
    			gearbox.MaxTorque.Add(LvGears.Items(i).SubItems(GearboxTbl.MaxTorque).Text)
    		Next
    
    		gearbox.TorqueResv = TbTqResv.Text.ToDouble(0)
    		gearbox.ShiftTime = TbShiftTime.Text.ToDouble(0)
    		gearbox.TorqueResvStart = TbTqResvStart.Text.ToDouble(0)
    		gearbox.StartSpeed = TbStartSpeed.Text.ToDouble(0)
    		gearbox.StartAcc = TbStartAcc.Text.ToDouble(0)
    
    		gearbox.Type = CType(CbGStype.SelectedValue, GearboxType)
    
    		gearbox.TorqueConverterEnabled = gearbox.Type.AutomaticTransmission()
    		gearbox.TorqueConverterFile = TbTCfile.Text
    		gearbox.TorqueConverterReferenceRpm = TbTCrefrpm.Text.ToDouble(0)
    		gearbox.TorqueConverterInertia = TbTCinertia.Text.ToDouble(0)
    		gearbox.TorqueConverterShiftPolygonFile = TBTCShiftPolygon.Text
    
    		gearbox.DownshiftAfterUpshift = tbDownshiftAfterUpshift.Text.ToDouble(0)
    		gearbox.UpshiftAfterDownshift = tbUpshiftAfterDownshift.Text.ToDouble(0)
    		gearbox.UpshiftMinAcceleration = tbUpshiftMinAcceleration.Text.ToDouble(0)
    
    		If Not gearbox.SaveFile Then
    			MsgBox("Cannot safe to " & file, MsgBoxStyle.Critical)
    			Return False
    		End If
    
    		If AutoSendTo Then
    			If VectoJobForm.Visible Then
    				If UCase(FileRepl(VectoJobForm.TbGBX.Text, JobDir)) <> UCase(file) Then _
    					VectoJobForm.TbGBX.Text = GetFilenameWithoutDirectory(file, JobDir)
    				VectoJobForm.UpdatePic()
    			End If
    		End If
    
    		GearboxFileBrowser.UpdateHistory(file)
    		Text = GetFilenameWithoutPath(file, True)
    		LbStatus.Text = ""
    
    		_changed = False
    
    		Return True
    	End Function
    
    #Region "Change Events"
    
    	'Change Status ändern |@@| Change Status change
    	Private Sub Change()
    		If Not _changed Then
    			LbStatus.Text = "Unsaved changes in current file"
    			_changed = True
    		End If
    	End Sub
    
    	' "Save changes ?" ...liefert True wenn User Vorgang abbricht |@@| 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 SaveOrSaveAs(False)
    				Case MsgBoxResult.Cancel
    					Return True
    				Case Else 'MsgBoxResult.No
    					_changed = False
    					Return False
    			End Select
    
    		Else
    
    			Return False
    
    		End If
    	End Function
    
    	Private Sub TbName_TextChanged(sender As Object, e As EventArgs) Handles TbName.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TBI_getr_TextChanged(sender As Object, e As EventArgs) Handles TBI_getr.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbTracInt_TextChanged(sender As Object, e As EventArgs) Handles TbTracInt.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbTqResv_TextChanged(sender As Object, e As EventArgs) Handles TbTqResv.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbShiftTime_TextChanged(sender As Object, e As EventArgs) Handles TbShiftTime.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbTqResvStart_TextChanged(sender As Object, e As EventArgs) Handles TbTqResvStart.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbStartSpeed_TextChanged(sender As Object, e As EventArgs) Handles TbStartSpeed.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbStartAcc_TextChanged(sender As Object, e As EventArgs) Handles TbStartAcc.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbTCfile_TextChanged(sender As Object, e As EventArgs) Handles TbTCfile.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbTCrefrpm_TextChanged(sender As Object, e As EventArgs) Handles TbTCrefrpm.TextChanged
    		Change()
    	End Sub
    
    	Private Sub TbTCinertia_TextChanged(sender As Object, e As EventArgs) Handles TbTCinertia.TextChanged
    		Change()
    	End Sub
    
    
    #End Region
    
    	'Save and close
    	Private Sub ButOK_Click(sender As Object, e As EventArgs) Handles ButOK.Click
    		If SaveOrSaveAs(False) Then Close()
    	End Sub
    
    	'Cancel
    	Private Sub ButCancel_Click(sender As Object, e As EventArgs) Handles ButCancel.Click
    		Close()
    	End Sub
    
    	'Enable/Disable settings for specific transmission types
    	Private Sub CbGStype_SelectedIndexChanged(sender As Object, e As EventArgs) _
    		Handles CbGStype.SelectedIndexChanged
    		Dim gStype As GearboxType = CType(CbGStype.SelectedValue, GearboxType)
    
    		Change()
    
    		'ChTCon.Enabled = (GStype.AutomaticTransmission())
    		PnTC.Enabled = gStype.AutomaticTransmission()
    	End Sub
    
    
    	Private Sub LvGears_SelectedIndexChanged(sender As Object, e As EventArgs) _
    		Handles LvGears.SelectedIndexChanged
    		UpdatePic()
    	End Sub
    
    #Region "Gears"
    
    	'Gear-DoubleClick
    	Private Sub LvGears_MouseDoubleClick(ByVal sender As Object, ByVal e As MouseEventArgs) _
    		Handles LvGears.MouseDoubleClick
    		EditGear()
    	End Sub
    
    	'Gear-KeyDown
    	Private Sub LvGears_KeyDown(sender As Object, e As KeyEventArgs) Handles LvGears.KeyDown
    		Select Case e.KeyCode
    			Case Keys.Delete, Keys.Back
    				RemoveGear(False)
    			Case Keys.Enter
    				EditGear()
    		End Select
    	End Sub
    
    	'Remove Gear Button
    	Private Sub BtClearGear_Click(sender As Object, e As EventArgs) Handles BtRemGear.Click
    		RemoveGear(False)
    	End Sub
    
    	'Add Gear button
    	Private Sub BtAddGear_Click(sender As Object, e As EventArgs) Handles BtAddGear.Click
    		AddGear()
    		LvGears.Items(LvGears.Items.Count - 1).Selected = True
    		EditGear()
    	End Sub
    
    	'Edit Gear
    	Private Sub EditGear()
    
    		Do
    
    			'GearDia.ChIsTCgear.Enabled = (Me.ChTCon.Checked And Me.LvGears.SelectedIndices(0) > 0)
    			_gearDialog.PnShiftPoly.Enabled = (Not Cfg.DeclMode And LvGears.SelectedIndices(0) > 0)
    			_gearDialog.PnFld.Enabled = (LvGears.SelectedIndices(0) > 0)
    			_gearDialog.GbxPath = GetPath(_gbxFile)
    			_gearDialog.TbGear.Text = LvGears.SelectedItems(0).SubItems(GearboxTbl.GearNr).Text
    			_gearDialog.TbRatio.Text = LvGears.SelectedItems(0).SubItems(GearboxTbl.Ratio).Text
    			_gearDialog.TbMapPath.Text = LvGears.SelectedItems(0).SubItems(GearboxTbl.LossMapEfficiency).Text
    			If LvGears.SelectedIndices(0) > 0 Then
    				_gearDialog.TbShiftPolyFile.Text = LvGears.SelectedItems(0).SubItems(GearboxTbl.ShiftPolygons).Text
    				_gearDialog.TbMaxTorque.Text = LvGears.SelectedItems(0).SubItems(GearboxTbl.MaxTorque).Text
    			Else
    				_gearDialog.TbShiftPolyFile.Text = ""
    				_gearDialog.TbMaxTorque.Text = ""
    			End If
    
    			If LvGears.SelectedItems(0).Index = 0 Then
    				_gearDialog.BtPrevious.Enabled = False
    			Else
    				_gearDialog.BtPrevious.Enabled = True
    			End If
    
    			If _gearDialog.ShowDialog = DialogResult.OK Then
    
    				'Me.LvGears.SelectedItems(0).SubItems(GearboxTbl.TorqueConverter).Text = "-"
    
    
    				LvGears.SelectedItems(0).SubItems(GearboxTbl.Ratio).Text = _gearDialog.TbRatio.Text
    				LvGears.SelectedItems(0).SubItems(GearboxTbl.LossMapEfficiency).Text = _gearDialog.TbMapPath.Text
    				LvGears.SelectedItems(0).SubItems(GearboxTbl.ShiftPolygons).Text = _gearDialog.TbShiftPolyFile.Text
    				LvGears.SelectedItems(0).SubItems(GearboxTbl.MaxTorque).Text = _gearDialog.TbMaxTorque.Text
    
    				UpdatePic()
    				Change()
    
    			Else
    
    				If LvGears.SelectedItems(0).SubItems(GearboxTbl.Ratio).Text = "" Then RemoveGear(True)
    
    			End If
    
    			If _gearDialog.NextGear Then
    				If LvGears.Items.Count - 1 = LvGears.SelectedIndices(0) Then AddGear()
    
    				LvGears.Items(LvGears.SelectedIndices(0) + 1).Selected = True
    			End If
    
    			If _gearDialog.PreviousGear AndAlso LvGears.SelectedIndices(0) > 0 Then
    				LvGears.Items(LvGears.SelectedIndices(0) - 1).Selected = True
    			End If
    
    		Loop Until Not (_gearDialog.NextGear OrElse _gearDialog.PreviousGear)
    	End Sub
    
    	'Add Gear
    	Private Sub AddGear()
    		Dim lvi As ListViewItem
    
    		lvi = CreateListviewItem(LvGears.Items.Count.ToString("00"), 1, "", "", "")
    
    		LvGears.Items.Add(lvi)
    
    		lvi.EnsureVisible()
    
    		LvGears.Focus()
    
    		'Change() => NO! Change() is already handled by EditGear
    	End Sub
    
    	'Remove Gear
    	Private Sub RemoveGear(noChange As Boolean)
    		Dim i0 As Integer
    		Dim i As Integer
    		Dim lv0 As ListViewItem
    
    		If LvGears.Items.Count < 2 Then Exit Sub
    
    		If LvGears.SelectedItems.Count = 0 Then LvGears.Items(LvGears.Items.Count - 1).Selected = True
    
    		i0 = LvGears.SelectedItems(0).Index
    
    		If i0 = 0 Then Exit Sub 'Must not remove axle
    
    		LvGears.SelectedItems(0).Remove()
    
    		i = 0
    		For Each lv0 In LvGears.Items
    			If lv0.SubItems(GearboxTbl.GearNr).Text = "Axle" Then Continue For
    			i += 1
    			lv0.SubItems(GearboxTbl.GearNr).Text = i.ToString("00")
    		Next
    
    		If i0 < LvGears.Items.Count Then
    			LvGears.Items(i0).Selected = True
    			LvGears.Items(i0).EnsureVisible()
    		End If
    
    		LvGears.Focus()
    		UpdatePic()
    
    		If Not noChange Then Change()
    	End Sub
    
    
    #End Region
    
    
    #Region "Open File Context Menu"
    
    	Private _contextMenuFiles 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
    
    
    	Private Sub UpdatePic()
    
    		Dim path As String
    
    		Dim chart As Chart
    		Dim s As Series
    		Dim a As ChartArea
    		Dim img As Bitmap
    		Dim gear As Integer
    		'Dim fullLoadCurve As EngineFullLoadCurve = Nothing
    		'Dim shiftOk As Boolean
    
    
    		PicBox.Image = Nothing
    
    		Dim shiftPolygon As ShiftPolygon = Nothing
    		'Dim engineFld As FullLoadCurve
    
    		If LvGears.Items.Count <= 1 Then Exit Sub
    
    		Try
    			If LvGears.SelectedItems.Count > 0 AndAlso LvGears.SelectedIndices(0) > 0 Then
    				path = FileRepl(LvGears.SelectedItems(0).SubItems(GearboxTbl.ShiftPolygons).Text, GetPath(_gbxFile))
    				gear = LvGears.SelectedIndices(0)
    			Else
    				path = FileRepl(LvGears.Items(1).SubItems(GearboxTbl.ShiftPolygons).Text, GetPath(_gbxFile))
    				gear = 1
    			End If
    
    			If File.Exists(path) Then shiftPolygon = ShiftPolygonReader.ReadFromFile(path)
    
    		Catch ex As Exception
    
    		End Try
    
    		chart = New Chart
    		chart.Width = PicBox.Width
    		chart.Height = PicBox.Height
    
    		a = New ChartArea
    
    		'Shiftpolygons from file
    
    		If Not shiftPolygon Is Nothing Then
    			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"
    			chart.Series.Add(s)
    
    			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"
    			chart.Series.Add(s)
    		End If
    
    		'Dim vectoJob As VectoJob = New VectoJob() With {.FilePath = VectoJobForm.VECTOfile}
    		'Dim vectoOk As Boolean = vectoJob.ReadFile()
    		Dim jobFile As String = VectoJobForm.VectoFile
    		If Not jobFile Is Nothing AndAlso File.Exists(jobFile) Then
    
    			Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadJsonJob(jobFile), 
    																	IEngineeringInputDataProvider)
    			If (inputData Is Nothing) Then
    				Exit Sub
    			End If
    			Dim vehicle As IVehicleEngineeringInputData = inputData.VehicleInputData
    			'inputData = TryCast(JSONInputDataFactory.ReadComponentData(vectoJob.PathEng(False)), IEngineeringInputDataProvider)
    			Dim engine As IEngineEngineeringInputData = inputData.EngineInputData
    			Dim engineFld As EngineFullLoadCurve = EngineFullLoadCurve.Create(engine.FullLoadCurve)
    
    
    			s = New Series
    			s.Points.DataBindXY(engineFld.FullLoadEntries.Select(Function(x) x.EngineSpeed.AsRPM).ToArray(),
    								engineFld.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)
    
    			If VectoJobForm.Visible AndAlso engine.IdleSpeed > 0 Then
    				'If FLD0.Init(VectoJobForm.n_idle) Then
    
    				'Dim fullLoadCurve As FullLoadCurve = ConvertToFullLoadCurve(FLD0.LnU, FLD0.LTq)
    				Dim gears As IList(Of ITransmissionInputData) = ConvertToGears(LvGears.Items)
    				Dim shiftLines As ShiftPolygon = GetShiftLines(engine.IdleSpeed, engineFld, vehicle, gears, gear)
    				If (CType(CbGStype.SelectedValue, GearboxType).ManualTransmission() AndAlso Not IsNothing(shiftLines)) Then
    
    
    					s = New Series
    
    					's.Points.DataBindXY(Shiftpoly.gs_nUup, Shiftpoly.gs_TqUp)
    					s.Points.DataBindXY(
    						shiftLines.Upshift.Select(Function(pt) pt.AngularSpeed.AsRPM).
    											ToArray(),
    						shiftLines.Upshift.Select(Function(pt) pt.Torque.Value()).ToArray())
    					s.ChartType = SeriesChartType.FastLine
    					s.BorderWidth = 2
    					s.Color = Color.DarkRed
    					s.BorderDashStyle = ChartDashStyle.Dash
    					s.Name = "Upshift curve (generic)"
    					chart.Series.Add(s)
    
    					s = New Series
    					's.Points.DataBindXY(Shiftpoly.gs_nUdown, Shiftpoly.gs_TqDown)
    					s.Points.DataBindXY(
    						shiftLines.Downshift.Select(Function(pt) pt.AngularSpeed.AsRPM) _
    											.ToArray(),
    						shiftLines.Downshift.Select(Function(pt) pt.Torque.Value()).ToArray())
    					s.ChartType = SeriesChartType.FastLine
    					s.BorderWidth = 2
    					s.Color = Color.DarkRed
    					s.BorderDashStyle = ChartDashStyle.Dash
    					s.Name = "Downshift curve (generic)"
    					chart.Series.Add(s)
    				End If
    				'End If
    			End If
    		End If
    
    		a.Name = "main"
    
    		a.AxisX.Title = "engine speed [1/min]"
    		a.AxisX.TitleFont = New Font("Helvetica", 10)
    		a.AxisX.LabelStyle.Font = New Font("Helvetica", 8)
    		a.AxisX.LabelAutoFitStyle = LabelAutoFitStyles.None
    		a.AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Dot
    
    		a.AxisY.Title = "engine torque [Nm]"
    		a.AxisY.TitleFont = New Font("Helvetica", 10)
    		a.AxisY.LabelStyle.Font = New Font("Helvetica", 8)
    		a.AxisY.LabelAutoFitStyle = LabelAutoFitStyles.None
    		a.AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dot
    
    		a.AxisX.Minimum = 300
    		a.BorderDashStyle = ChartDashStyle.Solid
    		a.BorderWidth = 1
    
    		a.BackColor = Color.GhostWhite
    
    		chart.ChartAreas.Add(a)
    
    		chart.Titles.Add("Gear " & gear & " shift polygons")
    		chart.Titles(0).Font = New Font("Helvetica", 12)
    
    		chart.Update()
    
    		img = 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 Function GetShiftLines(ByVal idleSpeed As PerSecond, engineFullLoadCurve As EngineFullLoadCurve,
    									vehicle As IVehicleEngineeringInputData, gears As IList(Of ITransmissionInputData), ByVal gear As Integer) _
    		As ShiftPolygon
    		Dim engine As CombustionEngineData = ConvertToEngineData(engineFullLoadCurve, idleSpeed)
    		If gears.Count <= 1 Then
    			Return Nothing
    		End If
    		Dim rDyn As Meter = vehicle.DynamicTyreRadius
    		If rDyn.IsEqual(0) Then
    			If (vehicle.Axles.Count < 2) Then
    				Return Nothing
    			End If
    			rDyn = DeclarationData.Wheels.Lookup(vehicle.Axles(1).Wheels).DynamicTyreRadius
    		End If
    		If (rDyn.IsEqual(0)) Then
    			Return Nothing
    		End If
    		Dim shiftLines As ShiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gear - 1, engine.FullLoadCurve, gears,
    																					engine,
    																					Double.Parse(LvGears.Items(0).SubItems(GearboxTbl.Ratio).Text, CultureInfo.InvariantCulture),
    																					(rDyn))
    		Return shiftLines
    	End Function
    
    	Private Function ConvertToGears(gbx As ListView.ListViewItemCollection) As IList(Of ITransmissionInputData)
    		Dim retVal As List(Of ITransmissionInputData) = New List(Of ITransmissionInputData)
    		Dim value As Double
    
    		For i As Integer = 1 To gbx.Count - 1
    			If _
    				gbx(i).SubItems(GearboxTbl.Ratio).Text <> "" AndAlso Double.TryParse(gbx(i).SubItems(GearboxTbl.Ratio).Text, value) _
    				Then
    				retVal.Add(
    					New TransmissionInputData() _
    							With {.Ratio = value})
    
    			End If
    		Next
    		Return retVal
    	End Function
    
    
    #Region "Torque Converter"
    
    
    	'Browse TC file
    	Private Sub BtTCfileBrowse_Click(sender As Object, e As EventArgs) Handles BtTCfileBrowse.Click
    		If TorqueConverterFileBrowser.OpenDialog(FileRepl(TbTCfile.Text, GetPath(_gbxFile))) Then
    			TbTCfile.Text = GetFilenameWithoutDirectory(TorqueConverterFileBrowser.Files(0), GetPath(_gbxFile))
    		End If
    	End Sub
    
    	'Open TC file
    	Private Sub BtTCfileOpen_Click(sender As Object, e As EventArgs) Handles BtTCfileOpen.Click
    		OpenFiles(FileRepl(TbTCfile.Text, GetPath(_gbxFile)))
    	End Sub
    
    
    #End Region
    
    	Private Sub GroupBox1_Enter(sender As Object, e As EventArgs) Handles GroupBox1.Enter
    	End Sub
    
    	Public Sub New()
    
    		' Dieser Aufruf ist für den Designer erforderlich.
    		InitializeComponent()
    
    		' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    	End Sub
    
    	Private Sub BtTCShiftFileBrowse_Click(sender As Object, e As EventArgs) Handles BtTCShiftFileBrowse.Click
    		If TorqueConverterShiftPolygonFileBrowser.OpenDialog(FileRepl(TBTCShiftPolygon.Text, GetPath(_gbxFile))) Then
    			TBTCShiftPolygon.Text = GetFilenameWithoutDirectory(TorqueConverterShiftPolygonFileBrowser.Files(0),
    																GetPath(_gbxFile))
    		End If
    	End Sub
    End Class