using FLY.Thick.Base.Client; using FLY.Thick.Base.IService; using FObjBase; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using Unity; namespace FLY.Thick.Base.UI { /// /// Page_GageInfo.xaml 的交互逻辑 /// public partial class PgGageInfo : Page { #region 延时推送 MARKNO const int MARKNO_UPDATE = 1; #endregion public class SeriesInfo : INotifyPropertyChanged { public string Name { get; set; } //public Brush Color { get; set; } public List Datas = new List(); public DateTime UpdateTime = DateTime.MaxValue; public event PropertyChangedEventHandler PropertyChanged; } public SeriesInfo[] SeriesInfos { get; set; } IGageInfoService gageInfo = null; IGetSampleService getSample = null; IBorderSearchService borderSearch = null; ITDGageService gageService = null; IUnityContainer container; public PgGageInfo() { InitializeComponent(); InitializeComponent2(); } [InjectionMethod] public void Init( IUnityContainer container, IGageInfoService gageInfoService, IGetSampleService getSample, IBorderSearchService borderSearch, ITDGageService gageService ) { this.gageInfo = gageInfoService; this.getSample = getSample; this.borderSearch = borderSearch; this.gageService = gageService; this.container = container; container.BuildUp(mircoGage); SeriesInfos = new SeriesInfo[2] { new SeriesInfo(){ Name = "正向" }, new SeriesInfo(){ Name = "反向" } }; } private void Page_Loaded(object sender, RoutedEventArgs e1) { this.DataContext = gageInfo; gageInfo.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(gageInfo.UpdateTimes)) { //下载数据 for (int i = 0; i < SeriesInfos.Count(); i++) { var seriesInfo = SeriesInfos[i]; if (gageInfo.UpdateTimes != null && gageInfo.UpdateTimes.Count() > i) { if (seriesInfo.UpdateTime != gageInfo.UpdateTimes[i]) { gageInfo.GetGageInfo(i, (asyncContext, retData) => { var reponse = retData as GetGageInfoResponse; int index = (int)asyncContext; SeriesInfos[index].Datas.Clear(); if (reponse.Data != null) { SeriesInfos[index].Datas.AddRange(reponse.Data); } SeriesInfos[index].UpdateTime = reponse.UpdateTime; DataBindAll(); }, i); } } } } }; getSample.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(getSample.Enable)) { update(); } }; for (int i = 0; i < getSample.Samples.Count(); i++) { getSample.Samples[i].PropertyChanged += (s, e) => { if ((e.PropertyName == nameof(SampleCell.Enable)) || (e.PropertyName == nameof(SampleCell.Position)) || (e.PropertyName == nameof(SampleCell.OrgAD))) { update(); } }; } for (int i = 0; i < getSample.Features.Count(); i++) { getSample.Features[i].PropertyChanged += (s, e) => { if ((e.PropertyName == nameof(SampleFeature.Enable)) || (e.PropertyName == nameof(SampleFeature.StartPos)) || (e.PropertyName == nameof(SampleFeature.EndPos))) { update(); } }; } borderSearch.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(borderSearch.Enable)) { update(); } else if (e.PropertyName == nameof(borderSearch.Valid)) { update(); } }; DownloadAll(); //DataBindAll(); update(); } void DownloadAll() { //下载数据 for (int i = 0; i < SeriesInfos.Count(); i++) { var seriesInfo = SeriesInfos[i]; gageInfo.GetGageInfo(i, (asyncContext, retData) => { var reponse = retData as GetGageInfoResponse; int index = (int)asyncContext; SeriesInfos[index].Datas.Clear(); if (reponse.Data != null) { SeriesInfos[index].Datas.AddRange(reponse.Data); } SeriesInfos[index].UpdateTime = reponse.UpdateTime; DataBindAll(); }, i); } } void InitializeComponent2() { System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series(); System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series();//样品 // // chart1 // chart1.BackColor = System.Drawing.Color.Transparent; chartArea1.Area3DStyle.Inclination = 15; chartArea1.Area3DStyle.IsClustered = true; chartArea1.Area3DStyle.IsRightAngleAxes = false; chartArea1.Area3DStyle.Perspective = 10; chartArea1.Area3DStyle.Rotation = 10; chartArea1.Area3DStyle.WallWidth = 0; chartArea1.AxisX.IsLabelAutoFit = false; chartArea1.AxisX.LabelStyle.Font = new System.Drawing.Font("Trebuchet MS", 8.25F, System.Drawing.FontStyle.Bold); chartArea1.AxisX.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); chartArea1.AxisX.MajorGrid.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); chartArea1.AxisX.ScrollBar.BackColor = System.Drawing.Color.AliceBlue; chartArea1.AxisX.ScrollBar.ButtonColor = System.Drawing.SystemColors.Control; chartArea1.AxisX.ScrollBar.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); chartArea1.AxisY.LabelStyle.Font = new System.Drawing.Font("Trebuchet MS", 8.25F, System.Drawing.FontStyle.Bold); chartArea1.AxisY.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); chartArea1.AxisY.MajorGrid.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); chartArea1.AxisY.ScrollBar.BackColor = System.Drawing.Color.AliceBlue; chartArea1.AxisY.ScrollBar.ButtonColor = System.Drawing.SystemColors.Control; chartArea1.AxisY.ScrollBar.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); chartArea1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(165)))), ((int)(((byte)(191)))), ((int)(((byte)(228))))); chartArea1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom; chartArea1.BackSecondaryColor = System.Drawing.Color.White; chartArea1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); chartArea1.CursorX.IsUserEnabled = true; chartArea1.CursorX.IsUserSelectionEnabled = true; chartArea1.CursorX.SelectionColor = System.Drawing.SystemColors.Highlight; chartArea1.CursorY.IsUserEnabled = true; chartArea1.CursorY.IsUserSelectionEnabled = true; chartArea1.CursorY.SelectionColor = System.Drawing.SystemColors.Highlight; chartArea1.InnerPlotPosition.Auto = false; chartArea1.InnerPlotPosition.Height = 75F; chartArea1.InnerPlotPosition.Width = 86.32634F; chartArea1.InnerPlotPosition.X = 11.21863F; chartArea1.InnerPlotPosition.Y = 3.96004F; chartArea1.Name = "Default"; chartArea1.Position.Auto = false;// true; chartArea1.Position.Height = 100;// chartArea1.Position.Width = 100;// 81.46518F; chartArea1.Position.X = 0;// 9.267409F; chartArea1.Position.Y = 0;// 10F; chartArea1.ShadowColor = System.Drawing.Color.Transparent; chart1.ChartAreas.Add(chartArea1); legend1.BackColor = System.Drawing.Color.Transparent; legend1.Enabled = true; legend1.Font = new System.Drawing.Font("Trebuchet MS", 8.25F, System.Drawing.FontStyle.Bold); legend1.IsTextAutoFit = false; legend1.Name = "Default"; chart1.Legends.Add(legend1); //chart1.Location = new System.Drawing.Point(16, 48); chart1.Name = "chart1"; //series1 series1.BorderColor = System.Drawing.Color.DarkBlue; series1.BorderWidth = 3; series1.ChartArea = chartArea1.Name; series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; series1.Color = System.Drawing.Color.Blue;// System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(65)))), ((int)(((byte)(140)))), ((int)(((byte)(240))))); series1.Legend = legend1.Name; series1.Name = "正向"; //series1.MarkerSize = 6; //series1.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; try { series1.LegendText = Application.Current.FindResource("strForward") as string; } catch { } series1.ShadowColor = System.Drawing.Color.Black; series1.ShadowOffset = 2; //series1.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32; //series1.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double; chart1.Series.Add(series1); //series2 series2.BorderColor = System.Drawing.Color.DarkRed; series2.BorderWidth = 3; series2.ChartArea = chartArea1.Name; series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; series2.Color = System.Drawing.Color.Red; //System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(65)))), ((int)(((byte)(140)))), ((int)(((byte)(240))))); series2.Legend = legend1.Name; //series2.MarkerSize = 6; //series2.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; series2.Name = "反向"; try { series2.LegendText = Application.Current.FindResource("strBackward") as string; } catch { } series2.ShadowColor = System.Drawing.Color.Black; series2.ShadowOffset = 2; //series2.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32; //series2.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double; chart1.Series.Add(series2); //series3 series3.Name = "样品"; try { series3.LegendText = Application.Current.FindResource("strSample") as string; } catch { } series3.ChartArea = chartArea1.Name; series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; series3.Color = System.Drawing.Color.Green; series3.BorderColor = System.Drawing.Color.DarkGreen; series3.BorderWidth = 3; series3.MarkerSize = 6; series3.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; series3.MarkerBorderColor = System.Drawing.Color.DarkGreen; series3.MarkerColor = System.Drawing.Color.Green; series3.ShadowColor = System.Drawing.Color.Black; series3.ShadowOffset = 2; //series3.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32; //series3.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double; series3.Legend = legend1.Name; chart1.Series.Add(series3); } void DataBindAll() { string[] series = new string[2] { "正向", "反向" }; if (gageInfo.PosOfGrid == 0) return; int grid_len = gageInfo.PosLen / gageInfo.PosOfGrid; int max = Misc.MyBase.NULL_VALUE, min = Misc.MyBase.NULL_VALUE; for (int j = 0; j < 2; j++) { chart1.Series[j].Points.Clear(); if (SeriesInfos[j].Datas.Count()==0) continue; for (int i = 0; i < grid_len && i< SeriesInfos[j].Datas.Count(); i++) { int data = SeriesInfos[j].Datas[i]; int pos = i * gageInfo.PosOfGrid; chart1.Series[j].Points.AddXY(pos, data); if (!Misc.MyBase.ISVALIDATA(data)) { chart1.Series[j].Points[i].IsEmpty = true; } else { if (!Misc.MyBase.ISVALIDATA(max)) { max = data; min = data; } if (max < data) max = data; if (min > data) min = data; } } } //set max min //set max min if (max != min) { chart1.ChartAreas[0].AxisY.Maximum = max + (max - min) / 10; chart1.ChartAreas[0].AxisY.Minimum = min - (max - min) / 10; if (chart1.ChartAreas[0].AxisY.Minimum < 0) chart1.ChartAreas[0].AxisY.Minimum = 0; if (chart1.ChartAreas[0].AxisY.Maximum > gageService.DynArea.ADMax) chart1.ChartAreas[0].AxisY.Maximum = gageService.DynArea.ADMax; } chart1.ChartAreas[0].AxisX.Minimum = 0; chart1.ChartAreas[0].AxisX.Maximum = gageInfo.PosLen; } void update() { FObjBase.PollModule.Current.Poll_JustOnce( new PollModule.PollHandler(delegate () { System.Windows.Forms.DataVisualization.Charting.StripLinesCollection stripLines = chart1.ChartAreas[0].AxisX.StripLines; stripLines.Clear(); mBorderSearchService_update(); mGetSampleService_update(); }), this, MARKNO_UPDATE); } void mBorderSearchService_update() { System.Windows.Forms.DataVisualization.Charting.StripLinesCollection stripLines = chart1.ChartAreas[0].AxisX.StripLines; if (borderSearch.Enable) { System.Windows.Forms.DataVisualization.Charting.StripLine stripline = new System.Windows.Forms.DataVisualization.Charting.StripLine(); stripline.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(191)))), ((int)(((byte)(191)))), ((int)(((byte)(191))))); stripline.Interval = 0; stripline.IntervalOffset = borderSearch.Valid.Begin; stripline.StripWidth = borderSearch.Valid.Width; stripLines.Add(stripline); } } void mGetSampleService_update() { System.Windows.Forms.DataVisualization.Charting.StripLinesCollection stripLines = chart1.ChartAreas[0].AxisX.StripLines; //stripLines.Clear(); System.Windows.Forms.DataVisualization.Charting.Series series = chart1.Series["样品"]; series.Points.Clear(); if (!getSample.Enable) return; for (int i = 0; i < getSample.Samples.Count(); i++) { var sample = getSample.Samples[i]; if (sample.Enable) { int data = sample.OrgAD; int pos = sample.Position; series.Points.AddXY(pos, data); } } for (int i = 0; i < getSample.Features.Count(); i++) { var feature = getSample.Features[i]; if (feature.Enable) { System.Windows.Forms.DataVisualization.Charting.StripLine stripline = new System.Windows.Forms.DataVisualization.Charting.StripLine(); if (i == 0) { try { stripline.Text = Application.Current.FindResource("strForwFeature") as string; } catch { stripline.Text = "正向特征"; } } else { try { stripline.Text = Application.Current.FindResource("strBackwFeature") as string; } catch { stripline.Text = "反向特征"; } } //stripline.TextAlignment = System.Drawing.StringAlignment.Near; //stripline.TextLineAlignment = System.Drawing.StringAlignment.Near; stripline.TextOrientation = System.Windows.Forms.DataVisualization.Charting.TextOrientation.Stacked; stripline.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(191)))), ((int)(((byte)(191)))), ((int)(((byte)(191))))); stripline.Interval = 0; stripline.IntervalOffset = feature.StartPos; stripline.StripWidth = feature.EndPos - feature.StartPos + 1; stripLines.Add(stripline); } } } void Page_Unloaded(object sender, RoutedEventArgs e) { } void button_start_Click(object sender, RoutedEventArgs e) { if (gageInfo.IsRunning) gageInfo.Stop(); else { if (!WdPassword.Authorize("GageInfo")) return; gageInfo.Start(); } } } }