diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyse.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyse.xaml index 371aaad2e8b307c9f75a84d829b6b3e499949cc2..655d2941ffd096eccfba1430de9e5bb33423e39b 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyse.xaml +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyse.xaml @@ -12,8 +12,7 @@ xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" xmlns:lvc1="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Feng.Wpf" mc:Ignorable="d" - d:DesignWidth="1024" - Background="#E6E6E6" > + d:DesignWidth="1024"> <Page.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> @@ -27,16 +26,25 @@ </ResourceDictionary> </Page.Resources> - <Grid d:DataContext="{StaticResource viewModel}" > + <Grid d:DataContext="{StaticResource viewModel}" Background="{StaticResource Brushes.Card.Background}"> <Grid.RowDefinitions> <RowDefinition Height="auto" /> <RowDefinition /> </Grid.RowDefinitions> - <StackPanel Orientation="Horizontal" Background="{StaticResource Background_Title}" > - <Button Style="{StaticResource ButtonStyle_back2}" Command="BrowseBack"/> + <StackPanel Orientation="Horizontal" Background="{StaticResource Brushes.TitleBar.Background}" > + <Button Style="{StaticResource Styles.TitleBar.BackButton2}" Command="BrowseBack"/> <StackPanel Orientation="Horizontal" VerticalAlignment="Center"> - <TextBlock Style="{StaticResource TextBlockStyle_Title}" Text="对ä½åˆ†æž"/> - <TextBlock Text="åŠ çƒä¸ŽåŽšåº¦" FontSize="30" VerticalAlignment="Bottom" Margin="5,0" Foreground="LightGray"/> + <TextBlock Style="{StaticResource Styles.TitleBar.Text}" Text="对ä½åˆ†æž"/> + <StackPanel> + <StackPanel Orientation="Horizontal" > + <TextBlock Style="{StaticResource Styles.TitleBar.Text.Sub}" Text="有效数æ®" /> + <ToggleButton Style="{StaticResource Styles.ToggleButton.Check}" IsChecked="{Binding IsMoveByTakeEffect}" Width="30" Height="auto" Foreground="White" /> + </StackPanel> + <StackPanel Orientation="Horizontal" > + <TextBlock Style="{StaticResource Styles.TitleBar.Text.Sub}" Text="åŠ çƒæ”¹å˜" /> + <ToggleButton Style="{StaticResource Styles.ToggleButton.Check}" IsChecked="{Binding IsMoveByDiffCTime}" Width="30" Height="auto" Foreground="White" /> + </StackPanel> + </StackPanel> </StackPanel> </StackPanel> @@ -45,7 +53,7 @@ <StackPanel> <local:UcThickHeat x:Name="ucThickHeat0"/> <local:UcThickHeat x:Name="ucThickHeat1"/> - <Border Style="{StaticResource Card.Border}" > + <Border Style="{StaticResource Styles.Card.Border}" > <StackPanel> <Grid Margin="48,0,0,-20" Panel.ZIndex="10"> @@ -83,7 +91,7 @@ Visibility="{Binding IsError,Converter={StaticResource visbilityconv}}"/> </Grid> - <TextBlock Grid.Column="1" Style="{StaticResource Card.Title}" Text="åå·®" /> + <TextBlock Grid.Column="1" Style="{StaticResource Styles.Card.Title}" Text="åå·®" /> </Grid> <lvc:CartesianChart Height="300" Margin="5,2,2,2" DisableAnimations="True" Hoverable="False" DataTooltip="{x:Null}" > @@ -154,71 +162,71 @@ <WrapPanel Orientation="Horizontal"> <StackPanel Margin="{StaticResource ControlMargin}" > - <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="åŠ çƒæ•ˆæžœ" /> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="åŠ çƒæ•ˆæžœ" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource Text.FieldContentInput}" + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding HeatEffectCurve,Converter={StaticResource heconv}}"/> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}" > - <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="图åå‘" /> - <ToggleButton Style="{StaticResource ToggleButtonStyle1}" HorizontalAlignment="Left" IsChecked="{Binding IsReversed}"/> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="图åå‘" /> + <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" HorizontalAlignment="Left" IsChecked="{Binding IsReversed}"/> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}" x:Name="stackpanel_isUsedBoltMap"> - <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="使用分区表" /> - <ToggleButton Style="{StaticResource ToggleButtonStyle1}" HorizontalAlignment="Left" IsChecked="{Binding IsUsedMap}"/> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="使用分区表" /> + <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" HorizontalAlignment="Left" IsChecked="{Binding IsUsedMap}"/> </StackPanel> <WrapPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal"> <StackPanel Margin="{StaticResource ControlMargin}" > - <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="æ¯”ä¾‹å› å" /> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="æ¯”ä¾‹å› å" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource Text.FieldContentInput}" Text="{Binding Kp, StringFormat={}{0:F1}}"/> - <TextBlock Style="{StaticResource Text.FieldContentMm2}" Text="输出/厚度" /> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Kp, StringFormat={}{0:F1}}"/> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="输出/厚度" /> </StackPanel> </StackPanel> - <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding KpCollapseCmd}" > + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding KpCollapseCmd}" > <iconPacks:PackIconMaterial Kind="ArrowCollapseVertical" /> </Button> - <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding KpExpandCmd}" > + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding KpExpandCmd}" > <iconPacks:PackIconMaterial Kind="ArrowExpandVertical" /> </Button> </StackPanel> <StackPanel Orientation="Horizontal"> - <StackPanel Margin="5"> - <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="å¤ä½åŒºå·" /> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="å¤ä½åŒºå·" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource Text.FieldContentInput}" Text="{Binding OrgBoltNo}" /> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding OrgBoltNo}" /> </StackPanel> </StackPanel> - <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding LeftCmd}" > + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding LeftCmd}" > <iconPacks:PackIconMaterial Kind="ArrowLeft" /> </Button> - <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding RightCmd}" > + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding RightCmd}" > <iconPacks:PackIconMaterial Kind="ArrowRight" /> </Button> </StackPanel> <StackPanel Orientation="Horizontal" Visibility="{Binding BType, Converter={StaticResource e2visconv_collapsed}, ConverterParameter={x:Static blowing:BlowingType.Fix}}"> - <StackPanel Margin="5"> - <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="旋转角度" /> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="旋转角度" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource Text.FieldContentInput}" Text="{Binding RAngle}" /> - <TextBlock Style="{StaticResource Text.FieldContentMm}" Text="°" VerticalAlignment="Top" /> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding RAngle}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="°" VerticalAlignment="Top" /> </StackPanel> </StackPanel> - <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding CollapseCmd}" > + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding CollapseCmd}" > <iconPacks:PackIconMaterial Kind="ArrowCollapseHorizontal" /> </Button> - <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding ExpandCmd}" > + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding ExpandCmd}" > <iconPacks:PackIconMaterial Kind="ArrowExpandHorizontal" /> </Button> </StackPanel> <Button - Style="{StaticResource ButtonStyle_icon}" Margin="30,5" + Style="{StaticResource Styles.Button.Icon}" Margin="30,5" Command="{Binding AutoCmd}" > <StackPanel> <iconPacks:PackIconMaterial Kind="AutoFix" /> @@ -237,20 +245,20 @@ </StackPanel> </Border> - <Border Style="{StaticResource Card.Border}" Visibility="{Binding IsUsedMap,Converter={StaticResource visbilityconv}}"> + <Border Style="{StaticResource Styles.Card.Border}" Visibility="{Binding IsUsedMap,Converter={StaticResource visbilityconv}}"> <StackPanel> - <TextBlock Grid.Column="1" Style="{StaticResource Card.Title}" Text="分区表"/> + <TextBlock Grid.Column="1" Style="{StaticResource Styles.Card.Title}" Text="分区表"/> <StackPanel> <StackPanel Orientation="Horizontal"> - <Button Style="{StaticResource ButtonStyle_icon}" Margin="{StaticResource ControlMargin}" + <Button Style="{StaticResource Styles.Button.Icon}" Margin="{StaticResource ControlMargin}" Command="{Binding TestMapCmd}" > <StackPanel> <iconPacks:PackIconMaterial Kind="PlayCircle" /> <TextBlock Text="测试" HorizontalAlignment="Center" /> </StackPanel> </Button> - <Button Style="{StaticResource ButtonStyle_icon}" Margin="{StaticResource ControlMargin}" + <Button Style="{StaticResource Styles.Button.Icon}" Margin="{StaticResource ControlMargin}" Command="{Binding DelMapCmd}" > <StackPanel> <iconPacks:PackIconMaterial Kind="DeleteCircle" /> diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyseVm.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyseVm.cs index 73d96b3a4bbca9e6311eac394e29a5911d803e11..bb97b8bf14934829d3e70f868795e40c17be1929 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyseVm.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyseVm.cs @@ -47,7 +47,8 @@ namespace FLY.FeedbackRenZiJia.UI.Client /// </summary> public double Kp { get; set; } = 3; - + public bool IsMoveByTakeEffect { get; set; } = true; + public bool IsMoveByDiffCTime { get; set; } = true; /// <summary> /// å¤ä½åŒºå· @@ -233,6 +234,8 @@ namespace FLY.FeedbackRenZiJia.UI.Client ucThickHeatVms[i] = new UcThickHeatVm(); ucThickHeatVms[i].Init($"记录{i+1}", bulkDbService, 0-i, Kp); Misc.BindingOperations.SetBinding(this, nameof(Kp), ucThickHeatVms[i], nameof(UcThickHeatVm.Kp)); + Misc.BindingOperations.SetBinding(this, nameof(IsMoveByTakeEffect), ucThickHeatVms[i], nameof(UcThickHeatVm.IsMoveByTakeEffect)); + Misc.BindingOperations.SetBinding(this, nameof(IsMoveByDiffCTime), ucThickHeatVms[i], nameof(UcThickHeatVm.IsMoveByDiffCTime)); ucThickHeatVms[i].FrameUpdated += PgHeatAnalyseVm_FrameUpdated; } @@ -276,18 +279,19 @@ namespace FLY.FeedbackRenZiJia.UI.Client return false; if (feedback.NBolts != ucThickHeatVms[0].frame.Thicks.Count()) return false; - - if (ucThickHeatVms[0].frame.FilmLength != ucThickHeatVms[1].frame.FilmLength) - return false;//膜è·ç¦»ä¸åŒä¸èƒ½æ¯”较 - if (BType != BlowingType.Fix) { - - if (ucThickHeatVms[0].frame.RAngle != ucThickHeatVms[1].frame.RAngle) - return false;//扫æ架,追边360, 旋转角度ä¸èƒ½æ”¹å˜ - } + //if (Math.Abs(ucThickHeatVms[0].frame.FilmLength - ucThickHeatVms[1].frame.FilmLength) > 1) + //{ + // //å差大于1m + // return false;//膜è·ç¦»ä¸åŒä¸èƒ½æ¯”较 + //} + //if (Math.Abs(ucThickHeatVms[0].frame.RAngle - ucThickHeatVms[1].frame.RAngle) > 20) + //{ + // //å差大于20° + // return false;//膜è·ç¦»ä¸åŒä¸èƒ½æ¯”较 + //} - return true; } class CallDiffResult diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeat.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeat.xaml index 914c095c02b2d622e741a090f93fef5893b96b97..8999c687e1d685ce05169a7278b05f6823063a11 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeat.xaml +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeat.xaml @@ -21,7 +21,7 @@ </ResourceDictionary> </UserControl.Resources> <Grid d:DataContext="{StaticResource viewModel}"> - <Border Style="{StaticResource Card.Border}" > + <Border Style="{StaticResource Styles.Card.Border}" > <StackPanel> <Grid> <Grid.RowDefinitions> @@ -103,7 +103,7 @@ <StackPanel Orientation="Horizontal" Margin="5,0"> <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="ID:" /> - <TextBox Style="{StaticResource Text.FieldContentInput2}" Text="{Binding Number}"/> + <TextBox Style="{StaticResource Text.FieldContentInput2}" Text="{Binding Number}" MinWidth="100"/> </StackPanel> <StackPanel Orientation="Horizontal" Visibility="{Binding IsVaild,Converter={StaticResource visbilityconv}}"> <StackPanel Orientation="Horizontal" Margin="{StaticResource Badges.Margin}" VerticalAlignment="Bottom" > @@ -169,7 +169,7 @@ </StackPanel> </StackPanel> - <TextBlock Style="{StaticResource Card.Title}" Text="{Binding Title}"/> + <TextBlock Style="{StaticResource Styles.Card.Title}" Text="{Binding Title}"/> </StackPanel> <Grid Margin="10,0" diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeatVm.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeatVm.cs index 4ba3eb9a9c3f6de9ed536816209faff5a433250f..9f6743c6fff6ed87d6657ee89e257c8dd686b2be 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeatVm.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeatVm.cs @@ -18,7 +18,7 @@ using IBulkDbService = FLY.FeedbackRenZiJia.IService.IBulkDbService; namespace FLY.FeedbackRenZiJia.UI.Client { - public class UcThickHeatVm: INotifyPropertyChanged + public class UcThickHeatVm : INotifyPropertyChanged { const int MARKNO_UPDATEFRAME = 1; @@ -53,9 +53,17 @@ namespace FLY.FeedbackRenZiJia.UI.Client public long LastId { get; set; } - public long Number { get; set; } + public long Number { get; set; } + + /// <summary> + /// 急速移动,功能: 移动到下一个数æ®æœ‰æ•ˆ + /// </summary> + public bool IsMoveByTakeEffect { get; set; } = true; + /// <summary> + /// 急速移动,功能: ç§»åŠ¨åˆ°ä¸‹ä¸€ä¸ªåŠ çƒä¸åŒ + /// </summary> + public bool IsMoveByDiffCTime { get; set; } - /// <summary> /// 有效 /// </summary> @@ -122,8 +130,9 @@ namespace FLY.FeedbackRenZiJia.UI.Client public Lc_ThickHeat frame; IBulkDbService bulkDbService; - - public UcThickHeatVm() + bool IsSkipNumberChanged; + public event Action FrameUpdated; + public UcThickHeatVm() { YFormatter = (y) => { @@ -148,7 +157,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client }) .Y((value) => { - return value * Kp+50; + return value * Kp + 50; }); PreCmd = new RelayCommand(Pre); @@ -160,9 +169,9 @@ namespace FLY.FeedbackRenZiJia.UI.Client - public void Init(string title, + public void Init(string title, IBulkDbService bulkDbService, - int number, double kp) + int number, double kp) { this.bulkDbService = bulkDbService; Title = title; @@ -170,7 +179,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client Misc.BindingOperations.SetBinding(bulkDbService, nameof(bulkDbService.LastId), this, nameof(LastId)); Number = number; UpdateFrame(); - + this.PropertyChanged += UcThickHeatVm_PropertyChanged; @@ -179,139 +188,92 @@ namespace FLY.FeedbackRenZiJia.UI.Client private void UcThickHeatVm_PropertyChanged(object sender, PropertyChangedEventArgs e) { - if (e.PropertyName == nameof(Number)) { + if (e.PropertyName == nameof(Number)) + { if (IsSkipNumberChanged) - return; + return; UpdateFrame(); } } - public event Action FrameUpdated; - public void UpdateFrame() { + + public void UpdateFrame() + { PollModule.Current.Poll_JustOnce(() => { - _updateFrame(); + bulkDbService.GetFrame(Number, my_GetFrameReponse, null); }, this, MARKNO_UPDATEFRAME); - + } - void _updateFrame() + void my_GetFrameReponse(object asyncContext, object retData) { - if (IsGetStableFrame) - { - IsGetStableFrame = false; - bulkDbService.GetStableFrame(Number, IsPre,(asyncContext, retData) => - { - var reponce = retData as GetStableFrameReponse; - - if (reponce.thickHeat != null) - { - frame = reponce.thickHeat; - Id = frame.ID; - Time = frame.Time; - EndTime = frame.EndTime; - IsBackw = frame.IsBackw; - RPeriod = frame.RPeriod; - OrgBoltNo = frame.OrgBoltNo; - RAngle = frame.RAngle; - FilmLength = frame.FilmLength; - Average = frame.Thicks.AverageNoNull(); - Sigma2Percent = frame.Thicks.Sigma() / Average * 2; - - Heats.Clear(); - Heats.AddRange(frame.Heats); - XMax = frame.Heats.Count() + 1; - - double[] thickPercents = GetThickPercents(); - ThickPercents.Clear(); - ThickPercents.AddRange(thickPercents); - - IsStable = frame.IsStable; - HTime = frame.HTime; - - - IsVaild = true; - IsSkipNumberChanged = true; - Number = Id; - IsSkipNumberChanged = false; - } - else - { - IsVaild = false; - } - - FrameUpdated?.Invoke(); - }, null); - } + var reponse = retData as GetFrameReponse; + if (reponse.thickHeat != null) + SetFrame(reponse.thickHeat); else - { - bulkDbService.GetFrame(Number, (asyncContext, retData) => - { - var reponce = retData as GetFrameReponse; - - if (reponce.thickHeat != null) - { - frame = reponce.thickHeat; - Id = frame.ID; - Time = frame.Time; - EndTime = frame.EndTime; - IsBackw = frame.IsBackw; - RPeriod = frame.RPeriod; - OrgBoltNo = frame.OrgBoltNo; - RAngle = frame.RAngle; - FilmLength = frame.FilmLength; - Average = frame.Thicks.AverageNoNull(); - Sigma2Percent = frame.Thicks.Sigma() / Average * 2; - - Heats.Clear(); - Heats.AddRange(frame.Heats); - XMax = frame.Heats.Count() + 1; - - double[] thickPercents = GetThickPercents(); - ThickPercents.Clear(); - ThickPercents.AddRange(thickPercents); - - IsStable = frame.IsStable; - HTime = frame.HTime; - - - - IsVaild = true; - } - else - { - IsVaild = false; - } - - FrameUpdated?.Invoke(); - }, null); - } + IsVaild = false; + + FrameUpdated?.Invoke(); + } + void SetFrame(Lc_ThickHeat _frame) + { + frame = _frame; + Id = frame.ID; + Time = frame.Time; + EndTime = frame.EndTime; + IsBackw = frame.IsBackw; + RPeriod = frame.RPeriod; + OrgBoltNo = frame.OrgBoltNo; + RAngle = frame.RAngle; + FilmLength = frame.FilmLength; + Average = frame.Thicks.AverageNoNull(); + Sigma2Percent = frame.Thicks.Sigma() / Average * 2; + + Heats.Clear(); + Heats.AddRange(frame.Heats); + XMax = frame.Heats.Count() + 1; + + double[] thickPercents = GetThickPercents(); + ThickPercents.Clear(); + ThickPercents.AddRange(thickPercents); + + IsStable = frame.IsStable; + HTime = frame.HTime; + + + IsVaild = true; + IsSkipNumberChanged = true; + Number = Id; + IsSkipNumberChanged = false; } + private void Next() { - if(Number < bulkDbService.LastId) + if (Number < bulkDbService.LastId) Number++; } private void Pre() { Number--; } - bool IsGetStableFrame; - bool IsPre; - bool IsSkipNumberChanged; + + private void NextStable() { - IsGetStableFrame = true; - IsPre = false; - Number++; + PollModule.Current.Poll_JustOnce(() => + { + bulkDbService.GetFrameAdv(Number, false, IsMoveByTakeEffect, IsMoveByDiffCTime, my_GetFrameReponse, null); + }, this, MARKNO_UPDATEFRAME); } - private void Newest() + private void Newest() { Number = bulkDbService.LastId; } private void PreStable() { - IsGetStableFrame = true; - IsPre = true; - Number--; + PollModule.Current.Poll_JustOnce(() => + { + bulkDbService.GetFrameAdv(Number, true, IsMoveByTakeEffect, IsMoveByDiffCTime, my_GetFrameReponse, null); + }, this, MARKNO_UPDATEFRAME); } /// <summary> /// 以指定å¤ä½åŒºå·ï¼Œ 分区表 导出厚度% @@ -319,7 +281,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client /// <param name="orgBoltNo"></param> /// <param name="boltmap"></param> /// <returns></returns> - public double[] GetThickPercents(int orgBoltNo, double rAngle, IEnumerable<BoltMapCell> boltmap, bool isReversed) + public double[] GetThickPercents(int orgBoltNo, double rAngle, IEnumerable<BoltMapCell> boltmap, bool isReversed) { if (frame == null) return null; @@ -328,7 +290,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client { //原数æ®æœ‰åˆ†åŒºè¡¨, 先还原ï¼ï¼ Dictionary<int, int> map = new Dictionary<int, int>(); - + IEnumerable<BoltMapCell> maps = frame.Boltmap; for (int i = 0; i < maps.Count(); i++) map.Add(maps.ElementAt(i).NewNo - 1, maps.ElementAt(i).OldNo - 1); @@ -349,7 +311,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client //平移 - if(orgBoltNo != frame.OrgBoltNo) + if (orgBoltNo != frame.OrgBoltNo) { thks = FLY.FeedbackRenZiJia.Common.MyMath.Move(thks, orgBoltNo - frame.OrgBoltNo); } @@ -362,7 +324,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client IEnumerable<BoltMapCell> maps = boltmap; for (int i = 0; i < maps.Count(); i++) - map.Add(maps.ElementAt(i).OldNo - 1,maps.ElementAt(i).NewNo - 1); + map.Add(maps.ElementAt(i).OldNo - 1, maps.ElementAt(i).NewNo - 1); thks = Misc.MyMath.Map(thks, map); } @@ -373,17 +335,20 @@ namespace FLY.FeedbackRenZiJia.UI.Client thks = FLY.FeedbackRenZiJia.Common.MyMath.ZoomOut(thks, bpc); double[] thickpercents = new double[thks.Count()]; double avg = thks.AverageNoNull(); - if (!double.IsNaN(avg)) { - for (int i = 0; i < thks.Count(); i++) { + if (!double.IsNaN(avg)) + { + for (int i = 0; i < thks.Count(); i++) + { thickpercents[i] = (thks[i] - avg) / avg * 100; } } return thickpercents; } - public double[] GetThickPercents() { + public double[] GetThickPercents() + { return GetThickPercents(frame.OrgBoltNo, frame.RAngle, frame.Boltmap, false); } - public int[] GetHeats() + public int[] GetHeats() { return frame.Heats.ToArray(); } diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml index 38c49f2a9b03fefbdd9aff398f2dd7b04e35aaec..7ef1a4c280a15a4d4f450864dacd1c17eb5bf0d4 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml @@ -55,21 +55,22 @@ <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="控制线" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding CtrlLine}"/> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding CtrlLine,StringFormat={}{0:0.#}}"/> <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="%" /> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}" > <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Kp" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Kp, StringFormat={}{0:F1}}"/> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Kp, StringFormat={}{0:0.#}}"/> <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="åŠ çƒ/厚度" /> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}" > <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="平滑阀值" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding ThresholdHeatSigma, StringFormat={}{0:F1}}" /> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding ThresholdHeatSigma, StringFormat={}{0:0.#}}" /> + </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding HeatCell}"> @@ -78,6 +79,13 @@ <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding MaxHeatSigma, StringFormat={}{0:F1}}" HorizontalAlignment="Left"/> </StackPanel> </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="å差图Y轴比例" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding OffsetGraphYRangePercent, StringFormat={}{0:0.#}}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="å€" /> + </StackPanel> + </StackPanel> </StackPanel > </StackPanel> @@ -89,7 +97,7 @@ <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="相关性阀值" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding ThresholdR,StringFormat={}{0:F2}}"/> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding ThresholdR,StringFormat={}{0:0.##}}"/> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}"> @@ -103,13 +111,8 @@ <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="查找范围" /> <StackPanel Orientation="Horizontal"> <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="±" /> - <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding SearchAngleRange}"/> - <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" VerticalAlignment="Top" Text="°" /> - <TextBlock Style="{StaticResource Text.FieldContentMmInterval}" VerticalAlignment="Top" Text="|" /> - <StackPanel VerticalAlignment="Bottom"> - <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="最å°:±10°" /> - <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="最大:±180°" /> - </StackPanel> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding SearchRange}"/> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="区" /> </StackPanel> </StackPanel> <StackPanel Orientation="Horizontal"> @@ -118,6 +121,18 @@ <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" HorizontalAlignment="Left" IsChecked="{Binding IsAutoONo}"/> </StackPanel> </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="最大Kp" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding MaxKp, StringFormat={}{0:0.#}}"/> + </StackPanel> + </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="最å°Kp" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding MinKp, StringFormat={}{0:0.#}}"/> + </StackPanel> + </StackPanel> </StackPanel> <StackPanel Visibility="{Binding MaxR,Converter={StaticResource maxR2VisConv}}" DataContext="{Binding HeatBuf}"> <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Margin="{StaticResource ControlMargin}" FontSize="{StaticResource FontSize.FieldContent.Small}" Text="{Binding MaxR_Time, StringFormat={}{0:MM-dd HH:mm}}" Padding="2" Background="#FFC107"/> @@ -128,38 +143,38 @@ <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="ID0" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxR_Id0}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding MaxR_Id0}" /> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="ID1" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxR_Id1}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding MaxR_Id1}" /> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="相关性" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxR,StringFormat={}{0:F2}}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding MaxR,StringFormat={}{0:F2}}" /> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="æžå·®" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxMin}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding MaxMin}" /> <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="%" /> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="最佳å¤ä½å·" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding BestOrgBoltNo}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding BestOrgBoltNo}" /> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="最佳Kp" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding BestKp,StringFormat={}{0:F1}}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding BestKp,StringFormat={}{0:F1}}" /> <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="åŠ çƒ/厚度" /> </StackPanel> </StackPanel> @@ -169,35 +184,22 @@ </StackPanel> </StackPanel> - - <StackPanel Orientation="Horizontal" DataContext="{Binding HeatCell}" Visibility="{Binding ElementName=grid_viewModel,Path=DataContext.IsAutoONo,Converter={StaticResource visbilityconv},ConverterParameter=Collapsed}"> - <StackPanel Orientation="Horizontal" Visibility="{Binding AutoONoId0,Converter={StaticResource id2VisConv}}"> - <StackPanel Orientation="Horizontal" VerticalAlignment="Center" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}"> - <Button Content="查看" Style="{StaticResource Styles.Button.Square2}" Command="{Binding AutoONoImageCmd}"/> - </StackPanel> - <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="对ä½å‰ID" /> - <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding AutoONoId0}" /> - </StackPanel> - </StackPanel> - <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="对ä½åŽID" /> - <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding AutoONoId1}" /> - </StackPanel> - </StackPanel> - </StackPanel> - <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="对ä½ç»“æžœ" /> - <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent2}" Text="{Binding AutoONoMsg}" /> - </StackPanel> - </StackPanel> - </StackPanel> </StackPanel > </Border> + <Border Style="{StaticResource Styles.Card.Border}" > + <StackPanel> + <TextBlock Grid.Column="1" Style="{StaticResource Styles.Card.Title}" Text="分级控制"/> + <StackPanel> + <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding LvCtrlLines}" MinWidth="204" MinHeight="100" TextBlock.FontSize="18" TextBlock.FontWeight="Normal"> + <DataGrid.Columns> + <DataGridTextColumn Header="控制线%" Binding="{Binding CtrlLine}" Width="150"/> + <DataGridTextColumn Header="厚度混åˆæ•°" Binding="{Binding Mix}" Width="150"/> + </DataGrid.Columns> + </DataGrid> + </StackPanel> + </StackPanel> + </Border> <Border Style="{StaticResource Styles.Card.Border}"> <StackPanel > @@ -230,7 +232,7 @@ <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="电æµ" /> <TextBlock> <TextBlock.Style> - <Style TargetType="TextBlock" BasedOn="{StaticResource Text.FieldContent}"> + <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent}"> <Setter Property="Text" Value="Off"/> <Style.Triggers> <DataTrigger Binding="{Binding HasElectricity}" Value="True"> @@ -246,7 +248,7 @@ <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="风机" /> <TextBlock> <TextBlock.Style> - <Style TargetType="TextBlock" BasedOn="{StaticResource Text.FieldContent}"> + <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent}"> <Setter Property="Text" Value="Off"/> <Style.Triggers> <DataTrigger Binding="{Binding HasFan}" Value="True"> @@ -263,7 +265,7 @@ <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding HeatBuf}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="测é‡æ—¶é—´" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding CurrTime,StringFormat={}{0:HH:mm:ss}}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding CurrTime,StringFormat={}{0:HH:mm:ss}}" /> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}" > @@ -276,14 +278,14 @@ <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding HeatBuf}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="总起效时间" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding Delay, Converter={StaticResource ts2secconv}}"/> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Delay, Converter={StaticResource ts2secconv}}"/> <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="秒" /> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding Feedback}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="åŠ çƒä¿®æ”¹æ—¶é—´" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding LastChangedTime,StringFormat={}{0:HH:mm:ss}}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding LastChangedTime,StringFormat={}{0:HH:mm:ss}}" /> </StackPanel> </StackPanel> </StackPanel> @@ -297,10 +299,16 @@ </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding HeatBuf}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="2σ当å‰å€¼" /> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding Curr2Sigma, StringFormat={}{0:F1}}"/> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Curr2Sigma, StringFormat={}{0:F1}}"/> </StackPanel> - + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="厚度横å‘平滑直径" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding ThickSmoothRange}"/> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="分区" /> + </StackPanel> + </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="稳定范围" /> <StackPanel Orientation="Horizontal"> @@ -321,13 +329,13 @@ <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="稳定性" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding CurrR, StringFormat={}{0:F2}}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding CurrR, StringFormat={}{0:F2}}" /> </StackPanel> </StackPanel> <StackPanel Margin="{StaticResource ControlMargin}"> <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="稳定状æ€" /> <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding Stability, Converter={StaticResource stableconv}}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Stability, Converter={StaticResource stableconv}}" /> </StackPanel> </StackPanel> </StackPanel> diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml.cs index 811a3d086b9faa6957ad6fa0e6ec1965eab045a2..30e602de1c584fbef16570f406a86ea344ce6b73 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml.cs @@ -18,6 +18,7 @@ using FLY.FeedbackRenZiJia.IService; using System.ComponentModel; using Unity; using GalaSoft.MvvmLight.Command; +using System.Collections.ObjectModel; namespace FLY.FeedbackRenZiJia.UI.Client { @@ -62,13 +63,22 @@ namespace FLY.FeedbackRenZiJia.UI.Client public bool HasCheck { get; set; } public int Delay { get; set; } public int ThresholdSigmaMax { get; set; } - public int SearchAngleRange { get; set; } + public int SearchRange { get; set; } public int StableRange { get; set; } public int[] HeatEffectCurve { get; set; } public bool IsForbidUpDown { get; set; } - public int CtrlLine { get; set; } + public double CtrlLine { get; set; } public double Kp { get; set; } + /// <summary> + /// 自动计算时,Kp最大值 + /// </summary> + public double MaxKp { get; set; } = 5; + + /// <summary> + /// 自动计算时,Kp最大值 + /// </summary> + public double MinKp { get; set; } = 1; /// <summary> /// è‡ªåŠ¨å¯¹ä½ @@ -89,6 +99,18 @@ namespace FLY.FeedbackRenZiJia.UI.Client /// 最大功率 /// </summary> public int MaxHeat { get; set; } + + public double OffsetGraphYRangePercent { get; set; } + + /// <summary> + /// 分级控制 + /// </summary> + public ObservableCollection<LvCtrlLine> LvCtrlLines { get; } = new ObservableCollection<LvCtrlLine>(); + + /// <summary> + /// 对厚度数æ®æ¨ªå‘平滑 å•ä½åŠ çƒæ£’数。 特别的当Smooth = ChannelCnt/2 就是膜泡的å心度 + /// </summary> + public int ThickSmoothRange { get; set; } #endregion #region Command @@ -96,7 +118,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client public RelayCommand ApplyCmd { get; } public RelayCommand BestImageCmd { get; } - public RelayCommand AutoONoImageCmd { get; } #endregion public IFeedbackHeatService Feedback{ get; private set; } @@ -113,7 +134,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client ApplyCmd = new RelayCommand(Apply); BestImageCmd = new RelayCommand(BestImage); - AutoONoImageCmd = new RelayCommand(AutoONoImage); } [InjectionMethod] public void Init( @@ -133,14 +153,31 @@ namespace FLY.FeedbackRenZiJia.UI.Client Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.IsForbidUpDown), this, nameof(IsForbidUpDown)); Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.CtrlLine), this, nameof(CtrlLine)); Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.Kp), this, nameof(Kp)); + Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.MaxKp), this, nameof(MaxKp)); + Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.MinKp), this, nameof(MinKp)); + Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.MaxHeat), this, nameof(MaxHeat)); Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.IsAutoONo), this, nameof(IsAutoONo)); + Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.LvCtrlLines), () => { + LvCtrlLines.Clear(); + if (this.HeatCell.LvCtrlLines == null) + return; + if (this.HeatCell.LvCtrlLines.Count() == 0) + return; + foreach (var lvCtrlLine in this.HeatCell.LvCtrlLines) + { + LvCtrlLines.Add(new LvCtrlLine() { CtrlLine = lvCtrlLine.CtrlLine, Mix = lvCtrlLine.Mix }); + } + }); + Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.ThickSmoothRange), this, nameof(ThickSmoothRange)); + + Misc.BindingOperations.SetBinding(this.Feedback, nameof(IFeedbackHeatService.Step), this, nameof(Step)); Misc.BindingOperations.SetBinding(this.Feedback, nameof(IFeedbackHeatService.HasCheck), this, nameof(HasCheck)); Misc.BindingOperations.SetBinding(this.Feedback, nameof(IFeedbackHeatService.Delay), this, nameof(Delay)); Misc.BindingOperations.SetBinding(this.Feedback, nameof(IFeedbackHeatService.HasCheckFilmVelocity), this, nameof(HasCheckFilmVelocity)); - + Misc.BindingOperations.SetBinding(this.Feedback, nameof(IFeedbackHeatService.OffsetGraphYRangePercent), this, nameof(OffsetGraphYRangePercent)); Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.ThresholdSigmaMax), this, nameof(ThresholdSigmaMax)); Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.StableRange), this, nameof(StableRange)); @@ -154,7 +191,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.ThresholdR), this, nameof(ThresholdR)); Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.ThresholdMaxMin), this, nameof(ThresholdMaxMin)); - Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.SearchAngleRange), this, nameof(SearchAngleRange)); + Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.SearchRange), this, nameof(SearchRange)); #endregion } @@ -215,15 +252,34 @@ namespace FLY.FeedbackRenZiJia.UI.Client HeatCell.IsForbidUpDown = this.IsForbidUpDown; HeatCell.CtrlLine = this.CtrlLine; HeatCell.Kp = this.Kp; + HeatCell.MaxKp = this.MaxKp; + HeatCell.MinKp = this.MinKp; + HeatCell.MaxHeat = this.MaxHeat; HeatCell.IsAutoONo = this.IsAutoONo; + if (LvCtrlLines.Count() > 0) + { + var lvCtrlLines = new LvCtrlLine[LvCtrlLines.Count()]; + + for (int i = 0; i < LvCtrlLines.Count(); i++) + { + var lvCtrlLine = LvCtrlLines[i]; + lvCtrlLines[i] = new LvCtrlLine() { CtrlLine = lvCtrlLine.CtrlLine, Mix = lvCtrlLine.Mix }; + } + HeatCell.LvCtrlLines = lvCtrlLines; + } + else + { + HeatCell.LvCtrlLines = null; + } + HeatCell.ThickSmoothRange = ThickSmoothRange; Feedback.Step=this.Step; Feedback.HasCheckFilmVelocity=this.HasCheckFilmVelocity; Feedback.HasCheck=this.HasCheck; Feedback.Delay=this.Delay; - + Feedback.OffsetGraphYRangePercent = this.OffsetGraphYRangePercent; @@ -232,7 +288,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client HeatBuf.HeatEffectCurve=this.HeatEffectCurve; HeatBuf.ThresholdR = this.ThresholdR; HeatBuf.ThresholdMaxMin = this.ThresholdMaxMin; - HeatBuf.SearchAngleRange = this.SearchAngleRange; + HeatBuf.SearchRange = this.SearchRange; HeatCell.Apply(); HeatBuf.Apply(); @@ -240,15 +296,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client FLY.ControlLibrary.Window_Tip.Show("å‚数设置", "æˆåŠŸ", TimeSpan.FromSeconds(2)); } - private void AutoONoImage() - { - var p = container.Resolve<PgHeatAnalyse>(); - //if (HeatCell.AutoONoStatus == AutoONoStatusEnum.Success) - { - p.SetNumber(HeatCell.AutoONoId0, HeatCell.AutoONoId1); - } - MultiLayout.FlyLayoutManager.NavigationService.Navigate(p); - } private void BestImage() { @@ -354,8 +401,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client return "ç‰å¾…:相关性ä¸å¤Ÿ"; case STABILITY.OK_CORREL: return "稳定:相关性高"; - case STABILITY.OK_HEAT_AND_THICK_CORREL: - return "稳定:åŠ çƒç›¸å…³æ€§é«˜"; default: return "???"; } diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Properties/AssemblyInfo.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Properties/AssemblyInfo.cs index c6947a39379632c64dd5d521a2f069fe367c9900..aa1bbf36cea86cbb397984d28433b86febccec90 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Properties/AssemblyInfo.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Properties/AssemblyInfo.cs @@ -12,7 +12,7 @@ using System.Windows; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("佛山枫莱尔自动化技术有é™å…¬å¸")] [assembly: AssemblyProduct("自动风环")] -[assembly: AssemblyCopyright("Copyright © 2020 FLYAutoamtion")] +[assembly: AssemblyCopyright("Copyright © 2022 FLYAutoamtion")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -51,7 +51,7 @@ using System.Windows; // å¯ä»¥æŒ‡å®šæ‰€æœ‰è¿™äº›å€¼ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨â€œå†…部版本å·â€å’Œâ€œä¿®è®¢å·â€çš„默认值, // 方法是按如下所示使用“*â€: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("6.0.0.0")] -[assembly: AssemblyFileVersion("6.0.0.0")] +[assembly: AssemblyVersion("7.4.0.0")] +[assembly: AssemblyFileVersion("7.4.0.0")] [assembly: Guid("18607932-ECBC-4292-A3DE-5864B7FB14DB")] diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Themes/Styles.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Themes/Styles.xaml index f9f0132830e3a3a9b9028cb4723052c989d95265..d55cd43786f7657ab8348ff98924acc0536dc1ce 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Themes/Styles.xaml +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Themes/Styles.xaml @@ -7,75 +7,26 @@ <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/> <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Converter/Dictionary_MyConv.xaml"/> <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Themes/Styles.xaml"/> + <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Themes/GraphStyle.xaml"/> <ResourceDictionary Source="pack://application:,,,/FLY.FeedbackRenZiJia.UI.Client;component/Themes/Colors.xaml"/> </ResourceDictionary.MergedDictionaries> - <Style x:Key="Button.AccentedSquare2" TargetType="Button" BasedOn="{StaticResource MahApps.Styles.Button.Square.Accent}"> - <Setter Property="FontSize" Value="18"/> - <Setter Property="Width" Value="120"/> - <Setter Property="Height" Value="40"/> - <Setter Property="Margin" Value="5"/> - </Style> - <Style x:Key="Button.Square2" TargetType="Button" BasedOn="{StaticResource MahApps.Styles.Button.Square}"> - <Setter Property="FontSize" Value="18"/> - <Setter Property="Width" Value="120"/> - <Setter Property="Height" Value="40"/> - <Setter Property="Margin" Value="5"/> - </Style> - <Style x:Key="Button.HighlightedSquare2" TargetType="Button" BasedOn="{StaticResource MahApps.Styles.Button.Square.Highlight}"> - <Setter Property="FontSize" Value="18"/> - <Setter Property="Width" Value="120"/> - <Setter Property="Height" Value="40"/> - <Setter Property="Margin" Value="5"/> - </Style> - - <DropShadowEffect x:Key="Card.Shadow" Color="#303030" Opacity=".25" BlurRadius="5" ShadowDepth="3"/> - - <Style x:Key="Card.Title" TargetType="TextBlock"> - <Setter Property="Background" Value="#FFC107"/> - <Setter Property="FontSize" Value="18"/> - <Setter Property="HorizontalAlignment" Value="Right"/> - <Setter Property="Padding" Value="20 5"/> - <Setter Property="FontWeight" Value="Bold"/> - <Setter Property="VerticalAlignment" Value="Top"/> - </Style> - <Style x:Key="Card.Border" TargetType="Border"> - <Setter Property="Margin" Value="5"/> - <Setter Property="Background" Value="White"/> - <Setter Property="CornerRadius" Value="3"/> - <Setter Property="Padding" Value="5"/> - <Setter Property="BorderThickness" Value="1"/> - <Setter Property="BorderBrush" Value="#EBEBEB"/> - <Setter Property="Effect" Value="{StaticResource Card.Shadow}"/> - </Style> - - - <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldHeader}" x:Key="Text.FieldHeader2"> + <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldHeader}" x:Key="Text.FieldHeader2"> <Setter Property="FontSize" Value="15" /> </Style> - <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldHeaderEditable}" x:Key="Text.FieldHeaderEditable2"> + <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldHeader.Editable}" x:Key="Text.FieldHeaderEditable2"> <Setter Property="FontSize" Value="15" /> </Style> - <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldHeaderEditable}" x:Key="Text.FieldHeaderEditable"/> - - <Style TargetType="TextBox" BasedOn="{StaticResource TextBoxStyle_FieldContent}" x:Key="Text.FieldContentInput"> - <Setter Property="Background" Value="WhiteSmoke"/> - </Style> - <Style TargetType="TextBox" BasedOn="{StaticResource TextBoxStyle_FieldContent}" x:Key="Text.FieldContentInput2"> + <Style TargetType="TextBox" BasedOn="{StaticResource Styles.Text.FieldContent.Input.Card}" x:Key="Text.FieldContentInput2"> <Setter Property="FontSize" Value="20" /> - <Setter Property="Background" Value="WhiteSmoke"/> - <Setter Property="MinWidth" Value="100"/> </Style> - <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldContent}" x:Key="Text.FieldContent2"> + <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent}" x:Key="Text.FieldContent2"> <Setter Property="FontSize" Value="15" /> </Style> - <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldContent}" x:Key="Text.FieldContent"/> - <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldContent_mm}" x:Key="Text.FieldContentMm"/> - <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldContent_mm_interval}" x:Key="Text.FieldContentMmInterval"/> - <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldContent_mm}" x:Key="Text.FieldContentMm2"> + <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent.Unit}" x:Key="Text.FieldContentMm2"> <Setter Property="FontSize" Value="15" /> </Style> <Style x:Key="AxisSectionStyle" TargetType="lvc:AxisSection" > diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml index f94f64878e400bf10e91c1ae4df604f691841353..30e125f6ef38aad9be4e271ba418c9566bc9f74c 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml @@ -4,7 +4,9 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:FLY.FeedbackRenZiJia.UI.Client.UiModule" - xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" xmlns:lvc1="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Feng.Wpf" + xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" + xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" + xmlns:lvc1="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Feng.Wpf" mc:Ignorable="d" d:DesignHeight="400" d:DesignWidth="980" > @@ -42,11 +44,6 @@ <Setter Property="DataLabel" Value="False"/> </Style> <local:AirRingGraphVmUt x:Key="viewModel"/> - - <Geometry x:Key="Geometry.Close"> - M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z - </Geometry> - </ResourceDictionary> </UserControl.Resources> <Border Style="{StaticResource BorderStyle_module}" > @@ -90,8 +87,8 @@ <TextBlock Text="设置" /> </StackPanel> </Button> - - <StackPanel Orientation="Horizontal" Grid.Column="1" Visibility="{Binding CheckEnable, Converter={StaticResource visbilityconv},ConverterParameter=HiddenWhenTrue}" > + <!--æ£åœ¨æ£€æµ‹æ—¶ï¼ŒæŠŠæ‰‹åŠ¨æŒ‰é’®å…¨éƒ¨éšè—--> + <StackPanel Orientation="Horizontal" Grid.Column="1" Visibility="{Binding FeedbackHeat.CheckEnable, Converter={StaticResource visbilityconv},ConverterParameter=HiddenWhenTrue}" > <Button Command="{Binding BaseUpCmd}" > <StackPanel> <Image Source="/FLY.FeedbackRenZiJia.UI.Client;component/Images/up.png"/> @@ -209,6 +206,7 @@ <Style.Triggers> <DataTrigger Binding="{Binding CheckEnable}" Value="False"> <Setter Property="Source" Value="/FLY.FeedbackRenZiJia.UI.Client;component/Images/nurse_gray.png"/> + <Setter Property="Opacity" Value="0.7"/> </DataTrigger> </Style.Triggers> </Style> @@ -271,13 +269,6 @@ Fill="Transparent" Values="{Binding ThickPercents}" Configuration="{Binding MapperThickPercents}"/> - <!--<lvc:ScatterSeries - PointGeometry="{StaticResource Geometry.Close}" - StrokeThickness ="1" - Stroke="{StaticResource Brushes.Thick}" - Fill="{StaticResource WhiteBrush}" - Values="{Binding ThickPercents}" - Configuration="{Binding MapperThickPercentsWithIsStable}"/>--> </lvc:CartesianChart.Series> <lvc:CartesianChart.AxisX> <lvc:Axis Foreground="{StaticResource Brushes.AxisLabel}" @@ -297,13 +288,73 @@ <lvc:CartesianChart.AxisY> <lvc:Axis Foreground="{StaticResource Brushes.AxisLabel}" LabelFormatter="{Binding YFormatter}" - MinValue="-50" MaxValue="50" FontFamily="Courier New" > + MinValue="{Binding OffsetGraphYMin}" MaxValue="{Binding OffsetGraphYMax}" FontFamily="Courier New" > <lvc:Axis.Separator> - <lvc:Separator Stroke="{StaticResource Brushes.AxisSeparator}" Step="10"/> + <lvc:Separator Stroke="{StaticResource Brushes.AxisSeparator}" Step="{Binding OffsetGraphStep}"/> </lvc:Axis.Separator> </lvc:Axis> </lvc:CartesianChart.AxisY> </lvc:CartesianChart> + <Grid> + <Grid.RowDefinitions> + <RowDefinition Height="auto"/> + <RowDefinition/> + </Grid.RowDefinitions> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="auto"/> + <ColumnDefinition Width="400*"/> + <ColumnDefinition Width="280*"/> + </Grid.ColumnDefinitions> + <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" + Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right"> + <Viewbox MaxHeight="25"> + <StackPanel Margin="{StaticResource ControlMargin}"> + <StackPanel.Resources> + <Style TargetType="Viewbox"> + <Setter Property="Height" Value="25"/> + <Setter Property="Width" Value="120"/> + <Setter Property="HorizontalAlignment" Value="Left"/> + <Setter Property="VerticalAlignment" Value="Top"/> + </Style> + </StackPanel.Resources> + <StackPanel Orientation="Horizontal"> + <Viewbox > + <StackPanel Orientation="Horizontal"> + <TextBlock Style="{StaticResource TitleStyle}" + Foreground="{StaticResource WhiteBrush}" + Background="{StaticResource TextBrush}" + Opacity="0.8" + Text="æ··åˆ: " + /> + <TextBlock Style="{StaticResource ValueStyle}" + Foreground="{StaticResource WhiteBrush}" + Background="{StaticResource TextBrush}" + Text="{Binding CurrMix,Mode=OneWay}" + /> + </StackPanel> + </Viewbox> + <Viewbox> + <StackPanel Orientation="Horizontal" > + <TextBlock Style="{StaticResource TitleStyle}" + Foreground="{StaticResource WhiteBrush}" + Background="{StaticResource TextBrush}" + Text=" 2σ: " + /> + <TextBlock Style="{StaticResource ValueStyle}" + Foreground="{StaticResource WhiteBrush}" + Background="{StaticResource TextBrush}" + > + <Run Text="{Binding CurrSigma2,Mode=OneWay, StringFormat={}{0:F1}}"/>% + </TextBlock> + </StackPanel> + </Viewbox> + </StackPanel> + + </StackPanel> + </Viewbox> + + </Grid> + </Grid> <lvc:CartesianChart Grid.Row="1" Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,2,2,2" MouseMove="UIElement_OnMouseMove" MouseDown="UIElement_MouseDown" MouseUp="UIElement_MouseUp"> <lvc:CartesianChart.Series> diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml.cs index ab3f918fe14494a0abd2ca9634b6bbfec7048ddc..a5f3847ed33e549431b845d4d352944f4d61014c 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml.cs @@ -47,11 +47,13 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule IUnityContainer container, IFeedbackHeatService feedback, IHeatBufService heatBuf, - IHeatCellService heatCell) + IHeatCellService heatCell, + FLY.Thick.Blowing.IService.IBlowingFixProfileService profileService + ) { this.container = container; viewModel = new AirRingGraphVm(); - viewModel.Init(feedback, heatBuf, heatCell, btnClearH); + viewModel.Init(feedback, heatBuf, heatCell, btnClearH, profileService); this.DataContext = viewModel; } diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVm.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVm.cs index 33662c7331ca1d7e3c50bb7b33a3c383ec87867f..fa7a05ba823d9df1b5de3bd0eedce472193bd48b 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVm.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVm.cs @@ -3,6 +3,7 @@ using FLY.FeedbackRenZiJia.IService; using GalaSoft.MvvmLight.Command; using LiveCharts; using LiveCharts.Configurations; +using Misc; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using System; using System.Collections.Generic; @@ -24,7 +25,16 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule #region 图表控制 public Func<double, string> YFormatter { get; private set; } - public int XMax { get; private set; } + public int XMax { get; protected set; } + + public int OffsetGraphYMax { get; protected set; } = 50; + public int OffsetGraphYMin { get; protected set; } = -50; + + public int OffsetGraphStep { get; protected set; } = 10; + /// <summary> + /// Yè½´å€æ•° + /// </summary> + public double YRangePercent { get; set; } = 3; #endregion /// <summary> @@ -36,18 +46,14 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule public ChartValues<int> HeatOffsets { get; } = new ChartValues<int>(); public ChartValues<bool> Bads { get; } = new ChartValues<bool>(); - public ChartValues<bool> IsStables { get; } = new ChartValues<bool>(); public object MapperPreHeats { get; private set; } [PropertyChanged.DependsOn(nameof(Kp))] public object MapperThickPercents { get; private set; } - - [PropertyChanged.DependsOn(nameof(Kp))] - public object MapperThickPercentsWithIsStable { get; private set; } public object Mapper { get; private set; } - public double Kp { get; private set; } = 3; + public double Kp { get; protected set; } = 3; /// <summary> /// 当å‰é€‰æ‹©åŠ çƒé€šé“ /// </summary> @@ -56,19 +62,37 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule /// 当å‰é€‰æ‹©åŠ çƒé€šé“æ•°é‡ /// </summary> public int SelectBoltNoWidth { get; set; } = 0; + + public int CurrMix { get; protected set; } = 1; + public double CurrSigma2 { get; protected set; } = 0; /// <summary> /// 长按驱动器 /// </summary> public LongPress LPress { get; } = new LongPress(); public IFeedbackHeatService FeedbackHeat { get; private set; } + public RelayCommand AddCmd { get; } + public RelayCommand SubCmd { get; } + + public RelayCommand UndoCmd { get; } + public RelayCommand CalCmd { get; } + public RelayCommand BaseUpCmd { get; } + public RelayCommand BaseDownCmd { get; } + public RelayCommand ApplyCmd { get; } + public RelayCommand SaveCmd { get; } + public RelayCommand LoadCmd { get; } + public RelayCommand EnableCmd { get; } + public RelayCommand CheckCmd { get; } + public RelayCommand SmoothCmd { get; } + public RelayCommand ClearCmd { get; } + IFeedbackHeatService mFeedback; IHeatBufService mHeatBuf; IHeatCellService mHeatCell; Button btnClearH; - Brush BadsBrush; - Brush PreHeatsBrush; - + protected Brush BadsBrush; + protected Brush PreHeatsBrush; + FLY.Thick.Blowing.Common.BlowingFixProfileParam profileParam; public AirRingGraphVm() { #region 与数æ®æ— 关界é¢å‚æ•° @@ -120,24 +144,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule { return value * Kp; }); - - MapperThickPercentsWithIsStable = Mappers.Xy<double>() - .X((value, index) => - { - return index + 1; - }) - .Y((value,index) => - { - if (index < IsStables.Count() && index >= 0) - { - if (!IsStables[index]) - { - return value * Kp; - } - } - return double.NaN; - }); - Mapper = Mappers.Xy<int>() .X((value, index) => @@ -166,53 +172,28 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule ClearCmd = new RelayCommand(Clear); } - private void Apply() - { - SelectBoltNo = -1; - SelectBoltNoWidth = 0; - mHeatCell.HeatApply(); - } - - private void Sub() - { - for (int i = 0; i < SelectBoltNoWidth; i++) - { - int index = SelectBoltNo - 1 + i; - if (index >= 0 && index < mFeedback.ChannelCnt) - { - mHeatCell.ModifyOffset(index, -mFeedback.Step); - } - } - } - private void Add() - { - for (int i = 0; i < SelectBoltNoWidth; i++) - { - int index = SelectBoltNo - 1 + i; - if (index >= 0 && index < mFeedback.ChannelCnt) - { - mHeatCell.ModifyOffset(index, mFeedback.Step); - } - } - } public void Init( IFeedbackHeatService feedback, IHeatBufService heatBuf, IHeatCellService heatCell, - Button button_clear_h) + Button button_clear_h, + FLY.Thick.Blowing.IService.IBlowingFixProfileService profileService ) { //把 FeedbackHeat 共享。 1个程åºï¼Œåªèƒ½æœ‰ä¸€ä¸ª FeedbackHeat - mFeedback = feedback; - mHeatBuf = heatBuf; - mHeatCell = heatCell; + this.mFeedback = feedback; + this.mHeatBuf = heatBuf; + this.mHeatCell = heatCell; + this.profileParam = profileService.Param; + + FeedbackHeat = mFeedback; mFeedback.PropertyChanged += mFeedbackHeatService_PropertyChanged; mHeatCell.PropertyChanged += MHeatCell_PropertyChanged; - mHeatBuf.PropertyChanged += MHeatBuf_PropertyChanged; + this.profileParam.PropertyChanged += ProfileParam_PropertyChanged; UpdateAxisX(); DataBindAll_Thicks(); DataBindAll_HeatOffsets(); @@ -221,6 +202,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule Misc.BindingOperations.SetBinding(mHeatCell, nameof(mHeatCell.Kp), this, nameof(Kp)); + Misc.BindingOperations.SetBinding(mHeatCell, nameof(mHeatCell.CurrMix), this, nameof(CurrMix)); this.btnClearH = button_clear_h; @@ -230,18 +212,36 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule mHeatCell.ClearPreHeats(); }; - } + updateOffsetGraphRange(); + } - private void MHeatBuf_PropertyChanged(object sender, PropertyChangedEventArgs e) + private void ProfileParam_PropertyChanged(object sender, PropertyChangedEventArgs e) { - if (e.PropertyName == nameof(mHeatBuf.BoltIsStable)) + if (e.PropertyName == nameof(profileParam.TolerancePercent)) { - DataBindAll_IsStables(); + updateOffsetGraphRange(); } } + + /// <summary> + /// 刷新å移é‡å›¾çš„Y轴范围 + /// </summary> + void updateOffsetGraphRange() + { + int range = (int)(this.profileParam.TolerancePercent * 100 * mHeatCell.Kp * mFeedback.OffsetGraphYRangePercent); + if (range < 10) + range = 10; + + OffsetGraphStep = range / 5; + + OffsetGraphYMax = range; + OffsetGraphYMin = -range; + + } + private void MHeatCell_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(mHeatCell.ThickPercents)) @@ -259,30 +259,45 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule DataBindAll_HeatOffsets(); } - else if (e.PropertyName == nameof(mHeatCell.PreHeats)) + else if (e.PropertyName == nameof(mHeatCell.PreHeats)) { DataBindAll_PreHeats(); } + else if (e.PropertyName == nameof(mHeatCell.Kp)) + { + updateOffsetGraphRange(); + } } void mFeedbackHeatService_PropertyChanged(object sender, PropertyChangedEventArgs e) { - if ((e.PropertyName == nameof(mFeedback.ChannelCnt))) + if (e.PropertyName == nameof(mFeedback.ChannelCnt)) { UpdateAxisX(); } - if (e.PropertyName == nameof(mFeedback.Bads)) + else if (e.PropertyName == nameof(mFeedback.Bads)) { DataBindAll_Bads(); } + else if (e.PropertyName == nameof(mFeedback.OffsetGraphYRangePercent)) + { + updateOffsetGraphRange(); + } } void DataBindAll_Thicks() { ThickPercents.Clear(); - if(mHeatCell.ThickPercents!=null) + if (mHeatCell.ThickPercents != null) + { ThickPercents.AddRange(mHeatCell.ThickPercents); + CurrSigma2 = mHeatCell.ThickPercents.Sigma() * 2; + } + else + { + CurrSigma2 = 0; + } } void DataBindAll_Heats() @@ -312,72 +327,93 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule } void DataBindAll_IsStables() { - IsStables.Clear(); - if (mHeatBuf.BoltIsStable != null) - IsStables.AddRange(mHeatBuf.BoltIsStable); - NotifyPropertyChanged(nameof(MapperThickPercentsWithIsStable)); + } void UpdateAxisX() { XMax = mFeedback.ChannelCnt + 1; } - public RelayCommand AddCmd { get; } - public RelayCommand SubCmd { get; } - - public RelayCommand UndoCmd { get; } - public RelayCommand CalCmd { get; } - public RelayCommand BaseUpCmd { get; } - public RelayCommand BaseDownCmd { get; } - public RelayCommand ApplyCmd { get; } - public RelayCommand SaveCmd { get; } - public RelayCommand LoadCmd { get; } - public RelayCommand EnableCmd { get; } - public RelayCommand CheckCmd { get; } - public RelayCommand SmoothCmd { get; } - public RelayCommand ClearCmd { get; } - - private void Save() + private void Apply() { - WdSaveHeatsFile w = new WdSaveHeatsFile(); - w.Owner = FLY.ControlLibrary.COMMON.GetWindow(btnClearH); - w.FileName = mFeedback.HeatsProductName; + SelectBoltNo = -1; + SelectBoltNoWidth = 0; + mHeatCell.HeatApply(); + } - if (w.ShowDialog() == true) + private void Sub() + { + for (int i = 0; i < SelectBoltNoWidth; i++) { - if (string.IsNullOrEmpty(w.FileName)) + int index = SelectBoltNo - 1 + i; + if (index >= 0 && index < mFeedback.ChannelCnt) { - FLY.ControlLibrary.Window_WarningTip.Show("异常", - "产å“å称 为空", - TimeSpan.FromSeconds(2)); - return; + mHeatCell.ModifyOffset(index, -mFeedback.Step); } - char[] invalids = System.IO.Path.GetInvalidFileNameChars(); + } + } - foreach (char invalidChar in invalids) + private void Add() + { + for (int i = 0; i < SelectBoltNoWidth; i++) + { + int index = SelectBoltNo - 1 + i; + if (index >= 0 && index < mFeedback.ChannelCnt) { - if (w.FileName.Contains(invalidChar)) - { - FLY.ControlLibrary.Window_WarningTip.Show("异常", - "产å“å称 å«æœ‰éžæ³•å—符 " + invalidChar, - TimeSpan.FromSeconds(2)); - return; - } + mHeatCell.ModifyOffset(index, mFeedback.Step); } + } + } + + + private void Save() + { + string txt = mFeedback.HeatsProductName; + if (!FLY.ControlLibrary.Prompt.Show("请输出产å“å称", ref txt)) + return; + + //WdSaveHeatsFile w = new WdSaveHeatsFile(); + //w.Owner = FLY.ControlLibrary.COMMON.GetWindow(btnClearH); + //w.FileName = mFeedback.HeatsProductName; + + //if (w.ShowDialog() != true) + // return; + + //string txt = w.FileName; + + if (string.IsNullOrEmpty(txt)) + { + FLY.ControlLibrary.Window_WarningTip.Show("异常", + "产å“å称 为空", + TimeSpan.FromSeconds(2)); + return; + } + char[] invalids = System.IO.Path.GetInvalidFileNameChars(); - if (w.FileName.Length > 30) + foreach (char invalidChar in invalids) + { + if (txt.Contains(invalidChar)) { FLY.ControlLibrary.Window_WarningTip.Show("异常", - "产å“å称 > 30å—符", - TimeSpan.FromSeconds(2)); + "产å“å称 å«æœ‰éžæ³•å—符 " + invalidChar, + TimeSpan.FromSeconds(2)); return; } + } - mFeedback.SaveHeats(w.FileName); - FLY.ControlLibrary.Window_Tip.Show("åŠ è½½æˆåŠŸ", - w.FileName, + if (txt.Length > 30) + { + FLY.ControlLibrary.Window_WarningTip.Show("异常", + "产å“å称 > 30å—符", TimeSpan.FromSeconds(2)); + return; } + + mFeedback.SaveHeats(txt); + FLY.ControlLibrary.Window_Tip.Show("åŠ è½½æˆåŠŸ", + txt, + TimeSpan.FromSeconds(2)); + } private void Load() diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVmUt.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVmUt.cs index 031a9abe37d3e50807211c8e271d11a211450500..eb0aa937e8660d161390a39fc30cc5d7c05fdd1a 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVmUt.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVmUt.cs @@ -9,106 +9,14 @@ using System.Windows.Media; namespace FLY.FeedbackRenZiJia.UI.Client.UiModule { - public class AirRingGraphVmUt : INotifyPropertyChanged + public class AirRingGraphVmUt : AirRingGraphVm { public event PropertyChangedEventHandler PropertyChanged; - /// <summary> - /// 长按驱动器 - /// </summary> - public LongPress LPress { get; } = new LongPress(); - - - #region 图表控制 - public Func<double, string> YFormatter { get; private set; } - public int XMax { get; private set; } - #endregion - - /// <summary> - /// ç»è¿‡Kp 转æ¢åŽçš„ 厚度% - /// </summary> - public ChartValues<double> ThickPercents { get; } = new ChartValues<double>(); - public ChartValues<int> PreHeats { get; } = new ChartValues<int>(); - public ChartValues<int> Heats { get; } = new ChartValues<int>(); - public ChartValues<int> HeatOffsets { get; } = new ChartValues<int>(); - public ChartValues<bool> Bads { get; } = new ChartValues<bool>(); - public object MapperPreHeats { get; private set; } - public object MapperThickPercents { get; private set; } - public object Mapper { get; private set; } - - public double Kp { get; private set; } = 3; + - /// <summary> - /// 当å‰é€‰æ‹©åŠ çƒé€šé“ - /// </summary> - public int SelectBoltNo { get; set; } = 40; - /// <summary> - /// 当å‰é€‰æ‹©åŠ çƒé€šé“æ•°é‡ - /// </summary> - public int SelectBoltNoWidth { get; set; } = 3; - - Brush BadsBrush; - Brush PreHeatsBrush; public AirRingGraphVmUt() { - #region 与数æ®æ— 关界é¢å‚æ•° - - var resourceDictionary = new ResourceDictionary() { Source = new Uri("pack://application:,,,/FLY.FeedbackRenZiJia.UI.Client;component/Themes/Colors.xaml") }; - BadsBrush = resourceDictionary["Brushes.Bad"] as Brush; - PreHeatsBrush = resourceDictionary["Brushes.PreHeat"] as Brush; - - YFormatter = (y) => - { - string text = y + "%"; - return $"{text,6}"; - }; - - MapperPreHeats = Mappers.Xy<int>() - .X((value, index) => - { - return index + 1; - }) - .Y((value, index) => - { - if (index < Bads.Count() && index >= 0) - { - if (Bads[index]) - { - if (value == 0) - return 100; - } - } - return value; - }) - .Fill((value, index) => - { - if (index < Bads.Count() && index >= 0) - { - if (Bads[index]) - { - return BadsBrush; - } - } - return PreHeatsBrush; - }); - MapperThickPercents = Mappers.Xy<double>() - .X((value, index) => - { - return index + 1; - }) - .Y((value) => - { - return value * Kp; - }); - - Mapper = Mappers.Xy<int>() - .X((value, index) => - { - return index + 1; - }); - - #endregion - #region æ•°æ® double target = 150; diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml index 5dbc89fc7aa9811b37c5d6733f614ee242c869e4..9778af90b729bba6674d56a6bd4b4660f03e092d 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml @@ -16,9 +16,30 @@ </ResourceDictionary.MergedDictionaries> <client:StableConverter x:Key="stableconv"/> - <local:DynAreaAirRingVmUt x:Key="airRingVmUt" Msg="0123" IsONoDiff="True" BestOrgBoltNo="10" OrgBoltNo="1" CurrR="0.8" LastChangedTime="12:30"/> + <local:DynAreaAirRingVmUt x:Key="airRingVmUt" Msg="0123" IsONoDiff="True" IsKpDiff="True" BestOrgBoltNo="10" OrgBoltNo="1" CurrR="0.8" LastChangedTime="12:30" + IsShowBestOrgBoltNo="True" BestKp="3.4" Kp="2.2"/> <baseUiModule:DynAreaErrorVm2 x:Key="errorVm" IsError="False" ErrMsg="枫莱尔控制器连接æ–å¼€ 枫莱尔控制器连接æ–å¼€"/> + <Style TargetType="TextBlock" x:Key="FlashText" BasedOn="{StaticResource Styles.Module.Text.ItemValue}"> + <Setter Property="Visibility" Value="Hidden"/> + <Setter Property="Background" Value="{StaticResource Brushes.Highlight}"/> + <Setter Property="Foreground" Value="{StaticResource Brushes.ThemeBackground}"/> + <Style.Triggers> + <DataTrigger Binding="{Binding Tag,RelativeSource={RelativeSource Mode=Self}}" Value="True"> + <DataTrigger.EnterActions> + <BeginStoryboard> + <Storyboard RepeatBehavior="Forever" > + <DoubleAnimation BeginTime="0:0:0" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="00:00:01" /> + <DoubleAnimation BeginTime="0:0:1" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="00:00:01" /> + </Storyboard> + </BeginStoryboard> + </DataTrigger.EnterActions> + <Setter Property="Visibility" Value="Visible"/> + </DataTrigger> + </Style.Triggers> + </Style> + + </ResourceDictionary> </UserControl.Resources> @@ -35,99 +56,53 @@ <StackPanel > <StackPanel Orientation="Horizontal"> <StackPanel Margin="2" > - <TextBlock Text="稳定性" FontSize="12" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left" Foreground="#FF3B3B3B" /> - <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" Foreground="{StaticResource Color_theme_activity}" Text="{Binding CurrR, StringFormat={}{0:F1}}" FontSize="24" VerticalAlignment="Center" /> + <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Text="稳定性" /> + <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" Foreground="{StaticResource Brushes.Activity}" + Text="{Binding CurrR, StringFormat={}{0:F2}}"/> </StackPanel> <Grid Visibility="{Binding IsShowBest,Converter={StaticResource visbilityconv}}"> <StackPanel Orientation="Horizontal" Visibility="{Binding IsShowBestOrgBoltNo,Converter={StaticResource visbilityconv}}"> - <StackPanel Margin="2,0" > - <TextBlock FontSize="12" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left" Foreground="#FF3B3B3B" Text="最佳å¤ä½å·" Margin="0,2"/> + <StackPanel Margin="2"> + <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Foreground="{StaticResource Brushes.NoAct}" + Text="å¤ä½å·"/> + <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" FontSize="18" + Text="{Binding OrgBoltNo}" /> + </StackPanel> + <StackPanel Margin="2" > + <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Text="最佳" /> <Grid> - <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" FontSize="24" VerticalAlignment="Center" Foreground="{StaticResource Color_theme_activity}" > - <Run Text="{Binding BestOrgBoltNo }"/> - </TextBlock> - <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" FontSize="24" VerticalAlignment="Center" Background="Red" Foreground="Yellow"> - <Run Text="{Binding BestOrgBoltNo }"/> - - <TextBlock.Style> - <Style TargetType="TextBlock"> - <Setter Property="Visibility" Value="Hidden"/> - <Setter Property="Foreground" Value="{StaticResource Color_theme_activity}"/> - <Style.Triggers> - <DataTrigger Binding="{Binding IsONoDiff}" Value="True"> - <DataTrigger.EnterActions> - <BeginStoryboard> - <Storyboard RepeatBehavior="Forever" > - <DoubleAnimation BeginTime="0:0:0" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="00:00:01" /> - <DoubleAnimation BeginTime="0:0:1" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="00:00:01" /> - </Storyboard> - </BeginStoryboard> - </DataTrigger.EnterActions> - <Setter Property="Visibility" Value="Visible"/> - </DataTrigger> - </Style.Triggers> - </Style> - - </TextBlock.Style> - </TextBlock> + <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" Foreground="{StaticResource Brushes.Activity}" + Text="{Binding BestOrgBoltNo}"/> + <TextBlock Style="{StaticResource FlashText}" + Text="{Binding BestOrgBoltNo}" Tag="{Binding IsONoDiff}"/> </Grid> - - - </StackPanel> - - <StackPanel Margin="2" VerticalAlignment="Bottom" > - <TextBlock FontSize="12" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left" Foreground="#FF8B8B8B" Text="当å‰"/> - <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" Foreground="{StaticResource Brushes.Static}" Text="{Binding OrgBoltNo }" FontSize="18" VerticalAlignment="Center" /> </StackPanel> - </StackPanel> <StackPanel Orientation="Horizontal" Visibility="{Binding IsShowBestOrgBoltNo,Converter={StaticResource visbilityconv},ConverterParameter=HiddenWhenTrue}"> - <StackPanel Margin="2,0" > - <TextBlock FontSize="12" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left" Foreground="{StaticResource Brushes.Static}" Text="最佳Kp" Margin="0,2"/> + <StackPanel Margin="2"> + <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Foreground="{StaticResource Brushes.NoAct}" + Text="Kp"/> + <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" FontSize="18" + Text="{Binding Kp,StringFormat={}{0:F1}}" /> + </StackPanel> + <StackPanel Margin="2" > + <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Text="最佳" /> <Grid> - <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" FontSize="24" VerticalAlignment="Center" Foreground="{StaticResource Brushes.Activity}" > - <Run Text="{Binding BestKp,StringFormat={}{0:F1} }"/> - </TextBlock> - <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" FontSize="24" VerticalAlignment="Center" Background="Red" Foreground="Yellow"> - <Run Text="{Binding BestKp,StringFormat={}{0:F1} }"/> - <TextBlock.Style> - <Style TargetType="TextBlock"> - <Setter Property="Visibility" Value="Hidden"/> - <Setter Property="Foreground" Value="{StaticResource Color_theme_activity}"/> - <Style.Triggers> - <DataTrigger Binding="{Binding IsKpDiff}" Value="True"> - <DataTrigger.EnterActions> - <BeginStoryboard> - <Storyboard RepeatBehavior="Forever" > - <DoubleAnimation BeginTime="0:0:0" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="00:00:01" /> - <DoubleAnimation BeginTime="0:0:1" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="00:00:01" /> - </Storyboard> - </BeginStoryboard> - </DataTrigger.EnterActions> - <Setter Property="Visibility" Value="Visible"/> - </DataTrigger> - </Style.Triggers> - </Style> - - </TextBlock.Style> - </TextBlock> + <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" Foreground="{StaticResource Brushes.Activity}" + Text="{Binding BestKp, StringFormat={}{0:F1}}"/> + <TextBlock Style="{StaticResource FlashText}" + Text="{Binding BestKp,StringFormat={}{0:F1}}" Tag="{Binding IsKpDiff}"/> </Grid> - - </StackPanel> - - <StackPanel Margin="2" VerticalAlignment="Bottom" > - <TextBlock FontSize="12" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left" Foreground="#FF8B8B8B" Text="当å‰"/> - <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" Foreground="{StaticResource Color_theme_static}" Text="{Binding Kp,StringFormat={}{0:F1}}" FontSize="18" VerticalAlignment="Center" /> - </StackPanel> - </StackPanel> </Grid> </StackPanel> <StackPanel Margin="2" > - <TextBlock Text="åŠ çƒæ—¶é—´" FontSize="10" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left" Foreground="#FF3B3B3B" Margin="0,2"/> - <TextBlock Text="{Binding LastChangedTime,StringFormat={}{0:HH:mm:ss}}" FontSize="24" FontFamily="Microsoft Sans Serif" TextAlignment="Center" Foreground="White" Background="Black" Padding="5,0" /> + <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Text="åŠ çƒæ—¶é—´" /> + <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" Foreground="White" Background="Black" Padding="5,0" + Text="{Binding LastChangedTime,StringFormat={}{0:HH:mm:ss}}" + TextAlignment="Center" /> </StackPanel> </StackPanel> diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml.cs index 7fa1cf335a0c3ab545ab6f52633bee9d0b9ccae3..438a761586f9622ca8e4f18e4755fffa6a4ee58b 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml.cs @@ -62,12 +62,14 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule { public event PropertyChangedEventHandler PropertyChanged; + public int BestOrgBoltNo { get; set; } public int OrgBoltNo { get; set; } public bool IsONoDiff { get; set; } public double BestKp { get; set; } + public double Kp { get; set; } public bool IsKpDiff { get; set; } @@ -79,13 +81,13 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule public string Msg { get; set; } - public bool IsShowBestOrgBoltNo { get; private set; } = true; + public bool IsShowBestOrgBoltNo { get; set; } = true; public bool IsShowBest => IsKpDiff || IsONoDiff; + public RelayCommand OpenRecordCmd { get; } - IBlowingService blowingService; IHeatBufService heatBufService; IUnityContainer container; @@ -115,13 +117,13 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule this.heatCellService = heatCellService; this.blowingService = blowingService; - Misc.BindingOperations.SetBinding(blowingService, nameof(blowingService.OrgBoltNo), this, nameof(OrgBoltNo)); + Misc.BindingOperations.SetBinding(this.blowingService, nameof(this.blowingService.OrgBoltNo), this, nameof(OrgBoltNo)); - Misc.BindingOperations.SetBinding(heatBufService, nameof(heatBufService.CurrR), this, nameof(CurrR)); + Misc.BindingOperations.SetBinding(this.heatBufService, nameof(this.heatBufService.CurrR), this, nameof(CurrR)); - Misc.BindingOperations.SetBinding(feedbackHeatService, nameof(feedbackHeatService.LastChangedTime), this, nameof(LastChangedTime)); + Misc.BindingOperations.SetBinding(this.feedbackHeatService, nameof(this.feedbackHeatService.LastChangedTime), this, nameof(LastChangedTime)); - Misc.BindingOperations.SetBinding(heatCellService, nameof(heatCellService.Kp), this, nameof(Kp)); + Misc.BindingOperations.SetBinding(this.heatCellService, nameof(this.heatCellService.Kp), this, nameof(Kp)); UpdateBestOrgBoltNo(); @@ -156,7 +158,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule else if (e.PropertyName == nameof(OrgBoltNo)) { UpdateBestOrgBoltNo(); - UpdateIsONoDiff(); + IsONoDiff = false; } else if (e.PropertyName == nameof(BestKp)) { @@ -165,7 +167,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule else if (e.PropertyName == nameof(Kp)) { UpdateBestKp(); - UpdateIsKpDiff(); + IsKpDiff = false; } } @@ -175,11 +177,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule { UpdateMsg(); } - else if (e.PropertyName == nameof(heatBufService.MaxR)) - { - UpdateBestOrgBoltNo(); - UpdateBestKp(); - } else if (e.PropertyName == nameof(heatBufService.BestOrgBoltNo)) { UpdateBestOrgBoltNo(); @@ -212,7 +209,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule IsONoDiff = false; } } - void UpdateBestKp() + bool UpdateBestKp() { if (heatBufService.MaxR > 0) { @@ -222,12 +219,18 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule { BestKp = Kp; } + return false; } void UpdateIsKpDiff() { - double p = Kp / BestKp; - if ((p > 1.5)) + if (BestKp < Kp * 0.4) + { + //这个需è¦ä¸¥é‡è¦å‘Šï¼Œ Kp设得太大 + IsKpDiff = true; + } + else if (BestKp > Kp * 3) { + //这个Kp太å°äº†ï¼Œ æ示一次å§ï¼Œä¸ç„¶å¾ˆæ…¢ IsKpDiff = true; } else @@ -256,28 +259,8 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule } } - public class DynAreaAirRingVmUt : INotifyPropertyChanged + public class DynAreaAirRingVmUt : DynAreaAirRingVm { - public event PropertyChangedEventHandler PropertyChanged; - public int BestOrgBoltNo { get; set; } - public int OrgBoltNo { get; set; } - - public bool IsONoDiff { get; set; } - - public int BestKp { get; set; } - public int Kp { get; set; } - - public bool IsKpDiff { get; set; } - - public bool IsShowBest => IsKpDiff || IsONoDiff; - public double CurrR { get; set; } - - public DateTime LastChangedTime { get; set; } - - public string Msg { get; set; } - - public bool IsShowBestOrgBoltNo { get; set; } - public RelayCommand OpenRecordCmd { get; } } diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Server/Properties/AssemblyInfo.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Server/Properties/AssemblyInfo.cs index 03977f91e33c578b7a5051c0c2ae0848906de2ad..db66530dd4e1ef72039a317c7dab3146adbed894 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Server/Properties/AssemblyInfo.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Server/Properties/AssemblyInfo.cs @@ -51,7 +51,7 @@ using System.Windows; // å¯ä»¥æŒ‡å®šæ‰€æœ‰è¿™äº›å€¼ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨â€œå†…部版本å·â€å’Œâ€œä¿®è®¢å·â€çš„默认值, // 方法是按如下所示使用“*â€: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("7.0.1.0")] -[assembly: AssemblyFileVersion("7.0.1.0")] +[assembly: AssemblyVersion("7.4.0.0")] +[assembly: AssemblyFileVersion("7.4.0.0")] [assembly: Guid("32104657-86E9-4380-9113-606589E6D812")] diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/BulkDbServiceClient.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/BulkDbServiceClient.cs index d65fdf83e21603775de3b98738e758e31794de48..b58cec3ae2401604f11948e86524fc0fd8cd254e 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/BulkDbServiceClient.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/BulkDbServiceClient.cs @@ -33,6 +33,21 @@ namespace FLY.FeedbackRenZiJia.Client { Call(nameof(GetStableFrame), new { id, isPre }, asyncDelegate, asyncContext); } + + /// <summary> + /// 以Id为起始点, å‘å‰æˆ–者å‘åŽèŽ·å–最近通é“改å˜æ—¶é—´ä¸ç›¸åŒçš„æ•°æ® æˆ– èµ·æ•ˆæ•°æ® + /// </summary> + /// <param name="id"></param> + /// <param name="isPre">å‘å‰</param> + /// <param name="isTakeEffect">æ•°æ®èµ·æ•ˆ</param> + /// <param name="isDiffHTime">åŠ çƒä¸åŒ</param> + /// <param name="asyncDelegate"></param> + /// <param name="asyncContext"></param> + [Call(typeof(GetFrameReponse))] + public void GetFrameAdv(long id, bool isPre, bool isTakeEffect, bool isDiffHTime, AsyncCBHandler asyncDelegate, object asyncContext) + { + Call(nameof(GetFrameAdv), new { id, isPre, isTakeEffect, isDiffHTime }, asyncDelegate, asyncContext); + } } } diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/FeedbackHeatServiceClient.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/FeedbackHeatServiceClient.cs index a24b365933ae82cb67e4886f6e2a8bd945e3284f..d16ea271aec5ab7d1e31de0a2af08623812f0aca 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/FeedbackHeatServiceClient.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/FeedbackHeatServiceClient.cs @@ -42,7 +42,10 @@ namespace FLY.FeedbackRenZiJia.Client /// </summary> public int Step { get; set; } = 5; - + /// <summary> + /// å移é‡å›¾ï¼Œ Y轴显示比例 + /// </summary> + public double OffsetGraphYRangePercent { get; set; } = 3; #endregion diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatBufServiceClient.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatBufServiceClient.cs index 626ba0e6bcbac252b138a149c475fe0e0930e16c..06e61559ed5968984c269d59b2c90592e1b763eb 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatBufServiceClient.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatBufServiceClient.cs @@ -69,7 +69,7 @@ namespace FLY.FeedbackRenZiJia.Client /// <summary> /// 对ä½æŸ¥æ‰¾èŒƒå›´ 默认 ±120°, 最大值 180°,最å°å€¼ 50° /// </summary> - public int SearchAngleRange { get; set; } = 120; + public int SearchRange { get; set; } = 120; /// <summary> /// 计算的最佳å¤ä½åŒºå· /// </summary> diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatCellServiceClient.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatCellServiceClient.cs index 29cda6d75f4bf84bcc38c79a6059be1bbc87c21a..116fe1e546ce6dcb2303f87d85575740221c8db1 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatCellServiceClient.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatCellServiceClient.cs @@ -21,6 +21,17 @@ namespace FLY.FeedbackRenZiJia.Client /// </summary> public double Kp { get; set; } = 3; + + /// <summary> + /// 自动计算时,Kp最大值 + /// </summary> + public double MaxKp { get; set; } = 5; + + /// <summary> + /// 自动计算时,Kp最大值 + /// </summary> + public double MinKp { get; set; } = 1; + /// <summary> /// 平滑的阀值,åªæœ‰è¶…出阀值,æ‰å¹³æ»‘ /// </summary> @@ -36,36 +47,28 @@ namespace FLY.FeedbackRenZiJia.Client /// <summary> /// 厚度控制线 , 厚度% 大于 厚度控制线 自动æ‰ä¼šåŠ çƒæŽ§åˆ¶ /// </summary> - public int CtrlLine { get; set; } + public double CtrlLine { get; set; } /// <summary> /// æœ€å¤§åŠ çƒé‡ 默认100% /// </summary> public int MaxHeat { get; set; } - #endregion - #region å¯¹ä½ - /// <summary> - /// è‡ªåŠ¨å¯¹ä½ - /// </summary> - public bool IsAutoONo { get; set; } - /// <summary> - /// 当å‰æ£åœ¨è‡ªåŠ¨å¯¹ä½æ¨¡å¼ - /// </summary> - public AutoONoStatusEnum AutoONoStatus { get; set; } - /// <summary> - /// 自动对ä½æ¨¡å¼ ä¿¡æ¯ + /// 分级控制线 /// </summary> - public string AutoONoMsg { get; set; } + public LvCtrlLine[] LvCtrlLines { get; set; } + /// <summary> - /// è‡ªåŠ¨å¯¹ä½ é‚£å¹…ç©ºçš„å›¾ + /// 对厚度数æ®æ¨ªå‘平滑 å•ä½åŠ çƒæ£’数。 特别的当Smooth = ChannelCnt/2 就是膜泡的å心度 /// </summary> - public long AutoONoId0 { get; set; } + public int ThickSmoothRange { get; set; } + #endregion + #region å¯¹ä½ /// <summary> - /// è‡ªåŠ¨å¯¹ä½ åŠ çƒåŽç”Ÿæ•ˆçš„图 + /// è‡ªåŠ¨å¯¹ä½ /// </summary> - public long AutoONoId1 { get; set; } + public bool IsAutoONo { get; set; } #endregion @@ -76,6 +79,10 @@ namespace FLY.FeedbackRenZiJia.Client /// </summary> public double[] ThickPercents { get; set; } + /// <summary> + /// å½“å‰ thickPercents æ··åˆæ•° + /// </summary> + public int CurrMix { get; set; } /// <summary> /// 当å‰æ–¹å‘çš„åŠ çƒç–略,必须ä¿è¯ 0~100 diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/FlyData_FeedbackHeat.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/FlyData_FeedbackHeat.cs index 8c2cc83622b52b432fe36d829ab99647eae25a88..7de503b991ae7e44375365a62128e102d30a85cd 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/FlyData_FeedbackHeat.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/FlyData_FeedbackHeat.cs @@ -2,18 +2,19 @@ using FLY.Thick.Blowing.IService; using System; using System.Collections.Generic; +using System.Linq; namespace FLY.FeedbackRenZiJia.Common { - public class FlyData_FeedbackHeat + public class ThickHeat2 { public Lc_ThickHeat thickHeat; /// <summary> - /// ç¨³å®šçŠ¶æ€ + /// 以å‰çš„æ•°æ® /// </summary> - public STABILITY Stability = STABILITY.IDLE; + public List<Lc_ThickHeat> thickHeats = new List<Lc_ThickHeat>(); /// <summary> /// 厚度å‡å€¼ @@ -29,6 +30,47 @@ namespace FLY.FeedbackRenZiJia.Common /// å¤§å° ChannelCnt, å‡å€¼ä¸º0 /// </summary> public double[] HeatPercents; + + public void Mix(ThickHeat2 older) + { + thickHeats.AddRange(older.thickHeats); + thickHeats.Add(thickHeat); + + //æ›´æ–°ThickPercents + + int z = thickHeat.Thicks.Count() / ThickPercents.Count(); + double[] thickPercents_last; + //当两幅图å¤ä½åŒºå·ä¸ä¸€è‡´æ—¶ï¼Œç§»åŠ¨ä»¥å‰çš„æ•°æ®ï¼Œä½¿ä¹‹ä¸€è‡´ + if (older.thickHeat.OrgBoltNo != thickHeat.OrgBoltNo) + { + int move = (thickHeat.OrgBoltNo - older.thickHeat.OrgBoltNo) / z; + thickPercents_last = Common.MyMath.Move(older.ThickPercents, move); + } + else + { + thickPercents_last = older.ThickPercents; + } + + for (int i = 0; i < ThickPercents.Count(); i++) + { + double old_v = thickPercents_last[i]; + double v = ThickPercents[i]; + int cnt = older.MixCnt; + if (!double.IsNaN(old_v)) + { + if (!double.IsNaN(v)) + { + ThickPercents[i] = (v + old_v * cnt) / (cnt + 1); + } + else + { + ThickPercents[i] = old_v; + } + } + } + } + + public int MixCnt => thickHeats.Count() + 1; } @@ -41,42 +83,42 @@ namespace FLY.FeedbackRenZiJia.Common /// 待定,ä¸çŸ¥é“ï¼ï¼ /// </summary> IDLE = 0, + /// <summary> /// åŠ çƒç‚¹ï¼Œè¿˜æ²¡åˆ°è¾¾æµ‹åŽšä»ªã€‚ 其它状æ€éƒ½æ˜¯åŠ çƒå·²ç»èµ·æ•ˆäº†ï¼Œé¡¶å¤šä¸ç¨³å®šè€Œå·²ã€‚ /// </summary> ERROR_NO_ARRIVE = -1, + /// <summary> /// 旋转次数太少,ä½ç½®ä¸èƒ½ç¡®å®š /// </summary> ERROR_POSITION_NOTSURE = -2, + /// <summary> /// 一副数æ®ï¼ŒSigma > 15% : ä¸ç¨³å®šï¼Œå˜åŒ–太大,超出控制范围 /// </summary> ERROR_SIGMA_OVERSIZE = -3, + /// <summary> /// è¿žç»ä¸¤å¹…图旋转时间å˜åŒ– > 10%:ä¸ç¨³å®šï¼Œæ—‹è½¬é€Ÿåº¦æ³¢åŠ¨å¤§ï¼Œæµ‹é‡ä¸å‡†ç¡® /// </summary> ERROR_ROTATE_CHANGED = -4, + /// <summary> /// è¿žç»ä¸¤å¹…图厚度å‡å€¼å˜åŒ– > 10%: ä¸ç¨³å®šï¼ŒåŽšåº¦æ³¢åŠ¨å¤§ /// </summary> ERROR_THICK_CHANGED = -5, + /// <summary> /// 膜è·ç¦»ï¼Œæ—‹è½¬è§’度被改å˜ï¼Œæ— æ³•åˆ¤æ– /// </summary> ERROR_PARAM_CHANGED = -7, - - /// <summary> /// ä¸ç¨³å®šï¼Œä¸ç›¸å…³ /// </summary> ERROR_CORREL = -6, - /// <summary> - /// åŠ çƒä¸ŽåŽšåº¦å·®ï¼Œç›¸å…³æ€§å¾ˆé«˜ - /// </summary> - OK_HEAT_AND_THICK_CORREL = 3, /// <summary> /// åŠ çƒä¸º0ï¼ŒåŠ çƒä¸ŽåŽšåº¦å·®ï¼Œç›¸å…³æ€§å¾ˆé«˜ /// </summary> diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/MyMath.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/MyMath.cs index 02237469169356f4156f870521d0fc0b3d32a813..ceb26aaaf78f0182243f4bd8383e903e149cb388 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/MyMath.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/MyMath.cs @@ -494,6 +494,56 @@ namespace FLY.FeedbackRenZiJia.Common data2_move = mi; } + /// <summary> + /// 通过data2 平移,找到与 data1 最相似的ä½ç½®ï¼Œ data1 与 data2 必须大å°ä¸€è‡´ + /// </summary> + /// <param name="data1"></param> + /// <param name="data2"></param> + /// <param name="range_percent">0~1</param> + /// <param name="offset"></param> + /// <param name="r"></param> + public static void CalBestMove(double[] data1, double[] data2, int range, out int data2_move, out double max_r) + { + if (data1.Length != data2.Length) + { + throw new Exception("CalBestMove() å‚数错误 (data1.Length = " + data1.Length.ToString() + ")!=(data2.Length =" + data2.Length.ToString() + ")"); + } + + if (range > data1.Length / 2) + range = data1.Length / 2; + + if (range <= 0) + range = 1; + + + double mr = 0; + int mi = -1; + for (int i = -range; i <= range; i++) + { + var data22 = Move(data2, i); + double r = Misc.MyMath.Correl(data1, data22); + if (mi == -1) + { + mr = r; + mi = i; + } + else + { + if (r > mr) + { + mr = r; + mi = i; + } + } + + } + + //找到了ï¼ï¼ï¼ + + max_r = mr; + data2_move = mi; + } + /// <summary> /// 平移 /// </summary> diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.csproj b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.csproj index d2e0893ab2391af7fcfae50bfc93514359fd3cbe..fe1818058e6b997da23f408b6a59dfd7131866cb 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.csproj +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.csproj @@ -57,6 +57,7 @@ <Compile Include="IService\IBulkDbService.cs" /> <Compile Include="IService\IHeatBufService.cs" /> <Compile Include="IService\IFeedbackHeatService.cs" /> + <Compile Include="IService\IPlcLinkExt.cs" /> <Compile Include="OBJ_INTERFACE\OBJ_INTERFACE_ID.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Server.OBJProxy\OBJProxy.cs" /> @@ -75,6 +76,7 @@ <Compile Include="Server\Model\LcTable.cs" /> <Compile Include="Server\Model\Lc_AutoMapperProfile.cs" /> <Compile Include="Server\PLCLink.cs" /> + <Compile Include="Server\PlcLinkExt.cs" /> <Compile Include="Server\SysParam.cs" /> <Compile Include="Server\TDGage.cs" /> </ItemGroup> diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IBulkDbService.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IBulkDbService.cs index fcd889ba686e14148c36774222a5e6905d7e9865..5d0dab3cde8b762deae23baee9d29d234d75f3e0 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IBulkDbService.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IBulkDbService.cs @@ -34,10 +34,22 @@ namespace FLY.FeedbackRenZiJia.IService /// <param name="asyncContext"></param> [Call(typeof(GetStableFrameReponse))] void GetStableFrame(long id, bool isPre, AsyncCBHandler asyncDelegate, object asyncContext); + + /// <summary> + /// 以Id为起始点, å‘å‰æˆ–者å‘åŽèŽ·å–最近通é“改å˜æ—¶é—´ä¸ç›¸åŒçš„æ•°æ® æˆ– èµ·æ•ˆæ•°æ® + /// </summary> + /// <param name="id"></param> + /// <param name="isPre">å‘å‰</param> + /// <param name="isTakeEffect">æ•°æ®èµ·æ•ˆ</param> + /// <param name="isDiffHTime">åŠ çƒä¸åŒ</param> + /// <param name="asyncDelegate"></param> + /// <param name="asyncContext"></param> + [Call(typeof(GetFrameReponse))] + void GetFrameAdv(long id, bool isPre, bool isTakeEffect, bool isDiffHTime, AsyncCBHandler asyncDelegate, object asyncContext); } public class GetFrameReponse { - public long Id; + public long id; public Lc_ThickHeat thickHeat; } public class GetStableFrameReponse diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IFeedbackHeatService.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IFeedbackHeatService.cs index 75a9b15f1fafa8bfcf4d9b926386a0937f58486d..410b7c222f014a60516511d2cc1a152193fd83a3 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IFeedbackHeatService.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IFeedbackHeatService.cs @@ -41,6 +41,10 @@ namespace FLY.FeedbackRenZiJia.IService /// </summary> int Step { get; set; } + /// <summary> + /// å移é‡å›¾ï¼Œ Y轴显示比例 + /// </summary> + double OffsetGraphYRangePercent { get; set; } #endregion #region 动æ€æ•°æ® diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatBufService.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatBufService.cs index b470b1a0906f174520c3b4b4864ea27a429e1a0f..fd9fbd7eff2b516fcb3888a3e3f89aabf386e932 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatBufService.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatBufService.cs @@ -49,9 +49,9 @@ namespace FLY.FeedbackRenZiJia.IService #region å¯¹ä½ /// <summary> - /// 对ä½æŸ¥æ‰¾èŒƒå›´ 默认 ±120°, 最大值 180°,最å°å€¼ 10° + /// 对ä½æŸ¥æ‰¾èŒƒå›´ 默认 ±10个分区å·ï¼Œ 最大值 总分区å·çš„一åŠï¼Œæœ€å°å€¼ 5ä¸ªåˆ†åŒºå· /// </summary> - int SearchAngleRange { get; set; } + int SearchRange { get; set; } /// <summary> /// 计算的最佳å¤ä½åŒºå· /// </summary> diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatCellService.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatCellService.cs index 7375f2d76149ce36ed2c104ab612719ce8bddb06..6cde24bfe5d125ed2f38bf495e2a396dfd16cb2f 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatCellService.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatCellService.cs @@ -14,6 +14,15 @@ namespace FLY.FeedbackRenZiJia.IService /// HeatOffset = ThickPercent * Kp /// </summary> double Kp { get; set; } + /// <summary> + /// 自动计算时,Kp最大值 + /// </summary> + double MaxKp { get; set; } + + /// <summary> + /// 自动计算时,Kp最大值 + /// </summary> + double MinKp { get; set; } /// <summary> /// 输出平滑的阀值,åªæœ‰è¶…出阀值,æ‰å¹³æ»‘ @@ -28,37 +37,28 @@ namespace FLY.FeedbackRenZiJia.IService /// <summary> /// 厚度控制线 , 厚度% 大于 厚度控制线 自动æ‰ä¼šåŠ çƒæŽ§åˆ¶ /// </summary> - int CtrlLine { get; set; } + double CtrlLine { get; set; } /// <summary> /// æœ€å¤§åŠ çƒé‡ 默认100% /// </summary> int MaxHeat { get; set; } - #endregion - #region å¯¹ä½ /// <summary> - /// è‡ªåŠ¨å¯¹ä½ + /// 分级控制线 /// </summary> - bool IsAutoONo { get; set; } - + LvCtrlLine[] LvCtrlLines { get; set; } /// <summary> - /// 当å‰æ£åœ¨è‡ªåŠ¨å¯¹ä½æ¨¡å¼ - /// </summary> - AutoONoStatusEnum AutoONoStatus { get; } - /// <summary> - /// 自动对ä½æ¨¡å¼ ä¿¡æ¯ + /// 对厚度数æ®æ¨ªå‘平滑 å•ä½åŠ çƒæ£’数。 特别的当Smooth = ChannelCnt/2 就是膜泡的å心度 /// </summary> - string AutoONoMsg { get; } - /// <summary> - /// è‡ªåŠ¨å¯¹ä½ é‚£å¹…ç©ºçš„å›¾ - /// </summary> - long AutoONoId0 { get; } + int ThickSmoothRange { get; set; } + #endregion + #region å¯¹ä½ /// <summary> - /// è‡ªåŠ¨å¯¹ä½ åŠ çƒåŽç”Ÿæ•ˆçš„图 + /// è‡ªåŠ¨å¯¹ä½ /// </summary> - long AutoONoId1 { get; } + bool IsAutoONo { get; set; } #endregion #region çŠ¶æ€ @@ -67,6 +67,13 @@ namespace FLY.FeedbackRenZiJia.IService /// </summary> double[] ThickPercents { get; } + /// <summary> + /// å½“å‰ thickPercents æ··åˆæ•° + /// </summary> + int CurrMix { get; } + + + /// <summary> /// 当å‰æ–¹å‘çš„åŠ çƒç–略,必须ä¿è¯ 0~100 /// </summary> @@ -87,6 +94,7 @@ namespace FLY.FeedbackRenZiJia.IService /// </summary> double MaxHeatSigma { get; } + #endregion #region 功能 @@ -135,23 +143,13 @@ namespace FLY.FeedbackRenZiJia.IService #endregion } - public enum AutoONoStatusEnum + /// <summary> + /// 分级控制线 + /// </summary> + public class LvCtrlLine : INotifyPropertyChanged { - /// <summary> - /// ç‰å¾… æ²¡æœ‰åŠ çƒï¼ŒåŽšåº¦ç¨³å®š - /// </summary> - Init, - /// <summary> - /// 厚度已ç»ç¨³å®šï¼Œå¯¹ä½åŠ çƒ, ç‰å¾…结果 - /// </summary> - Step2, - /// <summary> - /// æˆåŠŸæ‰¾åˆ°å‡†ç¡®çš„å¤ä½åŒºå·ä¸ŽKp - /// </summary> - Success, - /// <summary> - /// 失败,对ä½è¿‡ç¨‹æœ‰å¤§æ³¢åŠ¨ - /// </summary> - Fail + public event PropertyChangedEventHandler PropertyChanged; + public double CtrlLine { get; set; } + public int Mix { get; set; } } } diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPLCLink.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPLCLink.cs index 14ac47255cad590a6478fc5f6fddc5e656336d07..cad09d3875f057bc021ed851146793ea5f0e9aef 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPLCLink.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPLCLink.cs @@ -8,17 +8,11 @@ using System.Collections.ObjectModel; namespace FLY.FeedbackRenZiJia.Server { - public interface IPLCLink:INotifyPropertyChanged + public interface IPLCLink : INotifyPropertyChanged { #region 输出 - /// <summary> - /// åŠ çƒé€šé“æ•° - /// </summary> - UInt16 ChannelCnt { get; set; } - /// <summary> - /// åŠ çƒé‡æ›´æ–° 写 - /// </summary> - UInt16 HeatUpdate { get; set; } + void SetChannelCnt(UInt16 channelCnt); + void SetHeatUpdate(UInt16 heatUpdate); /// <summary> /// è®¾ç½®åŠ çƒé‡ /// </summary> @@ -43,8 +37,7 @@ namespace FLY.FeedbackRenZiJia.Server #endregion #region çŠ¶æ€ - int Errno { get; set; } + bool IsConnected { get; } #endregion - } } diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPlcLinkExt.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPlcLinkExt.cs new file mode 100644 index 0000000000000000000000000000000000000000..f45860ed188e24401d77cd2230b6fa9d1c940750 --- /dev/null +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPlcLinkExt.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FLY.FeedbackRenZiJia.IService +{ + public interface IPlcLinkExt : INotifyPropertyChanged + { + #region 当å‰å€¼ + /// <summary> + /// 当å‰ç”µæµ 有没? + /// </summary> + bool HasElectricity { get; } + /// <summary> + /// 风机是å¦å¯åŠ¨ï¼Ÿ + /// </summary> + bool HasFan { get; } + + bool IsConnected { get; } + #endregion + + #region 输出 + + void SetChannelCnt(int channelCnt); + /// <summary> + /// è®¾ç½®åŠ çƒé‡ + /// </summary> + /// <param name="values"></param> + void SetHeats(IEnumerable<double> values); + + #endregion + + + } +} diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/FeedbackHeat.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/FeedbackHeat.cs index d3c99e9203ca83faf86de4772842e064c913f5fe..38a639bfb031f5fb963a27b2115eaf6bbd1cb5cb 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/FeedbackHeat.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/FeedbackHeat.cs @@ -47,19 +47,22 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// åŠ çƒåŽèµ·æ•ˆå»¶æ—¶(s) /// </summary> - public int Delay { get; set; } = 10; + public int Delay { get; set; } = 60; /// <summary> /// 检测功能使能 /// </summary> - public bool HasCheck { get; set; } + public bool HasCheck { get; set; } = true; /// <summary> /// æ‰‹åŠ¨åŠ çƒæ¥è¿› /// </summary> public int Step { get; set; } = 5; - + /// <summary> + /// å移é‡å›¾ï¼Œ Y轴显示比例 + /// </summary> + public double OffsetGraphYRangePercent { get; set; } =3; #endregion #region 动æ€æ•°æ® /// <summary> @@ -116,7 +119,7 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// 检测线速度 使能 /// </summary> - public bool HasCheckFilmVelocity { get; set; } + public bool HasCheckFilmVelocity { get; set; } = true; /// <summary> @@ -128,7 +131,7 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// æ£åœ¨æ£€æµ‹ä¸ /// </summary> - public bool CheckEnable { get; set; } = false; + public bool CheckEnable { get; set; } /// <summary> /// 1å—åŠ çƒæŽ§åˆ¶æ¿ æŽ¥å¤šå°‘è·¯åŠ çƒ @@ -141,7 +144,7 @@ namespace FLY.FeedbackRenZiJia.Server - private IPLCLink plc; + private IPlcLinkExt plc; FLY.Thick.Blowing.IService.IBlowingService blowingService; FLY.Thick.Blowing.IService.IBulkDbService bulkDbService; private FLY.Thick.Blowing.IService.IBlowingDetectService bDetect; @@ -165,14 +168,25 @@ namespace FLY.FeedbackRenZiJia.Server public FeedbackHeat() { PLCep = "192.168.50.60:502"; + + Load(); + + IPLCLink plclink; if (IsClient) - plc = new PLCLink(Misc.StringConverter.ToIPEndPoint(PLCep)); + { + plclink = new PLCLink(Misc.StringConverter.ToIPEndPoint(PLCep)); + ((PLCLink)plclink).Start(); + } else - plc = new HMI(); + plclink = new HMI(); - plc.PropertyChanged += new PropertyChangedEventHandler(hmi_PropertyChanged); - HasCheckFilmVelocity = plc.HasElectricity; + var plc = new PlcLinkExt(); + plc.Init(plclink); + this.plc = plc; + + this.plc.PropertyChanged += new PropertyChangedEventHandler(hmi_PropertyChanged); + HasElectricity = plc.HasElectricity; HasFan = plc.HasFan; @@ -259,10 +273,7 @@ namespace FLY.FeedbackRenZiJia.Server Misc.BindingOperations.SetBinding(mHeatCheck, nameof(mHeatCheck.CheckNo), this, nameof(CheckNo)); Misc.BindingOperations.SetBinding(mHeatCheck, nameof(mHeatCheck.Bads), this, nameof(Bads)); Misc.BindingOperations.SetBinding(this, nameof(HeatsOfGroup), mHeatCheck, nameof(mHeatCheck.HeatsOfGroup)); - if (plc is PLCLink) - { - ((PLCLink)plc).Start(); - } + } void mHeatCheck_PropertyChanged(object sender, PropertyChangedEventArgs e) @@ -294,18 +305,17 @@ namespace FLY.FeedbackRenZiJia.Server void InitError() { //-------------------------------------------------------------------------------- - //连接æ–开事件 + //连接æ–开事件, 3秒åŽå†ç»‘定 FObjBase.PollModule.Current.Poll_Config(PollModule.POLL_CONFIG.ADD, () => { Misc.BindingOperations.SetBinding(this, nameof(IsConnectedWithPLC), () => { - bool b = !IsConnectedWithPLC; - - ERR_STATE state = b ? ERR_STATE.ON : ERR_STATE.OFF; - ERRNO errno = ERRNOs.ERRNO_PLC_DISCONNECTED; - mWarning.Add(errno.Code, errno.Descrption, state); + if (!IsConnectedWithPLC) + mWarning.Add(errno, canReset: false);//PLC连接æ–开,ä¸èƒ½è¢«å¤ä½ + else + mWarning.Remove(errno); }); }, TimeSpan.FromSeconds(3), true, false, this, MARKNO_DELAY_ISCONNECTED, true); @@ -314,7 +324,7 @@ namespace FLY.FeedbackRenZiJia.Server //检测功能的结果 this.PropertyChanged += (s, e) => { - if (e.PropertyName == "HasCheck") + if (e.PropertyName == nameof(HasCheck)) { if (!HasCheck) { @@ -326,19 +336,21 @@ namespace FLY.FeedbackRenZiJia.Server }; foreach (ERRNO eRRNO in eRRNOs) { - mWarning.Add(eRRNO.Code, eRRNO.Descrption, ERR_STATE.OFF); + mWarning.Remove(eRRNO); } } return; } - else if (e.PropertyName == "HasFan") + else if (e.PropertyName == nameof(HasFan)) { if (HasCheck) { - ERR_STATE state = (!HasFan) ? ERR_STATE.ON : ERR_STATE.OFF; - ERRNO errno = ERRNOs.ERRNO_NO_FAN; - mWarning.Add(errno.Code, errno.Descrption, state); + + if (!HasFan) + mWarning.Add(errno, canReset:false); + else + mWarning.Remove(errno); } } }; @@ -346,9 +358,9 @@ namespace FLY.FeedbackRenZiJia.Server //------------------------------------------------------------------------ //检测功能的结果 Dictionary<string, ERRNO> error_property = new Dictionary<string, ERRNO>(); - error_property.Add("OpenCircuit", ERRNOs.ERRNO_OPEN_CIRCUIT); - error_property.Add("ShortCircuit", ERRNOs.ERRNO_SHORT_CIRCUIT); - error_property.Add("PowerOff", ERRNOs.ERRNO_POWER_OFF); + error_property.Add(nameof(mHeatCheck.OpenCircuit), ERRNOs.ERRNO_OPEN_CIRCUIT); + error_property.Add(nameof(mHeatCheck.ShortCircuit), ERRNOs.ERRNO_SHORT_CIRCUIT); + error_property.Add(nameof(mHeatCheck.PowerOff), ERRNOs.ERRNO_POWER_OFF); mHeatCheck.PropertyChanged += (s, e) => { if (HasCheck) @@ -356,11 +368,13 @@ namespace FLY.FeedbackRenZiJia.Server if (error_property.ContainsKey(e.PropertyName)) { bool b = (bool)Misc.PropertiesManager.GetValue(mHeatCheck, e.PropertyName); - - ERR_STATE state = b ? ERR_STATE.ON : ERR_STATE.OFF; - + ERRNO errno = error_property[e.PropertyName]; - mWarning.Add(errno.Code, errno.Descrption, state); + + if (b) + mWarning.Add(errno); + else + mWarning.Remove(errno); } } }; @@ -369,21 +383,24 @@ namespace FLY.FeedbackRenZiJia.Server //线速度异常 this.PropertyChanged += (s, e) => { - if (e.PropertyName == "HasCheckFilmVelocity") + if (e.PropertyName == nameof(HasCheckFilmVelocity)) { if (!HasCheckFilmVelocity) { ERRNO eRRNO = ERRNOs.ERRNO_NO_VELOCITY; - mWarning.Add(eRRNO.Code, eRRNO.Descrption, ERR_STATE.OFF); + mWarning.Remove(eRRNO); } } - else if (e.PropertyName == "HasFilmVelocity") + else if (e.PropertyName == nameof(HasFilmVelocity)) { if (HasCheckFilmVelocity) { - ERR_STATE b = (!HasFilmVelocity) ? ERR_STATE.ON : ERR_STATE.OFF; ERRNO eRRNO = ERRNOs.ERRNO_NO_VELOCITY; - mWarning.Add(eRRNO.Code, eRRNO.Descrption, b); + if (!HasFilmVelocity) + mWarning.Add(eRRNO, canReset: false); + else + mWarning.Remove(eRRNO); + } } }; @@ -393,8 +410,7 @@ namespace FLY.FeedbackRenZiJia.Server void InitBuf() { - plc.ChannelCnt = (UInt16)ChannelCnt; - //Currs = new int[ChannelCnt]; + plc.SetChannelCnt(ChannelCnt); mHeatChanged.Init(ChannelCnt); mHeatBuf.Init(NBolts, ChannelCnt); mHeatCell.Init2(NBolts, ChannelCnt); @@ -407,19 +423,10 @@ namespace FLY.FeedbackRenZiJia.Server FObjBase.PollModule.Current.Dispatcher.Invoke( new PropertyChangedEventHandler( (sender, e)=> { - if (e.PropertyName == nameof(plc.Errno)) + + if (e.PropertyName == nameof(plc.IsConnected)) { - if (plc.Errno == -1) - { - IsConnectedWithPLC = false; - } - else - { - IsConnectedWithPLC = true; - //刚æˆåŠŸè¿žæŽ¥ä¸Š - //é‡æ–°å¤åˆ¶æ•°æ®åˆ° PLC - RecoverPLC(); - } + IsConnectedWithPLC = plc.IsConnected; } else if (e.PropertyName == nameof(plc.HasElectricity)) { @@ -634,11 +641,9 @@ namespace FLY.FeedbackRenZiJia.Server } - UInt16[] last_heat; - UInt16 last_heatupdate; void Output(int[] heats) { - List<UInt16> list = new List<UInt16>(); + List<double> list = new List<double>(); for (int i = 0; i < ChannelCnt; i++) { UInt16 heat = (UInt16)heats[i]; @@ -648,30 +653,7 @@ namespace FLY.FeedbackRenZiJia.Server heat = 100; list.Add(heat); } - plc.SetHeat(list); - last_heat = list.ToArray(); - - UInt16 heatupdate = (UInt16)(plc.HeatUpdate_R + 1); - if (heatupdate >100) - heatupdate = 1; - plc.HeatUpdate = heatupdate; - last_heatupdate = heatupdate; - } - void RecoverPLC() - { - plc.ChannelCnt = (UInt16)ChannelCnt; - if (last_heat != null) - { - plc.SetHeat(last_heat); - plc.HeatUpdate = last_heatupdate; - } - else - { - - //设置全部0进去 - plc.SetHeat(new UInt16[ChannelCnt]); - plc.HeatUpdate = plc.HeatUpdate; - } + plc.SetHeats(list); } @@ -763,7 +745,7 @@ namespace FLY.FeedbackRenZiJia.Server return; } - mHeatCell.SetThickPercents(mHeatBuf.ThickPercents); + mHeatCell.SetThickPercents(mHeatBuf.ThickPercents, mHeatBuf.MixCnt); if (IsAuto)//如果自控ä¸ï¼ï¼ï¼ { @@ -973,12 +955,12 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// åŠ çƒåŽèµ·æ•ˆå»¶æ—¶(s) /// </summary> - public int Delay= 10; + public int Delay= 60; /// <summary> /// 检测功能使能 /// </summary> - public bool HasCheck; + public bool HasCheck = true; /// <summary> /// æ‰‹åŠ¨åŠ çƒæ¥è¿› @@ -992,12 +974,16 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// 检测线速度 使能 /// </summary> - public bool HasCheckFilmVelocity; + public bool HasCheckFilmVelocity = true; /// <summary> /// 1å—åŠ çƒæŽ§åˆ¶æ¿ æŽ¥å¤šå°‘è·¯åŠ çƒ /// </summary> public int HeatsOfGroup = 12; + /// <summary> + /// å移é‡å›¾ï¼Œ Y轴显示比例 + /// </summary> + public double OffsetGraphYRangePercent = 3; #endregion } diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HMI.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HMI.cs index bc78133998e2e4d92b2d098d21fd830b2a906bef..e5ad62448d2047cc42dc84ff2de91f5241dc4226 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HMI.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HMI.cs @@ -83,12 +83,12 @@ namespace FLY.FeedbackRenZiJia.Server /// </summary> void RegToPropertyNameInit() { - rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.COIL, ADDR_M_HasElectricCurrent, 1, "HasElectricity")); - rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.COIL, ADDR_M_HasFan, 1, "HasFan")); + rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.COIL, ADDR_M_HasElectricCurrent, 1, nameof(HasElectricity))); + rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.COIL, ADDR_M_HasFan, 1, nameof(HasFan))); - rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_ChannelCnt, 1, "ChannelCnt")); - rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_HeatUpdate, 1, "HeatUpdate_R")); - rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_CurrUpdate, 1, "CurrUpdate")); + rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_ChannelCnt, 1, nameof(ChannelCnt))); + rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_HeatUpdate, 1, nameof(HeatUpdate_R))); + rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_CurrUpdate, 1, nameof(CurrUpdate))); } public void OnPoll() @@ -97,23 +97,19 @@ namespace FLY.FeedbackRenZiJia.Server if (DateTime.Now.Subtract(modbusserver.LastCommDT).TotalSeconds > 3) { //有3秒没通讯 - Errno = -1; + IsConnected = false; } else { - Errno = 0; + IsConnected = true; } } #region PLCLink æˆå‘˜ #region çŠ¶æ€ - /// <summary> - /// -1 HMI 没有连接到 本æœåŠ¡å™¨; -2 串å£æ‰“开异常 - /// </summary> - public int Errno { get; set; } = -1; - public int RetCode { get; set; } + public bool IsConnected { get; private set; } #endregion @@ -137,6 +133,18 @@ namespace FLY.FeedbackRenZiJia.Server return mPLCRegs.GetBool(ADDR_M_HasFan); } } + + + public void SetChannelCnt(UInt16 channelCnt) + { + ChannelCnt = channelCnt; + } + public void SetHeatUpdate(UInt16 heatUpdate) + { + HeatUpdate = heatUpdate; + + } + public ushort ChannelCnt { get diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatBuf.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatBuf.cs index 16947a7601edab83867f0a390559aeefefa28223..f512cbba467af46a4fe72cdbc7b5efc4e1971336 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatBuf.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatBuf.cs @@ -31,13 +31,13 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// åŠ çƒç”Ÿæ•ˆæ›²çº¿,å…许为空,则ä¸ç”Ÿæ•ˆ /// </summary> - public int[] HeatEffectCurve { get; set; } = new int[] { 3, 4, 5, 6, 5, 4, 3 }; + public int[] HeatEffectCurve { get; set; } = new int[] { 3, 4, 7, 4, 3 }; /// <summary> /// 厚度稳定范围 %, å差在范围内,都是稳定的 /// </summary> - public int StableRange { get; set; } = 2; + public int StableRange { get; set; } = 4; @@ -46,7 +46,7 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// 对ä½æ¨¡å¼, åŠ çƒä¸ŽåŽšåº¦ç›¸å…³æ€§é˜€å€¼, 相关性 >=0.7 /// </summary> - public double ThresholdR { get; set; } = 0.7; + public double ThresholdR { get; set; } = 0.75; /// <summary> @@ -74,10 +74,11 @@ namespace FLY.FeedbackRenZiJia.Server #region å¯¹ä½ + /// <summary> - /// 对ä½æŸ¥æ‰¾èŒƒå›´ 默认 ±120°, 最大值 180°,最å°å€¼ 50° + /// 对ä½æŸ¥æ‰¾èŒƒå›´ 默认 ±30°, 最大值 90°,最å°å€¼ 10° /// </summary> - public int SearchAngleRange { get; set; } = 120; + public int SearchRange { get; set; } = 10; /// <summary> /// 计算的最佳å¤ä½åŒºå· @@ -176,13 +177,17 @@ namespace FLY.FeedbackRenZiJia.Server /// </summary> int BufSize = 60; - public List<FlyData_FeedbackHeat> mData; + public List<ThickHeat2> mData; /// <summary> /// 最åŽä¸€å¹…æ•°æ®,å•ä½ channelcnt, å¯ä»¥æœ‰double.NaN /// </summary> public double[] ThickPercents=null; /// <summary> + /// 最åŽä¸€å¹…æ•°æ®çš„æ··åˆæ¬¡æ•° + /// </summary> + public int MixCnt = 1; + /// <summary> /// 最åŽä¸€å¹…æ•°æ®çš„å¤ä½åŒºå· /// </summary> public int OrgBoltNo = 1; @@ -192,14 +197,14 @@ namespace FLY.FeedbackRenZiJia.Server /// </summary> public int LastHeatDiffMaxMin = 0; - + public bool HasMaxR = false; static HeatBuf() { } public HeatBuf() { - mData = new List<FlyData_FeedbackHeat>(); + mData = new List<ThickHeat2>(); if (!Load()) Save(); @@ -224,6 +229,7 @@ namespace FLY.FeedbackRenZiJia.Server ThresholdMaxMin = 40; } } + public void SetToBestThickPercents() { MoveThickPercents(BestOrgBoltNo); @@ -280,6 +286,7 @@ namespace FLY.FeedbackRenZiJia.Server /// </summary> public bool Add(Lc_ThickHeat thickHeat) { + HasMaxR = false; //thicks çš„æ•°æ®é‡ä¸€å®šè¦æ˜¯ BoltCnt //heats çš„æ•°æ®é‡ä¸€å®šè¦æ˜¯ ChannelCnt //ä¸æ˜¯è¿”回 false @@ -305,9 +312,10 @@ namespace FLY.FeedbackRenZiJia.Server CurrTime = thickHeat.Time; - ThickPercents = thkpercents; + ThickPercents = thkpercents; + MixCnt = 1; OrgBoltNo = thickHeat.OrgBoltNo; - Curr2Sigma = thkpercents.Sigma(); + Curr2Sigma = thkpercents.Sigma() * 2; @@ -331,27 +339,25 @@ namespace FLY.FeedbackRenZiJia.Server return true; } - - - FlyData_FeedbackHeat d = new FlyData_FeedbackHeat() + ThickHeat2 d = new ThickHeat2() { - //thickHeat = thickHeat, - Stability = STABILITY.IDLE, + thickHeat = Lc_ThickHeat_Clone(thickHeat), ThickAvg = thkavg,//è‚¯å®šæœ‰æ•°æ® ThickPercents = thkpercents, HeatPercents = heatPercents }; - string json = Newtonsoft.Json.JsonConvert.SerializeObject(thickHeat); - d.thickHeat = Newtonsoft.Json.JsonConvert.DeserializeObject<Lc_ThickHeat>(json); - - + //æ›´æ–°æ¯ä¸ªåˆ†åŒºçš„ç¨³å®šçŠ¶æ€ UpdateStable3(d); return true; } + Lc_ThickHeat Lc_ThickHeat_Clone(Lc_ThickHeat thickHeat) + { + string json = Newtonsoft.Json.JsonConvert.SerializeObject(thickHeat); + return Newtonsoft.Json.JsonConvert.DeserializeObject<Lc_ThickHeat>(json); + } - - void DataAdd(FlyData_FeedbackHeat d) + void DataAdd(ThickHeat2 d) { if (mData.Count == BufSize) { @@ -368,7 +374,7 @@ namespace FLY.FeedbackRenZiJia.Server /// </summary> /// <param name="d"></param> /// <returns></returns> - void UpdateStable3(FlyData_FeedbackHeat d) + void UpdateStable3(ThickHeat2 d) { if (mData.Count() == 0)//没有以å‰çš„æ•°æ® { @@ -377,6 +383,16 @@ namespace FLY.FeedbackRenZiJia.Server } var d_last = mData.Last(); + { + double sec_delta = Math.Abs(d.thickHeat.RPeriod.TotalSeconds - d_last.thickHeat.RPeriod.TotalSeconds); + if (sec_delta / d_last.thickHeat.RPeriod.TotalSeconds > 0.1) + { + //旋转时间ä¸åŒï¼Œæ— 法比较 + Stability = STABILITY.ERROR_ROTATE_CHANGED; + goto _error; + } + } + if (d.thickHeat.RAngle != d_last.thickHeat.RAngle) { //旋转角度ä¸åŒï¼Œæ— 法比较 @@ -412,29 +428,54 @@ namespace FLY.FeedbackRenZiJia.Server GetPercentDatas3(d, d_last, out double[] thickpercents_diff, out double[] heatpercents_diff); + + //通过简å•çš„范围比较计算稳定性 //当Kp, é”™ä½ï¼Œå°±ä¼šå¦ 稳定性的值很低 bool[] isStables = CalStable(thickpercents_diff, heatpercents_diff); double currR = 1.0 * isStables.Count(b => b) / isStables.Count(); - double currR2 = Misc.MyMath.Correl(thickpercents_diff, heatpercents_diff); - if (double.IsNaN(currR2)) - currR2 = -1; - - CurrR = Math.Max( currR, currR2 ); BoltIsStable = isStables; - LastHeatDiffMaxMin = (int)Common.MyMath.CalMaxMin(heatpercents_diff); - - if (CurrR >= ThresholdR) + if (heatpercents_diff.All(h => h == 0)) { - Stability = STABILITY.OK_CORREL; + //åŠ çƒæ²¡æœ‰å˜åŒ–, + CurrR = currR; + if (CurrR >= ThresholdR) + { + Stability = STABILITY.OK_CORREL; + + //把 d åˆå¹¶åˆ° d_last + mData.RemoveAt(mData.Count() - 1); + d.Mix(d_last); + //更新图 + ThickPercents = d.ThickPercents; + MixCnt = d.MixCnt; + Curr2Sigma = ThickPercents.Sigma() * 2; + } + else + { + Stability = STABILITY.ERROR_CORREL; + } } else { - Stability = STABILITY.ERROR_CORREL; - } + double currR2 = Misc.MyMath.Correl(thickpercents_diff, heatpercents_diff); + if (double.IsNaN(currR2)) + currR2 = -1; + + CurrR = Math.Max(currR, currR2); + if (CurrR >= ThresholdR) + { + Stability = STABILITY.OK_CORREL; + } + else + { + Stability = STABILITY.ERROR_CORREL; + } + } + LastHeatDiffMaxMin = (int)Common.MyMath.CalMaxMin(heatpercents_diff); //通过平移 达到最大 åŠ çƒåŽšåº¦ç›¸å…³æ€§ @@ -478,11 +519,8 @@ namespace FLY.FeedbackRenZiJia.Server if (maxMin >= ThresholdMaxMin) { //通过平移找最大相关性 - double range_percent = 1.0 * SearchAngleRange / 360; - if (range_percent < 0.1 || range_percent > 0.5) - range_percent = 0.3; //计算平移 - Common.MyMath.CalBestMove(heatpercents_diff, thickpercents_diff, range_percent, out int offset, out double heatThickR); + Common.MyMath.CalBestMove(heatpercents_diff, thickpercents_diff, SearchRange, out int offset, out double heatThickR); if (heatThickR > maxOffsetHeatThickR) @@ -515,6 +553,7 @@ namespace FLY.FeedbackRenZiJia.Server MaxR_Id0 = maxOffsetHeatThickR_id; MaxR_Id1 = d.thickHeat.ID; MaxR_Time = DateTime.Now; + HasMaxR = true; } } @@ -540,7 +579,7 @@ namespace FLY.FeedbackRenZiJia.Server return orgBoltNo; } void GetPercentDatas3( - FlyData_FeedbackHeat d, FlyData_FeedbackHeat d_last, + ThickHeat2 d, ThickHeat2 d_last, out double[] thickpercents_diff, out double[] heatpercents_diff) { //厚度%åå·® @@ -548,12 +587,9 @@ namespace FLY.FeedbackRenZiJia.Server //当两幅图å¤ä½åŒºå·ä¸ä¸€è‡´æ—¶ï¼Œç§»åŠ¨ä»¥å‰çš„æ•°æ®ï¼Œä½¿ä¹‹ä¸€è‡´ if (d.thickHeat.OrgBoltNo != d_last.thickHeat.OrgBoltNo) { - var thks_last = Common.MyMath.Move(d_last.thickHeat.Thicks, d.thickHeat.OrgBoltNo - d_last.thickHeat.OrgBoltNo); - - //转为 åŠ çƒæ£’æ•°é‡ - thks_last = Common.MyMath.ZoomOut(thks_last, BoltCnt / ChannelCnt); - - thickpercents_last = Common.MyMath.GetPercent(thks_last); + int z = d.thickHeat.Thicks.Count() / d.ThickPercents.Count(); + int move = (d.thickHeat.OrgBoltNo - d_last.thickHeat.OrgBoltNo) / z; + thickpercents_last = Common.MyMath.Move(d_last.ThickPercents, move); } else { thickpercents_last = d_last.ThickPercents; @@ -660,14 +696,14 @@ namespace FLY.FeedbackRenZiJia.Server #region å‚æ•° /// <summary> - /// 对ä½æŸ¥æ‰¾èŒƒå›´ 默认 ±120°, 最大值 180°,最å°å€¼ 50° + /// 对ä½æŸ¥æ‰¾èŒƒå›´ 默认 ±10区 /// </summary> - public int SearchAngleRange = 120; + public int SearchRange = 10; /// <summary> /// åŠ çƒç”Ÿæ•ˆæ›²çº¿,å…许为空,则ä¸ç”Ÿæ•ˆ /// </summary> - public int[] HeatEffectCurve; + public int[] HeatEffectCurve = new int[] { 3, 4, 7, 4, 3 }; /// <summary> @@ -678,13 +714,13 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// 对ä½æ¨¡å¼, åŠ çƒä¸ŽåŽšåº¦ç›¸å…³æ€§é˜€å€¼, 相关性 >=0.7 /// </summary> - public double ThresholdR = 0.7; + public double ThresholdR = 0.75; /// <summary> /// 对ä½æ¨¡å¼ 厚度%å·® çš„æžå·® >= +4%-4%=8%, å•ä½% /// </summary> - public int ThresholdMaxMin = 20; + public int ThresholdMaxMin = 30; /// <summary> diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCell.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCell.cs index 7abe84f23bf7c1d5e821be23578e537f8a976f6d..bbf3a53c7f7530a6e23637d7b57d9921e08709f7 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCell.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCell.cs @@ -28,13 +28,22 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// HeatOffset = ThickPercent * Kp /// </summary> - public double Kp { get; set; } = 3; + public double Kp { get; set; } = 2; + /// <summary> + /// 自动计算时,Kp最大值 + /// </summary> + public double MaxKp { get; set; } = 5; + + /// <summary> + /// 自动计算时,Kp最大值 + /// </summary> + public double MinKp { get; set; } = 1; /// <summary> /// 平滑的阀值,åªæœ‰è¶…出阀值,æ‰å¹³æ»‘ /// </summary> - public double ThresholdHeatSigma { get; set; } = 10; + public double ThresholdHeatSigma { get; set; } = 7; /// <summary> @@ -47,13 +56,22 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// 厚度控制线 , 厚度% 大于 厚度控制线 自动æ‰ä¼šåŠ çƒæŽ§åˆ¶ /// </summary> - public int CtrlLine { get; set; } = 2; + public double CtrlLine { get; set; } = 2; /// <summary> /// æœ€å¤§åŠ çƒé‡ 默认100% /// </summary> public int MaxHeat { get; set; } = 100; + /// <summary> + /// 分级控制线 + /// </summary> + public LvCtrlLine[] LvCtrlLines { get; set; } + + /// <summary> + /// 对厚度数æ®æ¨ªå‘平滑 å•ä½åŠ çƒæ£’数。 特别的当Smooth = ChannelCnt/2 就是膜泡的å心度 + /// </summary> + public int ThickSmoothRange { get; set; } = 5; #endregion #region çŠ¶æ€ @@ -65,7 +83,10 @@ namespace FLY.FeedbackRenZiJia.Server [DoNotCheckEquality] public double[] ThickPercents { get; set; } - + /// <summary> + /// å½“å‰ thickPercents æ··åˆæ•° + /// </summary> + public int CurrMix { get; set; } /// <summary> /// 当å‰æ–¹å‘çš„åŠ çƒç–略,必须ä¿è¯ 0~100 @@ -111,24 +132,8 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// è‡ªåŠ¨å¯¹ä½ /// </summary> - public bool IsAutoONo { get; set; } = true; + public bool IsAutoONo { get; set; } = false; - /// <summary> - /// 当å‰æ£åœ¨è‡ªåŠ¨å¯¹ä½æ¨¡å¼ - /// </summary> - public AutoONoStatusEnum AutoONoStatus { get; private set; } - /// <summary> - /// 自动对ä½æ¨¡å¼ ä¿¡æ¯ - /// </summary> - public string AutoONoMsg { get; private set; } - /// <summary> - /// è‡ªåŠ¨å¯¹ä½ é‚£å¹…ç©ºçš„å›¾ - /// </summary> - public long AutoONoId0 { get; private set; } = -1; - /// <summary> - /// è‡ªåŠ¨å¯¹ä½ åŠ çƒåŽç”Ÿæ•ˆçš„图 - /// </summary> - public long AutoONoId1 { get; private set; } = -1; #endregion #endregion @@ -159,7 +164,7 @@ namespace FLY.FeedbackRenZiJia.Server if (ThresholdHeatSigma < 1 || ThresholdHeatSigma > 50) { - ThresholdHeatSigma = 10; + ThresholdHeatSigma = 7; } if (CtrlLine < 0 || CtrlLine > 10) @@ -182,7 +187,7 @@ namespace FLY.FeedbackRenZiJia.Server //当å¤ä½åŒºå·æ”¹å˜äº†ï¼ŒåŒæ—¶ä¹Ÿä¿®æ”¹heatCell çš„ thickPercents if (e.PropertyName == nameof(this.blowingService.OrgBoltNo)) { if (mHeatBuf.MoveThickPercents(this.blowingService.OrgBoltNo)) - SetThickPercents(mHeatBuf.ThickPercents); + SetThickPercents(mHeatBuf.ThickPercents, mHeatBuf.MixCnt); } } @@ -198,235 +203,321 @@ namespace FLY.FeedbackRenZiJia.Server Heats = new int[ChannelCnt]; PreHeats = new int[ChannelCnt]; Offsets = new int[ChannelCnt]; - - ResetAuto(); } - /// <summary> - /// å¤ä½è‡ªåŠ¨çŠ¶æ€ - /// </summary> - public void ResetAuto() + bool IsKpDiff() { - AutoONoStatus = AutoONoStatusEnum.Init; - AutoONoMsg = "ç‰å¾… åŠ çƒ=0,厚度稳定"; - AutoONoId0 = -1; - AutoONoId1 = 0; - } - - void checkResetAuto() { - if (mHeatBuf.Stability != STABILITY.OK_CORREL) - return; - - if (Heats.All(h => h == 0)) + if (mHeatBuf.BestKp < Kp * 0.4) { - //åŠ çƒå…¨éƒ¨ä¸º0 - //å¤ä½çŠ¶æ€ - ResetAuto(); + //这个需è¦ä¸¥é‡è¦å‘Šï¼Œ Kp设得太大 + return true; + } + else if (mHeatBuf.BestKp > Kp * 3) + { + //这个Kp太å°äº†ï¼Œ æ示一次å§ï¼Œä¸ç„¶å¾ˆæ…¢ + return true; + } + else + { + + return false; } } - void AutoONoOnPoll() + bool IsONoDiff() { - checkResetAuto(); + if (Math.Abs(mHeatBuf.BestOrgBoltNo - blowingService.OrgBoltNo) > 0) + { + return true; + } + else + { + return false; + } + } + /// <summary> + /// 自动模å¼ï¼ï¼ï¼ï¼ï¼ + /// </summary> + public void Auto() + { + if (mHeatBuf.mData.Count() == 0) + return; - switch (AutoONoStatus) + + if (IsAutoONo) { - case AutoONoStatusEnum.Init: + if (mHeatBuf.HasMaxR) + { + if(IsONoDiff()) { - if (mHeatBuf.Stability != STABILITY.OK_CORREL) - break; - - if (Heats.All(h => h == 0)) - { - //判æ–当å‰åŠ çƒå…¨éƒ¨ä¸ºç©ºï¼Œ 且稳定性大于>0.7 - - //转为 åŠ çƒæ£’æ•°é‡ - double[] thickPercents = ThickPercents; + this.blowingService.PropertyChanged -= BlowingService_PropertyChanged; + blowingService.OrgBoltNo = mHeatBuf.BestOrgBoltNo; + //ä¸ä¿å˜ - double autoONoKp = Kp; - if (autoONoKp < 1) - autoONoKp = 1; - - int[] offsets = new int[ChannelCnt]; - while (true) - { - for (int i = 0; i < ChannelCnt; i++) - { - double percent = thickPercents[i]; - offsets[i] = (int)Math.Round(percent * autoONoKp); - } - - int[] heatPercents = offsets;//放大数é‡ä¸ºåˆ†åŒºé‡ - heatPercents = Common.MyMath.Filter(heatPercents, mHeatBuf.HeatEffectCurve);//平滑 - int maxMin = Common.MyMath.CalMaxMin(heatPercents); - - if (maxMin >= mHeatBuf.ThresholdMaxMin) - { - AutoONoStatus = AutoONoStatusEnum.Step2; - AutoONoMsg = "厚度已ç»ç¨³å®š,对ä½åŠ çƒ,ç‰å¾…结果"; - AutoONoId0 = mHeatBuf.mData.Last().thickHeat.ID; - AutoONoId1 = -1; - break; - } - else { - if (maxMin < 2) { - //肯定是厚度太好 - AutoONoStatus = AutoONoStatusEnum.Fail; - AutoONoMsg = "失败,åŠ çƒå˜åŒ–é‡å¤ªå°,转到æ£å¸¸æ¨¡å¼"; - AutoONoId0 = -1; - AutoONoId1 = -1; - return; - } - //åŠ çƒå˜åŒ–ä¸å¤Ÿå¤šï¼Œ å˜å¤§Kp - double k = autoONoKp * mHeatBuf.ThresholdMaxMin / maxMin - autoONoKp; - if (k < 0.5) - k = 0.5; - autoONoKp += k; - } - } + this.blowingService.PropertyChanged += BlowingService_PropertyChanged; - Offsets = offsets; - - UpdatePreHeats();//è¿™å¥ä¸€å®šè¦åŠ ï¼ï¼ï¼ï¼ ä¸ç„¶æ²¡æ³•å¹³æ»‘ï¼Œæ²¡æ³•åŠ çƒ - - //上é¢å·²ç»æœ‰å¹³æ»‘,ä¸éœ€è¦å†æ‰§è¡Œ Smooth() - - ModifyBase(); + mHeatBuf.SetToBestThickPercents(); + SetThickPercents(mHeatBuf.ThickPercents, mHeatBuf.MixCnt); + + } - HeatApply(); - } + if(IsKpDiff()) + { + if (mHeatBuf.BestKp > MaxKp) + Kp = MaxKp; + else if (mHeatBuf.BestKp < MinKp) + Kp = MinKp; else - { - //虽然稳定了,但已ç»è¢«äººåŠ çƒäº†ï¼Œæ— 法å¯åŠ¨å¯¹ä½æ¨¡å¼ - AutoONoStatus = AutoONoStatusEnum.Fail; - AutoONoMsg = "åŠ çƒä¸ä¸º0,æ— æ³•å¯åŠ¨å¯¹ä½æ¨¡å¼"; - return; - } + Kp = mHeatBuf.BestKp; + //ä¸ä¿å˜ } - break; - case AutoONoStatusEnum.Step2: - { - //ä¸éœ€è¦ç‰ STABILITY.OK_CORREL - if (mHeatBuf.MaxR_Id1 == mHeatBuf.mData.Last().thickHeat.ID)//算出结果 - { - string msg = "对ä½å®Œæˆ"; - msg += $",[相关性]{mHeatBuf.MaxR:F2}"; - msg += $",[æžå·®]{mHeatBuf.MaxMin}%"; - if (blowingService.OrgBoltNo != mHeatBuf.BestOrgBoltNo) - { - //调节 mHeatBuf.ThickPercents 移动到 mHeatBuf.BestOrgBoltNo - //使mHeatBuf状æ€ä¸ºç¨³å®š - mHeatBuf.SetToBestThickPercents(); - SetThickPercents(mHeatBuf.ThickPercents); + } + } + if (mHeatBuf.Stability == STABILITY.OK_CORREL)//稳定 与 待定时 åŠ çƒ + { + - msg += $",[å¤ä½å·]{blowingService.OrgBoltNo}->{mHeatBuf.BestOrgBoltNo}"; - blowingService.OrgBoltNo = mHeatBuf.BestOrgBoltNo; - blowingService.Apply(); - } - else - { - msg += $",[å¤ä½å·]æ£ç¡®"; - } + int[] offsets; + bool toAutoONoHeat = false; + if (IsAutoONo && Heats.All(h => h == Heats[0])) + { + //全部为相åŒ, 对ä½åŠ çƒï¼ï¼ï¼ + offsets = SetHeatForAutoONo(); + toAutoONoHeat = true; + } + else + { + var thickPercents = ThickPercents;//肯定没有 double.NaN + double ctrlLine = getCtrlLine(CurrMix); + offsets = new int[ChannelCnt]; - if (Math.Abs(Kp - mHeatBuf.BestKp) > 0.2) - { - msg += $",[Kp]{Kp:F1}->{mHeatBuf.BestKp:F1}"; - Kp = mHeatBuf.BestKp; - Apply(); - } - else - { - msg += $",[Kp]æ£ç¡®"; - } - //对ä½å®Œæˆ - AutoONoStatus = AutoONoStatusEnum.Success; - AutoONoMsg = msg; - AutoONoId0 = mHeatBuf.MaxR_Id0; - AutoONoId1 = mHeatBuf.MaxR_Id1; - return; - } - else - { - if (AutoONoId0 < mHeatBuf.mData.First().thickHeat.ID) - { - //失败,对ä½è¿‡ç¨‹æœ‰å¤§æ³¢åŠ¨, 全部数æ®è¢«æ¸…除? - AutoONoStatus = AutoONoStatusEnum.Fail; - AutoONoMsg = "失败,对ä½è¿‡ç¨‹æœ‰å¤§æ³¢åŠ¨"; - return; - } + //获å–ç›®æ ‡çº¿ã€‚ æ£å¸¸å…¨éƒ¨éƒ½æ˜¯0 + var targets = getTargets(thickPercents, ctrlLine); - //æ•°æ®ç¨³å®šäº†ï¼Œä¸”åŠ çƒå˜åŒ–é‡ä¸º0 - if (mHeatBuf.Stability == STABILITY.OK_CORREL && mHeatBuf.LastHeatDiffMaxMin == 0) + int range5 = 5; + for (int i = 0; i < ChannelCnt; i++) + { + double delta = (thickPercents[i] - targets[i]); + + if (Math.Abs(delta) > ctrlLine) + { + //这个点,åŠé™„近,都需è¦è°ƒèŠ‚, 附近为±2 + for (int j = 0; j < range5; j++) { - //æ•°æ®ç¨³å®šäº†, 但没有出结果ï¼ï¼ï¼ï¼ï¼ - AutoONoStatus = AutoONoStatusEnum.Fail; - AutoONoMsg = "失败,对ä½åŠ çƒç›¸å…³æ€§ä¸å¤Ÿ"; - return; + int index = i - range5 / 2 + j; + if (index < 0) index += ChannelCnt; + else if (index >= ChannelCnt) index -= ChannelCnt; + offsets[index] = (int)calOffset(delta, ctrlLine, Kp); } } } - break; + } + + Offsets = offsets; + UpdatePreHeats();//è¿™å¥ä¸€å®šè¦åŠ ï¼ï¼ï¼ï¼ ä¸ç„¶æ²¡æ³•å¹³æ»‘ï¼Œæ²¡æ³•åŠ çƒ + + if (toAutoONoHeat) + { + + } + else + { + if (!IsForbidUpDown)//ç¦æ¢æ•´ä½“ä¸Šç§»ä¸‹é™ + ModifyBase();//è‡ªåŠ¨æ•´ä½“ä¸Šç§»ä¸‹é™ + + Smooth();//平滑,它会导致Offset被修改,<0çš„éƒ½è¢«åˆ é™¤æŽ‰ + } + HeatApply();//æ‰§è¡ŒåŠ çƒ } } - /// <summary> - /// 自动模å¼ï¼ï¼ï¼ï¼ï¼ - /// </summary> - public void Auto() + List<Range> getSignList(double[] thickPercents) { - if (mHeatBuf.mData.Count() == 0) - return; - //&& mHeatBuf.IsStable() + List<Range> signList = new List<Range>(); + bool sign0 = thickPercents[0] > 0; + bool last_sign = sign0; + signList.Add(new Range() { Begin = 0, End = 0 }); - - if (IsAutoONo) + for (int i = 1; i < ChannelCnt; i++) { - AutoONoOnPoll(); + bool sign = thickPercents[i] > 0; + if (sign == last_sign) + signList.Last().End = i; + else + { + signList.Add(new Range() { Begin = i, End = i }); + } + last_sign = sign; + } + if (last_sign == sign0) + { + //最åŽä¸€ä¸ªï¼Œä¸Žç¬¬1个,å¯ä»¥åˆä½“ + signList.First().Begin = signList.Last().Begin - ChannelCnt; + signList.RemoveAt(signList.Count() - 1); } + return signList; + } + void setTargets(double[] targets, double target, int index, int range) + { + for (int j = 0; j < range; j++) + { + int idx = index - range / 2 + j; + if (idx < 0) idx += ChannelCnt; + else if (idx >= ChannelCnt) idx -= ChannelCnt; + targets[idx] = target; + } + } + double[] getTargets(double[] thickPercents, double ctrlLine) + { + int range6 = 6; + int range3 = 3; + var signList = getSignList(thickPercents); + signList = signList.FindAll(s => s.Width >= range6); - if ( - (!IsAutoONo) - || ((IsAutoONo) && (AutoONoStatus == AutoONoStatusEnum.Fail || AutoONoStatus == AutoONoStatusEnum.Success)) - ) + double[] targets = new double[ChannelCnt]; + foreach (var r in signList) { - if (mHeatBuf.Stability == STABILITY.OK_CORREL)//稳定 与 待定时 åŠ çƒ + int i = r.Mid; + if (i < 0)//第0段,Begin 为负数。 所以需è¦åˆ¤æ– + i += ChannelCnt; + if (thickPercents[i] > 0) + { + setTargets(targets, -ctrlLine, i, range3); + } + else { - //转为 åŠ çƒæ£’æ•°é‡ - var thickPercents = ThickPercents; + setTargets(targets, ctrlLine, i, range3); + } + } + return targets; + } + bool IsLvCtrlLinesValid() + { + if (LvCtrlLines != null && LvCtrlLines.Count() > 0 && LvCtrlLines.All(lv => lv != null)) + { + return true; + } + return false; + } + double calOffset(double delta, double ctrlLine, double kp) + { + double d = Math.Abs(delta); - int[] offsets = new int[ChannelCnt]; - for (int i = 0; i < ChannelCnt; i++) + if (d >= ctrlLine) + { + + } + else if (d >= ctrlLine * 2 / 3) + { + d = (d - ctrlLine * 2 / 3) * 2 + (ctrlLine * 1 / 3); + } + else if (d >= ctrlLine * 1 / 3) + { + d = (d - ctrlLine * 1 / 3) * 1 + (ctrlLine * 0 / 3); + } + else + { + d = 0; + } + double offset = d * kp; + return delta >= 0 ? offset : -offset; + } + double getCtrlLine(int currMix) + { + double ctrlLine = CtrlLine; + if (IsLvCtrlLinesValid()) + { + for (int i = 0; i < LvCtrlLines.Count(); i++) + { + int index = LvCtrlLines.Count() - 1 - i; + if (currMix >= LvCtrlLines[index].Mix) { - if (mHeatBuf.BoltIsStable[i] && //稳定 - (Math.Abs(thickPercents[i]) > CtrlLine))//在控制线已外 - { - offsets[i] = (int)Math.Round(thickPercents[i] * Kp); - } + ctrlLine = LvCtrlLines[index].CtrlLine; + break; } + } + } + return ctrlLine; + } + int[] SetHeatForAutoONo() + { + //转为 åŠ çƒæ£’æ•°é‡ + var thickPercents = ThickPercents; + var offsets = new int[ChannelCnt]; + //æ‰¾åˆ°æœ€åŽšçš„ç‚¹ï¼ŒåŠ çƒä¸º 最å°åŠ çƒé‡æžå·®ï¼Œ 这个点å¯èƒ½å°äºŽæŽ§åˆ¶çº¿ï¼Œä¸ç®¡å®ƒ + int max_i = -1; + double max_thkP = -1; - Offsets = offsets; - UpdatePreHeats();//è¿™å¥ä¸€å®šè¦åŠ ï¼ï¼ï¼ï¼ ä¸ç„¶æ²¡æ³•å¹³æ»‘ï¼Œæ²¡æ³•åŠ çƒ - - if (!IsForbidUpDown)//ç¦æ¢æ•´ä½“ä¸Šç§»ä¸‹é™ - ModifyBase();//è‡ªåŠ¨æ•´ä½“ä¸Šç§»ä¸‹é™ - - Smooth();//平滑,它会导致Offset被修改,<0çš„éƒ½è¢«åˆ é™¤æŽ‰ + for (int i = 0; i < ChannelCnt; i++) + { + if (max_i == -1 || thickPercents[i] > Math.Abs(max_thkP)) + { + max_thkP = thickPercents[i]; + max_i = i; + } + } + + int range_i = 2;//最少也è¦5ä¸ªåŠ çƒæ£’, 最多 9 + + //把 max_i 范围 大于 控制线 çš„ 都设置为 最å°åŠ çƒé‡æžå·® + for (int i = range_i + 1; i < 5; i++) + { + int begin_i = max_i - i; + if (begin_i < 0) begin_i += ChannelCnt; + + int end_i = max_i + i; + if (end_i >= ChannelCnt) end_i -= ChannelCnt; - HeatApply();//æ‰§è¡ŒåŠ çƒ + if ((thickPercents[begin_i] > CtrlLine) && (thickPercents[end_i] > CtrlLine)) + { + //ç»§ç» + range_i = i; + } + else + { + break; } } - } + //offsets[max_i] = mHeatBuf.ThresholdMaxMin; + for (int i = 0; i < range_i * 2 + 1; i++) + { + int index = max_i - range_i + i; + if (index < 0) index += ChannelCnt; + else if (index >= ChannelCnt) index -= ChannelCnt; - public void SetThickPercents(double[] thkpercents) + offsets[index] = mHeatBuf.ThresholdMaxMin + 10; + } + return offsets; + } + public void SetThickPercents(double[] thkpercents, int mix) { + CurrMix = mix; thkpercents = MakeThickPercentsFull(thkpercents); - for (int i = 0; i < thkpercents.Count(); i++) - thkpercents[i] = Math.Round(thkpercents[i], 2); - ThickPercents = thkpercents; + + //æ•°æ®æ¨ªå‘平滑 + double[] thkpercents2 = new double[ChannelCnt]; + for (int i = 0; i < ChannelCnt; i++) + { + double sum = 0; + for (int j = 0; j < ThickSmoothRange; j++) + { + int idx = i - ThickSmoothRange / 2 + j; + if (idx < 0) + idx += ChannelCnt; + else if (idx >= ChannelCnt) + idx -= ChannelCnt; + + sum += thkpercents[idx]; + } + sum /=ThickSmoothRange; + thkpercents2[i] = Math.Round(sum, 2); + } + + ThickPercents = thkpercents2; } #region IHeatCell æŽ¥å£ æˆå‘˜å‡½æ•° @@ -801,8 +892,8 @@ namespace FLY.FeedbackRenZiJia.Server Heats[i] = heat; } - NotifyPropertyChanged("Offsets"); - NotifyPropertyChanged("Heats"); + NotifyPropertyChanged(nameof(Offsets)); + NotifyPropertyChanged(nameof(Heats)); Base = 0; AfterHeatApplyEvent?.Invoke(this); @@ -894,23 +985,43 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// HeatOffset = ThickPercent * Kp /// </summary> - public double Kp= 3; + public double Kp = 2; + /// <summary> + /// 自动计算时,Kp最大值 + /// </summary> + public double MaxKp= 5; + + /// <summary> + /// 自动计算时,Kp最大值 + /// </summary> + public double MinKp = 1; + /// <summary> /// è‡ªåŠ¨å¯¹ä½ /// </summary> - public bool IsAutoONo = true; + public bool IsAutoONo = false; /// <summary> /// æœ€å¤§åŠ çƒé‡ /// </summary> public int MaxHeat = 100; + /// <summary> + /// 分级控制线 + /// </summary> + public LvCtrlLine[] LvCtrlLines; + + /// <summary> + /// 对厚度数æ®æ¨ªå‘平滑 å•ä½åŠ çƒæ£’数。 特别的当Smooth = ChannelCnt/2 就是膜泡的å心度 + /// </summary> + public int ThickSmoothRange = 5; + /// <summary> /// 平滑的阀值,åªæœ‰è¶…出阀值,æ‰å¹³æ»‘ /// </summary> - public double ThresholdHeatSigma= 10; + public double ThresholdHeatSigma= 7; /// <summary> @@ -923,7 +1034,7 @@ namespace FLY.FeedbackRenZiJia.Server /// <summary> /// 厚度控制线 , 厚度% 大于 厚度控制线 自动æ‰ä¼šåŠ çƒæŽ§åˆ¶ /// </summary> - public int CtrlLine= 2; + public double CtrlLine= 2; diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCheck.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCheck.cs index fcf702a26595da82364b4e18c0d63d5ee0bfdc32..456473c43bd0024e963a6f71a2af3c069111bced 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCheck.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCheck.cs @@ -203,7 +203,7 @@ namespace FLY.FeedbackRenZiJia.Server private void HeatCheck_PropertyChanged(object sender, PropertyChangedEventArgs e) { - if (e.PropertyName == "Enable") + if (e.PropertyName == nameof(Enable)) { if (Enable) Start(); @@ -214,7 +214,7 @@ namespace FLY.FeedbackRenZiJia.Server void mHeatCell_PropertyChanged(object sender, PropertyChangedEventArgs e) { - if (e.PropertyName == "ChannelCnt") + if (e.PropertyName == nameof(mHeatCell.ChannelCnt)) { Init(); Load(); @@ -236,7 +236,7 @@ namespace FLY.FeedbackRenZiJia.Server CheckStep = 0; counter = 0; Array.Clear(Bads, 0, Bads.Count()); - NotifyPropertyChanged("Bads"); + NotifyPropertyChanged(nameof(Bads)); OpenCircuit = false; PowerOff = false; ShortCircuit = false; @@ -269,7 +269,7 @@ namespace FLY.FeedbackRenZiJia.Server else Bads[i] = false; } - NotifyPropertyChanged("Bads"); + NotifyPropertyChanged(nameof(Bads)); OpenCircuit = Bads.Any(b => b); } diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/Model/HistoryDB.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/Model/HistoryDB.cs index 83ccb35691fb01c246a74edd169669e224d1b5d8..feecb69fd83b3bfd5efc2b60915a13c69768252b 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/Model/HistoryDB.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/Model/HistoryDB.cs @@ -54,7 +54,7 @@ namespace FLY.FeedbackRenZiJia.Server.Model public void GetFrame(long Id, AsyncCBHandler asyncDelegate, object asyncContext) { GetFrameReponse reponse = new GetFrameReponse(); - reponse.Id = Id; + reponse.id = Id; Task.Factory.StartNew(() => { @@ -139,5 +139,88 @@ namespace FLY.FeedbackRenZiJia.Server.Model asyncDelegate(asyncContext, reponse); } + + /// <summary> + /// 以Id为起始点, å‘å‰æˆ–者å‘åŽèŽ·å–最近通é“改å˜æ—¶é—´ä¸ç›¸åŒçš„æ•°æ® æˆ– èµ·æ•ˆæ•°æ® + /// </summary> + /// <param name="id"></param> + /// <param name="isPre">å‘å‰</param> + /// <param name="isTakeEffect">æ•°æ®èµ·æ•ˆ</param> + /// <param name="isDiffHTime">åŠ çƒä¸åŒ</param> + /// <param name="asyncDelegate"></param> + /// <param name="asyncContext"></param> + //[Call(typeof(GetFrameReponse))] + public async void GetFrameAdv(long id, bool isPre, bool isTakeEffect, bool isDiffHTime, AsyncCBHandler asyncDelegate, object asyncContext) + { + var reponse = new GetFrameReponse(); + reponse.id = id; + + //会慢,需è¦åˆ†ä¸ªçº¿ç¨‹ç‹¬ç«‹åšè¿™äº‹ + await Task.Factory.StartNew(() => + { + if (id <= 0) + { + //先获å–真实ID + string sql = + $"SELECT {nameof(Db_ThickHeat.ID)} FROM { dbModel.TbThickHeat.TableName}" + + $" ORDER BY {nameof(Db_ThickHeat.ID)} DESC" + + $" LIMIT 1 OFFSET {-id}"; + var ret = dbModel.sqliteHelper.ExecuteScalar(sql); + if (ret == DBNull.Value) + return; + + id = Convert.ToInt32(ret); + } + + string ctime_str = ""; + if (isDiffHTime) + { + DateTime ctime; + //获å–对应ID çš„ 通é“改å˜æ—¶é—´ + { + string sql = + $"SELECT {nameof(Db_ThickHeat.HTime)} FROM { dbModel.TbThickHeat.TableName}" + + $" WHERE {nameof(Db_ThickHeat.ID)} = {id}"; + var ret = dbModel.sqliteHelper.ExecuteScalar(sql); + if (ret == DBNull.Value) + return; + + ctime = Convert.ToDateTime(ret); + } + ctime_str = ctime.ToStringOfSQLiteFieldType(); + } + + List<Db_ThickHeat> db_thickHeats = null; + { + string condition = ""; + string symbol = isPre ? "<" : ">"; + condition += $"WHERE {nameof(Db_ThickHeat.ID)}{symbol}{id}"; + if (isDiffHTime) + condition += $" AND {nameof(Db_ThickHeat.HTime)}<>{ctime_str}"; + + if (isTakeEffect) + condition += $" AND {nameof(Db_ThickHeat.IsStable)}=TRUE"; + + condition += $" ORDER BY {nameof(Db_ThickHeat.ID)}"; + if (isPre) + condition += " DESC"; + + condition += " LIMIT 1"; + + db_thickHeats = dbModel.TbThickHeat.Find(condition); + } + + if (db_thickHeats.Count() == 0) + { + return; + } + + var lc_thickHeat = Lc_AutoMapperProfile.Mapper.Map<Lc_ThickHeat>(db_thickHeats.First()); + + reponse.thickHeat = lc_thickHeat; + }); + + asyncDelegate(asyncContext, reponse); + } } } diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PLCLink.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PLCLink.cs index 10328815b561a66cfada361254b0c4e77e1cc131..594d741b377557cc6174bdaa7d10dc7ea5dfe8ea 100644 --- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PLCLink.cs +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PLCLink.cs @@ -40,17 +40,6 @@ namespace FLY.FeedbackRenZiJia.Server /// </summary> public TimeSpan ActUpdateInterval { get; private set; } - - /// <summary> - /// åŠ çƒé€šé“æ•° - /// </summary> - [DoNotCheckEquality] - public UInt16 ChannelCnt { get; set; } - /// <summary> - /// åŠ çƒé‡æ›´æ–° - /// </summary> - [DoNotCheckEquality] - public UInt16 HeatUpdate { get; set; } /// <summary> /// 当å‰ç”µæµ 有没? @@ -65,8 +54,7 @@ namespace FLY.FeedbackRenZiJia.Server /// </summary> public UInt16 HeatUpdate_R { get; private set; } - public int Errno { get; set; } = -1; - + public bool IsConnected { get; private set; } public event PropertyChangedEventHandler PropertyChanged; @@ -84,7 +72,6 @@ namespace FLY.FeedbackRenZiJia.Server public PLCLink(IPEndPoint ep) { mclient = new Modbus.WithThread.ClientTCP(ep); - this.PropertyChanged += PLCLink_PropertyChanged; } class RegWrite @@ -102,30 +89,31 @@ namespace FLY.FeedbackRenZiJia.Server } List<RegWrite> rws = new List<RegWrite>(); - - private void PLCLink_PropertyChanged(object sender, PropertyChangedEventArgs e) + public void SetChannelCnt(UInt16 channelCnt) { - if (e.PropertyName == "ChannelCnt") + if (!IsConnected) + return; + + //D200 4x201 通é“æ•°é‡ + RegWrite regWrite = new RegWrite(PLCAddressArea.Register, 200, new UInt16[] { channelCnt }); + lock (rws) { - //D200 4x201 通é“æ•°é‡ - RegWrite regWrite = new RegWrite(PLCAddressArea.Register, 200, new UInt16[] { ChannelCnt }); - lock (rws) - { - rws.Add(regWrite); - } + rws.Add(regWrite); } - else if (e.PropertyName == "HeatUpdate") + } + public void SetHeatUpdate(UInt16 heatUpdate) + { + if (!IsConnected) + return; + + //D201 4x202 设置值 æ›´æ–° + RegWrite regWrite = new RegWrite(PLCAddressArea.Register, 201, new UInt16[] { heatUpdate }); + lock (rws) { - //D201 4x202 设置值 æ›´æ–° - RegWrite regWrite = new RegWrite(PLCAddressArea.Register, 201, new UInt16[] { HeatUpdate }); - lock (rws) - { - rws.Add(regWrite); - } + rws.Add(regWrite); } } - public void Start() { lock (this) @@ -196,9 +184,9 @@ namespace FLY.FeedbackRenZiJia.Server goto _error;//连接æ–开,终æ¢æ›´æ–°çº¿ç¨‹ } - + IsConnected = true; } - + //è¾“å‡ºå†™å…¥æ•°æ® if (!UpdateWriteData()) { @@ -207,18 +195,18 @@ namespace FLY.FeedbackRenZiJia.Server goto _error;//连接æ–开,终æ¢æ›´æ–°çº¿ç¨‹ } - Errno = 0; + Thread.Sleep(30); } _error: - Errno = -1; + IsConnected = false; ErrorCnt++; goto _connect; _end: mclient.Close(); - Errno = -1; + IsConnected = true; IsRunning = false; } @@ -236,7 +224,7 @@ namespace FLY.FeedbackRenZiJia.Server return false; HeatUpdate_R = values2.ElementAt(0); - + return true; } @@ -270,6 +258,9 @@ namespace FLY.FeedbackRenZiJia.Server /// <param name="values"></param> public void SetHeat(IEnumerable<UInt16> values) { + if (!IsConnected) + return; + UInt16[] buf = values.ToArray(); List<RegWrite> writes = new List<RegWrite>(); //D400 4x401 设置值 160个 @@ -285,7 +276,7 @@ namespace FLY.FeedbackRenZiJia.Server cnt1 = MaxRegsOfOneRead; UInt16[] buf1 = new UInt16[cnt1]; Array.Copy(buf, offset, buf1, 0, cnt1); - RegWrite rw = new RegWrite(PLCAddressArea.Register, addr+offset, buf1); + RegWrite rw = new RegWrite(PLCAddressArea.Register, addr + offset, buf1); writes.Add(rw); offset += cnt1; cnt -= cnt1; diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PlcLinkExt.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PlcLinkExt.cs new file mode 100644 index 0000000000000000000000000000000000000000..3123ee75fa17a5d04e7b3d60a8c90154dc1f509b --- /dev/null +++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PlcLinkExt.cs @@ -0,0 +1,176 @@ +using FLY.FeedbackRenZiJia.IService; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Threading; + +namespace FLY.FeedbackRenZiJia.Server +{ + /// <summary> + /// PlcLink åªæœ‰ 1~100, 最å°å•ä½1, 扩展它, 1~100, 最å°å•ä½ 0.1 + /// </summary> + public class PlcLinkExt : IPlcLinkExt + { + /// <summary> + /// æ¯é¢—粒时间 5s + /// </summary> + const int CellSec = 3; + + /// <summary> + /// å 空比,总颗粒数 + /// </summary> + const int DutyCount = 10; + + int channelCnt = 96; + double[] heats; + + + /// <summary> + /// 当å‰ç”µæµ 有没? + /// </summary> + public bool HasElectricity { get; private set; } + /// <summary> + /// 风机是å¦å¯åŠ¨ï¼Ÿ + /// </summary> + public bool HasFan { get; private set; } + + public bool IsConnected { get; private set; } + + public event PropertyChangedEventHandler PropertyChanged; + + IPLCLink plcLink; + DispatcherTimer timer; + Stopwatch stopwatch; + int dutyIndex = 0; + public PlcLinkExt() + { + + } + public void Init(IPLCLink plcLink) + { + this.plcLink = plcLink; + + Misc.BindingOperations.SetBinding(plcLink, nameof(plcLink.IsConnected), this, nameof(IsConnected)); + Misc.BindingOperations.SetBinding(plcLink, nameof(plcLink.HasElectricity), this, nameof(HasElectricity)); + Misc.BindingOperations.SetBinding(plcLink, nameof(plcLink.HasFan), this, nameof(HasFan)); + + + + this.PropertyChanged += PlcLinkExt_PropertyChanged; + timer = new DispatcherTimer(); + timer.Interval = TimeSpan.FromSeconds(1); + timer.Tick += Timer_Tick; + + stopwatch = new Stopwatch(); + + if (plcLink.IsConnected) + { + //刚连上,把 之å‰çš„æ•°æ®éƒ½é‡æ–°å‘给它。 + plcLink.SetChannelCnt((UInt16)channelCnt); + DutyStart(); + } + } + + void DutyStart() + { + stopwatch.Restart(); + timer.Start(); + dutyIndex = 0; + setHeats(); + } + void DutyStop() + { + stopwatch.Stop(); + timer.Stop(); + } + void setHeats() + { + if (!plcLink.IsConnected) + return; + if (heats == null) + return; + + UInt16[] plcHeats = heats.Select(h => + { + int h_int = (int)h; + int v = (int)((h - h_int) * DutyCount); + if (v > dutyIndex) + { + return (UInt16)(h_int + 1); + } + else + { + return (UInt16)h_int; + } + + }).ToArray(); + + plcLink.SetHeat(plcHeats); + + UInt16 heatupdate = (UInt16)(plcLink.HeatUpdate_R + 1); + if (heatupdate > 100) + heatupdate = 1; + plcLink.SetHeatUpdate(heatupdate); + } + + private void Timer_Tick(object sender, EventArgs e) + { + if (stopwatch.Elapsed < TimeSpan.FromSeconds(CellSec)) + { + return; + } + + stopwatch.Restart(); + + setHeats(); + dutyIndex++; + if (dutyIndex > DutyCount) + dutyIndex = 0; + } + + private void PlcLinkExt_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(plcLink.IsConnected)) + { + if (plcLink.IsConnected) + { + //刚连上,把 之å‰çš„æ•°æ®éƒ½é‡æ–°å‘给它。 + plcLink.SetChannelCnt((UInt16)channelCnt); + DutyStart(); + } + else + { + DutyStop(); + } + } + } + + public void SetChannelCnt(int channelCnt) + { + this.channelCnt = channelCnt; + plcLink.SetChannelCnt((UInt16)channelCnt); + } + + /// <summary> + /// è®¾ç½®åŠ çƒé‡ + /// </summary> + /// <param name="values"></param> + public void SetHeats(IEnumerable<double> values) + { + heats = values.Select(h => + { + if (h < 0) h = 0; + else if (h > 100) h = 100; + return h; + }).ToArray(); + + setHeats(); + } + + + } +} diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Client/Properties/AssemblyInfo.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Client/Properties/AssemblyInfo.cs index cb9666c28f869b7c8aefccd1a546cb4e7f2b043e..21c28197acf2d4f283fc55ab2e24c1accea16277 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Client/Properties/AssemblyInfo.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Client/Properties/AssemblyInfo.cs @@ -51,6 +51,6 @@ using System.Windows; //å¯ä»¥æŒ‡å®šæ‰€æœ‰è¿™äº›å€¼ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨â€œç”Ÿæˆå·â€å’Œâ€œä¿®è®¢å·â€çš„默认值 //通过使用 "*",如下所示: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("7.0.7")] -[assembly: AssemblyFileVersion("7.0.7")] +[assembly: AssemblyVersion("7.4.0")] +[assembly: AssemblyFileVersion("7.4.0")] [assembly: Guid("D12087A7-EEC4-4D9F-9269-8F20324F4B04")] diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Server/Properties/AssemblyInfo.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Server/Properties/AssemblyInfo.cs index 11b34f890ad5c66a2de76efd03407d6adbffc66f..04de182f8d2ba160d969d5baa78109f36b8c9f2b 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Server/Properties/AssemblyInfo.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Server/Properties/AssemblyInfo.cs @@ -51,6 +51,6 @@ using System.Windows; // å¯ä»¥æŒ‡å®šæ‰€æœ‰è¿™äº›å€¼ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨â€œå†…部版本å·â€å’Œâ€œä¿®è®¢å·â€çš„默认值, // 方法是按如下所示使用“*â€: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("7.0.9")] -[assembly: AssemblyFileVersion("7.0.9")] +[assembly: AssemblyVersion("7.1.0")] +[assembly: AssemblyFileVersion("7.1.0")] [assembly: Guid("72FBA808-FA10-43BF-8504-C6E814E031E7")] diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/FLY.Thick.Blowing.UI.csproj b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/FLY.Thick.Blowing.UI.csproj index af3ffcf563d385409b531a9a45f6cf9215cd5934..202adc034757eff6ab7fbeb977f793f256f78ff1 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/FLY.Thick.Blowing.UI.csproj +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/FLY.Thick.Blowing.UI.csproj @@ -176,14 +176,22 @@ <Compile Include="UiModule\TrendGraph2\TrendGraph2.xaml.cs"> <DependentUpon>TrendGraph2.xaml</DependentUpon> </Compile> - <Compile Include="UiModule\TrendGraph2\TrendGraphConfig2.xaml.cs"> - <DependentUpon>TrendGraphConfig2.xaml</DependentUpon> + <Compile Include="UiModule\TrendGraph2\TrendGraph2Config.xaml.cs"> + <DependentUpon>TrendGraph2Config.xaml</DependentUpon> </Compile> - <Compile Include="UiModule\TrendGraph2\TrendGraphItemParam2.cs" /> - <Compile Include="UiModule\TrendGraph2\TrendGraphParam2s.cs" /> - <Compile Include="UiModule\TrendGraph2\TrendGraphVm2.cs" /> - <Compile Include="UiModule\TrendGraph2\TrendGraphVm2Ut.cs" /> - <Compile Include="UiModule\TrendGraph2\UiModule2_TrendGraph.cs" /> + <Compile Include="UiModule\TrendGraph2\TrendGraph2Vm.cs" /> + <Compile Include="UiModule\TrendGraph2\UiModule2_TrendGraph2.cs" /> + <Compile Include="UiModule\TrendGraph\TrendGraph.xaml.cs"> + <DependentUpon>TrendGraph.xaml</DependentUpon> + </Compile> + <Compile Include="UiModule\TrendGraph\TrendGraphConfig.xaml.cs"> + <DependentUpon>TrendGraphConfig.xaml</DependentUpon> + </Compile> + <Compile Include="UiModule\TrendGraph\TrendGraphItemParam.cs" /> + <Compile Include="UiModule\TrendGraph\TrendGraphParams.cs" /> + <Compile Include="UiModule\TrendGraph\TrendGraphVm.cs" /> + <Compile Include="UiModule\TrendGraph\TrendGraphVmUt.cs" /> + <Compile Include="UiModule\TrendGraph\UiModule2_TrendGraph.cs" /> <Page Include="App.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> @@ -268,7 +276,15 @@ <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> </Page> - <Page Include="UiModule\TrendGraph2\TrendGraphConfig2.xaml"> + <Page Include="UiModule\TrendGraph2\TrendGraph2Config.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> + <Page Include="UiModule\TrendGraph\TrendGraph.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> + <Page Include="UiModule\TrendGraph\TrendGraphConfig.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> </Page> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Colors.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Colors.xaml index 6f28dc0460c7d4b34ff7a6691e5debb6ec385eec..98d114019dba93c4db23ade590a48d1e617710eb 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Colors.xaml +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Colors.xaml @@ -17,10 +17,12 @@ <!--MahApps.Brushes.Accent--> <SolidColorBrush x:Key="Brushes.ChartArea0" Color="#CC60A917" /> <!--MahApps.Brushes.ValidationSummary4--> - <SolidColorBrush x:Key="Brushes.ChartArea1" Color="#CCFDC8C8"/> + <SolidColorBrush x:Key="Brushes.ChartArea1" Color="#cce5004f"/> + <!--#cceb6100"--> + <!--MahApps.Brushes.ValidationSummary2--> - <SolidColorBrush x:Key="Brushes.ChartArea2" Color="#CCCA000C" /> - + <SolidColorBrush x:Key="Brushes.ChartArea2" Color="#CCa40000" /> + <SolidColorBrush x:Key="Brushes.ChartArea3" Color="#CCA59F93" /> <SolidColorBrush x:Key="Brushes.ChartArea4" Color="#22000000" /> @@ -28,9 +30,9 @@ <!--MahApps.Brushes.Accent--> <SolidColorBrush x:Key="Brushes.ChartAxisLabel0" Color="#FF60A917" /> <!--MahApps.Brushes.ValidationSummary5--> - <SolidColorBrush x:Key="Brushes.ChartAxisLabel1" Color="#FFFD7070"/> + <SolidColorBrush x:Key="Brushes.ChartAxisLabel1" Color="#FFe5004f"/> <!--#FFFD7070--> <!--MahApps.Brushes.ValidationSummary2--> - <SolidColorBrush x:Key="Brushes.ChartAxisLabel2" Color="#FFCA000C" /> + <SolidColorBrush x:Key="Brushes.ChartAxisLabel2" Color="#FFa40000" /> <!--#FFCA000C--> <SolidColorBrush x:Key="Brushes.ChartAxisLabel3" Color="#FFA59F93" /> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Styles.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Styles.xaml index 2dd166a6c55fe328a4ad10163c95d9039e2f45a6..8c301d6a30bcc07bd301fc59462404ece58bb005 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Styles.xaml +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Styles.xaml @@ -3,17 +3,10 @@ xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" > <ResourceDictionary.MergedDictionaries> - <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/> - <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/> + <!--<ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/> + <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/>--> + <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Themes/Styles.xaml"/> + <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Themes/GraphStyle.xaml"/> </ResourceDictionary.MergedDictionaries> - <!--扫æ图,纵å‘趋势图Yè½´ æ ‡ç¾--> - <Style x:Key="AxisSectionStyle" TargetType="lvc:AxisSection" > - <Setter Property="StrokeThickness" Value="1"/> - <Setter Property="DataLabel" Value="True"/> - <Setter Property="DisableAnimations" Value="True"/> - <Setter Property="DataLabelForeground" Value="White"/> - <Setter Property="Opacity" Value="0.5"/> - <Setter Property="Panel.ZIndex" Value="1"/> - </Style> </ResourceDictionary> \ No newline at end of file diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml index b49af440420c0a8b0221897e9d597af5c5e45620..0dbabf93b2681d4cadde14d35b2bb48f7f578502 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml @@ -17,39 +17,10 @@ <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/> <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Colors.xaml"/> </ResourceDictionary.MergedDictionaries> - <local:ScanGraphVmUt x:Key="viewmodel"/> - <SolidColorBrush x:Key="TextBrush" Color="#4C4949" /> - <SolidColorBrush x:Key="GrayBrush1" Color="#FF727272"/> - <SolidColorBrush x:Key="GrayBrush2" Color="#FF858484" /> - <SolidColorBrush x:Key="SemiTransparentGreyBrush" Color="#99F0F0F0"/> - <SolidColorBrush x:Key="SemiTransparentActiveBrush" Color="#50008BE5"/> - <SolidColorBrush x:Key="WhiteBrush" Color="White"/> - <Style x:Key="TitleStyle" TargetType="TextBlock"> - <Setter Property="Width" Value="50"/> - <Setter Property="Foreground" Value="{StaticResource GrayBrush1}"/> - <Setter Property="FontSize" Value="16"/> - <Setter Property="TextAlignment" Value="Right"/> - </Style> - <Style x:Key="ValueStyle" TargetType="TextBlock"> - <Setter Property="Foreground" Value="{StaticResource TextBrush}"/> - <Setter Property="FontSize" Value="20"/> - <Setter Property="Padding" Value="5,0"/> - </Style> - <Style x:Key="ValueStyle2" TargetType="TextBlock"> - <Setter Property="Foreground" Value="{StaticResource WhiteBrush}"/> - <Setter Property="Background" Value="{StaticResource TextBrush}"/> - <Setter Property="FontSize" Value="26"/> - <Setter Property="Padding" Value="5,0"/> - </Style> - <Style x:Key="UnitStyle" TargetType="TextBlock"> - <Setter Property="Foreground" Value="{StaticResource GrayBrush2}"/> - <Setter Property="FontSize" Value="15"/> - <Setter Property="VerticalAlignment" Value="Bottom"/> - </Style> </ResourceDictionary> </UserControl.Resources> - <Border Style="{StaticResource BorderStyle_module}" > + <Border Style="{StaticResource Styles.Module.Border}" > <Grid d:DataContext="{StaticResource viewmodel}"> <Grid.RowDefinitions> <RowDefinition Height="auto"/> @@ -71,7 +42,7 @@ <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="{Binding XStep}"/> </lvc:Axis.Separator> <lvc:Axis.Sections> - <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" StrokeThickness="0" Stroke="{StaticResource Color_theme_activity}" + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" StrokeThickness="0" Stroke="{StaticResource Brushes.Activity}" Value="{Binding OrgBoltNo}" /> </lvc:Axis.Sections> @@ -111,70 +82,69 @@ /> </lvc:Axis.Sections> <lvc:Axis.Separator> - <lvc:Separator Stroke="Transparent" /> + <lvc:Separator Visibility="Collapsed" /> </lvc:Axis.Separator> </lvc:Axis> </lvc:CartesianChart.AxisY> </lvc:CartesianChart> - <Button Style="{StaticResource ButtonStyle_icon}" Margin="48,0,0,-20" + <Button Style="{StaticResource Styles.Button.Icon}" Margin="48,0,0,-20" Click="Button_info_click" > - <Grid Style="{StaticResource GridStyle_ButtonShadow}" > + <Grid Style="{StaticResource Styles.Shadow}" > <TextBlock Padding="10,5" VerticalAlignment="Top" - FontSize="24" Foreground="White" Background="{StaticResource Color_theme_activity}" + FontSize="24" Foreground="{StaticResource Brushes.ThemeBackground}" Background="{StaticResource Brushes.Activity}" Text="扫æ图" /> </Grid> </Button> - <Grid Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" - VerticalAlignment="Top" HorizontalAlignment="Left" > - <Viewbox MaxHeight="50"> - <StackPanel Orientation="Horizontal"> - <StackPanel> - <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="5"> - - <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Time,StringFormat={}{0:MM-dd HH:mm:ss}}"/> - <StackPanel Orientation="Horizontal" Margin="5,0"> - <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" /> - <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/> - </StackPanel> + <StackPanel Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" VerticalAlignment="Top" HorizontalAlignment="Left" + Margin="{StaticResource ControlMargin}"> + <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2"> + <StackPanel Orientation="Horizontal" > - </StackPanel> - <StackPanel Orientation="Horizontal"> - <StackPanel Orientation="Horizontal" Margin="5,0"> - <TextBlock > - <TextBlock.Style> - <Style TargetType="TextBlock" BasedOn="{StaticResource ValueStyle}"> - <Setter Property="Background" Value="#99000000"/> - <Setter Property="Foreground" Value="White"/> - <Setter Property="Text" Value="逆"/> - <Style.Triggers> - <DataTrigger Binding="{Binding IsBackw}" Value="True"> - <Setter Property="Background" Value="#99008BE5"/> - <Setter Property="Text" Value="顺"/> - </DataTrigger> - </Style.Triggers> - </Style> - </TextBlock.Style> - </TextBlock> - </StackPanel> - <StackPanel Orientation="Horizontal" Background="#99FFFFFF"> - <StackPanel Orientation="Horizontal" Margin="5,0"> - <TextBlock Style="{StaticResource ValueStyle}" + <TextBlock Style="{StaticResource ValueStyle}" > + <Run Text="{Binding Time,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm:ss}}"/>~<Run Text="{Binding EndTime,Mode=OneWay,StringFormat={}{0:HH:mm:ss}}"/> + </TextBlock> + + <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}"> + <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" /> + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/> + </StackPanel> + + </StackPanel> + </Viewbox> + <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2"> + <StackPanel Orientation="Horizontal"> + <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}"> + <TextBlock > + <TextBlock.Style> + <Style TargetType="TextBlock" BasedOn="{StaticResource ValueStyle}"> + <Setter Property="Background" Value="#99000000"/> + <Setter Property="Foreground" Value="White"/> + <Setter Property="Text" Value="逆"/> + <Style.Triggers> + <DataTrigger Binding="{Binding IsBackw}" Value="True"> + <Setter Property="Background" Value="#99008BE5"/> + <Setter Property="Text" Value="顺"/> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> + </StackPanel> + <StackPanel Orientation="Horizontal" Background="#99FFFFFF"> + <StackPanel Orientation="Horizontal" Margin="5,0"> + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding RPeriod, Converter={StaticResource timespanconv}}" /> - <TextBlock Style="{StaticResource TitleStyle}" Width="auto" VerticalAlignment="Bottom" + <TextBlock Style="{StaticResource TitleStyle}" Width="auto" VerticalAlignment="Bottom" Text="min/R" /> - </StackPanel> - </StackPanel> - </StackPanel> </StackPanel> - - </StackPanel> </Viewbox> - </Grid> + </StackPanel> + <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right" Background="{StaticResource SemiTransparentGreyBrush}" > diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml.cs index 06689e982d4eec38ed015bf87e93c6e753c74888..5cb84e4755675d02e2b4f9679dad06d712fad52a 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml.cs @@ -48,7 +48,7 @@ namespace FLY.Thick.Blowing.UI.UiModule return; WdScanGraphConfig window = new WdScanGraphConfig(); - window.Init(graphparam); + window.Init(graphparam,viewModel); window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this); window.ShowDialog(); } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphItemParam.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphItemParam.cs index ba9565151d9a989049644657244e01a376238bbd..df35798c49a32da996e4ca2fea55837172da46ec 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphItemParam.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphItemParam.cs @@ -18,7 +18,7 @@ namespace FLY.Thick.Blowing.UI.UiModule /// </summary> public double YRangePercent { get; set; } = 3; - private int mix = 2; + private int mix = 1; /// <summary> /// æ··åˆæ•° /// </summary> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVm.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVm.cs index dc21bbe288ac3122f21ee5d805c578215bedaf70..83ad1d6d728c55593adc4a3e64977a82526c5938 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVm.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVm.cs @@ -14,13 +14,19 @@ using System.Linq; using System.Runtime.InteropServices; using System.Windows.Data; using System.Windows.Media; +using System.Windows.Threading; namespace FLY.Thick.Blowing.UI.UiModule { - public class ScanGraphVm : INotifyPropertyChanged + public class ScanGraphVm : IScanGraphVm,INotifyPropertyChanged { const int MARKNO_TEXTUP = 1; - const int MARKNO_TARGET_DELAY = 2; + + /// <summary> + /// 自动切æ¢ä¸º DefaultNumber 倒计时 åˆå§‹å€¼ + /// </summary> + const int AutoKeepTotalSec = 60; + #region 图表控制 public double YMax { get; set; } = double.NaN; public double YMin { get; set; } = double.NaN; @@ -75,13 +81,18 @@ namespace FLY.Thick.Blowing.UI.UiModule /// <summary> /// æ··åˆæ•° /// </summary> - public int Mix { get; private set; } = 2; + public int Mix { get; protected set; } = 1; /// <summary> /// 测é‡æ—¶é—´ /// </summary> public DateTime Time { get; private set; } + /// <summary> + /// 测é‡ç»“æŸæ—¶é—´ + /// </summary> + public DateTime EndTime { get; private set; } + /// <summary> /// æ—‹è½¬æ–¹å‘ æ˜¯åå‘ /// </summary> @@ -99,6 +110,32 @@ namespace FLY.Thick.Blowing.UI.UiModule public long Id { get; private set; } = 1231221; public int OrgBoltNo { get; private set; } = -100; + + /// <summary> + /// åªè¦ Number被改å˜,且ä¸ä¸º0, AutoKeepNewestTimeRemaining就会被设为10s. + /// 当 AutoKeepNewestTimeRemaining = 0, Number就会被设置为0 + /// </summary> + public int AutoKeepNewestTimeRemaining { get; protected set; } + + /// <summary> + /// Number == graphparam.Number + /// </summary> + public bool IsNewest { get; protected set; } = true; + + /// <summary> + /// é”上, Number ä¸ä¼š 自动å˜å›ž DefaultNumber,且 Number = Id + /// </summary> + public bool IsLocked { get; set; } + + /// <summary> + /// 记录点, 与 graphparam.Number 分离 + /// </summary> + public long Number { get; set; } + /// <summary> + /// 记录点 å˜åŒ–æ¥è¿› + /// </summary> + public int NumberStep { get; set; } = 1; + #endregion [PropertyChanged.AlsoNotifyFor(nameof(XFormatter),nameof(XStep))] @@ -109,13 +146,14 @@ namespace FLY.Thick.Blowing.UI.UiModule ChartValues<double> Values = new ChartValues<double>(); object Mapper; - BlowingFixProfileParam profileParam; - ScanGraphItemParam graphparam; - IBulkDbService bulkDb; - Lc_ScanData scanData; + protected BlowingFixProfileParam profileParam; + protected ScanGraphItemParam graphparam; + protected IBulkDbService bulkDb; + protected Lc_ScanData scanData; Db_Profile profile; - IBlowingService blowingService; + protected IBlowingService blowingService; ParamDictionary paramDictionary; + protected DispatcherTimer timer; public ScanGraphVm() { #region 与数æ®æ— 关界é¢å‚æ•° @@ -233,7 +271,6 @@ namespace FLY.Thick.Blowing.UI.UiModule } void Init() { - Misc.BindingOperations.SetBinding(graphparam, nameof(graphparam.Mix), this, nameof(Mix)); Misc.BindingOperations.SetBinding(blowingService, nameof(blowingService.BPC), this, nameof(BPC)); paramDictionary.SetBinding(this, nameof(XStepOrg), nameof(XStep), 5); @@ -243,6 +280,8 @@ namespace FLY.Thick.Blowing.UI.UiModule Values.Clear(); + + init_autoKeep(); Id = -1; UpdateId(); @@ -252,7 +291,61 @@ namespace FLY.Thick.Blowing.UI.UiModule this.PropertyChanged += ScanGraphVm_PropertyChanged; } + void init_autoKeep() + { + ResetNumber(); + + timer = new DispatcherTimer(); + timer.Interval = TimeSpan.FromSeconds(1); + timer.Tick += (s, e) => + { + if (Number == graphparam.Number) + { + timer.Stop(); + return; + } + + if (IsLocked) + { + return; + } + + if (AutoKeepNewestTimeRemaining > 0) + AutoKeepNewestTimeRemaining--; + if (AutoKeepNewestTimeRemaining <= 0) + { + ResetNumber(); + timer.Stop(); + return; + } + }; + this.graphparam.PropertyChanged += (s, e) => + { + if (e.PropertyName == nameof(graphparam.Number)) + { + ResetNumber(); + timer.IsEnabled = false; + IsNewest = true; + AutoKeepNewestTimeRemaining = AutoKeepTotalSec; + } + }; + this.PropertyChanged += (s, e) => { + if (e.PropertyName == nameof(IsLocked)) + { + if (Id >= 0) + { + Number = Id; + } + } + else if (e.PropertyName == nameof(Number)) + { + timer.IsEnabled = Number != graphparam.Number; + IsNewest = !timer.IsEnabled; + AutoKeepNewestTimeRemaining = AutoKeepTotalSec; + } + }; + } static string[] propertyname_updateMaxMinText = new string[] { nameof(Average),nameof(Max),nameof(Min),nameof(Sigma2)}; @@ -267,9 +360,13 @@ namespace FLY.Thick.Blowing.UI.UiModule NotifyPropertyChanged(nameof(YFormatter)); } } - - if(propertyname_updateMaxMinText.Contains(e.PropertyName)) - UpdateMaxMinText(); + else if (e.PropertyName == nameof(Number)) + { + UpdateId(); + } + + if (propertyname_updateMaxMinText.Contains(e.PropertyName)) + UpdateMaxMinText_delay(); } @@ -302,11 +399,7 @@ namespace FLY.Thick.Blowing.UI.UiModule private void Graphparam_PropertyChanged(object sender, PropertyChangedEventArgs e) { - if (e.PropertyName == nameof(graphparam.Number)) - { - UpdateId(); - } - else if (e.PropertyName == nameof(graphparam.Mix)) + if (e.PropertyName == nameof(graphparam.Mix)) { UpdateId(); } @@ -329,7 +422,7 @@ namespace FLY.Thick.Blowing.UI.UiModule - void UpdateY() + protected void UpdateY() { //if (this.profile != null) //{ @@ -394,7 +487,7 @@ namespace FLY.Thick.Blowing.UI.UiModule YMin = target - tolerance * graphparam.YRangePercent; } - void UpdateX() + protected void UpdateX() { XMin = 0; XMax = this.blowingService.NBolts + 1; @@ -405,7 +498,7 @@ namespace FLY.Thick.Blowing.UI.UiModule Update4IdChanged(); } - void UpdateMaxMinText() + void UpdateMaxMinText_delay() { PollModule.Current.Poll_JustOnce(() => { @@ -423,11 +516,27 @@ namespace FLY.Thick.Blowing.UI.UiModule } }, this, MARKNO_TEXTUP); } + protected void UpdateMaxMinText() + { + if (graphparam.IsPercent && (Average > 0)) + { + MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%"; + MinText = $"-{((Average - Min) / Average) * 100.0:F1}%"; + Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%"; + } + else + { + MaxText = $"{Max:F1}"; + MinText = $"{Min:F1}"; + Sigma2Text = $"{Sigma2:F1}"; + } + } - void UpdateAverage() { + protected void UpdateAverage() { if (this.scanData == null) { Time = DateTime.MinValue; + EndTime = DateTime.MinValue; Id = -1; OrgBoltNo = -100; return; @@ -435,6 +544,7 @@ namespace FLY.Thick.Blowing.UI.UiModule else { Time = this.scanData.Time; + EndTime = this.scanData.EndTime; Id = this.scanData.ID; OrgBoltNo = this.scanData.OrgBoltNo; IsBackw = this.scanData.IsBackw; @@ -467,6 +577,7 @@ namespace FLY.Thick.Blowing.UI.UiModule if (this.scanData == null) { Time = DateTime.MinValue; + EndTime = DateTime.MinValue; Id = -1; OrgBoltNo = -100; return; @@ -474,6 +585,7 @@ namespace FLY.Thick.Blowing.UI.UiModule else { Time = this.scanData.Time; + EndTime = this.scanData.EndTime; Id = this.scanData.ID; OrgBoltNo = this.scanData.OrgBoltNo; } @@ -504,21 +616,43 @@ namespace FLY.Thick.Blowing.UI.UiModule } - void Update4IdChanged() + + bool IsNeedToGetFrame() { - if (graphparam.Number > 0 - && bulkDb.LastScanDataId == Id - && Mix == graphparam.Mix) + if (Mix != graphparam.Mix) { - //ä¸éœ€è¦æ›´æ–°ï¼ï¼ï¼ï¼ï¼ï¼ï¼ - return; + return true; + } + + if (Number > 0) + { + //ç»å¯¹ä½ç½®æ¨¡å¼ + if (Number != Id) + return true; + else + return false; } + //相对ä½ç½®æ¨¡å¼ + + if (Number == Id - bulkDb.LastScanDataId) + { + //å·²ç»æ˜¯éœ€è¦æŸ¥æ‰¾çš„记录 + return false; + } + + return true; + } + void Update4IdChanged() + { + if (!IsNeedToGetFrame()) + return; + bulkDb.GetFrame( - new Pack_GetFrameRequest() { Id = graphparam.Number, Mix = graphparam.Mix }, + new Pack_GetFrameRequest() { Id = Number, Mix = graphparam.Mix }, (object AsyncContext, object retData) => { Pack_GetFrameReponse reponse = retData as Pack_GetFrameReponse; - + Mix = reponse.Request.Mix; //if (reponse.scanData != null) { this.scanData = reponse.scanData; @@ -544,7 +678,28 @@ namespace FLY.Thick.Blowing.UI.UiModule }, this); } - void NotifyPropertyChanged(string propertyName) { + + public void PreView() + { + Number -= NumberStep; + } + + public void NextView() + { + Number += NumberStep; + } + + public void ChangeLock() + { + IsLocked = !IsLocked; + } + + public void ResetNumber() + { + Number = graphparam.Number; + } + + protected void NotifyPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVmUt.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVmUt.cs index 354113cb278f2270d81820eed38b7aafce032967..3477e1777d7081989611a3d4287485b5ee5baed3 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVmUt.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVmUt.cs @@ -11,138 +11,10 @@ using System.Windows.Media; namespace FLY.Thick.Blowing.UI.UiModule { - public class ScanGraphVmUt : INotifyPropertyChanged + public class ScanGraphVmUt : ScanGraphVm { - #region 图表控制 - public double YMax { get; set; } - public double YMin { get; set; } - public double Target { get; set; } - public double Tolerance2YMax { get; set; } - public double Tolerance2YMin { get; set; } - public double ToleranceYMax { get; set; } - public double ToleranceYMin { get; set; } - public double XMax { get; set; } - public double XMin { get; set; } - - public int XStep { get; set; } = 5; - - public Func<double, string> YFormatter { get; set; } - - public SeriesCollection Series { get; set; } - - #endregion - - #region 颜色 - List<Brush> AreaColors; - #endregion - - - #region ç•Œé¢ç»Ÿè®¡å€¼ - - public double Average { get; set; } - - - public string Sigma2Text { get; set; } - public string MaxText { get; set; } - public string MinText { get; set; } - - /// <summary> - /// æ··åˆæ•° - /// </summary> - public int Mix { get; set; } - - /// <summary> - /// æ—‹è½¬æ–¹å‘ æ˜¯åå‘ - /// </summary> - public bool IsBackw { get; set; } - - /// <summary> - /// 旋转1周的时间 - /// </summary> - public TimeSpan RPeriod { get; set; } - - - /// <summary> - /// 测é‡æ—¶é—´ - /// </summary> - public DateTime Time { get; set; } - /// <summary> - /// æ•°æ®åº“ä¸çš„IDæ ‡ç¤º - /// </summary> - public int Id { get; set; } - - /// <summary> - /// å¤ä½åŒºå· - /// </summary> - public int OrgBoltNo { get; set; } - - public bool IsPercent { get; set; } - public bool IsAutoTarget { get; set; } - - - #endregion - - - - ChartValues<double> Values { get; } = new ChartValues<double>(); - object Mapper { get; set; } - - - public ScanGraphVmUt() { - - #region 与数æ®æ— 关界é¢å‚æ•° - AreaColors = FLY.Thick.Blowing.UI.Themes.Colors.AreaColors; - YFormatter = (y) => - { - if (IsPercent) - { - if (y == Average) - { - return y.ToString("F1"); - } - else - { - double percent = 100.0 * (y - Average) / Average; - if (percent > 0) - { - return $"+{Math.Abs(percent):F1}%"; - } - else { - return $"-{Math.Abs(percent):F1}%"; - } - - } - } - else { - return y.ToString("F1"); - } - }; - - - Mapper = Mappers.Xy<double>() - .X((value, index) => - { - return index + 1; - }) - .Y(value => value) - .Fill((value) => - { - if ((value > Tolerance2YMax) || (value < Tolerance2YMin)) - { - return AreaColors[2]; - } - else if ((value > ToleranceYMax) || (value < ToleranceYMin)) - { - return AreaColors[1]; - } - else - { - return AreaColors[0]; - } - }); - #endregion #region æ•°æ® double target = 150; double tolerance = target * 0.02; @@ -155,78 +27,58 @@ namespace FLY.Thick.Blowing.UI.UiModule datas[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * tolerance + target + (random.NextDouble() - 0.5) * 1 - 6; } - #endregion - #region ç•Œé¢æ•°æ® - + profileParam = new Common.BlowingFixProfileParam() + { + Target = target, + TolerancePercent = 0.02, + K = 1, + PName = "abc", + OrderNo = "12313121", + Number = "2" + }; + graphparam = new ScanGraphItemParam() + { + IsPercent = true, + IsAutoTarget = true, + YRangePercent = yrangepercent, + Number = -1, + Mix = 2 + }; - XMin = 0; - XMax = nbolts + 1; - XStep = 5; - Mix = 2; - Time = DateTime.Now; - Id = 312312; - OrgBoltNo = 31; - IsPercent = true; - IsAutoTarget = true; - Values.Clear(); - Values.Add(double.NaN); - Values.AddRange(datas); - Average = datas.AverageNoNull(); - IsBackw = false; - RPeriod = TimeSpan.FromSeconds(60 * 6.5); + scanData = new Server.Model.Lc_ScanData() + { + Time = DateTime.Now.AddSeconds(-30), + EndTime = DateTime.Now, + ID = 1234567, + K = 2, + Thicks = datas, + IsBackw = false, + FilmLength = 23.3, + FilmVelocity = 53.1, + OrgBoltNo = 41, + RAngle = 355, + RCnt = 6, + RPeriod = TimeSpan.FromMinutes(6.7) + }; - double Max = datas.Max(); - double Min = datas.Min(); - double Sigma2 = datas.Sigma() * 2; + #endregion + #region ç•Œé¢æ•°æ® + Mix = graphparam.Mix; + XStepOrg = 5; - if (IsPercent) - { - MaxText = $"+{((Max - Average) / Average)*100.0:F1}%"; - MinText = $"-{((Average - Min) / Average) * 100.0:F1}%"; - Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%"; - } - else - { - MaxText = $"{Max:F1}"; - MinText = $"{Min:F1}"; - Sigma2Text = $"{Sigma2:F1}"; - } - if (IsPercent || IsAutoTarget) - { - Target = Average; - } - else { - Target = target; - } + UpdateAverage(); + UpdateMaxMinText(); + UpdateY(); - ToleranceYMax = Target + tolerance; - ToleranceYMin = Target - tolerance; - Tolerance2YMax = Target + tolerance * 2; - Tolerance2YMin = Target - tolerance * 2; - YMax = Target + tolerance * yrangepercent; - YMin = Target - tolerance * yrangepercent; + //UpdateX(); + XMax = nbolts + 1; #endregion - - Series = new SeriesCollection - { - new Column2Series - { - Title = "扫æ图", - Values = Values, - StrokeThickness = 1, - Stroke = new SolidColorBrush(Colors.Black), - PointGeometry = null, - Configuration = Mapper - } - }; - ((Series)Series[0]).SetBinding(Column2Series.YAxisCrossingProperty, new Binding("Target") { Source = this }); } - public event PropertyChangedEventHandler PropertyChanged; } } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml index 93415fd8a63e316e2ebe69ce8ed5e7e15a2d56cc..df9496e5a28057e2d1cb91a94bed071b5583d721 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml @@ -7,85 +7,121 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" mc:Ignorable="d" xmlns:uiModule="clr-namespace:FLY.Thick.Blowing.UI.UiModule" - Title="ScanGraphConfig" SizeToContent="WidthAndHeight" d:DataContext="{d:DesignInstance uiModule:ScanGraphItemParam}" + Title="ScanGraphConfig" SizeToContent="WidthAndHeight" d:DataContext="{d:DesignInstance uiModule:ScanGraphItemParam}" MinHeight="450" MinWidth="450" > <Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> - <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/> - <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/> <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/> - </ResourceDictionary.MergedDictionaries> - </ResourceDictionary> </Window.Resources> - <Grid TextBlock.FontSize="24" TextBlock.FontStyle="Normal" Background="WhiteSmoke"> - <StackPanel Margin="5,20"> - <Grid > - <Grid.ColumnDefinitions> - <ColumnDefinition/> - <ColumnDefinition Width="auto"/> - </Grid.ColumnDefinitions> - </Grid> - <StackPanel Orientation="Horizontal"> - - <StackPanel Orientation="Horizontal"> - <StackPanel Margin="5"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="æ··åˆæ•°" /> - <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Mix}" /> - </StackPanel> - </StackPanel> - <StackPanel Margin="5"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="记录点" /> + <StackPanel Margin="{StaticResource ControlMargin}" > + <Grid Height="20" x:Name="grid_scanGraphVm"/> + <Grid Height="20" x:Name="grid_graphParam"/> + <TabControl > + <TabItem Header="æµè§ˆ"> + <StackPanel> + <StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=grid_scanGraphVm,Path=DataContext}"> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Number}" /> + <Button Style="{StaticResource Styles.Button.Icon}" Click="btnLockClick" > + <iconPacks:PackIconMaterial > + <iconPacks:PackIconMaterial.Style> + <Style TargetType="iconPacks:PackIconMaterial" BasedOn="{StaticResource Styles.Icon.Base}"> + <Setter Property="Kind" Value="Lock"/> + <Style.Triggers> + <DataTrigger Binding="{Binding IsLocked}" Value="False"> + <Setter Property="Foreground" Value="Gray"/> + <Setter Property="Kind" Value="LockOff"/> + </DataTrigger> + </Style.Triggers> + </Style> + </iconPacks:PackIconMaterial.Style> + </iconPacks:PackIconMaterial> + </Button> + <StackPanel Margin="{StaticResource ControlMargin}"> + <Grid HorizontalAlignment="Left"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="记录点" /> + <!--当ä¸æ˜¯æœ€æ–°, 弹出 自动按[最新] 倒计时--> + <Button Style="{StaticResource Styles.Button.Empty}" Click="btnResetNumberClick" + VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0,0,-10,-10" + Visibility="{Binding IsNewest, Converter={StaticResource visbilityconv}, ConverterParameter=HiddenWhenTrue}"> + <Grid Width="20" Height="20" > + <Ellipse Fill="{StaticResource Brushes.Highlight}" /> + <TextBlock Text="{Binding AutoKeepNewestTimeRemaining}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/> + </Grid> + </Button> + </Grid> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Number}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Separator}"/> + <Button Style="{StaticResource Styles.Button.Empty}" Click="btnResetNumberClick"> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" DataContext="{Binding ElementName=grid_graphParam,Path=DataContext}"> + 默认值:<Run Text="{Binding Number}"/> + </TextBlock> + </Button> + </StackPanel> + </StackPanel> + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnPreClick"> + <iconPacks:PackIconMaterial Kind="ArrowLeft" /> + </Button> + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnNextClick"> + <iconPacks:PackIconMaterial Kind="ArrowRight" /> + </Button> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="æ¥è¿›" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding NumberStep}" /> + </StackPanel> + </StackPanel> </StackPanel> </StackPanel> - <Button Style="{StaticResource ButtonStyle_largeIcon}" Click="btnPreClick"> - <Grid> - <Ellipse Fill="White" Margin="2"/> - <iconPacks:PackIconMaterial Kind="ArrowLeftBoldCircle" /> - </Grid> - - </Button> - <Button Style="{StaticResource ButtonStyle_largeIcon}" Click="btnNextClick"> - <Grid> - <Ellipse Fill="White" Margin="2"/> - <iconPacks:PackIconMaterial Kind="ArrowRightBoldCircle" /> - </Grid> - </Button> - </StackPanel> - </StackPanel> - <StackPanel Orientation="Horizontal" > - - <StackPanel Orientation="Horizontal" Visibility="{Binding ElementName=togglebutton_adv, Path=IsChecked,Converter={StaticResource visbilityconv},ConverterParameter=Collapsed}"> - <StackPanel Margin="5"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="Yè½´å€æ•°" /> - <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding YRangePercent}" /> + </StackPanel> + </TabItem> + <TabItem Header="视图"> + <StackPanel> + <StackPanel Orientation="Horizontal"> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="默认记录点" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Number}" /> + </StackPanel> </StackPanel> </StackPanel> - <StackPanel Margin="5"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="%显示" /> - <StackPanel Orientation="Horizontal"> - <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding IsPercent}"/> + <StackPanel Orientation="Horizontal" > + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="æ··åˆæ•°" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Mix}" /> + </StackPanel> + </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Yè½´å€æ•°" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding YRangePercent}" /> + </StackPanel> </StackPanel> </StackPanel> - <StackPanel Margin="5"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="è‡ªåŠ¨ç›®æ ‡å€¼" /> - <StackPanel Orientation="Horizontal"> - <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding IsAutoTarget}"/> + <StackPanel Orientation="Horizontal"> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="%显示" /> + <StackPanel Orientation="Horizontal"> + <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding IsPercent}"/> + </StackPanel> + </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="è‡ªåŠ¨ç›®æ ‡å€¼" /> + <StackPanel Orientation="Horizontal"> + <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding IsAutoTarget}"/> + </StackPanel> </StackPanel> </StackPanel> + <Button Style="{StaticResource Styles.Button.Apply}" Click="btnOkClick"/> </StackPanel> - - </StackPanel> - <Button Style="{StaticResource ButtonStyle_apply}" Click="btnOkClick"/> - </StackPanel> - </Grid> + </TabItem> + </TabControl> + </StackPanel> </flyctrllib:WindowBigClose> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml.cs index 05837aa87d4e43a8afdf7200fd856ffb64929b7d..500cf7c3bb624519bc84dd6ce8ae06a8ca38f241 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml.cs @@ -20,32 +20,55 @@ namespace FLY.Thick.Blowing.UI.UiModule public partial class WdScanGraphConfig : FLY.ControlLibrary.WindowBigClose { ScanGraphItemParam graphparam; - + IScanGraphVm scanGraphVm; public WdScanGraphConfig() { InitializeComponent(); } - public void Init(ScanGraphItemParam graphparam) + public void Init(ScanGraphItemParam graphparam, IScanGraphVm scanGraphVm) { - this.DataContext = graphparam; + this.scanGraphVm = scanGraphVm; this.graphparam = graphparam; + + this.grid_scanGraphVm.DataContext = scanGraphVm; + this.DataContext = graphparam; } private void btnPreClick(object sender, RoutedEventArgs e) { - graphparam.Number--; + scanGraphVm.PreView(); } private void btnNextClick(object sender, RoutedEventArgs e) { - graphparam.Number++; + scanGraphVm.NextView(); } private void btnOkClick(object sender, RoutedEventArgs e) { ScanGraphParams.Current.Save(); } + + private void btnLockClick(object sender, RoutedEventArgs e) + { + scanGraphVm.ChangeLock(); + } + + private void btnResetNumberClick(object sender, RoutedEventArgs e) + { + scanGraphVm.ResetNumber(); + } + } + public interface IScanGraphVm + { + void PreView(); + void NextView(); + void ChangeLock(); + + void ResetNumber(); + + } } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml index e13f765440e86eeb1b3f2e9c4afc0e8f9a728098..69886cd9b860ab6d5ea7a53b468ed551ad7afd82 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml @@ -6,7 +6,7 @@ xmlns:local="clr-namespace:FLY.Thick.Blowing.UI.UiModule" xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" mc:Ignorable="d" - d:DesignHeight="250" d:DesignWidth="600" + d:DesignHeight="300" d:DesignWidth="800" > <UserControl.Resources> @@ -19,37 +19,9 @@ </ResourceDictionary.MergedDictionaries> <local:ScanGraph2VmUt x:Key="viewmodel"/> - <SolidColorBrush x:Key="TextBrush" Color="#4C4949" /> - <SolidColorBrush x:Key="GrayBrush1" Color="#FF727272"/> - <SolidColorBrush x:Key="GrayBrush2" Color="#FF858484" /> - <SolidColorBrush x:Key="SemiTransparentGreyBrush" Color="#30909090"/> - <SolidColorBrush x:Key="SemiTransparentActiveBrush" Color="#50008BE5"/> - <SolidColorBrush x:Key="WhiteBrush" Color="White"/> - <Style x:Key="TitleStyle" TargetType="TextBlock"> - <Setter Property="Width" Value="50"/> - <Setter Property="Foreground" Value="{StaticResource GrayBrush1}"/> - <Setter Property="FontSize" Value="16"/> - <Setter Property="TextAlignment" Value="Right"/> - </Style> - <Style x:Key="ValueStyle" TargetType="TextBlock"> - <Setter Property="Foreground" Value="{StaticResource TextBrush}"/> - <Setter Property="FontSize" Value="20"/> - <Setter Property="Padding" Value="5,0"/> - </Style> - <Style x:Key="ValueStyle2" TargetType="TextBlock"> - <Setter Property="Foreground" Value="{StaticResource WhiteBrush}"/> - <Setter Property="Background" Value="{StaticResource TextBrush}"/> - <Setter Property="FontSize" Value="26"/> - <Setter Property="Padding" Value="5,0"/> - </Style> - <Style x:Key="UnitStyle" TargetType="TextBlock"> - <Setter Property="Foreground" Value="{StaticResource GrayBrush2}"/> - <Setter Property="FontSize" Value="15"/> - <Setter Property="VerticalAlignment" Value="Bottom"/> - </Style> </ResourceDictionary> </UserControl.Resources> - <Border Style="{StaticResource BorderStyle_module}" > + <Border Style="{StaticResource Styles.Module.Border}" > <Grid d:DataContext="{StaticResource viewmodel}"> <Grid.RowDefinitions> <RowDefinition Height="auto"/> @@ -118,62 +90,65 @@ </lvc:CartesianChart.AxisY> </lvc:CartesianChart> - <Button Style="{StaticResource ButtonStyle_icon}" Margin="48,0,0,-20" + <Button Style="{StaticResource Styles.Button.Icon}" Margin="48,0,0,-20" Click="Button_info_click" > - <Grid Style="{StaticResource GridStyle_ButtonShadow}" > + <Grid Style="{StaticResource Styles.Shadow}" > <TextBlock Padding="10,5" VerticalAlignment="Top" - FontSize="24" Foreground="White" Background="{StaticResource Color_theme_activity}" + FontSize="24" Foreground="{StaticResource Brushes.ThemeBackground}" Background="{StaticResource Brushes.Activity}" Text="对比图" /> </Grid> </Button> - <Grid Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" - VerticalAlignment="Top" HorizontalAlignment="Left" > - <Viewbox MaxHeight="50"> - <StackPanel Orientation="Horizontal"> - <StackPanel> - <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="5"> - - <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Time,StringFormat={}{0:MM-dd HH:mm:ss}}"/> - <StackPanel Orientation="Horizontal" Margin="5,0"> - <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" /> - <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/> - </StackPanel> + <Grid Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" VerticalAlignment="Top" HorizontalAlignment="Left" + Margin="{StaticResource ControlMargin}"> + <Grid.ColumnDefinitions> + <ColumnDefinition/> + <ColumnDefinition Width="auto"/> + </Grid.ColumnDefinitions> + <StackPanel> + <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2"> + <StackPanel Orientation="Horizontal"> + <TextBlock Style="{StaticResource ValueStyle}" > + <Run Text="{Binding Time,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm:ss}}"/>~<Run Text="{Binding EndTime,Mode=OneWay,StringFormat={}{0:HH:mm:ss}}"/> + </TextBlock> + <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}"> + <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" /> + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/> + </StackPanel> + </StackPanel> + </Viewbox> + <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2"> + <StackPanel Orientation="Horizontal"> + <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}"> + <TextBlock > + <TextBlock.Style> + <Style TargetType="TextBlock" BasedOn="{StaticResource ValueStyle}"> + <Setter Property="Background" Value="#99000000"/> + <Setter Property="Foreground" Value="White"/> + <Setter Property="Text" Value="逆"/> + <Style.Triggers> + <DataTrigger Binding="{Binding IsBackw}" Value="True"> + <Setter Property="Background" Value="#99008BE5"/> + <Setter Property="Text" Value="顺"/> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> </StackPanel> - <StackPanel Orientation="Horizontal"> - <StackPanel Orientation="Horizontal" Margin="5,0"> - <TextBlock > - <TextBlock.Style> - <Style TargetType="TextBlock" BasedOn="{StaticResource ValueStyle}"> - <Setter Property="Background" Value="#99000000"/> - <Setter Property="Foreground" Value="White"/> - <Setter Property="Text" Value="逆"/> - <Style.Triggers> - <DataTrigger Binding="{Binding IsBackw}" Value="True"> - <Setter Property="Background" Value="#99008BE5"/> - <Setter Property="Text" Value="顺"/> - </DataTrigger> - </Style.Triggers> - </Style> - </TextBlock.Style> - </TextBlock> - </StackPanel> - <StackPanel Orientation="Horizontal" Background="#99FFFFFF"> - <StackPanel Orientation="Horizontal" Margin="5,0"> - <TextBlock Style="{StaticResource ValueStyle}" + <StackPanel Orientation="Horizontal" Background="#99FFFFFF"> + <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}"> + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding RPeriod, Converter={StaticResource timespanconv}}" /> - <TextBlock Style="{StaticResource TitleStyle}" Width="auto" VerticalAlignment="Bottom" + <TextBlock Style="{StaticResource TitleStyle}" Width="auto" VerticalAlignment="Bottom" Text="min/R" /> - </StackPanel> </StackPanel> - </StackPanel> - </StackPanel> - - </StackPanel> - </Viewbox> + </StackPanel> + </Viewbox> + </StackPanel> </Grid> <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right" diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml.cs index ff490d7a7b7f2e0cd439dc98b7d9f02f247fa173..12d96377420803a6675cf2cc88dfe6f9c717c653 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml.cs @@ -47,7 +47,7 @@ namespace FLY.Thick.Blowing.UI.UiModule return; WdScanGraphConfig window = new WdScanGraphConfig(); - window.Init(graphparam); + window.Init(graphparam, viewModel); window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this); window.ShowDialog(); } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2Vm.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2Vm.cs index 40ecd2de54ca439fcb7deb93f801162427bd36d5..3339a7cb2a38d8d4f4232ef93b130ee916d6e8be 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2Vm.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2Vm.cs @@ -2,6 +2,7 @@ using FLY.Thick.Blowing.IService; using FLY.Thick.Blowing.Server.Model; using FObjBase; +using GalaSoft.MvvmLight.Command; using LiveCharts; using LiveCharts.Configurations; using LiveCharts.Wpf; @@ -12,14 +13,21 @@ using System.ComponentModel; using System.Linq; using System.Windows.Data; using System.Windows.Media; +using System.Windows.Threading; namespace FLY.Thick.Blowing.UI.UiModule { - public class ScanGraph2Vm : INotifyPropertyChanged + public class ScanGraph2Vm : IScanGraphVm, INotifyPropertyChanged { const int MARKNO_TEXT = 1; const int MARKNO_Y = 2; const int MARKNO_TARGET = 3; + + /// <summary> + /// 自动切æ¢ä¸º DefaultNumber 倒计时 åˆå§‹å€¼ + /// </summary> + const int AutoKeepTotalSec = 60; + #region 图表控制 public double YMax { get; set; } = double.NaN; public double YMin { get; set; } = double.NaN; @@ -87,13 +95,16 @@ namespace FLY.Thick.Blowing.UI.UiModule /// <summary> /// æ··åˆæ•° /// </summary> - public int Mix { get; private set; } = 2; + public int Mix { get; protected set; } = 1; /// <summary> /// 测é‡æ—¶é—´ /// </summary> public DateTime Time { get; private set; } - + /// <summary> + /// 测é‡ç»“æŸæ—¶é—´ + /// </summary> + public DateTime EndTime { get; private set; } /// <summary> /// æ—‹è½¬æ–¹å‘ æ˜¯åå‘ /// </summary> @@ -109,24 +120,55 @@ namespace FLY.Thick.Blowing.UI.UiModule public long Id { get; private set; } = 1231221; public int OrgBoltNo { get; private set; } = -100; + /// <summary> + /// åªè¦ Number被改å˜,且ä¸ä¸º0, AutoKeepNewestTimeRemaining就会被设为10s. + /// 当 AutoKeepNewestTimeRemaining = 0, Number就会被设置为0 + /// </summary> + public int AutoKeepNewestTimeRemaining { get; protected set; } + + /// <summary> + /// Number == graphparam.Number + /// </summary> + public bool IsNewest { get; protected set; } = true; + + /// <summary> + /// é”上, Number ä¸ä¼š 自动å˜å›ž DefaultNumber,且 Number = Id + /// </summary> + public bool IsLocked { get; set; } + + /// <summary> + /// 记录点1, 与 graphparam.Number 分离 + /// </summary> + public long Number { get; set; } + + + + + /// <summary> + /// 记录点 å˜åŒ–æ¥è¿› + /// </summary> + public int NumberStep { get; set; } = 1; + #endregion [PropertyChanged.AlsoNotifyFor(nameof(XFormatter), nameof(XStep))] public int BPC { get; set; } = 1; - List<Brush> AreaColors; + protected List<Brush> AreaColors; - ChartValues<double> Values = new ChartValues<double>(); - ChartValues<double> Values2 = new ChartValues<double>(); + protected ChartValues<double> Values = new ChartValues<double>(); + protected ChartValues<double> Values2 = new ChartValues<double>(); + public RelayCommand AutoLockCmd { get; private set; } - BlowingFixProfileParam profileParam; - ScanGraphItemParam graphparam; - IBulkDbService bulkDb; - Lc_ScanData scanData; - Db_Profile profile; - IBlowingService blowingService; - ParamDictionary paramDictionary; + protected BlowingFixProfileParam profileParam; + protected ScanGraphItemParam graphparam; + protected IBulkDbService bulkDb; + protected Lc_ScanData scanData; + protected Db_Profile profile; + protected IBlowingService blowingService; + protected ParamDictionary paramDictionary; + protected DispatcherTimer timer; public ScanGraph2Vm() { #region 与数æ®æ— 关界é¢å‚æ•° @@ -242,6 +284,8 @@ namespace FLY.Thick.Blowing.UI.UiModule } }; ((Series)Series[0]).SetBinding(Column2Series.YAxisCrossingProperty, new Binding("Target") { Source = this }); + + AutoLockCmd = new RelayCommand(ChangeAutoLock); } public void Init( @@ -261,7 +305,6 @@ namespace FLY.Thick.Blowing.UI.UiModule } void Init() { - Misc.BindingOperations.SetBinding(graphparam, nameof(graphparam.Mix), this, nameof(Mix)); Misc.BindingOperations.SetBinding(blowingService, nameof(blowingService.BPC), this, nameof(BPC)); paramDictionary.SetBinding(this, nameof(XStepOrg), nameof(XStep), 5); UpdateY(); @@ -269,6 +312,8 @@ namespace FLY.Thick.Blowing.UI.UiModule Values.Clear(); + init_autoKeep(); + Id = -1; UpdateId(); @@ -280,8 +325,62 @@ namespace FLY.Thick.Blowing.UI.UiModule UpdateTemp(); } + void init_autoKeep() + { + + ResetNumber(); + + timer = new DispatcherTimer(); + timer.Interval = TimeSpan.FromSeconds(1); + timer.Tick += (s, e) => + { + if (Number == graphparam.Number) + { + timer.Stop(); + return; + } + + if (IsLocked) + { + return; + } - private void BulkDb_TempFrameChanged(object sender, EventArgs _e) + if (AutoKeepNewestTimeRemaining > 0) + AutoKeepNewestTimeRemaining--; + if (AutoKeepNewestTimeRemaining <= 0) + { + ResetNumber(); + timer.Stop(); + return; + } + }; + this.graphparam.PropertyChanged += (s, e) => + { + if (e.PropertyName == nameof(graphparam.Number)) + { + ResetNumber(); + timer.IsEnabled = false; + IsNewest = true; + AutoKeepNewestTimeRemaining = AutoKeepTotalSec; + } + }; + this.PropertyChanged += (s, e) => { + if (e.PropertyName == nameof(IsLocked)) + { + if (Id >= 0) + { + Number = Id; + } + } + else if (e.PropertyName == nameof(Number)) + { + timer.IsEnabled = Number != graphparam.Number; + IsNewest = !timer.IsEnabled; + AutoKeepNewestTimeRemaining = AutoKeepTotalSec; + } + }; + } + protected void BulkDb_TempFrameChanged(object sender, EventArgs _e) { BulkDbTempFrameChangedEventArgs e = (BulkDbTempFrameChangedEventArgs)_e; @@ -316,16 +415,16 @@ namespace FLY.Thick.Blowing.UI.UiModule { if (e.PropertyName == nameof(Average)) { - UpdateTarget(); - UpdateMaxMinText(); + UpdateTarget_delay(); + UpdateMaxMinText_delay(); } else if ((e.PropertyName == nameof(Max)) || (e.PropertyName == nameof(Min)) || (e.PropertyName == nameof(Sigma2))) { - UpdateMaxMinText(); + UpdateMaxMinText_delay(); } else if (e.PropertyName == nameof(Average2)) { - UpdateTarget(); + UpdateTarget_delay(); } else if (e.PropertyName == nameof(Target)) { @@ -333,11 +432,15 @@ namespace FLY.Thick.Blowing.UI.UiModule { NotifyPropertyChanged(nameof(YFormatter)); } - UpdateY2(); + UpdateY2_delay(); } else if (e.PropertyName == nameof(TolerancePercent)) { - UpdateY2(); + UpdateY2_delay(); + } + else if (e.PropertyName == nameof(Number)) + { + UpdateId(); } } @@ -373,28 +476,24 @@ namespace FLY.Thick.Blowing.UI.UiModule { if (e.PropertyName == nameof(graphparam.YRangePercent)) { - UpdateTarget(); - UpdateY2(); + UpdateTarget_delay(); + UpdateY2_delay(); } - else if (e.PropertyName == nameof(graphparam.Number)) - { - UpdateId(); - } - else if (e.PropertyName == nameof(graphparam.IsPercent)) + if (e.PropertyName == nameof(graphparam.IsPercent)) { NotifyPropertyChanged(nameof(YFormatter)); - UpdateTarget(); - UpdateMaxMinText(); + UpdateTarget_delay(); + UpdateMaxMinText_delay(); } else if (e.PropertyName == nameof(graphparam.IsAutoTarget)) { - UpdateTarget(); + UpdateTarget_delay(); } } - void UpdateOrgTarget() + protected void UpdateOrgTarget() { //if (this.profile != null) //{ @@ -423,71 +522,82 @@ namespace FLY.Thick.Blowing.UI.UiModule void UpdateY() { UpdateOrgTarget(); - UpdateTarget(); - UpdateY2(); + UpdateTarget_delay(); + UpdateY2_delay(); } - void UpdateTarget() + void UpdateTarget_delay() { PollModule.Current.Poll_JustOnce(() => { - double target = OrgTarget; - if (graphparam.IsPercent || graphparam.IsAutoTarget) - { - if (!double.IsNaN(Average)) - target = Average; - } + UpdateTarget(); + }, this, MARKNO_TARGET); + } + protected void UpdateTarget() + { - double tolerance = TolerancePercent * target; + double target = OrgTarget; + if (graphparam.IsPercent || graphparam.IsAutoTarget) + { + if (!double.IsNaN(Average)) + target = Average; + } - if (tolerance < 0.1) - tolerance = 0.1; + double tolerance = TolerancePercent * target; - if (!double.IsNaN(Average2)) + if (tolerance < 0.1) + tolerance = 0.1; + + if (!double.IsNaN(Average2)) + { + //tempdata ä¸åœ¨æ˜¾ç¤ºèŒƒå›´å†…, 调整 target 为 Average2 + if (Math.Abs(Average2 - target) > tolerance * graphparam.YRangePercent) { - //tempdata ä¸åœ¨æ˜¾ç¤ºèŒƒå›´å†…, 调整 target 为 Average2 - if (Math.Abs(Average2 - target) > tolerance * graphparam.YRangePercent) + target = Target; + if (!double.IsNaN(target)) { - target = Target; - if (!double.IsNaN(target)) - { - //tempdata 也ä¸åœ¨ 当å‰è§†å›¾ 内 - if (Math.Abs(Average2 - target) > tolerance * graphparam.YRangePercent) - { - target = Average2; - } - } - else + //tempdata 也ä¸åœ¨ 当å‰è§†å›¾ 内 + if (Math.Abs(Average2 - target) > tolerance * graphparam.YRangePercent) { - //视图还没åˆå§‹åŒ–。。。 target = Average2; } } + else + { + //视图还没åˆå§‹åŒ–。。。 + target = Average2; + } } + } - Target = target; - }, this, MARKNO_TARGET); + Target = target; } - void UpdateY2() + + + protected void UpdateY2() { - PollModule.Current.Poll_JustOnce(() => - { - double target = Target; - double tolerancePercent = TolerancePercent; + double target = Target; + double tolerancePercent = TolerancePercent; - double tolerance = target * tolerancePercent; - if (tolerance < 0.1) - tolerance = 0.1; + double tolerance = target * tolerancePercent; + if (tolerance < 0.1) + tolerance = 0.1; - ToleranceYMax = target + tolerance; - ToleranceYMin = target - tolerance; - Tolerance2YMax = target + tolerance * 2; - Tolerance2YMin = target - tolerance * 2; + ToleranceYMax = target + tolerance; + ToleranceYMin = target - tolerance; + Tolerance2YMax = target + tolerance * 2; + Tolerance2YMin = target - tolerance * 2; - YMax = target + tolerance * graphparam.YRangePercent; - YMin = target - tolerance * graphparam.YRangePercent; + YMax = target + tolerance * graphparam.YRangePercent; + YMin = target - tolerance * graphparam.YRangePercent; + } + void UpdateY2_delay() + { + PollModule.Current.Poll_JustOnce(() => + { + UpdateY2(); }, this, MARKNO_Y); } void UpdateX() @@ -508,33 +618,37 @@ namespace FLY.Thick.Blowing.UI.UiModule { Update4IdChanged(); } - - void UpdateMaxMinText() + void UpdateMaxMinText_delay() { PollModule.Current.Poll_JustOnce(() => { - if (graphparam.IsPercent && (Average > 0)) - { - MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%"; - MinText = $"-{((Average - Min) / Average) * 100.0:F1}%"; - Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%"; - } - else - { - MaxText = $"{Max:F1}"; - MinText = $"{Min:F1}"; - Sigma2Text = $"{Sigma2:F1}"; - } + UpdateMaxMinText(); }, this, MARKNO_TEXT); } + protected void UpdateMaxMinText() + { + if (graphparam.IsPercent && (Average > 0)) + { + MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%"; + MinText = $"-{((Average - Min) / Average) * 100.0:F1}%"; + Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%"; + } + else + { + MaxText = $"{Max:F1}"; + MinText = $"{Min:F1}"; + Sigma2Text = $"{Sigma2:F1}"; + } + } - void Update4IdChanged2() + protected void Update4IdChanged2() { Values.Clear(); if (this.scanData == null) { Time = DateTime.MinValue; + EndTime = DateTime.MinValue; Id = -1; OrgBoltNo = -100; return; @@ -542,6 +656,7 @@ namespace FLY.Thick.Blowing.UI.UiModule else { Time = this.scanData.Time; + EndTime = this.scanData.EndTime; Id = this.scanData.ID; OrgBoltNo = this.scanData.OrgBoltNo; IsBackw = this.scanData.IsBackw; @@ -568,19 +683,45 @@ namespace FLY.Thick.Blowing.UI.UiModule Sigma2 = double.NaN; } } - void Update4IdChanged() + + bool IsNeedToGetFrame() { - if (graphparam.Number > 0 && bulkDb.LastScanDataId == Id) + if (Mix != graphparam.Mix) + { + return true; + } + + if (Number > 0) { - //ä¸éœ€è¦æ›´æ–°ï¼ï¼ï¼ï¼ï¼ï¼ï¼ + //ç»å¯¹ä½ç½®æ¨¡å¼ + if (Number != Id) + return true; + else + return false; } + //相对ä½ç½®æ¨¡å¼ + + if (Number == Id - bulkDb.LastScanDataId) + { + //å·²ç»æ˜¯éœ€è¦æŸ¥æ‰¾çš„记录 + return false; + } + + return true; + } + + void Update4IdChanged() + { + if (!IsNeedToGetFrame()) + return; bulkDb.GetFrame( - new Pack_GetFrameRequest() { Id = graphparam.Number, Mix = graphparam.Mix }, + new Pack_GetFrameRequest() { Id = Number, Mix = graphparam.Mix }, (object AsyncContext, object retData) => { Pack_GetFrameReponse reponse = retData as Pack_GetFrameReponse; + Mix = reponse.Request.Mix; //if (reponse.scanData != null) { this.scanData = reponse.scanData; @@ -594,7 +735,35 @@ namespace FLY.Thick.Blowing.UI.UiModule }, this); } - void NotifyPropertyChanged(string propertyName) + public void PreView() + { + Number -= NumberStep; + } + + public void NextView() + { + Number += NumberStep; + } + + public void ChangeLock() + { + IsLocked = !IsLocked; + } + + public void ResetNumber() + { + Number = graphparam.Number; + } + public void ChangeAutoLock() + { + ChangeLock(); + if (!IsLocked) + { + ResetNumber(); + } + } + + protected void NotifyPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2VmUt.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2VmUt.cs index aaccb678b5ef05207bcd5a5947fff84451890340..79340ddbabb49f1789db25c8f5f53f5ff65963fb 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2VmUt.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2VmUt.cs @@ -1,4 +1,5 @@ -using LiveCharts; +using FLY.Thick.Blowing.IService; +using LiveCharts; using LiveCharts.Configurations; using LiveCharts.Wpf; using Misc; @@ -11,154 +12,10 @@ using System.Windows.Media; namespace FLY.Thick.Blowing.UI.UiModule { - public class ScanGraph2VmUt : INotifyPropertyChanged + public class ScanGraph2VmUt : ScanGraph2Vm { - #region 图表控制 - public double YMax { get; set; } - public double YMin { get; set; } - public double Target { get; set; } - public double Tolerance2YMax { get; set; } - public double Tolerance2YMin { get; set; } - public double ToleranceYMax { get; set; } - public double ToleranceYMin { get; set; } - public double XMax { get; set; } - public double XMin { get; set; } - - public int XStep { get; set; } = 5; - - public Func<double, string> YFormatter { get; set; } - - public SeriesCollection Series { get; set; } - - #endregion - - #region 颜色 - List<Brush> AreaColors; - #endregion - - - #region ç•Œé¢ç»Ÿè®¡å€¼ - - public double Average { get; set; } - - - public string Sigma2Text { get; set; } - public string MaxText { get; set; } - public string MinText { get; set; } - - /// <summary> - /// æ··åˆæ•° - /// </summary> - public int Mix { get; set; } - - /// <summary> - /// 测é‡æ—¶é—´ - /// </summary> - public DateTime Time { get; set; } - - /// <summary> - /// æ—‹è½¬æ–¹å‘ æ˜¯åå‘ - /// </summary> - public bool IsBackw { get; private set; } - - /// <summary> - /// 旋转1周的时间 - /// </summary> - public TimeSpan RPeriod { get; private set; } - - - public DateTime Time2 { get; set; } - /// <summary> - /// æ•°æ®åº“ä¸çš„IDæ ‡ç¤º - /// </summary> - public int Id { get; set; } - - /// <summary> - /// å¤ä½åŒºå· - /// </summary> - public int OrgBoltNo { get; set; } - - public bool IsPercent { get; set; } - public bool IsAutoTarget { get; set; } - - - #endregion - - - - ChartValues<double> Values { get; } = new ChartValues<double>(); - ChartValues<double> Values2 { get; } = new ChartValues<double>(); - object Mapper { get; set; } - object Mapper2 { get; set; } - - public ScanGraph2VmUt() { - - #region 与数æ®æ— 关界é¢å‚æ•° - AreaColors = new List<Brush>(); - for (int i = 0; i < 5; i++) - AreaColors.Add(FLY.ControlLibrary.Themes.Styles.AreaColors[i]); - - - YFormatter = (y) => - { - if (IsPercent) - { - if (y == Average) - { - return y.ToString("F1"); - } - else - { - double percent = 100.0 * (y - Average) / Average; - if (percent > 0) - { - return $"+{Math.Abs(percent):F1}%"; - } - else { - return $"-{Math.Abs(percent):F1}%"; - } - - } - } - else { - return y.ToString("F1"); - } - }; - - Mapper = Mappers.Xy<double>() - .X((value, index) => index+1) - .Y(value => value) - .Fill((value) => - { - if (value > Tolerance2YMax) - { - return AreaColors[0]; - } - else if (value > ToleranceYMax) - { - return AreaColors[1]; - } - else if (value >= ToleranceYMin) - { - return AreaColors[2]; - } - else if (value >= Tolerance2YMin) - { - return AreaColors[1]; - } - else - { - return AreaColors[0]; - } - }); - - Mapper2 = Mappers.Xy<double>() - .X((value, index) => index + 1) - .Y(value => value); - - #endregion #region æ•°æ® double target = 150; double tolerance = target * 0.02; @@ -177,91 +34,64 @@ namespace FLY.Thick.Blowing.UI.UiModule datas2[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * tolerance + target + (random.NextDouble() - 0.5) * 1 - 6; } - #endregion - #region ç•Œé¢æ•°æ® - - + profileParam = new Common.BlowingFixProfileParam() + { + Target = target, + TolerancePercent = 0.02, + K = 1, + PName = "abc", + OrderNo = "12313121", + Number = "2" + }; - XMin = 0; - XMax = nbolts + 1; - XStep = 5; - Mix = 2; - Time = DateTime.Now; - Time2 = DateTime.Now - TimeSpan.FromMinutes(10); + graphparam = new ScanGraphItemParam() + { + IsPercent = true, + IsAutoTarget = true, + YRangePercent = 3, + Number = -1, + Mix = 2 + }; - IsBackw = true; - RPeriod = TimeSpan.FromMinutes(10.1); - Id = 312312; + scanData = new Server.Model.Lc_ScanData() + { + Time = DateTime.Now.AddSeconds(-60), + EndTime = DateTime.Now.AddSeconds(-30), + ID = 1234567, + K = 2, + Thicks = datas + }; + BulkDbTempFrameChangedEventArgs e = new BulkDbTempFrameChangedEventArgs() + { + Time = DateTime.Now.AddSeconds(-25), + EndTime = DateTime.Now, + StartIndex = 0, + D = datas2 + }; + #endregion + #region ç•Œé¢æ•°æ® - OrgBoltNo = 31; - IsPercent = true; - IsAutoTarget = true; - Values.AddRange(datas); - Values2.AddRange(datas2); - Average = datas.AverageNoNull(); + Mix = graphparam.Mix; + XStepOrg = 5; - double Max = datas.Max(); - double Min = datas.Min(); - double Sigma2 = datas.Sigma() * 2; + BulkDb_TempFrameChanged(null, e); - if (IsPercent) - { - MaxText = $"+{((Max - Average) / Average)*100.0:F1}%"; - MinText = $"-{((Average - Min) / Average) * 100.0:F1}%"; - Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%"; - } - else - { - MaxText = $"{Max:F1}"; - MinText = $"{Min:F1}"; - Sigma2Text = $"{Sigma2:F1}"; - } + Update4IdChanged2(); + UpdateOrgTarget(); - if (IsPercent || IsAutoTarget) - { - Target = Average; - } - else { - Target = target; - } + UpdateTarget(); + UpdateY2(); + UpdateMaxMinText(); - ToleranceYMax = Target + tolerance; - ToleranceYMin = Target - tolerance; - Tolerance2YMax = Target + tolerance * 2; - Tolerance2YMin = Target - tolerance * 2; - YMax = Target + tolerance * yrangepercent; - YMin = Target - tolerance * yrangepercent; + //UpdateX(); + XMax = nbolts + 1; #endregion - Series = new SeriesCollection - { - new Column2Series - { - Title = "扫æ图", - Values = Values, - StrokeThickness = 1, - Stroke = new SolidColorBrush(Colors.Black), - PointGeometry = null, - Configuration = Mapper - }, - new LineSeries - { - Title = "曲线图", - Values = Values2, - StrokeThickness = 3, - Stroke = new SolidColorBrush(Colors.DarkBlue), - Fill = new SolidColorBrush(Colors.Transparent), - PointGeometry = null, - Configuration = Mapper2 - } - }; - ((Series)Series[0]).SetBinding(Column2Series.YAxisCrossingProperty, new Binding("Target") { Source = this }); - } - public event PropertyChangedEventHandler PropertyChanged; + } } } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml index 3aba04e11f8aabdf0f2f6dc731c29dbd0f64bb33..1ba41cabadcc25d0c90e95350a295511c0b47b72 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml @@ -6,7 +6,7 @@ xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" mc:Ignorable="d" xmlns:local="clr-namespace:FLY.Thick.Blowing.UI.UiModule" - d:DesignHeight="300" d:DesignWidth="300"> + d:DesignHeight="400" d:DesignWidth="400"> <UserControl.Resources> @@ -14,10 +14,11 @@ <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/> <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/> + <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Colors.xaml"/> </ResourceDictionary.MergedDictionaries> <local:ScanGraphCircularVmUt x:Key="viewmodel"/> - <SolidColorBrush x:Key="TextBrush" Color="#4C4949" /> + <!--<SolidColorBrush x:Key="TextBrush" Color="#4C4949" /> <SolidColorBrush x:Key="GrayBrush1" Color="#FF727272"/> <SolidColorBrush x:Key="GrayBrush2" Color="#FF858484" /> <SolidColorBrush x:Key="SemiTransparentGreyBrush" Color="#99F0F0F0"/> @@ -44,10 +45,10 @@ <Setter Property="Foreground" Value="{StaticResource GrayBrush2}"/> <Setter Property="FontSize" Value="15"/> <Setter Property="VerticalAlignment" Value="Bottom"/> - </Style> + </Style>--> </ResourceDictionary> </UserControl.Resources> - <Border Style="{StaticResource BorderStyle_module}" > + <Border Style="{StaticResource Styles.Module.Border}" > <Grid d:DataContext="{StaticResource viewmodel}"> <Grid.RowDefinitions> <RowDefinition Height="auto"/> @@ -60,11 +61,11 @@ </Grid.ColumnDefinitions> <local:PolarChart x:Name="graph" Grid.Row="1" Grid.ColumnSpan="3" /> - <Button Style="{StaticResource ButtonStyle_icon}" Margin="0,0,0,-20" + <Button Style="{StaticResource Styles.Button.Icon}" Margin="0,0,0,-20" Click="Button_info_click" > - <Grid Style="{StaticResource GridStyle_ButtonShadow}" > + <Grid Style="{StaticResource Styles.Shadow}" > <TextBlock Padding="10,5" VerticalAlignment="Top" - FontSize="24" Foreground="White" Background="{StaticResource Color_theme_activity}" + FontSize="24" Foreground="White" Background="{StaticResource Brushes.Activity}" Text="环型图" /> </Grid> </Button> @@ -75,7 +76,9 @@ <StackPanel> <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="5"> - <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Time,StringFormat={}{0:MM-dd HH:mm:ss}}"/> + <TextBlock Style="{StaticResource ValueStyle}" > + <Run Text="{Binding Time,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm:ss}}"/>~<Run Text="{Binding EndTime,Mode=OneWay,StringFormat={}{0:HH:mm:ss}}"/> + </TextBlock> <StackPanel Orientation="Horizontal" Margin="5,0"> <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" /> <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml.cs index 9ecb0745cb650fd8e2d893b35d4b232d89d05925..bb80ae4a3e45d28b2d2cd5dfe35073b86f99772e 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml.cs @@ -14,7 +14,6 @@ namespace FLY.Thick.Blowing.UI.UiModule { ScanGraphCircularVm viewModel; ScanGraphCircularParam graphparam; - ParamDictionary paramDictionary; public ScanGraphCircular() { InitializeComponent(); @@ -24,7 +23,6 @@ namespace FLY.Thick.Blowing.UI.UiModule public void Init(int id, IUnityContainer container, IBulkDbService bulkDbService, IBlowingService blowingService, IBlowingFixProfileService blowingProfileService, ParamDictionary paramDictionary) { - this.paramDictionary = paramDictionary; //查找å‚æ•° graphparam = ScanGraphCircularParams.Current.Items.Find(p => p.ID == id); if (graphparam == null) @@ -49,7 +47,7 @@ namespace FLY.Thick.Blowing.UI.UiModule return; WdScanGraphCircularConfig window = new WdScanGraphCircularConfig(); - window.Init(graphparam, paramDictionary); + window.Init(graphparam, viewModel); window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this); window.ShowDialog(); } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVm.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVm.cs index 27eaf60a2394df52e96f7cd553e315997f84e61e..fc3125f6e17ff7d839ebe734f850507d86934807 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVm.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVm.cs @@ -3,6 +3,7 @@ using FLY.Thick.Blowing.Common; using FLY.Thick.Blowing.IService; using FLY.Thick.Blowing.Server.Model; using FObjBase; +using GalaSoft.MvvmLight.Command; using Misc; using System; using System.Collections.Generic; @@ -13,12 +14,19 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Data; +using System.Windows.Threading; namespace FLY.Thick.Blowing.UI.UiModule { public class ScanGraphCircularVm : INotifyPropertyChanged { const int MARKNO_TEXTUP = 1; + + /// <summary> + /// 自动切æ¢ä¸º DefaultNumber 倒计时 åˆå§‹å€¼ + /// </summary> + const int AutoKeepTotalSec = 60; + public event PropertyChangedEventHandler PropertyChanged; #region ç•Œé¢ç»Ÿè®¡å€¼ @@ -44,13 +52,16 @@ namespace FLY.Thick.Blowing.UI.UiModule /// <summary> /// æ··åˆæ•° /// </summary> - public int Mix { get; private set; } = 2; + public int Mix { get; protected set; } = 1; /// <summary> /// 测é‡æ—¶é—´ /// </summary> public DateTime Time { get; private set; } - + /// <summary> + /// 测é‡ç»“æŸæ—¶é—´ + /// </summary> + public DateTime EndTime { get; private set; } /// <summary> /// æ—‹è½¬æ–¹å‘ æ˜¯åå‘ /// </summary> @@ -68,21 +79,51 @@ namespace FLY.Thick.Blowing.UI.UiModule public long Id { get; private set; } = 1231221; public int OrgBoltNo { get; private set; } = -100; + /// <summary> + /// åªè¦ Number被改å˜,且ä¸ä¸º0, AutoKeepNewestTimeRemaining就会被设为10s. + /// 当 AutoKeepNewestTimeRemaining = 0, Number就会被设置为0 + /// </summary> + public int AutoKeepNewestTimeRemaining { get; protected set; } + + /// <summary> + /// Number == graphparam.Number + /// </summary> + public bool IsNewest { get; protected set; } = true; + + /// <summary> + /// é”上, Number ä¸ä¼š 自动å˜å›ž DefaultNumber,且 Number = Id + /// </summary> + public bool IsLocked { get; set; } + + /// <summary> + /// 记录点, 与 graphparam.Number 分离 + /// </summary> + public long Number { get; set; } + /// <summary> + /// 记录点 å˜åŒ–æ¥è¿› + /// </summary> + public int NumberStep { get; set; } = 1; + #endregion public int XStep { get; set; } = 5; - ScanGraphCircularParam graphparam; + ObservableCollection<double> Values { get; } = new ObservableCollection<double>(); + ObservableCollection<double> Values2 { get; } = new ObservableCollection<double>(); + + public RelayCommand AutoLockCmd { get; private set; } + + protected ScanGraphCircularParam graphparam; IBulkDbService bulkDb; - Lc_ScanData scanData; + protected Lc_ScanData scanData; Db_Profile profile; IBlowingService blowingService; - BlowingFixProfileParam profileParam; + protected BlowingFixProfileParam profileParam; + protected DispatcherTimer timer; + protected PolarChart graph; - ObservableCollection<double> Values { get; } = new ObservableCollection<double>(); - ObservableCollection<double> Values2 { get; } = new ObservableCollection<double>(); public ScanGraphCircularVm() { - + AutoLockCmd = new RelayCommand(ChangeAutoLock); } @@ -99,7 +140,7 @@ namespace FLY.Thick.Blowing.UI.UiModule this.bulkDb = bulkDb; this.blowingService = blowingService; this.profileParam = profileParam; - + this.graph = graph; graph.SetBinding(PolarChart.TolerancePercentProperty, new Binding(nameof(profileParam.TolerancePercent)) { Source = profileParam }); graph.SetBinding(PolarChart.TargetProperty, new Binding(nameof(profileParam.Target)) { Source = profileParam }); @@ -130,8 +171,9 @@ namespace FLY.Thick.Blowing.UI.UiModule graph.Values = Values; graph.LineValues = Values2; - Misc.BindingOperations.SetBinding(graphparam, nameof(graphparam.Mix), this, nameof(Mix)); - + + init_autoKeep(); + Id = -1; UpdateId(); @@ -142,8 +184,62 @@ namespace FLY.Thick.Blowing.UI.UiModule UpdateTemp(); } + void init_autoKeep() + { + + ResetNumber(); + + timer = new DispatcherTimer(); + timer.Interval = TimeSpan.FromSeconds(1); + timer.Tick += (s, e) => + { + if (Number == graphparam.Number) + { + timer.Stop(); + return; + } + + if (IsLocked) + { + return; + } - private void BulkDb_TempFrameChanged(object sender, EventArgs _e) + if (AutoKeepNewestTimeRemaining > 0) + AutoKeepNewestTimeRemaining--; + if (AutoKeepNewestTimeRemaining <= 0) + { + ResetNumber(); + timer.Stop(); + return; + } + }; + this.graphparam.PropertyChanged += (s, e) => + { + if (e.PropertyName == nameof(graphparam.Number)) + { + ResetNumber(); + timer.IsEnabled = false; + IsNewest = true; + AutoKeepNewestTimeRemaining = AutoKeepTotalSec; + } + }; + this.PropertyChanged += (s, e) => { + if (e.PropertyName == nameof(IsLocked)) + { + if (Id >= 0) + { + Number = Id; + } + } + else if (e.PropertyName == nameof(Number)) + { + timer.IsEnabled = Number != graphparam.Number; + IsNewest = !timer.IsEnabled; + AutoKeepNewestTimeRemaining = AutoKeepTotalSec; + } + }; + } + protected void BulkDb_TempFrameChanged(object sender, EventArgs _e) { BulkDbTempFrameChangedEventArgs e = (BulkDbTempFrameChangedEventArgs)_e; @@ -183,7 +279,11 @@ namespace FLY.Thick.Blowing.UI.UiModule private void ScanGraphCircularVm_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (propertyname_updateMaxMinText.Contains(e.PropertyName)) - UpdateMaxMinText(); + UpdateMaxMinText_delay(); + else if (e.PropertyName == nameof(Number)) + { + UpdateId(); + } } private void Graphparam_PropertyChanged(object sender, PropertyChangedEventArgs e) @@ -192,10 +292,7 @@ namespace FLY.Thick.Blowing.UI.UiModule { UpdateId(); } - else if (e.PropertyName == nameof(graphparam.Number)) - { - UpdateId(); - } + } private void BulkDb_PropertyChanged(object sender, PropertyChangedEventArgs e) { @@ -224,29 +321,34 @@ namespace FLY.Thick.Blowing.UI.UiModule { Update4IdChanged(); } - void UpdateMaxMinText() + void UpdateMaxMinText_delay() { PollModule.Current.Poll_JustOnce(() => { - if (Average > 0) - { - MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%"; - MinText = $"-{((Average - Min) / Average) * 100.0:F1}%"; - Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%"; - } - else - { - MaxText = $"{Max:F1}"; - MinText = $"{Min:F1}"; - Sigma2Text = $"{Sigma2:F1}"; - } + UpdateMaxMinText(); }, this, MARKNO_TEXTUP); } - void UpdateAverage() + protected void UpdateMaxMinText() + { + if (Average > 0) + { + MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%"; + MinText = $"-{((Average - Min) / Average) * 100.0:F1}%"; + Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%"; + } + else + { + MaxText = $"{Max:F1}"; + MinText = $"{Min:F1}"; + Sigma2Text = $"{Sigma2:F1}"; + } + } + protected void UpdateAverage() { if (this.scanData == null) { Time = DateTime.MinValue; + EndTime = DateTime.MinValue; Id = -1; OrgBoltNo = -100; return; @@ -254,6 +356,7 @@ namespace FLY.Thick.Blowing.UI.UiModule else { Time = this.scanData.Time; + EndTime = this.scanData.EndTime; Id = this.scanData.ID; OrgBoltNo = this.scanData.OrgBoltNo; IsBackw = this.scanData.IsBackw; @@ -280,22 +383,45 @@ namespace FLY.Thick.Blowing.UI.UiModule } } - void Update4IdChanged() + + bool IsNeedToGetFrame() { - if (graphparam.Number > 0 - && bulkDb.LastScanDataId == Id - && Mix == graphparam.Mix) + if (Mix != graphparam.Mix) { - //ä¸éœ€è¦æ›´æ–°ï¼ï¼ï¼ï¼ï¼ï¼ï¼ - return; + return true; + } + + if (Number > 0) + { + //ç»å¯¹ä½ç½®æ¨¡å¼ + if (Number != Id) + return true; + else + return false; } + //相对ä½ç½®æ¨¡å¼ + + if (Number == Id - bulkDb.LastScanDataId) + { + //å·²ç»æ˜¯éœ€è¦æŸ¥æ‰¾çš„记录 + return false; + } + + return true; + } + + void Update4IdChanged() + { + if (!IsNeedToGetFrame()) + return; bulkDb.GetFrame( - new Pack_GetFrameRequest() { Id = graphparam.Number, Mix = graphparam.Mix }, + new Pack_GetFrameRequest() { Id = Number, Mix = graphparam.Mix }, (object AsyncContext, object retData) => { Pack_GetFrameReponse reponse = retData as Pack_GetFrameReponse; + Mix = reponse.Request.Mix; if (reponse.scanData != null) { this.scanData = reponse.scanData; @@ -306,7 +432,7 @@ namespace FLY.Thick.Blowing.UI.UiModule }, this); } - void Update4IdChanged2() + protected void Update4IdChanged2() { //æ¸…é™¤å…¨éƒ¨æ•°æ® Values.Clear(); @@ -321,8 +447,35 @@ namespace FLY.Thick.Blowing.UI.UiModule } } + public void PreView() + { + Number -= NumberStep; + } + + public void NextView() + { + Number += NumberStep; + } + + public void ChangeLock() + { + IsLocked = !IsLocked; + } + + public void ResetNumber() + { + Number = graphparam.Number; + } + public void ChangeAutoLock() + { + ChangeLock(); + if (!IsLocked) + { + ResetNumber(); + } + } - void NotifyPropertyChanged(string propertyName) + protected void NotifyPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVmUt.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVmUt.cs index 6d6d4fd63b2469a6bc55cc0ff4f526015b987470..8ef0102ae43e4b693394405b623ab9098085b0b0 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVmUt.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVmUt.cs @@ -15,101 +15,110 @@ using System.Windows.Data; namespace FLY.Thick.Blowing.UI.UiModule { - public class ScanGraphCircularVmUt : INotifyPropertyChanged + public class ScanGraphCircularVmUt : ScanGraphCircularVm { - public event PropertyChangedEventHandler PropertyChanged; + public ScanGraphCircularVmUt() + { + #region æ•°æ® + double target = 150; + double tolerance = target * 0.02; + double yrangepercent = 3; + int nbolts = 80; + double[] datas = new double[nbolts]; + Random random = new Random(); + for (int i = 0; i < nbolts; i++) + { + datas[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * tolerance + target + (random.NextDouble() - 0.5) * 1 - 6; + } - #region ç•Œé¢ç»Ÿè®¡å€¼ - /// <summary> - /// å¹³å‡å€¼ - /// </summary> - public double Average { get; private set; } = double.NaN; + double[] datas2 = new double[nbolts]; + for (int i = 0; i < nbolts; i++) + { + datas2[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * tolerance + target + (random.NextDouble() - 0.5) * 1 - 6; + } - public double Sigma2 { get; private set; } = double.NaN; - /// <summary> - /// 最大值 - /// </summary> - public double Max { get; private set; } = double.NaN; - /// <summary> - /// 最å°å€¼ - /// </summary> - public double Min { get; private set; } = double.NaN; + profileParam = new Common.BlowingFixProfileParam() + { + Target = target, + TolerancePercent = 0.02, + K = 1, + PName = "abc", + OrderNo = "12313121", + Number = "2" + }; + + graphparam = new ScanGraphCircularParam() + { + IsPercent = true, + IsAutoTarget = true, + YRangePercent = yrangepercent, + Number = -1, + Mix = 2 + }; - public string Sigma2Text { get; private set; } - public string MaxText { get; private set; } - public string MinText { get; private set; } - /// <summary> - /// æ··åˆæ•° - /// </summary> - public int Mix { get; private set; } = 2; + scanData = new Server.Model.Lc_ScanData() + { + Time = DateTime.Now.AddSeconds(-30), + EndTime = DateTime.Now, + ID = 1234567, + K = 2, + Thicks = datas, + IsBackw = false, + FilmLength = 23.3, + FilmVelocity = 53.1, + OrgBoltNo = 41, + RAngle = 355, + RCnt = 6, + RPeriod = TimeSpan.FromMinutes(6.7) + }; + + BulkDbTempFrameChangedEventArgs e = new BulkDbTempFrameChangedEventArgs() + { + Time = DateTime.Now.AddSeconds(-25), + EndTime = DateTime.Now, + StartIndex = 0, + D = datas2 + }; + #endregion - /// <summary> - /// 测é‡æ—¶é—´ - /// </summary> - public DateTime Time { get; private set; } + #region ç•Œé¢æ•°æ® - /// <summary> - /// æ—‹è½¬æ–¹å‘ æ˜¯åå‘ - /// </summary> - public bool IsBackw { get; private set; } - /// <summary> - /// 旋转1周的时间 - /// </summary> - public TimeSpan RPeriod { get; private set; } + Mix = graphparam.Mix; + XStep = 5; + BulkDb_TempFrameChanged(null, e); - /// <summary> - /// æ•°æ®åº“ä¸çš„åºå· - /// </summary> - public long Id { get; private set; } = 1231221; - public int OrgBoltNo { get; private set; } = -100; + Update4IdChanged2(); - #endregion + UpdateMaxMinText(); - ObservableCollection<double> Values { get; }= new ObservableCollection<double>(); - public ScanGraphCircularVmUt() - { - #region æ•°æ® - double target = 100; - double tolerancePercent = 0.02; - double yrangepercent = 3; - int nbolts = 80; - double[] datas = new double[nbolts]; - Random random = new Random(); - for (int i = 0; i < nbolts; i++) - { - datas[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * (target*tolerancePercent) + target + (random.NextDouble() - 0.5) * 1 - 6; - } + //graph.SetBinding(PolarChart.TolerancePercentProperty, new Binding(nameof(profileParam.TolerancePercent)) { Source = profileParam }); + //graph.SetBinding(PolarChart.TargetProperty, new Binding(nameof(profileParam.Target)) { Source = profileParam }); - #endregion - #region ç•Œé¢æ•°æ® - Mix = 2; - Time = DateTime.Now; - Id = 312312; - OrgBoltNo = 31; - Values.Clear(); - foreach(var data in datas) - Values.Add(data); - Average = datas.AverageNoNull(); - - IsBackw = false; - RPeriod = TimeSpan.FromSeconds(60 * 6.5); - - double Max = datas.Max(); - double Min = datas.Min(); - double Sigma2 = datas.Sigma() * 2; - - MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%"; - MinText = $"-{((Average - Min) / Average) * 100.0:F1}%"; - Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%"; + //graph.SetBinding(PolarChart.YRangePercentProperty, new Binding(nameof(graphparam.YRangePercent)) { Source = graphparam }); + + //graph.SetBinding(PolarChart.IsPercentProperty, new Binding(nameof(graphparam.IsPercent)) { Source = graphparam }); + //graph.SetBinding(PolarChart.IsAutoTargetProperty, new Binding(nameof(graphparam.IsAutoTarget)) { Source = graphparam }); + //graph.SetBinding(PolarChart.HasAlianZoneProperty, new Binding(nameof(graphparam.HasAlianZone)) { Source = graphparam }); + //graph.SetBinding(PolarChart.AlianZoneBoltNoOf3oClockProperty, new Binding(nameof(graphparam.AlianZoneBoltNoOf3oClock)) { Source = graphparam }); + //graph.SetBinding(PolarChart.AlianZoneBoltCntProperty, new Binding(nameof(graphparam.AlianZoneBoltCnt)) { Source = graphparam }); + //graph.SetBinding(PolarChart.AlianZoneIsCCWProperty, new Binding(nameof(graphparam.AlianZoneIsCCW)) { Source = graphparam }); + //graph.SetBinding(PolarChart.AlianZoneIsShowXStepProperty, new Binding(nameof(graphparam.AlianZoneIsShowXStep)) { Source = graphparam }); + + //graph.BoltCnt = nbolts; + //graph.BPC = 1; + //graph.OrgBoltNo = scanData.OrgBoltNo; + //graph.MPIsRight = true; + //graph.IsForwCW = false; + //graph.XStep = XStep; #endregion } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml index a33678ed5852198f50eaefb0ae3ccc763340dfa7..f51de709acf1c078de5b775678803d2ba6e3b8b8 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml @@ -7,118 +7,166 @@ xmlns:uiModule="clr-namespace:FLY.Thick.Blowing.UI.UiModule" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" mc:Ignorable="d" - SizeToContent="WidthAndHeight" > + SizeToContent="WidthAndHeight" MinHeight="450" MinWidth="450" > <Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> - <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/> <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/> </ResourceDictionary.MergedDictionaries> <uiModule:ScanGraphCircularParam x:Key="ScanGraphCircularParam"/> </ResourceDictionary> </Window.Resources> - - <Grid TextBlock.FontSize="24" TextBlock.FontStyle="Normal" Background="WhiteSmoke" > - <Grid x:Name="grid_viewModel" /> - <StackPanel Margin="5,20" DataContext="{Binding GraphParam}" d:DataContext="{StaticResource ScanGraphCircularParam}"> - - <StackPanel> - <StackPanel Orientation="Horizontal"> - <StackPanel Margin="5"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="æ··åˆæ•°" /> + <StackPanel Margin="{StaticResource ControlMargin}" > + <Grid Height="20" x:Name="grid_scanGraphVm"/> + <Grid Height="20" x:Name="grid_graphParam"/> + <TabControl > + <TabItem Header="æµè§ˆ"> + <StackPanel> + <StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=grid_scanGraphVm,Path=DataContext}"> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Mix}" /> - </StackPanel> - </StackPanel> - <StackPanel Orientation="Horizontal"> - <StackPanel Margin="5"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="记录点" /> - <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Number}" /> - </StackPanel> - </StackPanel> - <StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}"> - <Button Style="{StaticResource ButtonStyle_largeIcon}" Command="{Binding PreCmd}"> - <Grid> - <Ellipse Fill="White" Margin="2"/> - <iconPacks:PackIconMaterial Kind="ArrowLeftBoldCircle" /> - </Grid> + <Button Style="{StaticResource Styles.Button.Icon}" Click="btnLockClick" > + <iconPacks:PackIconMaterial > + <iconPacks:PackIconMaterial.Style> + <Style TargetType="iconPacks:PackIconMaterial" BasedOn="{StaticResource Styles.Icon.Base}"> + <Setter Property="Kind" Value="Lock"/> + <Style.Triggers> + <DataTrigger Binding="{Binding IsLocked}" Value="False"> + <Setter Property="Foreground" Value="Gray"/> + <Setter Property="Kind" Value="LockOff"/> + </DataTrigger> + </Style.Triggers> + </Style> + </iconPacks:PackIconMaterial.Style> + </iconPacks:PackIconMaterial> </Button> - <Button Style="{StaticResource ButtonStyle_largeIcon}" Command="{Binding NextCmd}"> - <Grid> - <Ellipse Fill="White" Margin="2"/> - <iconPacks:PackIconMaterial Kind="ArrowRightBoldCircle" /> + <StackPanel Margin="{StaticResource ControlMargin}"> + <Grid HorizontalAlignment="Left"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="记录点" /> + <!--当ä¸æ˜¯æœ€æ–°, 弹出 自动按[最新] 倒计时--> + <Button Style="{StaticResource Styles.Button.Empty}" Click="btnResetNumberClick" + VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0,0,-10,-10" + Visibility="{Binding IsNewest, Converter={StaticResource visbilityconv}, ConverterParameter=HiddenWhenTrue}"> + <Grid Width="20" Height="20" > + <Ellipse Fill="{StaticResource Brushes.Highlight}" /> + <TextBlock Text="{Binding AutoKeepNewestTimeRemaining}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/> + </Grid> + </Button> </Grid> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Number}" /> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Separator}"/> + <Button Style="{StaticResource Styles.Button.Empty}" Click="btnResetNumberClick"> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" DataContext="{Binding ElementName=grid_graphParam,Path=DataContext}"> + 默认值:<Run Text="{Binding Number}"/> + </TextBlock> + </Button> + </StackPanel> + </StackPanel> + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnPreClick"> + <iconPacks:PackIconMaterial Kind="ArrowLeft" /> </Button> + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnNextClick"> + <iconPacks:PackIconMaterial Kind="ArrowRight" /> + </Button> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="æ¥è¿›" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding NumberStep}" /> + </StackPanel> + </StackPanel> </StackPanel> - </StackPanel> + </StackPanel> - <StackPanel Orientation="Horizontal"> - <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="Yè½´å€æ•°" /> - <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding YRangePercent}" /> - </StackPanel> - </StackPanel> - <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="Xè½´é—´éš”" /> - <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding XStep}" /> + </TabItem> + <TabItem Header="视图"> + <StackPanel> + <StackPanel Orientation="Horizontal"> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="默认记录点" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Number}" /> + </StackPanel> </StackPanel> </StackPanel> - <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="%显示" /> - <StackPanel Orientation="Horizontal"> - <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding IsPercent}"/> + <StackPanel Orientation="Horizontal" > + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="æ··åˆæ•°" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Mix}" /> + </StackPanel> </StackPanel> - </StackPanel> - <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="è‡ªåŠ¨ç›®æ ‡å€¼" /> - <StackPanel Orientation="Horizontal"> - <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding IsAutoTarget}"/> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Yè½´å€æ•°" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding YRangePercent}" /> + </StackPanel> </StackPanel> - </StackPanel> - </StackPanel> - <StackPanel Orientation="Horizontal"> - <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="é¢å¤–分区" /> - <StackPanel Orientation="Horizontal"> - <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding HasAlianZone}"/> + <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding ElementName=grid_scanGraphVm,Path=DataContext}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Xè½´é—´éš”" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding XStep}" /> + </StackPanel> </StackPanel> </StackPanel> - </StackPanel> - <GroupBox Header="é¢å¤–分区" Visibility="{Binding HasAlianZone,Converter={StaticResource visbilityconv}}"> <StackPanel Orientation="Horizontal"> <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="3点对应" /> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="%显示" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding AlianZoneBoltNoOf3oClock}" /> + <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding IsPercent}"/> </StackPanel> </StackPanel> - <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="分区数" /> + <StackPanel Margin="{StaticResource ControlMargin}" > + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="è‡ªåŠ¨ç›®æ ‡å€¼" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding AlianZoneBoltCnt}" /> + <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding IsAutoTarget}"/> </StackPanel> </StackPanel> + </StackPanel> + <StackPanel Orientation="Horizontal"> <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="逆时针" /> + <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="é¢å¤–分区" /> <StackPanel Orientation="Horizontal"> - <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding AlianZoneIsCCW}"/> + <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding HasAlianZone}"/> </StackPanel> </StackPanel> - <StackPanel Margin="{StaticResource ControlMargin}"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="X轴线为é¢å¤–分区" /> - <StackPanel Orientation="Horizontal"> - <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding AlianZoneIsShowXStep}"/> + </StackPanel> + <GroupBox Visibility="{Binding HasAlianZone,Converter={StaticResource visbilityconv}}"> + <GroupBox.Header> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Comment}" Text="é¢å¤–分区"/> + </GroupBox.Header> + <StackPanel Orientation="Horizontal"> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="3点对应" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding AlianZoneBoltNoOf3oClock}" /> + </StackPanel> + </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="分区数" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding AlianZoneBoltCnt}" /> + </StackPanel> + </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="逆时针" /> + <StackPanel Orientation="Horizontal"> + <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding AlianZoneIsCCW}"/> + </StackPanel> + </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="X轴线为é¢å¤–分区" /> + <StackPanel Orientation="Horizontal"> + <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding AlianZoneIsShowXStep}"/> + </StackPanel> </StackPanel> </StackPanel> - </StackPanel> - </GroupBox> - </StackPanel> - <Button Style="{StaticResource ButtonStyle_apply}" Command="{Binding ApplyCmd}" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}"/> - </StackPanel> - </Grid> + </GroupBox> + <Button Style="{StaticResource Styles.Button.Apply}" Click="btnOkClick"/> + </StackPanel> + </TabItem> + </TabControl> + </StackPanel> + </flyctrllib:WindowBigClose> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml.cs index 3471b4fa1a260b2ccff6e830f3382abb7f23ecc9..0e3fde32ee7dc51f5fbc5a84244c9d53a73d9f78 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml.cs @@ -1,6 +1,7 @@ using GalaSoft.MvvmLight.Command; using Misc; using System.ComponentModel; +using System.Windows; namespace FLY.Thick.Blowing.UI.UiModule { @@ -9,7 +10,8 @@ namespace FLY.Thick.Blowing.UI.UiModule /// </summary> public partial class WdScanGraphCircularConfig : FLY.ControlLibrary.WindowBigClose { - WdScanGraphCircularConfigVm viewModel; + ScanGraphCircularParam graphparam; + ScanGraphCircularVm scanGraphVm; public WdScanGraphCircularConfig() { @@ -17,60 +19,38 @@ namespace FLY.Thick.Blowing.UI.UiModule } - public void Init(ScanGraphCircularParam graphparam, ParamDictionary paramDictionary) + public void Init(ScanGraphCircularParam graphparam, ScanGraphCircularVm scanGraphVm) { - viewModel = new WdScanGraphCircularConfigVm(); - viewModel.Init(graphparam, paramDictionary); - this.DataContext = viewModel; - } - } - - public class WdScanGraphCircularConfigVm : INotifyPropertyChanged - { - public event PropertyChangedEventHandler PropertyChanged; - - public ScanGraphCircularParam GraphParam { get; private set; } - - - #region CMD - public RelayCommand PreCmd { get; private set; } - public RelayCommand NextCmd { get; private set; } - public RelayCommand ApplyCmd { get; private set; } - #endregion + this.scanGraphVm = scanGraphVm; + this.graphparam = graphparam; + this.grid_scanGraphVm.DataContext = scanGraphVm; + this.DataContext = graphparam; + } - public int XStep { get; set; } = 5; - - public WdScanGraphCircularConfigVm() + private void btnPreClick(object sender, RoutedEventArgs e) { - PreCmd = new RelayCommand(Pre); - NextCmd = new RelayCommand(Next); - ApplyCmd = new RelayCommand(Apply); + scanGraphVm.PreView(); } - - - public void Init(ScanGraphCircularParam graphparam, ParamDictionary paramDictionary) + private void btnNextClick(object sender, RoutedEventArgs e) { - GraphParam = graphparam; - paramDictionary.SetBinding(this, nameof(XStep), 5); + scanGraphVm.NextView(); } - private void Next() + private void btnOkClick(object sender, RoutedEventArgs e) { - GraphParam.Number--; + ScanGraphCircularParams.Current.Save(); } - private void Pre() + private void btnLockClick(object sender, RoutedEventArgs e) { - GraphParam.Number++; + scanGraphVm.ChangeLock(); } - private void Apply() + private void btnResetNumberClick(object sender, RoutedEventArgs e) { - - //比较,å†åº”用 - ScanGraphCircularParams.Current.Save(); + scanGraphVm.ResetNumber(); } } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml new file mode 100644 index 0000000000000000000000000000000000000000..d890155fe8097396ef1c03dee3ab89917e1818bd --- /dev/null +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml @@ -0,0 +1,195 @@ +<UserControl x:Class="FLY.Thick.Blowing.UI.UiModule.TrendGraph" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:local="clr-namespace:FLY.Thick.Blowing.UI.UiModule" + xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:lvc1="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Feng.Wpf" + mc:Ignorable="d" + d:DesignHeight="300" d:DesignWidth="800" > + <UserControl.Resources> + <ResourceDictionary> + <ResourceDictionary.MergedDictionaries> + <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/> + <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/> + <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Colors.xaml"/> + </ResourceDictionary.MergedDictionaries> + + <local:TrendGraphVmUt x:Key="viewmodel"/> + </ResourceDictionary> + </UserControl.Resources> + <Border Style="{StaticResource BorderStyle_module}" > + <Grid d:DataContext="{StaticResource viewmodel}"> + <Grid.RowDefinitions> + <RowDefinition Height="auto"/> + <RowDefinition Height="100*"/> + <RowDefinition Height="70*"/> + </Grid.RowDefinitions> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="auto"/> + <ColumnDefinition Width="400*"/> + <ColumnDefinition Width="350*"/> + </Grid.ColumnDefinitions> + <lvc:CartesianChart Grid.Row="1" Grid.ColumnSpan="3" + Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2"> + <lvc:CartesianChart.Resources> + <Style TargetType="lvc1:Column2Series"> + <Setter Property="PointGeometry" Value="{x:Null}"/> + <Setter Property="StrokeThickness" Value="0" /> + </Style> + </lvc:CartesianChart.Resources> + <lvc:CartesianChart.Series> + <lvc1:Column2Series + Values="{Binding Values}" + Configuration="{Binding MapperPositive}"/> + <lvc1:Column2Series + Values="{Binding Values}" + Configuration="{Binding MapperNegative}"/> + </lvc:CartesianChart.Series> + <lvc:CartesianChart.AxisX> + <lvc:Axis Foreground="Black" + LabelFormatter="{Binding XFormatter}" + MinValue="0" MaxValue="{Binding XMax}" + > + <lvc:Axis.Separator> + <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/> + </lvc:Axis.Separator> + </lvc:Axis> + </lvc:CartesianChart.AxisX> + <lvc:CartesianChart.AxisY> + <lvc:Axis LabelFormatter="{Binding YFormatter}" Foreground="Transparent" + MinValue="{Binding YMin}" MaxValue="{Binding YMax}" FontFamily="Courier New" > + + <lvc:Axis.Sections> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMax}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMin}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="0" Stroke="{StaticResource Brushes.ChartAxisLabel0}" /> + </lvc:Axis.Sections> + <lvc:Axis.Separator> + <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" /> + </lvc:Axis.Separator> + </lvc:Axis> + </lvc:CartesianChart.AxisY> + </lvc:CartesianChart> + <lvc:CartesianChart Grid.Row="2" Grid.ColumnSpan="3" + Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2"> + <lvc:CartesianChart.Resources> + <Style TargetType="lvc:LineSeries"> + <Setter Property="PointGeometry" Value="{x:Null}"/> + <Setter Property="StrokeThickness" Value="3" /> + <Setter Property="Fill" Value="{StaticResource Brushes.ChartArea4}"/> + <Setter Property="Stroke" Value="{StaticResource Brushes.ChartArea0}"/> + </Style> + </lvc:CartesianChart.Resources> + <lvc:CartesianChart.Series> + <lvc:LineSeries + Values="{Binding Values}" + Configuration="{Binding MapperValue}"/> + </lvc:CartesianChart.Series> + <lvc:CartesianChart.AxisX> + <lvc:Axis Foreground="{StaticResource Brushes.ChartAxisLabel}" + LabelFormatter="{Binding XFormatter}" + MinValue="0" MaxValue="{Binding XMax}" + > + <lvc:Axis.Separator> + <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/> + </lvc:Axis.Separator> + </lvc:Axis> + </lvc:CartesianChart.AxisX> + <lvc:CartesianChart.AxisY> + <lvc:Axis LabelFormatter="{Binding YFormatter2}" Foreground="{StaticResource Brushes.ChartAxisLabel}" MinRange="1" + FontFamily="Courier New" > + <lvc:Axis.Separator> + <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" /> + </lvc:Axis.Separator> + </lvc:Axis> + </lvc:CartesianChart.AxisY> + </lvc:CartesianChart> + <Button Style="{StaticResource ButtonStyle_icon}" Margin="48,0,0,-20" + Click="Button_info_click" > + <Grid Style="{StaticResource GridStyle_ButtonShadow}" > + <TextBlock Padding="10,5" VerticalAlignment="Top" + FontSize="24" Foreground="White" Background="{StaticResource Brushes.Activity}" + Text="趋势图" /> + </Grid> + </Button> + <StackPanel Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" VerticalAlignment="Top" HorizontalAlignment="Left" + Margin="{StaticResource ControlMargin}"> + <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2"> + <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" > + <TextBlock Style="{StaticResource ValueStyle}" > + <Run Text="{Binding BeginTime,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm}}"/> + 至 + <Run Text="{Binding EndTime,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm}}"/> + </TextBlock> + </StackPanel> + </Viewbox> + <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2"> + <StackPanel Orientation="Horizontal" Margin="{StaticResource Margin.Text}" + Background="{StaticResource SemiTransparentGreyBrush2}"> + <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" /> + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/> + </StackPanel> + </Viewbox> + </StackPanel> + <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" + Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right" + Background="{StaticResource SemiTransparentGreyBrush}" > + <Viewbox MaxHeight="50"> + <StackPanel Margin="5"> + <StackPanel.Resources> + <Style TargetType="Viewbox"> + <Setter Property="Height" Value="25"/> + <Setter Property="Width" Value="120"/> + <Setter Property="HorizontalAlignment" Value="Left"/> + <Setter Property="VerticalAlignment" Value="Top"/> + </Style> + </StackPanel.Resources> + <StackPanel Orientation="Horizontal"> + <Viewbox > + <StackPanel Orientation="Horizontal"> + <TextBlock Style="{StaticResource TitleStyle}" + Foreground="{StaticResource WhiteBrush}" + Background="{StaticResource TextBrush}" + Opacity="0.8" + Text="å¹³å‡: " + /> + <TextBlock Style="{StaticResource ValueStyle}" + Foreground="{StaticResource WhiteBrush}" + Background="{StaticResource TextBrush}" + Text="{Binding Average,Mode=OneWay,StringFormat={}{0:P1}}" + > + </TextBlock> + </StackPanel> + </Viewbox> + </StackPanel> + <StackPanel Orientation="Horizontal"> + <Viewbox > + <StackPanel Orientation="Horizontal"> + <TextBlock Style="{StaticResource TitleStyle}" Text="最大: "/> + <TextBlock Style="{StaticResource ValueStyle}" + Text="{Binding Max,Mode=OneWay,StringFormat={}{0:P1}}"/> + </StackPanel> + </Viewbox> + <Viewbox > + <StackPanel Orientation="Horizontal" > + <TextBlock Style="{StaticResource TitleStyle}" + Text="最å°: " /> + <TextBlock Style="{StaticResource ValueStyle}" + Text="{Binding Min,Mode=OneWay,StringFormat={}{0:P1}}"/> + </StackPanel> + </Viewbox> + </StackPanel> + + </StackPanel> + </Viewbox> + </Grid> + </Grid> + </Border> +</UserControl> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml.cs new file mode 100644 index 0000000000000000000000000000000000000000..f3f1092f22cd783f455b5fbfe5d50afdbd1a4d0a --- /dev/null +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml.cs @@ -0,0 +1,51 @@ +using FLY.Thick.Base.UI; +using FLY.Thick.Blowing.IService; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Forms; +using Unity; + +namespace FLY.Thick.Blowing.UI.UiModule +{ + /// <summary> + /// TrendGraph2.xaml 的交互逻辑 + /// </summary> + public partial class TrendGraph : System.Windows.Controls.UserControl + { + TrendGraphVm viewModel; + TrendGraphItemParam graphparam; + public TrendGraph() + { + InitializeComponent(); + } + + [InjectionMethod] + public void Init(int id, + IBulkDbService bulkDb, + IBlowingFixProfileService profileService) + { + + graphparam = TrendGraphParams.Current.Items.Find(p => p.ID == id); + if (graphparam == null) + { + graphparam = new TrendGraphItemParam() { ID = id }; + TrendGraphParams.Current.Items.Add(graphparam); + TrendGraphParams.Current.Save(); + } + viewModel = new TrendGraphVm(); + viewModel.Init(graphparam, bulkDb, profileService.Param); + this.DataContext = viewModel; + } + + private void Button_info_click(object sender, RoutedEventArgs e) + { + if (!WdPassword.Authorize("GraphConfig")) + return; + + TrendGraphConfig window = new TrendGraphConfig(); + window.Init(graphparam,viewModel); + window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this); + window.ShowDialog(); + } + } +} diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml similarity index 57% rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml index a94233ad46c5efbe5201ed6da971b02c749a4cd4..b219728df1f4f643553ead011090d6b5e9c3161c 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml @@ -1,12 +1,13 @@ -<flyctrllib:WindowBigClose x:Class="FLY.Thick.Blowing.UI.UiModule.TrendGraphConfig2" +<flyctrllib:WindowBigClose x:Class="FLY.Thick.Blowing.UI.UiModule.TrendGraphConfig" xmlns:flyctrllib="clr-namespace:FLY.ControlLibrary;assembly=FLY.ControlLibrary" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" - Background="WhiteSmoke" - SizeToContent="WidthAndHeight" + xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" + + SizeToContent="WidthAndHeight" MinHeight="450" MinWidth="450" > <Window.Resources> <ResourceDictionary> @@ -17,19 +18,41 @@ </ResourceDictionary> </Window.Resources> - <Grid Width="400"> + <Grid Background="White"> <Grid x:Name="grid_trend"/> - <StackPanel Margin="5,20"> + <StackPanel Margin="{StaticResource ControlMargin}"> + <Grid Height="20"/> + <StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}" DataContext="{Binding DataContext,ElementName=grid_trend}"> + <DatePicker + Width="200" + Margin="{StaticResource ControlMargin}" + Height="auto" + HorizontalAlignment="Center" + HorizontalContentAlignment="Stretch" + controls:TextBoxHelper.UseFloatingWatermark="True" + controls:TextBoxHelper.Watermark="开始日期" + controls:TextBoxHelper.WatermarkAlignment="Right" + SelectedDate="{Binding SearchTime}"/> + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnSeachClick"> + <iconPacks:PackIconMaterial Kind="Magnify" /> + </Button> + </StackPanel> <StackPanel Orientation="Horizontal" DataContext="{Binding DataContext,ElementName=grid_trend}"> - <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Click="btnPreClick"> - <Grid> - <iconPacks:PackIconMaterial Kind="ArrowLeft" /> - </Grid> + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnPreClick"> + <iconPacks:PackIconMaterial Kind="ArrowLeft" /> </Button> + <StackPanel VerticalAlignment="Center"> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" > + <Run Text="最新ID:"/><Run Text="{Binding NewestId,Mode=OneWay}"/> + </TextBlock> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" > + <Run Text="当å‰ID:"/><Run Text="{Binding Id,Mode=OneWay}"/> + </TextBlock> + </StackPanel> <Button Click="btnNextClick"> <Button.Style> - <Style TargetType="Button" BasedOn="{StaticResource ButtonStyle_RectangleIcon}"> + <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}"> <Style.Triggers> <DataTrigger Binding="{Binding IsNewest}" Value="True"> <Setter Property="Foreground" Value="Gray"/> @@ -38,13 +61,11 @@ </Style.Triggers> </Style> </Button.Style> - <Grid> - <iconPacks:PackIconMaterial Kind="ArrowRight" /> - </Grid> + <iconPacks:PackIconMaterial Kind="ArrowRight" /> </Button> <Button Click="btnNewestClick"> <Button.Style> - <Style TargetType="Button" BasedOn="{StaticResource ButtonStyle_RectangleIcon}"> + <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}"> <Style.Triggers> <DataTrigger Binding="{Binding IsNewest}" Value="True"> <Setter Property="Foreground" Value="Gray"/> @@ -71,31 +92,31 @@ </Grid> </Grid> </Button> - <TextBlock Style="{StaticResource TextBlockStyle_FieldContent}" Text="æ›´æ–°ä¸" Visibility="{Binding IsLoading,Converter={StaticResource visbilityconv}}"/> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="æ›´æ–°ä¸" Visibility="{Binding IsLoading,Converter={StaticResource visbilityconv}}"/> </StackPanel> <StackPanel Orientation="Horizontal" > <StackPanel Margin="5"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="æ··åˆæ•°" /> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="æ··åˆæ•°" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Mix}" /> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Mix}" /> </StackPanel> </StackPanel> <StackPanel Margin="5"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="Yè½´å€æ•°" /> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Yè½´å€æ•°" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding YRangePercent}" /> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding YRangePercent}" /> </StackPanel> </StackPanel> <StackPanel Margin="5"> - <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="é—´éš”" /> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="é—´éš”" /> <StackPanel Orientation="Horizontal"> - <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Interval}" /> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Interval}" /> </StackPanel> </StackPanel> </StackPanel> - <Button Style="{StaticResource ButtonStyle_apply}" Click="btnOkClick"/> + <Button Style="{StaticResource Styles.Button.Apply}" Click="btnOkClick"/> </StackPanel> </Grid> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml.cs similarity index 61% rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml.cs rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml.cs index d3ee8662596fcab199ce1acdddf84f4cc60e51f2..197d97fd8290019d9453a09c5d5b2a4e0bb4e78e 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml.cs @@ -19,43 +19,49 @@ namespace FLY.Thick.Blowing.UI.UiModule /// <summary> /// Window_graphtrend.xaml 的交互逻辑 /// </summary> - public partial class TrendGraphConfig2 : FLY.ControlLibrary.WindowBigClose + public partial class TrendGraphConfig : FLY.ControlLibrary.WindowBigClose { - TrendGraphItemParam2 graphparam; - TrendGraphVm2 trendGraphVm2; - public TrendGraphConfig2() + TrendGraphItemParam graphparam; + TrendGraphVm trendGraphVm; + public TrendGraphConfig() { InitializeComponent(); } - public void Init(TrendGraphItemParam2 graphparam, TrendGraphVm2 trendGraphVm2) + public void Init(TrendGraphItemParam graphparam, TrendGraphVm trendGraphVm) { this.graphparam = graphparam; - this.trendGraphVm2 = trendGraphVm2; + this.trendGraphVm = trendGraphVm; this.DataContext = graphparam; - this.grid_trend.DataContext = trendGraphVm2; + this.grid_trend.DataContext = trendGraphVm; } private void btnPreClick(object sender, RoutedEventArgs e) { - trendGraphVm2.PreView(); + trendGraphVm.PreView(); } private void btnNextClick(object sender, RoutedEventArgs e) { - trendGraphVm2.NextView(); + trendGraphVm.NextView(); } private void btnOkClick(object sender, RoutedEventArgs e) { - TrendGraphParam2s.Current.Save(); + TrendGraphParams.Current.Save(); } private void btnNewestClick(object sender, RoutedEventArgs e) { - trendGraphVm2.ToNewest(); + trendGraphVm.ToNewest(); } + + private void btnSeachClick(object sender, RoutedEventArgs e) + { + trendGraphVm.Search(trendGraphVm.SearchTime); + } + } } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphItemParam2.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphItemParam.cs similarity index 96% rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphItemParam2.cs rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphItemParam.cs index 982ed3ac13cbfd706403a9ce734592739033f0eb..8035cb8bdcc430e454aa6ca938f7f3bffac3cb1a 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphItemParam2.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphItemParam.cs @@ -10,7 +10,7 @@ namespace FLY.Thick.Blowing.UI.UiModule /// <summary> /// 纵å‘图的å‚æ•° /// </summary> - public class TrendGraphItemParam2 : UIModuleParam + public class TrendGraphItemParam : UIModuleParam { private int interval = 1; /// <summary> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphParam2s.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphParams.cs similarity index 68% rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphParam2s.cs rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphParams.cs index 74ff99e4cfb5b319ab9fceb4c4da8894b54e37f6..cf301d048009091d38f4de642e4978a64df22a2a 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphParam2s.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphParams.cs @@ -11,23 +11,23 @@ namespace FLY.Thick.Blowing.UI.UiModule /// <summary> /// 全部扫æ图的å‚æ•° /// </summary> - public class TrendGraphParam2s : UIModuleParams<TrendGraphItemParam2> + public class TrendGraphParams : UIModuleParams<TrendGraphItemParam> { - public TrendGraphParam2s() + public TrendGraphParams() { - string path = System.IO.Path.Combine(FlyLayout.BasePath, "trendgraph2.json"); + string path = System.IO.Path.Combine(FlyLayout.BasePath, "trendgraph.json"); FilePath = path; } - static TrendGraphParam2s current = null; - public static TrendGraphParam2s Current + static TrendGraphParams current = null; + public static TrendGraphParams Current { get { if (current == null) { - current = new TrendGraphParam2s(); + current = new TrendGraphParams(); current.Load(); } return current; diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVm.cs similarity index 82% rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2.cs rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVm.cs index 0cacaa71bd21eb84aca840f9fecea5bcbea1ec18..d9c888b2c9f314e96992b1a9973fc46f681d23cb 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVm.cs @@ -14,14 +14,21 @@ using System.Windows.Threading; namespace FLY.Thick.Blowing.UI.UiModule { - public class TrendGraphVm2 : ITrendGraphVm2 + public class TrendGraphVm : ITrendGraphVm { - const int MARKNO_TEXTUP = 1; /// <summary> /// 自动切æ¢ä¸º æœ€æ–°è§†å›¾æ¨¡å¼ å€’è®¡æ—¶ åˆå§‹å€¼ /// </summary> const int AutoKeepTotalSec = 60; - const int Len = 100; + protected const int Len = 100; + /// <summary> + /// Yè½´%显示,最å°çš„ä¸å€¼ + /// </summary> + const int MIN_PERCENT_TARGET = 5; + /// <summary> + /// Y轴最å°å…¬å·®èŒƒå›´ + /// </summary> + const double MIN_TOLERANCE = 0.01; public event PropertyChangedEventHandler PropertyChanged; @@ -56,21 +63,31 @@ namespace FLY.Thick.Blowing.UI.UiModule /// <summary> /// æ··åˆæ•° /// </summary> - public int Mix { get; private set; } = 2; + public int Mix { get; protected set; } = 1; /// <summary> /// Values.First().Time /// </summary> - public DateTime BeginTime { get; private set; } + public DateTime BeginTime { get; protected set; } /// <summary> /// Values.Last().Time /// </summary> - public DateTime EndTime { get; private set; } + public DateTime EndTime { get; protected set; } /// <summary> /// Values.Last().Id /// </summary> - public long Id { get; private set; } = -1; + public long Id { get; protected set; } = -1; + + /// <summary> + /// 最新的Id + /// </summary> + public long NewestId { get; protected set; } = -1; + + /// <summary> + /// 查找时间 + /// </summary> + public DateTime SearchTime { get; set; } #endregion @@ -100,11 +117,11 @@ namespace FLY.Thick.Blowing.UI.UiModule public object MapperNegative { get; private set; } public object MapperValue { get; private set; } - TrendGraphItemParam2 graphparam; + protected TrendGraphItemParam graphparam; IBulkDbService bulkDb; - BlowingFixProfileParam profileParam; + protected BlowingFixProfileParam profileParam; DispatcherTimer timer; - public TrendGraphVm2() + public TrendGraphVm() { #region 与数æ®æ— 关界é¢å‚æ•° @@ -183,8 +200,8 @@ namespace FLY.Thick.Blowing.UI.UiModule #endregion } - public void Init( - TrendGraphItemParam2 graphparam, + public virtual void Init( + TrendGraphItemParam graphparam, IBulkDbService bulkDb, BlowingFixProfileParam profileParam) { @@ -208,6 +225,8 @@ namespace FLY.Thick.Blowing.UI.UiModule Id = -1; IsNewest = true; + Misc.BindingOperations.SetBinding(bulkDb, nameof(bulkDb.LastScanDataId), this, nameof(NewestId)); + ToNewest(); bulkDb.PropertyChanged += BulkDb_PropertyChanged; @@ -261,9 +280,13 @@ namespace FLY.Thick.Blowing.UI.UiModule UpdateY(); } } - void UpdateY() + protected void UpdateY() { double tolerance = this.profileParam.TolerancePercent; + if (tolerance < MIN_TOLERANCE) + { + tolerance = MIN_TOLERANCE; + } ToleranceYMax = tolerance; ToleranceYMin = -tolerance; @@ -273,7 +296,7 @@ namespace FLY.Thick.Blowing.UI.UiModule YMax = tolerance * graphparam.YRangePercent; YMin = -tolerance * graphparam.YRangePercent; } - void UpdateX() + protected void UpdateX() { XMax = Len; } @@ -296,9 +319,25 @@ namespace FLY.Thick.Blowing.UI.UiModule } } } - void UpdateAverage() + + double ToSigma2Percent(TrendValue v) + { + if (double.IsNaN(v.Value)) + { + return double.NaN; + } + else if (v.Value < MIN_PERCENT_TARGET) + { + return double.NaN; + } + else + { + return 2 * v.Sigma / v.Value; + } + } + protected void UpdateAverage() { - var sigma2s = this.Values.Select(v => 2*v.Sigma / v.Value); + var sigma2s = this.Values.Select(v => ToSigma2Percent(v)); var list = from v in sigma2s where !double.IsNaN(v) select v; @@ -366,22 +405,50 @@ namespace FLY.Thick.Blowing.UI.UiModule { //从尾å‘å‰æŽ’çš„ï¼ï¼ï¼ï¼ reponse.Values.Reverse(); + + bool isAdd = true; if (Values.Count() > 0) { - if (reponse.Values.First().Time <= Values.Last().Time) + + if (reponse.Values.First().Time > Values.Last().Time) + { + //Values çš„åŽé¢æŽ¥ + } + else if (reponse.Values.Last().Time < Values.First().Time) + { + //Values çš„å‰é¢æŽ¥ + isAdd = false; + } + else { //ä¸èƒ½æŽ¥ä¸Š Values.Clear(); } } - Values.AddRange(reponse.Values); - //é™åˆ¶Values长度 - int remove_cnt = Values.Count() - Len; - for (int i = 0; i < remove_cnt; i++) - Values.RemoveAt(0); + + if (isAdd) + { + Values.AddRange(reponse.Values); + + //é™åˆ¶Values长度 + int remove_cnt = Values.Count() - Len; + for (int i = 0; i < remove_cnt; i++) + Values.RemoveAt(0); + } + else + { + //Values çš„å‰é¢æŽ¥ + Values.InsertRange(0, reponse.Values); + + //é™åˆ¶Values长度 + int remove_cnt = Values.Count() - Len; + for (int i = 0; i < remove_cnt; i++) + Values.RemoveAt(Values.Count() - 1); + } - Id = reponse.ScanDataId; + Id = Values.Last().ScanDataID; + SearchTime = Values.Last().Time; BeginTime = Values.First().Time; EndTime = Values.Last().Time; @@ -433,7 +500,7 @@ namespace FLY.Thick.Blowing.UI.UiModule return (bulkDb as FObjBase.FObjServiceClient).IsConnected; } } - public void Seatch(DateTime lastTime) + public void Search(DateTime lastTime) { if (!IsConnected) return; @@ -487,7 +554,7 @@ namespace FLY.Thick.Blowing.UI.UiModule } } - public interface ITrendGraphVm2 : INotifyPropertyChanged + public interface ITrendGraphVm : INotifyPropertyChanged { #region æŸ¥è¯¢æ¨¡å¼ @@ -523,7 +590,7 @@ namespace FLY.Thick.Blowing.UI.UiModule /// WHERE Time å°äºŽ lastTime AND ID % graphparam.Interval == 0 ORDER BY ID DESC LIMIT graphparam.Len /// </summary> /// <param name="lastId"></param> - void Seatch(DateTime lastTime); + void Search(DateTime lastTime); /// <summary> /// 下一页 diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVmUt.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVmUt.cs new file mode 100644 index 0000000000000000000000000000000000000000..40410ee085a005347a62ba802f815f69070d897a --- /dev/null +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVmUt.cs @@ -0,0 +1,72 @@ +using FLY.Thick.Blowing.Common; +using FLY.Thick.Blowing.IService; +using LiveCharts; +using LiveCharts.Configurations; +using Misc; +using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; +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.Blowing.UI.UiModule +{ + public class TrendGraphVmUt : TrendGraphVm + { + public TrendGraphVmUt() + { + #region æ•°æ® + double target = 150; + + double tolerancePercent = 0.05; + double yRangePercent = 3; + int len = Len; + DateTime startTime = DateTime.Now; + TimeSpan tsInterval = TimeSpan.FromSeconds(30); + DateTime time = startTime; + int id = 312456; + Random random = new Random(); + + List<TrendValue> tvs = new List<TrendValue>(); + for (int i = 0; i < len; i++, time += tsInterval) + { + TrendValue tv = new TrendValue(); + tv.Time = time; + tv.Value = target + (random.NextDouble() - 0.5) * target * tolerancePercent * 0.5; + tv.Sigma = (Math.Sin(i * Math.PI / len) * 3) * target * tolerancePercent * random.NextDouble(); + + tvs.Add(tv); + + } + Values.AddRange(tvs); + + #endregion + + profileParam = new BlowingFixProfileParam() + { + Target = target, + TolerancePercent = tolerancePercent + }; + graphparam = new TrendGraphItemParam() + { + YRangePercent = yRangePercent, + Mix = 2 + }; + + #region ç•Œé¢æ•°æ® + UpdateX(); + + Mix = 2; + BeginTime = Values.First().Time; + EndTime = Values.Last().Time; + Id = id; + + UpdateAverage(); + UpdateY(); + #endregion + } + } +} diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/UiModule2_TrendGraph.cs similarity index 90% rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph.cs rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/UiModule2_TrendGraph.cs index 62bd642906fd8855c221afd7ae22b76b9265b41e..88a2daa91d02fe1226422ffb92ac1f35ce592674 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/UiModule2_TrendGraph.cs @@ -32,7 +32,7 @@ namespace FLY.Thick.Blowing.UI.UiModule /// <returns></returns> public FrameworkElement GetComponent(int id, IUnityContainer container) { - return container.Resolve<TrendGraph2>(new Unity.Resolution.ParameterOverride("id", id)); + return container.Resolve<TrendGraph>(new Unity.Resolution.ParameterOverride("id", id)); } @@ -53,7 +53,7 @@ namespace FLY.Thick.Blowing.UI.UiModule /// <param name="IDs"></param> public void MatchParam(int[] IDs) { - TrendGraphParam2s.Current.MatchParam(IDs); + TrendGraphParams.Current.MatchParam(IDs); } } } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml index 54f03ca89146cfce93d0cf242ca55e9661db5491..50376a39606db3d3ae7b765cd60421afa01ea25a 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml @@ -8,7 +8,7 @@ xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:lvc1="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Feng.Wpf" mc:Ignorable="d" - d:DesignHeight="300" d:DesignWidth="800" > + d:DesignHeight="600" d:DesignWidth="800" > <UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> @@ -16,212 +16,380 @@ <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/> <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Colors.xaml"/> </ResourceDictionary.MergedDictionaries> - - <local:TrendGraphVm2Ut x:Key="viewmodel"/> - <SolidColorBrush x:Key="TextBrush" Color="#4C4949" /> - <SolidColorBrush x:Key="GrayBrush1" Color="#FF727272"/> - <SolidColorBrush x:Key="GrayBrush2" Color="#FF858484" /> - <SolidColorBrush x:Key="SemiTransparentGreyBrush" Color="#99F0F0F0"/> - <SolidColorBrush x:Key="SemiTransparentActiveBrush" Color="#50008BE5"/> - <SolidColorBrush x:Key="WhiteBrush" Color="White"/> - - <Style x:Key="TitleStyle" TargetType="TextBlock"> - <Setter Property="Width" Value="50"/> - <Setter Property="Foreground" Value="{StaticResource GrayBrush1}"/> - <Setter Property="FontSize" Value="16"/> - <Setter Property="TextAlignment" Value="Right"/> - </Style> - <Style x:Key="ValueStyle" TargetType="TextBlock"> - <Setter Property="Foreground" Value="{StaticResource TextBrush}"/> - <Setter Property="FontSize" Value="20"/> - <Setter Property="Padding" Value="5,0"/> - </Style> - <Style x:Key="ValueStyle2" TargetType="TextBlock"> - <Setter Property="Foreground" Value="{StaticResource WhiteBrush}"/> - <Setter Property="Background" Value="{StaticResource TextBrush}"/> - <Setter Property="FontSize" Value="26"/> - <Setter Property="Padding" Value="5,0"/> - </Style> - <Style x:Key="UnitStyle" TargetType="TextBlock"> - <Setter Property="Foreground" Value="{StaticResource GrayBrush2}"/> - <Setter Property="FontSize" Value="15"/> - <Setter Property="VerticalAlignment" Value="Bottom"/> - </Style> + <local:TrendGraphVmUt x:Key="trendVm"/> + <local:ScanGraphVmUt x:Key="scanGraphVm"/> </ResourceDictionary> </UserControl.Resources> - <Border Style="{StaticResource BorderStyle_module}" > - <Grid d:DataContext="{StaticResource viewmodel}"> - <Grid.RowDefinitions> - <RowDefinition Height="auto"/> - <RowDefinition Height="100*"/> - <RowDefinition Height="70*"/> - </Grid.RowDefinitions> - <Grid.ColumnDefinitions> - <ColumnDefinition Width="auto"/> - <ColumnDefinition Width="400*"/> - <ColumnDefinition Width="350*"/> - </Grid.ColumnDefinitions> - <lvc:CartesianChart Grid.Row="1" Grid.ColumnSpan="3" - Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2"> - <lvc:CartesianChart.Resources> - <Style TargetType="lvc1:Column2Series"> - <Setter Property="PointGeometry" Value="{x:Null}"/> - <Setter Property="StrokeThickness" Value="0" /> - </Style> - </lvc:CartesianChart.Resources> - <lvc:CartesianChart.Series> - <lvc1:Column2Series + <Grid> + <Grid.RowDefinitions> + <RowDefinition Height="170*"/> + <RowDefinition Height="100*"/> + </Grid.RowDefinitions> + <Border Style="{StaticResource Styles.Module.Border}" > + <Grid x:Name="grid_trend" d:DataContext="{StaticResource trendVm}"> + <Grid.RowDefinitions> + <RowDefinition Height="auto"/> + <RowDefinition Height="100*"/> + <RowDefinition Height="70*"/> + </Grid.RowDefinitions> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="auto"/> + <ColumnDefinition Width="400*"/> + <ColumnDefinition Width="280*"/> + </Grid.ColumnDefinitions> + <lvc:CartesianChart Grid.Row="1" Grid.ColumnSpan="3" + Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2" + MouseDown="UIElement_MouseDown"> + <lvc:CartesianChart.Resources> + <Style TargetType="lvc1:Column2Series"> + <Setter Property="PointGeometry" Value="{x:Null}"/> + <Setter Property="StrokeThickness" Value="0" /> + </Style> + </lvc:CartesianChart.Resources> + <lvc:CartesianChart.Series> + <lvc1:Column2Series Values="{Binding Values}" Configuration="{Binding MapperPositive}"/> - <lvc1:Column2Series + <lvc1:Column2Series Values="{Binding Values}" Configuration="{Binding MapperNegative}"/> - </lvc:CartesianChart.Series> - <lvc:CartesianChart.AxisX> - <lvc:Axis Foreground="Black" + </lvc:CartesianChart.Series> + <lvc:CartesianChart.AxisX> + <lvc:Axis Foreground="Black" LabelFormatter="{Binding XFormatter}" MinValue="0" MaxValue="{Binding XMax}" > - <lvc:Axis.Separator> - <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/> - </lvc:Axis.Separator> - </lvc:Axis> - </lvc:CartesianChart.AxisX> - <lvc:CartesianChart.AxisY> - <lvc:Axis LabelFormatter="{Binding YFormatter}" Foreground="Transparent" + <lvc:Axis.Separator> + <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/> + </lvc:Axis.Separator> + <lvc:Axis.Sections> + <lvc:AxisSection Style="{StaticResource Styles.Axis.Section.Selected}" DataLabel="True" Value="{Binding SelectedIndex}" /> + </lvc:Axis.Sections> + </lvc:Axis> + </lvc:CartesianChart.AxisX> + <lvc:CartesianChart.AxisY> + <lvc:Axis LabelFormatter="{Binding YFormatter}" Foreground="Transparent" MinValue="{Binding YMin}" MaxValue="{Binding YMax}" FontFamily="Courier New" > - - <lvc:Axis.Sections> - <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/> - <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/> - <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/> - <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/> - <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMax}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/> - <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMin}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/> - <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="0" Stroke="{StaticResource Brushes.ChartAxisLabel0}" /> - </lvc:Axis.Sections> - <lvc:Axis.Separator> - <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" /> - </lvc:Axis.Separator> - </lvc:Axis> - </lvc:CartesianChart.AxisY> - </lvc:CartesianChart> - <lvc:CartesianChart Grid.Row="2" Grid.ColumnSpan="3" - Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2"> - <lvc:CartesianChart.Resources> - <Style TargetType="lvc:LineSeries"> - <Setter Property="PointGeometry" Value="{x:Null}"/> - <Setter Property="StrokeThickness" Value="3" /> - <Setter Property="Fill" Value="{StaticResource Brushes.ChartArea4}"/> - <Setter Property="Stroke" Value="{StaticResource Brushes.ChartArea0}"/> - </Style> - </lvc:CartesianChart.Resources> - <lvc:CartesianChart.Series> - <lvc:LineSeries + + <lvc:Axis.Sections> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMax}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMin}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="0" Stroke="{StaticResource Brushes.ChartAxisLabel0}" /> + </lvc:Axis.Sections> + <lvc:Axis.Separator> + <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" /> + </lvc:Axis.Separator> + </lvc:Axis> + </lvc:CartesianChart.AxisY> + </lvc:CartesianChart> + <lvc:CartesianChart Grid.Row="2" Grid.ColumnSpan="3" + Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2" + MouseDown="UIElement_MouseDown"> + <lvc:CartesianChart.Resources> + <Style TargetType="lvc:LineSeries"> + <Setter Property="StrokeThickness" Value="3" /> + <Setter Property="Fill" Value="{StaticResource Brushes.ChartArea4}"/> + <Setter Property="Stroke" Value="{StaticResource Brushes.ChartArea0}"/> + </Style> + </lvc:CartesianChart.Resources> + <lvc:CartesianChart.Series> + <lvc:LineSeries Values="{Binding Values}" Configuration="{Binding MapperValue}"/> - </lvc:CartesianChart.Series> - <lvc:CartesianChart.AxisX> - <lvc:Axis Foreground="{StaticResource Brushes.ChartAxisLabel}" + </lvc:CartesianChart.Series> + <lvc:CartesianChart.AxisX> + <lvc:Axis Foreground="{StaticResource Brushes.ChartAxisLabel}" LabelFormatter="{Binding XFormatter}" MinValue="0" MaxValue="{Binding XMax}" > - <lvc:Axis.Separator> - <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/> - </lvc:Axis.Separator> - </lvc:Axis> - </lvc:CartesianChart.AxisX> - <lvc:CartesianChart.AxisY> - <lvc:Axis LabelFormatter="{Binding YFormatter2}" Foreground="{StaticResource Brushes.ChartAxisLabel}" MinRange="1" + <lvc:Axis.Separator> + <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/> + </lvc:Axis.Separator> + <lvc:Axis.Sections> + <lvc:AxisSection Style="{StaticResource Styles.Axis.Section.Selected}" Value="{Binding SelectedIndex}" /> + </lvc:Axis.Sections> + </lvc:Axis> + </lvc:CartesianChart.AxisX> + <lvc:CartesianChart.AxisY> + <lvc:Axis LabelFormatter="{Binding YFormatter2}" Foreground="{StaticResource Brushes.ChartAxisLabel}" MinRange="1" FontFamily="Courier New" > - <lvc:Axis.Separator> - <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" /> - </lvc:Axis.Separator> - </lvc:Axis> - </lvc:CartesianChart.AxisY> - </lvc:CartesianChart> - <Button Style="{StaticResource ButtonStyle_icon}" Margin="48,0,0,-20" - Click="Button_info_click" > - <Grid Style="{StaticResource GridStyle_ButtonShadow}" > - <TextBlock Padding="10,5" VerticalAlignment="Top" - FontSize="24" Foreground="White" Background="{StaticResource Color_theme_activity}" + <lvc:Axis.Separator> + <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" /> + </lvc:Axis.Separator> + </lvc:Axis> + </lvc:CartesianChart.AxisY> + </lvc:CartesianChart> + <Button Style="{StaticResource Styles.Button.Icon}" Margin="48,0,0,-20" + Click="btnTrendInfoClick" > + <Grid Style="{StaticResource Styles.Shadow}" > + <TextBlock Padding="10,5" VerticalAlignment="Top" + FontSize="24" Foreground="White" Background="{StaticResource Brushes.Activity}" Text="趋势图" /> - </Grid> - </Button> - <Grid Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" - VerticalAlignment="Top" HorizontalAlignment="Left" > - <Viewbox MaxHeight="50"> - <StackPanel> - <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="5"> - + </Grid> + </Button> + <StackPanel Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" VerticalAlignment="Top" HorizontalAlignment="Left" + Margin="{StaticResource ControlMargin}"> + <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2"> + <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" > <TextBlock Style="{StaticResource ValueStyle}" > <Run Text="{Binding BeginTime,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm}}"/> 至 <Run Text="{Binding EndTime,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm}}"/> </TextBlock> - </StackPanel> - <StackPanel Orientation="Horizontal"> - <StackPanel Orientation="Horizontal" Margin="5,0"> - <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" /> - <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/> - </StackPanel> + </Viewbox> + <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2"> + <StackPanel Orientation="Horizontal" Margin="{StaticResource Margin.Text}" + Background="{StaticResource SemiTransparentGreyBrush2}"> + <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" /> + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/> </StackPanel> - </StackPanel> - </Viewbox> - </Grid> - <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" + </Viewbox> + </StackPanel> + <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right" Background="{StaticResource SemiTransparentGreyBrush}" > - <Viewbox MaxHeight="50"> - <StackPanel Margin="5"> - <StackPanel.Resources> - <Style TargetType="Viewbox"> - <Setter Property="Height" Value="25"/> - <Setter Property="Width" Value="120"/> - <Setter Property="HorizontalAlignment" Value="Left"/> - <Setter Property="VerticalAlignment" Value="Top"/> - </Style> - </StackPanel.Resources> - <StackPanel Orientation="Horizontal"> - <Viewbox > - <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource TitleStyle}" + <Viewbox MaxHeight="50"> + <StackPanel Margin="5"> + <StackPanel.Resources> + <Style TargetType="Viewbox"> + <Setter Property="Height" Value="25"/> + <Setter Property="Width" Value="120"/> + <Setter Property="HorizontalAlignment" Value="Left"/> + <Setter Property="VerticalAlignment" Value="Top"/> + </Style> + </StackPanel.Resources> + <StackPanel Orientation="Horizontal"> + <Viewbox > + <StackPanel Orientation="Horizontal"> + <TextBlock Style="{StaticResource TitleStyle}" Foreground="{StaticResource WhiteBrush}" Background="{StaticResource TextBrush}" Opacity="0.8" Text="å¹³å‡: " /> - <TextBlock Style="{StaticResource ValueStyle}" + <TextBlock Style="{StaticResource ValueStyle}" Foreground="{StaticResource WhiteBrush}" Background="{StaticResource TextBrush}" Text="{Binding Average,Mode=OneWay,StringFormat={}{0:P1}}" > - </TextBlock> - </StackPanel> - </Viewbox> - </StackPanel> - <StackPanel Orientation="Horizontal"> - <Viewbox > - <StackPanel Orientation="Horizontal"> - <TextBlock Style="{StaticResource TitleStyle}" Text="最大: "/> - <TextBlock Style="{StaticResource ValueStyle}" + </TextBlock> + </StackPanel> + </Viewbox> + </StackPanel> + <StackPanel Orientation="Horizontal"> + <Viewbox > + <StackPanel Orientation="Horizontal"> + <TextBlock Style="{StaticResource TitleStyle}" Text="最大: "/> + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Max,Mode=OneWay,StringFormat={}{0:P1}}"/> - </StackPanel> - </Viewbox> - <Viewbox > - <StackPanel Orientation="Horizontal" > - <TextBlock Style="{StaticResource TitleStyle}" + </StackPanel> + </Viewbox> + <Viewbox > + <StackPanel Orientation="Horizontal" > + <TextBlock Style="{StaticResource TitleStyle}" Text="最å°: " /> - <TextBlock Style="{StaticResource ValueStyle}" + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Min,Mode=OneWay,StringFormat={}{0:P1}}"/> + </StackPanel> + </Viewbox> + </StackPanel> + + </StackPanel> + </Viewbox> + </Grid> + </Grid> + </Border> + <Border Grid.Row="1" Style="{StaticResource Styles.Module.Border}" > + <Grid x:Name="grid_scan" d:DataContext="{StaticResource scanGraphVm}"> + <Grid.RowDefinitions> + <RowDefinition Height="auto"/> + <RowDefinition/> + </Grid.RowDefinitions> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="auto"/> + <ColumnDefinition Width="400*"/> + <ColumnDefinition Width="280*"/> + </Grid.ColumnDefinitions> + <lvc:CartesianChart Grid.Row="1" Grid.ColumnSpan="3" + Series="{Binding Series}" Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2"> + <lvc:CartesianChart.AxisX> + <lvc:Axis LabelFormatter="{Binding XFormatter}" + Foreground="{StaticResource Brushes.ChartAxisLabel}" + MaxValue="{Binding XMax}" MinValue="0" + > + <lvc:Axis.Separator> + <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="{Binding XStep}"/> + </lvc:Axis.Separator> + <lvc:Axis.Sections> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" StrokeThickness="0" Stroke="{StaticResource Brushes.Activity}" + Value="{Binding OrgBoltNo}" + /> + </lvc:Axis.Sections> + </lvc:Axis> + </lvc:CartesianChart.AxisX> + <lvc:CartesianChart.AxisY> + <lvc:Axis LabelFormatter="{Binding YFormatter}" MaxValue="{Binding YMax}" MinValue="{Binding YMin}" Panel.ZIndex="0" Foreground="Transparent" FontFamily="Courier New"> + <lvc:Axis.Sections> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" + Value="{Binding YMax}" + Stroke="{StaticResource Brushes.ChartAxisLabel3}" + /> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" + Value="{Binding YMin}" + Stroke="{StaticResource Brushes.ChartAxisLabel3}" + /> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" + Value="{Binding Tolerance2YMax}" + Stroke="{StaticResource Brushes.ChartAxisLabel2}" + /> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" + Value="{Binding Tolerance2YMin}" + Stroke="{StaticResource Brushes.ChartAxisLabel2}" + /> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" + Value="{Binding ToleranceYMax}" + Stroke="{StaticResource Brushes.ChartAxisLabel1}" + /> + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" + Value="{Binding ToleranceYMin}" + Stroke="{StaticResource Brushes.ChartAxisLabel1}" + /> + + <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" + Value="{Binding Target}" + Stroke="{StaticResource Brushes.ChartAxisLabel0}" + /> + </lvc:Axis.Sections> + <lvc:Axis.Separator> + <lvc:Separator Stroke="Transparent" /> + </lvc:Axis.Separator> + </lvc:Axis> + + </lvc:CartesianChart.AxisY> + </lvc:CartesianChart> + + <Button Style="{StaticResource Styles.Button.Icon}" Margin="48,0,0,-20" + Click="btnScanInfoClick" > + <Grid Style="{StaticResource Styles.Shadow}" > + <TextBlock Padding="10,5" VerticalAlignment="Top" + FontSize="24" Foreground="{StaticResource Brushes.ThemeBackground}" Background="{StaticResource Brushes.Activity}" + Text="扫æ图" /> + </Grid> + </Button> + <StackPanel Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" VerticalAlignment="Top" HorizontalAlignment="Left" + Margin="{StaticResource ControlMargin}"> + <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2"> + <StackPanel Orientation="Horizontal" > + + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Time,StringFormat={}{0:MM-dd HH:mm:ss}}"/> + <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}"> + <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" /> + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/> + </StackPanel> + + </StackPanel> + </Viewbox> + <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2"> + <StackPanel Orientation="Horizontal"> + <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}"> + <TextBlock > + <TextBlock.Style> + <Style TargetType="TextBlock" BasedOn="{StaticResource ValueStyle}"> + <Setter Property="Background" Value="#99000000"/> + <Setter Property="Foreground" Value="White"/> + <Setter Property="Text" Value="逆"/> + <Style.Triggers> + <DataTrigger Binding="{Binding IsBackw}" Value="True"> + <Setter Property="Background" Value="#99008BE5"/> + <Setter Property="Text" Value="顺"/> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> + </StackPanel> + <StackPanel Orientation="Horizontal" Background="#99FFFFFF"> + <StackPanel Orientation="Horizontal" Margin="5,0"> + <TextBlock Style="{StaticResource ValueStyle}" + Text="{Binding RPeriod, Converter={StaticResource timespanconv}}" + /> + <TextBlock Style="{StaticResource TitleStyle}" Width="auto" VerticalAlignment="Bottom" + Text="min/R" /> </StackPanel> - </Viewbox> + </StackPanel> </StackPanel> + </Viewbox> + </StackPanel> + + <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" + Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right" + Background="{StaticResource SemiTransparentGreyBrush}" > + <Viewbox MaxHeight="50"> + <StackPanel Margin="5"> + <StackPanel.Resources> + <Style TargetType="Viewbox"> + <Setter Property="Height" Value="25"/> + <Setter Property="Width" Value="120"/> + <Setter Property="HorizontalAlignment" Value="Left"/> + <Setter Property="VerticalAlignment" Value="Top"/> + </Style> + </StackPanel.Resources> + <StackPanel Orientation="Horizontal"> + <Viewbox > + <StackPanel Orientation="Horizontal"> + <TextBlock Style="{StaticResource TitleStyle}" + Foreground="{StaticResource WhiteBrush}" + Background="{StaticResource TextBrush}" + Opacity="0.8" + Text="å¹³å‡: " + /> + <TextBlock Style="{StaticResource ValueStyle}" + Foreground="{StaticResource WhiteBrush}" + Background="{StaticResource TextBrush}" + Text="{Binding Average,StringFormat={}{0:F1}}" + /> + </StackPanel> + </Viewbox> + <Viewbox> + <StackPanel Orientation="Horizontal" Background="#99000000"> + <TextBlock Style="{StaticResource TitleStyle}" Foreground="White" + Text=" 2σ: " + /> + <TextBlock Style="{StaticResource ValueStyle}" + Foreground="{StaticResource WhiteBrush}" + Background="{StaticResource TextBrush}" + Text="{Binding Sigma2Text}" + /> + </StackPanel> + </Viewbox> + </StackPanel> + <StackPanel Orientation="Horizontal"> + <Viewbox > + <StackPanel Orientation="Horizontal"> + <TextBlock Style="{StaticResource TitleStyle}" Text="最大: "/> + <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding MaxText}"/> + </StackPanel> + </Viewbox> + <Viewbox > + <StackPanel Orientation="Horizontal" > + <TextBlock Style="{StaticResource TitleStyle}" + Text="最å°: " /> + <TextBlock Style="{StaticResource ValueStyle}" + Text="{Binding MinText}"/> + </StackPanel> + </Viewbox> + </StackPanel> - </StackPanel> - </Viewbox> + </StackPanel> + </Viewbox> + </Grid> </Grid> - </Grid> - </Border> + </Border> + </Grid> + </UserControl> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml.cs index 98c7e2a0a601e80e7cd11061758954ec613645b6..009d82d3caf7ad2fdf2ae48084a03a701e0f7fc2 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml.cs @@ -1,8 +1,23 @@ using FLY.Thick.Base.UI; using FLY.Thick.Blowing.IService; +using LiveCharts; +using LiveCharts.Helpers; +using LiveCharts.Wpf; +using Misc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; -using System.Windows.Forms; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; using Unity; namespace FLY.Thick.Blowing.UI.UiModule @@ -12,8 +27,11 @@ namespace FLY.Thick.Blowing.UI.UiModule /// </summary> public partial class TrendGraph2 : System.Windows.Controls.UserControl { - TrendGraphVm2 viewModel; - TrendGraphItemParam2 graphparam; + TrendGraph2Vm trendGraphVm; + TrendGraphItemParam trendGraphParam; + + ScanGraphVm scanGraphVm; + ScanGraphItemParam scanGraphParam; public TrendGraph2() { InitializeComponent(); @@ -22,30 +40,105 @@ namespace FLY.Thick.Blowing.UI.UiModule [InjectionMethod] public void Init(int id, IBulkDbService bulkDb, - IBlowingFixProfileService profileService) + IBlowingService blowingService, + ParamDictionary paramDictionary, + IBlowingFixProfileService profileService + ) { - graphparam = TrendGraphParam2s.Current.Items.Find(p => p.ID == id); - if (graphparam == null) + trendGraphParam = TrendGraphParams.Current.Items.Find(p => p.ID == id); + if (trendGraphParam == null) + { + trendGraphParam = new TrendGraphItemParam() { ID = id }; + TrendGraphParams.Current.Items.Add(trendGraphParam); + TrendGraphParams.Current.Save(); + } + trendGraphVm = new TrendGraph2Vm(); + trendGraphVm.Init(trendGraphParam, bulkDb, profileService.Param); + this.grid_trend.DataContext = trendGraphVm; + + + + + scanGraphParam = ScanGraphParams.Current.Items.Find(p => p.ID == id); + if (scanGraphParam == null) + { + scanGraphParam = new ScanGraphItemParam() { ID = id }; + ScanGraphParams.Current.Items.Add(scanGraphParam); + ScanGraphParams.Current.Save(); + } + scanGraphVm = new ScanGraphVm(); + scanGraphVm.Init(scanGraphParam, bulkDb, blowingService, paramDictionary, profileService.Param); + this.grid_scan.DataContext = scanGraphVm; + + + + this.trendGraphVm.PropertyChanged += TrendGraphVm_PropertyChanged; + this.scanGraphVm.PropertyChanged += ScanGraphVm_PropertyChanged; + + } + + private void TrendGraphVm_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(trendGraphVm.SelectedId)) + { + scanGraphVm.Number = trendGraphVm.SelectedId; + } + } + + private void ScanGraphVm_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(scanGraphVm.Number)) { - graphparam = new TrendGraphItemParam2() { ID = id }; - TrendGraphParam2s.Current.Items.Add(graphparam); - TrendGraphParam2s.Current.Save(); + if (scanGraphVm.Number != trendGraphVm.SelectedId) + { + trendGraphVm.ClearSelected(); + } } - viewModel = new TrendGraphVm2(); - viewModel.Init(graphparam, bulkDb, profileService.Param); - this.DataContext = viewModel; } - private void Button_info_click(object sender, RoutedEventArgs e) + private void btnTrendInfoClick(object sender, RoutedEventArgs e) { if (!WdPassword.Authorize("GraphConfig")) return; - TrendGraphConfig2 window = new TrendGraphConfig2(); - window.Init(graphparam,viewModel); + TrendGraph2Config window = new TrendGraph2Config(); + window.Init(trendGraphParam, trendGraphVm); window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this); window.ShowDialog(); } + + private void btnScanInfoClick(object sender, RoutedEventArgs e) + { + if (!WdPassword.Authorize("GraphConfig")) + return; + + WdScanGraphConfig window = new WdScanGraphConfig(); + window.Init(scanGraphParam, scanGraphVm); + window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this); + window.ShowDialog(); + } + + private void UIElement_MouseDown(object sender, MouseButtonEventArgs e) + { + + var vm = trendGraphVm; + + var chart = (LiveCharts.Wpf.CartesianChart)sender; + var series = chart.Series[0]; + + + var mouseCoordinate = e.GetPosition(chart); + var p = chart.ConvertToChartValues(mouseCoordinate); + + + //var series = chart.Series[0]; + var closetsPoint = series.ClosestPointTo(p.X, AxisOrientation.X); + if (closetsPoint == null) + { + return; + } + vm.SetSelected((int)(closetsPoint.X)); + } } } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml new file mode 100644 index 0000000000000000000000000000000000000000..e3f57d8c4c503226e9ff5c93a3273e3802e0e3bb --- /dev/null +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml @@ -0,0 +1,167 @@ +<flyctrllib:WindowBigClose x:Class="FLY.Thick.Blowing.UI.UiModule.TrendGraph2Config" + xmlns:flyctrllib="clr-namespace:FLY.ControlLibrary;assembly=FLY.ControlLibrary" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + mc:Ignorable="d" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" + SizeToContent="WidthAndHeight" MinHeight="450" MinWidth="450" + > + <Window.Resources> + <ResourceDictionary> + <ResourceDictionary.MergedDictionaries> + <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/> + <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Converter/Dictionary_MyConv.xaml"/> + </ResourceDictionary.MergedDictionaries> + </ResourceDictionary> + </Window.Resources> + + <Grid Background="White"> + <Grid x:Name="grid_trend"/> + <StackPanel Margin="{StaticResource ControlMargin}"> + <Grid Height="20"/> + <GroupBox> + <GroupBox.Header> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="纵å‘图"/> + </GroupBox.Header> + <StackPanel> + <StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}" DataContext="{Binding DataContext,ElementName=grid_trend}"> + <DatePicker + Width="200" + Margin="{StaticResource ControlMargin}" + Height="auto" + HorizontalAlignment="Center" + HorizontalContentAlignment="Stretch" + controls:TextBoxHelper.UseFloatingWatermark="True" + controls:TextBoxHelper.Watermark="开始日期" + controls:TextBoxHelper.WatermarkAlignment="Right" + SelectedDate="{Binding SearchTime}"/> + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnSeachClick"> + <iconPacks:PackIconMaterial Kind="Magnify" /> + </Button> + </StackPanel> + <StackPanel Orientation="Horizontal" DataContext="{Binding DataContext,ElementName=grid_trend}"> + + <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnPreClick"> + <iconPacks:PackIconMaterial Kind="ArrowLeft" /> + </Button> + <StackPanel VerticalAlignment="Center"> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" > + <Run Text="最新ID:"/><Run Text="{Binding NewestId,Mode=OneWay}"/> + </TextBlock> + <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" > + <Run Text="当å‰ID:"/><Run Text="{Binding Id,Mode=OneWay}"/> + </TextBlock> + </StackPanel> + <Button Click="btnNextClick"> + <Button.Style> + <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}"> + <Style.Triggers> + <DataTrigger Binding="{Binding IsNewest}" Value="True"> + <Setter Property="Foreground" Value="Gray"/> + <Setter Property="IsEnabled" Value="False"/> + </DataTrigger> + </Style.Triggers> + </Style> + </Button.Style> + <iconPacks:PackIconMaterial Kind="ArrowRight" /> + </Button> + <Button Click="btnNewestClick"> + <Button.Style> + <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}"> + <Style.Triggers> + <DataTrigger Binding="{Binding IsNewest}" Value="True"> + <Setter Property="Foreground" Value="Gray"/> + <Setter Property="IsEnabled" Value="False"/> + </DataTrigger> + </Style.Triggers> + </Style> + </Button.Style> + <Grid> + <iconPacks:PackIconMaterial Kind="ArrowCollapseRight" /> + <!--当ä¸æ˜¯æœ€æ–°, 弹出 自动按[最新] 倒计时--> + <Grid Width="20" Height="20" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0,0,-5,-5" > + <Grid.Style> + <Style TargetType="Grid"> + <Style.Triggers> + <DataTrigger Binding="{Binding IsNewest}" Value="True"> + <Setter Property="Visibility" Value="Hidden"/> + </DataTrigger> + </Style.Triggers> + </Style> + </Grid.Style> + <Ellipse Fill="#FFFF3535" /> + <TextBlock Text="{Binding AutoKeepNewestTimeRemaining}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/> + </Grid> + </Grid> + </Button> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="æ›´æ–°ä¸" Visibility="{Binding IsLoading,Converter={StaticResource visbilityconv}}"/> + </StackPanel> + </StackPanel> + </GroupBox> + + <StackPanel Orientation="Horizontal" > + + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="æ··åˆæ•°" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Mix}" /> + </StackPanel> + </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Yè½´å€æ•°" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding YRangePercent}" /> + </StackPanel> + </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="é—´éš”" /> + <StackPanel Orientation="Horizontal"> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Interval}" /> + </StackPanel> + </StackPanel> + </StackPanel> + + <Button Style="{StaticResource Styles.Button.Apply}" Click="btnOkClick"/> + <GroupBox> + <GroupBox.Header> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="扫æ图"/> + </GroupBox.Header> + <StackPanel Orientation="Horizontal" DataContext="{Binding DataContext,ElementName=grid_trend}"> + + <Button Click="btnPreSelectedClick"> + <Button.Style> + <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}"> + <Style.Triggers> + <DataTrigger Binding="{Binding CanSelested}" Value="False"> + <Setter Property="Foreground" Value="Gray"/> + <Setter Property="IsEnabled" Value="False"/> + </DataTrigger> + </Style.Triggers> + </Style> + </Button.Style> + <iconPacks:PackIconMaterial Kind="ArrowLeft" /> + </Button> + <Button Click="btnNextSelectedClick"> + <Button.Style> + <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}"> + <Style.Triggers> + <DataTrigger Binding="{Binding CanSelested}" Value="False"> + <Setter Property="Foreground" Value="Gray"/> + <Setter Property="IsEnabled" Value="False"/> + </DataTrigger> + </Style.Triggers> + </Style> + </Button.Style> + <iconPacks:PackIconMaterial Kind="ArrowRight" /> + </Button> + </StackPanel> + </GroupBox> + + + </StackPanel> + </Grid> + + </flyctrllib:WindowBigClose > diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml.cs new file mode 100644 index 0000000000000000000000000000000000000000..9f20aac36ac6f5722b4fd1580e376c4bda2ad93f --- /dev/null +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace FLY.Thick.Blowing.UI.UiModule +{ + /// <summary> + /// Window_graphtrend.xaml 的交互逻辑 + /// </summary> + public partial class TrendGraph2Config : FLY.ControlLibrary.WindowBigClose + { + TrendGraphItemParam graphparam; + TrendGraph2Vm trendGraphVm; + public TrendGraph2Config() + { + InitializeComponent(); + } + + public void Init(TrendGraphItemParam graphparam, TrendGraph2Vm trendGraphVm) + { + this.graphparam = graphparam; + this.trendGraphVm = trendGraphVm; + this.DataContext = graphparam; + this.grid_trend.DataContext = trendGraphVm; + + } + private void btnPreClick(object sender, RoutedEventArgs e) + { + trendGraphVm.PreView(); + + } + + private void btnNextClick(object sender, RoutedEventArgs e) + { + trendGraphVm.NextView(); + } + + + private void btnOkClick(object sender, RoutedEventArgs e) + { + TrendGraphParams.Current.Save(); + } + + private void btnNewestClick(object sender, RoutedEventArgs e) + { + trendGraphVm.ToNewest(); + } + + private void btnSeachClick(object sender, RoutedEventArgs e) + { + trendGraphVm.Search(trendGraphVm.SearchTime); + } + + private void btnNextSelectedClick(object sender, RoutedEventArgs e) + { + trendGraphVm.NextSelected(); + } + + private void btnPreSelectedClick(object sender, RoutedEventArgs e) + { + trendGraphVm.PreSelected(); + } + } +} diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Vm.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Vm.cs new file mode 100644 index 0000000000000000000000000000000000000000..0af82fde92511cc052d1c33272bce3a442941b9c --- /dev/null +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Vm.cs @@ -0,0 +1,104 @@ +using FLY.Thick.Blowing.Common; +using FLY.Thick.Blowing.IService; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FLY.Thick.Blowing.UI.UiModule +{ + public class TrendGraph2Vm : TrendGraphVm + { + const int NULL_VALUE = -100000; + + #region ç•Œé¢ç»Ÿè®¡å€¼ + + /// <summary> + /// 选择的ä½ç½® å•ä½:分区åºå· + /// </summary> + public int SelectedIndex { get; private set; } = NULL_VALUE; + + public long SelectedId { get; private set; } + + public bool CanSelected { get; private set; } + #endregion + + + public override void Init( + TrendGraphItemParam graphparam, + IBulkDbService bulkDb, + BlowingFixProfileParam profileParam) + { + base.Init(graphparam, bulkDb, profileParam); + + this.PropertyChanged += TrendGraph2Vm_PropertyChanged; + } + + private void TrendGraph2Vm_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(Id)) + { + + CanSelected = Values.Count() > 0; + + //ç”»é¢è¢«æ›´æ–°ï¼Œç§»åŠ¨SelectedIndex + if (SelectedIndex >= 0 && SelectedIndex < Values.Count()) + { + //找到对应的Id + for (int i = 0; i < Values.Count(); i++) + { + if (Values[i].ScanDataID == SelectedId) + { + SelectedIndex = i; + break; + } + } + //找ä¸åˆ°ï¼Œåªèƒ½æ¸…除 + ClearSelected(); + } + } + } + + public void SetSelected(int index) + { + SelectedIndex = index; + + if (SelectedIndex >= 0 && SelectedIndex < Values.Count()) + { + //找到对应的Id + SelectedId = Values[SelectedIndex].ScanDataID; + } + } + public void ClearSelected() + { + SelectedIndex = NULL_VALUE; + } + + public void PreSelected() + { + if (SelectedIndex > 0 && SelectedIndex <= Values.Count() - 1) + { + SetSelected(SelectedIndex - 1); + } + else + { + if (Values.Count() > 0) + SetSelected(Values.Count() - 1); + } + } + public void NextSelected() + { + if (SelectedIndex >= 0 && SelectedIndex < Values.Count() - 1) + { + SetSelected(SelectedIndex + 1); + } + else + { + if (Values.Count() > 0) + SetSelected(0); + } + } + } +} diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2Ut.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2Ut.cs deleted file mode 100644 index 9fe6662a4b83786398caf1e75ba46b7e2dd155ae..0000000000000000000000000000000000000000 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2Ut.cs +++ /dev/null @@ -1,235 +0,0 @@ -using FLY.Thick.Blowing.IService; -using LiveCharts; -using LiveCharts.Configurations; -using Misc; -using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; -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.Blowing.UI.UiModule -{ - public class TrendGraphVm2Ut : INotifyPropertyChanged - { - public event PropertyChangedEventHandler PropertyChanged; - - #region 图表控制 - public double YMax { get; set; } = double.NaN; - public double YMin { get; set; } = double.NaN; - public double ToleranceYMax { get; set; } = double.NaN; - public double ToleranceYMin { get; set; } = double.NaN; - public double Tolerance2YMax { get; set; } = double.NaN; - public double Tolerance2YMin { get; set; } = double.NaN; - - public double XMax { get; set; } = double.NaN; - public Func<double, string> YFormatter { get; private set; } - public Func<double, string> XFormatter { get; private set; } - #endregion - - #region ç•Œé¢ç»Ÿè®¡å€¼ - - /// <summary> - /// å¹³å‡å€¼ - /// </summary> - public double Average { get; private set; } = double.NaN; - - /// <summary> - /// 最大值 - /// </summary> - public double Max { get; private set; } = double.NaN; - - /// <summary> - /// 最å°å€¼ - /// </summary> - public double Min { get; private set; } = double.NaN; - - /// <summary> - /// æ··åˆæ•° - /// </summary> - public int Mix { get; private set; } = 2; - - /// <summary> - /// Values.First().Time - /// </summary> - public DateTime BeginTime { get; private set; } - /// <summary> - /// Values.Last().Time - /// </summary> - public DateTime EndTime { get; private set; } - - /// <summary> - /// Values.Last().Id - /// </summary> - public long Id { get; private set; } = 1231221; - - #endregion - - #region æŸ¥è¯¢æ¨¡å¼ - /// <summary> - /// åªè¦ Number被改å˜,且ä¸ä¸º0, AutoKeepNewestTimeRemaining就会被设为10s. - /// 当 AutoKeepNewestTimeRemaining = 0, Number就会被设置为0 - /// </summary> - public int AutoKeepNewestTimeRemaining { get; private set; } - - /// <summary> - /// 当å‰å°±æ˜¯æœ€æ–°çš„视图 - /// </summary> - public bool IsNewest { get; private set; } - - /// <summary> - /// è§†å›¾åŠ è½½ä¸ - /// </summary> - public bool IsLoading { get; private set; } - - - #endregion - - List<Brush> AreaColors; - - public ChartValues<TrendValue> Values { get; } = new ChartValues<TrendValue>(); - - public object MapperPositive { get; private set; } - public object MapperNegative { get; private set; } - public object MapperValue { get; private set; } - - public TrendGraphVm2Ut() - { - #region 与数æ®æ— 关界é¢å‚æ•° - - - AreaColors = new List<Brush>(); - AreaColors.AddRange(FLY.ControlLibrary.Themes.Styles.AreaColors); - - YFormatter = (y) => - { - double percent = y * 100; - string text = ""; - if (percent == 0d) - { - text = "0.0%"; - } - else if (percent > 0) - { - text =$"+{Math.Abs(percent):F1}%"; - } - else - { - text =$"-{Math.Abs(percent):F1}%"; - } - return $"{text,6}"; - }; - XFormatter = (x) => { - int index = (int)x; - if (index < Values.Count() && index >= 0) - return Values[index].Time.ToString("HH:mm"); - else - return ""; - }; - - MapperPositive = Mappers.Xy<TrendValue>() - .X((value, index) => - { - return index; - }) - .Y(value => value.Sigma / value.Value) - .Fill((value) => - { - double percent = value.Sigma / value.Value; - if ((percent > Tolerance2YMax) || (percent < -Tolerance2YMax)) - { - return AreaColors[0]; - } - else if ((percent > ToleranceYMax) || (percent < -ToleranceYMax)) - { - return AreaColors[1]; - } - else - { - return AreaColors[2]; - } - }); - - MapperNegative = Mappers.Xy<TrendValue>() - .X((value, index) => - { - return index; - }) - .Y(value => -value.Sigma / value.Value) - .Fill((value) => - { - double percent = value.Sigma / value.Value; - if ((percent > Tolerance2YMax) || (percent < -Tolerance2YMax)) - { - return AreaColors[0]; - } - else if ((percent > ToleranceYMax) || (percent < -ToleranceYMax)) - { - return AreaColors[1]; - } - else - { - return AreaColors[2]; - } - }); - - MapperValue = Mappers.Xy<TrendValue>() - .X((value, index) => - { - return index; - }) - .Y(value => value.Value); - - #endregion - - Values.Clear(); - - #region æ•°æ® - double target = 150; - - double tolerancePercent = 0.05; - double yRangePercent = 3; - int len = 200; - DateTime startTime = DateTime.Now; - TimeSpan tsInterval = TimeSpan.FromSeconds(30); - DateTime time = startTime; - int id = 312456; - Random random = new Random(); - for (int i = 0; i < len; i++, time+=tsInterval) - { - TrendValue tv = new TrendValue(); - tv.Time = time; - tv.Value = target + (random.NextDouble() - 0.5) * target * tolerancePercent * 0.5; - tv.Sigma = (Math.Sin(i * Math.PI / len) * 3) * target * tolerancePercent * random.NextDouble(); - - Values.Add(tv); - } - - - #endregion - - #region ç•Œé¢æ•°æ® - XMax = len; - Mix = 2; - BeginTime = Values.First().Time; - EndTime = Values.Last().Time; - Id = id; - var sigma2Percent = Values.Select(v => 2 * v.Sigma / v.Value); - Average = sigma2Percent.AverageNoNull(); - Max = sigma2Percent.Max(); - Min = sigma2Percent.Min(); - - ToleranceYMax = tolerancePercent; - ToleranceYMin = -ToleranceYMax; - Tolerance2YMax = ToleranceYMax * 2; - Tolerance2YMin = -Tolerance2YMax; - YMax = ToleranceYMax * yRangePercent; - YMin = -YMax; - - #endregion - } - } -} diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph2.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph2.cs new file mode 100644 index 0000000000000000000000000000000000000000..ea2bd10b7a3eda584cf4c19e033a2be14066cc99 --- /dev/null +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph2.cs @@ -0,0 +1,59 @@ +using MultiLayout.UiModule; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Unity; + +namespace FLY.Thick.Blowing.UI.UiModule +{ + /// <summary> + /// 扫æå›¾æŽ§ä»¶æ¨¡å— + /// </summary> + public class UiModule2_TrendGraph2 : IUiModule2 + { + + /// <summary> + /// æŽ§ä»¶æ ‡é¢˜ + /// 它的值å–决于culture + /// </summary> + public string Title => "测厚.纵å‘图2"; + public ComponentType Type => ComponentType.Graph; + public bool IsUnique => false; + + /// <summary> + /// 控件 + /// 创建时,需è¦ç»™å®ƒå”¯ä¸€IDï¼Œè®©åŠ è½½è‡ªå·±çš„æ•°æ® + /// </summary> + /// <param name="id"></param> + /// <returns></returns> + public FrameworkElement GetComponent(int id, IUnityContainer container) + { + return container.Resolve<TrendGraph2>(new Unity.Resolution.ParameterOverride("id", id)); + } + + + /// <summary> + /// 控件缩略图,用于编辑界é¢æ—¶ï¼Œå¤§è‡´çœ‹çœ‹ + /// 创建时,需è¦ç»™å®ƒå”¯ä¸€IDï¼Œè®©åŠ è½½è‡ªå·±çš„æ•°æ® + /// </summary> + /// <param name="id"></param> + /// <returns></returns> + public FrameworkElement GetThumbnail() + { + return new Grid(); + } + + /// <summary> + /// 给出全部控件ID, æŽ§ä»¶è‡ªè¡Œåˆ é™¤æ²¡æœ‰çš„å‚æ•° + /// </summary> + /// <param name="IDs"></param> + public void MatchParam(int[] IDs) + { + TrendGraphParams.Current.MatchParam(IDs); + } + } +} diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/FLY.Thick.Blowing.csproj b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/FLY.Thick.Blowing.csproj index e513d8fe7bf6a633a6b402d991f0689f124d948a..5c381ececde38ce78370014eae1b1d228c841c75 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/FLY.Thick.Blowing.csproj +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/FLY.Thick.Blowing.csproj @@ -88,6 +88,7 @@ <Compile Include="Server\Model\OrgDbModel.cs" /> <Compile Include="Server\ScanWarning.cs" /> <Compile Include="Server\TDGage.cs" /> + <Compile Include="Server\ThickPlcModbusTcpServer.cs" /> </ItemGroup> <ItemGroup> <Content Include="FodyWeavers.xml"> @@ -111,6 +112,10 @@ <Project>{5ee61ac6-5269-4f0f-b8fa-4334fe4a678f}</Project> <Name>Misc</Name> </ProjectReference> + <ProjectReference Include="..\..\thick_public\Project.FLY.ModbusMapper\FLY.ModbusMapper\FLY.ModbusMapper.csproj"> + <Project>{6d4b9bda-2a66-4583-b244-758bc4213d9f}</Project> + <Name>FLY.ModbusMapper</Name> + </ProjectReference> <ProjectReference Include="..\..\thick_public\Project.FLY.OBJComponents\OBJComponents\FLY.OBJComponents.csproj"> <Project>{a539505d-9ac0-426b-a9a0-197df50598b0}</Project> <Name>FLY.OBJComponents</Name> diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/IService/IBulkDBService.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/IService/IBulkDBService.cs index c59fcd07f5c412d0ad98d389f01f600aaebfffef..3dc8594bbed8c0fc5873eff09102ad08ba74fd5d 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/IService/IBulkDBService.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/IService/IBulkDBService.cs @@ -177,6 +177,7 @@ namespace FLY.Thick.Blowing.IService public class TrendValue { + public long ScanDataID { get; set; } public double Sigma { get; set; } public double Value { get; set; } public DateTime Time { get; set; } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/Model/BulkDB.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/Model/BulkDB.cs index a06f12dc90ef674816d52fe0a2a659aa87995be3..f3f2074751d73f0cb66d8ce63ae4f16b427198e2 100644 --- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/Model/BulkDB.cs +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/Model/BulkDB.cs @@ -58,6 +58,18 @@ namespace FLY.Thick.Blowing.Server.Model /// </summary> public bool IsFinished { get; private set; } + /// <summary> + /// æ··åˆæ•°æ®ï¼Œæ—¶é—´èŒƒå›´ + /// 大于 TimeSpan.Zero 起作用 + /// </summary> + public TimeSpan MixDataTimeRange { get; set; } = TimeSpan.FromMinutes(5); + + /// <summary> + /// æ··åˆæ•°æ®ï¼Œå‡å€¼æ³¢åŠ¨èŒƒå›´ + /// 大于 0 起作用 + /// </summary> + public double MixDataAvgRange { get; set; } = 5; + /// <summary> /// /// </summary> @@ -249,7 +261,7 @@ namespace FLY.Thick.Blowing.Server.Model if (lc_scanDatas.Count() > 1) { //求å‡å€¼ - lc_scanData.Thicks = GetMixScanData(lc_scanDatas, 0, lc_scanDatas.Count()); + lc_scanData.Thicks = GetMixScanData(lc_scanDatas); } reponse.scanData = lc_scanData; @@ -273,16 +285,15 @@ namespace FLY.Thick.Blowing.Server.Model /// 获å–纵å‘趋势图 /// </summary> /// <param name="request"></param> - /// <param name="asyncDelegate"></param> - /// <param name="asyncContext"></param> + /// <param name="AsyncDelegate"></param> + /// <param name="AsyncContext"></param> public async void GetTrend(Pack_GetTrendRequest request, AsyncCBHandler asyncDelegate, object asyncContext) { - //TODO 需è¦å¼‚æ¥ Pack_GetTrendReponse reponse = new Pack_GetTrendReponse(); reponse.Request = request; - if (request.Count > 400)//æ•°é‡é™åˆ¶ï¼Œé¿å…æ»æœº - request.Count = 400; + if (request.Count > 200)//æ•°é‡é™åˆ¶ï¼Œé¿å…æ»æœº + request.Count = 200; else if (request.Count < 1) request.Count = 1; @@ -295,112 +306,241 @@ namespace FLY.Thick.Blowing.Server.Model request.Interval = 1; - await Task.Factory.StartNew(() => + await Task.Factory.StartNew(() => + { + List<Db_ScanData> db_scandatas = null; + + if (request.Interval <= request.Mix) { - List<Db_ScanData> db_scandatas=null; + //é—´éš”<=æ··åˆï¼Œå…¨éƒ¨æ•°æ®è¿žç»èŽ·å– + int cnt = request.Count * request.Interval + request.Mix - 1; if (!request.IsSearchByTime) { if (request.Id <= 0) db_scandatas = dbModel.TbScanData.Find( - $"WHERE {nameof(Db_ScanData.ID)} % {request.Interval} = 0" + - $" ORDER BY {nameof(Db_ScanData.ID)} DESC" + - $" LIMIT {request.Mix + request.Count - 1} OFFSET {-request.Id}"); + $" ORDER BY ID DESC" + + $" LIMIT {cnt} OFFSET {-request.Id}"); else db_scandatas = dbModel.TbScanData.Find( - $"WHERE ({nameof(Db_ScanData.ID)} <= {request.Id})" + - $" AND ({nameof(Db_ScanData.ID)} % {request.Interval} = 0)" + - $" ORDER BY {nameof(Db_ScanData.ID)} DESC" + - $" LIMIT {request.Mix + request.Count - 1}"); + $"WHERE (ID <= {request.Id})" + + $" ORDER BY ID DESC" + + $" LIMIT {cnt}"); } - else + else { db_scandatas = dbModel.TbScanData.Find( $"WHERE ({nameof(Db_ScanData.Time)} <= {request.Time.ToStringOfSQLiteFieldType()})" + - $" AND ({nameof(Db_ScanData.ID)} % {request.Interval} = 0)" + - $" ORDER BY {nameof(Db_ScanData.ID)} DESC" + - $" LIMIT {request.Mix + request.Count - 1}"); + $" ORDER BY ID DESC" + + $" LIMIT {cnt}"); } + } + else + { + //é—´éš”>æ··åˆ éš”æ®µèŽ·å– + int cnt = request.Count * request.Mix; + if (!request.IsSearchByTime) + { + if (request.Id <= 0) + db_scandatas = dbModel.TbScanData.Find( + $"WHERE ID % {request.Interval} < {request.Mix}" + + $" ORDER BY ID DESC" + + $" LIMIT {cnt} OFFSET {-request.Id}"); + else + db_scandatas = dbModel.TbScanData.Find( + $"WHERE (ID <= {request.Id})" + + $" AND ( ID % {request.Interval} < {request.Mix})" + + $" ORDER BY ID DESC" + + $" LIMIT {cnt}"); + } + else + { + db_scandatas = dbModel.TbScanData.Find( + $"WHERE ({nameof(Db_ScanData.Time)} <= {request.Time.ToStringOfSQLiteFieldType()})" + + $" AND ( ID % {request.Interval} < {request.Mix})" + + $" ORDER BY ID DESC" + + $" LIMIT {cnt}"); + } + } - - if (db_scandatas.Count() == 0) - return; + if (db_scandatas.Count() == 0) + return; //从尾å‘å‰æŽ’çš„ï¼ï¼ï¼ï¼ var lc_scanDatas = Lc_AutoMapperProfile.Mapper.Map<List<Db_ScanData>, List<Lc_ScanData>>(db_scandatas); - reponse.Values = ToTrend(lc_scanDatas, request.Count, request.Mix); + reponse.Values = ToTrend2(lc_scanDatas, request.Count, request.Mix, request.Interval); - var lc_scanData = lc_scanDatas.First(); - reponse.ScanDataId = lc_scanData.ID; + var lc_scanData = lc_scanDatas.First(); + reponse.ScanDataId = lc_scanData.ID; - }); - + }); + asyncDelegate(asyncContext, reponse); } - double[] GetMixScanData(List<Lc_ScanData> lc_scanDatas, int offset, int mix) + double[] GetMixScanData(List<Lc_ScanData> lc_scanDatas) { - var lc_scanData = lc_scanDatas[offset]; + var lc_scanData = lc_scanDatas[0]; //求å‡å€¼ double[] thks = new double[lc_scanData.Thicks.Count()]; - int cnt = 0; - for (int j = offset; j < offset + mix && j < lc_scanDatas.Count(); j++) + int[] cnt = new int[thks.Count()]; + for (int j = 0; j < lc_scanDatas.Count(); j++) { int index = j; if (lc_scanDatas[index].Thicks.Count() != thks.Count()) { - //ç»“æŸ + //结æŸï¼Œå¼‚常 break; } for (int i = 0; i < thks.Count(); i++) { - thks[i] += lc_scanDatas[index].Thicks[i]; + var v = lc_scanDatas[index].Thicks[i]; + if (!double.IsNaN(v)) + { + thks[i] += v; + cnt[i]++; + } } - cnt++; } for (int i = 0; i < thks.Count(); i++) { - thks[i] /= cnt; + if (cnt[i] > 0) + thks[i] /= cnt[i]; + else + thks[i] = double.NaN; } return thks; } - List<TrendValue> ToTrend(List<Lc_ScanData> lc_scanDatas, int count, int mix) + + double[] GetMixScanData(List<Lc_ScanData> lc_scanDatas, int offset, int mix, out int realMix) { + //lc_scanDatas[0] 是最新的数æ®ï¼ï¼ + + List<Lc_ScanData> lc_scanDatas2 = new List<Lc_ScanData>(); + for (int i = 0; i < mix; i++) + { + int index = offset + i; + if (index >= lc_scanDatas.Count()) + break; + lc_scanDatas2.Add(lc_scanDatas[offset + i]); + } - if (mix == 1) + //è¿žç»ä¸¤å¹…图时间间隔 大于 MixDataTimeRange åˆ é™¤ + if (MixDataTimeRange > TimeSpan.Zero) { - return lc_scanDatas.Select(sd => + for (int i = 1; i < lc_scanDatas2.Count(); i++) { - double avg = sd.Thicks.AverageNoNull(); - double sigma = sd.Thicks.Sigma(); - return new TrendValue() + var scanData0 = lc_scanDatas2[i - 1]; + var scanData1 = lc_scanDatas2[i]; + if (scanData0.Time - scanData1.Time > MixDataTimeRange) { - Sigma = sigma, - Value = avg, - Time = sd.Time - }; - }).ToList(); + lc_scanDatas2.RemoveRange(i, lc_scanDatas2.Count() - i); + break; + } + } } - List<TrendValue> trendValues = new List<TrendValue>(); + //把 å‡å€¼ä¸Ž 最新的一幅图 çš„å‡å€¼ åå·® 大于 MixDataAvgRange åˆ é™¤ + if (MixDataAvgRange > 0) + { + var newest_scanData = lc_scanDatas2[0]; + + //注æ„æ•°æ®æ˜¯æ²¡æœ‰å‰”除的, 计算平å‡å€¼æ—¶ï¼Œè¦æ˜Žç¡®èŒƒå›´ + var newest_avg = Misc.MyMath.Avg(newest_scanData.Thicks); + + if (!double.IsNaN(newest_avg)) + { + for (int i = 1; i < lc_scanDatas2.Count(); i++) + { + var scanData = lc_scanDatas2[i]; + + var avg = Misc.MyMath.Avg(scanData.Thicks); + if (double.IsNaN(avg))//一幅数æ®å¼‚å¸¸ï¼Œå…¨éƒ¨åˆ é™¤ + { + lc_scanDatas2.RemoveRange(i, lc_scanDatas2.Count() - i); + break; + } + + //å˜åŒ–太大 + if (Math.Abs(newest_avg - avg) > MixDataAvgRange) + { + lc_scanDatas2.RemoveRange(i, lc_scanDatas2.Count() - i); + break; + } + } + } + else + { + lc_scanDatas2.RemoveRange(1, lc_scanDatas2.Count() - 1); + } + } + + realMix = lc_scanDatas2.Count(); - for (int i = 0; i < lc_scanDatas.Count() && i < count; i++) + if (lc_scanDatas2.Count() > 1) { //求å‡å€¼ - double[] thks = GetMixScanData(lc_scanDatas, i, mix); - double avg = thks.AverageNoNull(); - double sigma = thks.Sigma(); + return GetMixScanData(lc_scanDatas2); + } + else + { + return lc_scanDatas2.First().Thicks.ToArray(); + } + + + } + + + List<TrendValue> ToTrend2(List<Lc_ScanData> lc_scanDatas, int count, int mix, int interval) + { + // lc_scanDatas.First() 是IDæœ€å¤§çš„æ•°æ® + + //if (mix == 1) + //{ + // return lc_scanDatas.Select(sd => + // { + // double avg = sd.Thicks.AverageNoNull(); + // double sigma = sd.Thicks.Sigma(); + // return new TrendValue() + // { + // ScanDataID = sd.ID, + // ProfileID = sd.ProfileID, + // Sigma = sigma, + // Value = avg, + // Time = sd.Time + // }; + // }).ToList(); + //} + + List<TrendValue> trendValues = new List<TrendValue>(); - trendValues.Add(new TrendValue() + for (int i = 0; i < lc_scanDatas.Count(); i++) + { + var sd = lc_scanDatas[i]; + if (sd.ID % interval == 0) { - Sigma = sigma, - Value = avg, - Time = lc_scanDatas[i].Time - }); + //它是数æ®ç‚¹ + double[] thks = GetMixScanData(lc_scanDatas, i, mix, out int _m); + + //求å‡å€¼ + double avg = thks.AverageNoNull(); + double sigma = thks.Sigma(); + + trendValues.Add(new TrendValue() + { + ScanDataID = sd.ID, + Sigma = sigma, + Value = avg, + Time = lc_scanDatas[i].Time + }); + if (trendValues.Count() >= count) + break;//å®Œæˆ + } + } return trendValues; } diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/ThickPlcModbusTcpServer.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/ThickPlcModbusTcpServer.cs new file mode 100644 index 0000000000000000000000000000000000000000..150ec7e2323991461176a445278721ec979990ac --- /dev/null +++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/ThickPlcModbusTcpServer.cs @@ -0,0 +1,210 @@ +using FLY.Thick.Blowing.IService; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Misc; +using System.IO; +using Newtonsoft.Json; + +namespace FLY.Thick.Blowing.Server +{ + public class ThickPlcModbusTcpServer:INotifyPropertyChanged + { + const int ADDR_ID = 0; + const int ADDR_DateTimeYear = 1; + const int ADDR_DateTimeMonth = 2; + const int ADDR_DateTimeDay = 3; + const int ADDR_DateTimeHour = 4; + const int ADDR_DateTimeMinute = 5; + const int ADDR_DateTimeSecond = 6; + const int ADDR_Average = 7; + const int ADDR_Sigma2 = 8; + const int ADDR_Sigma2Percent = 9; + const int ADDR_Count = 10; + const int ADDR_Datas = 11; + const int DatasCap = 199 - 11 + 1; + + FLY.Modbus.WithThread.ServerTCP server; + IBulkDbService bulkDbService; + + public event PropertyChangedEventHandler PropertyChanged; + + public string ServerAddr { get; set; } = "0.0.0.0:1502"; + public FLY.Modbus.WithThread.ServerTCP ModbusTcpServer => server; + UInt16[] regs = new UInt16[200]; + UInt16[] regs2 = new UInt16[200]; + + public ThickPlcModbusTcpServer() + { + if (!Load()) + { + Save(); + } + } + public void Init(IBulkDbService bulkDbService) + { + this.bulkDbService = bulkDbService; + server = new FLY.Modbus.WithThread.ServerTCP(Misc.StringConverter.ToIPEndPoint(ServerAddr), + GetValue, SetValue); + server.Start(); + + this.bulkDbService.PropertyChanged += BulkDbService_PropertyChanged; + updateDatas(); + } + + private void BulkDbService_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(bulkDbService.LastScanDataId)) + { + updateDatas(); + } + } + void updateDatas() + { + this.bulkDbService.GetFrame(new Pack_GetFrameRequest() { Id = 0, Mix = 1 }, + (object asyncContext, object retData) => + { + + var reponse = retData as Pack_GetFrameReponse; + if (reponse.scanData == null) { + //æ²¡æœ‰æ•°æ® + return; + } + + var scanData = reponse.scanData; + + regs2[ADDR_ID] = (UInt16)scanData.ID; + regs2[ADDR_DateTimeYear] = (UInt16)scanData.Time.Year; + regs2[ADDR_DateTimeMonth] = (UInt16)scanData.Time.Month; + regs2[ADDR_DateTimeDay] = (UInt16)scanData.Time.Day; + regs2[ADDR_DateTimeHour] = (UInt16)scanData.Time.Hour; + regs2[ADDR_DateTimeMinute] = (UInt16)scanData.Time.Minute; + regs2[ADDR_DateTimeSecond] = (UInt16)scanData.Time.Second; + + if (scanData.Thicks != null) + { + double avg = scanData.Thicks.AverageNoNull(); + if (!double.IsNaN(avg)) + { + regs2[ADDR_Average] = (UInt16)(avg * 10); + double sigma2 = scanData.Thicks.Sigma() * 2; + regs2[ADDR_Sigma2] = (UInt16)(sigma2 * 10); + double sigma2Percent = sigma2 / avg * 100; + regs2[ADDR_Sigma2Percent] = (UInt16)(sigma2Percent * 10); + regs2[ADDR_Count] = (UInt16)scanData.Thicks.Count(); + for (int i = 0; i < scanData.Thicks.Count() && i < DatasCap; i++) + { + var d = scanData.Thicks[i]; + if (!double.IsNaN(avg)) + { + regs2[ADDR_Datas + i] = (UInt16)(d * 10); + } + else + { + regs2[ADDR_Datas + i] = 0; + } + } + } + else + { + clearDatas(regs2); + } + } + else + { + clearDatas(regs2); + } + + + lock (regs) + { + Array.Copy(regs2, regs, regs.Count()); + } + }, + null); + } + void clearDatas(UInt16[] regs2) + { + for (int i = ADDR_Average; i < regs2.Count(); i++) + { + regs2[i] = 0; + } + } + void GetValue(int addr, object values) + { + if (addr < 0) + return; + + if (values is UInt16[]) { + var uint16s = values as UInt16[]; + int sourceIndex = addr; + int len = uint16s.Count(); + if (sourceIndex >= regs.Count()) + return; + + if(sourceIndex +len > regs.Count()) + { + len = regs.Count() - sourceIndex; + } + + lock (regs) + { + Array.Copy(regs, addr, uint16s, 0, len); + } + } + } + void SetValue(int addr, object values) + { + + } + + + string file_path = "thickplc.json"; + bool Load() + { + try + { + if (File.Exists(file_path)) + { + string json = File.ReadAllText(file_path); + var jsonDb = JsonConvert.DeserializeObject<ThickPlcModbusTcpServerJsonDb>(json); + this.ServerAddr = jsonDb.ServerAddr; + return true; + } + } + catch + { + //异常,没有json 解ç 失败 + + } + return false; + } + + public bool Save() + { + try + { + var jsonDb = new ThickPlcModbusTcpServerJsonDb() { ServerAddr = ServerAddr }; + string json = JsonConvert.SerializeObject(jsonDb, Formatting.Indented); + File.WriteAllText(file_path, json); + return true; + } + catch + { + //异常,没有json ç¼–ç 失败 + + } + return false; + } + } + public class ThickPlcModbusTcpServerJsonDb + { + public string ServerAddr = "0.0.0.0:1502"; + + + + } +} diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Client/Properties/AssemblyInfo.cs b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Client/Properties/AssemblyInfo.cs index e0a0f6d13fa7fa7578935688d9504f6b91c8b7db..f3cf7e4664cf98a5f358a2f6943b5a4067e8b947 100644 --- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Client/Properties/AssemblyInfo.cs +++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Client/Properties/AssemblyInfo.cs @@ -51,6 +51,6 @@ using System.Windows; //å¯ä»¥æŒ‡å®šæ‰€æœ‰è¿™äº›å€¼ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨â€œç”Ÿæˆå·â€å’Œâ€œä¿®è®¢å·â€çš„默认值 //通过使用 "*",如下所示: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("7.0.8")] -[assembly: AssemblyFileVersion("7.0.8")] +[assembly: AssemblyVersion("7.4.0.0")] +[assembly: AssemblyFileVersion("7.4.0.0")] [assembly: Guid("38E0D8EC-4D1C-49FF-AB08-6289294C5BD4")] diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/FLY.Thick.BlowingScan.UI.Server.csproj b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/FLY.Thick.BlowingScan.UI.Server.csproj index bab6048726fe690421938038900f4d8448e922e1..6acab576365aa82d01fee9f67785539e03a52ec7 100644 --- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/FLY.Thick.BlowingScan.UI.Server.csproj +++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/FLY.Thick.BlowingScan.UI.Server.csproj @@ -165,6 +165,10 @@ <Project>{5ee61ac6-5269-4f0f-b8fa-4334fe4a678f}</Project> <Name>Misc</Name> </ProjectReference> + <ProjectReference Include="..\..\thick_public\Project.FLY.ModbusMapper\FLY.ModbusMapper\FLY.ModbusMapper.csproj"> + <Project>{6d4b9bda-2a66-4583-b244-758bc4213d9f}</Project> + <Name>FLY.ModbusMapper</Name> + </ProjectReference> <ProjectReference Include="..\..\thick_public\Project.FLY.Thick.Base\FLY.Thick.Base\FLY.Thick.Base.csproj"> <Project>{91a1aafe-a528-4c2e-a48a-9259e780255a}</Project> <Name>FLY.Thick.Base</Name> diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/MainWindow.xaml.cs b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/MainWindow.xaml.cs index 399800f7d077f31b92d3b2b3e1486555cb23ee6e..b439b54788c27df1ba109ec874555bf0b58afbb5 100644 --- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/MainWindow.xaml.cs +++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/MainWindow.xaml.cs @@ -10,7 +10,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Navigation; - +using ThickPlcModbusTcpServer = FLY.Thick.Blowing.Server.ThickPlcModbusTcpServer; namespace FLY.Thick.BlowingScan.UI.Server { /// <summary> @@ -21,6 +21,7 @@ namespace FLY.Thick.BlowingScan.UI.Server FLY.AppHelper.WindowNotifyIconHelper notifyiconhelper; TDGage mGage; OBJProxys mOBJProxy; + ThickPlcModbusTcpServer thickPlcModbusTcpServer; public MainWindow() { InitializeComponent(); @@ -40,12 +41,15 @@ namespace FLY.Thick.BlowingScan.UI.Server mOBJProxy = new OBJProxys(0, mGage); + thickPlcModbusTcpServer = new ThickPlcModbusTcpServer(); + thickPlcModbusTcpServer.Init(mGage.bulkDb); + FObjBase.PollModule.Current.Start(); this.Hide(); PgMain p = new PgMain(); - p.Init(mGage); + p.Init(mGage,thickPlcModbusTcpServer); this.Navigate(p); this.NavigationService.RemoveBackEntry(); diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml index 871382d726f9dfb103f96123b9fa850c244dd038..2f786f3366a8122877a64c7ac412ccc9df6c9169 100644 --- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml +++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml @@ -58,6 +58,34 @@ <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Position}"/> </StackPanel> </StackPanel> + <StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}" DataContext="{Binding ModbusTcpServer}"> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="ModbusTcpæœåŠ¡åœ°å€"/> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding LocalEP}"/> + </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="状æ€"/> + <TextBlock> + <TextBlock.Style> + <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent}"> + <Setter Property="Foreground" Value="Red"/> + <Setter Property="Text" Value="åœæ¢"/> + <Style.Triggers> + <DataTrigger Binding="{Binding IsRunning}" Value="True"> + <Setter Property="Foreground" Value="Green"/> + <Setter Property="Text" Value="工作ä¸"/> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> + </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="当å‰è¿žæŽ¥æ•°"/> + <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding ConnectedCnt}"/> + </StackPanel> + </StackPanel> + </StackPanel> </Grid> </Page> diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml.cs b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml.cs index abf3b2df06f77cc3c528be77e14be73e7387ae2d..fb5c9d83543b9decd1c8f3c7a201de09521339f4 100644 --- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml.cs +++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml.cs @@ -13,6 +13,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Data; +using ThickPlcModbusTcpServer = FLY.Thick.Blowing.Server.ThickPlcModbusTcpServer; namespace FLY.Thick.BlowingScan.UI.Server { @@ -26,10 +27,10 @@ namespace FLY.Thick.BlowingScan.UI.Server { InitializeComponent(); } - public void Init(TDGage mGage) + public void Init(TDGage mGage, ThickPlcModbusTcpServer thickPlcModbusTcpServer) { viewModel = new PgMainVm(); - viewModel.Init(mGage); + viewModel.Init(mGage, thickPlcModbusTcpServer); this.DataContext = viewModel; } @@ -46,7 +47,10 @@ namespace FLY.Thick.BlowingScan.UI.Server public RelayCommand SaveDebugCmd { get; private set; } public RelayCommand DebugCmd { get; private set; } + + public FLY.Modbus.WithThread.ServerTCP ModbusTcpServer{get;set;} TDGage mGage; + ThickPlcModbusTcpServer thickPlcModbusTcpServer; public PgMainVm() { SetupCmd = new RelayCommand(Setup); @@ -56,11 +60,13 @@ namespace FLY.Thick.BlowingScan.UI.Server - public void Init(TDGage mGage) + public void Init(TDGage mGage, ThickPlcModbusTcpServer thickPlcModbusTcpServer) { this.mGage = mGage; + this.thickPlcModbusTcpServer = thickPlcModbusTcpServer; SysParam = mGage.sysParam; FlyAd = mGage.flyAd; + ModbusTcpServer = thickPlcModbusTcpServer.ModbusTcpServer; } private void OpenWdDebug() @@ -74,7 +80,7 @@ namespace FLY.Thick.BlowingScan.UI.Server //æ‰“å¼€è®¾ç½®é¡µé¢ WdSetup w = new WdSetup(); - w.Init(SysParam, FlyAd); + w.Init(SysParam, FlyAd, thickPlcModbusTcpServer); w.Owner = App.Current.MainWindow; w.ShowDialog(); } diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/Properties/AssemblyInfo.cs b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/Properties/AssemblyInfo.cs index 9a2c9fbba76147f337cc0f23b4fb10d5eb0c4982..748a7259ca563ce92e0b53c03acfc9cf412bc9a5 100644 --- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/Properties/AssemblyInfo.cs +++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/Properties/AssemblyInfo.cs @@ -51,7 +51,7 @@ using System.Windows; // å¯ä»¥æŒ‡å®šæ‰€æœ‰è¿™äº›å€¼ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨â€œå†…部版本å·â€å’Œâ€œä¿®è®¢å·â€çš„默认值, // 方法是按如下所示使用“*â€: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("7.0.9.0")] -[assembly: AssemblyFileVersion("7.0.9.0")] +[assembly: AssemblyVersion("7.1.1.0")] +[assembly: AssemblyFileVersion("7.1.1.0")] [assembly: Guid("A2277244-BCD4-485B-85F4-AAE96DA235B5")] diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml index 2f30b100fdb29ae3411f8c9791e97d87d1a1ec70..f875748b5000de975fbbecaab530e97f11c19ac2 100644 --- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml +++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml @@ -24,6 +24,10 @@ <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="AD盒地å€"/> <TextBox Style="{StaticResource Styles.Text.FieldContent.Input}" Text="{Binding FlyAdAddr}"/> </StackPanel> + <StackPanel Margin="{StaticResource ControlMargin}"> + <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="ModbusTcp地å€"/> + <TextBox Style="{StaticResource Styles.Text.FieldContent.Input}" Text="{Binding PlcAddr}"/> + </StackPanel> </StackPanel> <StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}"> <Button Style="{StaticResource Styles.Button.Square.Accent2}" diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml.cs b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml.cs index e47ff409723a21a042f0cab39ef9f02c5c0d9071..7d97083dabebefca91a478d0282bb1bd7d94952a 100644 --- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml.cs +++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml.cs @@ -1,4 +1,5 @@ using FLY.Thick.Base.Server; +using FLY.Thick.Blowing.Server; using FlyADBase; using GalaSoft.MvvmLight.Command; using System; @@ -28,10 +29,10 @@ namespace FLY.Thick.BlowingScan.UI.Server { InitializeComponent(); } - public void Init(SysParam sysParam,FlyAD7 flyAd) + public void Init(SysParam sysParam,FlyAD7 flyAd, ThickPlcModbusTcpServer thickPlcModbusTcpServer) { viewModel = new WdSetupVm(); - viewModel.Init(sysParam, flyAd); + viewModel.Init(sysParam, flyAd, thickPlcModbusTcpServer); this.DataContext = viewModel; } } @@ -40,13 +41,13 @@ namespace FLY.Thick.BlowingScan.UI.Server public event PropertyChangedEventHandler PropertyChanged; public string Addr { get; set; } public string FlyAdAddr { get; set; } - + public string PlcAddr { get; set; } public RelayCommand OkCmd { get; private set; } SysParam sysParam; FlyAD7 flyAd; - InitParam initParam; + ThickPlcModbusTcpServer thickPlcModbusTcpServer; public WdSetupVm() { OkCmd = new RelayCommand(Ok); @@ -54,12 +55,15 @@ namespace FLY.Thick.BlowingScan.UI.Server - public void Init(SysParam sysParam, FlyAD7 flyAd) + public void Init(SysParam sysParam, FlyAD7 flyAd, ThickPlcModbusTcpServer thickPlcModbusTcpServer) { this.sysParam = sysParam; this.flyAd = flyAd; + this.thickPlcModbusTcpServer = thickPlcModbusTcpServer; + Addr = sysParam.Addr; FlyAdAddr = flyAd.Addr; + PlcAddr = thickPlcModbusTcpServer.ServerAddr; } private void Ok() @@ -75,6 +79,9 @@ namespace FLY.Thick.BlowingScan.UI.Server flyAd.Addr = FlyAdAddr; flyAd.Save(); + thickPlcModbusTcpServer.ServerAddr = PlcAddr; + thickPlcModbusTcpServer.Save(); + System.Environment.CurrentDirectory = "../"; AppHelper.AppJustOne.Restart(); } diff --git "a/Resource/\346\265\213\345\216\232\344\273\252PLC\345\234\260\345\235\200\350\241\250.xlsx" "b/Resource/\346\265\213\345\216\232\344\273\252PLC\345\234\260\345\235\200\350\241\250.xlsx" deleted file mode 100644 index 1a5d8406c1c1fc3740a5cf9487226db74f5f1f49..0000000000000000000000000000000000000000 Binary files "a/Resource/\346\265\213\345\216\232\344\273\252PLC\345\234\260\345\235\200\350\241\250.xlsx" and /dev/null differ diff --git "a/Resource/\346\265\213\345\216\232\344\273\252PLC\345\257\204\345\255\230\345\231\250\345\234\260\345\235\200\350\241\250.xlsx" "b/Resource/\346\265\213\345\216\232\344\273\252PLC\345\257\204\345\255\230\345\231\250\345\234\260\345\235\200\350\241\250.xlsx" new file mode 100644 index 0000000000000000000000000000000000000000..33690192c1818fdc01e1aa50613af04b4e338e09 Binary files /dev/null and "b/Resource/\346\265\213\345\216\232\344\273\252PLC\345\257\204\345\255\230\345\231\250\345\234\260\345\235\200\350\241\250.xlsx" differ diff --git a/thick_public b/thick_public index 2801cd820617cf33995ede1e5ff94fbb042ee460..29ac9193eae1289aebf48fbf6acbb0d632549979 160000 --- a/thick_public +++ b/thick_public @@ -1 +1 @@ -Subproject commit 2801cd820617cf33995ede1e5ff94fbb042ee460 +Subproject commit 29ac9193eae1289aebf48fbf6acbb0d632549979 diff --git "a/\350\204\232\346\234\254/hemeiInstallZipVersionInfo.json" "b/\350\204\232\346\234\254/hemeiInstallZipVersionInfo.json" index c7015a3449cf7f1555f54de0d9e97d126ac52f98..a3c4eb9f7becde54ceb4f948ba26d4fd21e652e9 100644 --- "a/\350\204\232\346\234\254/hemeiInstallZipVersionInfo.json" +++ "b/\350\204\232\346\234\254/hemeiInstallZipVersionInfo.json" @@ -1,4 +1,4 @@ { - "InstallZipVersion":"7.0.9.2", - "InstallZipUrl":"http://server.flyautomation.net:8889/download/和美安装包_v7.0.9.2_20220609.7z" + "InstallZipVersion":"7.4.0", + "InstallZipUrl":"http://server.flyautomation.net:8889/download/和美安装包_v7.4.0_20220628.7z" } \ No newline at end of file diff --git "a/\350\204\232\346\234\254/install/CopyExe.exe" "b/\350\204\232\346\234\254/install/CopyExe.exe" new file mode 100644 index 0000000000000000000000000000000000000000..7de3098a99d2062f7da94c7c4188089399850d7d Binary files /dev/null and "b/\350\204\232\346\234\254/install/CopyExe.exe" differ diff --git "a/\350\204\232\346\234\254/install/backupConfig.json" "b/\350\204\232\346\234\254/install/backupConfig.json" new file mode 100644 index 0000000000000000000000000000000000000000..73a202fb578959ae7f1916c84f37c35ab09ca022 --- /dev/null +++ "b/\350\204\232\346\234\254/install/backupConfig.json" @@ -0,0 +1,10 @@ +{ + "ServerAddr": "private.flyautomation.net:2155", + "LocalFilePath": "D:\\佛山市枫莱尔自动化技术有é™å…¬å¸\\windows", + "FtpPwd": "fly:flymeasure", + "LpName": "fly-1234", + "LpPaths": [ + "D:\\佛山市枫莱尔自动化技术有é™å…¬å¸\\windows\\LP3\\lp.json", + "D:\\佛山市枫莱尔自动化技术有é™å…¬å¸\\windows\\FLY.LinkProxy.UI\\lp.json" + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedback.json" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedback.json" index 999a65dbfbfb9ebfd8cede51783e423d955ba4c0..a2e3e9b15d2bb7cf627d49b7aecad0191e2177a8 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedback.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedback.json" @@ -5,6 +5,7 @@ "HasCheck": true, "Step": 5, "HeatsProductName": "default", - "HasCheckFilmVelocity": false, - "HeatsOfGroup": 12 + "HasCheckFilmVelocity": true, + "HeatsOfGroup": 12, + "OffsetGraphYRangePercent": 3.0 } \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/default2.xml" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/default2.xml" deleted file mode 100644 index c02636f21a6a20aa8e63ffdb8b5597fa51f9a431..0000000000000000000000000000000000000000 --- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/default2.xml" +++ /dev/null @@ -1,111 +0,0 @@ -<?xml version="1.0"?> -<FeedbackHeatsMark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <heats> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>20</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>25</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - <int>0</int> - </heats> -</FeedbackHeatsMark> \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\346\234\200\345\220\216\350\256\260\345\275\225.xml" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\346\234\200\345\220\216\350\256\260\345\275\225.xml" deleted file mode 100644 index 92624e7d34179b8310ed5d0ebcd9980933b4c9f0..0000000000000000000000000000000000000000 --- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\346\234\200\345\220\216\350\256\260\345\275\225.xml" +++ /dev/null @@ -1,93 +0,0 @@ -<?xml version="1.0"?> -<FeedbackHeatsMark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <heats> - <int>17</int> - <int>19</int> - <int>19</int> - <int>10</int> - <int>10</int> - <int>10</int> - <int>4</int> - <int>10</int> - <int>10</int> - <int>10</int> - <int>18</int> - <int>27</int> - <int>35</int> - <int>43</int> - <int>44</int> - <int>37</int> - <int>34</int> - <int>27</int> - <int>21</int> - <int>16</int> - <int>16</int> - <int>22</int> - <int>28</int> - <int>22</int> - <int>22</int> - <int>22</int> - <int>31</int> - <int>40</int> - <int>38</int> - <int>32</int> - <int>36</int> - <int>34</int> - <int>36</int> - <int>38</int> - <int>28</int> - <int>40</int> - <int>40</int> - <int>40</int> - <int>46</int> - <int>40</int> - <int>40</int> - <int>34</int> - <int>34</int> - <int>40</int> - <int>34</int> - <int>38</int> - <int>38</int> - <int>34</int> - <int>28</int> - <int>28</int> - <int>18</int> - <int>16</int> - <int>8</int> - <int>5</int> - <int>3</int> - <int>8</int> - <int>14</int> - <int>8</int> - <int>8</int> - <int>10</int> - <int>12</int> - <int>7</int> - <int>5</int> - <int>0</int> - <int>3</int> - <int>7</int> - <int>14</int> - <int>18</int> - <int>14</int> - <int>16</int> - <int>16</int> - <int>16</int> - <int>14</int> - <int>6</int> - <int>16</int> - <int>16</int> - <int>4</int> - <int>10</int> - <int>10</int> - <int>14</int> - <int>16</int> - <int>4</int> - <int>16</int> - <int>12</int> - <int>15</int> - <int>23</int> - <int>24</int> - <int>16</int> - </heats> -</FeedbackHeatsMark> \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\350\226\204\346\226\2312.xml" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\350\226\204\346\226\2312.xml" deleted file mode 100644 index 42eb15b032b8823da1616cf2a9e24b9b8103d12c..0000000000000000000000000000000000000000 --- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\350\226\204\346\226\2312.xml" +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0"?> -<FeedbackHeatsMark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <heats> - <int>23</int> - <int>28</int> - <int>27</int> - <int>27</int> - <int>24</int> - <int>24</int> - <int>25</int> - <int>28</int> - <int>28</int> - <int>27</int> - <int>27</int> - <int>22</int> - <int>13</int> - <int>6</int> - <int>2</int> - <int>4</int> - <int>4</int> - <int>5</int> - <int>2</int> - <int>0</int> - <int>4</int> - <int>7</int> - <int>8</int> - <int>7</int> - <int>6</int> - <int>8</int> - <int>11</int> - <int>12</int> - <int>11</int> - <int>12</int> - <int>17</int> - <int>16</int> - <int>15</int> - <int>8</int> - <int>4</int> - <int>5</int> - <int>13</int> - <int>25</int> - <int>30</int> - <int>26</int> - <int>22</int> - <int>17</int> - <int>15</int> - <int>18</int> - </heats> -</FeedbackHeatsMark> \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatbuf.json" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatbuf.json" deleted file mode 100644 index ee34ad4fa36d34aa1be71c630e1a48cf196e43ec..0000000000000000000000000000000000000000 --- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatbuf.json" +++ /dev/null @@ -1,16 +0,0 @@ -{ - "SearchAngleRange": 120, - "HeatEffectCurve": [ - 3, - 4, - 5, - 6, - 5, - 4, - 3 - ], - "StableRange": 4, - "ThresholdR": 0.8, - "ThresholdMaxMin": 40, - "ThresholdSigmaMax": 25 -} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatcell.json" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatcell.json" deleted file mode 100644 index 66334e178bd4e8925b73745811de2e04c3cd23cd..0000000000000000000000000000000000000000 --- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatcell.json" +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Kp": 4.0, - "IsAutoONo": true, - "MaxHeat": 100, - "ThresholdHeatSigma": 7.0, - "IsForbidUpDown": false, - "CtrlLine": 2 -} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/system.json" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/system.json" deleted file mode 100644 index a203281b372137a803222fd73d3bd3e06a610980..0000000000000000000000000000000000000000 --- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/system.json" +++ /dev/null @@ -1,5 +0,0 @@ -{ - "OBJ_Port": 20007, - "BlowingAddr": "127.0.0.1:20006", - "DBKeepMonth": 6 -} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/scangraph.json" index 7695cce9d7ef1169ad3252fd786c3520b51c00b9..94ba69087de475f120b26ef3060ee4a02c7cdf03 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/scangraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/scangraph.json" @@ -1 +1,58 @@ -{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":38906193},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28924227},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":19758347},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":42299744},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":55117723},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28715689}]} \ No newline at end of file +{ + "Items": [ + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 38906193 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 28924227 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -3, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 19758347 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -2, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 42299744 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 55117723 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 28715689 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/trendgraph.json" index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..3b67a460069a9307fbfbac1b5cb93eb8c07562ab 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/trendgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/trendgraph.json" @@ -1 +1,16 @@ -{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]} \ No newline at end of file +{ + "Items": [ + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 48220637 + }, + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 38205102 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/scangraph.json" index 7695cce9d7ef1169ad3252fd786c3520b51c00b9..94ba69087de475f120b26ef3060ee4a02c7cdf03 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/scangraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/scangraph.json" @@ -1 +1,58 @@ -{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":38906193},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28924227},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":19758347},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":42299744},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":55117723},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28715689}]} \ No newline at end of file +{ + "Items": [ + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 38906193 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 28924227 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -3, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 19758347 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -2, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 42299744 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 55117723 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 28715689 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/trendgraph.json" index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..3b67a460069a9307fbfbac1b5cb93eb8c07562ab 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/trendgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/trendgraph.json" @@ -1 +1,16 @@ -{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]} \ No newline at end of file +{ + "Items": [ + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 48220637 + }, + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 38205102 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/scangraph.json" index 7695cce9d7ef1169ad3252fd786c3520b51c00b9..94ba69087de475f120b26ef3060ee4a02c7cdf03 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/scangraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/scangraph.json" @@ -1 +1,58 @@ -{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":38906193},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28924227},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":19758347},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":42299744},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":55117723},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28715689}]} \ No newline at end of file +{ + "Items": [ + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 38906193 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 28924227 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -3, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 19758347 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -2, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 42299744 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 55117723 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 28715689 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/trendgraph.json" index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..3b67a460069a9307fbfbac1b5cb93eb8c07562ab 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/trendgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/trendgraph.json" @@ -1 +1,16 @@ -{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]} \ No newline at end of file +{ + "Items": [ + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 48220637 + }, + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 38205102 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json" index 3f69bf1b5219d40b7937265a7636537321e55cbc..dd01c023f53929633d62a8458e1a65c5e1abd267 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json" @@ -151,6 +151,23 @@ false ], "Header": "定点" + }, + { + "Graphs": [ + { + "ID": 21144166, + "Rect": "0, 0, 1, 1" + } + ], + "ColumnCount": 1, + "RowCount": 1, + "RowDefinitions": [ + false + ], + "ColumnDefinitions": [ + false + ], + "Header": "趋势2" } ], "Components": [ @@ -263,6 +280,11 @@ "ID": 28792051, "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph", "ServiceContainerName": "gage0.service" + }, + { + "ID": 21144166, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2", + "ServiceContainerName": "gage0.service" } ] } diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json" index 15e8787aa2fec76b158bf3b61cce891e8e0fb1d4..6a2afa19c600d660156e8df0daa7d1b178448e32 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json" @@ -1 +1,67 @@ -{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":48499956},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":65534206},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":53749713},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":18063994},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":21125878},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":59933635}]} \ No newline at end of file +{ + "Items": [ + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 48499956 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 65534206 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -3, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 53749713 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -2, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 18063994 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 21125878 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 59933635 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 21144166 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraphcircular.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraphcircular.json" index 9b09671e8e31e6b924b4284dfd27ee76c7dbbdb8..04cdc7db3a4e8b0b853aa3fc62c9e88bd6e11834 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraphcircular.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraphcircular.json" @@ -1 +1,17 @@ -{"Items":[{"Mix":1,"Number":0,"YRangePercent":3.0,"IsPercent":true,"IsAutoTarget":true,"HasAlianZone":false,"AlianZoneBoltNoOf3oClock":1.0,"AlianZoneBoltCnt":8,"AlianZoneIsCCW":false,"AlianZoneIsShowXStep":false,"ID":59832238}]} \ No newline at end of file +{ + "Items": [ + { + "Mix": 1, + "Number": 0, + "YRangePercent": 3.0, + "IsPercent": true, + "IsAutoTarget": true, + "HasAlianZone": false, + "AlianZoneBoltNoOf3oClock": 1.0, + "AlianZoneBoltCnt": 8, + "AlianZoneIsCCW": false, + "AlianZoneIsShowXStep": false, + "ID": 59832238 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json" index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..2bf8559b75f1f301b8ddab88d972e9d0c8fbfa2a 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json" @@ -1 +1,16 @@ -{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]} \ No newline at end of file +{ + "Items": [ + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 39249953 + }, + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 21144166 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json" index 19a37d041c70449226e65cfc66d74f421ea0d018..cd3713a6b3754ab1c714fccc8a842d4516fbadf9 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json" @@ -79,14 +79,13 @@ { "Graphs": [ { - "ID": 26380169, + "ID": 50447774, "Rect": "0, 0, 1, 1" } ], "ColumnCount": 1, - "RowCount": 2, + "RowCount": 1, "RowDefinitions": [ - false, false ], "ColumnDefinitions": [ @@ -207,8 +206,8 @@ "ServiceContainerName": "gage0.service" }, { - "ID": 26380169, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph", + "ID": 50447774, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2", "ServiceContainerName": "gage0.service" }, { diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json" index d265d303386a91818194c951dabba18a71a2297a..f06d42347187f64b5ce244fc53ab71d448e6f833 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json" @@ -1 +1,67 @@ -{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":10616756},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":32390328},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":26933797},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":29950811},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":23426098},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":50354517}]} \ No newline at end of file +{ + "Items": [ + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 10616756 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 32390328 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -3, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 26933797 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -2, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 29950811 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 23426098 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 50354517 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 50447774 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json" index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..a95cf617e538431938d21702761cc49c4cead474 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json" @@ -1 +1,10 @@ -{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]} \ No newline at end of file +{ + "Items": [ + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 50447774 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/graphcustom.json" index 19a37d041c70449226e65cfc66d74f421ea0d018..cd3713a6b3754ab1c714fccc8a842d4516fbadf9 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/graphcustom.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/graphcustom.json" @@ -79,14 +79,13 @@ { "Graphs": [ { - "ID": 26380169, + "ID": 50447774, "Rect": "0, 0, 1, 1" } ], "ColumnCount": 1, - "RowCount": 2, + "RowCount": 1, "RowDefinitions": [ - false, false ], "ColumnDefinitions": [ @@ -207,8 +206,8 @@ "ServiceContainerName": "gage0.service" }, { - "ID": 26380169, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph", + "ID": 50447774, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2", "ServiceContainerName": "gage0.service" }, { diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/scangraph.json" index d265d303386a91818194c951dabba18a71a2297a..f06d42347187f64b5ce244fc53ab71d448e6f833 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/scangraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/scangraph.json" @@ -1 +1,67 @@ -{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":10616756},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":32390328},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":26933797},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":29950811},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":23426098},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":50354517}]} \ No newline at end of file +{ + "Items": [ + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 10616756 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 32390328 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -3, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 26933797 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -2, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 29950811 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -1, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 23426098 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 50354517 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 50447774 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/trendgraph.json" index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..a95cf617e538431938d21702761cc49c4cead474 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/trendgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/trendgraph.json" @@ -1 +1,10 @@ -{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]} \ No newline at end of file +{ + "Items": [ + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 50447774 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/unity/blowing.component.config" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/unity/blowing.component.config" index 9fe9b207dc96dc085dfc457d85fdf1dda51f1e13..85fcbdb02d9264dc8cac590a18f2c8d893470e70 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/unity/blowing.component.config" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/unity/blowing.component.config" @@ -21,6 +21,7 @@ <register type="IUiModule2" mapTo="UiModule2_ScanGraph2" name="blowing_sg2" /> <register type="IUiModule2" mapTo="UiModule2_ScanGraphCircular" name="blowing_sgc" /> <register type="IUiModule2" mapTo="UiModule2_TrendGraph" name="blowing_tg" /> + <register type="IUiModule2" mapTo="UiModule2_TrendGraph2" name="blowing_tg2" /> </container> </unity> </configuration> \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/flowgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/flowgraph.json" new file mode 100644 index 0000000000000000000000000000000000000000..9878a10011bf09a9288592ab98383adb96e4979a --- /dev/null +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/flowgraph.json" @@ -0,0 +1 @@ +{"Interval":6,"IsYRangeAuto":false,"IsYRangePercent":true,"YRangePercent":0.15,"YRange":20} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json" index 482545c718afb28cd5c862f377b9575230b19ada..fa9d6ac932528ac0b2e887c0698f52efbafbe41d 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json" @@ -158,6 +158,23 @@ false ], "Header": "定点" + }, + { + "Graphs": [ + { + "ID": 37010918, + "Rect": "0, 0, 1, 1" + } + ], + "ColumnCount": 1, + "RowCount": 1, + "RowDefinitions": [ + false + ], + "ColumnDefinitions": [ + false + ], + "Header": "趋势2" } ], "Components": [ @@ -290,6 +307,11 @@ "ID": 18036132, "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph", "ServiceContainerName": "gage0.service" + }, + { + "ID": 37010918, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2", + "ServiceContainerName": "gage0.service" } ] } diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json" index 9c6a54a6ac86bec2a7c0015352863bac7e333a60..0d21a8fd0565dca8e2efc688728131c3389a6685 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json" @@ -1 +1,67 @@ -{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":41709209},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":63400648},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-15,"IsPercent":true,"IsAutoTarget":true,"ID":54302323},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-10,"IsPercent":true,"IsAutoTarget":true,"ID":46404226},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":42496437},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":50443655}]} \ No newline at end of file +{ + "Items": [ + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -5, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 41709209 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 63400648 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -15, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 54302323 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -10, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 46404226 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -5, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 42496437 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 50443655 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 37010918 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json" index 3bec73b8db981479d35becd5cc9da0d46a4e0979..d2fee752ccf02cd9bad017eb8fab36b47fea8665 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json" @@ -1 +1,16 @@ -{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":0,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":true,"IsPercent":true,"ID":48220637}]} \ No newline at end of file +{ + "Items": [ + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 26947909 + }, + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 37010918 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/fixgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/fixgraph.json" index cee31444a616753672e528250d3a97916deb2884..ea9f8d9cb827a74e48f4757df4ab0f909aae300d 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/fixgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/fixgraph.json" @@ -1 +1,15 @@ -{"Items":[{"Len":500,"Interval":1000,"Mix":1,"IsAutoTarget":true,"IsADMode":false,"IsAutoY":false,"YTarget":0.0,"YRange":10.0,"ID":28792051}]} \ No newline at end of file +{ + "Items": [ + { + "Len": 500, + "Interval": 1000, + "Mix": 1, + "IsAutoTarget": true, + "IsADMode": false, + "IsAutoY": false, + "YTarget": 0.0, + "YRange": 10.0, + "ID": 28792051 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json" index 1409521c015843ef597bcf4efda02dbc58e514fe..803d7512ffbaad53b29d59adc0a540ee31cecc49 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json" @@ -82,14 +82,13 @@ { "Graphs": [ { - "ID": 52059282, + "ID": 19728236, "Rect": "0, 0, 1, 1" } ], "ColumnCount": 1, - "RowCount": 2, + "RowCount": 1, "RowDefinitions": [ - false, false ], "ColumnDefinitions": [ @@ -135,108 +134,108 @@ ], "Components": [ { - "ID": 48662582, - "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_GraphAirRing", + "ID": 44866487, + "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_MenuSetting", "ServiceContainerName": "gage0.service" }, { - "ID": 8461910, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", + "ID": 43552930, + "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_MenuSetting", "ServiceContainerName": "gage0.service" }, { - "ID": 46529701, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", + "ID": 3969229, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_MenuProfile", "ServiceContainerName": "gage0.service" }, { - "ID": 23403840, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", + "ID": 66283545, + "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_MenuMotion", "ServiceContainerName": "gage0.service" }, { - "ID": 21774588, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", + "ID": 31616714, + "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaThick", "ServiceContainerName": "gage0.service" }, { - "ID": 26794676, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", + "ID": 31406639, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_DynAreaProfile", "ServiceContainerName": "gage0.service" }, { - "ID": 41650091, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", + "ID": 27935207, + "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaFilmWidth", "ServiceContainerName": "gage0.service" }, { - "ID": 52059282, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph", + "ID": 64726287, + "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaSample", "ServiceContainerName": "gage0.service" }, { - "ID": 32000920, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraphCircular", + "ID": 48687165, + "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaBlowing", "ServiceContainerName": "gage0.service" }, { - "ID": 28792051, - "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph", + "ID": 21215025, + "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaIO", "ServiceContainerName": "gage0.service" }, { - "ID": 44866487, - "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_MenuSetting", + "ID": 20387170, + "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_DynAreaAirRing", "ServiceContainerName": "gage0.service" }, { - "ID": 43552930, - "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_MenuSetting", + "ID": 48662582, + "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_GraphAirRing", "ServiceContainerName": "gage0.service" }, { - "ID": 3969229, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_MenuProfile", + "ID": 8461910, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", "ServiceContainerName": "gage0.service" }, { - "ID": 66283545, - "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_MenuMotion", + "ID": 46529701, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", "ServiceContainerName": "gage0.service" }, { - "ID": 31616714, - "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaThick", + "ID": 23403840, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", "ServiceContainerName": "gage0.service" }, { - "ID": 31406639, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_DynAreaProfile", + "ID": 21774588, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", "ServiceContainerName": "gage0.service" }, { - "ID": 27935207, - "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaFilmWidth", + "ID": 26794676, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", "ServiceContainerName": "gage0.service" }, { - "ID": 64726287, - "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaSample", + "ID": 41650091, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", "ServiceContainerName": "gage0.service" }, { - "ID": 48687165, - "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaBlowing", + "ID": 19728236, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2", "ServiceContainerName": "gage0.service" }, { - "ID": 21215025, - "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaIO", + "ID": 32000920, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraphCircular", "ServiceContainerName": "gage0.service" }, { - "ID": 20387170, - "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_DynAreaAirRing", + "ID": 28792051, + "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph", "ServiceContainerName": "gage0.service" } ] diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json" index 8007890ab78b8fa3f39a250b3217095240a4d4e6..e354bbee566225677a54c5e8fbe76269249f44f4 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json" @@ -1 +1,67 @@ -{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":8461910},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":46529701},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-15,"IsPercent":true,"IsAutoTarget":true,"ID":23403840},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-10,"IsPercent":true,"IsAutoTarget":true,"ID":21774588},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":26794676},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":41650091}]} \ No newline at end of file +{ + "Items": [ + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -5, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 8461910 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 2, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 46529701 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -15, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 23403840 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -10, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 21774588 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -5, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 26794676 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 41650091 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 2, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 19728236 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraphcircular.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraphcircular.json" index 7c9f9ce7a9bd8c1b2d63bde27ec22b9cf5a38a45..dc1288b6f94b2b60c8afa899682b64be8b810815 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraphcircular.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraphcircular.json" @@ -1 +1,17 @@ -{"Items":[{"Mix":1,"Number":0,"YRangePercent":3.0,"IsPercent":true,"IsAutoTarget":true,"HasAlianZone":false,"AlianZoneBoltNoOf3oClock":1.0,"AlianZoneBoltCnt":8,"AlianZoneIsCCW":false,"AlianZoneIsShowXStep":false,"ID":32000920}]} \ No newline at end of file +{ + "Items": [ + { + "Mix": 1, + "Number": 0, + "YRangePercent": 3.0, + "IsPercent": true, + "IsAutoTarget": true, + "HasAlianZone": false, + "AlianZoneBoltNoOf3oClock": 1.0, + "AlianZoneBoltCnt": 8, + "AlianZoneIsCCW": false, + "AlianZoneIsShowXStep": false, + "ID": 32000920 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json" index aa25829130ab1a40bdc010af69500ace368cd80a..ebf64e45da50bb2da20cdab18ff653ab19d1863f 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json" @@ -1 +1,10 @@ -{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":0,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":true,"IsPercent":true,"ID":48220637},{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":true,"IsPercent":true,"ID":37445257}]} \ No newline at end of file +{ + "Items": [ + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 19728236 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/fixgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/fixgraph.json" index cee31444a616753672e528250d3a97916deb2884..ea9f8d9cb827a74e48f4757df4ab0f909aae300d 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/fixgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/fixgraph.json" @@ -1 +1,15 @@ -{"Items":[{"Len":500,"Interval":1000,"Mix":1,"IsAutoTarget":true,"IsADMode":false,"IsAutoY":false,"YTarget":0.0,"YRange":10.0,"ID":28792051}]} \ No newline at end of file +{ + "Items": [ + { + "Len": 500, + "Interval": 1000, + "Mix": 1, + "IsAutoTarget": true, + "IsADMode": false, + "IsAutoY": false, + "YTarget": 0.0, + "YRange": 10.0, + "ID": 28792051 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/flowgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/flowgraph.json" new file mode 100644 index 0000000000000000000000000000000000000000..9878a10011bf09a9288592ab98383adb96e4979a --- /dev/null +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/flowgraph.json" @@ -0,0 +1 @@ +{"Interval":6,"IsYRangeAuto":false,"IsYRangePercent":true,"YRangePercent":0.15,"YRange":20} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/graphcustom.json" index 1409521c015843ef597bcf4efda02dbc58e514fe..803d7512ffbaad53b29d59adc0a540ee31cecc49 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/graphcustom.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/graphcustom.json" @@ -82,14 +82,13 @@ { "Graphs": [ { - "ID": 52059282, + "ID": 19728236, "Rect": "0, 0, 1, 1" } ], "ColumnCount": 1, - "RowCount": 2, + "RowCount": 1, "RowDefinitions": [ - false, false ], "ColumnDefinitions": [ @@ -135,108 +134,108 @@ ], "Components": [ { - "ID": 48662582, - "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_GraphAirRing", + "ID": 44866487, + "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_MenuSetting", "ServiceContainerName": "gage0.service" }, { - "ID": 8461910, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", + "ID": 43552930, + "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_MenuSetting", "ServiceContainerName": "gage0.service" }, { - "ID": 46529701, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", + "ID": 3969229, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_MenuProfile", "ServiceContainerName": "gage0.service" }, { - "ID": 23403840, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", + "ID": 66283545, + "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_MenuMotion", "ServiceContainerName": "gage0.service" }, { - "ID": 21774588, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", + "ID": 31616714, + "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaThick", "ServiceContainerName": "gage0.service" }, { - "ID": 26794676, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", + "ID": 31406639, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_DynAreaProfile", "ServiceContainerName": "gage0.service" }, { - "ID": 41650091, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", + "ID": 27935207, + "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaFilmWidth", "ServiceContainerName": "gage0.service" }, { - "ID": 52059282, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph", + "ID": 64726287, + "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaSample", "ServiceContainerName": "gage0.service" }, { - "ID": 32000920, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraphCircular", + "ID": 48687165, + "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaBlowing", "ServiceContainerName": "gage0.service" }, { - "ID": 28792051, - "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph", + "ID": 21215025, + "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaIO", "ServiceContainerName": "gage0.service" }, { - "ID": 44866487, - "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_MenuSetting", + "ID": 20387170, + "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_DynAreaAirRing", "ServiceContainerName": "gage0.service" }, { - "ID": 43552930, - "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_MenuSetting", + "ID": 48662582, + "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_GraphAirRing", "ServiceContainerName": "gage0.service" }, { - "ID": 3969229, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_MenuProfile", + "ID": 8461910, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", "ServiceContainerName": "gage0.service" }, { - "ID": 66283545, - "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_MenuMotion", + "ID": 46529701, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", "ServiceContainerName": "gage0.service" }, { - "ID": 31616714, - "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaThick", + "ID": 23403840, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", "ServiceContainerName": "gage0.service" }, { - "ID": 31406639, - "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_DynAreaProfile", + "ID": 21774588, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", "ServiceContainerName": "gage0.service" }, { - "ID": 27935207, - "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaFilmWidth", + "ID": 26794676, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph", "ServiceContainerName": "gage0.service" }, { - "ID": 64726287, - "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaSample", + "ID": 41650091, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2", "ServiceContainerName": "gage0.service" }, { - "ID": 48687165, - "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaBlowing", + "ID": 19728236, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2", "ServiceContainerName": "gage0.service" }, { - "ID": 21215025, - "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaIO", + "ID": 32000920, + "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraphCircular", "ServiceContainerName": "gage0.service" }, { - "ID": 20387170, - "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_DynAreaAirRing", + "ID": 28792051, + "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph", "ServiceContainerName": "gage0.service" } ] diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraph.json" index 8007890ab78b8fa3f39a250b3217095240a4d4e6..e354bbee566225677a54c5e8fbe76269249f44f4 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraph.json" @@ -1 +1,67 @@ -{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":8461910},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":46529701},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-15,"IsPercent":true,"IsAutoTarget":true,"ID":23403840},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-10,"IsPercent":true,"IsAutoTarget":true,"ID":21774588},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":26794676},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":41650091}]} \ No newline at end of file +{ + "Items": [ + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -5, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 8461910 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 2, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 46529701 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -15, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 23403840 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -10, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 21774588 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 1, + "Number": -5, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 26794676 + }, + { + "UiModule": "scangraph2", + "YRangePercent": 3.0, + "Mix": 1, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 41650091 + }, + { + "UiModule": "scangraph", + "YRangePercent": 3.0, + "Mix": 2, + "Number": 0, + "IsPercent": true, + "IsAutoTarget": true, + "ID": 19728236 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraphcircular.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraphcircular.json" index 7c9f9ce7a9bd8c1b2d63bde27ec22b9cf5a38a45..dc1288b6f94b2b60c8afa899682b64be8b810815 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraphcircular.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraphcircular.json" @@ -1 +1,17 @@ -{"Items":[{"Mix":1,"Number":0,"YRangePercent":3.0,"IsPercent":true,"IsAutoTarget":true,"HasAlianZone":false,"AlianZoneBoltNoOf3oClock":1.0,"AlianZoneBoltCnt":8,"AlianZoneIsCCW":false,"AlianZoneIsShowXStep":false,"ID":32000920}]} \ No newline at end of file +{ + "Items": [ + { + "Mix": 1, + "Number": 0, + "YRangePercent": 3.0, + "IsPercent": true, + "IsAutoTarget": true, + "HasAlianZone": false, + "AlianZoneBoltNoOf3oClock": 1.0, + "AlianZoneBoltCnt": 8, + "AlianZoneIsCCW": false, + "AlianZoneIsShowXStep": false, + "ID": 32000920 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/trendgraph.json" index aa25829130ab1a40bdc010af69500ace368cd80a..ebf64e45da50bb2da20cdab18ff653ab19d1863f 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/trendgraph.json" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/trendgraph.json" @@ -1 +1,10 @@ -{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":0,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":true,"IsPercent":true,"ID":48220637},{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":true,"IsPercent":true,"ID":37445257}]} \ No newline at end of file +{ + "Items": [ + { + "Interval": 1, + "YRangePercent": 3.0, + "Mix": 1, + "ID": 19728236 + } + ] +} \ No newline at end of file diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/unity/blowingScan.component.config" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/unity/blowingScan.component.config" index 0d6aab6e8eb9aaee3210645832a383b14178e178..6f37653ce7faeeb8179656431c684112a4f7fadd 100644 --- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/unity/blowingScan.component.config" +++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/unity/blowingScan.component.config" @@ -19,6 +19,7 @@ <register type="IUiModule2" mapTo="UiModule2_ScanGraph2" name="blowing_sg2" /> <register type="IUiModule2" mapTo="UiModule2_ScanGraphCircular" name="blowing_sgc" /> <register type="IUiModule2" mapTo="UiModule2_TrendGraph" name="blowing_tg" /> + <register type="IUiModule2" mapTo="UiModule2_TrendGraph2" name="blowing_tg2" /> </container> </unity> </configuration> \ No newline at end of file diff --git "a/\350\204\232\346\234\254/\345\222\214\347\276\216\346\211\253\346\217\217\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowingScan.component.config" "b/\350\204\232\346\234\254/\345\222\214\347\276\216\346\211\253\346\217\217\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowingScan.component.config" index 0d6aab6e8eb9aaee3210645832a383b14178e178..6f37653ce7faeeb8179656431c684112a4f7fadd 100644 --- "a/\350\204\232\346\234\254/\345\222\214\347\276\216\346\211\253\346\217\217\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowingScan.component.config" +++ "b/\350\204\232\346\234\254/\345\222\214\347\276\216\346\211\253\346\217\217\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowingScan.component.config" @@ -19,6 +19,7 @@ <register type="IUiModule2" mapTo="UiModule2_ScanGraph2" name="blowing_sg2" /> <register type="IUiModule2" mapTo="UiModule2_ScanGraphCircular" name="blowing_sgc" /> <register type="IUiModule2" mapTo="UiModule2_TrendGraph" name="blowing_tg" /> + <register type="IUiModule2" mapTo="UiModule2_TrendGraph2" name="blowing_tg2" /> </container> </unity> </configuration> \ No newline at end of file diff --git "a/\350\204\232\346\234\254/\345\222\214\347\276\216\350\277\275\350\276\271\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowing.component.config" "b/\350\204\232\346\234\254/\345\222\214\347\276\216\350\277\275\350\276\271\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowing.component.config" index 9fe9b207dc96dc085dfc457d85fdf1dda51f1e13..85fcbdb02d9264dc8cac590a18f2c8d893470e70 100644 --- "a/\350\204\232\346\234\254/\345\222\214\347\276\216\350\277\275\350\276\271\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowing.component.config" +++ "b/\350\204\232\346\234\254/\345\222\214\347\276\216\350\277\275\350\276\271\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowing.component.config" @@ -21,6 +21,7 @@ <register type="IUiModule2" mapTo="UiModule2_ScanGraph2" name="blowing_sg2" /> <register type="IUiModule2" mapTo="UiModule2_ScanGraphCircular" name="blowing_sgc" /> <register type="IUiModule2" mapTo="UiModule2_TrendGraph" name="blowing_tg" /> + <register type="IUiModule2" mapTo="UiModule2_TrendGraph2" name="blowing_tg2" /> </container> </unity> </configuration> \ No newline at end of file diff --git "a/\350\204\232\346\234\254/\347\211\210\346\234\254\346\217\217\350\277\260.md" "b/\350\204\232\346\234\254/\347\211\210\346\234\254\346\217\217\350\277\260.md" index 9ebb80e0d10fe9a82f02e9c39c788653bbed1f61..b5f01daed615d6ca3630854b1155524837a64ae4 100644 --- "a/\350\204\232\346\234\254/\347\211\210\346\234\254\346\217\217\350\277\260.md" +++ "b/\350\204\232\346\234\254/\347\211\210\346\234\254\346\217\217\350\277\260.md" @@ -1,3 +1,87 @@ + +# 和美安装包_v7.4.0-20220628 + +## 测厚仪æœåŠ¡å™¨ v7.1.0 +## 测厚仪客户端 v7.4.0 +1. æ·»åŠ è‡ªåŠ¨é£ŽçŽ¯å¢žé‡è°ƒèŠ‚ç•Œé¢æ·»åŠ sigma2, mix显示 +2. æ·»åŠ æ‰«æå›¾ï¼Œæ·»åŠ æ‰«æ结æŸæ—¶é—´ +3. 修改 布局的默认å‚æ•° + +## 扫æ测厚仪æœåŠ¡å™¨ v7.1.1 +## 扫æ测厚仪客户端 v7.4.0 +1. æ·»åŠ è‡ªåŠ¨é£ŽçŽ¯å¢žé‡è°ƒèŠ‚ç•Œé¢æ·»åŠ sigma2, mix显示 +2. æ·»åŠ æ‰«æå›¾ï¼Œæ·»åŠ æ‰«æ结æŸæ—¶é—´ + +## 自动风环 v7.4.0 +1. æ·»åŠ å¤šçº§çš„æŽ§åˆ¶çº¿, æ¯çº§éƒ½æœ‰å¯¹åº”çš„æ··åˆæ•°ï¼Œ 原则是 æ··åˆæ•°è¶Šå¤§ï¼ŒæŽ§åˆ¶çº¿å¯ä»¥è¶Šå° +2. 修改 自动对ä½æŸ¥æ‰¾èŒƒå›´å•ä½ä¸ºåˆ†åŒºï¼Œè‡ªåŠ¨å¯¹ä½ä¼šåœ¨æœ€åŽšç‚¹åšå†…æ ‡ï¼Œå†…æ ‡çš„é«˜åº¦ä¸ºæœ€å°åŠ çƒæžå·®ï¼Œå®½åº¦æœ€å°ä¸º3 +3. 修改 åªè¦ç›¸å…³æ€§å¤Ÿé«˜ï¼ŒåŠ çƒæžå·®å¤Ÿå¤§ï¼Œä»»ä½•æ—¶å€™éƒ½ä¼šè§¦å‘自动对ä½ã€‚ +4. æ·»åŠ åŽšåº¦%æ•°æ®æœ‰æ¨ªå‘平滑。默认为6个。 控制以横å‘平滑åŽçš„厚度% 计算应用 +5. 修改 那些大于控制线的ä½ç½®ï¼Œå®ƒé™„è¿‘å·¦å³2个,都会被执行计算,åªæ˜¯æ¯”例毕竟å°ã€‚ +6. æ·»åŠ å¯¹åº”è¿žç»6个分区以上都在å‡å€¼çš„æŸä¸€è¾¹çš„。 它ä¸é—´åŒºåŸŸ3ä¸ªåˆ†åŒºçš„ç›®æ ‡å€¼ä¸å†æ˜¯0%,而是å¦ä¸€ä¸ªæ–¹å‘çš„ 控制线 + + +## ç§°é‡ v7.0.2 +## 称é‡å•ç»„ v7.0.0 +## æ”¶å· v7.0.9 +## IBC v7.0.0 +## ä¸‹å¹ v7.0.9 +## å¹è†œæ•°æ®åº“æµè§ˆå™¨ v7.0.0 + +<br/> +<br/> +<br/> + +# 和美安装包_v7.1.1-20220614 + +## 测厚仪æœåŠ¡å™¨ v7.1.0 +## 测厚仪客户端 v7.1.0 +## 扫æ测厚仪æœåŠ¡å™¨ v7.1.1 +1. æ·»åŠ æ”¯æŒ modbus TCP server ä¾›HMI读å–测厚值 + +## 扫æ测厚仪客户端 v7.1.0 +## 自动风环 v7.0.1 +## ç§°é‡ v7.0.2 +## 称é‡å•ç»„ v7.0.0 +## æ”¶å· v7.0.9 +## IBC v7.0.0 +## ä¸‹å¹ v7.0.9 +## å¹è†œæ•°æ®åº“æµè§ˆå™¨ v7.0.0 + +<br/> +<br/> +<br/> + + +# 和美安装包_v7.1.0-20220611 + +## 测厚仪æœåŠ¡å™¨ v7.1.0 +1. ä¿®å¤ çºµå‘图 先混åˆå†é—´éš” + +## 测厚仪客户端 v7.1.0 +1. æ·»åŠ æ‰«æå›¾ï¼Œå¯¹æ¯”å›¾ï¼Œæ·»åŠ è‡ªåŠ¨æ¢å¤è®°å½•ç‚¹åŠŸèƒ½ã€‚ +2. æ·»åŠ çºµå‘图2, 点纵å‘图的æŸæŸä¸ªä½ç½®ï¼Œæ˜¾ç¤ºå¯¹åº”的扫æ图 + +## 扫æ测厚仪æœåŠ¡å™¨ v7.1.0 +1. ä¿®å¤ çºµå‘图 先混åˆå†é—´éš” + +## 扫æ测厚仪客户端 v7.1.0 +1. æ·»åŠ æ‰«æå›¾ï¼Œå¯¹æ¯”å›¾ï¼Œæ·»åŠ è‡ªåŠ¨æ¢å¤è®°å½•ç‚¹åŠŸèƒ½ã€‚ +2. æ·»åŠ çºµå‘图2, 点纵å‘图的æŸä¸ªä½ç½®ï¼Œæ˜¾ç¤ºå¯¹åº”的扫æ图 + + +## 自动风环 v7.0.1 +## ç§°é‡ v7.0.2 +## 称é‡å•ç»„ v7.0.0 +## æ”¶å· v7.0.9 +## IBC v7.0.0 +## ä¸‹å¹ v7.0.9 +## å¹è†œæ•°æ®åº“æµè§ˆå™¨ v7.0.0 + +<br/> +<br/> +<br/> + # 和美安装包_v7.0.9.2-20220608 ## 测厚仪æœåŠ¡å™¨ v7.0.9