diff --git a/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs b/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs index 98be48bb79e1b31848ff7d219270d0347d7382ad..cb3db9a735ef3cde080f82cda8750f2db6559185 100644 --- a/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs +++ b/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs @@ -76,6 +76,13 @@ namespace VECTO3GUI.ViewModel.Impl private ICommand _stopSimulationCommand; private bool _canRunSimulation = true; private bool _canStopSimulation = false; + private bool _writeModData; + private bool _writeModData1Hz; + private bool _validateData; + private bool _writeActualModData; + private string _outputDirectory; + private ICommand _browseOutputDirectory; + private bool _writeModelData; #endregion @@ -236,6 +243,57 @@ namespace VECTO3GUI.ViewModel.Impl set { SetProperty(ref _canStopSimulation, value); } } + public bool WriteModData + { + get { return _writeModData; } + set { SetProperty(ref _writeModData, value); } + } + + public bool WriteModData1Hz + { + get { return _writeModData1Hz; } + set { SetProperty(ref _writeModData1Hz,value); } + } + + public bool ValidateData + { + get { return _validateData; } + set { SetProperty(ref _validateData, value); } + } + + public bool WriteActualModData + { + get { return _writeActualModData; } + set { SetProperty(ref _writeActualModData, value); } + } + + public string OutputDirectory + { + get { return _outputDirectory; } + set { SetProperty(ref _outputDirectory, value); } + } + + public ICommand BrowseOutputDirectory + { + get { return _browseOutputDirectory ?? (_browseOutputDirectory = new RelayCommand(DoBrowseOutputDirectory)); } + } + + public bool WriteModelData + { + get { return _writeModelData; } + set { SetProperty(ref _writeModelData, value); } + } + + private void DoBrowseOutputDirectory() + { + var filePath = FileDialogHelper.ShowSelectFilesDialog(false, FileDialogHelper.JobFilter); + if (filePath.IsNullOrEmpty()) + return; + + OutputDirectory = filePath[0]; + } + + public ICommand DoubleClickCommand { get { return _doubleClickCommand ?? (_doubleClickCommand = new RelayCommand<JobEntry>(DoDoubleClick)); } @@ -820,8 +878,14 @@ namespace VECTO3GUI.ViewModel.Impl continue; } - var fileWriter = new FileOutputWriter(Path.GetDirectoryName(fullFileName)); - var runsFactory = new SimulatorFactory(mode, input, fileWriter); + var fileWriter = new FileOutputWriter(GetOutputDirectory(fullFileName)); + var runsFactory = new SimulatorFactory(mode, input, fileWriter) { + WriteModalResults = WriteModData, + ModalResults1Hz = WriteModData1Hz, + Validate = ValidateData, + ActualModalData = WriteActualModData, + SerializeVectoRunData = WriteModelData + }; foreach (var runId in jobContainer.AddRuns(runsFactory)) { fileWriters.Add(runId, fileWriter); } @@ -903,7 +967,7 @@ namespace VECTO3GUI.ViewModel.Impl } foreach (var jobEntry in jobs) { - var w = new FileOutputWriter(Path.GetFullPath(jobEntry.JobEntryFilePath)); + var w = new FileOutputWriter(GetOutputDirectory(jobEntry.JobEntryFilePath)); foreach (var entry in new Dictionary<string, string>() { {w.XMLFullReportName, "XML ManufacturereReport"}, {w.XMLCustomerReportName, "XML Customer Report"}, { w.XMLVTPReportName, "VTP Report"}, {w.XMLPrimaryVehicleReportName, "Primary Vehicle Information File"} }) { if (File.Exists(entry.Key)) { sender.ReportProgress( @@ -932,6 +996,23 @@ namespace VECTO3GUI.ViewModel.Impl }); } + private string GetOutputDirectory(string jobFilePath) + { + var outFile = jobFilePath; + if (!string.IsNullOrWhiteSpace(OutputDirectory)) { + if (Path.IsPathRooted(OutputDirectory)) { + outFile = Path.Combine(OutputDirectory, Path.GetFileName(jobFilePath) ?? ""); + } else { + outFile = Path.Combine(Path.GetDirectoryName(jobFilePath) ?? "", OutputDirectory, Path.GetFileName(jobFilePath) ?? ""); + } + if (!Directory.Exists(Path.GetDirectoryName(outFile))) { + Directory.CreateDirectory(Path.GetDirectoryName(outFile)); + } + } + + return outFile; + } + private void PrintRuns(Dictionary<int, JobContainer.ProgressEntry> progress, Dictionary<int, FileOutputWriter> fileWriters) { foreach (var p in progress) { diff --git a/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs b/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs index 8978d18cb42a760a9ff35525871b3cc6d57f71ee..76a0e46b471f6da00499de14ff4672a067a71785 100644 --- a/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs +++ b/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs @@ -29,5 +29,12 @@ namespace VECTO3GUI.ViewModel.Interfaces ICommand StopSimulation { get; } bool CanRunSimulation { get; } bool CanStopSimulation { get; } + bool WriteModData { get; set; } + bool WriteModData1Hz { get; set; } + bool ValidateData { get; set; } + bool WriteActualModData { get; set; } + string OutputDirectory { get; set; } + ICommand BrowseOutputDirectory { get; } + bool WriteModelData { get; set; } } } diff --git a/VECTO3GUI/Views/JoblistTabView.xaml b/VECTO3GUI/Views/JoblistTabView.xaml index 46414464f6f9537e1c1334eae723a6735f0cd8b7..ed537a0fe8f472c39ad3f55904b8298733f8a138 100644 --- a/VECTO3GUI/Views/JoblistTabView.xaml +++ b/VECTO3GUI/Views/JoblistTabView.xaml @@ -7,7 +7,7 @@ xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:converter="clr-namespace:VECTO3GUI.Helper.Converter" mc:Ignorable="d" - d:DesignHeight="800" d:DesignWidth="500" + d:DesignHeight="500" d:DesignWidth="500" xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" xmlns:interfaces="clr-namespace:VECTO3GUI.ViewModel.Interfaces" Dialog:DialogParticipation.Register="{Binding}"> diff --git a/VECTO3GUI/Views/JoblistView.xaml b/VECTO3GUI/Views/JoblistView.xaml index e85bdc932bffbad53512bbc9bb85e3c63ca5024f..5801e5900ef30abef806b66bdf240905e2cf6e25 100644 --- a/VECTO3GUI/Views/JoblistView.xaml +++ b/VECTO3GUI/Views/JoblistView.xaml @@ -16,163 +16,214 @@ <d:JoblistView.DataContext> <x:Type Type="interfaces:IJoblistViewModel"/> </d:JoblistView.DataContext> - + <Grid> - <Grid.ColumnDefinitions> - <ColumnDefinition Width="80"/> - <ColumnDefinition/> - <ColumnDefinition Width="150"/> - </Grid.ColumnDefinitions> - <Grid.RowDefinitions> - <RowDefinition Height="30"/> - <RowDefinition/> - <RowDefinition/> - <RowDefinition Height="30"/> + <Grid.RowDefinitions> + <RowDefinition Height="*" MinHeight="270"/> + <RowDefinition Height="5"/> + <RowDefinition Height="*"/> </Grid.RowDefinitions> + <TabControl Grid.Row="0" Grid.Column="0"> + <TabItem Header="JobFiles" > + <Grid Margin="0,10,0,0"> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="80"/> + <ColumnDefinition/> + <ColumnDefinition Width="150"/> + </Grid.ColumnDefinitions> + + <Grid Grid.Row="0" Grid.Column="0"> - <Grid Grid.Row="1" Grid.Column="0"> - - <StackPanel Orientation="Vertical"> - <Button VerticalAlignment="Top" Margin="10,10,0,0" + <StackPanel Orientation="Vertical"> + <Button VerticalAlignment="Top" Margin="10,10,0,0" Command="{Binding RunSimulation}" Visibility="{Binding CanRunSimulation, Converter={converter:BoolVisibilityConverter}}"> - <StackPanel Orientation="Horizontal"> - <iconPacks:PackIconModern Width="20" Height="15" Kind="ControlPlay" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green"/> - <TextBlock Text="Start" Margin="5,0,0,0" /> - </StackPanel> - </Button> - <Button VerticalAlignment="Top" Margin="10,10,0,0" + <StackPanel Orientation="Horizontal"> + <iconPacks:PackIconModern Width="20" Height="15" Kind="ControlPlay" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green"/> + <TextBlock Text="Start" Margin="5,0,0,0" /> + </StackPanel> + </Button> + <Button VerticalAlignment="Top" Margin="10,10,0,0" Command="{Binding StopSimulation}" Visibility="{Binding CanStopSimulation, Converter={converter:BoolVisibilityConverter}}"> - <StackPanel Orientation="Horizontal"> - <iconPacks:PackIconModern Width="20" Height="15" Kind="ControlStop" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Red"/> - <TextBlock Text="Stop" Margin="5,0,0,0" /> - </StackPanel> - </Button> + <StackPanel Orientation="Horizontal"> + <iconPacks:PackIconModern Width="20" Height="15" Kind="ControlStop" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Red"/> + <TextBlock Text="Stop" Margin="5,0,0,0" /> + </StackPanel> + </Button> - <StackPanel Orientation="Vertical" HorizontalAlignment="Right" Margin="0,10,0,0"> - <Button Width="25" + <StackPanel Orientation="Vertical" HorizontalAlignment="Right" Margin="0,10,0,0"> + <Button Width="25" Command="{Binding MoveJobUp}" CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}"> - <StackPanel Orientation="Horizontal"> - <iconPacks:PackIconModern Width="15" Height="15" Kind="ArrowUp" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green"/> - </StackPanel> - </Button> + <StackPanel Orientation="Horizontal"> + <iconPacks:PackIconModern Width="15" Height="15" Kind="ArrowUp" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green"/> + </StackPanel> + </Button> - <Button Width="25" Margin="0,5,0,0" + <Button Width="25" Margin="0,5,0,0" Command="{Binding MoveJobDown}" CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}"> - <StackPanel Orientation="Horizontal"> - <iconPacks:PackIconModern Width="15" Height="15" Kind="ArrowDown" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green"/> + <StackPanel Orientation="Horizontal"> + <iconPacks:PackIconModern Width="15" Height="15" Kind="ArrowDown" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green"/> + </StackPanel> + </Button> + </StackPanel> </StackPanel> - </Button> - </StackPanel> - </StackPanel> - </Grid> + </Grid> + + <Grid Grid.Row="0" Grid.Column="1" Margin="10"> - <Grid Grid.Row="1" Grid.Column="1" Margin="10"> - - <DataGrid x:Name="JobList" ItemsSource="{Binding Jobs}" + <DataGrid x:Name="JobList" ItemsSource="{Binding Jobs}" SelectedValue="{Binding DataContext.SelectedJobEntry, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" Style="{DynamicResource AzureDataGrid}" BorderThickness="1" CanUserAddRows="False" AutoGenerateColumns="False" SelectionUnit="FullRow" IsReadOnly="False" HeadersVisibility="All" RowHeaderWidth="5" IsSynchronizedWithCurrentItem="True" Drop="JobList_OnDrop" AllowDrop="True"> - <DataGrid.InputBindings> - <MouseBinding + <DataGrid.InputBindings> + <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding DoubleClickCommand}" CommandParameter="{Binding Jobs/}"/> - </DataGrid.InputBindings> + </DataGrid.InputBindings> - <DataGrid.Resources> - <ContextMenu x:Key="RowMenu"> - <MenuItem Header="{Binding DataContext.FirstContextMenu, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" + <DataGrid.Resources> + <ContextMenu x:Key="RowMenu"> + <MenuItem Header="{Binding DataContext.FirstContextMenu, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" Command="{Binding DataContext.OpenJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" CommandParameter="{Binding Source={x:Static impl:JobFileType.PrimaryBusFile}}" Visibility="{Binding DataContext.VisibilityFirstView, Converter={converter:BoolVisibilityConverter}, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/> - <MenuItem Header="View Completed Bus File" + <MenuItem Header="View Completed Bus File" Command="{Binding DataContext.OpenJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" CommandParameter="{Binding Source={x:Static impl:JobFileType.CompletedBusFile}}" Visibility="{Binding DataContext.VisibilitySecView, Converter={converter:BoolVisibilityConverter}, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/> - <Separator HorizontalAlignment="Stretch" Background="Gray"/> + <Separator HorizontalAlignment="Stretch" Background="Gray"/> - <MenuItem Header="Edit Job" + <MenuItem Header="Edit Job" Command="{Binding DataContext.EditJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" CommandParameter="{Binding DataContext.SelectedJobEntry, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/> - <MenuItem Header="Edit Completed File" + <MenuItem Header="Edit Completed File" Command="{Binding DataContext.EditCompletedFile, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" CommandParameter="{Binding DataContext.SelectedJobEntry, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/> - <Separator HorizontalAlignment="Stretch" Background="Gray"/> + <Separator HorizontalAlignment="Stretch" Background="Gray"/> - <MenuItem Header="Show In Folder" + <MenuItem Header="Show In Folder" Command="{Binding DataContext.OpenInFolder, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" CommandParameter="{Binding DataContext.SelectedJobEntry, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/> - <Separator HorizontalAlignment="Stretch" Background="Gray"/> + <Separator HorizontalAlignment="Stretch" Background="Gray"/> - <MenuItem Header="Remove Job" + <MenuItem Header="Remove Job" Command="{Binding DataContext.RemoveJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" CommandParameter="{Binding DataContext.SelectedJobEntry, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/> - </ContextMenu> - </DataGrid.Resources> - - <DataGrid.ContextMenu> - <ContextMenu> - <MenuItem Header="Add Job" Command="{Binding AddJob}"/> - <Separator HorizontalAlignment="Stretch" Background="Gray"/> - <MenuItem Header="Create Single Bus Job" + </ContextMenu> + </DataGrid.Resources> + + <DataGrid.ContextMenu> + <ContextMenu> + <MenuItem Header="Add Job" Command="{Binding AddJob}"/> + <Separator HorizontalAlignment="Stretch" Background="Gray"/> + <MenuItem Header="Create Single Bus Job" Command="{Binding AddBusJob}" CommandParameter="{Binding Source={x:Static impl:JobType.SingleBusJob}}"/> - <MenuItem Header="Create Completed Bus Job" + <MenuItem Header="Create Completed Bus Job" Command="{Binding AddBusJob}" CommandParameter="{Binding Source={x:Static impl:JobType.CompletedBusJob}}"/> - <MenuItem Header="Create Completed XML" + <MenuItem Header="Create Completed XML" Command="{Binding CreateNewJob}"/> - <Separator HorizontalAlignment="Stretch" Background="Gray"/> - <MenuItem Header="Remove All" Command="{Binding RemoveAllJobs}"/> - </ContextMenu> - </DataGrid.ContextMenu> + <Separator HorizontalAlignment="Stretch" Background="Gray"/> + <MenuItem Header="Remove All" Command="{Binding RemoveAllJobs}"/> + </ContextMenu> + </DataGrid.ContextMenu> - <DataGrid.Columns> - <DataGridCheckBoxColumn Binding="{Binding Selected, UpdateSourceTrigger=PropertyChanged}" /> - <DataGridTextColumn Header="File Path" Binding="{Binding JobEntryFilePath}" IsReadOnly="True"> - <DataGridTextColumn.CellStyle> - <Style TargetType= "{x:Type DataGridCell}" BasedOn="{StaticResource MetroDataGridCell}" > - <Setter Property="ContextMenu" Value="{StaticResource RowMenu}"/> - <Setter Property="HorizontalAlignment" Value="Stretch"/> - </Style> - </DataGridTextColumn.CellStyle> - </DataGridTextColumn> - </DataGrid.Columns> + <DataGrid.Columns> + <DataGridCheckBoxColumn Binding="{Binding Selected, UpdateSourceTrigger=PropertyChanged}" /> + <DataGridTextColumn Header="File Path" Binding="{Binding JobEntryFilePath}" IsReadOnly="True"> + <DataGridTextColumn.CellStyle> + <Style TargetType= "{x:Type DataGridCell}" BasedOn="{StaticResource MetroDataGridCell}" > + <Setter Property="ContextMenu" Value="{StaticResource RowMenu}"/> + <Setter Property="HorizontalAlignment" Value="Stretch"/> + </Style> + </DataGridTextColumn.CellStyle> + </DataGridTextColumn> + </DataGrid.Columns> - </DataGrid> + </DataGrid> - </Grid> + </Grid> - <Grid Grid.Row="1" Grid.Column="2" Margin="0,0,10,0"> - <StackPanel Orientation="Vertical" Margin="0,30,0,0" Width="105"> - <Button Margin="0,5,0,0" Content="Add File" + <Grid Grid.Row="0" Grid.Column="2" Margin="0,0,10,0"> + <StackPanel Orientation="Vertical" Margin="0,30,0,0" Width="105"> + <Button Margin="0,5,0,0" Content="Add File" Command="{Binding AddJob}"/> - <Button Margin="0,5,0,0" Content="Edit Job" + <Button Margin="0,5,0,0" Content="Edit Job" Command="{Binding EditJob}" CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}"/> - <Button Margin="0,5,0,0" Content="Remove Job" + <Button Margin="0,5,0,0" Content="Remove Job" Command="{Binding RemoveJob}" CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}"/> - <Button Margin="0,5,0,0" Content="Edit Completed File" + <Button Margin="0,5,0,0" Content="Edit Completed File" Command="{Binding EditCompletedFile}" CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}"/> - </StackPanel> - </Grid> + </StackPanel> + </Grid> + </Grid> + </TabItem> + <TabItem Header="Options"> + <StackPanel Orientation="Horizontal" Margin="5,10,5,5"> + <StackPanel Orientation="Vertical"> + <GroupBox Header="Output"> + <StackPanel Orientation="Vertical"> + <CheckBox Margin="0,0,0,3" IsChecked="{Binding WriteModData}">Write modal results</CheckBox> + <CheckBox Margin="0,0,0,3" IsChecked="{Binding WriteModData1Hz}">Modal results in 1Hz</CheckBox> + </StackPanel> + </GroupBox> + <GroupBox Header="Misc" Margin="0 5,0,0"> + <StackPanel Orientation="Vertical"> + <CheckBox Margin="0,0,0,3" IsChecked="{Binding ValidateData}">Validate data</CheckBox> + <CheckBox Margin="0,0,0,3" IsChecked="{Binding WriteActualModData}"> + <TextBlock> + <Run> Output values in vmod at</Run><LineBreak/> + <Run>beginning and end of</Run><LineBreak/> + <Run>simulation interval</Run><LineBreak/> + <Run>(EXPERT!)</Run> + </TextBlock> + </CheckBox> + </StackPanel> + </GroupBox> + </StackPanel> + <StackPanel Orientation="Vertical" Margin="5,0,0,0"> + <GroupBox Header ="Output Directory"> + <StackPanel Orientation="Horizontal"> + <TextBox Width="200" Text="{Binding OutputDirectory}"/> + <Button Width="25" Command="{Binding BrowseOutputDirectory}" Margin="5,0,0,0"> + <StackPanel Orientation="Horizontal"> + <iconPacks:PackIconModern Width="15" Height="15" Kind="FolderOpen" VerticalAlignment="Center" HorizontalAlignment="Center"/> + </StackPanel> + </Button> + + </StackPanel> + </GroupBox> + <GroupBox Header="Simulation Data" Margin =" 0,5,0,0"> + <StackPanel Orientation="Vertical"> + <CheckBox IsChecked="{Binding WriteModelData}" Margin="0,0,0,3">Write internal model data (EXPERT!)</CheckBox> + </StackPanel> + </GroupBox> + </StackPanel> + </StackPanel> + + </TabItem> + </TabControl> + + <GridSplitter Grid.Row="1" Height="5" HorizontalAlignment="Stretch"/> - <Grid Grid.Row="2" Grid.ColumnSpan="3" Grid.Column="0" Margin="10,20,20,10"> + <Grid Grid.Row="2" Grid.Column="0" Margin="10,10,10,10"> <DataGrid ItemsSource="{Binding Messages}" BorderThickness="1" CanUserAddRows="False" AutoGenerateColumns="False" SelectionUnit="FullRow" IsReadOnly="True" HeadersVisibility="All" RowHeaderWidth="5" RowHeight="5" Name="MessageList"> @@ -222,6 +273,7 @@ </DataGrid.CellStyle> </DataGrid> </Grid> + </Grid> </UserControl>