alielie
2026-06-04 771a0e7b6b1276087515bbe94de28358cb92963b
Plugin.TestResult/TestResultView.xaml.cs
@@ -2,13 +2,11 @@
using HMI.Core.Manager;
using HMI.Core.Util;
using HMI.UI.Util;
using NationalInstruments.TestStand.Interop.API;
using NationalInstruments.TestStand.Interop.UI.Ax;
using Plugin.TestResult_WPF.Model;
using Plugin.TsSupport;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
@@ -143,26 +141,19 @@
            InitializeComponent();
            executionWrapper = new TsExecutionWrapper(); //new TsExecutionWrapper();
            if (executionWrapper is TsExecutionWrapper tsWrapper)
        }
        private void ExecutionWrapper_UIMessageEvent(object sender, UIMessageEvent e)
        {
            try
            {
                tsWrapper.AxApplicationMgr.ExitApplication += this.axApplicationMgr_ExitApplication;
                tsWrapper.AxApplicationMgr.UIMessageEvent += this.axApplicationMgr_UIMessageEvent;
                tsWrapper.AxApplicationMgr.ExecutionClosed += this.axApplicationMgr_ExecutionClosed;
                ((System.ComponentModel.ISupportInitialize)(tsWrapper.AxApplicationMgr)).BeginInit();//myClient为第三方控件名
                host.Child = tsWrapper.AxApplicationMgr;
                ((System.ComponentModel.ISupportInitialize)(tsWrapper.AxApplicationMgr)).EndInit();
                HandleUIMessage(e.EventCode, Convert.ToInt16(e.NumberData), e.StrData, e.Data);
            }
            catch (Exception ex)
            {
            //testApp = TestAppManager.GetAxApplicationMgr();
            //testApp.ExitApplication += this.axApplicationMgr_ExitApplication;
            //testApp.UIMessageEvent += this.axApplicationMgr_UIMessageEvent;
            //testApp.ExecutionClosed += this.axApplicationMgr_ExecutionClosed;
            //((System.ComponentModel.ISupportInitialize)(this.testApp)).BeginInit();//myClient为第三方控件名
            //host.Child = testApp;
            //((System.ComponentModel.ISupportInitialize)(this.testApp)).EndInit();
            }
        }
        private void Refresh()
