From 0940f31b7eba1cf6b6a8c1fca72d97cf686e79f2 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期五, 04 七月 2025 10:43:00 +0800
Subject: [PATCH] 优化插件,完善TreeListView

---
 Plugin.TsExecution/TsExecution.xaml.cs |  425 ++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 343 insertions(+), 82 deletions(-)

diff --git a/Plugin.TsExecution/TsExecution.xaml.cs b/Plugin.TsExecution/TsExecution.xaml.cs
index 846c349..89c3ac3 100644
--- a/Plugin.TsExecution/TsExecution.xaml.cs
+++ b/Plugin.TsExecution/TsExecution.xaml.cs
@@ -3,7 +3,6 @@
 using HMI.Core.Entity;
 using HMI.Core.Manager;
 using HMI.Core.Util;
-using HMI.ParameterManage;
 using HMI.UI;
 using HMI.UI.Util;
 using HMI.Util;
@@ -23,7 +22,6 @@
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Forms.DataVisualization.Charting;
-using System.Windows.Markup;
 
 namespace Plugin.TsExecution
 {
@@ -32,7 +30,6 @@
     /// </summary>
     public partial class TsExecution : PluginControl
     {
-        //private OpcInterface.OpcInterface OpcHandle = new OpcInterface.OpcInterface();
         #region TestStand浜嬩欢
         /// <summary>
         /// TS 寮曟搸
@@ -70,6 +67,15 @@
                 SampleTest(value);
             }
         }
+
+        private string _currentUserCode;
+
+        public string CurrentUserCode
+        {
+            get { return _currentUserCode; }
+            set { Set(ref _currentUserCode, value); }
+        }
+
 
         private bool isLoadOK = false;
         private Timer GCTimer;
@@ -130,8 +136,10 @@
             get => _enableMes;
             set
             {
-                Set(ref _enableMes, value);
-                WriteConfig("EnableMes", value);
+                if (WriteConfig("EnableMes", value))
+                {
+                    Set(ref _enableMes, value);
+                }
             }
         }
 
@@ -141,8 +149,10 @@
             get => _enableCanLog;
             set
             {
-                Set(ref _enableCanLog, value);
-                WriteConfig("EnableCanLog", value);
+                if (WriteConfig("EnableCanLog", value))
+                {
+                    Set(ref _enableCanLog, value);
+                }
             }
         }
 
@@ -152,11 +162,53 @@
             get => _enableDebugMode;
             set
             {
-                Set(ref _enableDebugMode, value);
-                WriteConfig("EnableDebugMode", value);
+                if (WriteConfig("EnableDebugMode", value))
+                {
+                    Set(ref _enableDebugMode, value);
+                }
             }
         }
 
