Commit 7ee393fd authored by 540597360@qq.com's avatar 540597360@qq.com

用数据ID标识数据

parent 759d1131
...@@ -133,7 +133,8 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -133,7 +133,8 @@ namespace FLY.HeatingHelper.UI.UIModule
/// </summary> /// </summary>
public void Calculate_From_Class_To_Rxx() public void Calculate_From_Class_To_Rxx()
{ {
int from = _vm.Selected_Idx_From, to = _vm.Selected_Idx_To; int from = _vm._data.GetIndexFromID(_vm.Selected_Idx_From),
to = _vm._data.GetIndexFromID(_vm.Selected_Idx_To);
_vm.RX = from; _vm.RX = from;
_vm.RY = myChart.AxisY.First().ActualMaxValue; _vm.RY = myChart.AxisY.First().ActualMaxValue;
...@@ -248,7 +249,7 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -248,7 +249,7 @@ namespace FLY.HeatingHelper.UI.UIModule
public DateTime DataTo { get; set; } public DateTime DataTo { get; set; }
/// <summary> /// <summary>
/// 选择要处理的数据(按Index /// 选择要处理的数据(按ID
/// </summary> /// </summary>
public int Selected_Idx_From { get; set; } public int Selected_Idx_From { get; set; }
public int Selected_Idx_To { get; set; } public int Selected_Idx_To { get; set; }
...@@ -278,9 +279,11 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -278,9 +279,11 @@ namespace FLY.HeatingHelper.UI.UIModule
{ {
Selected_Idx_From = from; Selected_Idx_From = from;
Selected_Idx_To = to; Selected_Idx_To = to;
var tmp = _data.GetDateTimeByID(from);
DataFrom = (DateTime)tmp;
tmp = _data.GetDateTimeByID(to);
DataTo = (DateTime)tmp;
Update_Tab1(); Update_Tab1();
DataFrom = Xaxis[Selected_Idx_From];
DataTo = Xaxis[Selected_Idx_To];
} }
} }
...@@ -296,8 +299,10 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -296,8 +299,10 @@ namespace FLY.HeatingHelper.UI.UIModule
_selected_class = _sclass; _selected_class = _sclass;
Selected_Idx_From = from; Selected_Idx_From = from;
Selected_Idx_To = to; Selected_Idx_To = to;
DataFrom = Xaxis[Selected_Idx_From]; var tmp = _data.GetDateTimeByID(from);
DataTo = Xaxis[Selected_Idx_To]; DataFrom = (DateTime)tmp;
tmp = _data.GetDateTimeByID(to);
DataTo = (DateTime)tmp;
return; return;
} }
break; break;
......
...@@ -71,6 +71,7 @@ ...@@ -71,6 +71,7 @@
<TextBlock Text="锁定设置:"/> <TextBlock Text="锁定设置:"/>
<RadioButton Content="锁定1幅" Grid.Column="1" IsChecked="{Binding LockFrames,Converter={StaticResource lfc},ConverterParameter=1}"/> <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}"/> <RadioButton Content="锁定2幅" Grid.Column="2" IsChecked="{Binding LockFrames,Converter={StaticResource lfc},ConverterParameter=2}"/>
<RadioButton Content="无锁定" Grid.Column="3" IsChecked="{Binding LockFrames,Converter={StaticResource lfc},ConverterParameter=0}"/>
</Grid> </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}"/>
...@@ -94,7 +95,7 @@ ...@@ -94,7 +95,7 @@
<TextBlock Text="{Binding RotAngle,StringFormat={}{0:f1}}" Style="{StaticResource tb_style}"/> <TextBlock Text="{Binding RotAngle,StringFormat={}{0:f1}}" Style="{StaticResource tb_style}"/>
<Button Content="增加" Margin="3,0,0,0" Click="Angle_Add"/> <Button Content="增加" Margin="3,0,0,0" Click="Angle_Add"/>
<Button Content="减少" Margin="3,0,0,0" Click="Angle_Sub"/> <Button Content="减少" Margin="3,0,0,0" Click="Angle_Sub"/>
<Button Content="自动试算" Margin="3,0,0,0"/> <Button Content="搜索旋转角度" Margin="3,0,0,0" Click="Search_Angle"/>
</StackPanel> </StackPanel>
<Button Content="应用" DockPanel.Dock="Bottom"/> <Button Content="应用" DockPanel.Dock="Bottom"/>
</DockPanel> </DockPanel>
......
...@@ -88,6 +88,10 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -88,6 +88,10 @@ namespace FLY.HeatingHelper.UI.UIModule
{ {
mainVM.Change_Angle(0.5); mainVM.Change_Angle(0.5);
} }
private void Search_Angle(object sender, RoutedEventArgs e)
{
}
} }
public class UC_AirRingShiftViewModel:INotifyPropertyChanged public class UC_AirRingShiftViewModel:INotifyPropertyChanged
...@@ -386,6 +390,19 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -386,6 +390,19 @@ namespace FLY.HeatingHelper.UI.UIModule
} }
} }
public void SearchAngle()
{
var tmp = _data.SearchMaxSimilarity(_data.GetIndexFromID(vm1.SelectedFrame),
_data.GetIndexFromID(vm2.SelectedFrame), 15, true);
RotAngle = tmp.Item3 + vm1.RotAngle;
TandH_Corel = tmp.Item2;
AirRingShift = tmp.Item1;
int rb = AirRingShift + vm1.ResetBolt;
while (rb >= _data.BoltCnt) rb -= _data.BoltCnt;
while (rb < 0) rb += _data.BoltCnt;
ResetBolt = rb;
}
public void AutoSearchAndCal_Shift() public void AutoSearchAndCal_Shift()
{ {
SearchEnabled = false; SearchEnabled = false;
...@@ -393,6 +410,12 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -393,6 +410,12 @@ namespace FLY.HeatingHelper.UI.UIModule
int searchCnt = int.MaxValue; int searchCnt = int.MaxValue;
int start = vm1.MinFrame; int start = vm1.MinFrame;
int end = vm1.MaxFrame; int end = vm1.MaxFrame;
if (LockFrames == 2)
{
SearchAngle();
SearchEnabled = true;
return;
}
if (LockFrames == 1) if (LockFrames == 1)
{ {
searchCnt = 1; searchCnt = 1;
......
...@@ -18,7 +18,9 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -18,7 +18,9 @@ namespace FLY.HeatingHelper.UI.UIModule
public UC_FrameDiffViewModel() public UC_FrameDiffViewModel()
{ {
} }
/// <summary>
/// 两个ID
/// </summary>
public int FrameIdx1 { get; set; } = -1; public int FrameIdx1 { get; set; } = -1;
public int FrameIdx2 { get; set; } = -1; public int FrameIdx2 { get; set; } = -1;
public SeriesCollection MySeries { get; set; } = new SeriesCollection(); public SeriesCollection MySeries { get; set; } = new SeriesCollection();
......
...@@ -266,14 +266,18 @@ namespace FLY.HeatingHelper.UI.UIModule ...@@ -266,14 +266,18 @@ namespace FLY.HeatingHelper.UI.UIModule
{ {
if (SelectedFrame > MinFrame) if (SelectedFrame > MinFrame)
{ {
SelectedFrame--; var tmp = _data.GetRelativeID(SelectedFrame, -1);
if (tmp >= 0)
SelectedFrame = tmp;
} }
}); });
NxtCmd = new RelayCommand(() => NxtCmd = new RelayCommand(() =>
{ {
if (SelectedFrame < MaxFrame) if (SelectedFrame < MaxFrame)
{ {
SelectedFrame++; var tmp = _data.GetRelativeID(SelectedFrame, 1);
if (tmp >= 0)
SelectedFrame = tmp;
} }
}); });
} }
......
...@@ -15,11 +15,7 @@ namespace FLY.HeatingHelper ...@@ -15,11 +15,7 @@ namespace FLY.HeatingHelper
/// </summary> /// </summary>
public interface IThickHeatData : INotifyPropertyChanged public interface IThickHeatData : INotifyPropertyChanged
{ {
bool IsDataReady { get; } #region 用于UI的接口
bool BeginUse(bool isAsync = true);
void EndUse();
/// <summary> /// <summary>
/// 数据库中存在的数据范围 /// 数据库中存在的数据范围
/// </summary> /// </summary>
...@@ -43,39 +39,17 @@ namespace FLY.HeatingHelper ...@@ -43,39 +39,17 @@ namespace FLY.HeatingHelper
/// </summary> /// </summary>
int AirRingShift { get; } int AirRingShift { get; }
/// <summary> StateCode State { get; }
/// MaxHeatVariationIdx1,MaxHeatVariationIdx2指示两幅数据,这两幅数据的加热量变化最大 #endregion
/// </summary>
int MaxHeatVariationIdx1 { get; }
int MaxHeatVariationIdx2 { get; }
/// <summary> /// <summary>
/// 通知新数据产生 /// 通知新数据产生
/// </summary> /// </summary>
bool NewDataArrived { set; } bool NewDataArrived { set; }
/// <summary>
/// 计算最合适的判断范围,FromTo也可以自行设定,计算DFrom和DTo的值
/// </summary>
//void CalculateFromTo();
/// <summary>
/// 计算加热最大变化量,计算出两个索引值
/// </summary>
int[] CalculateMaxHeatVariation(object _aclass);
int CalculateFromToByClass(int selected_class, ref int from, ref int to); int CalculateFromToByClass(int selected_class, ref int from, ref int to);
#region 一些辅助计算的函数 #region 一些辅助计算的函数
/// <summary> /// <summary>
/// 通过加热变化量和厚度变化量计算加热到厚度的比例系数
/// </summary>
/// <param name="heats">加热变化量</param>
/// <param name="thicks">厚度变化量</param>
/// <returns></returns>
double CalculateHeatToThickFactor(double[] heats, double[] thicks, double thickmean);
/// <summary>
/// 计算两个frame的加热和厚度差的协相关向量。 /// 计算两个frame的加热和厚度差的协相关向量。
/// </summary> /// </summary>
double[] CalculateCorrelVector(double[] heats, double[] thicks); double[] CalculateCorrelVector(double[] heats, double[] thicks);
...@@ -84,6 +58,7 @@ namespace FLY.HeatingHelper ...@@ -84,6 +58,7 @@ namespace FLY.HeatingHelper
#endregion #endregion
void SetDB(string dbname); void SetDB(string dbname);
#region 获取数据接口
/// <summary> /// <summary>
/// 获取厚度和加热的值 /// 获取厚度和加热的值
/// </summary> /// </summary>
...@@ -100,15 +75,19 @@ namespace FLY.HeatingHelper ...@@ -100,15 +75,19 @@ namespace FLY.HeatingHelper
List<double> Dat_Sigmas { get; } List<double> Dat_Sigmas { get; }
List<double> Dat_Means { get; } List<double> Dat_Means { get; }
int BoltCnt { get; } int GetIndexFromID(int id);
int GetRelativeID(int id, int relative);
/// <summary> /// <summary>
/// 计算风环偏转值 /// 依据数据ID获取数据时间
/// </summary> /// </summary>
void CalculateAirRingShift(); /// <param name="id"></param>
/// <returns></returns>
DateTime? GetDateTimeByID(int id);
#endregion
int BoltCnt { get; }
double[] HeatEffect { get; set; } double[] HeatEffect { get; set; }
#region 整体分析和局部分析的功能jiekou
List<HeatBoltAnalystItem> SearchFeaturedBoltsItem(int startIdx, int endIdx, List<HeatBoltAnalystItem> SearchFeaturedBoltsItem(int startIdx, int endIdx,
int searchNum, int maxFrameInterval, int heatRating, int searchNum, int maxFrameInterval, int heatRating,
int neglectHeatRate, int Separation, int shiftRange); int neglectHeatRate, int Separation, int shiftRange);
...@@ -117,6 +96,16 @@ namespace FLY.HeatingHelper ...@@ -117,6 +96,16 @@ namespace FLY.HeatingHelper
ProgressChangedEventHandler report, ProgressChangedEventHandler report,
RunWorkerCompletedEventHandler runcomplete, RunWorkerCompletedEventHandler runcomplete,
int midbolt, double searchRange, bool SearchRotAngle, bool isAsync); int midbolt, double searchRange, bool SearchRotAngle, bool isAsync);
/// <summary>
///
/// </summary>
/// <param name="idxL"></param>
/// <param name="idxB"></param>
/// <param name="searchRange"></param>
/// <param name="SearchRotAngle"></param>
/// <returns>返回值:Tuple<偏转数,相关系数,旋转角度变化量></returns>
Tuple<int, double, double> SearchMaxSimilarity(int idxL, int idxB, double searchRange, bool SearchRotAngle);
#endregion
#region 数据库数据变化后自动运行 #region 数据库数据变化后自动运行
List<ThickHeatEvent> AutoDetectEvents { get; } List<ThickHeatEvent> AutoDetectEvents { get; }
...@@ -129,20 +118,41 @@ namespace FLY.HeatingHelper ...@@ -129,20 +118,41 @@ namespace FLY.HeatingHelper
/// 搜索旋转角度的范围,例如15,则在当前度数下搜索正负15度 /// 搜索旋转角度的范围,例如15,则在当前度数下搜索正负15度
/// </summary> /// </summary>
double SearchingAngle { get; set; } double SearchingAngle { get; set; }
/// <summary>
/// 该参数设定不参加搜索的数据
/// </summary>
int NotSearchMinFrame { get; set; }
StateCode State { get; }
/// <summary> /// <summary>
/// 检查数据库,当数据库有新数据时,更新DataTo属性,并读取新数据到对象中。该函数可以一定时间间隔执行。 /// 检查数据库,当数据库有新数据时,更新DataTo属性,并读取新数据到对象中。该函数可以一定时间间隔执行。
/// </summary> /// </summary>
void RefreshData(); void RefreshData();
bool IsDataReady { get; }
bool BeginUse(bool isAsync = true);
void EndUse();
#endregion #endregion
} }
public enum StateCode
{
STC_NODAT, // 没有数据
STC_IDLE, // 空闲
STC_READING, // 读取数据
STC_UPDATING // 检查新数据
}
#region 厚度加热数据自动处理结果事件
public class ThickHeatEvent
{
public ThickHeatEventCode EvtCode;
public object EvtData;
}
public enum ThickHeatEventCode
{
EVC_RingShift,
EVC_HeatBoltItem,
}
public class MaxSimilarityResult public class MaxSimilarityResult
{ {
public int frameIdx1; public int frameIdx1;
...@@ -153,14 +163,6 @@ namespace FLY.HeatingHelper ...@@ -153,14 +163,6 @@ namespace FLY.HeatingHelper
public double ThickToHeatFactor; public double ThickToHeatFactor;
} }
public enum StateCode
{
STC_NODAT, // 没有数据
STC_IDLE, // 空闲
STC_READING, // 读取数据
STC_UPDATING // 检查新数据
}
public class HeatBoltAnalystItem public class HeatBoltAnalystItem
{ {
public int FrameIdx1 { get; set; } public int FrameIdx1 { get; set; }
...@@ -183,28 +185,6 @@ namespace FLY.HeatingHelper ...@@ -183,28 +185,6 @@ namespace FLY.HeatingHelper
Similarity = from.Similarity; Similarity = from.Similarity;
} }
} }
#region 厚度加热数据自动处理结果事件
public enum ThickHeatEventCode
{
EVC_RingShift,
EVC_HeatBoltItem,
}
public class EVTD_RingShift
{
public int frameIdx1;
public int frameIdx2;
public double shifted;
public double degree;
public double similarity;
}
public class ThickHeatEvent
{
public ThickHeatEventCode EvtCode;
public object EvtData;
}
#endregion #endregion
#region DataHelper #region DataHelper
......
...@@ -126,22 +126,6 @@ namespace FLY.HeatingHelper ...@@ -126,22 +126,6 @@ namespace FLY.HeatingHelper
Monitor.Exit(_sync); Monitor.Exit(_sync);
} }
public int MaxHeatVariationIdx1
{
get
{
return _select_frame_idx1;
}
}
public int MaxHeatVariationIdx2
{
get
{
return _select_frame_idx2;
}
}
public bool NewDataArrived { set => RefreshData(); } public bool NewDataArrived { set => RefreshData(); }
public DateTime TotalDataFrom { get; protected set; } public DateTime TotalDataFrom { get; protected set; }
...@@ -346,8 +330,8 @@ namespace FLY.HeatingHelper ...@@ -346,8 +330,8 @@ namespace FLY.HeatingHelper
{ {
if (selected_class < thickClasses.Count()) if (selected_class < thickClasses.Count())
{ {
from = thickClasses[selected_class].from; from = _ids[thickClasses[selected_class].from];
to = thickClasses[selected_class].to; to = _ids[thickClasses[selected_class].to];
return selected_class; return selected_class;
} }
return -1; return -1;
...@@ -359,8 +343,8 @@ namespace FLY.HeatingHelper ...@@ -359,8 +343,8 @@ namespace FLY.HeatingHelper
{ {
if (thickClasses[i].points_idx.Count() >= 2) if (thickClasses[i].points_idx.Count() >= 2)
{ {
from = thickClasses[i].from; from = _ids[thickClasses[i].from];
to = thickClasses[i].to; to = _ids[thickClasses[i].to];
return i; return i;
} }
} }
...@@ -398,7 +382,7 @@ namespace FLY.HeatingHelper ...@@ -398,7 +382,7 @@ namespace FLY.HeatingHelper
/// <summary> /// <summary>
/// 运用选出类(数据)的点计算最大加热变化。返回产生最大值的数据索引 /// 运用选出类(数据)的点计算最大加热变化。返回产生最大值的数据索引
/// </summary> /// </summary>
public int[] CalculateMaxHeatVariation(object _aclass) private int[] CalculateMaxHeatVariation(object _aclass)
{ {
ThickClass _theclass = _aclass as ThickClass; ThickClass _theclass = _aclass as ThickClass;
int cnt = _theclass.points_idx.Count(); int cnt = _theclass.points_idx.Count();
...@@ -615,7 +599,7 @@ namespace FLY.HeatingHelper ...@@ -615,7 +599,7 @@ namespace FLY.HeatingHelper
/// <param name="thicks">厚度变化量</param> /// <param name="thicks">厚度变化量</param>
/// <param name="thickmean">厚度均值</param> /// <param name="thickmean">厚度均值</param>
/// <returns></returns> /// <returns></returns>
public double CalculateHeatToThickFactor(double[] heats, double[] thicks, double thickmean) private double CalculateHeatToThickFactor(double[] heats, double[] thicks, double thickmean)
{ {
int cnt = thicks.Count(); int cnt = thicks.Count();
if (cnt < 2) return double.NaN; if (cnt < 2) return double.NaN;
...@@ -669,6 +653,16 @@ namespace FLY.HeatingHelper ...@@ -669,6 +653,16 @@ namespace FLY.HeatingHelper
} }
return d.ToArray(); return d.ToArray();
} }
public int GetIndexFromID(int id)
{
int cnt = _ids.Count();
for(int i = 0; i < cnt; i++)
{
if (_ids[i] == id) return i;
}
return -1;
}
#endregion #endregion
#region 获取数据 #region 获取数据
...@@ -682,65 +676,116 @@ namespace FLY.HeatingHelper ...@@ -682,65 +676,116 @@ namespace FLY.HeatingHelper
/// <returns></returns> /// <returns></returns>
public double[] GetThicks(int idx, int from, int to) public double[] GetThicks(int idx, int from, int to)
{ {
int cnt = _thicks[0].Count(); int index = GetIndexFromID(idx);
if ((to >= cnt) || (to < 0)) to = cnt - 1; if (index < 0) return null;
if ((from < 0) || (from > to)) from = 0; return GetThicksByIndex(index, from, to);
return _thicks[idx].Skip(from).Take(to - from + 1).ToArray();
} }
/// <summary> private double[] GetThicksByIndex(int idx,int from, int to)
/// 获取某幅加热数据的一部分
/// </summary>
/// <param name="idx"></param>
/// <param name="from"></param>
/// <param name="to"></param>
/// <returns></returns>
public double[] GetHeats(int idx, int from, int to)
{ {
int cnt = _heats[0].Count(); int cnt = _thicks[0].Count();
if ((to >= cnt) || (to < 0)) to = cnt - 1; if ((to >= cnt) || (to < 0)) to = cnt - 1;
if ((from < 0) || (from > to)) from = 0; if ((from < 0) || (from > to)) from = 0;
return _heats[idx].Skip(from).Take(to - from + 1).ToArray(); return _thicks[idx].Skip(from).Take(to - from + 1).ToArray();
} }
public double[] GetThicks(int idx, int newResetBolt, double newAngle) public double[] GetThicks(int idx, int newResetBolt, double newAngle)
{ {
double[] ret = GetThicks(idx, -1, -1); double[] ret = GetThicks(idx, -1, -1);
if (ret is null) return null;
int index = GetIndexFromID(idx);
if (!double.IsNaN(newAngle))
{
if (Math.Abs(newAngle - _rotAngles[index]) > 0.001)
{
ret = ReSampleForChangeRotAngle(ret, _resetBolts[index], newAngle / _rotAngles[index]);
}
}
if (newResetBolt != int.MaxValue)
{
int cnt = ret.Count();
int s = newResetBolt - _resetBolts[index];
while (s < 0) s += cnt;
while (s >= cnt) s -= cnt;
return ret.Concat(ret).Skip(cnt - s).Take(cnt).ToArray();
}
return ret;
}
private double[] GetThicksByIndex(int idx, int newResetBolt, double newAngle)
{
double[] ret = GetThicksByIndex(idx, -1, -1);
if (ret is null) return null;
int index = idx;
if (!double.IsNaN(newAngle)) if (!double.IsNaN(newAngle))
{ {
if (Math.Abs(newAngle - _rotAngles[idx]) > 0.001) if (Math.Abs(newAngle - _rotAngles[index]) > 0.001)
{ {
ret = ReSampleForChangeRotAngle(ret, _resetBolts[idx], newAngle / _rotAngles[idx]); ret = ReSampleForChangeRotAngle(ret, _resetBolts[index], newAngle / _rotAngles[index]);
} }
} }
if (newResetBolt != int.MaxValue) if (newResetBolt != int.MaxValue)
{ {
int cnt = ret.Count(); int cnt = ret.Count();
int s = newResetBolt - _resetBolts[idx]; int s = newResetBolt - _resetBolts[index];
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(cnt-s).Take(cnt).ToArray(); return ret.Concat(ret).Skip(cnt - s).Take(cnt).ToArray();
} }
return ret; return ret;
} }
/// <summary>
/// 获取某幅加热数据的一部分
/// </summary>
/// <param name="idx"></param>
/// <param name="from"></param>
/// <param name="to"></param>
/// <returns></returns>
public double[] GetHeats(int idx, int from, int to)
{
int index = GetIndexFromID(idx);
if (index < 0) return null;
return GetHeatsByIndex(index, from, to);
}
private double[] GetHeatsByIndex(int idx, int from, int to)
{
int cnt = _heats[0].Count();
if ((to >= cnt) || (to < 0)) to = cnt - 1;
if ((from < 0) || (from > to)) from = 0;
return _heats[idx].Skip(from).Take(to - from + 1).ToArray();
}
/// <summary> /// <summary>
/// 获取某幅厚度数据的复位分区号 /// 获取某幅厚度数据的复位分区号
/// </summary> /// </summary>
/// <param name="idx"></param> /// <param name="idx"></param>
/// <returns></returns> /// <returns></returns>
public int GetResetBolt(int idx) public int GetResetBolt(int idx)
{
int index = GetIndexFromID(idx);
if (index < 0) return -1;
return GetResetBoltByIndex(index);
}
private int GetResetBoltByIndex(int idx)
{ {
return _resetBolts[idx]; return _resetBolts[idx];
} }
/// <summary> /// <summary>
/// 获取某幅厚度数据的旋转角度 /// 获取某幅厚度数据的旋转角度
/// </summary> /// </summary>
/// <param name="idx"></param> /// <param name="idx"></param>
/// <returns></returns> /// <returns></returns>
public double GetRotAngle(int idx) public double GetRotAngle(int idx)
{
int index = GetIndexFromID(idx);
if (index < 0) return -1;
return GetRotAngleByIndex(index);
}
private double GetRotAngleByIndex(int idx)
{ {
return _rotAngles[idx]; return _rotAngles[idx];
} }
public int NormalBolt(int bolt, int boltcnt) public int NormalBolt(int bolt, int boltcnt)
{ {
if (boltcnt == int.MaxValue) boltcnt = BoltCnt; if (boltcnt == int.MaxValue) boltcnt = BoltCnt;
...@@ -752,6 +797,21 @@ namespace FLY.HeatingHelper ...@@ -752,6 +797,21 @@ 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; } }
public int GetRelativeID(int id, int relative)
{
int idx = GetIndexFromID(id);
if (idx < 0) return -1;
idx += relative;
if (idx < 0 || idx >= _ids.Count()) return -1;
return _ids[idx];
}
public DateTime? GetDateTimeByID(int id)
{
int idx = GetIndexFromID(id);
if (idx < 0) return null;
return _dat_times[idx];
}
#endregion #endregion
interface ISearchModel interface ISearchModel
{ {
...@@ -942,6 +1002,12 @@ namespace FLY.HeatingHelper ...@@ -942,6 +1002,12 @@ namespace FLY.HeatingHelper
public List<HeatBoltAnalystItem> SearchFeaturedBoltsItem(int startIdx, int endIdx, int searchNum, int maxFrameInterval, int heatRating, public List<HeatBoltAnalystItem> SearchFeaturedBoltsItem(int startIdx, int endIdx, int searchNum, int maxFrameInterval, int heatRating,
int neglectHeatRate, int Separation, int shiftRange) int neglectHeatRate, int Separation, int shiftRange)
{ {
startIdx = GetIndexFromID(startIdx);
endIdx = GetIndexFromID(endIdx);
if (startIdx < 0 || endIdx < 0)
{
return null;
}
int i = startIdx, ki; int i = startIdx, ki;
int j, k; int j, k;
List<HeatBoltAnalystItem> result = new List<HeatBoltAnalystItem>(); List<HeatBoltAnalystItem> result = new List<HeatBoltAnalystItem>();
...@@ -949,10 +1015,10 @@ namespace FLY.HeatingHelper ...@@ -949,10 +1015,10 @@ namespace FLY.HeatingHelper
{ {
for (j = i - 1, k = 0; (j >= startIdx) && (k < maxFrameInterval); j--, k++) for (j = i - 1, k = 0; (j >= startIdx) && (k < maxFrameInterval); j--, k++)
{ {
var h1 = Vector<double>.Build.DenseOfArray(GetHeats(i, -1, -1)); var h1 = Vector<double>.Build.DenseOfArray(GetHeatsByIndex((i), -1, -1));
var h2 = Vector<double>.Build.DenseOfArray(GetHeats(j, -1, -1)); var h2 = Vector<double>.Build.DenseOfArray(GetHeatsByIndex((j), -1, -1));
var v1 = Vector<double>.Build.DenseOfArray(GetThicks(i, -1, -1)); var v1 = Vector<double>.Build.DenseOfArray(GetThicksByIndex((i), -1, -1));
var v2 = Vector<double>.Build.DenseOfArray(GetThicks(j, -1, -1)); var v2 = Vector<double>.Build.DenseOfArray(GetThicksByIndex((j), -1, -1));
var h3 = h2 - h1; var h3 = h2 - h1;
var v3 = v1 - v2; var v3 = v1 - v2;
var cnt = h3.Count; var cnt = h3.Count;
...@@ -977,14 +1043,22 @@ namespace FLY.HeatingHelper ...@@ -977,14 +1043,22 @@ namespace FLY.HeatingHelper
var tmpr = dm.GetResult(); var tmpr = dm.GetResult();
if (tmpr.Count() == 0) continue; if (tmpr.Count() == 0) continue;
h4 = EffectFilter(h3.ToArray()); h4 = EffectFilter(h3.ToArray());
h4 = h4.Concat(h4).ToArray(); h4 = h4.Concat(h4).Concat(h4).ToArray();
foreach (var item in tmpr) foreach (var item in tmpr)
{ {
item.FrameIdx1 = i; item.FrameIdx1 = _ids[i];
item.FrameIdx2 = j; item.FrameIdx2 = _ids[j];
int from, to; int from, to;
from = item.StartBolt - Separation; from = item.StartBolt - Separation;
to = item.EndBolt + Separation; to = item.EndBolt + Separation;
// 修正from,to的值
if (from > to) to += cnt;
if (from < 0)
{
from += cnt;
to += cnt;
}
double maxcor = double.MinValue; double maxcor = double.MinValue;
int maxshift = 0; int maxshift = 0;
for (int jj = -shiftRange; jj <= shiftRange; jj++) for (int jj = -shiftRange; jj <= shiftRange; jj++)
...@@ -1064,8 +1138,13 @@ namespace FLY.HeatingHelper ...@@ -1064,8 +1138,13 @@ namespace FLY.HeatingHelper
BackgroundWorker bk = new BackgroundWorker(); BackgroundWorker bk = new BackgroundWorker();
var handler = new DoWorkEventHandler((o, e) => var handler = new DoWorkEventHandler((o, e) =>
{ {
int fmin = startIdx; int fmin = GetIndexFromID(startIdx);
int fmax = endIdx; int fmax = GetIndexFromID(endIdx);
if (fmin < 0 || fmax < 0)
{
result.frameIdx1 = -1;
return;
}
int i, j, k, ki; int i, j, k, ki;
double maxcorel = -100; double maxcorel = -100;
int theshift = 0; int theshift = 0;
...@@ -1099,15 +1178,15 @@ namespace FLY.HeatingHelper ...@@ -1099,15 +1178,15 @@ namespace FLY.HeatingHelper
} }
} }
} }
result.frameIdx1 = idx1; result.frameIdx1 = _ids[idx1];
result.frameIdx2 = idx2; result.frameIdx2 = _ids[idx2];
result.frameShift = theshift; result.frameShift = theshift;
result.similarity = maxcorel; result.similarity = maxcorel;
result.deltaAngle = deltaAngle; result.deltaAngle = deltaAngle;
var angle = GetRotAngle(idx1) + deltaAngle; var angle = GetRotAngle(_ids[idx1]) + deltaAngle;
var heat = DataHelper.VectorSub(GetHeats(idx2, -1, -1), GetHeats(idx1, -1, -1)); var heat = DataHelper.VectorSub(GetHeats(_ids[idx2], -1, -1), GetHeats(_ids[idx1], -1, -1));
var t1 = GetThicks(idx1, int.MinValue, angle); var t1 = GetThicks(_ids[idx1], int.MinValue, angle);
var th = DataHelper.VectorSub(t1, GetThicks(idx2, int.MaxValue, angle)); var th = DataHelper.VectorSub(t1, GetThicks(_ids[idx2], int.MaxValue, angle));
result.ThickToHeatFactor = CalculateHeatToThickFactor(heat, th, result.ThickToHeatFactor = CalculateHeatToThickFactor(heat, th,
MathNet.Numerics.Statistics.Statistics.Mean(t1)); MathNet.Numerics.Statistics.Statistics.Mean(t1));
}); });
...@@ -1131,7 +1210,14 @@ namespace FLY.HeatingHelper ...@@ -1131,7 +1210,14 @@ namespace FLY.HeatingHelper
runcomplete(bk, null); runcomplete(bk, null);
} }
} }
/// <summary>
///
/// </summary>
/// <param name="idxL"></param>
/// <param name="idxB"></param>
/// <param name="searchRange"></param>
/// <param name="SearchRotAngle"></param>
/// <returns>返回值:Tuple<偏转数,相关系数,旋转角度变化量></returns>
public Tuple<int,double,double> SearchMaxSimilarity(int idxL,int idxB,double searchRange,bool SearchRotAngle) public Tuple<int,double,double> SearchMaxSimilarity(int idxL,int idxB,double searchRange,bool SearchRotAngle)
{ {
double maxcorel = double.MinValue; double maxcorel = double.MinValue;
...@@ -1143,14 +1229,14 @@ namespace FLY.HeatingHelper ...@@ -1143,14 +1229,14 @@ namespace FLY.HeatingHelper
idxL = idxB; idxL = idxB;
idxB = idxL; idxB = idxL;
} }
double angle_B = GetRotAngle(idxB); double angle_B = GetRotAngleByIndex(idxB);
double angle_L = GetRotAngle(idxL); double angle_L = GetRotAngleByIndex(idxL);
int rb_B = GetResetBolt(idxB); int rb_B = GetResetBoltByIndex(idxB);
int rb_L = GetResetBolt(idxL); int rb_L = GetResetBoltByIndex(idxL);
Vector<double> vthickL = Vector<double>.Build.DenseOfArray(GetThicks(idxL, rb_B, angle_B)); Vector<double> vthickL = Vector<double>.Build.DenseOfArray(GetThicksByIndex(idxL, rb_B, angle_B));
Vector<double> vthickB = Vector<double>.Build.DenseOfArray(GetThicks(idxB, -1, -1)); Vector<double> vthickB = Vector<double>.Build.DenseOfArray(GetThicksByIndex(idxB, -1, -1));
Vector<double> v_heatL = Vector<double>.Build.DenseOfArray(GetHeats(idxL, -1, -1)); Vector<double> v_heatL = Vector<double>.Build.DenseOfArray(GetHeatsByIndex(idxL, -1, -1));
Vector<double> v_heatB = Vector<double>.Build.DenseOfArray(GetHeats(idxB, -1, -1)); Vector<double> v_heatB = Vector<double>.Build.DenseOfArray(GetHeatsByIndex(idxB, -1, -1));
if (!SearchRotAngle) if (!SearchRotAngle)
{ {
double[] corels = CalculateCorrelVector((vthickL - vthickB).ToArray(), (v_heatB - v_heatL).ToArray()); double[] corels = CalculateCorrelVector((vthickL - vthickB).ToArray(), (v_heatB - v_heatL).ToArray());
...@@ -1197,10 +1283,7 @@ namespace FLY.HeatingHelper ...@@ -1197,10 +1283,7 @@ namespace FLY.HeatingHelper
/// 搜索旋转角度的范围,例如15,则在当前度数下搜索正负15度 /// 搜索旋转角度的范围,例如15,则在当前度数下搜索正负15度
/// </summary> /// </summary>
public double SearchingAngle { get; set; } public double SearchingAngle { get; set; }
/// <summary>
/// 该参数设定不参加搜索的数据
/// </summary>
public int NotSearchMinFrame { get; set; }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
...@@ -1235,6 +1318,8 @@ namespace FLY.HeatingHelper ...@@ -1235,6 +1318,8 @@ namespace FLY.HeatingHelper
}, },
int.MaxValue, 10, true, false); int.MaxValue, 10, true, false);
var r = SearchFeaturedBoltsItem(thickClasses[0].from, thickClasses[0].to, newitems, 5, 100, 5, 5, 5); var r = SearchFeaturedBoltsItem(thickClasses[0].from, thickClasses[0].to, newitems, 5, 100, 5, 5, 5);
if (r != null)
{
foreach (HeatBoltAnalystItem it in r) foreach (HeatBoltAnalystItem it in r)
{ {
tmp.Add(new ThickHeatEvent() tmp.Add(new ThickHeatEvent()
...@@ -1243,6 +1328,7 @@ namespace FLY.HeatingHelper ...@@ -1243,6 +1328,7 @@ namespace FLY.HeatingHelper
EvtData = it as object EvtData = it as object
}); });
} }
}
AutoDetectEvents = tmp; AutoDetectEvents = tmp;
} }
......
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