Commit 759d1131 authored by 540597360@qq.com's avatar 540597360@qq.com

首次使用ComponentOne C1Chart

parent eeeb97c2
C1.WPF.C1Chart.C1Chart, C1.WPF.C1Chart.4
C1.WPF.C1Chart.C1ChartLegend, C1.WPF.C1Chart.4
C1.WPF.C1Chart3D.C1Chart3D, C1.WPF.C1Chart3D.4
C1.WPF.C1Chart3D.C1Chart3DLegend, C1.WPF.C1Chart3D.4
C1.WPF.Extended.C1PropertyGrid, C1.WPF.Extended.4
C1.WPF.FlexGrid.C1FlexGrid, C1.WPF.FlexGrid.4
C1.WPF.C1NumericBox, C1.WPF.4
\ No newline at end of file
...@@ -41,9 +41,33 @@ ...@@ -41,9 +41,33 @@
<StartupObject /> <StartupObject />
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="C1.Win.C1Chart.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=a22e16972c085838, processorArchitecture=MSIL"> <Reference Include="C1.WPF.4, Version=4.0.20183.611, Culture=neutral, PublicKeyToken=2aa4ec5576d6c3ce, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files (x86)\ComponentOne\WPF Edition\bin\v4\C1.Win.C1Chart.4.dll</HintPath> <HintPath>C:\Program Files (x86)\ComponentOne\WPF Edition\bin\v4\C1.WPF.4.dll</HintPath>
</Reference>
<Reference Include="C1.WPF.C1Chart.4, Version=4.0.20183.611, Culture=neutral, PublicKeyToken=2aa4ec5576d6c3ce, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files (x86)\ComponentOne\WPF Edition\bin\v4\C1.WPF.C1Chart.4.dll</HintPath>
</Reference>
<Reference Include="C1.WPF.C1Chart.Extended.4, Version=4.0.20183.611, Culture=neutral, PublicKeyToken=2aa4ec5576d6c3ce, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files (x86)\ComponentOne\WPF Edition\bin\v4\C1.WPF.C1Chart.Extended.4.dll</HintPath>
</Reference>
<Reference Include="C1.WPF.C1Chart3D.4, Version=4.0.20183.611, Culture=neutral, PublicKeyToken=2aa4ec5576d6c3ce, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files (x86)\ComponentOne\WPF Edition\bin\v4\C1.WPF.C1Chart3D.4.dll</HintPath>
</Reference>
<Reference Include="C1.WPF.DX.4, Version=4.0.20183.611, Culture=neutral, PublicKeyToken=2aa4ec5576d6c3ce, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files (x86)\ComponentOne\WPF Edition\bin\v4\C1.WPF.DX.4.dll</HintPath>
</Reference>
<Reference Include="C1.WPF.Extended.4, Version=4.0.20183.611, Culture=neutral, PublicKeyToken=2aa4ec5576d6c3ce, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files (x86)\ComponentOne\WPF Edition\bin\v4\C1.WPF.Extended.4.dll</HintPath>
</Reference>
<Reference Include="C1.WPF.FlexGrid.4, Version=4.0.20183.611, Culture=neutral, PublicKeyToken=2aa4ec5576d6c3ce, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files (x86)\ComponentOne\WPF Edition\bin\v4\C1.WPF.FlexGrid.4.dll</HintPath>
</Reference> </Reference>
<Reference Include="LiveCharts, Version=0.9.7.0, Culture=neutral, PublicKeyToken=0bc1f845d1ebb8df, processorArchitecture=MSIL"> <Reference Include="LiveCharts, Version=0.9.7.0, Culture=neutral, PublicKeyToken=0bc1f845d1ebb8df, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
...@@ -143,6 +167,7 @@ ...@@ -143,6 +167,7 @@
<DependentUpon>Settings.settings</DependentUpon> <DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput> <DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile> </Compile>
<EmbeddedResource Include="Properties\licenses.licx" />
<EmbeddedResource Include="Properties\Resources.resx"> <EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator> <Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput> <LastGenOutput>Resources.Designer.cs</LastGenOutput>
......
C1.WPF.C1Chart.C1Chart, C1.WPF.C1Chart.4
C1.WPF.C1Chart.C1ChartLegend, C1.WPF.C1Chart.4
C1.WPF.C1Chart3D.C1Chart3D, C1.WPF.C1Chart3D.4
C1.WPF.C1Chart3D.C1Chart3DLegend, C1.WPF.C1Chart3D.4
C1.WPF.Extended.C1PropertyGrid, C1.WPF.Extended.4
C1.WPF.FlexGrid.C1FlexGrid, C1.WPF.FlexGrid.4
C1.WPF.C1NumericBox, C1.WPF.4
\ No newline at end of file
...@@ -28,7 +28,7 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -28,7 +28,7 @@ namespace FLY.HeatingHelper.UI.UIModule
{ {
InitializeComponent(); InitializeComponent();
_dat = DataManager.GetThickDataInstance(); _dat = DataManager.GetThickDataInstance();
_dat.SetDB("airring.sqlite3"); _dat.SetDB(@"D:\blowingdata\airring.sqlite3");
this.DataContext = _dat; this.DataContext = _dat;
} }
......
...@@ -183,7 +183,7 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -183,7 +183,7 @@ namespace FLY.HeatingHelper.UI.UIModule
private async void Page_Loaded(object sender, RoutedEventArgs e) private async void Page_Loaded(object sender, RoutedEventArgs e)
{ {
await Task.Delay(100); await Task.Delay(200);
Default_cb_Click(this, null); Default_cb_Click(this, null);
} }
......
...@@ -7,7 +7,18 @@ ...@@ -7,7 +7,18 @@
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" Loaded="UserControl_Loaded" Unloaded="UserControl_Unloaded"> d:DesignHeight="450" d:DesignWidth="800" Loaded="UserControl_Loaded" Unloaded="UserControl_Unloaded">
<UserControl.Resources>
<local:LockFramesConverter x:Key="lfc"/>
</UserControl.Resources>
<Grid> <Grid>
<Grid.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontSize" Value="14"/>
</Style>
<Style TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="12"/>
</Style>
</Grid.Resources>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
...@@ -47,8 +58,20 @@ ...@@ -47,8 +58,20 @@
<DockPanel.Resources> <DockPanel.Resources>
<Style x:Key="tb_style" TargetType="TextBlock"> <Style x:Key="tb_style" TargetType="TextBlock">
<Setter Property="Background" Value="AntiqueWhite"/> <Setter Property="Background" Value="AntiqueWhite"/>
<Setter Property="FontSize" Value="16"/>
</Style> </Style>
</DockPanel.Resources> </DockPanel.Resources>
<Grid DockPanel.Dock="Top" Margin="0,0,0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="锁定设置:"/>
<RadioButton Content="锁定1幅" Grid.Column="1" IsChecked="{Binding LockFrames,Converter={StaticResource lfc},ConverterParameter=1}"/>
<RadioButton Content="锁定2幅" Grid.Column="2" IsChecked="{Binding LockFrames,Converter={StaticResource lfc},ConverterParameter=2}"/>
</Grid>
<Grid DockPanel.Dock="Top"> <Grid DockPanel.Dock="Top">
<ProgressBar Value="{Binding SearchProgressValue}" Width="{Binding ElementName=searchBtn, Path=ActualWidth}"/> <ProgressBar Value="{Binding SearchProgressValue}" Width="{Binding ElementName=searchBtn, Path=ActualWidth}"/>
<Button Content="搜索最大相关度" Click="AutoSearch_Shift" x:Name="searchBtn" <Button Content="搜索最大相关度" Click="AutoSearch_Shift" x:Name="searchBtn"
......
...@@ -17,6 +17,7 @@ using System.Windows.Shapes; ...@@ -17,6 +17,7 @@ using System.Windows.Shapes;
using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Double;
using LiveCharts.Wpf; using LiveCharts.Wpf;
using System.Globalization;
namespace FLY.HeatingHelper.UI.UIModule namespace FLY.HeatingHelper.UI.UIModule
{ {
...@@ -94,6 +95,8 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -94,6 +95,8 @@ namespace FLY.HeatingHelper.UI.UIModule
public UC_FramePickerViewModel vm1 = new UC_FramePickerViewModel(); public UC_FramePickerViewModel vm1 = new UC_FramePickerViewModel();
public UC_FramePickerViewModel vm2 = new UC_FramePickerViewModel(); public UC_FramePickerViewModel vm2 = new UC_FramePickerViewModel();
public int LockFrames { get; set; } = 1;
public int SearchProgressValue { get; set; } = 0; public int SearchProgressValue { get; set; } = 0;
public bool SearchEnabled { get; set; } = true; public bool SearchEnabled { get; set; } = true;
...@@ -118,7 +121,7 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -118,7 +121,7 @@ namespace FLY.HeatingHelper.UI.UIModule
_airRingShift = value; _airRingShift = value;
while (_airRingShift < 0) _airRingShift += cnt; while (_airRingShift < 0) _airRingShift += cnt;
while (_airRingShift >= cnt) _airRingShift -= cnt; while (_airRingShift >= cnt) _airRingShift -= cnt;
int rb = resetBolt1 + _airRingShift; int rb = _airRingShift + resetBolt1;
while (rb < 0) rb += cnt; while (rb < 0) rb += cnt;
while (rb >= cnt) rb -= cnt; while (rb >= cnt) rb -= cnt;
ResetBolt = rb; ResetBolt = rb;
...@@ -177,6 +180,9 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -177,6 +180,9 @@ namespace FLY.HeatingHelper.UI.UIModule
{ {
var tmpVM = ViewModel_HeatDetector.Instance; var tmpVM = ViewModel_HeatDetector.Instance;
tmpVM.PropertyChanged += DataSelecter_PropertyChanged; tmpVM.PropertyChanged += DataSelecter_PropertyChanged;
vm2.SelectedFrame = vm2.MaxFrame;
vm1.UpdateChart();
vm2.UpdateChart();
} }
public void UnLoaded(object s) public void UnLoaded(object s)
...@@ -237,13 +243,14 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -237,13 +243,14 @@ namespace FLY.HeatingHelper.UI.UIModule
switch (whichframe) switch (whichframe)
{ {
case 1: case 1:
vth1 = _data.GetThicks(vm1.SelectedFrame, int.MaxValue, RotAngle); vth1 = _data.GetThicks(vm1.SelectedFrame, vm2.ResetBolt, RotAngle);
vheat1 = _data.GetHeats(vm1.SelectedFrame, -1, -1); vheat1 = _data.GetHeats(vm1.SelectedFrame, -1, -1);
resetBolt1 = _data.GetResetBolt(vm1.SelectedFrame); resetBolt1 = _data.GetResetBolt(vm1.SelectedFrame);
rotAngle1 = _data.GetRotAngle(vm1.SelectedFrame); rotAngle1 = _data.GetRotAngle(vm1.SelectedFrame);
break; break;
case 2: case 2:
vth2 = _data.GetThicks(vm2.SelectedFrame, int.MaxValue, RotAngle); vth2 = _data.GetThicks(vm2.SelectedFrame, vm2.ResetBolt, RotAngle);
vth1 = _data.GetThicks(vm1.SelectedFrame, vm2.ResetBolt, RotAngle);
vheat2 = _data.GetHeats(vm2.SelectedFrame, -1, -1); vheat2 = _data.GetHeats(vm2.SelectedFrame, -1, -1);
resetBolt2 = _data.GetResetBolt(vm2.SelectedFrame); resetBolt2 = _data.GetResetBolt(vm2.SelectedFrame);
rotAngle2 = _data.GetRotAngle(vm2.SelectedFrame); rotAngle2 = _data.GetRotAngle(vm2.SelectedFrame);
...@@ -265,8 +272,8 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -265,8 +272,8 @@ namespace FLY.HeatingHelper.UI.UIModule
/// <returns></returns> /// <returns></returns>
private bool UpdateThickData() private bool UpdateThickData()
{ {
vth1 = _data.GetThicks(vm1.SelectedFrame, int.MaxValue, RotAngle); vth1 = _data.GetThicks(vm1.SelectedFrame, vm2.ResetBolt, RotAngle);
vth2 = _data.GetThicks(vm2.SelectedFrame, int.MaxValue, RotAngle); vth2 = _data.GetThicks(vm2.SelectedFrame, vm2.ResetBolt, RotAngle);
if ((vth1 == null) || (vth2 == null) || (vheat1 == null) || (vheat2 == null)) if ((vth1 == null) || (vth2 == null) || (vheat1 == null) || (vheat2 == null))
{ {
return false; return false;
...@@ -302,14 +309,14 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -302,14 +309,14 @@ namespace FLY.HeatingHelper.UI.UIModule
} }
else else
{ {
//s = ResetBolt - resetBolt1; s = ResetBolt - resetBolt1;
s = resetBolt1 - ResetBolt; //s = resetBolt1 + ResetBolt;
} }
int cnt = vth1.Count(); int cnt = vth1.Count();
while (s >= cnt) s -= cnt; while (s >= cnt) s -= cnt;
while (s < 0) s += cnt; while (s < 0) s += cnt;
var vth = DataHelper.VectorSub(vth1, vth2); var vth = DataHelper.VectorSub(vth1, vth2);
var tmp = vth.Concat(vth).Skip(s).Take(cnt); var tmp = vth.Concat(vth).Skip(cnt-s).Take(cnt);
var vheat = DataHelper.VectorSub(vheat2, vheat1); var vheat = DataHelper.VectorSub(vheat2, vheat1);
...@@ -352,7 +359,7 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -352,7 +359,7 @@ namespace FLY.HeatingHelper.UI.UIModule
if(s == int.MaxValue) if(s == int.MaxValue)
{ {
AirRingShift = 0; AirRingShift = 0;
ResetBolt = _data.GetResetBolt(vm1.SelectedFrame); //ResetBolt = _data.GetResetBolt(vm1.SelectedFrame);
return; return;
} }
else else
...@@ -383,29 +390,35 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -383,29 +390,35 @@ namespace FLY.HeatingHelper.UI.UIModule
{ {
SearchEnabled = false; SearchEnabled = false;
MaxSimilarityResult result = new MaxSimilarityResult(); MaxSimilarityResult result = new MaxSimilarityResult();
int searchCnt = int.MaxValue;
_data.StartSearchMaxSimilarity(vm1.MinFrame, vm1.MaxFrame, int.MaxValue, 10, result, int start = vm1.MinFrame;
(o, e) => int end = vm1.MaxFrame;
{ if (LockFrames == 1)
SearchProgressValue = e.ProgressPercentage; {
}, searchCnt = 1;
(o, e) => end = vm2.SelectedFrame;
{ }
int rb = _data.GetResetBolt(result.frameIdx1); _data.StartSearchMaxSimilarity(start, end, searchCnt, 5, result,
double ra = _data.GetRotAngle(result.frameIdx1); (o, e) =>
SearchProgressValue = 0; {
SearchEnabled = true; SearchProgressValue = e.ProgressPercentage;
vm1.SelectedFrame = result.frameIdx1; },
vm2.SelectedFrame = result.frameIdx2; (o, e) =>
AirRingShift = result.frameShift; {
TandH_Corel = result.similarity; int rb = _data.GetResetBolt(result.frameIdx2);
rb += AirRingShift; double ra = _data.GetRotAngle(result.frameIdx2);
while (rb >= _data.BoltCnt) rb -= _data.BoltCnt; SearchProgressValue = 0;
while (rb < 0) rb += _data.BoltCnt; SearchEnabled = true;
ResetBolt = rb; vm2.SelectedFrame = result.frameIdx1;
RotAngle = ra + result.deltaAngle; vm1.SelectedFrame = result.frameIdx2;
}, int.MaxValue, 15, true, true); AirRingShift = result.frameShift;
TandH_Corel = result.similarity;
rb += AirRingShift;
while (rb >= _data.BoltCnt) rb -= _data.BoltCnt;
while (rb < 0) rb += _data.BoltCnt;
ResetBolt = rb;
RotAngle = ra + result.deltaAngle;
}, int.MaxValue, 15, true, true);
} }
public double[] ExpandOrShrinkData(double[] ori, int orideg, int dstdeg) public double[] ExpandOrShrinkData(double[] ori, int orideg, int dstdeg)
...@@ -476,4 +489,28 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -476,4 +489,28 @@ namespace FLY.HeatingHelper.UI.UIModule
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
} }
public class LockFramesConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int locks = (int)value;
string n = parameter.ToString();
switch (n)
{
case "0":
return locks == 0;
case "1":
return locks == 1;
case "2":
return locks == 2;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return int.Parse(parameter.ToString());
}
}
} }
...@@ -5,37 +5,72 @@ ...@@ -5,37 +5,72 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:FLY.HeatingHelper.UI.UIModule" xmlns:local="clr-namespace:FLY.HeatingHelper.UI.UIModule"
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
xmlns:c1c="clr-namespace:C1.Win.C1Chart;assembly=C1.Win.C1Chart.4" xmlns:c1c="clr-namespace:C1.WPF.C1Chart;assembly=C1.WPF.C1Chart.4"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="600"> d:DesignHeight="450" d:DesignWidth="600">
<UserControl.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="12"/>
</Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontSize" Value="14"/>
<Setter Property="Margin" Value="0,0,5,0"/>
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="#4C000F14" Opacity="0.7"/>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type c1c:C1Chart}">
<Setter Property="Foreground" Value="#FFF0F8FE" />
<Setter Property="Background" Value="#4C000F14" />
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="0" />
<Setter Property="Margin" Value="0 10" />
<Setter Property="FontSize" Value="12"/>
</Style>
</UserControl.Resources>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<lvc:CartesianChart Grid.Row="0" x:Name="myChart" Series="{Binding MySeries}" <Border Grid.Row="0">
DisableAnimations="True" <c1c:C1Chart x:Name="myChart" ChartType="Line" Margin="5,0,0,0">
Hoverable="False" <c1c:C1Chart.Data>
DataTooltip="{x:Null}" <c1c:ChartData>
LegendLocation="Top" <c1c:DataSeries Values="{Binding DS_thick}" AxisY="ay0" Label="厚度"/>
FontSize="20" <c1c:DataSeries Values="{Binding DS_heat}" AxisY="ay1" Label="加热率"/>
Margin="2,2,2,2"> </c1c:ChartData>
<lvc:CartesianChart.AxisY> </c1c:C1Chart.Data>
<lvc:Axis Foreground="DodgerBlue" Title="厚度"> <c1c:C1Chart.View>
</lvc:Axis> <c1c:ChartView>
<lvc:Axis x:Name="yax2" Foreground="IndianRed" Position="RightTop" Title="加热"> <c1c:ChartView.AxisY>
<lvc:Axis.Separator> <c1c:Axis Visible="False"/>
<lvc:Separator IsEnabled="False"></lvc:Separator> </c1c:ChartView.AxisY>
</lvc:Axis.Separator> <c1c:Axis Name="ay0" AxisType="Y" Title="厚度" Position="Near"/>
</lvc:Axis> <c1c:Axis Name="ay1" AxisType="Y" Title="加热率" Position="Far"/>
</lvc:CartesianChart.AxisY> </c1c:ChartView>
</lvc:CartesianChart> </c1c:C1Chart.View>
<c1c:Legend Position="Right" />
</c1c:C1Chart>
</Border>
<StackPanel Orientation="Horizontal" Grid.Row="1"> <StackPanel Orientation="Horizontal" Grid.Row="1">
<TextBlock Text="{Binding ResetBolt, StringFormat=复位分区:{0}}"/> <TextBlock Text="{Binding ResetBolt, StringFormat=复位分区:{0}}"/>
<TextBlock Text="{Binding RotAngle, StringFormat=旋转角度:{0:f1}}"/> <TextBlock Text="{Binding RotAngle, StringFormat=旋转角度:{0:f1}}"/>
<TextBlock Text="{Binding SelectedFrame}"/> <TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}/({1})-({2})">
<Binding Path="SelectedFrame" />
<Binding Path="MinFrame"/>
<Binding Path="MaxFrame"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<!--<TextBlock Text="{Binding SelectedFrame}"/>
<TextBlock Text="{Binding MinFrame,StringFormat=/(\{0\})-}"/> <TextBlock Text="{Binding MinFrame,StringFormat=/(\{0\})-}"/>
<TextBlock Text="{Binding MaxFrame,StringFormat=(\{0\})}"/> <TextBlock Text="{Binding MaxFrame,StringFormat=(\{0\})}"/>-->
<Button Content="前一幅" Margin="3" Command="{Binding PreCmd}"/> <Button Content="前一幅" Margin="3" Command="{Binding PreCmd}"/>
<Button Content="后一幅" Margin="3" Command="{Binding NxtCmd}"/> <Button Content="后一幅" Margin="3" Command="{Binding NxtCmd}"/>
</StackPanel> </StackPanel>
......
...@@ -16,6 +16,7 @@ using System.Windows.Media; ...@@ -16,6 +16,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using System.Windows.Navigation; using System.Windows.Navigation;
using System.Windows.Shapes; using System.Windows.Shapes;
using C1.WPF.C1Chart;
namespace FLY.HeatingHelper.UI.UIModule namespace FLY.HeatingHelper.UI.UIModule
{ {
...@@ -82,6 +83,7 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -82,6 +83,7 @@ namespace FLY.HeatingHelper.UI.UIModule
public UC_FramePicker() public UC_FramePicker()
{ {
InitializeComponent(); InitializeComponent();
//myChart.Data.Children
} }
} }
...@@ -164,7 +166,6 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -164,7 +166,6 @@ namespace FLY.HeatingHelper.UI.UIModule
if (_resetBolt != value) if (_resetBolt != value)
{ {
_resetBolt = value; _resetBolt = value;
UpdateChart();
} }
} }
} }
...@@ -177,10 +178,9 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -177,10 +178,9 @@ namespace FLY.HeatingHelper.UI.UIModule
} }
set set
{ {
if (Math.Abs(_rotAngle - value) >= 0.00099) if ((Math.Abs(_rotAngle - value) >= 0.00099) || double.IsNaN(_rotAngle))
{ {
_rotAngle = value; _rotAngle = value;
UpdateChart();
} }
} }
} }
...@@ -188,7 +188,7 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -188,7 +188,7 @@ namespace FLY.HeatingHelper.UI.UIModule
public RelayCommand PreCmd { get; internal set; } public RelayCommand PreCmd { get; internal set; }
public RelayCommand NxtCmd { get; internal set; } public RelayCommand NxtCmd { get; internal set; }
public SeriesCollection MySeries { get; set; } = new SeriesCollection(); public ChartData myData { get; set; } = new ChartData();
/// <summary> /// <summary>
/// 初始化数据 /// 初始化数据
...@@ -215,42 +215,48 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -215,42 +215,48 @@ namespace FLY.HeatingHelper.UI.UIModule
} }
} }
private ChartValues<double> v1 = new ChartValues<double>(); //private ChartValues<double> v1 = new ChartValues<double>();
private ChartValues<double> v2 = new ChartValues<double>(); //private ChartValues<double> v2 = new ChartValues<double>();
private void UpdateChart() public DoubleCollection DS_thick { get; set; }
public DoubleCollection DS_heat { get; set; }
public void UpdateChart()
{ {
if (MySeries.Count == 0) DS_thick = new DoubleCollection(_data.GetThicks(SelectedFrame, ResetBolt, RotAngle));
{ DS_heat = new DoubleCollection(_data.GetHeats(SelectedFrame, -1, -1));
var L1 = new LineSeries //if (MySeries.Count == 0)
{ //{
Title = "厚度", // var L1 = new LineSeries
Values = v1, // {
DataLabels = false, // Title = "厚度",
Fill = new SolidColorBrush(Colors.Transparent), // Values = v1,
PointGeometrySize = 3, // DataLabels = false,
ScalesYAt = 0, // Fill = new SolidColorBrush(Colors.Transparent),
}; // PointGeometrySize = 3,
var L2 = new LineSeries // ScalesYAt = 0,
{ // };
Title = "加热率", // var L2 = new LineSeries
Values = v2, // {
DataLabels = false, // Title = "加热率",
Fill = new SolidColorBrush(Colors.Transparent), // Values = v2,
PointGeometrySize = 3, // DataLabels = false,
ScalesYAt = 1, // Fill = new SolidColorBrush(Colors.Transparent),
}; // PointGeometrySize = 3,
MySeries.Add(L1); // ScalesYAt = 1,
MySeries.Add(L2); // };
} // MySeries.Add(L1);
v1.Clear(); v1.AddRange(_data.GetThicks(SelectedFrame, ResetBolt, RotAngle)); // MySeries.Add(L2);
v2.Clear(); v2.AddRange(_data.GetHeats(SelectedFrame, -1, -1)); //}
//v1.Clear(); v1.AddRange(_data.GetThicks(SelectedFrame, ResetBolt, RotAngle));
//v2.Clear(); v2.AddRange(_data.GetHeats(SelectedFrame, -1, -1));
} }
private void UpdateData() private void UpdateData()
{ {
_resetBolt = _data.GetResetBolt(SelectedFrame); ResetBolt = _data.GetResetBolt(SelectedFrame);
_rotAngle = _data.GetRotAngle(SelectedFrame); RotAngle = _data.GetRotAngle(SelectedFrame);
UpdateChart(); UpdateChart();
} }
......
...@@ -87,6 +87,8 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -87,6 +87,8 @@ namespace FLY.HeatingHelper.UI.UIModule
vm1.InitData(mdata, tmpVM.Selected_Idx_From, tmpVM.Selected_Idx_To); vm1.InitData(mdata, tmpVM.Selected_Idx_From, tmpVM.Selected_Idx_To);
vm2.InitData(mdata, tmpVM.Selected_Idx_From, tmpVM.Selected_Idx_To); vm2.InitData(mdata, tmpVM.Selected_Idx_From, tmpVM.Selected_Idx_To);
vmDiff.Init(mdata); vmDiff.Init(mdata);
vm1.UpdateChart();
vm2.UpdateChart();
} }
public void UnLoaded(object s) public void UnLoaded(object s)
......
...@@ -17,7 +17,7 @@ namespace FLY.HeatingHelper ...@@ -17,7 +17,7 @@ namespace FLY.HeatingHelper
{ {
bool IsDataReady { get; } bool IsDataReady { get; }
bool BeginUse(); bool BeginUse(bool isAsync = true);
void EndUse(); void EndUse();
/// <summary> /// <summary>
......
...@@ -112,9 +112,14 @@ namespace FLY.HeatingHelper ...@@ -112,9 +112,14 @@ namespace FLY.HeatingHelper
public int AirRingShift { get; internal set; } = 0; public int AirRingShift { get; internal set; } = 0;
public bool BeginUse() public bool BeginUse(bool isAsync = true)
{ {
return Monitor.TryEnter(_sync); if(isAsync)
{
return Monitor.TryEnter(_sync);
}
Monitor.Enter(_sync);
return true;
} }
public void EndUse() public void EndUse()
{ {
...@@ -494,137 +499,88 @@ namespace FLY.HeatingHelper ...@@ -494,137 +499,88 @@ namespace FLY.HeatingHelper
{ {
return data.Clone() as double[]; return data.Clone() as double[];
} }
//放大 z = 1 / z;
int cnt = data.Count();
double[] _diff = new double[cnt];
//for (int i = 0; i < data.Count(); i++)
//{
// double new_offset = i - (mid);
// if (Math.Abs(new_offset) > data.Count() / 2)
// {
// if (new_offset > 0)
// new_offset -= data.Count();
// else
// new_offset += data.Count();
// }
// double old_offset = new_offset * 1 / z;
// if (Math.Abs(old_offset) > data.Count() / 2)
// {
// //没数据了
// _diff[i] = double.NaN;
// }
// else
// {
// int d1 = (int)Math.Ceiling(old_offset);
// int d2 = (int)Math.Floor(old_offset);
// double p1 = old_offset - d2;
// double p2 = d1 - old_offset;
// d1 += (mid);
// if (d1 >= data.Count())
// d1 -= data.Count();
// else if (d1 < 0)
// d1 += data.Count();
// d2 += (mid);
// if (d2 >= data.Count())
// d2 -= data.Count();
// else if (d2 < 0)
// d2 += data.Count();
// if (d1 == d2)
// {
// _diff[i] = data[d1];
// }
// else
// {
// if (double.IsNaN(data[d1]) && double.IsNaN(data[d2]))
// _diff[i] = (int)(data[d1] * p1 + data[d2] * p2);
// else if (double.IsNaN(data[d1]))
// _diff[i] = data[d1];
// else
// _diff[i] = data[d2];
// }
// }
//}
double oldpos = mid - 1; // 拼接data,使得数据两端都是NaN
int curr_oi = mid - 1; int cnt = data.Count();
double newpos = mid - z; var tmpdata = data.Concat(data).ToArray();
int curr_ni = mid - 1; int n = cnt / 2;
double bin = z; int i;
double sum = 0; int tmpmid = mid;
while (true) if (mid < n)
{
if (oldpos > newpos)
{
double w = newpos + bin - oldpos;
sum += data[curr_oi] * w;
bin -= w;
oldpos -= 1;
curr_oi--;
if (curr_oi < 0) break;
}
else
{
sum += data[curr_oi] * bin;
bin = 0;
}
if (bin < 0.0001)
{
_diff[curr_ni--] = sum / z;
if (curr_ni < 0) break;
newpos -= z;
bin = z;
sum = 0;
}
}
if ((curr_ni >= 0) && ((z - bin) > z / 50))
{
_diff[curr_ni--] = sum / (z - bin);
}
while (curr_ni >= 0)
{ {
_diff[curr_ni--] = double.NaN; mid += cnt;
} }
oldpos = 1; for (i = 0; i < mid - n; i++) tmpdata[i] = double.NaN;
newpos = z; for (i = mid + cnt - n; i < 2 * cnt; i++) tmpdata[i] = double.NaN;
curr_oi = curr_ni = mid;
sum = 0; bin = z; double[] _diff = new double[cnt*2];
while (true)
// 计算新数据开始位置
double npos = mid - z * n;
int ni = mid - n;
double bin=0;
double sum=0;
// 计算新数据
for (i = 0; i < cnt; i++)
{ {
if (oldpos < newpos) sum = 0;
bin = 0;
if ((npos + z < mid - n) || (npos >= mid + cnt - n))
{ {
double w = oldpos - (newpos - bin); _diff[ni++] = double.NaN;
sum += data[curr_oi] * w; npos += z;
bin -= w; continue;
oldpos += 1;
curr_oi++;
if (curr_oi >= cnt) break;
} }
else int nn = (int)npos;
if (npos + z < nn + 1)
{ {
sum += data[curr_oi] * bin; _diff[ni++] = tmpdata[nn];
bin = 0; npos += z;
continue;
} }
if (bin < 0.0001) else
{ {
_diff[curr_ni++] = sum / z; if (!double.IsNaN(tmpdata[nn]))
if (curr_ni == cnt) break; {
newpos += z; sum += tmpdata[nn] * (nn + 1 - npos);
bin = z; bin += (nn + 1 - npos);
sum = 0; }
nn++;
while (nn + 1 < npos + z)
{
if (!double.IsNaN(tmpdata[nn]))
{
sum += tmpdata[nn];
bin += 1;
}
nn++;
}
if (!double.IsNaN(tmpdata[nn]))
{
sum += tmpdata[nn] * (npos + z - nn);
bin += (npos + z - nn);
}
if (bin > 0)
{
_diff[ni++] = sum / bin;
}
else
{
_diff[ni++] = double.NaN;
}
npos += z;
} }
} }
if ((curr_ni < cnt) && ((z - bin) > z / 50)) if (mid == tmpmid)
{ {
_diff[curr_ni++] = sum / (z - bin); return _diff.Skip(cnt).Take(mid - n).Concat(_diff.Skip(mid - n).Take(cnt - mid + n)).ToArray();
} }
while (curr_ni < cnt) else
{ {
_diff[curr_ni++] = double.NaN; return _diff.Skip(cnt).Take(cnt - n + tmpmid).Concat(_diff.Skip(cnt - n + tmpmid).Take(n - tmpmid)).ToArray();
} }
return _diff;
} }
public Tuple<int, double> MaximumAt(IEnumerable<double> dat) public Tuple<int, double> MaximumAt(IEnumerable<double> dat)
...@@ -715,7 +671,7 @@ namespace FLY.HeatingHelper ...@@ -715,7 +671,7 @@ namespace FLY.HeatingHelper
} }
#endregion #endregion
#region 获取数据
/// <summary> /// <summary>
/// 获取某幅厚度数据的一部分 /// 获取某幅厚度数据的一部分
...@@ -762,7 +718,7 @@ namespace FLY.HeatingHelper ...@@ -762,7 +718,7 @@ namespace FLY.HeatingHelper
int s = newResetBolt - _resetBolts[idx]; int s = newResetBolt - _resetBolts[idx];
while (s < 0) s += cnt; while (s < 0) s += cnt;
while (s >= cnt) s -= cnt; while (s >= cnt) s -= cnt;
return ret.Concat(ret).Skip(s).Take(cnt).ToArray(); return ret.Concat(ret).Skip(cnt-s).Take(cnt).ToArray();
} }
return ret; return ret;
} }
...@@ -796,7 +752,7 @@ namespace FLY.HeatingHelper ...@@ -796,7 +752,7 @@ namespace FLY.HeatingHelper
public List<DateTime> Dat_Times { get { return _dat_times; } } public List<DateTime> Dat_Times { get { return _dat_times; } }
public List<double> Dat_Sigmas { get { return _thick_2sigmas; } } public List<double> Dat_Sigmas { get { return _thick_2sigmas; } }
public List<double> Dat_Means { get { return _thick_means; } } public List<double> Dat_Means { get { return _thick_means; } }
#endregion
interface ISearchModel interface ISearchModel
{ {
int AddOneData(int hr); int AddOneData(int hr);
...@@ -1132,47 +1088,14 @@ namespace FLY.HeatingHelper ...@@ -1132,47 +1088,14 @@ namespace FLY.HeatingHelper
} }
for (j = i - 1, k = 0; (j >= fmin) && (k < frameInterval); j--, k++) for (j = i - 1, k = 0; (j >= fmin) && (k < frameInterval); j--, k++)
{ {
double angle_i = GetRotAngle(i); var tmp = SearchMaxSimilarity(j, i, searchRange, SearchRotAngle);
double angle_j = GetRotAngle(j); if (maxcorel < tmp.Item2)
if (Math.Abs(angle_i - angle_j) > 0.001) break;
Vector<double> vthick1 = Vector<double>.Build.DenseOfArray(GetThicks(i, -1, -1));
Vector<double> vthick2 = Vector<double>.Build.DenseOfArray(GetThicks(j, -1, -1));
Vector<double> v_heat1 = Vector<double>.Build.DenseOfArray(GetHeats(i, -1, -1));
Vector<double> v_heat2 = Vector<double>.Build.DenseOfArray(GetHeats(j, -1, -1));
if (!SearchRotAngle)
{ {
double[] corels = CalculateCorrelVector((vthick1 - vthick2).ToArray(), (v_heat2 - v_heat1).ToArray()); maxcorel = tmp.Item2;
double max = -100; theshift = tmp.Item1;
var r = CalculateAirRingShiftFromCorelVector(corels); deltaAngle = tmp.Item3;
int shift = r.Item1; idx1 = i;
if (maxcorel < r.Item2) idx2 = j;
{
maxcorel = max;
theshift = shift;
idx1 = j;
idx2 = i;
}
}
else
{
double range = searchRange / 360.0;
double di = -range;
double u_range = 360 / angle_i - 1;
for (; di <= u_range; di += 0.001)
{
var vth = ReSampleForChangeRotAngle((vthick1 - vthick2).ToArray(), midbolt, 1 + di);
double[] corels = CalculateCorrelVector(vth, (v_heat2 - v_heat1).ToArray());
var r = CalculateAirRingShiftFromCorelVector(corels);
int shift = r.Item1;
if (maxcorel < r.Item2)
{
maxcorel = r.Item2;
theshift = shift;
idx1 = j;
idx2 = i;
deltaAngle = di * 360.0;
}
}
} }
} }
} }
...@@ -1209,7 +1132,61 @@ namespace FLY.HeatingHelper ...@@ -1209,7 +1132,61 @@ namespace FLY.HeatingHelper
} }
} }
public Tuple<int,double,double> SearchMaxSimilarity(int idxL,int idxB,double searchRange,bool SearchRotAngle)
{
double maxcorel = double.MinValue;
int theshift = 0;
double deltaAngle = 0;
if (idxL > idxB)
{
var tmp = idxL;
idxL = idxB;
idxB = idxL;
}
double angle_B = GetRotAngle(idxB);
double angle_L = GetRotAngle(idxL);
int rb_B = GetResetBolt(idxB);
int rb_L = GetResetBolt(idxL);
Vector<double> vthickL = Vector<double>.Build.DenseOfArray(GetThicks(idxL, rb_B, angle_B));
Vector<double> vthickB = Vector<double>.Build.DenseOfArray(GetThicks(idxB, -1, -1));
Vector<double> v_heatL = Vector<double>.Build.DenseOfArray(GetHeats(idxL, -1, -1));
Vector<double> v_heatB = Vector<double>.Build.DenseOfArray(GetHeats(idxB, -1, -1));
if (!SearchRotAngle)
{
double[] corels = CalculateCorrelVector((vthickL - vthickB).ToArray(), (v_heatB - v_heatL).ToArray());
double max = -100;
var r = CalculateAirRingShiftFromCorelVector(corels);
int shift = r.Item1;
if (maxcorel < r.Item2)
{
maxcorel = max;
theshift = shift;
}
}
else
{
double range = searchRange / 360.0;
double di = -range;
double u_range = 360 / angle_B - 1;
for (; di < u_range; di += 0.001)
{
var vth = ReSampleForChangeRotAngle((vthickL - vthickB).ToArray(), rb_B, 1 + di);
double[] corels = CalculateCorrelVector(vth, (v_heatB - v_heatL).ToArray());
var r = CalculateAirRingShiftFromCorelVector(corels);
int shift = r.Item1;
if (maxcorel < r.Item2)
{
maxcorel = r.Item2;
theshift = shift;
deltaAngle = di * angle_B;
}
}
}
return new Tuple<int, double, double>(theshift, maxcorel, deltaAngle);
}
#region 数据库数据变化后自动运行 #region 数据库数据变化后自动运行
[PropertyChanged.DoNotCheckEquality]
public List<ThickHeatEvent> AutoDetectEvents { get; set; } public List<ThickHeatEvent> AutoDetectEvents { get; set; }
/// <summary> /// <summary>
...@@ -1320,9 +1297,12 @@ namespace FLY.HeatingHelper ...@@ -1320,9 +1297,12 @@ namespace FLY.HeatingHelper
{ {
RefreshData(); RefreshData();
EndUse(); EndUse();
Thread.Sleep(1000 * 60);
}
else
{
Thread.Sleep(1000 * 2);
} }
// 延时1分钟
Thread.Sleep(1000 * 60);
} }
}); });
} }
......
...@@ -104,12 +104,16 @@ namespace FLY.HeatingHelper ...@@ -104,12 +104,16 @@ namespace FLY.HeatingHelper
_ids.Clear(); _ids.Clear();
foreach (DataRow dr in dataTable.Rows) foreach (DataRow dr in dataTable.Rows)
{ {
_ids.Add((int)dr.Field<long>("ID"));
_dat_times.Add(dr.Field<DateTime>("EndTime"));
string th_dat = dr.Field<string>("Thicks"); string th_dat = dr.Field<string>("Thicks");
string heat_dat = dr.Field<string>("Heats"); string heat_dat = dr.Field<string>("Heats");
var t1 = Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(th_dat); var t1 = Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(th_dat);
var h1 = Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(heat_dat); var h1 = Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(heat_dat);
if (_heats.Count() > 0)
{
if (IsHeatSame(h1, _heats.Last())) DeleteDataLast();
}
_ids.Add((int)dr.Field<long>("ID"));
_dat_times.Add(dr.Field<DateTime>("EndTime"));
_thicks.Add(t1); _thicks.Add(t1);
_heats.Add(h1); _heats.Add(h1);
var t2 = RemoveNaN(t1); var t2 = RemoveNaN(t1);
...@@ -136,14 +140,18 @@ namespace FLY.HeatingHelper ...@@ -136,14 +140,18 @@ namespace FLY.HeatingHelper
{ {
var id = (int)dr.Field<long>("ID"); var id = (int)dr.Field<long>("ID");
if (lastID >= id) continue; if (lastID >= id) continue;
_ids.Add(id);
_dat_times.Add(dr.Field<DateTime>("EndTime"));
string th_dat = dr.Field<string>("Thicks"); string th_dat = dr.Field<string>("Thicks");
string heat_dat = dr.Field<string>("Heats"); string heat_dat = dr.Field<string>("Heats");
var t1 = Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(th_dat); var t1 = Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(th_dat);
var h1 = Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(heat_dat); var h1 = Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(heat_dat);
if(_heats.Count()>0)
{
if (IsHeatSame(h1, _heats.Last())) DeleteDataLast();
}
_ids.Add(id);
_thicks.Add(t1); _thicks.Add(t1);
_heats.Add(h1); _heats.Add(h1);
_dat_times.Add(dr.Field<DateTime>("EndTime"));
var t2 = RemoveNaN(t1); var t2 = RemoveNaN(t1);
var r = MathNet.Numerics.Statistics.Statistics.MeanStandardDeviation(t2); var r = MathNet.Numerics.Statistics.Statistics.MeanStandardDeviation(t2);
_thick_means.Add(r.Item1); _thick_means.Add(r.Item1);
...@@ -157,6 +165,36 @@ namespace FLY.HeatingHelper ...@@ -157,6 +165,36 @@ namespace FLY.HeatingHelper
return cnt; return cnt;
} }
/// <summary>
/// 判断两个加热是否相同
/// </summary>
/// <param name="h1"></param>
/// <param name="h2"></param>
/// <returns></returns>
private bool IsHeatSame(double[] h1, double[] h2)
{
int cnt = h1.Count();
if (h2.Count() != cnt) return false;
for (int i = 0; i < cnt; i++)
{
if (Math.Abs(h1[i] - h2[i]) > 0.1) return false;
}
return true;
}
private void DeleteDataLast()
{
int idx = _ids.Count() - 1;
_ids.RemoveAt(idx);
_dat_times.RemoveAt(idx);
_thicks.RemoveAt(idx);
_thick_2sigmas.RemoveAt(idx);
_thick_means.RemoveAt(idx);
_heats.RemoveAt(idx);
_resetBolts.RemoveAt(idx);
_rotAngles.RemoveAt(idx);
}
private DataTable dataTable = new DataTable(); private DataTable dataTable = new DataTable();
#endregion #endregion
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment