소스 검색

增加界面显示双击放大,修复上传服务器数据没有扭力曲线图

KWD 5 달 전
부모
커밋
3bf75881bb

+ 1 - 0
TeamAAS-VM/App.xaml.cs

@@ -215,6 +215,7 @@ namespace TeamAAS_VP
             containerRegistry.RegisterDialog<ChangeNozzle>();
             containerRegistry.RegisterDialog<PlcPointOffserParams>();
             containerRegistry.RegisterDialog<PickScrewAccuracyAnalyzer>();
+            containerRegistry.RegisterDialog<ImagePreviewWindow>();
             //**************************************************************************************
 
             // 注册 SQLSugar 客户端(单例模式)

+ 24 - 4
TeamAAS-VM/Core/Management.cs

@@ -2216,7 +2216,7 @@ namespace TeamAAS_VP.Core
                                     code = plc.ReadNode<string>(string.Format(addressConfig.In_Code.Address, i));
                                 }
                                 productSn = code;
-                                           
+
 
                                 //询问mes
                                 if (state == 1)
@@ -2479,8 +2479,8 @@ namespace TeamAAS_VP.Core
                                         SendTaskMessage($"mes开始ADD", MessageLevel.Info);
                                         //上传mes
                                         //这里现在上传的结果都是锁付站的,如果存在其他附属站的数据需要上传时,将不适用,要根据实际情况进行调整
