This commit is contained in:
2026-04-17 14:55:32 -04:00
commit bc3ac1d4c9
18017 changed files with 4371742 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
<base:BaseView x:Class="DTS.Viewer.Graph.GraphView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:base="clr-namespace:DTS.Common.Base;assembly=DTS.Common"
xmlns:converters="clr-namespace:DTS.Common.Converters;assembly=DTS.Common"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<base:BaseView.Resources>
<ResourceDictionary >
<converters:BooleanToOpacityConverter x:Key="BooleanToOpacityConverter" />
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<converters:InverseBooleanToVisibilityConverter x:Key="InverseBooleanToVisibilityConverter"/>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/CommonStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</base:BaseView.Resources>
<ContentControl x:Name="GraphRegion" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ContentControl.Template>
<ControlTemplate TargetType="ContentControl">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ContentControl Content="{Binding DataSeriesView}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Visibility="{Binding Path=GraphVisibility, Converter={StaticResource BooleanToVisibilityConverter}}" Opacity="{Binding Path=ProgressVisibility, Converter={StaticResource BooleanToOpacityConverter}}" />
<TextBlock Text="{Binding Path=MessageText, FallbackValue='This is a message', Mode=TwoWay}" FontWeight="Bold" FontSize="14" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Visibility="{Binding Path=MessageVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Mode=TwoWay}" TextAlignment="Center" />
<StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Visibility="{Binding Path=ProgressVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Mode=TwoWay}" >
<TextBlock Text="{Binding Path=ProgressText, FallbackValue='This is a message', Mode=TwoWay}" FontWeight="Bold" FontSize="14" TextAlignment="Center" />
<ProgressBar Value="{Binding Path=ProgressPercent, FallbackValue=0, Mode=TwoWay}" />
</StackPanel>
</Grid>
</ControlTemplate>
</ContentControl.Template>
</ContentControl>
</base:BaseView>

View File

@@ -0,0 +1,16 @@
using DTS.Common.Interface;
// ReSharper disable CheckNamespace
namespace DTS.Viewer.Graph
{
/// <summary>
/// Interaction logic for GraphView.xaml
/// </summary>
public partial class GraphView : IGraphView
{
public GraphView()
{
InitializeComponent();
}
}
}

View File