+        private bool _enableNGPause;
+        public bool EnableNGPause
+        {
+            get => _enableNGPause;
+            set
+            {
+                if (WriteConfig("EnableNGPause", value))
+                {
+                    Set(ref _enableNGPause, value);
+                }
+            }
+        }
+
+        private bool _enableSimpleMode;
+        public bool EnableSimpleMode
+        {
+            get => _enableSimpleMode;
+            set
+            {
+                if (WriteConfig("EnableSimpleMode", value))
+                {
+                    Set(ref _enableSimpleMode, value);
+                    foreach (var cell in tsSockets) cell.SetSimpleUI(value);
+                }
+            }
+        }
+
+        private bool _ui_showInfoDock;
+        public bool UI_ShowInfoDock
+        {
+            get => _ui_showInfoDock;
+            set
+            {
+                if (WriteConfig("UI_ShowInfoDock", value))
+                {
+                    Set(ref _ui_showInfoDock, value);
+                    detailPanel.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
+                }
+            }
+        }
 
         public TsExecution()
         {
@@ -195,16 +247,16 @@
             var legend = pieChart.Plot.ShowLegend(Alignment.UpperRight);
             legend.Alignment = Alignment.UpperRight;
             legend.Padding = new PixelPadding(0);
-            legend.FontSize = (float)CustomFontSizeConverter.CountFontSize(20, 300, 300);
+            legend.FontSize = (float)WidthSizeConverter.CountFontSize(20, 300, 300);
             pieChart.UserInputProcessor.Disable();
             pieChart.Plot.Font.Automatic();
 
             List<PieSlice> slices = new List<PieSlice> {
     new PieSlice() { Value = 5, FillColor = Colors.Green,
-        LabelFontSize = (float)CustomFontSizeConverter.CountFontSize(20,300,300),
+        LabelFontSize = (float)WidthSizeConverter.CountFontSize(20,300,300),
         Label = "Pass",LegendText="Pass" },
     new PieSlice() { Value = 2, FillColor = Colors.Red,
-        LabelFontSize = (float)CustomFontSizeConverter.CountFontSize(20,300,300),
+        LabelFontSize = (float)WidthSizeConverter.CountFontSize(20,300,300),
         Label = "Fail",LegendText="Fail" } };
 
 
@@ -223,10 +275,38 @@
                 {
                     this.socketNum = Convert.ToInt32(tmpNum);
                 }
+                string lastModel = engine?.Globals.GetValString("StationState.ProductModel", 1);
+
+                if (!string.IsNullOrEmpty(lastModel))
+                {
+                    var product = Products.FirstOrDefault(p => p.Name == lastModel);
+                    if (product != null)
+                    {
+                        SelectedProduct = product;
+                        RefershUI();
+                        return;
+                    }
+                }
                 SelectedProduct = Products[0];
                 RefershUI();
             }
             SampleStatus = false;
+        }
+
+        private bool _isTesting = false;
+        public bool IsTesting
+        {
+            get { return _isTesting; }
+            set
+            {
+                Set(ref _isTesting, value);
+                Dispatcher.Invoke(() =>
+                {
+                    BtnStartSeq.IsEnabled = !value;
+                    BtnStopSeq.IsEnabled = value;
+                    CbProduct.IsEnabled = !value;
+                });
+            }
         }
 
         /// <summary>
@@ -250,39 +330,64 @@
             new MaskWindow((WindowX)Window.GetWindow(this),
                 (win) =>
                 {
+                    try
+                    {
+                        Dispatcher.Invoke(() =>
+                        {
+                            try
+                            {
+                                UserInfo user = UserInfo.User;
+                                CurrentUserCode = user?.Code;
+                            }
+                            catch (Exception ex)
+                            {
+                                log.Warn("Get Login User Failed.", ex);
+                            }
+                            ReadConfig();
+                        });
+                        isLoadOK = true;
+                        StartSequence();
+                    }
+                    catch (Exception ex)
+                    {
+                        log.Error("TsExecution Loaded Failed.", ex);
+                        MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
+                    }
+
+                    try
+                    {
+                        if (Environment.Version.ToString() != this.AxApplicationMgr.GetEngine().DotNetCLRVersion)
+                            this.GCTimer.Enabled = true;
+                    }
+                    catch (Exception ex)
+                    {
+                        log.Error("TsExecution GCTimer Start Failed", ex);
+                        MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.LoadFailed")}: {ex.Message}");
+                    }
+
                     Dispatcher.Invoke(() =>
                     {
-                        try
-                        {
-                            ReadConfig();
-                            //杩炴帴OPChandle
-                            //this.OpcHandle.Connect2("127.0.0.1", 6543, 18081, out string ErrMsg, null);
-                            //鍚姩娴嬭瘯杩涚▼
-                            StartSequence();
-                            isLoadOK = true;
-                        }
-                        catch (Exception ex)
-                        {
-                            log.Error("TsExecution Loaded Failed.", ex);
-                            MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
-                        }
-
-                        try
-                        {
-                            if (Environment.Version.ToString() != this.AxApplicationMgr.GetEngine().DotNetCLRVersion)
-                                this.GCTimer.Enabled = true;
-                        }
-                        catch (Exception ex)
-                        {
-                            log.Error("TsExecution GCTimer Start Failed", ex);
-                            MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.LoadFailed")}: {ex.Message}");
-                        }
-                        finally
-                        {
-                            win.Close();
-                        }
                         if (isLoadOK) Loaded -= PluginControl_Loaded;
                     });