-                                        (bool isSuccess, string response) = await _mesService.SubmitGetAsync(ProductMainSN[i], "", dataToMes, resultIndex == 1 ? true : false, _LastMesCheckTime[i], serverTimeResult.Now);
-                                        //(bool isSuccess, string response) = await _mesService.SubmitGetExAsync(ProductMainSN[i], "", dataToMes, resultToMes, _LastMesCheckTime[i], serverTimeResult.Now);
+                                        //(bool isSuccess, string response) = await _mesService.SubmitGetAsync(ProductMainSN[i], "", dataToMes, resultIndex == 1 ? true : false, _LastMesCheckTime[i], serverTimeResult.Now);
+                                        (bool isSuccess, string response) = await _mesService.SubmitGetExAsync(ProductMainSN[i], "", dataToMes, resultToMes, _LastMesCheckTime[i], serverTimeResult.Now);
                                         if (isSuccess)
                                         {
                                             LogHelper.WriteLogMes($"上传mes成功");
@@ -2598,6 +2598,8 @@ namespace TeamAAS_VP.Core
                                                         DateTime dt = DateTime.Now;
                                                         string filename = $"{ProductMainSN[i]}_{dt.ToString("yyyyMMddHHmmss")}";
                                                         var device = _configService.GetDeviceInfo();
+                                                        var config = _configService.GetSystemConfiguration();
+
                                                         (bool isSuc, string resp) = await _mesService.SendFtpFileAsync(ProductMainSN[i], filename);
                                                         if (isSuc)
                                                         {
@@ -2606,12 +2608,30 @@ namespace TeamAAS_VP.Core
                                                             string filePath = $"D:\\image\\Recored\\{dt.ToString("yyyy-MM")}\\{dt.ToString("MM-dd")}\\{currentProduct.Name}\\{ProductMainSN[i]}";
                                                             //复制csv
                                                             string source_csv = $"{stationConfig.SaveCsvPath}\\{dt.ToString("yyyy-MM")}\\{i}_{stationConfig.DeviceName}_{dt.ToString("yyyy-MM-dd")}.csv";
-                                                            string target_csv = Path.Combine(filePath, Path.GetFileName(source_csv)); ;
+                                                            string target_csv = Path.Combine(filePath, Path.GetFileName(source_csv));
                                                             File.Copy(source_csv, target_csv, true);
                                                             //复制log
                                                             string source_log = $"..\\Log\\LogInfo\\{dt.ToString("yyyy-MM")}\\{dt.ToString("yyyy-MM-dd")}.txt";
                                                             string target_log = Path.Combine(filePath, Path.GetFileName(source_log));
                                                             File.Copy(source_log, target_log, true);
+
+                                                            string target_Directory = filePath + "\\扭力曲线\\";
+                                                            string source_Torque_Image = config.ScrewCurvePath + $"\\{dt.ToString("yyyy-MM")}\\{dt.ToString("yyyy-MM-dd")}\\{currentProduct.Name}\\{ProductMainSN[i]}";
+                                                            var col = Directory.GetFiles(source_Torque_Image);
+                                                            try
+                                                            {
+                                                                Directory.CreateDirectory(target_Directory);
+                                                                foreach (var item in col)
+                                                                {
+                                                                    string target_Torque = target_Directory + item.Replace(source_Torque_Image, "");
+                                                                    File.Copy(item, target_Torque, true);
+                                                                }
+                                                            }
+                                                            catch (Exception)
+                                                            {
+                                                                SendTaskMessage($"扭力曲线图读取失败", MessageLevel.Error);
+                                                            }                                                    
+
                                                             CompressionImage(filePath, filename, device.Station, device.FixtureId);
                                                         }
                                                         else

+ 8 - 0
TeamAAS-VM/TeamAAS-VP.csproj

@@ -574,6 +574,7 @@
     <Compile Include="Services\MesService.cs" />
     <Compile Include="Services\ShiftWatcherService.cs" />
     <Compile Include="ValueConverter\ImageFileNameFormatConverter.cs" />
+    <Compile Include="ViewModels\Home\ImagePreviewWindowViewModel.cs" />
     <Compile Include="ViewModels\Home\PickScrewAccuracyAnalyzerViewModel.cs" />
     <Compile Include="ViewModels\Product\PlcPointOffserParamsViewModel.cs" />
     <Compile Include="ViewModels\Statistics\HeadChangeRecordQueryViewModel.cs" />
@@ -997,6 +998,9 @@
     <Compile Include="Views\Home\TorqueCheck.xaml.cs">
       <DependentUpon>TorqueCheck.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\Home\ImagePreviewWindow.xaml.cs">
+      <DependentUpon>ImagePreviewWindow.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\ProductsView.xaml.cs">
       <DependentUpon>ProductsView.xaml</DependentUpon>
     </Compile>
@@ -1355,6 +1359,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Views\Home\ImagePreviewWindow.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Views\MainWindowView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>

+ 117 - 0
TeamAAS-VM/ViewModels/Home/ImagePreviewWindowViewModel.cs

@@ -0,0 +1,117 @@
+using Cognex.VisionPro;
+using Cognex.VisionPro.MultiLineFinder.Implementation.Internal;
+using Prism.Commands;
+using Prism.Events;
+using Prism.Ioc;
+using Prism.Mvvm;
+using Prism.Regions;
+using Prism.Services.Dialogs;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TeamAAS_VP.Core;
+using TeamAAS_VP.Models;
+using TeamAAS_VP.Models.Calibration;
+using TeamAAS_VP.Resources.Languages;
+using TeamAAS_VP.ViewModels.Calibration;
+
+namespace TeamAAS_VP.ViewModels.Home
+{
+    public class ImagePreviewWindowViewModel : BindableBase, IDialogAware
+    {
+        #region 字段
+        IRegionManager _regionManager;
+        public IEventAggregator _eventAggregator;
+        IContainerProvider _container;
+        IDialogService _dialogService;
+        #endregion
+
+        #region 属性
+
+        private Management _management;
+
+        public Management management
+        {
+            get { return _management; }
+            set { SetProperty(ref _management, value); }
+        }
+
+        #endregion
+
+        #region 命令
+        public Prism.Commands.DelegateCommand LoadedCommand { get; set; }
+        #endregion
+
+        public ImagePreviewWindowViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService)
+        {
+            _regionManager = regionManager;
+            _eventAggregator = ea;
+            _container = container;
+            _dialogService = dialogService;
+            management = _container.Resolve<Management>();
+            LoadedCommand = new Prism.Commands.DelegateCommand(OnLoad);
+        }
+
+
+
+        private CogRecordDisplay _CogDisp;
+
+        public CogRecordDisplay CogDisp
+        {
+            get { return _CogDisp; }
+            set { SetProperty(ref _CogDisp, value); }
+        }
+
+        private Cognex.VisionPro.ICogImage _Image;
+
+        public Cognex.VisionPro.ICogImage Image
+        {
+            get { return _Image; }
+            set { SetProperty(ref _Image, value); }
+        }
+
+        private Cognex.VisionPro.CogGraphicCollection _Graphic;
+
+        public Cognex.VisionPro.CogGraphicCollection Graphic
+        {
+            get { return _Graphic; }
+            set { SetProperty(ref _Graphic, value); }
+        }
+
+        private Cognex.VisionPro.ICogRecord _Record;
+
+        public Cognex.VisionPro.ICogRecord Record
+        {
+            get { return _Record; }
+            set { SetProperty(ref _Record, value); }
+        }
+
+        public string Title { get; set; }
+
+        public event Action<IDialogResult> RequestClose;
+
+        private void OnLoad()
+        {
+            Image = CogDisp.Image;
+            Record = CogDisp.Record;
+        }
+
+        public bool CanCloseDialog()
+        {
+            return true;
+        }
+
+        public void OnDialogClosed()
+        {
+
+        }
+
+        public void OnDialogOpened(IDialogParameters parameters)
+        {
+            CogDisp = parameters.GetValue<CogRecordDisplay>("Cog");
+        }
+
+    }
+}