@@ -0,0 +1,313 @@
<base:BaseView x:Class="DTS.Viewer.Graph.TestDataSeriesView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:base="clr-namespace:DTS.Common.Base;assembly=DTS.Common"
xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:converters="clr-namespace:DTS.Common.Converters;assembly=DTS.Common"
mc:Ignorable="d"
d:DesignHeight="600" d:DesignWidth="800"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" x:Name="testDataSeriesView">
<base:BaseView.Resources>
<ResourceDictionary >
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/CommonStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="TextBlock" x:Key="OverlayStyle">
<Setter Property="FontSize" Value="12"/>
<Setter Property="Foreground" Value="#D0000000"/>
</Style>
<converters:BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
<converters:InverseBooleanToVisibilityConverter x:Key="InverseBoolToVisConverter" />
</ResourceDictionary>
</base:BaseView.Resources>
<Grid x:Name="GraphViewGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<c1:C1Chart x:Name="MainChart" Style="{DynamicResource LineChartStyle}" Margin="0"
MouseWheel="MainChart_OnMouseWheel" IsManipulationEnabled="True" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="ActionLeave">
<i:InvokeCommandAction Command="{Binding ActionLeaveCommand}" CommandParameter="{Binding ElementName=MainChart}"/>
</i:EventTrigger>
<i:EventTrigger EventName="ActionEnter">
<i:InvokeCommandAction Command="{Binding ActionEnterCommand}" CommandParameter="{Binding ElementName=MainChart}"/>
</i:EventTrigger>
<i:EventTrigger EventName="MouseUp">
<i:InvokeCommandAction Command="{Binding MouseUpCommand}" CommandParameter="{Binding ElementName=MainChart}"/>
</i:EventTrigger>
<i:EventTrigger EventName="MouseDown">
<i:InvokeCommandAction Command="{Binding MouseDownCommand}" CommandParameter="{Binding ElementName=MainChart}"/>
</i:EventTrigger>
<i:EventTrigger EventName="MouseMove">
<i:InvokeCommandAction Command="{Binding MouseMoveCommand}" CommandParameter="{Binding ElementName=MainChart}"/>
</i:EventTrigger>
<i:EventTrigger EventName="GotFocus">
<i:InvokeCommandAction Command="{Binding GotFocusCommand}" CommandParameter="{Binding ElementName=MainChart}"/>
</i:EventTrigger>
<i:EventTrigger EventName="KeyUp">
<i:InvokeCommandAction Command="{Binding ChartOnKeyUpCommand}" />
</i:EventTrigger>
<!--<i:EventTrigger EventName="KeyUp">
<ei:CallMethodAction MethodName="{Binding ChartOnKeyUpMethod}" TargetObject="{Binding}"/>
</i:EventTrigger>-->
</i:Interaction.Triggers>
<c1:LineAreaOptions.OptimizationRadius>5</c1:LineAreaOptions.OptimizationRadius>
<c1:C1Chart.Actions>
<c1:ZoomAction Fill="{StaticResource Brush_ChartZoomBackground}" Stroke="{x:Null}" Block.IsHyphenationEnabled="False"/>
<c1:TranslateAction Modifiers="Shift" />
<c1:ScaleAction Modifiers="Control" />
</c1:C1Chart.Actions>
<c1:C1Chart.View >
<c1:ChartView Focusable="True">
<c1:ChartView.AxisX>
<c1:Axis Style="{DynamicResource LineChartAxisStyle}" MajorGridStroke="#30000000" MajorGridStrokeThickness="1">
<c1:Axis.ScrollBar>
<c1:AxisScrollBar Margin="0,10,0,0" />
</c1:Axis.ScrollBar>
</c1:Axis>
</c1:ChartView.AxisX>
<c1:ChartView.AxisY>
<c1:Axis Style="{DynamicResource LineChartAxisStyle}" MajorGridStroke="#30000000" MajorGridStrokeThickness="1">
<c1:Axis.ScrollBar>
<c1:AxisScrollBar Margin="0,10,0,0"/>
</c1:Axis.ScrollBar>
</c1:Axis>
</c1:ChartView.AxisY>
<!-- Markers layer -->
<c1:ChartView.Layers>
<c1:ChartPanel Visibility="{Binding Path=MarkerVisibilty}" >
<!-- vertical line and dot markers -->
<c1:ChartPanelObject x:Name="Label"
Attach="DataX"
Action="MouseMove"
DataPoint="0,0"
HorizontalAlignment="Left"
VerticalAlignment="Bottom" RenderTransformOrigin="0.5,0.5">
<c1:ChartPanelObject.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform X="5"/>
<TranslateTransform Y="-5"/>
</TransformGroup>
</c1:ChartPanelObject.RenderTransform>
<Grid DataContext="{Binding RelativeSource={x:Static RelativeSource.Self},Path=Parent}">
<Rectangle Fill="Transparent" Opacity=".95" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
<StackPanel Margin="5,2" Orientation="Horizontal">
<!-- ReSharper disable once Xaml.BindingWithContextNotResolved -->
<TextBlock x:Name="LabelY" Text="{Binding DataPoint.Y, StringFormat=F3}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBlock Text=" @ " VerticalAlignment="Center" HorizontalAlignment="Center"/>
<!-- ReSharper disable once Xaml.BindingWithContextNotResolved -->
<TextBlock x:Name="LabelX" Text="{Binding DataPoint.X, StringFormat=F3}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBlock x:Name="LabelTimeUnits" Text="ms" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</StackPanel>
</Grid>
</c1:ChartPanelObject>
<c1:ChartPanelObject x:Name="Dot"
Attach="DataX"
Action="MouseMove"
DataPoint="0,0"
DataPointChanged="obj_DataPointChanged"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<Ellipse Fill="#55FFFFFF" Stroke="Black" StrokeThickness=".5" Width="10" Height="10" />
</c1:ChartPanelObject>
</c1:ChartPanel>
</c1:ChartView.Layers>
</c1:ChartView>
</c1:C1Chart.View>
<c1:C1ChartLegend Grid.Row="1" x:Name="Legend" Visibility="Collapsed" Foreground="{DynamicResource Brush_ChartForeground}"/>
</c1:C1Chart>
<Grid HorizontalAlignment="Right" Background="#D0FFFFFF" VerticalAlignment="Top"
Margin="10" Visibility="{Binding OverlayVisibility}"
Width="300">
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<EventTrigger RoutedEvent="Control.MouseEnter">
<BeginStoryboard>
<Storyboard >
<DoubleAnimation Duration="0:0:0.2" To="0" Storyboard.TargetProperty="Opacity"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Control.MouseLeave">
<BeginStoryboard>
<Storyboard >
<DoubleAnimation Duration="0:0:0.2" To="1" Storyboard.TargetProperty="Opacity"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Test Setup: " Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding TestSetupName}" Style="{StaticResource OverlayStyle}" TextWrapping="Wrap"/>
<TextBlock Grid.Row="1" Grid.Column="0" Text="Test Id: " Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding TestId}" Style="{StaticResource OverlayStyle}" TextWrapping="Wrap"/>
<TextBlock Grid.Row="2" Grid.Column="0" Text="Group Name: " Style="{StaticResource OverlayStyle}" Visibility="Collapsed"/>
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding GroupName}" Style="{StaticResource OverlayStyle}" Visibility="Collapsed"/>
<TextBlock Grid.Row="3" Grid.Column="0" Text="Hardware Channel: " Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding HardwareChannel}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="4" Grid.Column="0" Text="Serial Number: " Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="4" Grid.Column="1" Text="{Binding SensorSN}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="5" Grid.Column="0" Text="Channel Description: " Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="5" Grid.Column="1" Text="{Binding Description}" Style="{StaticResource OverlayStyle}" TextWrapping="Wrap"/>
<TextBlock Grid.Row="6" Grid.Column="0" Text="Channel User Code: " Style="{StaticResource OverlayStyle}" Visibility="{Binding UserVisibility}"/>
<TextBlock Grid.Row="6" Grid.Column="1" Text="{Binding UserCode}" Style="{StaticResource OverlayStyle}" TextWrapping="Wrap" Visibility="{Binding UserVisibility}"/>
<TextBlock Grid.Row="7" Grid.Column="0" Text="Channel User Name: " Style="{StaticResource OverlayStyle}" Visibility="{Binding UserVisibility}"/>
<TextBlock Grid.Row="7" Grid.Column="1" Text="{Binding UserChannelName}" Style="{StaticResource OverlayStyle}" TextWrapping="Wrap" Visibility="{Binding UserVisibility}"/>
<TextBlock Grid.Row="8" Grid.Column="0" Text="Channel ISO Code: " Style="{StaticResource OverlayStyle}" Visibility="{Binding ISOVisibility}"/>
<TextBlock Grid.Row="8" Grid.Column="1" Text="{Binding ISOCode}" Style="{StaticResource OverlayStyle}" TextWrapping="Wrap" Visibility="{Binding ISOVisibility}"/>
<TextBlock Grid.Row="9" Grid.Column="0" Text="Channel ISO Name: " Style="{StaticResource OverlayStyle}" Visibility="{Binding ISOVisibility}"/>
<TextBlock Grid.Row="9" Grid.Column="1" Text="{Binding ISOChannelName}" Style="{StaticResource OverlayStyle}" TextWrapping="Wrap" Visibility="{Binding ISOVisibility}"/>
<TextBlock Grid.Row="10" Grid.Column="0" Text="Channel Name: " Style="{StaticResource OverlayStyle}" Visibility="{Binding ChannelNameOnlyVisibility}"/>
<TextBlock Grid.Row="10" Grid.Column="1" Text="{Binding UserChannelName}" Style="{StaticResource OverlayStyle}" TextWrapping="Wrap" Visibility="{Binding ChannelNameOnlyVisibility}"/>
<TextBlock Grid.Row="11" Grid.Column="0" Text="Recording Mode: " Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="11" Grid.Column="1" Text="{Binding RecordingMode}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="12" Grid.Column="0" Text="Sample Rate (Hz): " Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="12" Grid.Column="1" Text="{Binding SampleRate}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="13" Grid.Column="0" Text="Hardware Filter (Hz): " Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="13" Grid.Column="1" Text="{Binding HWAAF}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="14" Grid.Column="0" Text="Software Filter Class: " Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="14" Grid.Column="1" Text="{Binding SWAAF}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="15" Grid.Column="0" Text="Excitation (V): " Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="15" Grid.Column="1" Text="{Binding Excitation}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Grid.Row="16" Grid.Column="0" Text="Polarity: " Style="{StaticResource OverlayStyle}" Visibility="{Binding PolarityVisibility}"/>
<TextBlock Grid.Row="16" Grid.Column="1" Text="{Binding Polarity}" Style="{StaticResource OverlayStyle}" Visibility="{Binding PolarityVisibility}"/>
<Rectangle Grid.Row="17" Grid.ColumnSpan="2" Fill="#60000000" StrokeDashArray="" Height="1" Margin="5"/>
<StackPanel Grid.Row="18" Grid.Column="0" Orientation="Horizontal">
<TextBlock Text="Min/Max (" Style="{StaticResource OverlayStyle}"/>
<TextBlock Text="{Binding TitleY}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Text=") :" Style="{StaticResource OverlayStyle}"/>
</StackPanel>
<StackPanel Grid.Row="18" Grid.Column="1" Orientation="Horizontal">
<TextBlock Text="{Binding MinY}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Text="/" Style="{StaticResource OverlayStyle}"/>
<TextBlock Text="{Binding MaxY}" Style="{StaticResource OverlayStyle}"/>
</StackPanel>
<StackPanel Grid.Row="19" Grid.Column="0" Orientation="Horizontal">
<TextBlock Text="Average (" Style="{StaticResource OverlayStyle}"/>
<TextBlock Text="{Binding TitleY}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Text=") :" Style="{StaticResource OverlayStyle}"/>
</StackPanel>
<TextBlock Grid.Row="19" Grid.Column="1" Text="{Binding AvgY}" Style="{StaticResource OverlayStyle}"/>
<StackPanel Grid.Row="20" Grid.Column="0" Orientation="Horizontal">
<TextBlock Text="StdDev (" Style="{StaticResource OverlayStyle}"/>
<TextBlock Text="{Binding TitleY}" Style="{StaticResource OverlayStyle}"/>
<TextBlock Text=") :" Style="{StaticResource OverlayStyle}"/>
</StackPanel>
<TextBlock Grid.Row="20" Grid.Column="1" Text="{Binding StdDevY}" Style="{StaticResource OverlayStyle}"/>
<!-- T0 Value -->
<StackPanel Grid.Row="21" Grid.Column="0" Orientation="Horizontal" Visibility="{Binding FFT, Converter={StaticResource InverseBoolToVisConverter}}">
<TextBlock Text="Value @ T0 (" Style="{StaticResource OverlayStyle}"/>
<TextBlock Text="{Binding TitleY}" Style="{StaticResource OverlayStyle}" />
<TextBlock Text=") :" Style="{StaticResource OverlayStyle}" />
</StackPanel>
<TextBlock Grid.Row="21" Grid.Column="1" Text="{Binding T0EUValue}" Style="{StaticResource OverlayStyle}"
Visibility="{Binding FFT, Converter={StaticResource InverseBoolToVisConverter}}" />
<!-- Cursor Value -->
<StackPanel Grid.Row="22" Grid.Column="0" Orientation="Horizontal" Visibility="{Binding FFT, Converter={StaticResource InverseBoolToVisConverter}}">
<TextBlock Text="Cursor - " Style="{StaticResource OverlayStyle}"/>
</StackPanel>
<TextBlock Grid.Row="22" Grid.Column="1" Text="{Binding CursorValue}" Style="{StaticResource OverlayStyle}"
Visibility="{Binding FFT, Converter={StaticResource InverseBoolToVisConverter}}" />
<!-- Peek Frequency -->
<StackPanel Grid.Row="22" Grid.Column="0" Orientation="Horizontal" Visibility="{Binding FFT, Converter={StaticResource BoolToVisConverter}}">
<TextBlock Text="Peak Magnitude " Style="{StaticResource OverlayStyle}"/>
<TextBlock Text="{Binding PeakMagnitude,StringFormat=N2}" Style="{StaticResource OverlayStyle}" />
<TextBlock Text=" (dB) @ " />
</StackPanel>
<StackPanel Grid.Row="22" Grid.Column="1" Orientation="Horizontal" Visibility="{Binding FFT, Converter={StaticResource BoolToVisConverter}}">
<TextBlock Text="{Binding PeakFrequency,StringFormat=N2}" Style="{StaticResource OverlayStyle}" />
<TextBlock Text=" (Hz)" />
</StackPanel>
<!-- HIC Value -->
<StackPanel Grid.Row="23" Grid.Column="0" Orientation="Horizontal" Visibility="{Binding HIC, Converter={StaticResource BoolToVisConverter}}">
<TextBlock Text="HIC :" Style="{StaticResource OverlayStyle}" />
</StackPanel>
<TextBlock Grid.Row="23" Grid.Column="1" Text="{Binding HICValue}" Style="{StaticResource OverlayStyle}" Visibility="{Binding HIC, Converter={StaticResource BoolToVisConverter}}" />
<!-- T1 Value -->
<StackPanel Grid.Row="24" Grid.Column="0" Orientation="Horizontal" Visibility="{Binding HIC, Converter={StaticResource BoolToVisConverter}}">
<TextBlock Text="T1 (ms) :" Style="{StaticResource OverlayStyle}"/>
</StackPanel>
<TextBlock Grid.Row="24" Grid.Column="1" Text="{Binding T1Time}" Style="{StaticResource OverlayStyle}" Visibility="{Binding HIC, Converter={StaticResource BoolToVisConverter}}"/>
<!-- T2 Value -->
<StackPanel Grid.Row="25" Grid.Column="0" Orientation="Horizontal" Visibility="{Binding HIC, Converter={StaticResource BoolToVisConverter}}">
<TextBlock Text="T2 (ms) :" Style="{StaticResource OverlayStyle}"/>
</StackPanel>
<TextBlock Grid.Row="25" Grid.Column="1" Text="{Binding T2Time}" Style="{StaticResource OverlayStyle}" Visibility="{Binding HIC, Converter={StaticResource BoolToVisConverter}}"/>
</Grid>
</Grid>
</base:BaseView>