+
+                    //Dispatcher.Invoke(() =>
+                    //{
+                    //    try
+                    //    {
+                    //        ReadConfig();
+                    //        //杩炴帴OPChandle
+                    //        //this.OpcHandle.Connect2("127.0.0.1", 6543, 18081, out string ErrMsg, null);
+                    //        isLoadOK = true;
+                    //        //鍚姩娴嬭瘯杩涚▼
+                    //        StartSequence();
+                    //    }
+                    //    catch (Exception ex)
+                    //    {
+                    //        log.Error("TsExecution Loaded Failed.", ex);
+                    //        MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
+                    //    }
+
+                    //});
                 }
                 ).Info(LangUtil.Get("App.UsercontrolIsLoading"));
         }
@@ -352,6 +457,8 @@
             fail = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Fail", "0", CountIniPath));
         }
 
+        private string csvDir;
+
         /// <summary>
         /// 璇诲彇閰嶇疆鏂囦欢閲岀殑鍑犱釜灞炴��
         /// </summary>
@@ -359,24 +466,129 @@
         /// <param name="fail"></param>
         private void ReadConfig()
         {
+            ParameterData value;
             try
             {
-                var p = ParameterManager.GetCommonParameterByName("EnableMes");
-                EnableMes = bool.Parse(p?.Value);
+                value = ParameterManager.GetCommonParameterByName("EnableMes");
+                _enableMes = bool.Parse(value.Value);
+                Set("EnableMes");
             }
             catch
             {
-                EnableMes = false;
+                _enableMes = false;
+                Set("EnableMes");
             }
+
+            try
+            {
+                value = ParameterManager.GetCommonParameterByName("EnableNGPause");
+                _enableNGPause = bool.Parse(value.Value);
+                Set("EnableNGPause");
+            }
+            catch
+            {
+                _enableNGPause = false;
+                Set("EnableNGPause");
+            }
+
+            try
+            {
+                value = ParameterManager.GetCommonParameterByName("EnableCanLog");
+                _enableCanLog = bool.Parse(value.Value);
+                Set("EnableCanLog");
+            }
+            catch
+            {
+                _enableCanLog = false;
+                Set("EnableCanLog");
+            }
+
+            try
+            {
+                value = ParameterManager.GetCommonParameterByName("EnableDebugMode");
+                _enableDebugMode = bool.Parse(value.Value);
+                Set("EnableDebugMode");
+            }
+            catch
+            {
+                _enableDebugMode = false;
+                Set("EnableDebugMode");
+            }
+
+            try
+            {
+                value = ParameterManager.GetCommonParameterByName("EnableSimpleMode");
+                EnableSimpleMode = bool.Parse(value.Value);
+            }
+            catch
+            {
+                EnableSimpleMode = false;
+            }
+
+            try
+            {
+                value = ParameterManager.GetCommonParameterByName("UI_ShowInfoDock");
+                UI_ShowInfoDock = bool.Parse(value.Value);
+            }
+            catch
+            {
+                UI_ShowInfoDock = false;
+            }
+
+            try
+            {
+
+                value = ParameterManager.GetCommonParameterByName("TestReportFolder");
+                csvDir = value.Value;
+                if (!Directory.Exists(csvDir))
+                {
+                    Directory.CreateDirectory(csvDir);
+                }
+            }
+            catch
+            {
+                csvDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestReport");
+            }
+
             //Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableMes", "true", CountIniPath));
-            EnableCanLog = Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableCanLog", "true", CountIniPath));
-            EnableDebugMode = Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableDebugMode", "true", CountIniPath));
+            //EnableCanLog = Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableCanLog", "true", CountIniPath));
+            //EnableDebugMode = Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableDebugMode", "true", CountIniPath));
         }
 