+ 22 - 3
TeamAAS-VM/ViewModels/Home/ShowVisionRenderViewModel.cs

@@ -1,4 +1,5 @@
-using Prism.Commands;
+using Cognex.VisionPro;
+using Prism.Commands;
 using Prism.Events;
 using Prism.Ioc;
 using Prism.Mvvm;
@@ -9,7 +10,9 @@ using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Linq;
 using TeamAAS_VP.Core;
+using TeamAAS_VP.Events;
 using TeamAAS_VP.Models;
+using TeamAAS_VP.Resources.Languages;
 
 namespace TeamAAS_VP.ViewModels.Home
 {
@@ -31,7 +34,7 @@ namespace TeamAAS_VP.ViewModels.Home
         public ObservableCollection<ShowRender> Renders
         {
             get { return _Renders; }
-            set { SetProperty(ref _Renders,value); UpDateRenderLayout(); }
+            set { SetProperty(ref _Renders, value); UpDateRenderLayout(); }
         }
 
         private Management _management;
@@ -59,7 +62,7 @@ namespace TeamAAS_VP.ViewModels.Home
             _container = container;
             _dialogService = dialogService;
             management = _container.Resolve<Management>();
-            Renders= management.Renders;
+            Renders = management.Renders;
             LoadedCommand = new DelegateCommand(OnLoad);
         }
 
@@ -70,6 +73,22 @@ namespace TeamAAS_VP.ViewModels.Home
             UpdateLayout?.Invoke(_Renders);
         }
 