View File

@@ -0,0 +1,241 @@
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Imaging;
using C1.WPF.C1Chart;
using C1.WPF.C1Chart.Extended;
using C1.WPF.Pdf;
using DTS.Common.Interface;
using DTS.Common.Utilities.Logging;
using DTS.Common.Utils;
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
using System.Globalization;
// ReSharper disable CheckNamespace
namespace DTS.Viewer.Graph
{
/// <summary>
/// Interaction logic for TestDataSeriesView.xaml
/// </summary>
public partial class TestDataSeriesView : ITestDataSeriesView
{
public TestDataSeriesView()
{
InitializeComponent();
}
private void obj_DataPointChanged(object sender, EventArgs e)
{
//// update label in code from marker
//if (DataContext == null) return;
//var obj = (ChartPanelObject)sender;
//if (obj == null) return;
//var pt = MainChart.View.PointFromData(obj.DataPoint);
//var txt = String.Empty;
//for (var i = 0; i < MainChart.Data.Children.Count; i++)
//{
// double distance = 0; //distance calculated, but not used
// var index = MainChart.View.DataIndexFromPoint(pt, i, MeasureOption.X, out distance);
// if (index == -1) continue;
// txt += Environment.NewLine + MainChart.Data.Children[i].Label + Environment.NewLine + "Y: " + MainChart.Data.Children[i].GetDataValue("Values", index) + Environment.NewLine + "X: " + MainChart.Data.Children[i].GetDataValue("XValues", index);
//}
//var viewModel = (ITestDataSeriesViewModel)DataContext;
//viewModel.CurrentCursorValues = txt;
}
private void MainChart_OnMouseWheel(object sender, MouseWheelEventArgs e)
{
//if (Keyboard.Modifiers == ModifierKeys.Control && e.Delta == -120)
//{
// MainChart.View.AxisX.Scale += 0.1;
// MainChart.View.AxisY.Scale += 0.1;
//}
//else if (Keyboard.Modifiers == ModifierKeys.Control && e.Delta == 120)
//{
// MainChart.View.AxisX.Scale -= 0.1;
// MainChart.View.AxisY.Scale -= 0.1;
//}
}
private void MainChart_OnKeyUp(object sender, KeyEventArgs e)
{
}
public bool SaveReportToPDF(string directory)
{
try
{
if (string.IsNullOrWhiteSpace(directory)) throw new DirectoryNotFoundException();
var indent = 10;
var spacing = 2;
// FB9152: Migrated from ReviewFile.xaml.cs
// Generate Chart Image
var ms = new MemoryStream();
MainChart.SaveImage(ms, ImageFormat.Png);
var bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
var wBmp = new WriteableBitmap(bi);
var dataSeries = ((TestDataSeriesViewModel)MainChart.DataContext).GraphDataSeries;
// create and save pdf document
var pdf = new C1PdfDocument
{
Landscape = false,
PaperKind = System.Globalization.RegionInfo.CurrentRegion.IsMetric ? PaperKind.A4 : PaperKind.Letter,
};
var font = new C1.WPF.Pdf.Font(MainChart.FontFamily.Source, MainChart.FontSize);
var pen = new Pen(System.Windows.Media.Colors.Black);
var drawHeight = indent;
// write test info
var testSetup = $"Test Setup: {dataSeries[0].TestSetupName}";
var testId = $"Test ID: {dataSeries[0].TestId}";
pdf.DrawString(testSetup, font, System.Windows.Media.Colors.Black, new Point(indent, drawHeight));
drawHeight += (int)pdf.MeasureString(testSetup, font).Height;
pdf.DrawString(testId, font, System.Windows.Media.Colors.Black, new Point(indent, drawHeight));
drawHeight += (int)pdf.MeasureString(testId, font).Height;
// draw chart
var chartWidth = pdf.PageSize.Width - indent - indent;
var chartHeight = (chartWidth / MainChart.ActualWidth) * MainChart.ActualHeight;
pdf.DrawImage(wBmp, new Rect(indent,
drawHeight,
chartWidth,
chartHeight));
drawHeight += (int)chartHeight;
// write gRMS table
var colStart = indent * 2;
var col1X = colStart + spacing;
var col2X = col1X + dataSeries.Max(ds => pdf.MeasureString(ds.ChannelName, font).Width) + spacing;
var col3X = col2X + Math.Max(pdf.MeasureString("Sample Rate", font).Width, dataSeries.Max(ds => pdf.MeasureString(ds.SampleRate, font).Width)) + spacing;
var colEnd = col3X + dataSeries.Max(ds => pdf.MeasureString(ds.GRMS.ToString(), font).Width) + spacing;
pdf.DrawLine(pen, col1X, drawHeight, colEnd, drawHeight);
pdf.DrawString("Name", font, System.Windows.Media.Colors.Black, new Point(col1X, drawHeight));
pdf.DrawString("Sample Rate", font, System.Windows.Media.Colors.Black, new Point(col2X, drawHeight));
pdf.DrawString("gRMS", font, System.Windows.Media.Colors.Black, new Point(col3X, drawHeight));
var titleHeight = (int)pdf.MeasureString("gRMS", font).Height;
pdf.DrawLine(pen, col1X, drawHeight, col1X, drawHeight + titleHeight);
pdf.DrawLine(pen, col2X, drawHeight, col2X, drawHeight + titleHeight);
pdf.DrawLine(pen, col3X, drawHeight, col3X, drawHeight + titleHeight);
pdf.DrawLine(pen, colEnd, drawHeight, colEnd, drawHeight + titleHeight);
drawHeight += titleHeight;
pdf.DrawLine(pen, col1X, drawHeight, colEnd, drawHeight);
foreach (var ds in dataSeries)
{
var rowHeight = (int)pdf.MeasureString(ds.ChannelName, font).Height;
pdf.FillRectangle((ds.GraphColor as System.Windows.Media.SolidColorBrush).Color, indent, drawHeight, indent, rowHeight);
pdf.DrawString(ds.ChannelName, font, System.Windows.Media.Colors.Black, new Point(col1X, drawHeight));
pdf.DrawString(ds.SampleRate, font, System.Windows.Media.Colors.Black, new Point(col2X, drawHeight));
pdf.DrawString(ds.GRMS.ToString(), font, System.Windows.Media.Colors.Black, new Point(col3X, drawHeight));
pdf.DrawLine(pen, col1X, drawHeight, col1X, drawHeight + rowHeight);
pdf.DrawLine(pen, col2X, drawHeight, col2X, drawHeight + rowHeight);
pdf.DrawLine(pen, col3X, drawHeight, col3X, drawHeight + rowHeight);
pdf.DrawLine(pen, colEnd, drawHeight, colEnd, drawHeight + rowHeight);
drawHeight += rowHeight;
pdf.DrawLine(pen, col1X, drawHeight, colEnd, drawHeight);
}
//pdf.ImageQuality = ImageQuality.High;
var pdfFileName = directory + "\\" +
DateTime.Now.ToString("M'/'d'/'yyyy", CultureInfo.InvariantCulture).Replace("/", "_") + "_" +
DateTime.Now.ToString("h':'mm' 'tt", CultureInfo.InvariantCulture).Replace(":", "_") + "_" + DateTime.Now.Second + "_" +
DateTime.Now.Millisecond + ".pdf";
if (!System.IO.Directory.Exists(directory)) System.IO.Directory.CreateDirectory(directory);
var pdfPath = Path.Combine(directory, pdfFileName);
pdf.Save(pdfPath);
// 35532 log save path after successful write
APILogger.Log($"Report saved to {pdfPath}");
return true;
}
catch (Exception ex)
{
// 35532
APILogger.Log("Error saving report to PDF");
APILogger.LogException(ex);
}
return false;
}
public bool SaveReportToCSV(string directory)
{
try
{
if (!System.IO.Directory.Exists(directory)) System.IO.Directory.CreateDirectory(directory);
var csvFileName = directory + "\\" +
DateTime.Now.ToString("M'/'d'/'yyyy", CultureInfo.InvariantCulture).Replace("/", "_") + "_" +
DateTime.Now.ToString("h':'mm' 'tt", CultureInfo.InvariantCulture).Replace(":", "_") + "_" + DateTime.Now.Second + "_" +
DateTime.Now.Millisecond + ".PSD.csv";
APILogger.Log("opening ", csvFileName);
using (var fs = new FileStream(csvFileName, FileMode.Create))
{
Encoding encoder;
try
{
encoder = Common.Utils.FileUtils.GetEncoding(Encoding.UTF8.CodePage);
}
catch (System.Exception ex)
{
APILogger.Log("Problem getting encoder", ex);
encoder = Encoding.Default;
}
using (var fileWriter = new StreamWriter(fs, encoder, 1024 * 1000))
{
var dataSeries = ((TestDataSeriesViewModel)MainChart.DataContext).GraphDataSeries;
var header = "Frequency," + string.Join(",", dataSeries.Select(ds => ds.ChannelName).ToArray());
fileWriter.WriteLine(header);
var units = "Hz," + string.Join(",", dataSeries.Select(ds => ds.EngineeringUnits + "^2/Hz"));
fileWriter.WriteLine(units);
for (var i = 0; dataSeries.All(ds => i < ds.Xvalue.Length && i < ds.Yvalue.Length); i++)
{
var line = dataSeries[0].Xvalue[i].ToString() + "," + string.Join(",", dataSeries.Select(ds => ds.Yvalue[i].ToString()).ToArray());
fileWriter.WriteLine(line);
}
}
fs.Close();
// 35532 log save path after successful write
APILogger.Log($"Report saved to {csvFileName}");
}
return true;
}
catch (Exception ex)
{
// 35532
APILogger.Log("Error saving report to CSV");
APILogger.LogException(ex);
}
return false;
}
}
public static class AxisExtension
{
public static double GetDispMin(this Axis axis) { return axis.ActualMin + axis.Value * (axis.ActualMax - axis.ActualMin) * (1 - axis.Scale); }
public static double GetDispMax(this Axis axis) { return axis.ActualMax - (1 - axis.Value) * (axis.ActualMax - axis.ActualMin) * (1 - axis.Scale); }
}
}