@@ -217,10 +208,26 @@
        /// <summary>
        /// 启动测试序列
        /// </summary>
        public void InitTestStandEngine()
        public void InitTestStandEngine(bool isTap)
        {
            try
            {
                if (isTap)
                {
                    executionWrapper = new TapWrapper();
                }
                else
                {
                    executionWrapper = new TsExecutionWrapper();
                }
                executionWrapper.UIMessageEvent += ExecutionWrapper_UIMessageEvent;
                if (executionWrapper is TsExecutionWrapper tsWrapper)
                {
                    ((System.ComponentModel.ISupportInitialize)(tsWrapper.AxApplicationMgr)).BeginInit();
                    host.Child = tsWrapper.AxApplicationMgr;
                    ((System.ComponentModel.ISupportInitialize)(tsWrapper.AxApplicationMgr)).EndInit();
                }
                //this.engine = this.testApp.GetEngine();
                //this.engine.PersistBreakpoints = false;
                //this.testApp.IsEditor = true;
@@ -258,7 +265,7 @@
            try
            {
                executionWrapper?.SetStationGlobalValue<bool>("StationState.StopTest", 0, true, true);
                try
                {
                    executionWrapper?.WaitForExit();
@@ -284,12 +291,14 @@
            }
        }
        [Obsolete]
        private void axApplicationMgr_ExitApplication(object sender, EventArgs e)
        {
            //Environment.ExitCode = testApp.ExitCode;
            //TSHelper.DoSynchronousGCForCOMObjectDestruction();
        }
        [Obsolete]
        private void axApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e)
        {
            try
@@ -303,31 +312,23 @@
            }
        }
        private void axApplicationMgr_UIMessageEvent(object sender, _ApplicationMgrEvents_UIMessageEventEvent e)
        private void HandleUIMessage(int EventCase, int MethodCode, string strData, object xData)
        {
            try
            {
                int EventCase = Convert.ToInt32(e.uiMsg.Event);
                int MethodCode = Convert.ToInt16(e.uiMsg.NumericData);
                string strData;
                if (EventCase != 10014) return;
                if (MethodCode == 0)
                {
                    /// 设置句柄
                    //this.SequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
                    if (executionWrapper is TsExecutionWrapper tsWrapper)
                    {
                        tsWrapper.context = (SequenceContext)e.uiMsg.ActiveXData;
                    }
                    executionWrapper.SetContext(xData);
                    return;
                }
                if (MethodCode == 1)
                {
                    /// 更新炉子状态
                    strData = e.uiMsg.StringData;
                    string[] datas_10014 = strData.Split(';');
                    int ovenIndex = int.Parse(datas_10014[0]);
@@ -338,7 +339,6 @@
                if (MethodCode == 2)
                {
                    /// 更新炉子数量信息
                    strData = e.uiMsg.StringData;
                    string[] datas_10014 = strData.Split(';');
                    int ovenIndex = int.Parse(datas_10014[0]);
@@ -351,7 +351,6 @@
                if (MethodCode == 3)
                {
                    /// 更新炉子时间信息
                    strData = e.uiMsg.StringData;
                    string[] datas_10014 = strData.Split(';');
                    int ovenIndex = int.Parse(datas_10014[0]);
                    string startTime = datas_10014[1];
@@ -372,7 +371,6 @@
                if (MethodCode == 4)
                {
                    /// 更新老化炉底部状态栏
                    strData = e.uiMsg.StringData;
                    string[] datas_10014 = strData.Split(';');
                    int ovenIndex = int.Parse(datas_10014[0]);
@@ -383,7 +381,6 @@
                if (MethodCode == 5)
                {
                    /// 采集炉温度
                    strData = e.uiMsg.StringData;
                    string[] datas_10016 = strData.Split(';');
                    int ovenIndex = int.Parse(datas_10016[0]);
@@ -399,29 +396,28 @@
                }
                if (MethodCode == 6)
                {
                    /// 更新穴位状态
                    strData = e.uiMsg.StringData;
                    string[] datas_10015 = strData.Split(';');
                    int ovenIndex = int.Parse(datas_10015[0]);
                    int cellIndex = int.Parse(datas_10015[1]);
                    string status_10015 = datas_10015[2];
                    tables[ovenIndex].GetSingleCell(cellIndex).SetStatus(status_10015);
                    Dispatcher.Invoke(() =>
                    {/// 更新穴位状态
                        string[] datas_10015 = strData.Split(';');
                        int ovenIndex = int.Parse(datas_10015[0]);
                        int cellIndex = int.Parse(datas_10015[1]);
                        string status_10015 = datas_10015[2];
                        tables[ovenIndex].GetSingleCell(cellIndex).SetStatus(status_10015);
                    if (status_10015 == "OK" || status_10015 == "ok")
                    {
                        tables[ovenIndex].RefreshCount(1, 0);
                    }
                    else if (status_10015 == "ng" || status_10015 == "NG")
                    {
                        tables[ovenIndex].RefreshCount(0, 1);
                    }
                        if (status_10015 == "OK" || status_10015 == "ok")
                        {
                            tables[ovenIndex].RefreshCount(1, 0);
                        }
                        else if (status_10015 == "ng" || status_10015 == "NG")
                        {
                            tables[ovenIndex].RefreshCount(0, 1);
                        }
                    });
                    return;
                }
                if (MethodCode == 7)
                {
                    /// 更新穴位参数
                    strData = e.uiMsg.StringData;
                    string[] datas_10015 = strData.Split(';');
                    int ovenIndex = int.Parse(datas_10015[0]);
                    int cellIndex = int.Parse(datas_10015[1]);
@@ -446,7 +442,6 @@
                if (MethodCode == 10)
                {
                    /// 清空炉子的温度图表
                    strData = e.uiMsg.StringData;
                    int ovenIndex = int.Parse(strData);
                    tables[ovenIndex].ClearChartData();
                    return;
@@ -454,7 +449,6 @@
                if (MethodCode == 11)
                {
                    /// 清除穴位参数
                    strData = e.uiMsg.StringData;
                    string[] datas_10015 = strData.Split(';');
                    int ovenIndex = int.Parse(datas_10015[0]);
                    int cellIndex = int.Parse(datas_10015[1]);
@@ -465,7 +459,6 @@
                if (MethodCode == 12)
                {
                    /// 保存炉体温度文件
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
                    string folder = datas[1];
@@ -475,7 +468,6 @@
                if (MethodCode == 13)
                {
                    /// 添加电流数据
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
                    int cellIndex = int.Parse(datas[1]);
@@ -487,7 +479,6 @@
                if (MethodCode == 14)
                {
                    /// 清空电流和电压数据
                    strData = e.uiMsg.StringData;
                    int ovenIndex = int.Parse(strData);
                    tables[ovenIndex].ClearCellData();
                    //tables[ovenIndex].ClearElectricData();
@@ -499,7 +490,6 @@
                if (MethodCode == 15)
                {
                    /// 保存电流数据
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
                    int cellIndex = int.Parse(datas[1]);
@@ -511,7 +501,6 @@
                if (MethodCode == 16)
                {
                    /// 添加电压图表数据
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
                    int cellIndex = int.Parse(datas[1]);
@@ -523,7 +512,6 @@
                if (MethodCode == 17)
                {
                    /// 保存电压数据
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
                    int cellIndex = int.Parse(datas[1]);
@@ -535,7 +523,6 @@
                if (MethodCode == 18)
                {
                    /// 保存穴位测试数据到CSV
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
                    int cellIndex = int.Parse(datas[1]);
@@ -543,11 +530,20 @@
                    tables[ovenIndex].GetSingleCell(cellIndex).SaveInfoToCSV(filePath);
                    return;
                }
                if (MethodCode == 180)
                {
                    /// 保存穴位测试数据到CSV
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
                    int cellIndex = int.Parse(datas[1]);
                    string filePath = datas[2];
                    tables[ovenIndex].GetSingleCell(cellIndex).NormalCSV(filePath);
                    return;
                }
                if (MethodCode == 19)
                {
                    /// 保存穴位测试数据到Sqlite
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
                    int cellIndex = int.Parse(datas[1]);
@@ -558,7 +554,6 @@
                if (MethodCode == 20)
                {
                    /// 清空条码
                    strData = e.uiMsg.StringData;
                    int ovenIndex = int.Parse(strData);
                    tables[ovenIndex].ClearAllSN();
                    return;
@@ -567,7 +562,6 @@
                if (MethodCode == 21)
                {
                    /// 添加水流图表数据
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
                    int cellIndex = int.Parse(datas[1]);
@@ -580,7 +574,6 @@
                if (MethodCode == 99)
                {
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int index = int.Parse(datas[0]);
                    if (MsgBoxHelper2.WarnChoose(datas[1], "提示") == MessageBoxResult.OK)
@@ -602,6 +595,14 @@
            }
        }
        private void axApplicationMgr_UIMessageEvent(object sender, _ApplicationMgrEvents_UIMessageEventEvent e)
        {
            int EventCase = Convert.ToInt32(e.uiMsg.Event);
            int MethodCode = Convert.ToInt16(e.uiMsg.NumericData);
            string strData = e.uiMsg.StringData;
            HandleUIMessage(EventCase, MethodCode, strData, e.uiMsg.ActiveXData);
        }
        public void SetStartFlag(int index, bool data)
        {
            string name = tables[index].title;
@@ -609,28 +610,11 @@
            string key = $"StationState.Start[{index}]";
            executionWrapper?.SetStationGlobalValue<bool>(key, 1, data);
            if (data == false)
            {
                key = $"StationState.Scanner[{index}]";
                executionWrapper?.SetStationGlobalValue<bool>(key, 1, false);
            }
        }
        public bool? GetStartFlag(int index)
        {
            string key = $"StationState.Start[{index}]";
            return executionWrapper.GetStationGlobalValue<bool>(key, 0);
        }
        public void ReleaseResource()
        {
            if (executionWrapper is TsExecutionWrapper tsWrapper)
            {
                tsWrapper.AxApplicationMgr.ExitApplication -= this.axApplicationMgr_ExitApplication;
                tsWrapper.AxApplicationMgr.UIMessageEvent -= this.axApplicationMgr_UIMessageEvent;
                tsWrapper.AxApplicationMgr.ExecutionClosed -= this.axApplicationMgr_ExecutionClosed;
            }
            executionWrapper.UIMessageEvent -= ExecutionWrapper_UIMessageEvent;
            foreach (var table in tables)
            {