+        public void ShowImage(CogRecordDisplay cogDisp)
+        {
+            IDialogParameters parameters = new DialogParameters();
+            parameters.Add("Cog", cogDisp);
+            _dialogService.ShowDialog("ImagePreviewWindow", parameters, rst =>
+            {
+                //对话框关闭之后的回调函数,可以在这解析结果。
+                //ButtonResult result1 = rst.Result;
+
+                //if (result1 == ButtonResult.OK)
+                //{
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.完成, Duration = 1 });
+                //}
+            });
+        }
+
         private void OnLoad()
         {
             //UpDateRenderLayout();

+ 69 - 17
TeamAAS-VM/ViewModels/HomeViewModel.cs

@@ -425,8 +425,13 @@ namespace TeamAAS_VP.ViewModels
         /// </summary>
         private void InitLockCurvePlotModel()
         {
-            var model = new PlotModel { Title = Lang.锁付曲线, TitleFontSize = 16};
-            // 设置图例
+            var model = new PlotModel
+            {
+                Title = Lang.锁付曲线,
+                TitleFontSize = 16
+            };
+
+            // 图例
             var legend = new Legend
             {
                 LegendPosition = LegendPosition.TopRight,
@@ -435,10 +440,11 @@ namespace TeamAAS_VP.ViewModels
                 LegendBorderThickness = 0
             };
             model.Legends.Add(legend);
-            // 设置X轴
+
+            // X轴(圈数)
             var xAxis = new LinearAxis
             {
-                Key="X",
+                Key = "X",
                 Position = AxisPosition.Bottom,
                 Title = Lang.锁付圈数,
                 Minimum = 0,
@@ -446,7 +452,8 @@ namespace TeamAAS_VP.ViewModels
                 MinorGridlineStyle = LineStyle.Dot
             };
             model.Axes.Add(xAxis);
-            // 设置Y轴
+
+            // Y轴(力矩)
             var yAxis = new LinearAxis
             {
                 Key = "Y",
@@ -456,16 +463,39 @@ namespace TeamAAS_VP.ViewModels
                 MinorGridlineStyle = LineStyle.Dot
             };
             model.Axes.Add(yAxis);
-            // 添加示例数据系列
-            var series = new LineSeries
+
+            // 实际锁付曲线
+            var torqueSeries = new LineSeries
             {
                 Title = Lang.锁付力矩曲线,
                 StrokeThickness = 2,
                 MarkerSize = 3,
                 MarkerType = MarkerType.Circle,
                 CanTrackerInterpolatePoints = false,
+                Color = OxyColors.Blue
             };
-            model.Series.Add(series);
+            model.Series.Add(torqueSeries);
+
+            // 上限线
+            var upperLimitSeries = new LineSeries
+            {
+                Title = "Torque Upper Limit",
+                StrokeThickness = 2,
+                LineStyle = LineStyle.Dash,
+                Color = OxyColors.Red
+            };
+            model.Series.Add(upperLimitSeries);
+
+            // 下限线
+            var lowerLimitSeries = new LineSeries
+            {
+                Title = "Torque Lower Limit",
+                StrokeThickness = 2,
+                LineStyle = LineStyle.Dash,
+                Color = OxyColors.Green
+            };
+            model.Series.Add(lowerLimitSeries);
+
             LockCurvePlotModel = model;
         }
 
@@ -473,7 +503,6 @@ namespace TeamAAS_VP.ViewModels
         /// 螺丝锁付完成时调用
         /// </summary>
         /// <param name="result"></param>
-        /// <exception cref="NotImplementedException"></exception>
         private void OnLockFinish(LockResult result)
         {
             //如果当前螺丝编号为1,则清除之前的结果
@@ -481,24 +510,48 @@ namespace TeamAAS_VP.ViewModels
             {
                 LockResults.Clear();
             }
+
             LockResults.Add(result);
 
-            //更新曲线图
-            App.Current.Dispatcher.BeginInvoke(new Action(() => {
+            App.Current.Dispatcher.BeginInvoke(new Action(() =>
+            {
                 try
                 {
-                    var series = LockCurvePlotModel.Series[0] as LineSeries;
-                    series.Points.Clear();
+                    //获取三条曲线
+                    var torqueSeries = LockCurvePlotModel.Series[0] as LineSeries;   //实际扭矩
+                    var upperSeries = LockCurvePlotModel.Series[1] as LineSeries;    //上限
+                    var lowerSeries = LockCurvePlotModel.Series[2] as LineSeries;    //下限
+
+                    torqueSeries.Points.Clear();
+                    upperSeries.Points.Clear();
+                    lowerSeries.Points.Clear();
+
+                    //上下限值(根据你的工艺设置)
+                    double upperLimit = result.TargetTorqueUpperLimit;  //上限扭矩
+                    double lowerLimit = result.TargetTorqueLowerLimit;  //下限扭矩
+
                     foreach (var waveData in result.WaveDatas)
                     {
-                        series.Points.Add(new OxyPlot.DataPoint(waveData.Turns, waveData.Torque));
+                        //实际曲线
+                        torqueSeries.Points.Add(new OxyPlot.DataPoint(waveData.Turns, waveData.Torque));
+                        //上限曲线(固定扭矩)
+                        upperSeries.Points.Add(new OxyPlot.DataPoint(waveData.Turns, upperLimit));
+                        //下限曲线
+                        lowerSeries.Points.Add(new OxyPlot.DataPoint(waveData.Turns, lowerLimit));
                     }
-                    // 重置所有轴的范围以适应新数据
+
+                    //刷新
                     LockCurvePlotModel.ResetAllAxes();
                     LockCurvePlotModel.InvalidatePlot(true);
+
+                    //保存图片
                     if (!string.IsNullOrEmpty(result.LockCurveImagePath))
                     {
-                        PngExporter.Export(LockCurvePlotModel, result.LockCurveImagePath, (int)LockCurvePlotModel.Width, (int)LockCurvePlotModel.Height);
+                        PngExporter.Export(
+                            LockCurvePlotModel,
+                            result.LockCurveImagePath,
+                            (int)LockCurvePlotModel.Width,
+                            (int)LockCurvePlotModel.Height);
                     }
                 }
                 catch (Exception ex)
@@ -506,7 +559,6 @@ namespace TeamAAS_VP.ViewModels
                     LogHelper.WriteLogError("更新曲线图和保存曲线图时出错!", ex);
                 }
             }));
-
         }
 
         /// <summary>

+ 53 - 0
TeamAAS-VM/Views/Home/ImagePreviewWindow.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="TeamAAS_VP.Views.Home.ImagePreviewWindow"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:prism="http://prismlibrary.com/"
+             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+             xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
+             xmlns:wf="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
+             xmlns:vp="clr-namespace:Cognex.VisionPro;assembly=Cognex.VisionPro.Controls"
+             xmlns:lex="http://wpflocalizeextension.codeplex.com"
+             lex:LocalizeDictionary.DesignCulture="zh-CN"
+             Height="800"
+             Width="1000"
+             lex:ResxLocalizationProvider.DefaultAssembly="TeamAAS-VP"
+             lex:ResxLocalizationProvider.DefaultDictionary="Lang"
+             prism:ViewModelLocator.AutoWireViewModel="True"
+             FontFamily="{DynamicResource DefaultFont}">
+    <b:Interaction.Triggers>
+        <b:EventTrigger EventName="Loaded">
+            <b:InvokeCommandAction Command="{Binding LoadedCommand}" />
+        </b:EventTrigger>
+    </b:Interaction.Triggers>
+
+    <prism:Dialog.WindowStyle>
+        <Style TargetType="Window">
+            <Setter Property="prism:Dialog.WindowStartupLocation"
+                Value="CenterScreen" />
+            <Setter Property="WindowStyle"
+                Value="SingleBorderWindow" />
+            <Setter Property="ResizeMode"
+                Value="NoResize" />
+            <Setter Property="SizeToContent"
+                Value="Manual" />
+            <Setter Property="AllowDrop"
+                Value="True" />
+            <Setter Property="BorderThickness"
+                Value="0" />
+            <Setter Property="ShowInTaskbar"
+                Value="True" />
+            <Setter Property="SizeToContent"
+                Value="WidthAndHeight" />
+            <Setter Property="WindowState"
+                Value="Normal" />
+            <Setter Property="Topmost"
+                Value="True" />
+        </Style>
+    </prism:Dialog.WindowStyle>
+
+    <Grid x:Name="gridRender">
+        <wf:WindowsFormsHost>
+            <vp:CogRecordDisplay x:Name="display"/>
+        </wf:WindowsFormsHost>
+    </Grid>
+</UserControl>

+ 52 - 0
TeamAAS-VM/Views/Home/ImagePreviewWindow.xaml.cs

@@ -0,0 +1,52 @@
+using Opc.Ua;
+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.Navigation;
+using System.Windows.Shapes;
+using TeamAAS_VP.ViewModels.Home;
+
+namespace TeamAAS_VP.Views.Home
+{
+    /// <summary>
+    /// ImagePreviewWindow.xaml 的交互逻辑
+    /// </summary>
+    public partial class ImagePreviewWindow : UserControl
+    {
+        private ImagePreviewWindowViewModel viewModel;
+        public ImagePreviewWindow()
+        {
+            InitializeComponent();
+            viewModel = this.DataContext as ImagePreviewWindowViewModel;
+            viewModel.PropertyChanged += ViewModel_PropertyChanged;
+            display.HorizontalScrollBar = false;
+            display.VerticalScrollBar = false;
+            display.AutoFit = true;
+            display.AutoFitWithGraphics = true;
+            display.BackColor = System.Drawing.SystemColors.ActiveCaption;
+        }
+
+        private void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+        {
+            
+            if (e.PropertyName == "Image")
+            {
+                this.display.Image = viewModel.Image;
+            }
+            if (e.PropertyName == "Record")
+            {
+                this.display.Record = viewModel.Record;
+            }
+
+        }
+    }
+}

+ 12 - 14
TeamAAS-VM/Views/Home/ShowVisionRender.xaml.cs

@@ -175,17 +175,17 @@ namespace TeamAAS_VP.Views.Home
                     {
                         ConfigureCogDisplay(disp); // 句柄创建后再配置,最稳
                         // 绑定 WinForms 双击事件
-                        //disp.MouseDoubleClick += (r, w) =>
-                        //{
-                        //    try
-                        //    {
-                        //        OnDisplayDoubleClick(disp);
-                        //    }
-                        //    catch (Exception ex)
-                        //    {
-                        //        LogHelper.WriteLogError("双击预览弹窗出错", ex);
-                        //    }
-                        //};
+                        disp.DoubleClick += (r, w) =>
+                        {
+                            try
+                            {
+                                OnDisplayDoubleClick(disp);
+                            }
+                            catch (Exception ex)
+                            {
+                                LogHelper.WriteLogError("双击预览弹窗出错", ex);
+                            }
+                        };
                     }
                     catch (Exception ex)
                     {
@@ -705,9 +705,7 @@ namespace TeamAAS_VP.Views.Home
                     // 回到 WPF UI 线程弹窗
                     this.Dispatcher.BeginInvoke(new Action(() =>
                     {
-                        //var win = new ImagePreviewWindow(bmp, $"预览:{disp.Tag ?? "Display"}");
-                        //win.Owner = Window.GetWindow(this); // 让弹窗归属当前窗口
-                        //win.Show();
+                        viewModel.ShowImage(disp);
                     }));
                 }
                 catch (Exception ex)