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 @@
<StartupObject />
</PropertyGroup>
<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>
<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 Include="LiveCharts, Version=0.9.7.0, Culture=neutral, PublicKeyToken=0bc1f845d1ebb8df, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
......@@ -143,6 +167,7 @@
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\licenses.licx" />
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<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
{
InitializeComponent();
_dat = DataManager.GetThickDataInstance();
_dat.SetDB("airring.sqlite3");
_dat.SetDB(@"D:\blowingdata\airring.sqlite3");
this.DataContext = _dat;
}
......
......@@ -183,7 +183,7 @@ namespace FLY.HeatingHelper.UI.UIModule
private async void Page_Loaded(object sender, RoutedEventArgs e)
{
await Task.Delay(100);
await Task.Delay(200);
Default_cb_Click(this, null);
}
......
......@@ -7,7 +7,18 @@
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" Loaded="UserControl_Loaded" Unloaded="UserControl_Unloaded">
<UserControl.Resources>
<local:LockFramesConverter x:Key="lfc"/>
</UserControl.Resources>
<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>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
......@@ -47,8 +58,20 @@
<DockPanel.Resources>
<Style x:Key="tb_style" TargetType="TextBlock">
<Setter Property="Background" Value="AntiqueWhite"/>
<Setter Property="FontSize" Value="16"/>
</Style>
</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">
<ProgressBar Value="{Binding SearchProgressValue}" Width="{Binding ElementName=searchBtn, Path=ActualWidth}"/>
<Button Content="搜索最大相关度" Click="AutoSearch_Shift" x:Name="searchBtn"
......
......@@ -17,6 +17,7 @@ using System.Windows.Shapes;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double;
using LiveCharts.Wpf;
using System.Globalization;
namespace FLY.HeatingHelper.UI.UIModule
{
......@@ -94,6 +95,8 @@ namespace FLY.HeatingHelper.UI.UIModule
public UC_FramePickerViewModel vm1 = new UC_FramePickerViewModel();
public UC_FramePickerViewModel vm2 = new UC_FramePickerViewModel();
public int LockFrames { get; set; } = 1;
public int SearchProgressValue { get; set; } = 0;
public bool SearchEnabled { get; set; } = true;
......@@ -118,7 +121,7 @@ namespace FLY.HeatingHelper.UI.UIModule
_airRingShift = value;
while (_airRingShift < 0) _airRingShift += cnt;
while (_airRingShift >= cnt) _airRingShift -= cnt;
int rb = resetBolt1 + _airRingShift;
int rb = _airRingShift + resetBolt1;
while (rb < 0) rb += cnt;
while (rb >= cnt) rb -= cnt;
ResetBolt = rb;
......@@ -177,6 +180,9 @@ namespace FLY.HeatingHelper.UI.UIModule
{
var tmpVM = ViewModel_HeatDetector.Instance;
tmpVM.PropertyChanged += DataSelecter_PropertyChanged;
vm2.SelectedFrame = vm2.MaxFrame;
vm1.UpdateChart();
vm2.UpdateChart();
}
public void UnLoaded(object s)
......@@ -237,13 +243,14 @@ namespace FLY.HeatingHelper.UI.UIModule
switch (whichframe)
{
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);
resetBolt1 = _data.GetResetBolt(vm1.SelectedFrame);
rotAngle1 = _data.GetRotAngle(vm1.SelectedFrame);
break;
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);
resetBolt2 = _data.GetResetBolt(vm2.SelectedFrame);
rotAngle2 = _data.GetRotAngle(vm2.SelectedFrame);
......@@ -265,8 +272,8 @@ namespace FLY.HeatingHelper.UI.UIModule
/// <returns></returns>
private bool UpdateThickData()
{
vth1 = _data.GetThicks(vm1.SelectedFrame, int.MaxValue, RotAngle);
vth2 = _data.GetThicks(vm2.SelectedFrame, int.MaxValue, RotAngle);
vth1 = _data.GetThicks(vm1.SelectedFrame, vm2.ResetBolt, RotAngle);
vth2 = _data.GetThicks(vm2.SelectedFrame, vm2.ResetBolt, RotAngle);
if ((vth1 == null) || (vth2 == null) || (vheat1 == null) || (vheat2 == null))
{
return false;
......@@ -302,14 +309,14 @@ namespace FLY.HeatingHelper.UI.UIModule
}
else
{
//s = ResetBolt - resetBolt1;
s = resetBolt1 - ResetBolt;
s = ResetBolt - resetBolt1;
//s = resetBolt1 + ResetBolt;
}
int cnt = vth1.Count();
while (s >= cnt) s -= cnt;
while (s < 0) s += cnt;
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);
......@@ -352,7 +359,7 @@ namespace FLY.HeatingHelper.UI.UIModule
if(s == int.MaxValue)
{
AirRingShift = 0;
ResetBolt = _data.GetResetBolt(vm1.SelectedFrame);
//ResetBolt = _data.GetResetBolt(vm1.SelectedFrame);
return;
}
else
......@@ -383,29 +390,35 @@ namespace FLY.HeatingHelper.UI.UIModule
{
SearchEnabled = false;
MaxSimilarityResult result = new MaxSimilarityResult();
_data.StartSearchMaxSimilarity(vm1.MinFrame, vm1.MaxFrame, int.MaxValue, 10, result,
(o, e) =>
{
SearchProgressValue = e.ProgressPercentage;
},
(o, e) =>
{
int rb = _data.GetResetBolt(result.frameIdx1);
double ra = _data.GetRotAngle(result.frameIdx1);
SearchProgressValue = 0;
SearchEnabled = true;
vm1.SelectedFrame = result.frameIdx1;
vm2.SelectedFrame = result.frameIdx2;
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);
int searchCnt = int.MaxValue;
int start = vm1.MinFrame;
int end = vm1.MaxFrame;
if (LockFrames == 1)
{
searchCnt = 1;
end = vm2.SelectedFrame;
}
_data.StartSearchMaxSimilarity(start, end, searchCnt, 5, result,
(o, e) =>
{
SearchProgressValue = e.ProgressPercentage;
},
(o, e) =>
{
int rb = _data.GetResetBolt(result.frameIdx2);
double ra = _data.GetRotAngle(result.frameIdx2);
SearchProgressValue = 0;
SearchEnabled = true;
vm2.SelectedFrame = result.frameIdx1;
vm1.SelectedFrame = result.frameIdx2;
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)
......@@ -476,4 +489,28 @@ namespace FLY.HeatingHelper.UI.UIModule
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 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:FLY.HeatingHelper.UI.UIModule"
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"
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.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<lvc:CartesianChart Grid.Row="0" x:Name="myChart" Series="{Binding MySeries}"
DisableAnimations="True"
Hoverable="False"
DataTooltip="{x:Null}"
LegendLocation="Top"
FontSize="20"
Margin="2,2,2,2">
<lvc:CartesianChart.AxisY>
<lvc:Axis Foreground="DodgerBlue" Title="厚度">
</lvc:Axis>
<lvc:Axis x:Name="yax2" Foreground="IndianRed" Position="RightTop" Title="加热">
<lvc:Axis.Separator>
<lvc:Separator IsEnabled="False"></lvc:Separator>
</lvc:Axis.Separator>
</lvc:Axis>
</lvc:CartesianChart.AxisY>
</lvc:CartesianChart>
<Border Grid.Row="0">
<c1c:C1Chart x:Name="myChart" ChartType="Line" Margin="5,0,0,0">
<c1c:C1Chart.Data>
<c1c:ChartData>
<c1c:DataSeries Values="{Binding DS_thick}" AxisY="ay0" Label="厚度"/>
<c1c:DataSeries Values="{Binding DS_heat}" AxisY="ay1" Label="加热率"/>
</c1c:ChartData>
</c1c:C1Chart.Data>
<c1c:C1Chart.View>
<c1c:ChartView>
<c1c:ChartView.AxisY>
<c1c:Axis Visible="False"/>
</c1c:ChartView.AxisY>
<c1c:Axis Name="ay0" AxisType="Y" Title="厚度" Position="Near"/>
<c1c:Axis Name="ay1" AxisType="Y" Title="加热率" Position="Far"/>
</c1c:ChartView>
</c1c:C1Chart.View>
<c1c:Legend Position="Right" />
</c1c:C1Chart>
</Border>
<StackPanel Orientation="Horizontal" Grid.Row="1">
<TextBlock Text="{Binding ResetBolt, StringFormat=复位分区:{0}}"/>
<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 MaxFrame,StringFormat=(\{0\})}"/>
<TextBlock Text="{Binding MaxFrame,StringFormat=(\{0\})}"/>-->
<Button Content="前一幅" Margin="3" Command="{Binding PreCmd}"/>
<Button Content="后一幅" Margin="3" Command="{Binding NxtCmd}"/>
</StackPanel>
......
......@@ -16,6 +16,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using C1.WPF.C1Chart;
namespace FLY.HeatingHelper.UI.UIModule
{
......@@ -82,6 +83,7 @@ namespace FLY.HeatingHelper.UI.UIModule
public UC_FramePicker()
{
InitializeComponent();
//myChart.Data.Children
}
}
......@@ -164,7 +166,6 @@ namespace FLY.HeatingHelper.UI.UIModule
if (_resetBolt != value)
{
_resetBolt = value;
UpdateChart();
}
}
}
......@@ -177,10 +178,9 @@ namespace FLY.HeatingHelper.UI.UIModule
}
set
{
if (Math.Abs(_rotAngle - value) >= 0.00099)
if ((Math.Abs(_rotAngle - value) >= 0.00099) || double.IsNaN(_rotAngle))
{
_rotAngle = value;
UpdateChart();
}
}
}
......@@ -188,7 +188,7 @@ namespace FLY.HeatingHelper.UI.UIModule
public RelayCommand PreCmd { get; internal set; }
public RelayCommand NxtCmd { get; internal set; }
public SeriesCollection MySeries { get; set; } = new SeriesCollection();
public ChartData myData { get; set; } = new ChartData();
/// <summary>
/// 初始化数据
......@@ -215,42 +215,48 @@ namespace FLY.HeatingHelper.UI.UIModule
}
}
private ChartValues<double> v1 = new ChartValues<double>();
private ChartValues<double> v2 = new ChartValues<double>();
//private ChartValues<double> v1 = 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)
{
var L1 = new LineSeries
{
Title = "厚度",
Values = v1,
DataLabels = false,
Fill = new SolidColorBrush(Colors.Transparent),
PointGeometrySize = 3,
ScalesYAt = 0,
};
var L2 = new LineSeries
{
Title = "加热率",
Values = v2,
DataLabels = false,
Fill = new SolidColorBrush(Colors.Transparent),
PointGeometrySize = 3,
ScalesYAt = 1,
};
MySeries.Add(L1);
MySeries.Add(L2);
}
v1.Clear(); v1.AddRange(_data.GetThicks(SelectedFrame, ResetBolt, RotAngle));
v2.Clear(); v2.AddRange(_data.GetHeats(SelectedFrame, -1, -1));
DS_thick = new DoubleCollection(_data.GetThicks(SelectedFrame, ResetBolt, RotAngle));
DS_heat = new DoubleCollection(_data.GetHeats(SelectedFrame, -1, -1));
//if (MySeries.Count == 0)
//{
// var L1 = new LineSeries
// {
// Title = "厚度",
// Values = v1,
// DataLabels = false,
// Fill = new SolidColorBrush(Colors.Transparent),
// PointGeometrySize = 3,
// ScalesYAt = 0,
// };
// var L2 = new LineSeries
// {
// Title = "加热率",
// Values = v2,
// DataLabels = false,
// Fill = new SolidColorBrush(Colors.Transparent),
// PointGeometrySize = 3,
// ScalesYAt = 1,
// };
// MySeries.Add(L1);
// MySeries.Add(L2);
//}
//v1.Clear(); v1.AddRange(_data.GetThicks(SelectedFrame, ResetBolt, RotAngle));
//v2.Clear(); v2.AddRange(_data.GetHeats(SelectedFrame, -1, -1));
}
private void UpdateData()
{
_resetBolt = _data.GetResetBolt(SelectedFrame);
_rotAngle = _data.GetRotAngle(SelectedFrame);
ResetBolt = _data.GetResetBolt(SelectedFrame);
RotAngle = _data.GetRotAngle(SelectedFrame);
UpdateChart();
}
......
......@@ -87,6 +87,8 @@ namespace FLY.HeatingHelper.UI.UIModule
vm1.InitData(mdata, tmpVM.Selected_Idx_From, tmpVM.Selected_Idx_To);
vm2.InitData(mdata, tmpVM.Selected_Idx_From, tmpVM.Selected_Idx_To);
vmDiff.Init(mdata);
vm1.UpdateChart();
vm2.UpdateChart();
}
public void UnLoaded(object s)
......
......@@ -17,7 +17,7 @@ namespace FLY.HeatingHelper
{
bool IsDataReady { get; }
bool BeginUse();
bool BeginUse(bool isAsync = true);
void EndUse();
/// <summary>
......
......@@ -112,9 +112,14 @@ namespace FLY.HeatingHelper
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()
{
......@@ -494,137 +499,88 @@ namespace FLY.HeatingHelper
{
return data.Clone() as double[];
}
//放大
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];
// }
// }
//}
z = 1 / z;
double oldpos = mid - 1;
int curr_oi = mid - 1;
double newpos = mid - z;
int curr_ni = mid - 1;
double bin = z;
double sum = 0;
while (true)
{
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)
// 拼接data,使得数据两端都是NaN
int cnt = data.Count();
var tmpdata = data.Concat(data).ToArray();
int n = cnt / 2;
int i;
int tmpmid = mid;
if (mid < n)
{
_diff[curr_ni--] = double.NaN;
mid += cnt;
}
oldpos = 1;
newpos = z;
curr_oi = curr_ni = mid;
sum = 0; bin = z;
while (true)
for (i = 0; i < mid - n; i++) tmpdata[i] = double.NaN;
for (i = mid + cnt - n; i < 2 * cnt; i++) tmpdata[i] = double.NaN;
double[] _diff = new double[cnt*2];
// 计算新数据开始位置
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);
sum += data[curr_oi] * w;
bin -= w;
oldpos += 1;
curr_oi++;
if (curr_oi >= cnt) break;
_diff[ni++] = double.NaN;
npos += z;
continue;
}
else
int nn = (int)npos;
if (npos + z < nn + 1)
{
sum += data[curr_oi] * bin;
bin = 0;
_diff[ni++] = tmpdata[nn];
npos += z;
continue;
}
if (bin < 0.0001)
else
{
_diff[curr_ni++] = sum / z;
if (curr_ni == cnt) break;
newpos += z;
bin = z;
sum = 0;
if (!double.IsNaN(tmpdata[nn]))
{
sum += tmpdata[nn] * (nn + 1 - npos);
bin += (nn + 1 - npos);
}
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)
......@@ -715,7 +671,7 @@ namespace FLY.HeatingHelper
}
#endregion
#region 获取数据
/// <summary>
/// 获取某幅厚度数据的一部分
......@@ -762,7 +718,7 @@ namespace FLY.HeatingHelper
int s = newResetBolt - _resetBolts[idx];
while (s < 0) 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;
}
......@@ -796,7 +752,7 @@ namespace FLY.HeatingHelper
public List<DateTime> Dat_Times { get { return _dat_times; } }
public List<double> Dat_Sigmas { get { return _thick_2sigmas; } }
public List<double> Dat_Means { get { return _thick_means; } }
#endregion
interface ISearchModel
{
int AddOneData(int hr);
......@@ -1132,47 +1088,14 @@ namespace FLY.HeatingHelper
}
for (j = i - 1, k = 0; (j >= fmin) && (k < frameInterval); j--, k++)
{
double angle_i = GetRotAngle(i);
double angle_j = GetRotAngle(j);
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)
var tmp = SearchMaxSimilarity(j, i, searchRange, SearchRotAngle);
if (maxcorel < tmp.Item2)
{
double[] corels = CalculateCorrelVector((vthick1 - vthick2).ToArray(), (v_heat2 - v_heat1).ToArray());
double max = -100;
var r = CalculateAirRingShiftFromCorelVector(corels);
int shift = r.Item1;
if (maxcorel < r.Item2)
{
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;
}
}
maxcorel = tmp.Item2;
theshift = tmp.Item1;
deltaAngle = tmp.Item3;
idx1 = i;
idx2 = j;
}
}
}
......@@ -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 数据库数据变化后自动运行
[PropertyChanged.DoNotCheckEquality]
public List<ThickHeatEvent> AutoDetectEvents { get; set; }
/// <summary>
......@@ -1320,9 +1297,12 @@ namespace FLY.HeatingHelper
{
RefreshData();
EndUse();
Thread.Sleep(1000 * 60);
}
else
{
Thread.Sleep(1000 * 2);
}
// 延时1分钟
Thread.Sleep(1000 * 60);
}
});
}
......
......@@ -104,12 +104,16 @@ namespace FLY.HeatingHelper
_ids.Clear();
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 heat_dat = dr.Field<string>("Heats");
var t1 = Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(th_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);
_heats.Add(h1);
var t2 = RemoveNaN(t1);
......@@ -136,14 +140,18 @@ namespace FLY.HeatingHelper
{
var id = (int)dr.Field<long>("ID");
if (lastID >= id) continue;
_ids.Add(id);
_dat_times.Add(dr.Field<DateTime>("EndTime"));
string th_dat = dr.Field<string>("Thicks");
string heat_dat = dr.Field<string>("Heats");
var t1 = Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(th_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);
_heats.Add(h1);
_dat_times.Add(dr.Field<DateTime>("EndTime"));
var t2 = RemoveNaN(t1);
var r = MathNet.Numerics.Statistics.Statistics.MeanStandardDeviation(t2);
_thick_means.Add(r.Item1);
......@@ -157,6 +165,36 @@ namespace FLY.HeatingHelper
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();
#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