View File

@@ -0,0 +1,58 @@
<base:BaseView x:Class="DTS.Viewer.Graph.TestDataView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:base="clr-namespace:DTS.Common.Base;assembly=DTS.Common"
xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:converters="clr-namespace:DTS.Common.Converters;assembly=DTS.Common"
xmlns:behaviors="clr-namespace:DTS.Common.Behaviors;assembly=DTS.Common"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:graph="clr-namespace:DTS.Viewer.Graph"
mc:Ignorable="d"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" d:DataContext="{d:DesignInstance graph:TestDataViewModel}">
<base:BaseView.Resources>
<ResourceDictionary >
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/CommonStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</base:BaseView.Resources>
<Grid x:Name="GraphView" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<c1:C1FlexChart x:Name="MainChart" ChartType="Line" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
ToolTipContent="{} Channel: {seriesName}&#13;Time: {x}&#13;Y: {y}" ScrollViewer.HorizontalScrollBarVisibility="Visible" >
<i:Interaction.Behaviors>
<behaviors:MouseCaptureBehavior Proxy="{Binding}" />
</i:Interaction.Behaviors>
<!--<c1:C1FlexChart.ContextMenu >
<ContextMenu>
<MenuItem Header="Create Marker" Command="{Binding CreateMarkerCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" Visibility="{Binding Path=ShowCursor, Converter={StaticResource BooleanToVisibilityConverter}}" />
</ContextMenu>
</c1:C1FlexChart.ContextMenu>-->
</c1:C1FlexChart>
<Canvas x:Name="ReversibleFrameContainer" Visibility="Collapsed" Background="Transparent" IsHitTestVisible="False">
<Path IsHitTestVisible="False" StrokeDashArray="2, 2" Stroke="Black">
<Path.Data>
<RectangleGeometry x:Name="ReversibleFrame"/>
</Path.Data>
</Path>
</Canvas>
</Grid>
</base:BaseView>

