using GalaSoft.MvvmLight.Command;
using LiveCharts;
using LiveCharts.Configurations;
using LiveCharts.Wpf;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
namespace FLY.Thick.Blowing360.UI
{
public class PgBlowingExtVmUt : PgBlowingExtVm
{
public event PropertyChangedEventHandler PropertyChanged;
public PgBlowingExtVmUt()
{
Cfl = new CalFilmLenUt();
init_virtualdata();
}
///
/// 产生虚拟数据
///
void init_virtualdata()
{
#region 虚拟数据
int[] thicks = new int[]{
3518 ,
3484 ,
3634 ,
3620 ,
3579 ,
3625 ,
3635 ,
3638 ,
3635 ,
3606 ,
3611 ,
3603 ,
3590 ,
3631 ,
3646 ,
3647 ,
3710 ,
3705 ,
3607 ,
3720 ,
3680 ,
3637 ,
3659 ,
3703 ,
3860 ,
3720 ,
3615 ,
3810 ,
3772 ,
3666 ,
3614 ,
3627 ,
3618 ,
3502 ,
3575 ,
3583 ,
3615 ,
3680 ,
3730 ,
3840 ,
3927 ,
3946 ,
3923 ,
3841 ,
3797 ,
3865 ,
3810 ,
3711 ,
3754 ,
3705 ,
3723 ,
3699 ,
3723 ,
3801 ,
3786 ,
3798 ,
3907 ,
3945 ,
3828 ,
3860 ,
3846 ,
3903 ,
3871 ,
3844 ,
3759 ,
3816 ,
3886 ,
3815 ,
3789 ,
3876 ,
3942 ,
3854 ,
3842 ,
3921 ,
3846 ,
3835 ,
3886 ,
3881 ,
3820 ,
3787 ,
3730 ,
3617 ,
3650 ,
3610 ,
3536 ,
3545 ,
3564 ,
3584 ,
3580 ,
3572 ,
3571 ,
3579 ,
3620 ,
3634 ,
3484 ,
3518 ,
};
//辊周长 m
double RollPerimeter = 0.314;
//线速度 m/min
double FilmVelocity = 20;
//旋转周期
TimeSpan RInterval = TimeSpan.FromMinutes(6.1);
//速度震荡周期 m
double FV_Range = 2;
TimeSpan DataLen = TimeSpan.FromMinutes(30);
DateTime dt_begin = DateTime.Now;
DateTime dt_end = dt_begin + DataLen;
List vList = new List();
List tList = new List();
List lList = new List();
for (TimeSpan ts = TimeSpan.Zero; ts < DataLen; ts += TimeSpan.FromSeconds(1))
{
DateTime dt = dt_begin + ts;
double min = ts.TotalMinutes;
//速度以1/2旋转周期变化
double v = FilmVelocity + Math.Sin(Math.PI * 2 * min / (RInterval.TotalMinutes / 2)) * FV_Range;
vList.Add(new TimeValue() { Time = dt, Value = v });
int n = ((int)(min / RInterval.TotalMinutes)) % 2;
double m = min % RInterval.TotalMinutes;
int idx = (int)(thicks.Count() * m / RInterval.TotalMinutes);
if (idx < 0) idx = 0;
else if (idx > thicks.Count()) idx = thicks.Count() - 1;
double thick;
if (n == 0)
thick = thicks[idx] / 100.0;
else
thick = thicks[thicks.Count() - 1 - idx] / 100.0;
tList.Add(new TimeValue()
{
Time = dt,
Value = thick
}) ;
if (lList.Count() == 0)
{
lList.Add(new TimeValue() { Time = dt_begin + RInterval, Value = thick });
}
else if (dt >= lList.Last().Time)
{
lList.Add(new TimeValue() { Time = lList.Last().Time + RInterval, Value = thick });
}
}
List fList = new List();
double sum = 0;
double avg = vList.Average(tv => tv.Value);
foreach (var tv in vList)
{
sum += (tv.Value - avg) * TimeSpan.FromSeconds(1).TotalMinutes;
fList.Add(new TimeValue() { Time = tv.Time, Value = sum });
}
{
double min = fList.Min(tv => tv.Value);
foreach (var tv in vList)
{
tv.Value -= min;
}
}
List setFilmLength = new List();
foreach (var tv in fList)
{
if (tv.Time >= lList[0].Time && tv.Time <= lList[1].Time)
{
setFilmLength.Add(tv.Value);
}
else if (tv.Time > lList[1].Time)
{
break;
}
}
Random r = new Random();
List currFilmLength = new List();
foreach (var f in setFilmLength)
{
currFilmLength.Add(f + r.NextDouble() - 0.5);
}
List> frames = new List>();
for (int i = 0; i < lList.Count() - 1; i++)
{
List frame = new List();
frame.AddRange(thicks.Select(t => (t + (r.NextDouble() - 0.5) * t * 2 / 100) / 100.0));
frames.Add(frame);
}
#endregion
// LimitValues.AddRange(lList);
for (int i = 0; i < lList.Count(); i++)
{
var value = lList[i];
var axisSection = new AxisSection()
{
StrokeThickness = 1,
DataLabel = true,
DisableAnimations = true,
DataLabelForeground = new SolidColorBrush(Colors.White),
Opacity = 1,
Stroke = new SolidColorBrush(Colors.Orange),
};
if (value.Value == 1)
axisSection.Stroke = new SolidColorBrush(Colors.DarkBlue);
axisSection.Value = value.Time.Ticks;
LimitSections.Add(axisSection);
}
VelocityValues.AddRange(GetLimitedList(vList, 100));
ThicknessValues.AddRange(GetLimitedList(tList, 100));
for (int i = 0; i < frames.Count(); i++)
{
var frame = frames[i];
FrameSeries.Add(
new LineSeries()
{
Title = i.ToString(),
Values = new ChartValues(frame),
LineSmoothness = 1,
StrokeThickness = 3,
PointGeometrySize = 0
});
}
}
}
public class CalFilmLenUt : CalFilmLen360
{
public CalFilmLenUt()
{
IsCanDownload = true;
Msg = "下载中";
IsDataReady = true;
}
}
}