From cca7f282abdf5f95038e00b7bf985fb54de54887 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Wed, 15 Nov 2017 13:57:05 +0100 Subject: [PATCH] renaming ETPT to VTP, refactoring: new cycle format, aux handling (speed dependent), correction of engine fan equation --- Documentation/VectoHashingTool/convert.bat | 2 +- VECTO.sln | 47 +- VECTO.sln.DotSettings | 1 + VECTO/GUI/MainForm.Designer.vb | 2 +- VECTO/GUI/MainForm.vb | 20 +- ...esigner.vb => VectoVTPJobForm.Designer.vb} | 256 ++-- ...oEPTPJobForm.resx => VectoVTPJobForm.resx} | 258 ---- ...VectoEPTPJobForm.vb => VectoVTPJobForm.vb} | 14 +- VECTO/Input Files/VectoEPTPJob.vb | 30 +- VECTO/OutputData/JSONFileWriter.vb | 5 +- VECTO/Resources/P_fan_eqn.png | Bin 8590 -> 9516 bytes VECTO/VECTO.vbproj | 12 +- .../InputData/EngineeringInputData.cs | 2 +- .../InputData/IInputDataProvider.cs | 10 +- .../OutputData/IOutputFileWriter.cs | 2 +- VectoCommon/VectoHashing/IVectoHash.cs | 2 +- .../InputData/FileIO/JSON/JSONInputData.cs | 1245 +++++++++-------- .../FileIO/JSON/JSONInputDataFactory.cs | 2 +- .../Reader/DrivingCycleDataReader.cs | 64 +- ... EngineeringVTPModeVectoRunDataFactory.cs} | 34 +- .../Models/Simulation/Data/VectoRunData.cs | 11 +- .../Simulation/Impl/PowertrainBuilder.cs | 66 +- .../Simulation/Impl/SimulatorFactory.cs | 8 +- .../Simulation/Impl/VehicleContainer.cs | 2 +- .../SimulationComponent/Data/AuxiliaryData.cs | 174 +-- .../Data/DrivingCycleData.cs | 4 +- .../Impl/EPTPCombustionEngine.cs | 78 -- .../Impl/EngineFanAuxiliary.cs | 27 + .../Impl/VTPCombustionEngine.cs | 21 + .../Impl/{EPTPCycle.cs => VTPCycle.cs} | 20 +- .../Resources/Declaration/VAUX/HVAC-Table.csv | 8 +- .../Resources/Declaration/VAUX/SP-Table.csv | 6 +- VectoCore/VectoCore/VectoCore.csproj | 7 +- .../SimulationComponent/EngineFanAuxTest.cs | 23 + VectoCore/VectoCoreTest/VectoCoreTest.csproj | 1 + 35 files changed, 1162 insertions(+), 1302 deletions(-) rename VECTO/GUI/{VectoEPTPJobForm.Designer.vb => VectoVTPJobForm.Designer.vb} (77%) rename VECTO/GUI/{VectoEPTPJobForm.resx => VectoVTPJobForm.resx} (55%) rename VECTO/GUI/{VectoEPTPJobForm.vb => VectoVTPJobForm.vb} (98%) rename VectoCore/VectoCore/InputData/Reader/Impl/{EngineeringEPTPModeVectoRunDataFactory.cs => EngineeringVTPModeVectoRunDataFactory.cs} (73%) delete mode 100644 VectoCore/VectoCore/Models/SimulationComponent/Impl/EPTPCombustionEngine.cs create mode 100644 VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineFanAuxiliary.cs create mode 100644 VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCombustionEngine.cs rename VectoCore/VectoCore/Models/SimulationComponent/Impl/{EPTPCycle.cs => VTPCycle.cs} (90%) create mode 100644 VectoCore/VectoCoreTest/Models/SimulationComponent/EngineFanAuxTest.cs diff --git a/Documentation/VectoHashingTool/convert.bat b/Documentation/VectoHashingTool/convert.bat index bcd246ff86..70a31cd5a9 100644 --- a/Documentation/VectoHashingTool/convert.bat +++ b/Documentation/VectoHashingTool/convert.bat @@ -8,7 +8,7 @@ set LIST= for /f %%f in (files.txt) do set LIST=!LIST! "%%f" -REM pandoc --verbose -f markdown+raw_html %LIST% -s -S --toc --toc-depth=2 --self-contained --email-obfuscation=none --section-divs --mathjax=includes/mathjax.js -c includes/style.css -c includes/print.css -B includes/header.html -A includes/footer.html -o help.html -H includes/jquery.js -H includes/jquery-ui.js -H includes/include.js +REM pandoc --verbose -f markdown+raw_html %LIST% -s --toc --toc-depth=2 --self-contained --email-obfuscation=none --section-divs --mathjax=includes/mathjax.js -c includes/style.css -c includes/print.css -B includes/header.html -A includes/footer.html -o help.html -H includes/jquery.js -H includes/jquery-ui.js -H includes/include.js %LOCALAPPDATA%\Pandoc\pandoc --verbose -f markdown+raw_html %LIST% -s -S --toc --toc-depth=2 --self-contained --email-obfuscation=none --section-divs --webtex -c includes/style.css -c includes/print.css -B includes/header.html -A includes/footer.html -o HashingToolHelp.html -H includes/jquery.js -H includes/jquery-ui.js -H includes/include.js REM pandoc %LIST% -s -S --toc --toc-depth=2 --self-contained --email-obfuscation=none --section-divs --webtex -c includes/style.css -B includes/header.html -A includes/footer.html -o help.html -H includes/jquery.js -H includes/jquery-ui.js -H includes/include.js diff --git a/VECTO.sln b/VECTO.sln index d3fe7288cf..9f48ecc4f6 100644 --- a/VECTO.sln +++ b/VECTO.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "VECTO", "VECTO\VECTO.vbproj", "{AAC0F132-0A9F-45B3-B682-77AC9B24B352}" ProjectSection(ProjectDependencies) = postProject @@ -144,8 +144,8 @@ Global {FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.DebugTUG|Any CPU.Build.0 = Debug|Any CPU {FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.DebugTUG|x86.ActiveCfg = Debug|Any CPU - {FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Deploy|Any CPU.ActiveCfg = Release|Any CPU + {FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Deploy|Any CPU.Build.0 = Release|Any CPU {FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Deploy|x64.ActiveCfg = Debug|Any CPU {FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Deploy|x86.ActiveCfg = Debug|Any CPU {FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -172,8 +172,8 @@ Global {CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.DebugTUG|Any CPU.Build.0 = Debug|Any CPU {CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.DebugTUG|x86.ActiveCfg = Debug|Any CPU - {CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Deploy|Any CPU.ActiveCfg = Release|Any CPU + {CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Deploy|Any CPU.Build.0 = Release|Any CPU {CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Deploy|x64.ActiveCfg = Debug|Any CPU {CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Deploy|x86.ActiveCfg = Debug|Any CPU {CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -199,7 +199,6 @@ Global {6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Deploy|Any CPU.Build.0 = Debug|Any CPU {6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Deploy|x64.ActiveCfg = Debug|Any CPU {6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Deploy|x86.ActiveCfg = Debug|Any CPU {6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -227,7 +226,6 @@ Global {6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Deploy|Any CPU.Build.0 = Debug|Any CPU {6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Deploy|x64.ActiveCfg = Debug|Any CPU {6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Deploy|x86.ActiveCfg = Debug|Any CPU {6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -273,8 +271,8 @@ Global {B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.DebugTUG|Any CPU.Build.0 = Debug|Any CPU {B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.DebugTUG|x86.ActiveCfg = Debug|Any CPU - {B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Deploy|Any CPU.ActiveCfg = Release|Any CPU + {B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Deploy|Any CPU.Build.0 = Release|Any CPU {B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Deploy|x64.ActiveCfg = Debug|Any CPU {B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Deploy|x86.ActiveCfg = Debug|Any CPU {B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -301,8 +299,8 @@ Global {60AD4DF0-6648-4374-83CB-C7A162EFB391}.DebugTUG|Any CPU.Build.0 = Debug|Any CPU {60AD4DF0-6648-4374-83CB-C7A162EFB391}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {60AD4DF0-6648-4374-83CB-C7A162EFB391}.DebugTUG|x86.ActiveCfg = Debug|Any CPU - {60AD4DF0-6648-4374-83CB-C7A162EFB391}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {60AD4DF0-6648-4374-83CB-C7A162EFB391}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {60AD4DF0-6648-4374-83CB-C7A162EFB391}.Deploy|Any CPU.ActiveCfg = Release|Any CPU + {60AD4DF0-6648-4374-83CB-C7A162EFB391}.Deploy|Any CPU.Build.0 = Release|Any CPU {60AD4DF0-6648-4374-83CB-C7A162EFB391}.Deploy|x64.ActiveCfg = Debug|Any CPU {60AD4DF0-6648-4374-83CB-C7A162EFB391}.Deploy|x86.ActiveCfg = Debug|Any CPU {60AD4DF0-6648-4374-83CB-C7A162EFB391}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -330,7 +328,6 @@ Global {6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Deploy|Any CPU.Build.0 = Debug|Any CPU {6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Deploy|x64.ActiveCfg = Debug|Any CPU {6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Deploy|x86.ActiveCfg = Debug|Any CPU {6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -358,7 +355,6 @@ Global {2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Deploy|Any CPU.Build.0 = Debug|Any CPU {2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Deploy|x64.ActiveCfg = Debug|Any CPU {2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Deploy|x86.ActiveCfg = Debug|Any CPU {2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -386,7 +382,6 @@ Global {E8B0B447-1A54-4BEC-A160-AF0017000781}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {E8B0B447-1A54-4BEC-A160-AF0017000781}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {E8B0B447-1A54-4BEC-A160-AF0017000781}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {E8B0B447-1A54-4BEC-A160-AF0017000781}.Deploy|Any CPU.Build.0 = Debug|Any CPU {E8B0B447-1A54-4BEC-A160-AF0017000781}.Deploy|x64.ActiveCfg = Debug|Any CPU {E8B0B447-1A54-4BEC-A160-AF0017000781}.Deploy|x86.ActiveCfg = Debug|Any CPU {E8B0B447-1A54-4BEC-A160-AF0017000781}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -411,8 +406,8 @@ Global {79A066AD-69A9-4223-90F6-6ED5D2D084F4}.DebugTUG|Any CPU.Build.0 = Debug|Any CPU {79A066AD-69A9-4223-90F6-6ED5D2D084F4}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {79A066AD-69A9-4223-90F6-6ED5D2D084F4}.DebugTUG|x86.ActiveCfg = Debug|Any CPU - {79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Deploy|Any CPU.ActiveCfg = Release|Any CPU + {79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Deploy|Any CPU.Build.0 = Release|Any CPU {79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Deploy|x64.ActiveCfg = Debug|Any CPU {79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Deploy|x86.ActiveCfg = Debug|Any CPU {79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -437,7 +432,6 @@ Global {A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Deploy|Any CPU.Build.0 = Debug|Any CPU {A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Deploy|x64.ActiveCfg = Debug|Any CPU {A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Deploy|x86.ActiveCfg = Debug|Any CPU {A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -485,7 +479,6 @@ Global {D959CB7C-F514-4F5E-9C33-684D0012474B}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {D959CB7C-F514-4F5E-9C33-684D0012474B}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {D959CB7C-F514-4F5E-9C33-684D0012474B}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {D959CB7C-F514-4F5E-9C33-684D0012474B}.Deploy|Any CPU.Build.0 = Debug|Any CPU {D959CB7C-F514-4F5E-9C33-684D0012474B}.Deploy|x64.ActiveCfg = Debug|Any CPU {D959CB7C-F514-4F5E-9C33-684D0012474B}.Deploy|x86.ActiveCfg = Debug|Any CPU {D959CB7C-F514-4F5E-9C33-684D0012474B}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -509,7 +502,6 @@ Global {41314A40-AB3E-4F43-B1A4-58443F4014F2}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {41314A40-AB3E-4F43-B1A4-58443F4014F2}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {41314A40-AB3E-4F43-B1A4-58443F4014F2}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {41314A40-AB3E-4F43-B1A4-58443F4014F2}.Deploy|Any CPU.Build.0 = Debug|Any CPU {41314A40-AB3E-4F43-B1A4-58443F4014F2}.Deploy|x64.ActiveCfg = Debug|Any CPU {41314A40-AB3E-4F43-B1A4-58443F4014F2}.Deploy|x86.ActiveCfg = Debug|Any CPU {41314A40-AB3E-4F43-B1A4-58443F4014F2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -556,7 +548,6 @@ Global {2C58BA97-2954-4D19-920F-A24B78FC80A4}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {2C58BA97-2954-4D19-920F-A24B78FC80A4}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {2C58BA97-2954-4D19-920F-A24B78FC80A4}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {2C58BA97-2954-4D19-920F-A24B78FC80A4}.Deploy|Any CPU.Build.0 = Debug|Any CPU {2C58BA97-2954-4D19-920F-A24B78FC80A4}.Deploy|x64.ActiveCfg = Debug|Any CPU {2C58BA97-2954-4D19-920F-A24B78FC80A4}.Deploy|x86.ActiveCfg = Debug|Any CPU {2C58BA97-2954-4D19-920F-A24B78FC80A4}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -580,7 +571,6 @@ Global {7C364099-9B85-473A-8A42-BBEBE4798FF5}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {7C364099-9B85-473A-8A42-BBEBE4798FF5}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {7C364099-9B85-473A-8A42-BBEBE4798FF5}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {7C364099-9B85-473A-8A42-BBEBE4798FF5}.Deploy|Any CPU.Build.0 = Debug|Any CPU {7C364099-9B85-473A-8A42-BBEBE4798FF5}.Deploy|x64.ActiveCfg = Debug|Any CPU {7C364099-9B85-473A-8A42-BBEBE4798FF5}.Deploy|x86.ActiveCfg = Debug|Any CPU {7C364099-9B85-473A-8A42-BBEBE4798FF5}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -604,8 +594,8 @@ Global {B673E12F-D323-4C4C-8805-9915B2C72D3D}.DebugTUG|Any CPU.Build.0 = Debug|Any CPU {B673E12F-D323-4C4C-8805-9915B2C72D3D}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {B673E12F-D323-4C4C-8805-9915B2C72D3D}.DebugTUG|x86.ActiveCfg = Debug|Any CPU - {B673E12F-D323-4C4C-8805-9915B2C72D3D}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {B673E12F-D323-4C4C-8805-9915B2C72D3D}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {B673E12F-D323-4C4C-8805-9915B2C72D3D}.Deploy|Any CPU.ActiveCfg = Release|Any CPU + {B673E12F-D323-4C4C-8805-9915B2C72D3D}.Deploy|Any CPU.Build.0 = Release|Any CPU {B673E12F-D323-4C4C-8805-9915B2C72D3D}.Deploy|x64.ActiveCfg = Debug|Any CPU {B673E12F-D323-4C4C-8805-9915B2C72D3D}.Deploy|x86.ActiveCfg = Debug|Any CPU {B673E12F-D323-4C4C-8805-9915B2C72D3D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -631,7 +621,6 @@ Global {760C1C5B-A767-463E-BA85-F0BCFC23A550}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {760C1C5B-A767-463E-BA85-F0BCFC23A550}.DebugTUG|x86.ActiveCfg = Debug|Any CPU {760C1C5B-A767-463E-BA85-F0BCFC23A550}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {760C1C5B-A767-463E-BA85-F0BCFC23A550}.Deploy|Any CPU.Build.0 = Debug|Any CPU {760C1C5B-A767-463E-BA85-F0BCFC23A550}.Deploy|x64.ActiveCfg = Debug|Any CPU {760C1C5B-A767-463E-BA85-F0BCFC23A550}.Deploy|x86.ActiveCfg = Debug|Any CPU {760C1C5B-A767-463E-BA85-F0BCFC23A550}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -656,8 +645,8 @@ Global {E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.DebugTUG|Any CPU.Build.0 = Debug|Any CPU {E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.DebugTUG|x86.ActiveCfg = Debug|Any CPU - {E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU + {E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Deploy|Any CPU.Build.0 = Deploy|Any CPU {E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Deploy|x64.ActiveCfg = Debug|Any CPU {E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Deploy|x86.ActiveCfg = Debug|Any CPU {E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -682,8 +671,8 @@ Global {33F9848E-9257-4BE2-915F-68E748AEB204}.DebugTUG|Any CPU.Build.0 = Debug|Any CPU {33F9848E-9257-4BE2-915F-68E748AEB204}.DebugTUG|x64.ActiveCfg = Debug|Any CPU {33F9848E-9257-4BE2-915F-68E748AEB204}.DebugTUG|x86.ActiveCfg = Debug|Any CPU - {33F9848E-9257-4BE2-915F-68E748AEB204}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {33F9848E-9257-4BE2-915F-68E748AEB204}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {33F9848E-9257-4BE2-915F-68E748AEB204}.Deploy|Any CPU.ActiveCfg = Release|Any CPU + {33F9848E-9257-4BE2-915F-68E748AEB204}.Deploy|Any CPU.Build.0 = Release|Any CPU {33F9848E-9257-4BE2-915F-68E748AEB204}.Deploy|x64.ActiveCfg = Debug|Any CPU {33F9848E-9257-4BE2-915F-68E748AEB204}.Deploy|x86.ActiveCfg = Debug|Any CPU {33F9848E-9257-4BE2-915F-68E748AEB204}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/VECTO.sln.DotSettings b/VECTO.sln.DotSettings index 34ea44b952..a8f645b18f 100644 --- a/VECTO.sln.DotSettings +++ b/VECTO.sln.DotSettings @@ -35,6 +35,7 @@ <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PTO/@EntryIndexedValue">PTO</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RP/@EntryIndexedValue">RP</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SI/@EntryIndexedValue">SI</s:String> + <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VTP/@EntryIndexedValue">VTP</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WHTC/@EntryIndexedValue">WHTC</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=XML/@EntryIndexedValue">XML</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=XSD/@EntryIndexedValue">XSD</s:String> diff --git a/VECTO/GUI/MainForm.Designer.vb b/VECTO/GUI/MainForm.Designer.vb index f54f394102..dff52a9b7b 100644 --- a/VECTO/GUI/MainForm.Designer.vb +++ b/VECTO/GUI/MainForm.Designer.vb @@ -700,7 +700,7 @@ Partial Class MainForm Me.EPTPJobEditorToolStripMenuItem.Image = Global.TUGraz.VECTO.My.Resources.Resources.F_VECTO Me.EPTPJobEditorToolStripMenuItem.Name = "EPTPJobEditorToolStripMenuItem" Me.EPTPJobEditorToolStripMenuItem.Size = New System.Drawing.Size(156, 22) - Me.EPTPJobEditorToolStripMenuItem.Text = "EPTP Job Editor" + Me.EPTPJobEditorToolStripMenuItem.Text = "VTP Job Editor" ' 'VEHEditorToolStripMenuItem ' diff --git a/VECTO/GUI/MainForm.vb b/VECTO/GUI/MainForm.vb index d8802473ae..36bf080410 100644 --- a/VECTO/GUI/MainForm.vb +++ b/VECTO/GUI/MainForm.vb @@ -1271,18 +1271,18 @@ lbFound: If x = "<New>" Then ShowVectoJobForm() VectoJobForm.VectoNew() - ElseIf x = "<EPTP>" Then + ElseIf x = "<VTP>" Then ShowVectoEPTPJobForm() - VectoEPTPJobForm.VectoNew() + VectoVTPJobForm.VectoNew() Else Try - Dim job As IEPTPInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(x), IEPTPInputDataProvider) + Dim job As IVTPInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(x), IVTPInputDataProvider) If job Is Nothing Then ShowVectoJobForm() VectoJobForm.VECTOload2Form(x) Else ShowVectoEPTPJobForm() - VectoEPTPJobForm.VECTOload2Form(x) + VectoVTPJobForm.VECTOload2Form(x) End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Error loading Vecto Job File") @@ -1302,12 +1302,12 @@ lbFound: End Sub Private Sub ShowVectoEPTPJobForm() - If Not VectoEPTPJobForm.Visible Then - VectoEPTPJobForm.Show() + If Not VectoVTPJobForm.Visible Then + VectoVTPJobForm.Show() Else - If VectoEPTPJobForm.WindowState = FormWindowState.Minimized Then _ - VectoEPTPJobForm.WindowState = FormWindowState.Normal - VectoEPTPJobForm.BringToFront() + If VectoVTPJobForm.WindowState = FormWindowState.Minimized Then _ + VectoVTPJobForm.WindowState = FormWindowState.Normal + VectoVTPJobForm.BringToFront() End If End Sub @@ -2030,7 +2030,7 @@ Lb1: Private Sub EPTPJobEditorToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles EPTPJobEditorToolStripMenuItem.Click - OpenVECTOeditor("<EPTP>") + OpenVECTOeditor("<VTP>") End Sub End Class diff --git a/VECTO/GUI/VectoEPTPJobForm.Designer.vb b/VECTO/GUI/VectoVTPJobForm.Designer.vb similarity index 77% rename from VECTO/GUI/VectoEPTPJobForm.Designer.vb rename to VECTO/GUI/VectoVTPJobForm.Designer.vb index 4aa60fd6d3..3f8c030922 100644 --- a/VECTO/GUI/VectoEPTPJobForm.Designer.vb +++ b/VECTO/GUI/VectoVTPJobForm.Designer.vb @@ -2,7 +2,7 @@ Imports Microsoft.VisualBasic.CompilerServices <DesignerGenerated()> _ -Partial Class VectoEPTPJobForm +Partial Class VectoVTPJobForm Inherits Form 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. @@ -26,18 +26,18 @@ Partial Class VectoEPTPJobForm <DebuggerStepThrough()> _ Private Sub InitializeComponent() Me.components = New System.ComponentModel.Container() - Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(VectoEPTPJobForm)) + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(VectoVTPJobForm)) Me.GrCycles = New System.Windows.Forms.GroupBox() Me.Label2 = New System.Windows.Forms.Label() Me.LvCycles = New System.Windows.Forms.ListView() - Me.ColumnHeader1 = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) + Me.ColumnHeader1 = CType(New System.Windows.Forms.ColumnHeader(),System.Windows.Forms.ColumnHeader) Me.BtDRIrem = New System.Windows.Forms.Button() Me.BtDRIadd = New System.Windows.Forms.Button() Me.GrAux = New System.Windows.Forms.GroupBox() Me.LvAux = New System.Windows.Forms.ListView() - Me.ColumnHeader4 = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) - Me.ColumnHeader5 = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) - Me.ColumnHeader6 = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) + Me.ColumnHeader4 = CType(New System.Windows.Forms.ColumnHeader(),System.Windows.Forms.ColumnHeader) + Me.ColumnHeader5 = CType(New System.Windows.Forms.ColumnHeader(),System.Windows.Forms.ColumnHeader) + Me.ColumnHeader6 = CType(New System.Windows.Forms.ColumnHeader(),System.Windows.Forms.ColumnHeader) Me.TbVEH = New System.Windows.Forms.TextBox() Me.ButtonVEH = New System.Windows.Forms.Button() Me.StatusStrip1 = New System.Windows.Forms.StatusStrip() @@ -69,6 +69,8 @@ Partial Class VectoEPTPJobForm Me.lblEngineCharacteristics = New System.Windows.Forms.Label() Me.PictureBox2 = New System.Windows.Forms.PictureBox() Me.GroupBox1 = New System.Windows.Forms.GroupBox() + Me.tbFanDiameter = New System.Windows.Forms.TextBox() + Me.Label6 = New System.Windows.Forms.Label() Me.tbC3 = New System.Windows.Forms.TextBox() Me.Label4 = New System.Windows.Forms.Label() Me.tbC2 = New System.Windows.Forms.TextBox() @@ -76,22 +78,23 @@ Partial Class VectoEPTPJobForm Me.tbC1 = New System.Windows.Forms.TextBox() Me.Label1 = New System.Windows.Forms.Label() Me.Label5 = New System.Windows.Forms.Label() - Me.GrCycles.SuspendLayout() - Me.GrAux.SuspendLayout() - Me.StatusStrip1.SuspendLayout() - Me.ToolStrip1.SuspendLayout() - CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).BeginInit() - Me.CmOpenFile.SuspendLayout() - CType(Me.PicVehicle, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.PicBox, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.PictureBox2, System.ComponentModel.ISupportInitialize).BeginInit() - Me.GroupBox1.SuspendLayout() - Me.SuspendLayout() + Me.Label7 = New System.Windows.Forms.Label() + Me.GrCycles.SuspendLayout + Me.GrAux.SuspendLayout + Me.StatusStrip1.SuspendLayout + Me.ToolStrip1.SuspendLayout + CType(Me.PictureBox1,System.ComponentModel.ISupportInitialize).BeginInit + Me.CmOpenFile.SuspendLayout + CType(Me.PicVehicle,System.ComponentModel.ISupportInitialize).BeginInit + CType(Me.PicBox,System.ComponentModel.ISupportInitialize).BeginInit + CType(Me.PictureBox2,System.ComponentModel.ISupportInitialize).BeginInit + Me.GroupBox1.SuspendLayout + Me.SuspendLayout ' 'GrCycles ' - Me.GrCycles.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.GrCycles.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) Me.GrCycles.Controls.Add(Me.Label2) Me.GrCycles.Controls.Add(Me.LvCycles) Me.GrCycles.Controls.Add(Me.BtDRIrem) @@ -100,14 +103,14 @@ Partial Class VectoEPTPJobForm Me.GrCycles.Name = "GrCycles" Me.GrCycles.Size = New System.Drawing.Size(515, 138) Me.GrCycles.TabIndex = 10 - Me.GrCycles.TabStop = False + Me.GrCycles.TabStop = false Me.GrCycles.Text = "Cycles" ' 'Label2 ' - Me.Label2.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.Label2.AutoSize = True + Me.Label2.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.Label2.AutoSize = true Me.Label2.Location = New System.Drawing.Point(391, 109) Me.Label2.Name = "Label2" Me.Label2.Size = New System.Drawing.Size(118, 13) @@ -116,22 +119,22 @@ Partial Class VectoEPTPJobForm ' 'LvCycles ' - Me.LvCycles.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ - Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.LvCycles.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) Me.LvCycles.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader1}) - Me.LvCycles.FullRowSelect = True - Me.LvCycles.GridLines = True + Me.LvCycles.FullRowSelect = true + Me.LvCycles.GridLines = true Me.LvCycles.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None - Me.LvCycles.HideSelection = False - Me.LvCycles.LabelEdit = True + Me.LvCycles.HideSelection = false + Me.LvCycles.LabelEdit = true Me.LvCycles.Location = New System.Drawing.Point(6, 19) - Me.LvCycles.MultiSelect = False + Me.LvCycles.MultiSelect = false Me.LvCycles.Name = "LvCycles" Me.LvCycles.Size = New System.Drawing.Size(503, 89) Me.LvCycles.TabIndex = 0 - Me.LvCycles.TabStop = False - Me.LvCycles.UseCompatibleStateImageBehavior = False + Me.LvCycles.TabStop = false + Me.LvCycles.UseCompatibleStateImageBehavior = false Me.LvCycles.View = System.Windows.Forms.View.Details ' 'ColumnHeader1 @@ -141,54 +144,54 @@ Partial Class VectoEPTPJobForm ' 'BtDRIrem ' - Me.BtDRIrem.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.BtDRIrem.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) Me.BtDRIrem.Image = Global.TUGraz.VECTO.My.Resources.Resources.minus_circle_icon Me.BtDRIrem.Location = New System.Drawing.Point(29, 109) Me.BtDRIrem.Name = "BtDRIrem" Me.BtDRIrem.Size = New System.Drawing.Size(24, 24) Me.BtDRIrem.TabIndex = 2 - Me.BtDRIrem.UseVisualStyleBackColor = True + Me.BtDRIrem.UseVisualStyleBackColor = true ' 'BtDRIadd ' - Me.BtDRIadd.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.BtDRIadd.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) Me.BtDRIadd.Image = Global.TUGraz.VECTO.My.Resources.Resources.plus_circle_icon Me.BtDRIadd.Location = New System.Drawing.Point(5, 109) Me.BtDRIadd.Name = "BtDRIadd" Me.BtDRIadd.Size = New System.Drawing.Size(24, 24) Me.BtDRIadd.TabIndex = 1 - Me.BtDRIadd.UseVisualStyleBackColor = True + Me.BtDRIadd.UseVisualStyleBackColor = true ' 'GrAux ' - Me.GrAux.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.GrAux.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) Me.GrAux.Controls.Add(Me.LvAux) Me.GrAux.Location = New System.Drawing.Point(12, 114) Me.GrAux.Name = "GrAux" Me.GrAux.Size = New System.Drawing.Size(515, 140) Me.GrAux.TabIndex = 9 - Me.GrAux.TabStop = False + Me.GrAux.TabStop = false Me.GrAux.Text = "Auxiliaries" ' 'LvAux ' - Me.LvAux.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ - Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.LvAux.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) Me.LvAux.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader4, Me.ColumnHeader5, Me.ColumnHeader6}) - Me.LvAux.FullRowSelect = True - Me.LvAux.GridLines = True - Me.LvAux.HideSelection = False + Me.LvAux.FullRowSelect = true + Me.LvAux.GridLines = true + Me.LvAux.HideSelection = false Me.LvAux.Location = New System.Drawing.Point(4, 19) - Me.LvAux.MultiSelect = False + Me.LvAux.MultiSelect = false Me.LvAux.Name = "LvAux" Me.LvAux.Size = New System.Drawing.Size(503, 115) Me.LvAux.TabIndex = 0 - Me.LvAux.TabStop = False - Me.LvAux.UseCompatibleStateImageBehavior = False + Me.LvAux.TabStop = false + Me.LvAux.UseCompatibleStateImageBehavior = false Me.LvAux.View = System.Windows.Forms.View.Details ' 'ColumnHeader4 @@ -208,8 +211,8 @@ Partial Class VectoEPTPJobForm ' 'TbVEH ' - Me.TbVEH.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.TbVEH.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) Me.TbVEH.Location = New System.Drawing.Point(90, 86) Me.TbVEH.Name = "TbVEH" Me.TbVEH.Size = New System.Drawing.Size(411, 20) @@ -217,14 +220,14 @@ Partial Class VectoEPTPJobForm ' 'ButtonVEH ' - Me.ButtonVEH.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.ButtonVEH.Image = CType(resources.GetObject("ButtonVEH.Image"), System.Drawing.Image) + Me.ButtonVEH.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.ButtonVEH.Image = CType(resources.GetObject("ButtonVEH.Image"),System.Drawing.Image) Me.ButtonVEH.Location = New System.Drawing.Point(502, 84) Me.ButtonVEH.Name = "ButtonVEH" Me.ButtonVEH.Size = New System.Drawing.Size(24, 24) Me.ButtonVEH.TabIndex = 2 - Me.ButtonVEH.TabStop = False - Me.ButtonVEH.UseVisualStyleBackColor = True + Me.ButtonVEH.TabStop = false + Me.ButtonVEH.UseVisualStyleBackColor = true ' 'StatusStrip1 ' @@ -232,7 +235,7 @@ Partial Class VectoEPTPJobForm Me.StatusStrip1.Location = New System.Drawing.Point(0, 568) Me.StatusStrip1.Name = "StatusStrip1" Me.StatusStrip1.Size = New System.Drawing.Size(944, 22) - Me.StatusStrip1.SizingGrip = False + Me.StatusStrip1.SizingGrip = false Me.StatusStrip1.TabIndex = 6 Me.StatusStrip1.Text = "StatusStrip1" ' @@ -244,24 +247,24 @@ Partial Class VectoEPTPJobForm ' 'ButOK ' - Me.ButOK.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.ButOK.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) Me.ButOK.Location = New System.Drawing.Point(778, 541) Me.ButOK.Name = "ButOK" Me.ButOK.Size = New System.Drawing.Size(75, 23) Me.ButOK.TabIndex = 0 Me.ButOK.Text = "Save" - Me.ButOK.UseVisualStyleBackColor = True + Me.ButOK.UseVisualStyleBackColor = true ' 'ButCancel ' - Me.ButCancel.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.ButCancel.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) Me.ButCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.ButCancel.Location = New System.Drawing.Point(859, 541) Me.ButCancel.Name = "ButCancel" Me.ButCancel.Size = New System.Drawing.Size(75, 23) Me.ButCancel.TabIndex = 1 Me.ButCancel.Text = "Cancel" - Me.ButCancel.UseVisualStyleBackColor = True + Me.ButCancel.UseVisualStyleBackColor = true ' 'ToolStrip1 ' @@ -344,21 +347,21 @@ Partial Class VectoEPTPJobForm ' 'PictureBox1 ' - Me.PictureBox1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.PictureBox1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) Me.PictureBox1.BackColor = System.Drawing.Color.White Me.PictureBox1.Image = Global.TUGraz.VECTO.My.Resources.Resources.VECTO_VECTO Me.PictureBox1.Location = New System.Drawing.Point(0, 28) Me.PictureBox1.Name = "PictureBox1" Me.PictureBox1.Size = New System.Drawing.Size(944, 40) Me.PictureBox1.TabIndex = 21 - Me.PictureBox1.TabStop = False + Me.PictureBox1.TabStop = false ' 'CmOpenFile ' Me.CmOpenFile.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.OpenWithToolStripMenuItem, Me.ShowInFolderToolStripMenuItem}) Me.CmOpenFile.Name = "CmOpenFile" - Me.CmOpenFile.ShowImageMargin = False + Me.CmOpenFile.ShowImageMargin = false Me.CmOpenFile.Size = New System.Drawing.Size(128, 48) ' 'OpenWithToolStripMenuItem @@ -382,7 +385,7 @@ Partial Class VectoEPTPJobForm Me.PicVehicle.Size = New System.Drawing.Size(300, 88) Me.PicVehicle.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage Me.PicVehicle.TabIndex = 36 - Me.PicVehicle.TabStop = False + Me.PicVehicle.TabStop = false ' 'PicBox ' @@ -392,13 +395,13 @@ Partial Class VectoEPTPJobForm Me.PicBox.Name = "PicBox" Me.PicBox.Size = New System.Drawing.Size(390, 296) Me.PicBox.TabIndex = 36 - Me.PicBox.TabStop = False + Me.PicBox.TabStop = false ' 'TbEngTxt ' Me.TbEngTxt.Location = New System.Drawing.Point(542, 171) Me.TbEngTxt.Name = "TbEngTxt" - Me.TbEngTxt.ReadOnly = True + Me.TbEngTxt.ReadOnly = true Me.TbEngTxt.Size = New System.Drawing.Size(390, 20) Me.TbEngTxt.TabIndex = 6 ' @@ -406,7 +409,7 @@ Partial Class VectoEPTPJobForm ' Me.TbVehCat.Location = New System.Drawing.Point(848, 84) Me.TbVehCat.Name = "TbVehCat" - Me.TbVehCat.ReadOnly = True + Me.TbVehCat.ReadOnly = true Me.TbVehCat.Size = New System.Drawing.Size(87, 20) Me.TbVehCat.TabIndex = 2 ' @@ -414,7 +417,7 @@ Partial Class VectoEPTPJobForm ' Me.TbAxleConf.Location = New System.Drawing.Point(904, 113) Me.TbAxleConf.Name = "TbAxleConf" - Me.TbAxleConf.ReadOnly = True + Me.TbAxleConf.ReadOnly = true Me.TbAxleConf.Size = New System.Drawing.Size(31, 20) Me.TbAxleConf.TabIndex = 4 ' @@ -422,7 +425,7 @@ Partial Class VectoEPTPJobForm ' Me.TbHVCclass.Location = New System.Drawing.Point(848, 142) Me.TbHVCclass.Name = "TbHVCclass" - Me.TbHVCclass.ReadOnly = True + Me.TbHVCclass.ReadOnly = true Me.TbHVCclass.Size = New System.Drawing.Size(87, 20) Me.TbHVCclass.TabIndex = 5 ' @@ -430,7 +433,7 @@ Partial Class VectoEPTPJobForm ' Me.TbGbxTxt.Location = New System.Drawing.Point(542, 194) Me.TbGbxTxt.Name = "TbGbxTxt" - Me.TbGbxTxt.ReadOnly = True + Me.TbGbxTxt.ReadOnly = true Me.TbGbxTxt.Size = New System.Drawing.Size(390, 20) Me.TbGbxTxt.TabIndex = 7 ' @@ -438,13 +441,13 @@ Partial Class VectoEPTPJobForm ' Me.TbMass.Location = New System.Drawing.Point(848, 113) Me.TbMass.Name = "TbMass" - Me.TbMass.ReadOnly = True + Me.TbMass.ReadOnly = true Me.TbMass.Size = New System.Drawing.Size(50, 20) Me.TbMass.TabIndex = 3 ' 'lblEngineCharacteristics ' - Me.lblEngineCharacteristics.AutoSize = True + Me.lblEngineCharacteristics.AutoSize = true Me.lblEngineCharacteristics.Location = New System.Drawing.Point(542, 518) Me.lblEngineCharacteristics.Name = "lblEngineCharacteristics" Me.lblEngineCharacteristics.Size = New System.Drawing.Size(0, 13) @@ -452,17 +455,20 @@ Partial Class VectoEPTPJobForm ' 'PictureBox2 ' - Me.PictureBox2.Image = CType(resources.GetObject("PictureBox2.Image"), System.Drawing.Image) - Me.PictureBox2.InitialImage = CType(resources.GetObject("PictureBox2.InitialImage"), System.Drawing.Image) + Me.PictureBox2.Image = Global.TUGraz.VECTO.My.Resources.Resources.P_fan_eqn + Me.PictureBox2.InitialImage = CType(resources.GetObject("PictureBox2.InitialImage"),System.Drawing.Image) Me.PictureBox2.Location = New System.Drawing.Point(7, 19) Me.PictureBox2.Name = "PictureBox2" Me.PictureBox2.Size = New System.Drawing.Size(277, 108) Me.PictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom Me.PictureBox2.TabIndex = 38 - Me.PictureBox2.TabStop = False + Me.PictureBox2.TabStop = false ' 'GroupBox1 ' + Me.GroupBox1.Controls.Add(Me.Label7) + Me.GroupBox1.Controls.Add(Me.tbFanDiameter) + Me.GroupBox1.Controls.Add(Me.Label6) Me.GroupBox1.Controls.Add(Me.tbC3) Me.GroupBox1.Controls.Add(Me.Label4) Me.GroupBox1.Controls.Add(Me.tbC2) @@ -474,20 +480,36 @@ Partial Class VectoEPTPJobForm Me.GroupBox1.Name = "GroupBox1" Me.GroupBox1.Size = New System.Drawing.Size(515, 135) Me.GroupBox1.TabIndex = 39 - Me.GroupBox1.TabStop = False + Me.GroupBox1.TabStop = false Me.GroupBox1.Text = "Fan Power" ' + 'tbFanDiameter + ' + Me.tbFanDiameter.Location = New System.Drawing.Point(371, 29) + Me.tbFanDiameter.Name = "tbFanDiameter" + Me.tbFanDiameter.Size = New System.Drawing.Size(100, 20) + Me.tbFanDiameter.TabIndex = 46 + ' + 'Label6 + ' + Me.Label6.AutoSize = true + Me.Label6.Location = New System.Drawing.Point(294, 32) + Me.Label6.Name = "Label6" + Me.Label6.Size = New System.Drawing.Size(71, 13) + Me.Label6.TabIndex = 45 + Me.Label6.Text = "Fan diameter:" + ' 'tbC3 ' - Me.tbC3.Location = New System.Drawing.Point(363, 77) + Me.tbC3.Location = New System.Drawing.Point(371, 107) Me.tbC3.Name = "tbC3" Me.tbC3.Size = New System.Drawing.Size(100, 20) Me.tbC3.TabIndex = 44 ' 'Label4 ' - Me.Label4.AutoSize = True - Me.Label4.Location = New System.Drawing.Point(316, 80) + Me.Label4.AutoSize = true + Me.Label4.Location = New System.Drawing.Point(342, 110) Me.Label4.Name = "Label4" Me.Label4.Size = New System.Drawing.Size(23, 13) Me.Label4.TabIndex = 43 @@ -495,15 +517,15 @@ Partial Class VectoEPTPJobForm ' 'tbC2 ' - Me.tbC2.Location = New System.Drawing.Point(363, 51) + Me.tbC2.Location = New System.Drawing.Point(371, 81) Me.tbC2.Name = "tbC2" Me.tbC2.Size = New System.Drawing.Size(100, 20) Me.tbC2.TabIndex = 42 ' 'Label3 ' - Me.Label3.AutoSize = True - Me.Label3.Location = New System.Drawing.Point(316, 54) + Me.Label3.AutoSize = true + Me.Label3.Location = New System.Drawing.Point(342, 84) Me.Label3.Name = "Label3" Me.Label3.Size = New System.Drawing.Size(23, 13) Me.Label3.TabIndex = 41 @@ -511,15 +533,15 @@ Partial Class VectoEPTPJobForm ' 'tbC1 ' - Me.tbC1.Location = New System.Drawing.Point(363, 25) + Me.tbC1.Location = New System.Drawing.Point(371, 55) Me.tbC1.Name = "tbC1" Me.tbC1.Size = New System.Drawing.Size(100, 20) Me.tbC1.TabIndex = 40 ' 'Label1 ' - Me.Label1.AutoSize = True - Me.Label1.Location = New System.Drawing.Point(316, 28) + Me.Label1.AutoSize = true + Me.Label1.Location = New System.Drawing.Point(342, 58) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(23, 13) Me.Label1.TabIndex = 39 @@ -527,17 +549,26 @@ Partial Class VectoEPTPJobForm ' 'Label5 ' - Me.Label5.AutoSize = True + Me.Label5.AutoSize = true Me.Label5.Location = New System.Drawing.Point(15, 89) Me.Label5.Name = "Label5" Me.Label5.Size = New System.Drawing.Size(70, 13) Me.Label5.TabIndex = 40 Me.Label5.Text = "Vehicle XML:" ' - 'VectoEPTPJobForm + 'Label7 + ' + Me.Label7.AutoSize = true + Me.Label7.Location = New System.Drawing.Point(477, 32) + Me.Label7.Name = "Label7" + Me.Label7.Size = New System.Drawing.Size(29, 13) + Me.Label7.TabIndex = 47 + Me.Label7.Text = "[mm]" + ' + 'VectoVTPJobForm ' Me.AcceptButton = Me.ButOK - Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.CancelButton = Me.ButCancel Me.ClientSize = New System.Drawing.Size(944, 590) @@ -562,29 +593,29 @@ Partial Class VectoEPTPJobForm Me.Controls.Add(Me.ButOK) Me.Controls.Add(Me.StatusStrip1) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle - Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) - Me.MaximizeBox = False - Me.Name = "VectoEPTPJobForm" + Me.Icon = CType(resources.GetObject("$this.Icon"),System.Drawing.Icon) + Me.MaximizeBox = false + Me.Name = "VectoVTPJobForm" Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Text = "Job Editor" - Me.GrCycles.ResumeLayout(False) - Me.GrCycles.PerformLayout() - Me.GrAux.ResumeLayout(False) - Me.StatusStrip1.ResumeLayout(False) - Me.StatusStrip1.PerformLayout() - Me.ToolStrip1.ResumeLayout(False) - Me.ToolStrip1.PerformLayout() - CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).EndInit() - Me.CmOpenFile.ResumeLayout(False) - CType(Me.PicVehicle, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.PicBox, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.PictureBox2, System.ComponentModel.ISupportInitialize).EndInit() - Me.GroupBox1.ResumeLayout(False) - Me.GroupBox1.PerformLayout() - Me.ResumeLayout(False) - Me.PerformLayout() + Me.GrCycles.ResumeLayout(false) + Me.GrCycles.PerformLayout + Me.GrAux.ResumeLayout(false) + Me.StatusStrip1.ResumeLayout(false) + Me.StatusStrip1.PerformLayout + Me.ToolStrip1.ResumeLayout(false) + Me.ToolStrip1.PerformLayout + CType(Me.PictureBox1,System.ComponentModel.ISupportInitialize).EndInit + Me.CmOpenFile.ResumeLayout(false) + CType(Me.PicVehicle,System.ComponentModel.ISupportInitialize).EndInit + CType(Me.PicBox,System.ComponentModel.ISupportInitialize).EndInit + CType(Me.PictureBox2,System.ComponentModel.ISupportInitialize).EndInit + Me.GroupBox1.ResumeLayout(false) + Me.GroupBox1.PerformLayout + Me.ResumeLayout(false) + Me.PerformLayout - End Sub +End Sub Friend WithEvents StatusStrip1 As StatusStrip Friend WithEvents ButtonVEH As Button Friend WithEvents ToolStripStatusLabelGEN As ToolStripStatusLabel @@ -634,4 +665,7 @@ Partial Class VectoEPTPJobForm Friend WithEvents tbC1 As System.Windows.Forms.TextBox Friend WithEvents Label1 As System.Windows.Forms.Label Friend WithEvents Label5 As System.Windows.Forms.Label + Friend WithEvents tbFanDiameter As TextBox + Friend WithEvents Label6 As Label + Friend WithEvents Label7 As Label End Class diff --git a/VECTO/GUI/VectoEPTPJobForm.resx b/VECTO/GUI/VectoVTPJobForm.resx similarity index 55% rename from VECTO/GUI/VectoEPTPJobForm.resx rename to VECTO/GUI/VectoVTPJobForm.resx index 391e34605b..772cde37b8 100644 --- a/VECTO/GUI/VectoEPTPJobForm.resx +++ b/VECTO/GUI/VectoVTPJobForm.resx @@ -148,264 +148,6 @@ <metadata name="ToolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <value>468, 15</value> </metadata> - <data name="PictureBox2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> - <value> - 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 -</value> - </data> <data name="PictureBox2.InitialImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value> iVBORw0KGgoAAAANSUhEUgAAApMAAACBCAYAAACclzFEAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO diff --git a/VECTO/GUI/VectoEPTPJobForm.vb b/VECTO/GUI/VectoVTPJobForm.vb similarity index 98% rename from VECTO/GUI/VectoEPTPJobForm.vb rename to VECTO/GUI/VectoVTPJobForm.vb index 6f19957504..5831b3d04b 100644 --- a/VECTO/GUI/VectoEPTPJobForm.vb +++ b/VECTO/GUI/VectoVTPJobForm.vb @@ -34,7 +34,7 @@ Imports TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox ''' Job Editor. Create/Edit VECTO job files (.vecto) ''' </summary> ''' <remarks></remarks> -Public Class VectoEPTPJobForm +Public Class VectoVTPJobForm Public VectoFile As String Private _changed As Boolean = False @@ -167,11 +167,11 @@ Public Class VectoEPTPJobForm VectoNew() 'Read GEN - Dim vectoJob As IEPTPJobInputData = Nothing - Dim inputData As IEPTPInputDataProvider = Nothing + Dim vectoJob As IVTPJobInputData = Nothing + Dim inputData As IVTPInputDataProvider = Nothing Try inputData = TryCast(JSONInputDataFactory.ReadComponentData(file), - IEPTPInputDataProvider) + IVTPInputDataProvider) vectoJob = inputData.JobInputData() Catch ex As Exception MsgBox("Failed to read Job-File" + Environment.NewLine + ex.Message) @@ -212,6 +212,7 @@ Public Class VectoEPTPJobForm If (coefficients.Length >= 3) Then tbC3.Text = coefficients(2).ToGUIFormat() End If + tbFanDiameter.Text = (vectoJob.FanDiameter.Value() * 1000).ToGUIFormat() Try Dim sb As ICycleData For Each sb In vectoJob.Cycles @@ -266,7 +267,7 @@ Public Class VectoEPTPJobForm Dim message As String = String.Empty - Dim vectoJob As VectoEPTPJob = New VectoEPTPJob + Dim vectoJob As VectoVTPJob = New VectoVTPJob vectoJob.FilePath = file 'Files ------------------------------------------------- ----------------- @@ -284,6 +285,7 @@ Public Class VectoEPTPJobForm tbC2.Text.ToDouble(0), tbC3.Text.ToDouble(0) } + vectoJob.FanDiameter = (tbFanDiameter.Text.ToDouble(0) / 1000).SI(of Meter) 'SAVE If Not vectoJob.SaveFile Then @@ -704,6 +706,8 @@ Public Class VectoEPTPJobForm Private Sub LvAux_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LvAux.SelectedIndexChanged End Sub + + End Class diff --git a/VECTO/Input Files/VectoEPTPJob.vb b/VECTO/Input Files/VectoEPTPJob.vb index 8611f5bfb4..9028c62091 100644 --- a/VECTO/Input Files/VectoEPTPJob.vb +++ b/VECTO/Input Files/VectoEPTPJob.vb @@ -15,9 +15,9 @@ Imports TUGraz.VectoCore.InputData.Impl Imports TUGraz.VectoCore.Models.Declaration Imports TUGraz.VectoCore.Utils -<CustomValidation(GetType(VectoEPTPJob), "ValidateJob")> -Public Class VectoEPTPJob - Implements IEPTPInputDataProvider, IEPTPJobInputData +<CustomValidation(GetType(VectoVTPJob), "ValidateJob")> +Public Class VectoVTPJob + Implements IVTPInputDataProvider, IVTPJobInputData Private _sFilePath As String Private _myPath As String @@ -26,6 +26,7 @@ Public Class VectoEPTPJob Public ReadOnly CycleFiles As List(Of SubPath) Public FanCoefficients As Double() + Private _fanDiameter As Meter Public Sub New() @@ -85,7 +86,7 @@ Public Class VectoEPTPJob End Function ' ReSharper disable once UnusedMember.Global -- used by Validation - Public Shared Function ValidateJob(vectoJob As VectoEPTPJob, validationContext As ValidationContext) As ValidationResult + Public Shared Function ValidateJob(vectoJob As VectoVTPJob, validationContext As ValidationContext) As ValidationResult Dim modeService As VectoValidationModeServiceContainer = TryCast(validationContext.GetService(GetType(VectoValidationModeServiceContainer)), VectoValidationModeServiceContainer) @@ -94,13 +95,13 @@ Public Class VectoEPTPJob Return ValidateVehicleJob(vectoJob, mode) End Function - Private Shared Function ValidateVehicleJob(vectoJob As VectoEPTPJob, mode As ExecutionMode) As ValidationResult + Private Shared Function ValidateVehicleJob(vectoJob As VectoVTPJob, mode As ExecutionMode) As ValidationResult ' TODO!! End Function - Public ReadOnly Property Vehicle As IVehicleDeclarationInputData Implements IEPTPJobInputData.Vehicle + Public ReadOnly Property Vehicle As IVehicleDeclarationInputData Implements IVTPJobInputData.Vehicle Get If Not File.Exists(_vehicleFile.FullPath) Then Return Nothing 'Return New JSONComponentInputData(_vehicleFile.FullPath).JobInputData.Vehicle @@ -108,7 +109,7 @@ Public Class VectoEPTPJob End Get End Property - Public ReadOnly Property Cycles As IList(Of ICycleData) Implements IEPTPJobInputData.Cycles + Public ReadOnly Property Cycles As IList(Of ICycleData) Implements IVTPJobInputData.Cycles Get Dim retVal As ICycleData() = New ICycleData(CycleFiles.Count - 1) {} Dim i As Integer = 0 @@ -137,19 +138,28 @@ Public Class VectoEPTPJob End Get End Property - Public ReadOnly Property FanPowerCoefficents As IEnumerable(Of Double) Implements IEPTPJobInputData.FanPowerCoefficents + Public ReadOnly Property FanPowerCoefficents As IEnumerable(Of Double) Implements IVTPJobInputData.FanPowerCoefficents Get Return FanCoefficients End Get End Property - Public ReadOnly Property SavedInDeclarationMode As Boolean Implements IEPTPJobInputData.SavedInDeclarationMode + Public ReadOnly Property SavedInDeclarationMode As Boolean Implements IVTPJobInputData.SavedInDeclarationMode Get Return False End Get End Property - Public ReadOnly Property JobInputData As IEPTPJobInputData Implements IEPTPInputDataProvider.JobInputData + Public Property FanDiameter As Meter Implements IVTPJobInputData.FanDiameter + Get + Return _fanDiameter + End Get + Set + _fanDiameter = value + End Set + End Property + + Public ReadOnly Property JobInputData As IVTPJobInputData Implements IVTPInputDataProvider.JobInputData Get Return Me End Get diff --git a/VECTO/OutputData/JSONFileWriter.vb b/VECTO/OutputData/JSONFileWriter.vb index 4e277f47ba..121574a0cd 100644 --- a/VECTO/OutputData/JSONFileWriter.vb +++ b/VECTO/OutputData/JSONFileWriter.vb @@ -352,17 +352,18 @@ Public Class JSONFileWriter WriteFile(header, body, filename) End Sub - Public Sub SaveJob(input As IEPTPInputDataProvider, filename As String) Implements IOutputFileWriter.SaveJob + Public Sub SaveJob(input As IVTPInputDataProvider, filename As String) Implements IOutputFileWriter.SaveJob Dim basePath As String = Path.GetDirectoryName(filename) 'Header Dim header As Dictionary(Of String, Object) = GetHeader(VectoJobFormatVersion) 'Body Dim body As Dictionary(Of String, Object) = New Dictionary(Of String, Object) - Dim job As IEPTPJobInputData = input.JobInputData + Dim job As IVTPJobInputData = input.JobInputData body.Add("SavedInDeclMode", False) body.Add("DeclarationVehicle", GetRelativePath(job.Vehicle.Source, Path.GetDirectoryName(filename))) body.Add("FanPowerCoefficients", job.FanPowerCoefficents) + body.Add("FanDiameter", job.FanDiameter.Value()) body.Add("Cycles", job.Cycles.Select(Function(x) GetRelativePath(x.CycleData.Source, Path.GetDirectoryName(filename))).ToArray()) diff --git a/VECTO/Resources/P_fan_eqn.png b/VECTO/Resources/P_fan_eqn.png index 25ccb5e969f5254a29338a6ced69429aaf8cfc33..d188621db3bf03647d9e8a71cd3eee181c7b8ff2 100644 GIT binary patch literal 9516 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 literal 8590 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 KNYzQ0hW-!9C26Vv diff --git a/VECTO/VECTO.vbproj b/VECTO/VECTO.vbproj index c549ca0e9c..62f7c9c1f8 100644 --- a/VECTO/VECTO.vbproj +++ b/VECTO/VECTO.vbproj @@ -187,10 +187,10 @@ </ItemGroup> <ItemGroup> <Compile Include="ApplicationEvents.vb" /> - <Compile Include="GUI\VectoEPTPJobForm.Designer.vb"> - <DependentUpon>VectoEPTPJobForm.vb</DependentUpon> + <Compile Include="GUI\VectoVTPJobForm.Designer.vb"> + <DependentUpon>VectoVTPJobForm.vb</DependentUpon> </Compile> - <Compile Include="GUI\VectoEPTPJobForm.vb"> + <Compile Include="GUI\VectoVTPJobForm.vb"> <SubType>Form</SubType> </Compile> <Compile Include="Input Files\BrowserUtils.vb" /> @@ -358,8 +358,8 @@ <EmbeddedResource Include="GUI\JiraDialog.resx"> <DependentUpon>JiraDialog.vb</DependentUpon> </EmbeddedResource> - <EmbeddedResource Include="GUI\VectoEPTPJobForm.resx"> - <DependentUpon>VectoEPTPJobForm.vb</DependentUpon> + <EmbeddedResource Include="GUI\VectoVTPJobForm.resx"> + <DependentUpon>VectoVTPJobForm.vb</DependentUpon> <SubType>Designer</SubType> </EmbeddedResource> <EmbeddedResource Include="GUI\VehicleTorqueLimitsDialog.resx"> @@ -540,8 +540,6 @@ <Content Include="Resources\F_VECTO.ico" /> <Content Include="Resources\F_VEH.ico" /> <Content Include="Resources\Graph.ico" /> - <None Include="Resources\P_fan_Equation.bmp" /> - <None Include="Resources\P_fan_units.png" /> <None Include="Resources\P_fan_eqn.png" /> <Content Include="Resources\Status-dialog-password-icon.ico" /> <EmbeddedResource Include="Resources\Undef.png" /> diff --git a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs index 40e0a9ebda..c0c5c370a0 100644 --- a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs +++ b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs @@ -283,7 +283,7 @@ namespace TUGraz.VectoCommon.InputData { //new IStartStopEngineeringInputData StartStop { get; } - new IOverSpeedEcoRollEngineeringInputData OverSpeedEcoRoll { get; } + IOverSpeedEcoRollEngineeringInputData OverSpeedEcoRoll { get; } /// <summary> /// P009; P033, P034, P035 diff --git a/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs b/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs index 54c8817629..eff5db7421 100644 --- a/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs +++ b/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs @@ -31,6 +31,7 @@ using System.Collections.Generic; using System.Xml.Linq; +using TUGraz.VectoCommon.Utils; namespace TUGraz.VectoCommon.InputData { @@ -50,12 +51,12 @@ namespace TUGraz.VectoCommon.InputData IDriverEngineeringInputData DriverInputData { get; } } - public interface IEPTPInputDataProvider : IInputDataProvider + public interface IVTPInputDataProvider : IInputDataProvider { - IEPTPJobInputData JobInputData { get; } + IVTPJobInputData JobInputData { get; } } - public interface IEPTPJobInputData + public interface IVTPJobInputData { IVehicleDeclarationInputData Vehicle { get; } @@ -63,5 +64,6 @@ namespace TUGraz.VectoCommon.InputData IEnumerable<double> FanPowerCoefficents { get; } bool SavedInDeclarationMode { get; } - } + Meter FanDiameter { get; } + } } diff --git a/VectoCommon/VectoCommon/OutputData/IOutputFileWriter.cs b/VectoCommon/VectoCommon/OutputData/IOutputFileWriter.cs index 3787810749..b98e453798 100644 --- a/VectoCommon/VectoCommon/OutputData/IOutputFileWriter.cs +++ b/VectoCommon/VectoCommon/OutputData/IOutputFileWriter.cs @@ -45,7 +45,7 @@ namespace TUGraz.VectoCommon.OutputData void SaveJob(IEngineeringInputDataProvider input, string filename); - void SaveJob(IEPTPInputDataProvider input, string filename); + void SaveJob(IVTPInputDataProvider input, string filename); void ExportJob(IEngineeringInputDataProvider input, string filename, bool separateFiles); } diff --git a/VectoCommon/VectoHashing/IVectoHash.cs b/VectoCommon/VectoHashing/IVectoHash.cs index 29bc90029b..e41eb4599a 100644 --- a/VectoCommon/VectoHashing/IVectoHash.cs +++ b/VectoCommon/VectoHashing/IVectoHash.cs @@ -106,7 +106,7 @@ namespace TUGraz.VectoHashing /// <summary> - // Computes the hash-value of the top-level Data element (or vehicle) + /// Computes the hash-value of the top-level Data element (or vehicle) /// If the canoonicalizationMethods is null the canonicalizationMethods from /// the signature element are read if available or the default canonicalization is applied /// If the digestMethod is null the digestMethod from the signature element is read if diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs index cbe40440f2..349a5fc15f 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs @@ -50,625 +50,628 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.FileIO.JSON { - public abstract class JSONFile : LoggingObject - { - public const string MissingFileSuffix = " -- (MISSING!)"; - - private readonly string _sourceFile; - - protected readonly JObject Body; - - protected JSONFile(JObject data, string filename, bool tolerateMissing = false) - { - //var header = (JObject)data.GetEx(JsonKeys.JsonHeader); - Body = (JObject)data.GetEx(JsonKeys.JsonBody); - _sourceFile = Path.GetFullPath(filename); - TolerateMissing = tolerateMissing; - } - - protected bool TolerateMissing { get; set; } - - public DataSourceType SourceType - { - get { return DataSourceType.JSONFile; } - } - - public string Source - { - get { return _sourceFile; } - } - - public bool SavedInDeclarationMode - { - get { return Body.GetEx(JsonKeys.SavedInDeclMode).Value<bool>(); } - } - - internal string BasePath - { - get { return Path.GetDirectoryName(_sourceFile); } - } - - protected TableData ReadTableData(string filename, string tableType, bool required = true) - { - if (!EmptyOrInvalidFileName(filename) && File.Exists(Path.Combine(BasePath, filename))) { - try { - return VectoCSVFile.Read(Path.Combine(BasePath, filename), true); - } catch (Exception e) { - Log.Warn("Failed to read file {0} {1}", Path.Combine(BasePath, filename), tableType); - throw new VectoException("Failed to read file for {0}: {1}", e, tableType, filename); - } - } - if (required) { - throw new VectoException("Invalid filename for {0}: {1}", tableType, filename); - } - return null; - } - - internal static bool EmptyOrInvalidFileName(string filename) - { - return filename == null || !filename.Any() || - filename.Equals("<NOFILE>", StringComparison.InvariantCultureIgnoreCase) - || filename.Equals("-"); - } - - public static JObject GetDummyJSONStructure() - { - return JObject.FromObject(new Dictionary<string, object>() { - { JsonKeys.JsonHeader, new object() }, - { JsonKeys.JsonBody, new object() } - }); - } - } - - /// <summary> - /// Class for reading json data of vecto-job-file. - /// Fileformat: .vecto - /// </summary> - public class JSONInputDataV2 : JSONFile, IEngineeringInputDataProvider, IDeclarationInputDataProvider, - IEngineeringJobInputData, IDriverEngineeringInputData, IAuxiliariesEngineeringInputData, - IAuxiliariesDeclarationInputData, IJSONVehicleComponents - { - public JSONInputDataV2(JObject data, string filename, bool tolerateMissing = false) - : base(data, filename, tolerateMissing) - { - _jobname = Path.GetFileNameWithoutExtension(filename); - - Engine = ReadEngine(); - - if (Body.GetEx(JsonKeys.Job_EngineOnlyMode).Value<bool>()) { - return; - } - - Gearbox = ReadGearbox(); - AxleGear = Gearbox as IAxleGearInputData; - TorqueConverter = Gearbox as ITorqueConverterEngineeringInputData; - - VehicleData = ReadVehicle(); - } - - public IGearboxEngineeringInputData Gearbox { get; internal set; } - public IAxleGearInputData AxleGear { get; internal set; } - public ITorqueConverterEngineeringInputData TorqueConverter { get; internal set; } - public IEngineEngineeringInputData Engine { get; internal set; } - - - protected readonly IVehicleEngineeringInputData VehicleData; - - private readonly string _jobname; - - - public IAuxiliariesEngineeringInputData EngineeringAuxiliaries - { - get { return this; } - } - - public IAuxiliariesDeclarationInputData DeclarationAuxiliaries - { - get { return this; } - } - - private IVehicleEngineeringInputData ReadVehicle() - { - try { - var vehicleFile = Body.GetEx(JsonKeys.Vehicle_VehicleFile).Value<string>(); - return JSONInputDataFactory.ReadJsonVehicle( - Path.Combine(BasePath, vehicleFile), this); - } catch (Exception e) { - if (!TolerateMissing) { - throw new VectoException("JobFile: Failed to read Vehicle file '{0}': {1}", e, - Body[JsonKeys.Vehicle_VehicleFile], - e.Message); - } - return new JSONVehicleDataV7(GetDummyJSONStructure(), - Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_VehicleFile).Value<string>()) + - MissingFileSuffix, this); - } - } - - private IGearboxEngineeringInputData ReadGearbox() - { - try { - var gearboxFile = Body.GetEx(JsonKeys.Vehicle_GearboxFile).Value<string>(); - - return JSONInputDataFactory.ReadGearbox(Path.Combine(BasePath, gearboxFile)); - } catch (Exception e) { - if (!TolerateMissing) { - throw new VectoException("JobFile: Failed to read Gearbox file '{0}': {1}", e, - Body[JsonKeys.Vehicle_GearboxFile], - e.Message); - } - return new JSONGearboxDataV6(GetDummyJSONStructure(), - Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_GearboxFile).Value<string>()) + - MissingFileSuffix); - } - } - - private IEngineEngineeringInputData ReadEngine() - { - try { - return JSONInputDataFactory.ReadEngine( - Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_EngineFile).Value<string>())); - } catch (Exception e) { - if (!TolerateMissing) { - throw new VectoException("JobFile: Failed to read Engine file '{0}': {1}", e, - Body[JsonKeys.Vehicle_EngineFile], - e.Message); - } - - return - new JSONEngineDataV3(GetDummyJSONStructure(), - Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_EngineFile).Value<string>()) + - MissingFileSuffix); - } - } - - #region IInputDataProvider - - IVehicleDeclarationInputData IDeclarationJobInputData.Vehicle - { - get { return VehicleInputData; } - } - - public virtual IEngineeringJobInputData JobInputData - { - get { return this; } - } - - public XElement XMLHash - { - get { return new XElement(XMLNames.DI_Signature); } - } - - IDeclarationJobInputData IDeclarationInputDataProvider.JobInputData - { - get { return this; } - } - - public virtual IVehicleEngineeringInputData VehicleInputData - { - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", - "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] - get - { - if (VehicleData == null) { - throw new InvalidFileFormatException("VehicleData not found "); - } - return VehicleData; - } - } - - public virtual IEngineEngineeringInputData EngineOnly - { - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", - "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] - get - { - if (Engine == null) { - throw new InvalidFileFormatException("EngineData not found"); - } - return Engine; - } - } - - IDriverEngineeringInputData IEngineeringInputDataProvider.DriverInputData - { - get { return this; } - } - - #endregion - - #region IJobInputData - - public virtual IVehicleEngineeringInputData Vehicle - { - get { return VehicleData; } - } - - public virtual IList<ICycleData> Cycles - { - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", - "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] - get - { - var retVal = new List<ICycleData>(); - if (Body[JsonKeys.Job_Cycles] == null) { - return retVal; - } - foreach (var cycle in Body.GetEx(JsonKeys.Job_Cycles)) { - //.Select(cycle => - var cycleFile = Path.Combine(BasePath, cycle.Value<string>()); - TableData cycleData; - if (File.Exists(cycleFile)) { - cycleData = VectoCSVFile.Read(cycleFile); - } else { - try { - var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + - cycle.Value<string>() + Constants.FileExtensions.CycleFile; - cycleData = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), - source: resourceName); - } catch (Exception e) { - Log.Debug("Driving Cycle could not be read: " + cycleFile); - if (!TolerateMissing) { - throw new VectoException("Driving Cycle could not be read: " + cycleFile, e); - } - cycleData = new TableData(cycleFile + MissingFileSuffix, DataSourceType.Missing); - } - } - retVal.Add(new CycleInputData() { - Name = Path.GetFileNameWithoutExtension(cycle.Value<string>()), - CycleData = cycleData - }); - } - return retVal; - } - } - - public virtual bool EngineOnlyMode - { - get { return Body.GetEx(JsonKeys.Job_EngineOnlyMode).Value<bool>(); } - } - - public virtual string JobName - { - get { return _jobname; } - } - - #endregion - - #region DriverInputData - - public virtual ILookaheadCoastingInputData Lookahead - { - get - { - if (Body[JsonKeys.DriverData_LookaheadCoasting] == null) { - return null; - } - - var lac = Body.GetEx(JsonKeys.DriverData_LookaheadCoasting); - var distanceScalingFactor = lac["PreviewDistanceFactor"] != null - ? lac.GetEx<double>("PreviewDistanceFactor") - : DeclarationData.Driver.LookAhead.LookAheadDistanceFactor; - var lacDfOffset = lac["DF_offset"] != null - ? lac.GetEx<double>("DF_offset") - : DeclarationData.Driver.LookAhead.DecisionFactorCoastingOffset; - var lacDfScaling = lac["DF_scaling"] != null - ? lac.GetEx<double>("DF_scaling") - : DeclarationData.Driver.LookAhead.DecisionFactorCoastingScaling; - var speedDependentLookup = GetSpeedDependentLookupTable(lac); - var velocityDropLookup = GetVelocityDropLookupTable(lac); - var minSpeed = lac["MinSpeed"] != null - ? lac.GetEx<double>(JsonKeys.DriverData_Lookahead_MinSpeed).KMPHtoMeterPerSecond() - : DeclarationData.Driver.LookAhead.MinimumSpeed; - return new LookAheadCoastingInputData() { - Enabled = lac.GetEx<bool>(JsonKeys.DriverData_Lookahead_Enabled), - //Deceleration = lac.GetEx<double>(JsonKeys.DriverData_Lookahead_Deceleration).SI<MeterPerSquareSecond>(), - MinSpeed = minSpeed, - LookaheadDistanceFactor = distanceScalingFactor, - CoastingDecisionFactorOffset = lacDfOffset, - CoastingDecisionFactorScaling = lacDfScaling, - CoastingDecisionFactorTargetSpeedLookup = speedDependentLookup, - CoastingDecisionFactorVelocityDropLookup = velocityDropLookup - }; - } - } - - private TableData GetVelocityDropLookupTable(JToken lac) - { - if (lac["Df_velocityDropLookup"] == null || - string.IsNullOrWhiteSpace(lac["Df_velocityDropLookup"].Value<string>())) { - return null; - } - try { - return ReadTableData(lac.GetEx<string>("Df_velocityDropLookup"), - "Lookahead Coasting Decisionfactor - Velocity drop"); - } catch (Exception) { - if (TolerateMissing) { - return - new TableData( - Path.Combine(BasePath, lac["Df_velocityDropLookup"].Value<string>()) + MissingFileSuffix, - DataSourceType.Missing); - } - } - return null; - } - - private TableData GetSpeedDependentLookupTable(JToken lac) - { - if (lac["DF_targetSpeedLookup"] == null || - string.IsNullOrWhiteSpace(lac["DF_targetSpeedLookup"].Value<string>())) { - return null; - } - try { - return ReadTableData(lac.GetEx<string>("DF_targetSpeedLookup"), - "Lookahead Coasting Decisionfactor - Target speed"); - } catch (Exception) { - if (TolerateMissing) { - return - new TableData( - Path.Combine(BasePath, lac["DF_targetSpeedLookup"].Value<string>()) + MissingFileSuffix, - DataSourceType.Missing); - } - } - return null; - } - - public virtual IOverSpeedEcoRollEngineeringInputData OverSpeedEcoRoll - { - get - { - var overspeed = Body.GetEx(JsonKeys.DriverData_OverspeedEcoRoll); - return new OverSpeedEcoRollInputData() { - Mode = DriverData.ParseDriverMode( - overspeed.GetEx<string>(JsonKeys.DriverData_OverspeedEcoRoll_Mode)), - MinSpeed = overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_MinSpeed) - .KMPHtoMeterPerSecond(), - OverSpeed = overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_OverSpeed) - .KMPHtoMeterPerSecond(), - UnderSpeed = - overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_UnderSpeed).KMPHtoMeterPerSecond() - }; - } - } - - public virtual TableData AccelerationCurve - { - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", - "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] - get - { - var acceleration = Body[JsonKeys.DriverData_AccelerationCurve]; - if (acceleration == null || EmptyOrInvalidFileName(acceleration.Value<string>())) { - return null; - // throw new VectoException("AccelerationCurve (VACC) required"); - } - try { - return ReadTableData(acceleration.Value<string>(), "DriverAccelerationCurve"); - } catch (VectoException e) { - Log.Warn("Could not find file for acceleration curve. Trying lookup in declaration data."); - try { - var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".VACC." + - acceleration.Value<string>() + - Constants.FileExtensions.DriverAccelerationCurve; - return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), source: resourceName); - } catch (Exception) { - if (!TolerateMissing) { - throw new VectoException("Failed to read Driver Acceleration Curve: " + e.Message, e); - } - return new TableData(Path.Combine(BasePath, acceleration.Value<string>()) + MissingFileSuffix, - DataSourceType.Missing); - } - } - } - } - - #endregion - - #region IAuxiliariesEngineeringInputData - - IList<IAuxiliaryEngineeringInputData> IAuxiliariesEngineeringInputData.Auxiliaries - { - get { return AuxData().Cast<IAuxiliaryEngineeringInputData>().ToList(); } - } - - IList<IAuxiliaryDeclarationInputData> IAuxiliariesDeclarationInputData.Auxiliaries - { - get { return AuxData().Cast<IAuxiliaryDeclarationInputData>().ToList(); } - } - - protected virtual IList<AuxiliaryDataInputData> AuxData() - { - var retVal = new List<AuxiliaryDataInputData>(); - foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) { - var type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type")); - - var auxData = new AuxiliaryDataInputData { - ID = aux.GetEx<string>("ID"), - Type = type, - Technology = new List<string>(), - }; - var tech = aux.GetEx<string>("Technology"); - - if (auxData.Type == AuxiliaryType.ElectricSystem) { - if (aux["TechList"] == null || aux["TechList"].Any()) { - auxData.Technology.Add("Standard technology"); - } else { - auxData.Technology.Add("Standard technology - LED headlights, all"); - } - } - - if (auxData.Type == AuxiliaryType.SteeringPump) { - auxData.Technology.Add(tech); - } - - if (auxData.Type == AuxiliaryType.Fan) { - auxData.Technology.Add(MapLegacyFanTechnologies(tech)); - } - - var auxFile = aux["Path"]; - retVal.Add(auxData); - - if (auxFile == null || EmptyOrInvalidFileName(auxFile.Value<string>())) { - continue; - } - - AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxData, - Path.Combine(BasePath, auxFile.Value<string>())); - } - return retVal; - } - - private static string MapLegacyFanTechnologies(string tech) - { - string newTech; - switch (tech) { - case "Crankshaft mounted - Electronically controlled visco clutch (Default)": - newTech = "Crankshaft mounted - Electronically controlled visco clutch"; - break; - case "Crankshaft mounted - On/Off clutch": - newTech = "Crankshaft mounted - On/off clutch"; - break; - case "Belt driven or driven via transm. - On/Off clutch": - newTech = "Belt driven or driven via transm. - On/off clutch"; - break; - default: - newTech = tech; - break; - } - return newTech; - } - - #endregion - - #region AdvancedAuxiliaries - - public AuxiliaryModel AuxiliaryAssembly - { - get - { - return AuxiliaryModelHelper.Parse(Body["AuxiliaryAssembly"] == null - ? "" - : Body["AuxiliaryAssembly"].ToString()); - } - } - - public string AuxiliaryVersion - { - get { return Body["AuxiliaryVersion"] != null ? Body["AuxiliaryVersion"].Value<string>() : "<CLASSIC>"; } - } - - public string AdvancedAuxiliaryFilePath - { - get - { - return Body["AdvancedAuxiliaryFilePath"] != null - ? Path.Combine(Path.GetFullPath(BasePath), Body["AdvancedAuxiliaryFilePath"].Value<string>()) - : ""; - } - } - - #endregion - } - - public class JSONInputDataV3 : JSONInputDataV2 - { - public JSONInputDataV3(JObject data, string filename, bool tolerateMissing = false) - : base(data, filename, tolerateMissing) { } - - protected override IList<AuxiliaryDataInputData> AuxData() - { - var retVal = new List<AuxiliaryDataInputData>(); - if (Body["Padd"] != null) { - retVal.Add(new AuxiliaryDataInputData() { - ID = "ConstantAux", - AuxiliaryType = AuxiliaryDemandType.Constant, - ConstantPowerDemand = Body.GetEx<double>("Padd").SI<Watt>() - }); - } - foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) { - try { - aux.GetEx("Technology").ToObject<List<string>>(); - } catch (Exception) { - throw new VectoException( - "Aux: Technology for aux '{0}' list could not be read. Maybe it is a single string instead of a list of strings?", - aux.GetEx<string>("ID")); - } - - var type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type")); - - var auxData = new AuxiliaryDataInputData { - ID = aux.GetEx<string>("ID"), - Type = type, - Technology = aux.GetEx("Technology").ToObject<List<string>>() - }; - - var auxFile = aux["Path"]; - retVal.Add(auxData); - - if (auxFile == null || EmptyOrInvalidFileName(auxFile.Value<string>())) { - continue; - } - AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxData, - Path.Combine(BasePath, auxFile.Value<string>())); - } - return retVal; - } - } - - - public class JSONInputDataV4 : JSONInputDataV3 - { - public JSONInputDataV4(JObject data, string filename, bool tolerateMissing = false) - : base(data, filename, tolerateMissing) { } - } - - public class JSONEPTPInputDataV4 : JSONFile, IEPTPInputDataProvider, IEPTPJobInputData - { - public JSONEPTPInputDataV4(JObject data, string filename, bool tolerateMissing = false) : base(data, filename, - tolerateMissing) { } - - public IEPTPJobInputData JobInputData - { - get { return this; } - } - - public IVehicleDeclarationInputData Vehicle - { - get - { - return new XMLDeclarationInputDataProvider(Path.Combine(Path.GetFullPath(BasePath), Body["DeclarationVehicle"].Value<string>()), - true).JobInputData.Vehicle; - } - } - - public IList<ICycleData> Cycles - { - get - { - var retVal = new List<ICycleData>(); - if (Body[JsonKeys.Job_Cycles] == null) { - return retVal; - } - foreach (var cycle in Body.GetEx(JsonKeys.Job_Cycles)) { - var cycleFile = Path.Combine(BasePath, cycle.Value<string>()); - if (File.Exists(cycleFile)) { - var cycleData = VectoCSVFile.Read(cycleFile); - retVal.Add(new CycleInputData() { - Name = Path.GetFileNameWithoutExtension(cycle.Value<string>()), - CycleData = cycleData - }); - } - } - return retVal; - } - } - - public IEnumerable<double> FanPowerCoefficents - { - get - { - return Body.GetEx("FanPowerCoefficients").Select(entry => entry.ToString().ToDouble()).ToList(); - } - } - } + public abstract class JSONFile : LoggingObject + { + public const string MissingFileSuffix = " -- (MISSING!)"; + + private readonly string _sourceFile; + + protected readonly JObject Body; + + protected JSONFile(JObject data, string filename, bool tolerateMissing = false) + { + //var header = (JObject)data.GetEx(JsonKeys.JsonHeader); + Body = (JObject)data.GetEx(JsonKeys.JsonBody); + _sourceFile = Path.GetFullPath(filename); + TolerateMissing = tolerateMissing; + } + + protected bool TolerateMissing { get; set; } + + public DataSourceType SourceType + { + get { return DataSourceType.JSONFile; } + } + + public string Source + { + get { return _sourceFile; } + } + + public bool SavedInDeclarationMode + { + get { return Body.GetEx(JsonKeys.SavedInDeclMode).Value<bool>(); } + } + + internal string BasePath + { + get { return Path.GetDirectoryName(_sourceFile); } + } + + protected TableData ReadTableData(string filename, string tableType, bool required = true) + { + if (!EmptyOrInvalidFileName(filename) && File.Exists(Path.Combine(BasePath, filename))) { + try { + return VectoCSVFile.Read(Path.Combine(BasePath, filename), true); + } catch (Exception e) { + Log.Warn("Failed to read file {0} {1}", Path.Combine(BasePath, filename), tableType); + throw new VectoException("Failed to read file for {0}: {1}", e, tableType, filename); + } + } + if (required) { + throw new VectoException("Invalid filename for {0}: {1}", tableType, filename); + } + return null; + } + + internal static bool EmptyOrInvalidFileName(string filename) + { + return filename == null || !filename.Any() || + filename.Equals("<NOFILE>", StringComparison.InvariantCultureIgnoreCase) + || filename.Equals("-"); + } + + public static JObject GetDummyJSONStructure() + { + return JObject.FromObject(new Dictionary<string, object>() { + { JsonKeys.JsonHeader, new object() }, + { JsonKeys.JsonBody, new object() } + }); + } + } + + /// <summary> + /// Class for reading json data of vecto-job-file. + /// Fileformat: .vecto + /// </summary> + public class JSONInputDataV2 : JSONFile, IEngineeringInputDataProvider, IDeclarationInputDataProvider, + IEngineeringJobInputData, IDriverEngineeringInputData, IAuxiliariesEngineeringInputData, + IAuxiliariesDeclarationInputData, IJSONVehicleComponents + { + public JSONInputDataV2(JObject data, string filename, bool tolerateMissing = false) + : base(data, filename, tolerateMissing) + { + _jobname = Path.GetFileNameWithoutExtension(filename); + + Engine = ReadEngine(); + + if (Body.GetEx(JsonKeys.Job_EngineOnlyMode).Value<bool>()) { + return; + } + + Gearbox = ReadGearbox(); + AxleGear = Gearbox as IAxleGearInputData; + TorqueConverter = Gearbox as ITorqueConverterEngineeringInputData; + + VehicleData = ReadVehicle(); + } + + public IGearboxEngineeringInputData Gearbox { get; internal set; } + public IAxleGearInputData AxleGear { get; internal set; } + public ITorqueConverterEngineeringInputData TorqueConverter { get; internal set; } + public IEngineEngineeringInputData Engine { get; internal set; } + + + protected readonly IVehicleEngineeringInputData VehicleData; + + private readonly string _jobname; + + + public IAuxiliariesEngineeringInputData EngineeringAuxiliaries + { + get { return this; } + } + + public IAuxiliariesDeclarationInputData DeclarationAuxiliaries + { + get { return this; } + } + + private IVehicleEngineeringInputData ReadVehicle() + { + try { + var vehicleFile = Body.GetEx(JsonKeys.Vehicle_VehicleFile).Value<string>(); + return JSONInputDataFactory.ReadJsonVehicle( + Path.Combine(BasePath, vehicleFile), this); + } catch (Exception e) { + if (!TolerateMissing) { + throw new VectoException("JobFile: Failed to read Vehicle file '{0}': {1}", e, + Body[JsonKeys.Vehicle_VehicleFile], + e.Message); + } + return new JSONVehicleDataV7(GetDummyJSONStructure(), + Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_VehicleFile).Value<string>()) + + MissingFileSuffix, this); + } + } + + private IGearboxEngineeringInputData ReadGearbox() + { + try { + var gearboxFile = Body.GetEx(JsonKeys.Vehicle_GearboxFile).Value<string>(); + + return JSONInputDataFactory.ReadGearbox(Path.Combine(BasePath, gearboxFile)); + } catch (Exception e) { + if (!TolerateMissing) { + throw new VectoException("JobFile: Failed to read Gearbox file '{0}': {1}", e, + Body[JsonKeys.Vehicle_GearboxFile], + e.Message); + } + return new JSONGearboxDataV6(GetDummyJSONStructure(), + Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_GearboxFile).Value<string>()) + + MissingFileSuffix); + } + } + + private IEngineEngineeringInputData ReadEngine() + { + try { + return JSONInputDataFactory.ReadEngine( + Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_EngineFile).Value<string>())); + } catch (Exception e) { + if (!TolerateMissing) { + throw new VectoException("JobFile: Failed to read Engine file '{0}': {1}", e, + Body[JsonKeys.Vehicle_EngineFile], + e.Message); + } + + return + new JSONEngineDataV3(GetDummyJSONStructure(), + Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_EngineFile).Value<string>()) + + MissingFileSuffix); + } + } + + #region IInputDataProvider + + IVehicleDeclarationInputData IDeclarationJobInputData.Vehicle + { + get { return VehicleInputData; } + } + + public virtual IEngineeringJobInputData JobInputData + { + get { return this; } + } + + public XElement XMLHash + { + get { return new XElement(XMLNames.DI_Signature); } + } + + IDeclarationJobInputData IDeclarationInputDataProvider.JobInputData + { + get { return this; } + } + + public virtual IVehicleEngineeringInputData VehicleInputData + { + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", + "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] + get + { + if (VehicleData == null) { + throw new InvalidFileFormatException("VehicleData not found "); + } + return VehicleData; + } + } + + public virtual IEngineEngineeringInputData EngineOnly + { + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", + "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] + get + { + if (Engine == null) { + throw new InvalidFileFormatException("EngineData not found"); + } + return Engine; + } + } + + IDriverEngineeringInputData IEngineeringInputDataProvider.DriverInputData + { + get { return this; } + } + + #endregion + + #region IJobInputData + + public virtual IVehicleEngineeringInputData Vehicle + { + get { return VehicleData; } + } + + public virtual IList<ICycleData> Cycles + { + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", + "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] + get + { + var retVal = new List<ICycleData>(); + if (Body[JsonKeys.Job_Cycles] == null) { + return retVal; + } + foreach (var cycle in Body.GetEx(JsonKeys.Job_Cycles)) { + //.Select(cycle => + var cycleFile = Path.Combine(BasePath, cycle.Value<string>()); + TableData cycleData; + if (File.Exists(cycleFile)) { + cycleData = VectoCSVFile.Read(cycleFile); + } else { + try { + var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + + cycle.Value<string>() + Constants.FileExtensions.CycleFile; + cycleData = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), + source: resourceName); + } catch (Exception e) { + Log.Debug("Driving Cycle could not be read: " + cycleFile); + if (!TolerateMissing) { + throw new VectoException("Driving Cycle could not be read: " + cycleFile, e); + } + cycleData = new TableData(cycleFile + MissingFileSuffix, DataSourceType.Missing); + } + } + retVal.Add(new CycleInputData() { + Name = Path.GetFileNameWithoutExtension(cycle.Value<string>()), + CycleData = cycleData + }); + } + return retVal; + } + } + + public virtual bool EngineOnlyMode + { + get { return Body.GetEx(JsonKeys.Job_EngineOnlyMode).Value<bool>(); } + } + + public virtual string JobName + { + get { return _jobname; } + } + + #endregion + + #region DriverInputData + + public virtual ILookaheadCoastingInputData Lookahead + { + get + { + if (Body[JsonKeys.DriverData_LookaheadCoasting] == null) { + return null; + } + + var lac = Body.GetEx(JsonKeys.DriverData_LookaheadCoasting); + var distanceScalingFactor = lac["PreviewDistanceFactor"] != null + ? lac.GetEx<double>("PreviewDistanceFactor") + : DeclarationData.Driver.LookAhead.LookAheadDistanceFactor; + var lacDfOffset = lac["DF_offset"] != null + ? lac.GetEx<double>("DF_offset") + : DeclarationData.Driver.LookAhead.DecisionFactorCoastingOffset; + var lacDfScaling = lac["DF_scaling"] != null + ? lac.GetEx<double>("DF_scaling") + : DeclarationData.Driver.LookAhead.DecisionFactorCoastingScaling; + var speedDependentLookup = GetSpeedDependentLookupTable(lac); + var velocityDropLookup = GetVelocityDropLookupTable(lac); + var minSpeed = lac["MinSpeed"] != null + ? lac.GetEx<double>(JsonKeys.DriverData_Lookahead_MinSpeed).KMPHtoMeterPerSecond() + : DeclarationData.Driver.LookAhead.MinimumSpeed; + return new LookAheadCoastingInputData() { + Enabled = lac.GetEx<bool>(JsonKeys.DriverData_Lookahead_Enabled), + //Deceleration = lac.GetEx<double>(JsonKeys.DriverData_Lookahead_Deceleration).SI<MeterPerSquareSecond>(), + MinSpeed = minSpeed, + LookaheadDistanceFactor = distanceScalingFactor, + CoastingDecisionFactorOffset = lacDfOffset, + CoastingDecisionFactorScaling = lacDfScaling, + CoastingDecisionFactorTargetSpeedLookup = speedDependentLookup, + CoastingDecisionFactorVelocityDropLookup = velocityDropLookup + }; + } + } + + private TableData GetVelocityDropLookupTable(JToken lac) + { + if (lac["Df_velocityDropLookup"] == null || + string.IsNullOrWhiteSpace(lac["Df_velocityDropLookup"].Value<string>())) { + return null; + } + try { + return ReadTableData(lac.GetEx<string>("Df_velocityDropLookup"), + "Lookahead Coasting Decisionfactor - Velocity drop"); + } catch (Exception) { + if (TolerateMissing) { + return + new TableData( + Path.Combine(BasePath, lac["Df_velocityDropLookup"].Value<string>()) + MissingFileSuffix, + DataSourceType.Missing); + } + } + return null; + } + + private TableData GetSpeedDependentLookupTable(JToken lac) + { + if (lac["DF_targetSpeedLookup"] == null || + string.IsNullOrWhiteSpace(lac["DF_targetSpeedLookup"].Value<string>())) { + return null; + } + try { + return ReadTableData(lac.GetEx<string>("DF_targetSpeedLookup"), + "Lookahead Coasting Decisionfactor - Target speed"); + } catch (Exception) { + if (TolerateMissing) { + return + new TableData( + Path.Combine(BasePath, lac["DF_targetSpeedLookup"].Value<string>()) + MissingFileSuffix, + DataSourceType.Missing); + } + } + return null; + } + + public virtual IOverSpeedEcoRollEngineeringInputData OverSpeedEcoRoll + { + get + { + var overspeed = Body.GetEx(JsonKeys.DriverData_OverspeedEcoRoll); + return new OverSpeedEcoRollInputData() { + Mode = DriverData.ParseDriverMode( + overspeed.GetEx<string>(JsonKeys.DriverData_OverspeedEcoRoll_Mode)), + MinSpeed = overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_MinSpeed) + .KMPHtoMeterPerSecond(), + OverSpeed = overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_OverSpeed) + .KMPHtoMeterPerSecond(), + UnderSpeed = + overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_UnderSpeed).KMPHtoMeterPerSecond() + }; + } + } + + public virtual TableData AccelerationCurve + { + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", + "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] + get + { + var acceleration = Body[JsonKeys.DriverData_AccelerationCurve]; + if (acceleration == null || EmptyOrInvalidFileName(acceleration.Value<string>())) { + return null; + // throw new VectoException("AccelerationCurve (VACC) required"); + } + try { + return ReadTableData(acceleration.Value<string>(), "DriverAccelerationCurve"); + } catch (VectoException e) { + Log.Warn("Could not find file for acceleration curve. Trying lookup in declaration data."); + try { + var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".VACC." + + acceleration.Value<string>() + + Constants.FileExtensions.DriverAccelerationCurve; + return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), source: resourceName); + } catch (Exception) { + if (!TolerateMissing) { + throw new VectoException("Failed to read Driver Acceleration Curve: " + e.Message, e); + } + return new TableData(Path.Combine(BasePath, acceleration.Value<string>()) + MissingFileSuffix, + DataSourceType.Missing); + } + } + } + } + + #endregion + + #region IAuxiliariesEngineeringInputData + + IList<IAuxiliaryEngineeringInputData> IAuxiliariesEngineeringInputData.Auxiliaries + { + get { return AuxData().Cast<IAuxiliaryEngineeringInputData>().ToList(); } + } + + IList<IAuxiliaryDeclarationInputData> IAuxiliariesDeclarationInputData.Auxiliaries + { + get { return AuxData().Cast<IAuxiliaryDeclarationInputData>().ToList(); } + } + + protected virtual IList<AuxiliaryDataInputData> AuxData() + { + var retVal = new List<AuxiliaryDataInputData>(); + foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) { + var type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type")); + + var auxData = new AuxiliaryDataInputData { + ID = aux.GetEx<string>("ID"), + Type = type, + Technology = new List<string>(), + }; + var tech = aux.GetEx<string>("Technology"); + + if (auxData.Type == AuxiliaryType.ElectricSystem) { + if (aux["TechList"] == null || aux["TechList"].Any()) { + auxData.Technology.Add("Standard technology"); + } else { + auxData.Technology.Add("Standard technology - LED headlights, all"); + } + } + + if (auxData.Type == AuxiliaryType.SteeringPump) { + auxData.Technology.Add(tech); + } + + if (auxData.Type == AuxiliaryType.Fan) { + auxData.Technology.Add(MapLegacyFanTechnologies(tech)); + } + + var auxFile = aux["Path"]; + retVal.Add(auxData); + + if (auxFile == null || EmptyOrInvalidFileName(auxFile.Value<string>())) { + continue; + } + + AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxData, + Path.Combine(BasePath, auxFile.Value<string>())); + } + return retVal; + } + + private static string MapLegacyFanTechnologies(string tech) + { + string newTech; + switch (tech) { + case "Crankshaft mounted - Electronically controlled visco clutch (Default)": + newTech = "Crankshaft mounted - Electronically controlled visco clutch"; + break; + case "Crankshaft mounted - On/Off clutch": + newTech = "Crankshaft mounted - On/off clutch"; + break; + case "Belt driven or driven via transm. - On/Off clutch": + newTech = "Belt driven or driven via transm. - On/off clutch"; + break; + default: + newTech = tech; + break; + } + return newTech; + } + + #endregion + + #region AdvancedAuxiliaries + + public AuxiliaryModel AuxiliaryAssembly + { + get + { + return AuxiliaryModelHelper.Parse(Body["AuxiliaryAssembly"] == null + ? "" + : Body["AuxiliaryAssembly"].ToString()); + } + } + + public string AuxiliaryVersion + { + get { return Body["AuxiliaryVersion"] != null ? Body["AuxiliaryVersion"].Value<string>() : "<CLASSIC>"; } + } + + public string AdvancedAuxiliaryFilePath + { + get + { + return Body["AdvancedAuxiliaryFilePath"] != null + ? Path.Combine(Path.GetFullPath(BasePath), Body["AdvancedAuxiliaryFilePath"].Value<string>()) + : ""; + } + } + + #endregion + } + + public class JSONInputDataV3 : JSONInputDataV2 + { + public JSONInputDataV3(JObject data, string filename, bool tolerateMissing = false) + : base(data, filename, tolerateMissing) { } + + protected override IList<AuxiliaryDataInputData> AuxData() + { + var retVal = new List<AuxiliaryDataInputData>(); + if (Body["Padd"] != null) { + retVal.Add(new AuxiliaryDataInputData() { + ID = "ConstantAux", + AuxiliaryType = AuxiliaryDemandType.Constant, + ConstantPowerDemand = Body.GetEx<double>("Padd").SI<Watt>() + }); + } + foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) { + try { + aux.GetEx("Technology").ToObject<List<string>>(); + } catch (Exception) { + throw new VectoException( + "Aux: Technology for aux '{0}' list could not be read. Maybe it is a single string instead of a list of strings?", + aux.GetEx<string>("ID")); + } + + var type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type")); + + var auxData = new AuxiliaryDataInputData { + ID = aux.GetEx<string>("ID"), + Type = type, + Technology = aux.GetEx("Technology").ToObject<List<string>>() + }; + + var auxFile = aux["Path"]; + retVal.Add(auxData); + + if (auxFile == null || EmptyOrInvalidFileName(auxFile.Value<string>())) { + continue; + } + AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxData, + Path.Combine(BasePath, auxFile.Value<string>())); + } + return retVal; + } + } + + + public class JSONInputDataV4 : JSONInputDataV3 + { + public JSONInputDataV4(JObject data, string filename, bool tolerateMissing = false) + : base(data, filename, tolerateMissing) { } + } + + public class JSONVTPInputDataV4 : JSONFile, IVTPInputDataProvider, IVTPJobInputData + { + public JSONVTPInputDataV4(JObject data, string filename, bool tolerateMissing = false) : base(data, filename, + tolerateMissing) { } + + public IVTPJobInputData JobInputData + { + get { return this; } + } + + public IVehicleDeclarationInputData Vehicle + { + get + { + return new XMLDeclarationInputDataProvider( + Path.Combine(Path.GetFullPath(BasePath), Body["DeclarationVehicle"].Value<string>()), + true).JobInputData.Vehicle; + } + } + + public IList<ICycleData> Cycles + { + get + { + var retVal = new List<ICycleData>(); + if (Body[JsonKeys.Job_Cycles] == null) { + return retVal; + } + foreach (var cycle in Body.GetEx(JsonKeys.Job_Cycles)) { + var cycleFile = Path.Combine(BasePath, cycle.Value<string>()); + if (File.Exists(cycleFile)) { + var cycleData = VectoCSVFile.Read(cycleFile); + retVal.Add(new CycleInputData() { + Name = Path.GetFileNameWithoutExtension(cycle.Value<string>()), + CycleData = cycleData + }); + } + } + return retVal; + } + } + + public IEnumerable<double> FanPowerCoefficents + { + get { return Body.GetEx("FanPowerCoefficients").Select(entry => entry.ToString().ToDouble()).ToList(); } + } + + public Meter FanDiameter + { + get { return Body.GetEx<double>("FanDiameter").SI<Meter>(); } + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs index 4091fafada..284edbe947 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs @@ -72,7 +72,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON return new JSONInputDataV3(json, filename, tolerateMissing); case 4: if (json["Body"]["DeclarationVehicle"] != null) { - return new JSONEPTPInputDataV4(json, filename, tolerateMissing); + return new JSONVTPInputDataV4(json, filename, tolerateMissing); } return new JSONInputDataV4(json, filename, tolerateMissing); default: diff --git a/VectoCore/VectoCore/InputData/Reader/DrivingCycleDataReader.cs b/VectoCore/VectoCore/InputData/Reader/DrivingCycleDataReader.cs index a1722ff80c..df1ae6cbea 100644 --- a/VectoCore/VectoCore/InputData/Reader/DrivingCycleDataReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/DrivingCycleDataReader.cs @@ -74,8 +74,8 @@ namespace TUGraz.VectoCore.InputData.Reader if (DistanceBasedCycleDataParser.ValidateHeader(cols, false)) { return CycleType.DistanceBased; } - if (EPTPCycleDataParser.ValidateHeader(cols, false)) { - return CycleType.EPTP; + if (VTPCycleDataParser.ValidateHeader(cols, false)) { + return CycleType.VTP; } throw new VectoException("CycleFile format is unknown."); } @@ -95,8 +95,8 @@ namespace TUGraz.VectoCore.InputData.Reader return new MeasuredSpeedDataParser(); case CycleType.PTO: return new PTOCycleDataParser(); - case CycleType.EPTP: - return new EPTPCycleDataParser(); + case CycleType.VTP: + return new VTPCycleDataParser(); default: throw new ArgumentOutOfRangeException("Cycle Type", type.ToString()); @@ -319,6 +319,11 @@ namespace TUGraz.VectoCore.InputData.Reader public const string EngineSpeed = "n"; public const string EngineSpeedSuffix = "n_eng"; public const string FanSpeed = "n_fan"; + public const string WheelTorqueLeft = "tq_left"; + public const string WheelTorqueRight = "tq_right"; + public const string WheelSpeedLeft = "n_wh_left"; + public const string WheelSpeedRight = "n_wh_right"; + public const string FuelConsumption = "fc"; public const string Gear = "gear"; public const string AdditionalAuxPowerDemand = "Padd"; public const string AirSpeedRelativeToVehicle = "vair_res"; @@ -711,20 +716,28 @@ namespace TUGraz.VectoCore.InputData.Reader /// Parser for PTO Cycles. /// </summary> // <t>,<v> [km/h],<Pwheel> [kW],<n_eng> [rpm],<n_fan> [rpm], <Padd> [kW] - private class EPTPCycleDataParser : AbstractCycleDataParser + private class VTPCycleDataParser : AbstractCycleDataParser { public override IEnumerable<DrivingCycleData.DrivingCycleEntry> Parse(DataTable table, bool crossWindRequired) { ValidateHeader(table.Columns); - var entries = table.Rows.Cast<DataRow>().Select(row => new DrivingCycleData.DrivingCycleEntry { - Time = row.ParseDouble(Fields.Time).SI<Second>(), - VehicleTargetSpeed = row.ParseDouble(Fields.VehicleSpeed).KMPHtoMeterPerSecond(), - AdditionalAuxPowerDemand = row.ParseDoubleOrGetDefault(Fields.AdditionalAuxPowerDemand).SI().Kilo.Watt.Cast<Watt>(), - PWheel = row.ParseDouble(Fields.PWheel).SI().Kilo.Watt.Cast<Watt>(), - EngineSpeed = row.ParseDouble(Fields.EngineSpeedSuffix).RPMtoRad(), - FanSpeed = row.ParseDouble(Fields.FanSpeed).RPMtoRad() - }).ToArray(); + var entries = table.Rows.Cast<DataRow>().Select(row => { + var wheelSpeed = + ((row.ParseDouble(Fields.WheelSpeedLeft) + row.ParseDouble(Fields.WheelSpeedRight)) / 2).RPMtoRad(); + return new DrivingCycleData.DrivingCycleEntry { + Time = row.ParseDouble(Fields.Time).SI<Second>(), + VehicleTargetSpeed = row.ParseDouble(Fields.VehicleSpeed).KMPHtoMeterPerSecond(), + AdditionalAuxPowerDemand = + row.ParseDoubleOrGetDefault(Fields.AdditionalAuxPowerDemand).SI().Kilo.Watt.Cast<Watt>(), + EngineSpeed = row.ParseDouble(Fields.EngineSpeedSuffix).RPMtoRad(), + WheelAngularVelocity = wheelSpeed, + Torque = (row.ParseDouble(Fields.WheelTorqueLeft).SI<NewtonMeter>() * row.ParseDouble(Fields.WheelSpeedLeft).RPMtoRad() + row.ParseDouble(Fields.WheelTorqueRight).SI<NewtonMeter>() * row.ParseDouble(Fields.WheelSpeedRight).RPMtoRad()) / wheelSpeed, + FanSpeed = row.ParseDouble(Fields.FanSpeed).RPMtoRad(), + Gear = (uint)row.ParseDoubleOrGetDefault(Fields.Gear), + Fuelconsumption = row.ParseDoubleOrGetDefault(Fields.FuelConsumption).SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Cast<KilogramPerSecond>(), + }; + }).ToArray(); return entries; } @@ -734,19 +747,26 @@ namespace TUGraz.VectoCore.InputData.Reader var requiredCols = new[] { Fields.Time, Fields.VehicleSpeed, - Fields.PWheel, Fields.EngineSpeedSuffix, - Fields.FanSpeed + Fields.FanSpeed, + Fields.WheelSpeedLeft, + Fields.WheelSpeedRight, + Fields.WheelTorqueLeft, + Fields.WheelTorqueRight, }; var allowedCols = new[] { - Fields.Time, - Fields.VehicleSpeed, - Fields.AdditionalAuxPowerDemand, - Fields.PWheel, - Fields.EngineSpeedSuffix, - Fields.FanSpeed - }; + Fields.Time, + Fields.VehicleSpeed, + Fields.EngineSpeedSuffix, + Fields.FanSpeed, + Fields.WheelSpeedLeft, + Fields.WheelSpeedRight, + Fields.WheelTorqueLeft, + Fields.WheelTorqueRight, + Fields.Gear, + Fields.FuelConsumption + }; const bool allowAux = true; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringEPTPModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringVTPModeVectoRunDataFactory.cs similarity index 73% rename from VectoCore/VectoCore/InputData/Reader/Impl/EngineeringEPTPModeVectoRunDataFactory.cs rename to VectoCore/VectoCore/InputData/Reader/Impl/EngineeringVTPModeVectoRunDataFactory.cs index c0821243ea..ec388ea536 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringEPTPModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringVTPModeVectoRunDataFactory.cs @@ -11,13 +11,13 @@ using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; namespace TUGraz.VectoCore.InputData.Reader.Impl { - internal class EngineeringEPTPModeVectoRunDataFactory : IVectoRunDataFactory + internal class EngineeringVTPModeVectoRunDataFactory : IVectoRunDataFactory { - protected IEPTPInputDataProvider InputDataProvider; + protected IVTPInputDataProvider InputDataProvider; - public EngineeringEPTPModeVectoRunDataFactory(IEPTPInputDataProvider eptpProvider) + public EngineeringVTPModeVectoRunDataFactory(IVTPInputDataProvider ivtpProvider) { - InputDataProvider = eptpProvider; + InputDataProvider = ivtpProvider; } public IEnumerable<VectoRunData> NextRun() @@ -46,8 +46,25 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { var ptoTransmissionData = dao.CreatePTOTransmissionData(InputDataProvider.JobInputData.Vehicle.PTOTransmissionInputData); - var aux = dao.CreateAuxiliaryData(InputDataProvider.JobInputData.Vehicle.AuxiliaryInputData(), MissionType.RegionalDelivery, segment.VehicleClass).ToList(); - aux.RemoveAll(x => x.ID == Constants.Auxiliaries.IDs.Fan); + var auxRD = dao.CreateAuxiliaryData(InputDataProvider.JobInputData.Vehicle.AuxiliaryInputData(), MissionType.RegionalDelivery, segment.VehicleClass).ToList(); + foreach (var entry in auxRD) { + entry.MissionType = MissionType.RegionalDelivery; + } + var auxLH = dao.CreateAuxiliaryData(InputDataProvider.JobInputData.Vehicle.AuxiliaryInputData(), MissionType.LongHaul, segment.VehicleClass).ToList(); + foreach (var entry in auxLH) { + entry.MissionType = MissionType.LongHaul; + } + var auxUD = dao.CreateAuxiliaryData(InputDataProvider.JobInputData.Vehicle.AuxiliaryInputData(), MissionType.UrbanDelivery, segment.VehicleClass).ToList(); + foreach (var entry in auxUD) { + entry.MissionType = MissionType.UrbanDelivery; + } + + var aux = new List<VectoRunData.AuxData>(); + aux.AddRange(auxRD); + aux.AddRange(auxLH); + aux.AddRange(auxUD); + + aux.RemoveAll(x => x.ID == Constants.Auxiliaries.IDs.Fan); aux.Add(new VectoRunData.AuxData { DemandType = AuxiliaryDemandType.Direct, ID = DrivingCycleDataReader.Fields.AdditionalAuxPowerDemand @@ -71,7 +88,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { PTO = ptoTransmissionData, Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name), ExecutionMode = ExecutionMode.Engineering, - AuxFanParameters = InputDataProvider.JobInputData.FanPowerCoefficents.ToArray() + FanData = new AuxFanData() { + FanCoefficients = InputDataProvider.JobInputData.FanPowerCoefficents.ToArray(), + FanDiameter = InputDataProvider.JobInputData.FanDiameter, + } }; }); } diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs index 0232302186..a2c50d1397 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs @@ -103,7 +103,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public int JobRunId { get; internal set; } - public double[] AuxFanParameters { get; internal set; } + public AuxFanData FanData { get; internal set; } public class AuxData { @@ -117,6 +117,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data [Required] public AuxiliaryDemandType DemandType; [ValidateObject] public AuxiliaryData Data; + + public MissionType? MissionType; } public static ValidationResult ValidateRunData(VectoRunData runData, ValidationContext validationContext) @@ -229,4 +231,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Data return null; } } + + public class AuxFanData + { + public double[] FanCoefficients; + + public Meter FanDiameter; + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 019b7e49d1..134faae46a 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -30,6 +30,7 @@ */ using System; +using System.Collections.Generic; using System.Linq; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Models; @@ -70,8 +71,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl return BuildEngineOnly(data); case CycleType.PWheel: return BuildPWheel(data); - case CycleType.EPTP: - return BuildEPTP(data); + case CycleType.VTP: + return BuildVTP(data); case CycleType.MeasuredSpeed: return BuildMeasuredSpeed(data); case CycleType.MeasuredSpeedGear: @@ -126,32 +127,27 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl return container; } - private VehicleContainer BuildEPTP(VectoRunData data) + private VehicleContainer BuildVTP(VectoRunData data) { - if (data.Cycle.CycleType != CycleType.EPTP) { - throw new VectoException("CycleType must be EPTP."); + if (data.Cycle.CycleType != CycleType.VTP) { + throw new VectoException("CycleType must be VTP."); } var container = new VehicleContainer(ExecutionMode.Engineering, _modData, _sumWriter) { RunData = data }; var gearbox = new CycleGearbox(container, data); - // PWheelCycle --> AxleGear --> Clutch --> Engine <-- Aux - var powertrain = new EPTPCycle(container, data.Cycle, data.AxleGearData.AxleGear.Ratio, data.VehicleData, + // VTPCycle --> AxleGear --> Clutch --> Engine <-- Aux + var powertrain = new VTPCycle(container, data.Cycle, data.AxleGearData.AxleGear.Ratio, data.VehicleData, gearbox.ModelData.Gears.ToDictionary(g => g.Key, g => g.Value.Ratio)) .AddComponent(new AxleGear(container, data.AxleGearData)) .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) .AddComponent(gearbox, data.Retarder, container) .AddComponent(new Clutch(container, data.EngineData)); - var engine = new EPTPCombustionEngine(container, data.EngineData, pt1Disabled: true); - - var aux = CreateAuxiliaries(data, container); - aux.AddCycle(Constants.Auxiliaries.IDs.Fan, cycleEntry => { - var fanSpeed = cycleEntry.FanSpeed.AsRPM; - var c1 = data.AuxFanParameters.Length > 0 ? data.AuxFanParameters[0] : 0; - var c2 = data.AuxFanParameters.Length > 1 ? data.AuxFanParameters[1] : 1; - var c3 = data.AuxFanParameters.Length > 2 ? data.AuxFanParameters[2] : 1; - return (c1 * Math.Pow(fanSpeed / c2, 3) * Math.Pow(fanSpeed / c3, 5) * 1000).SI<Watt>(); - }); + var engine = new VTPCombustionEngine(container, data.EngineData, pt1Disabled: true); + + var aux = CreateSpeedDependentAuxiliaries(data, container); + var engineFan = new EngineFanAuxiliary(data.FanData.FanCoefficients, data.FanData.FanDiameter); + aux.AddCycle(Constants.Auxiliaries.IDs.Fan, cycleEntry => engineFan.PowerDemand(cycleEntry.FanSpeed)); container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.Fan); engine.Connect(aux.Port()); @@ -168,7 +164,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl return container; } - private VehicleContainer BuildMeasuredSpeed(VectoRunData data) + + + private VehicleContainer BuildMeasuredSpeed(VectoRunData data) { if (data.Cycle.CycleType != CycleType.MeasuredSpeed) { throw new VectoException("CycleType must be MeasuredSpeed."); @@ -319,6 +317,38 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl return aux; } + private EngineAuxiliary CreateSpeedDependentAuxiliaries(VectoRunData data, IVehicleContainer container) + { + var aux = new EngineAuxiliary(container); + + var auxData = data.Aux.ToArray(); + AddSwitchingAux(aux,container.ModalData,Constants.Auxiliaries.IDs.HeatingVentilationAirCondition, auxData); + AddSwitchingAux(aux,container.ModalData,Constants.Auxiliaries.IDs.SteeringPump, auxData); + AddSwitchingAux(aux,container.ModalData,Constants.Auxiliaries.IDs.ElectricSystem, auxData); + AddSwitchingAux(aux, container.ModalData, Constants.Auxiliaries.IDs.PneumaticSystem, auxData); + + return aux; + } + + private void AddSwitchingAux(EngineAuxiliary aux, IModalDataContainer modData, string auxId, VectoRunData.AuxData[] auxData) + { + var urban = auxData.First(x => x.ID == auxId && x.MissionType == MissionType.UrbanDelivery); + var rural = auxData.First(x => x.ID == auxId && x.MissionType == MissionType.RegionalDelivery); + var motorway = auxData.First(x => x.ID == auxId && x.MissionType == MissionType.LongHaul); + + aux.AddCycle(auxId, entry => { + if (entry.VehicleTargetSpeed >= 70.KMPHtoMeterPerSecond()) { + return motorway.PowerDemand; + } + if (entry.VehicleTargetSpeed >= 50.KMPHtoMeterPerSecond()) { + return rural.PowerDemand; + } + return urban.PowerDemand; + }); + modData.AddAuxiliary(auxId); + } + + private static IGearbox GetGearbox(IVehicleContainer container, VectoRunData runData) { IShiftStrategy strategy; diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs index be8a7420b9..28fb5fe629 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs @@ -89,9 +89,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl private void CreateEngineeringDataReader(IInputDataProvider dataProvider) { - if (dataProvider is IEPTPInputDataProvider) { - var eptpProvider = dataProvider as IEPTPInputDataProvider; - DataReader = new EngineeringEPTPModeVectoRunDataFactory(eptpProvider); + if (dataProvider is IVTPInputDataProvider) { + var eptpProvider = dataProvider as IVTPInputDataProvider; + DataReader = new EngineeringVTPModeVectoRunDataFactory(eptpProvider); return; } if (dataProvider is IEngineeringInputDataProvider) { @@ -203,7 +203,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl break; case CycleType.EngineOnly: case CycleType.PWheel: - case CycleType.EPTP: + case CycleType.VTP: case CycleType.MeasuredSpeed: case CycleType.MeasuredSpeedGear: run = new TimeRun(builder.Build(data)); diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index bc70a64d85..84178bb810 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -299,7 +299,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl commitPriority = 6; }) .If<PTOCycleController>(c => { commitPriority = 99; }) - .If<EPTPCycle>(_ => { commitPriority = 0; }); + .If<VTPCycle>(_ => { commitPriority = 0; }); _components.Add(Tuple.Create(commitPriority, component)); _components = _components.OrderBy(x => x.Item1).Reverse().ToList(); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs index c55ed0fd80..bc299d3abc 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs @@ -29,91 +29,91 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.InputData.Reader.ComponentData; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Models.SimulationComponent.Data -{ - [CustomValidation(typeof(AuxiliaryData), "ValidateAuxMap")] - public sealed class AuxiliaryData - { - [Required, Range(double.Epsilon, 1)] - public double EfficiencyToSupply { get; private set; } - - [Required, Range(double.Epsilon, double.MaxValue)] - public double TransmissionRatio { get; private set; } - - [Required, Range(double.Epsilon, 1)] - public double EfficiencyToEngine { get; private set; } - - [Required] private readonly DelaunayMap _map; - - private string auxId; - - public Watt GetPowerDemand(PerSecond nAuxiliary, Watt powerAuxOut) - { - var value = _map.Interpolate(nAuxiliary.Value(), powerAuxOut.Value()); - if (value.HasValue) { - return value.Value.SI<Watt>(); - } - value = _map.Extrapolate(nAuxiliary.Value(), powerAuxOut.Value()); - return value.Value.SI<Watt>(); - } - - internal AuxiliaryData(string id, double transmissionRatio, double efficiencyToEngine, double efficiencyToSupply, - DelaunayMap map) - { - auxId = id; - _map = map; - TransmissionRatio = transmissionRatio; - EfficiencyToEngine = efficiencyToEngine; - EfficiencyToSupply = efficiencyToSupply; - } - - /// <summary> - /// Validates the aux map. - /// </summary> - /// <param name="data">The data.</param> - /// <param name="context">The validation context.</param> - /// <returns></returns> - // ReSharper disable once UnusedMember.Global - public static ValidationResult ValidateAuxMap(AuxiliaryData data, ValidationContext context) - { - var xValidationRules = new[] { new RangeAttribute(0, double.MaxValue) }; - var yValidationRules = new[] { new RangeAttribute(0, 100.SI().Kilo.Watt.Value()) }; - var zValidationRules = new[] { new RangeAttribute(0, 100.SI().Kilo.Watt.Value()) }; - - var results = new List<ValidationResult>(); - foreach (var entry in data._map.Entries) { - context.DisplayName = AuxiliaryDataReader.Fields.AuxSpeed; - if (!Validator.TryValidateValue(entry.X, context, results, xValidationRules)) { - return new ValidationResult(string.Concat(results)); - } - - context.DisplayName = AuxiliaryDataReader.Fields.SupplyPower; - if (!Validator.TryValidateValue(entry.Y, context, results, yValidationRules)) { - return new ValidationResult(string.Concat(results)); - } - - context.DisplayName = AuxiliaryDataReader.Fields.MechPower; - if (!Validator.TryValidateValue(entry.Z, context, results, zValidationRules)) { - return new ValidationResult(string.Concat(results)); - } - } - return ValidationResult.Success; - } - } - - public class AdvancedAuxData - { - public AuxiliaryModel AuxiliaryAssembly; - - public string AdvancedAuxiliaryFilePath; - - public string AuxiliaryVersion; - } +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.SimulationComponent.Data +{ + [CustomValidation(typeof(AuxiliaryData), "ValidateAuxMap")] + public sealed class AuxiliaryData + { + [Required, Range(double.Epsilon, 1)] + public double EfficiencyToSupply { get; private set; } + + [Required, Range(double.Epsilon, double.MaxValue)] + public double TransmissionRatio { get; private set; } + + [Required, Range(double.Epsilon, 1)] + public double EfficiencyToEngine { get; private set; } + + [Required] private readonly DelaunayMap _map; + + private string auxId; + + public Watt GetPowerDemand(PerSecond nAuxiliary, Watt powerAuxOut) + { + var value = _map.Interpolate(nAuxiliary.Value(), powerAuxOut.Value()); + if (value.HasValue) { + return value.Value.SI<Watt>(); + } + value = _map.Extrapolate(nAuxiliary.Value(), powerAuxOut.Value()); + return value.Value.SI<Watt>(); + } + + internal AuxiliaryData(string id, double transmissionRatio, double efficiencyToEngine, double efficiencyToSupply, + DelaunayMap map) + { + auxId = id; + _map = map; + TransmissionRatio = transmissionRatio; + EfficiencyToEngine = efficiencyToEngine; + EfficiencyToSupply = efficiencyToSupply; + } + + /// <summary> + /// Validates the aux map. + /// </summary> + /// <param name="data">The data.</param> + /// <param name="context">The validation context.</param> + /// <returns></returns> + // ReSharper disable once UnusedMember.Global + public static ValidationResult ValidateAuxMap(AuxiliaryData data, ValidationContext context) + { + var xValidationRules = new[] { new RangeAttribute(0, double.MaxValue) }; + var yValidationRules = new[] { new RangeAttribute(0, 100.SI().Kilo.Watt.Value()) }; + var zValidationRules = new[] { new RangeAttribute(0, 100.SI().Kilo.Watt.Value()) }; + + var results = new List<ValidationResult>(); + foreach (var entry in data._map.Entries) { + context.DisplayName = AuxiliaryDataReader.Fields.AuxSpeed; + if (!Validator.TryValidateValue(entry.X, context, results, xValidationRules)) { + return new ValidationResult(string.Concat(results)); + } + + context.DisplayName = AuxiliaryDataReader.Fields.SupplyPower; + if (!Validator.TryValidateValue(entry.Y, context, results, yValidationRules)) { + return new ValidationResult(string.Concat(results)); + } + + context.DisplayName = AuxiliaryDataReader.Fields.MechPower; + if (!Validator.TryValidateValue(entry.Z, context, results, zValidationRules)) { + return new ValidationResult(string.Concat(results)); + } + } + return ValidationResult.Success; + } + } + + public class AdvancedAuxData + { + public AuxiliaryModel AuxiliaryAssembly; + + public string AdvancedAuxiliaryFilePath; + + public string AuxiliaryVersion; + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs index e9ea12ac4d..13e3415b60 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs @@ -47,7 +47,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data MeasuredSpeed, MeasuredSpeedGear, PTO, - EPTP + VTP } public static class CycleTypeHelper @@ -170,6 +170,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data get { return (Math.Tan(RoadGradient.Value()) * 100).SI<Scalar>(); } } + public KilogramPerSecond Fuelconsumption; + /// <summary> /// relative altitude of the driving cycle over distance /// </summary> diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EPTPCombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EPTPCombustionEngine.cs deleted file mode 100644 index 0405652043..0000000000 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EPTPCombustionEngine.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Models.Simulation; -using TUGraz.VectoCore.Models.Simulation.Data; -using TUGraz.VectoCore.Models.SimulationComponent.Data; -using TUGraz.VectoCore.OutputData; - -namespace TUGraz.VectoCore.Models.SimulationComponent.Impl -{ - public class EPTPCombustionEngine : CombustionEngine - { - public EPTPCombustionEngine(IVehicleContainer container, CombustionEngineData modelData, bool pt1Disabled = false) : base(container, modelData, pt1Disabled) { } - - //protected override void DoWriteModalResults(IModalDataContainer container) - //{ - // ValidatePowerDemand(CurrentState.EngineTorque, CurrentState.DynamicFullLoadTorque, - // CurrentState.FullDragTorque); - - // //var avgEngineSpeed = (PreviousState.EngineSpeed + CurrentState.EngineSpeed) / 2.0; - // var avgEngineSpeed = DataBus.CycleData.LeftSample.EngineSpeed; - // if (avgEngineSpeed.IsSmaller(EngineIdleSpeed, - // DataBus.ExecutionMode == ExecutionMode.Engineering ? 20.RPMtoRad() : 1e-3.RPMtoRad())) { - // Log.Warn("EngineSpeed below idling speed! n_eng_avg: {0}, n_idle: {1}", avgEngineSpeed, - // EngineIdleSpeed); - // } - // container[ModalResultField.P_eng_fcmap] = CurrentState.EngineTorque * avgEngineSpeed; - // container[ModalResultField.P_eng_out] = container[ModalResultField.P_eng_out] is DBNull - // ? CurrentState.EngineTorqueOut * avgEngineSpeed - // : container[ModalResultField.P_eng_out]; - // container[ModalResultField.P_eng_inertia] = CurrentState.InertiaTorqueLoss * avgEngineSpeed; - - // container[ModalResultField.n_eng_avg] = avgEngineSpeed; - // container[ModalResultField.T_eng_fcmap] = CurrentState.EngineTorque; - - // container[ModalResultField.P_eng_full] = CurrentState.DynamicFullLoadTorque * avgEngineSpeed; - // container[ModalResultField.P_eng_full_stat] = CurrentState.StationaryFullLoadTorque * avgEngineSpeed; - // container[ModalResultField.P_eng_drag] = CurrentState.FullDragTorque * avgEngineSpeed; - // container[ModalResultField.Tq_full] = CurrentState.DynamicFullLoadTorque; - // container[ModalResultField.Tq_drag] = CurrentState.FullDragTorque; - - // var result = ModelData.ConsumptionMap.GetFuelConsumption(CurrentState.EngineTorque, avgEngineSpeed, - // DataBus.ExecutionMode != ExecutionMode.Declaration); - // if (DataBus.ExecutionMode != ExecutionMode.Declaration && result.Extrapolated) { - // Log.Warn("FuelConsumptionMap was extrapolated: range for FC-Map is not sufficient: n: {0}, torque: {1}", - // avgEngineSpeed.Value(), CurrentState.EngineTorque.Value()); - // } - // var pt1 = ModelData.FullLoadCurves[DataBus.Gear].PT1(avgEngineSpeed); - // if (DataBus.ExecutionMode == ExecutionMode.Declaration && pt1.Extrapolated) { - // Log.Error("requested rpm below minimum rpm in pt1 - extrapolating. n_eng_avg: {0}", - // avgEngineSpeed); - // } - - // var fc = result.Value; - // var fcAux = fc; - - // var fcWHTC = fcAux * ModelData.FuelConsumptionCorrectionFactor; - // var fcAAUX = fcWHTC; - // var advancedAux = EngineAux as BusAuxiliariesAdapter; - // if (advancedAux != null) { - // advancedAux.DoWriteModalResults(container); - // fcAAUX = advancedAux.AAuxFuelConsumption; - // } - // var fcFinal = fcAAUX; - - // container[ModalResultField.FCMap] = fc; - // container[ModalResultField.FCAUXc] = fcAux; - // container[ModalResultField.FCWHTCc] = fcWHTC; - // container[ModalResultField.FCAAUX] = fcAAUX; - // container[ModalResultField.FCFinal] = fcFinal; - //} - - protected override PerSecond GetEngineSpeed(PerSecond angularSpeed) - { - return DataBus.CycleData.LeftSample.EngineSpeed; - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineFanAuxiliary.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineFanAuxiliary.cs new file mode 100644 index 0000000000..d9c158fa36 --- /dev/null +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineFanAuxiliary.cs @@ -0,0 +1,27 @@ +using System; +using TUGraz.VectoCommon.Utils; + +namespace TUGraz.VectoCore.Models.SimulationComponent.Impl +{ + public class EngineFanAuxiliary + { + protected readonly double[] FanCoefficients; + + protected readonly double FanDiameter; + + public EngineFanAuxiliary(double[] fanParameters, Meter fanDiameter) + { + if (fanParameters.Length < 3) { + throw new ArgumentException("Three fan parameters are required!"); + } + FanCoefficients = fanParameters; + FanDiameter = fanDiameter.ConvertTo().Milli.Meter.Value(); + } + + public Watt PowerDemand(PerSecond fanSpeed) + { + + return (FanCoefficients[0] * Math.Pow(fanSpeed.AsRPM / FanCoefficients[1], 3) * Math.Pow(FanDiameter / FanCoefficients[2], 5) * 1000).SI<Watt>(); + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCombustionEngine.cs new file mode 100644 index 0000000000..ea93e1afa1 --- /dev/null +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCombustionEngine.cs @@ -0,0 +1,21 @@ +using System; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Simulation; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.OutputData; + +namespace TUGraz.VectoCore.Models.SimulationComponent.Impl +{ + public class VTPCombustionEngine : CombustionEngine + { + public VTPCombustionEngine(IVehicleContainer container, CombustionEngineData modelData, bool pt1Disabled = false) : base(container, modelData, pt1Disabled) { } + + + protected override PerSecond GetEngineSpeed(PerSecond angularSpeed) + { + return DataBus.CycleData.LeftSample.EngineSpeed; + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EPTPCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCycle.cs similarity index 90% rename from VectoCore/VectoCore/Models/SimulationComponent/Impl/EPTPCycle.cs rename to VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCycle.cs index 93521a6144..957d0479aa 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EPTPCycle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCycle.cs @@ -13,11 +13,11 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { - internal class EPTPCycle : PWheelCycle + internal class VTPCycle : PWheelCycle { private uint StartGear; - public EPTPCycle(VehicleContainer container, IDrivingCycleData cycle, double axleGearRatio, + public VTPCycle(VehicleContainer container, IDrivingCycleData cycle, double axleGearRatio, VehicleData vehicleData, Dictionary<uint, double> gearRatios) : base(container, cycle) { } public override IResponse Initialize() @@ -97,22 +97,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected override void InitializeCycleData() { FirstRun = false; - var gearRatios = RunData.GearboxData.Gears.ToDictionary(g => g.Key, g => g.Value.Ratio); + var minEngineSpeed = (RunData.EngineData.FullLoadCurves[0].RatedSpeed - RunData.EngineData.IdleSpeed) * + Constants.SimulationSettings.ClutchClosingSpeedNorm + RunData.EngineData.IdleSpeed; + + var gearRatios = RunData.GearboxData.Gears.ToDictionary(g => g.Key, g => g.Value.Ratio); var stopped = false; foreach (var entry in Data.Entries) { stopped = stopped || entry.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), 0.3.KMPHtoMeterPerSecond()); - entry.WheelAngularVelocity = + entry.AngularVelocity = entry.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), 0.3.KMPHtoMeterPerSecond()) ? 0.RPMtoRad() - : entry.VehicleTargetSpeed / RunData.VehicleData.DynamicTyreRadius; - entry.Torque = entry.VehicleTargetSpeed.IsEqual(0, 0.1) - ? 0.SI<NewtonMeter>() - : entry.PWheel / entry.WheelAngularVelocity; + : entry.WheelAngularVelocity; - var cardanSpeed = entry.VehicleTargetSpeed / RunData.VehicleData.DynamicTyreRadius * + var cardanSpeed = entry.WheelAngularVelocity * RunData.AxleGearData.AxleGear.Ratio * (RunData.AngledriveData?.Angledrive.Ratio ?? 1); if (cardanSpeed.IsEqual(0, 1)) { entry.Gear = 0; @@ -127,7 +127,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (stopped && gear < StartGear) entry.Gear = StartGear; else - entry.Gear = gear == 1 && cardanSpeed * gearRatios[1] < RunData.EngineData.IdleSpeed ? 0 : gear; + entry.Gear = gear == 1 && cardanSpeed * gearRatios[1] <= minEngineSpeed ? 0 : gear; if (gear > StartGear) stopped = false; } diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUX/HVAC-Table.csv b/VectoCore/VectoCore/Resources/Declaration/VAUX/HVAC-Table.csv index 5cb1fa8f1f..091638a7c0 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUX/HVAC-Table.csv +++ b/VectoCore/VectoCore/Resources/Declaration/VAUX/HVAC-Table.csv @@ -13,10 +13,10 @@ None , 16 , 0 , 0 , 0 , 0 Default , 1 , , 150 , 150 , , Default , 2 , 200 , 200 , 150 , , Default , 3 , , 200 , 150 , , -Default , 4 , 350 , 200 , , 300 , -Default , 5 , 350 , 200 , , , -Default , 9 , 350 , 200 , , 300 , -Default , 10 , 350 , 200 , , , +Default , 4 , 350 , 200 , 200 , 300 , +Default , 5 , 350 , 200 , 200 , , +Default , 9 , 350 , 200 , 200 , 300 , +Default , 10 , 350 , 200 , 200 , , Default , 11 , 350 , 200 , , 300 , 200 Default , 12 , 350 , 200 , , , 200 Default , 16 , , , , , 200 diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Table.csv b/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Table.csv index ec4bf35e34..ca1eda4f91 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Table.csv +++ b/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Table.csv @@ -2,13 +2,13 @@ HDV Class , Long haul , Regional delivery , Urban delivery , Municipal utility , 1 , , 240/20/20 , 220/20/30 , , 2 , 340/30/0 , 290/30/20 , 260/20/30 , , 3 , , 310/30/30 , 280/30/40 , , -4 , 510/100/0 , 490/40/40 , , 430/30/50 , +4 , 510/100/0 , 490/40/40 , 480/80/60 , 430/30/50 , 5 , 600/120/0 , 540/90/40 , 480/80/60 , , 6 , , , , , 7 , , , , , 8 , , , , , -9 , 600/120/0 , 490/60/40 , , 430/30/50 , -10 , 450/120/0 , 440/90/40 , , , +9 , 600/120/0 , 490/60/40 , 480/80/60 , 430/30/50 , +10 , 450/120/0 , 440/90/40 , 480/80/60 , , 11 , 600/120/0 , 490/60/40 , , 430/30/50 , 640/50/80 12 , 450/120/0 , 440/90/40 , , , 640/50/80 16 , , , , , 640/50/80 \ No newline at end of file diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 7d4ae9baea..858f6ac925 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -181,15 +181,16 @@ <Compile Include="Models\SimulationComponent\Impl\ATShiftStrategy.cs" /> <Compile Include="Models\SimulationComponent\Impl\BaseShiftStrategy.cs" /> <Compile Include="Models\SimulationComponent\Impl\DrivingCycleEnumerator.cs" /> - <Compile Include="Models\SimulationComponent\Impl\EPTPCombustionEngine.cs" /> + <Compile Include="Models\SimulationComponent\Impl\EngineFanAuxiliary.cs" /> + <Compile Include="Models\SimulationComponent\Impl\VTPCombustionEngine.cs" /> <Compile Include="Models\SimulationComponent\Impl\MeasuredSpeedDrivingCycle.cs" /> <Compile Include="Models\SimulationComponent\Impl\PTOCycleController.cs" /> <Compile Include="Models\SimulationComponent\Impl\PWheelCycle.cs" /> <Compile Include="Models\SimulationComponent\Impl\TorqueConverter.cs" /> <Compile Include="Models\SimulationComponent\Impl\IdleControllerSwitcher.cs" /> <Compile Include="Models\Simulation\Data\ModalResultField.cs" /> - <Compile Include="InputData\Reader\Impl\EngineeringEPTPModeVectoRunDataFactory.cs" /> - <Compile Include="Models\SimulationComponent\Impl\EPTPCycle.cs" /> + <Compile Include="InputData\Reader\Impl\EngineeringVTPModeVectoRunDataFactory.cs" /> + <Compile Include="Models\SimulationComponent\Impl\VTPCycle.cs" /> <Compile Include="OutputData\ModFilter\ActualModalDataFilter.cs" /> <Compile Include="OutputData\ModFilter\ModalData1HzFilter.cs" /> <Compile Include="OutputData\XML\AbstractXMLWriter.cs" /> diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/EngineFanAuxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/EngineFanAuxTest.cs new file mode 100644 index 0000000000..47cb92aeec --- /dev/null +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/EngineFanAuxTest.cs @@ -0,0 +1,23 @@ +using NUnit.Framework; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; + +namespace TUGraz.VectoCore.Tests.Models.SimulationComponent +{ + [TestFixture] + public class EngineFanAuxTest + { + + [TestCase(200 , 53.998), + TestCase(500, 843.713), + TestCase(1000, 6749.700), + TestCase(1300, 14829.091), + TestCase(1500, 22780.238)] + public void TestEngineFanPowerDemand(double fanSpeedRPM, double expectedPowerDemand) + { + var engineFan = new EngineFanAuxiliary(new[] { 5.5e-7, 14.62, 108.5 }, 0.225.SI<Meter>()); + + Assert.AreEqual(expectedPowerDemand, engineFan.PowerDemand(fanSpeedRPM.RPMtoRad()).Value(), 1e-3); + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj index 06dec001cf..de45436c96 100644 --- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj +++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj @@ -101,6 +101,7 @@ <Compile Include="Models\SimulationComponentData\TorqueConverterDataTest.cs" /> <Compile Include="Models\SimulationComponentData\ValidationTest.cs" /> <Compile Include="Models\SimulationComponent\ATGearboxTest.cs" /> + <Compile Include="Models\SimulationComponent\EngineFanAuxTest.cs" /> <Compile Include="Models\SimulationComponent\GearboxShiftLossesTest.cs" /> <Compile Include="Models\Simulation\FactoryTest.cs" /> <Compile Include="Models\Simulation\PTOIdleLossTest.cs" /> -- GitLab