-        private void WriteConfig(string name, bool value)
+        //private void WriteToTsWhenInit()
+        //{
+        //    foreach (var ts in tsSockets)
+        //    {
+        //        ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableMes", 1, EnableMes);
+        //        ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableNGPause", 1, EnableNGPause);
+        //        ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableCanLog", 1, EnableCanLog);
+        //        ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableDebugMode", 1, EnableDebugMode);
+        //    }
+        //}
+
+        private bool WriteConfig(string name, bool value)
         {
-            IniFileHelper.WriteIniData("Config", name, value.ToString(), CountIniPath);
-            //this.engine.Globals.SetValBoolean($"StationState.{name}", 1, value);
+            //IniFileHelper.WriteIniData("Config", name, value.ToString(), CountIniPath);
+            try
+            {
+                if (ParameterManager.UpdateCommonParameter(name, value, out string errMsg))
+                {
+                    foreach (var ts in tsSockets)
+                    {
+                        ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.{name}", 1, value);
+                    }
+                    return true;
+                }
+                else
+                {
+                    throw new Exception(errMsg);
+                }
+            }
+            catch (Exception ex)
+            {
+                MsgBoxHelper2.Error(ex.Message);
+                return false;
+            }
         }
 
         private void WriteCount(double pass, double fail)
@@ -444,18 +656,20 @@
         /// </summary>
         private void StartSequence()
         {
+            if (!isLoadOK) return;
             //MaskWindow mask = new MaskWindow();
             try
             {
+                engine?.Globals.SetValString("StationState.ProductModel", 1, SelectedProduct?.Name);
+                engine?.CommitGlobalsToDisk(promptOnSaveConflicts: false);
                 this.modeSeq = this.engine.GetSequenceFileEx(@"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq");
                 this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 0, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
+
+                //var sb = testSeq.GetSequenceByName("MainSequence");
+                //sb.
+
                 this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
-                Dispatcher.Invoke(() =>
-                {
-                    this.CbProduct.IsEnabled = false;
-                    this.BtnStartSeq.IsEnabled = false;
-                    this.BtnStopSeq.IsEnabled = true;
-                });
+                IsTesting = true;
             }
             catch (Exception ex)
             {
@@ -481,12 +695,7 @@
                             bool stoped = StopSequence();
                             if (stoped)
                             {
-                                Dispatcher.Invoke(() =>
-                                {
-                                    this.CbProduct.IsEnabled = true;
-                                    this.BtnStartSeq.IsEnabled = true;
-                                    this.BtnStopSeq.IsEnabled = false;
-                                });
+                                IsTesting = false;
                             }
                         }
                         finally
@@ -523,7 +732,7 @@
                         //    context.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
                         //    bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
                         //}
-                        context?.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
+                        context?.StationGlobals.SetValBoolean("StationState.StopTest", 1, true);
                     }
                 }
                 if (this.execution == null) return true;
@@ -564,17 +773,17 @@
             new MaskWindow(Window.GetWindow(this),
                 (win) =>
                 {
-                    Dispatcher.Invoke(() =>
+                    try
                     {
-                        try
-                        {
-                            StartSequence();
-                        }
-                        finally
+                        StartSequence();
+                    }
+                    finally
+                    {
+                        win.Dispatcher.Invoke(() =>
                         {
                             win.Close();
-                        }
-                    });
+                        });
+                    }
                 }).Info(LangUtil.Get("Ts.SequenceIsStarting"));
         }
 