View File

@@ -0,0 +1,90 @@
using System;
using System.Windows;
using System.Windows.Input;
using C1.WPF.Chart;
using DTS.Common.Interface;
// ReSharper disable CheckNamespace
namespace DTS.Viewer.Graph
{
/// <summary>
/// Interaction logic for TestDataSeriesView.xaml
/// </summary>
public partial class TestDataView : ITestDataView
{
//bool zooming = false;
//Point ptStart = new Point();
public TestDataView()
{
InitializeComponent();
//Loaded += TestDataView_Loaded;
}
//private void TestDataView_Loaded(object sender, RoutedEventArgs e)
//{
// SetupChart();
//}
//void SetupChart()
//{
// MainChart.AddHandler(C1FlexChart.MouseLeftButtonDownEvent, new MouseButtonEventHandler(MainChart_MouseLeftButtonDown), true);
// MainChart.AddHandler(C1FlexChart.MouseMoveEvent, new MouseEventHandler(MainChart_MouseMove), true);
// MainChart.AddHandler(C1FlexChart.MouseLeftButtonUpEvent, new MouseButtonEventHandler(MainChart_MouseLeftButtonUp), true);
//}
//private void MainChart_MouseMove(object sender, MouseEventArgs e)
//{
// // when zooming update selection range
// if (zooming)
// {
// var currentPosition = e.GetPosition(MainChart);
// Point ptCurrent = currentPosition;
// // Draw new frame
// DrawReversibleRectangle(ptStart, ptCurrent);
// }
//}
//private void MainChart_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
//{
// ReversibleFrameContainer.Visibility = Visibility.Visible;
// // // Start zooming
// zooming = true;
// // // Save starting point of selection rectangle
// ptStart = e.GetPosition(MainChart);
// MainChart.CaptureMouse();
//}
//private void MainChart_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
//{
// //End zooming
// zooming = false;
// ReversibleFrameContainer.Visibility = Visibility.Collapsed;
// ReversibleFrame.Rect = new Rect();
// var currentPosition = e.GetPosition(MainChart);
// PerformZoom(ptStart, currentPosition);
// //Clean up
// ptStart = new Point();
// MainChart.ReleaseMouseCapture();
//}
//private void PerformZoom(Point ptStart, Point ptLast)
//{
// var p1 = MainChart.PointToData(ptStart);
// var p2 = MainChart.PointToData(ptLast);
// MainChart.BeginUpdate();
// // Update axes with new limits
// MainChart.AxisX.Min = Math.Min(p1.X, p2.X);
// MainChart.AxisY.Min = Math.Min(p1.Y, p2.Y);
// MainChart.AxisX.Max = Math.Max(p1.X, p2.X);
// MainChart.AxisY.Max = Math.Max(p1.Y, p2.Y);
// MainChart.EndUpdate();
//}
//private void DrawReversibleRectangle(Point p1, Point p2)
//{
// // Normalize the rectangle
// var rc = new Rect(Math.Min(p1.X, p2.X), Math.Min(p1.Y, p2.Y),
// Math.Abs(p2.X - p1.X), Math.Abs(p2.Y - p1.Y));
// // Draw the reversible frame
// ReversibleFrame.Rect = rc;
//}
}
}