@@ -594,7 +803,7 @@
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
-        private void AxApplicationMgr_ExecutionClosed(object sender, NationalInstruments.TestStand.Interop.UI.Ax._ApplicationMgrEvents_ExecutionClosedEvent e)
+        private void AxApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e)
         {
             try
             {
@@ -619,11 +828,35 @@
             this.UpdateTestCounter();
         }
 
+        public void UpdatePositionProcessValue(int index, int value)
+        {
+            this.tsSockets[index].SetTestProcess(value);
+        }
+
+        public void PausePosition(int index)
+        {
+            this.tsSockets[index].ShowPausePanel();
+        }
+
         public void AddTestData(int index, string data)
         {
             string[] TestItems = data.Split(',');
             tsSockets[index].AddTestData(TestItems[0], TestItems[1], TestItems[2], TestItems[3],
                 TestItems[4], TestItems[5], TestItems[6]);
+        }
+
+        public void SetPositionBarcode(int index, string barcode)
+        {
+            this.tsSockets[index].Barcode = barcode;
+        }
+
+        public void SavePositionCSV(int index)
+        {
+            var time = DateTime.Now;
+            string status = this.tsSockets[index].Status == "Passed" ? "PASS" : "FAIL";
+            string csvPath = Path.Combine(csvDir, SelectedProduct?.Name ?? "鏈煡浜у搧", time.ToString("yyyyMMdd"), status,
+                $"{this.tsSockets[index].Barcode}-{time.ToString("HHmmss")}.csv");
+            this.tsSockets[index].WriteToCSV(csvPath);
         }
 
         /// <summary>
@@ -637,6 +870,17 @@
             {
                 int EventCase = Convert.ToInt32(e.uiMsg.Event);
                 int Index = Convert.ToInt16(e.uiMsg.NumericData);//SocketIndex
+                string strData = e.uiMsg.StringData;
+
+                try
+                {
+                    log.Info($"Event: {EventCase}, NumericData: {Index}, StringData: {strData}");
+                }
+                catch
+                {
+
+                }
+
                 switch (EventCase)
                 {
                     case 10001://浼犻�扴ocketContext
@@ -661,7 +905,7 @@
                         break;
 
                     case 10006://鍙戦�佷骇鍝佹潯鐮�
-                        this.tsSockets[Index].Barcode = e.uiMsg.StringData;
+                        SetPositionBarcode(Index, e.uiMsg.StringData);
                         break;
 
                     case 10007://寮�濮嬫祴璇曡鏃�
@@ -715,8 +959,7 @@
                         this.tsSockets[Index].ElapseTime = e.uiMsg.StringData;
                         break;
                     case (int)UIMessageCodes.UIMsg_EndExecution://鎵ц缁撴潫
-                        this.BtnStartSeq.IsEnabled = true;
-                        this.BtnStopSeq.IsEnabled = true;
+                        IsTesting = false;
                         // this.ReleaseSequenceFile();
                         break;
                     case 10030://鏄剧ず娴嬭瘯杩涘害
@@ -724,7 +967,10 @@
                         this.tsSockets[Index].SetTestProcess(ProcessVal);
                         break;
                     case 10031://瀵煎嚭CSV
-                        this.tsSockets[Index].WriteToCSV(e.uiMsg.StringData);
+                        SavePositionCSV(Index);
+                        break;
+                    case 10032://鎸変笅鏍囨殏鍋滄祴璇�
+                        this.tsSockets[Index].ShowPausePanel();
                         break;
                     default:
                         break;
@@ -750,9 +996,15 @@
 
         private void SetTestSeqFile(ProductData product)
         {
+            if (product == null)
+            {
+                testSeqFile = null;
+                return;
+            }
             string name = product.Name;
             List<ParameterData> parameters = ProductManager.GetParametersByProductName(name);
             testSeqFile = parameters.FirstOrDefault(p => p.Name == "TestSequence")?.Value?.ToString();
+            StartSequence();
         }
 
         private void ClearNum()
@@ -772,13 +1024,22 @@
 
         public override void OnClose(object sender, CancelEventArgs e)
         {
-            StopSequence();
-            this.engine?.ReleaseSequenceFileEx(this.testSeq, 0);
-            this.engine?.ReleaseSequenceFileEx(this.modeSeq, 0);
-            this.engine?.UnloadAllModules();
-            this.testSeq = null;
-            this.modeSeq = null;
-            base.OnClose(sender, e);
+            try
+            {
+                StopSequence();
+                // this.engine?.TerminateAll();
+                // this.engine?.ReleaseSequenceFileEx(this.testSeq, 0);
+                // this.engine?.ReleaseSequenceFileEx(this.modeSeq, 0);
+                // this.engine?.UnloadAllModules();
+                // this.engine?.ShutDown(true);
+                //this.testSeq = null;
+                //this.modeSeq = null;
+                base.OnClose(sender, e);
+            }
+            catch (Exception ex)
+            {
+                log.Error("OnClose Error.", ex);
+            }
         }
 
         private void PluginControl_SizeChanged(object sender, SizeChangedEventArgs e)

--
Gitblit v1.9.1