From ef52fd6fd07508883dce4eb002acda59f0169e59 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期四, 23 四月 2026 10:19:33 +0800
Subject: [PATCH] 优化;
---
Plugin.TsExecution/TsExecution.xaml.cs | 511 +++++++++++++++++++++++++++++++++++++++++---------------
1 files changed, 370 insertions(+), 141 deletions(-)
diff --git a/Plugin.TsExecution/TsExecution.xaml.cs b/Plugin.TsExecution/TsExecution.xaml.cs
index 447b893..4578fdb 100644
--- a/Plugin.TsExecution/TsExecution.xaml.cs
+++ b/Plugin.TsExecution/TsExecution.xaml.cs
@@ -3,15 +3,14 @@
using HMI.Core.Api;
using HMI.Core.Entity;
using HMI.Core.Manager;
+using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.MQUtil;
-using HMI.UI;
using HMI.UI.Util;
using HMI.Util;
using log4net;
using NationalInstruments.TestStand.Interop.API;
using NationalInstruments.TestStand.Interop.UI.Ax;
-using Panuon.WPF.UI;
using Plugin.TsSupport;
using ScottPlot;
using ScottPlot.Plottables;
@@ -21,6 +20,7 @@
using System.ComponentModel;
using System.IO;
using System.Linq;
+using System.Runtime.InteropServices;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
@@ -31,7 +31,7 @@
/// <summary>
/// UserControl1.xaml 鐨勪氦浜掗�昏緫
/// </summary>
- public partial class TsExecution : PluginControl
+ public partial class TsExecution : PluginMaskControl
{
#region TestStand浜嬩欢
/// <summary>
@@ -51,6 +51,8 @@
private SequenceFile modeSeq = null;
public AxApplicationMgr AxApplicationMgr;
private Execution execution = null;
+
+ private SequenceContext sequenceContext = null;
private Chart chart;
#endregion
@@ -101,7 +103,25 @@
set
{
Set(ref selectedProduct, value);
+ CurrentProductModel = value?.Name;
+ if (tsSockets != null)
+ {
+ foreach (SingleControl socket in tsSockets)
+ {
+ socket.RefreshProduct(value);
+ }
+ }
SetTestSeqFile(value);
+ }
+ }
+
+ private string currentProductModel;
+ public string CurrentProductModel
+ {
+ get => currentProductModel;
+ set
+ {
+ Set(ref currentProductModel, value);
}
}
@@ -248,6 +268,8 @@
if (WriteIni("UI_CurrentWorkorder", value))
{
Set(ref currentWorkorder, value);
+ engine?.Globals.SetValString("StationState.WorkOrder", 1, value);
+ engine?.CommitGlobalsToDisk(promptOnSaveConflicts: false);
}
}
}
@@ -277,6 +299,7 @@
DataContext = this;
GCTimer = new Timer();
InitializeComponent();
+
InitChart();
InitTsEngine();
//鍒濆鍖朤estStand寮曟搸
@@ -338,6 +361,25 @@
InitProducts();
CheckSqlHelper();
base.InitFinish();
+
+ if (ParamSetting.EnableAutoModel)
+ {
+ selectModelPanel.Visibility = Visibility.Collapsed;
+ autoModelPanel.Visibility = Visibility.Visible;
+ CurrentProductModel = string.Empty;
+ }
+
+ try
+ {
+ UserInfo user = UserInfo.User;
+ CurrentUserCode = user?.Code;
+ engine?.Globals.SetValString("StationState.OPID", 1, CurrentUserCode);
+ engine?.CommitGlobalsToDisk(promptOnSaveConflicts: false);
+ }
+ catch (Exception ex)
+ {
+ log.Warn("Get Login User Failed.", ex);
+ }
}
private void InitMQ()
@@ -414,6 +456,13 @@
SelectedProduct = tempProduct;
}
RefershUI();
+ if (tsSockets != null)
+ {
+ foreach (SingleControl socket in tsSockets)
+ {
+ socket.RefreshProduct(SelectedProduct);
+ }
+ }
SampleStatus = false;
}
@@ -439,24 +488,31 @@
private void InitTsEngine()
{
AxApplicationMgr = TestAppManager.GetAxApplicationMgr();
+
+
+ //AxApplicationMgr. += AxApplicationMgr_EndExecution;
AxApplicationMgr.EndExecution += AxApplicationMgr_EndExecution;
- AxApplicationMgr.ExitApplication += new EventHandler(this.AxApplicationMgr_ExitApplication);
- AxApplicationMgr.UIMessageEvent +=
- new _ApplicationMgrEvents_UIMessageEventEventHandler(this.AxApplicationMgr_UIMessageEvent);
- AxApplicationMgr.ExecutionClosed +=
- new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.AxApplicationMgr_ExecutionClosed);
+
+ AxApplicationMgr.ExitApplication += this.AxApplicationMgr_ExitApplication;
+ AxApplicationMgr.UIMessageEvent += this.AxApplicationMgr_UIMessageEvent;
+ AxApplicationMgr.ExecutionClosed += this.AxApplicationMgr_ExecutionClosed;
((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).BeginInit();
host.Child = AxApplicationMgr;
((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).EndInit();
}
+ private volatile bool canSwitchModel = false;
+ private volatile Action switchAction = null;
+
private void AxApplicationMgr_EndExecution(object sender, _ApplicationMgrEvents_EndExecutionEvent e)
{
log.Info("AxApplicationMgr_EndExecution");
if (ReleaseSequenceFile())
{
+ IsTesting = false;
log.Info("Release SeqFile Success!");
+ if (canSwitchModel) switchAction?.Invoke();
}
else
{
@@ -476,58 +532,107 @@
private void PluginControl_Loaded(object sender, RoutedEventArgs e)
{
- new MaskWindow((WindowX)Window.GetWindow(this),
- (win) =>
+ ShowMask(() =>
+ {
+ try
{
- try
- {
- Dispatcher.Invoke(() =>
- {
- try
- {
- UserInfo user = UserInfo.User;
- CurrentUserCode = user?.Code;
- }
- catch (Exception ex)
- {
- log.Warn("Get Login User Failed.", ex);
- }
- });
- isLoadOK = true;
- if (AutoExecuteSeq) StartSequence();
- }
- catch (Exception ex)
- {
- log.Error("TsExecution Loaded Failed.", ex);
- MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
- }
+ //Dispatcher.Invoke(() =>
+ //{
- 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(() =>
- {
- if (isLoadOK) Loaded -= PluginControl_Loaded;
- });
+ //});
+ isLoadOK = true;
+ if (AutoExecuteSeq) StartSequence();
}
- ).Info(LangUtil.Get("App.UsercontrolIsLoading"));
+ 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(() =>
+ {
+ if (isLoadOK) Loaded -= PluginControl_Loaded;
+ });
+ }, (ex) =>
+ {
+ ToastHelper.Error("Loaded Failed.");
+ log.Error("Loaded Error.", ex);
+ }, null, LangUtil.Get("App.UsercontrolIsLoading"));
+
+ //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);
+ // }
+ // });
+ // isLoadOK = true;
+ // if (AutoExecuteSeq) 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(() =>
+ // {
+ // if (isLoadOK) Loaded -= PluginControl_Loaded;
+ // });
+ // }
+ // ).Info(LangUtil.Get("App.UsercontrolIsLoading"));
}
private void RefershUI()
{
panel.Children.Clear();
+ string[] names = ParamSetting.SocketNames.Split(',');
+
//閲嶆柊鐢熸垚瀛愰潰鏉�
for (int i = 0; i < this.socketNum; i++)
{
- SingleControl control = new SingleControl(i, CountIniPath, this.probeWarn);
+ string name = string.Empty;
+ if (i < names.Length)
+ {
+ name = names[i];
+ }
+
+ SingleControl control = new SingleControl(i, CountIniPath, this.probeWarn)
+ {
+ SocketName = name
+ };
panel.Children.Add(control);
tsSockets.Add(control);
@@ -577,8 +682,8 @@
pass = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Pass", "0", CountIniPath));
fail = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Fail", "0", CountIniPath));
var fontSize = Convert.ToDouble(IniFileHelper.ReadIniData("Config", "TableFontSize", "12", CountIniPath));
- this.Resources["tableFontSize"] = fontSize;
- CbFontSize.SelectedItem = fontSize;
+ this.Resources["tableFontSize"] = 20d;
+ //CbFontSize.SelectedItem = fontSize;
}
private string csvDir;
@@ -791,13 +896,11 @@
{
value = ParameterManager.GetCommonParameterByName("UI_CurrentWorkorder");
- currentWorkorder = value.Value;
- Set("CurrentWorkorder");
+ CurrentWorkorder = value.Value;
}
catch
{
- currentWorkorder = string.Empty;
- Set("CurrentWorkorder");
+ CurrentWorkorder = string.Empty;
}
try
@@ -814,22 +917,13 @@
{
}
- try
- {
-
- value = ParameterManager.GetCommonParameterByName("TS_DataLogPath");
- dataLogPath = value.Value;
- }
- catch
- {
- dataLogPath = Path.Combine(PathHelper.ConfigFolder, "DataBoard");
- }
+ dataLogPath = ParamSetting.DataLogFolder;
try
{
value = ParameterManager.GetCommonParameterByName("TsModelPath");
- tsModelPath = value.Value;
+ tsModelPath = value?.Value ?? @"C:\Users\Public\Documents\National Instruments\TestStand 2020 (64-bit)\Components\Models\ParallelModel.seq";
}
catch
{
@@ -861,6 +955,11 @@
foreach (var ts in tsSockets)
{
ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.{name}", 1, value);
+ if (ts?.SequenceFileContext?.Sequence != null)
+ {
+ ts.SequenceFileContext.Sequence.FailureAction =
+ value ? FailureActions.FailureAction_None : FailureActions.FailureAction_GotoCleanup;
+ }
}
return true;
}
@@ -962,54 +1061,79 @@
/// </summary>
private void StartSequence()
{
+ log.Info($"Start ATE Seq isLoadOK:{isLoadOK}");
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(tsModelPath);
- this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 2, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
- this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
- IsTesting = true;
+ engine?.Globals.SetValBoolean("StationState.StopTest", 1, false);
}
catch (Exception ex)
{
- Dispatcher.Invoke(() =>
- {
- log.Error("Start Sequence Failed.", ex);
- MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StartSequenceFail")}: {ex.Message}");
- });
+ log.Error("Reset StopTest Failed.", ex);
}
- finally
+ if (ParamSetting.EnableAutoModel)
{
+ try
+ {
+ var path = ParameterManager.GetCommonParameterByName<string>("CommonMainSeq", "");
+ if (string.IsNullOrEmpty(path))
+ {
+ Dispatcher.Invoke(() =>
+ {
+ MsgBoxHelper.Error(this, $"璇峰厛璁剧疆CommonMainSeq鍙傛暟");
+ });
+ return;
+ }
+ this.testSeqFile = path;
+ this.modeSeq = this.engine.GetSequenceFileEx(tsModelPath);
+ this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 2, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
+ this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
+ IsTesting = true;
+ }
+ catch (Exception ex)
+ {
+ Dispatcher.Invoke(() =>
+ {
+ log.Error("Start Sequence Failed.", ex);
+ MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StartSequenceFail")}: {ex.Message}");
+ });
+ }
+ }
+ else
+ {
+ //MaskWindow mask = new MaskWindow();
+ try
+ {
+ engine?.Globals.SetValString("StationState.ProductModel", 1, CurrentProductModel);
+ engine?.CommitGlobalsToDisk(promptOnSaveConflicts: false);
+ this.modeSeq = this.engine.GetSequenceFileEx(tsModelPath);
+ this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 2, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
+ this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
+ IsTesting = true;
+ }
+ catch (Exception ex)
+ {
+ Dispatcher.Invoke(() =>
+ {
+ log.Error("Start Sequence Failed.", ex);
+ MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StartSequenceFail")}: {ex.Message}");
+ });
+ }
+ finally
+ {
+ }
}
}
public void StopSequenceClick()
{
- new MaskWindow((WindowX)Window.GetWindow(this),
- (win) =>
- {
- try
- {
- bool stoped = StopSequence();
- if (stoped)
- {
- IsTesting = false;
- }
- }
- finally
- {
- Dispatcher.Invoke(() =>
- {
-
- win.Close();
- });
- }
- }
- ).Info(LangUtil.Get("App.SequenceIsStopping"));
+ canSwitchModel = false;
+ switchAction = null;
+ ShowMask(() =>
+ {
+ bool stoped = StopSequence();
+ }, null, null, LangUtil.Get("App.SequenceIsStopping"));
}
/// <summary>
@@ -1019,23 +1143,21 @@
{
try
{
- if (this.tsSockets.Count > 0)
- {
- for (int i = 0; i < tsSockets.Count; i++)
- {
- var context = this.tsSockets[i].SequenceFileContext;
- //bool val = context.StationGlobals.Exists("StationState.StopTest", 0);
- //if (val)
- //{
- // context.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
- // bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
- //}
- context?.StationGlobals.SetValBoolean("StationState.StopTest", 1, true);
- }
- }
+ //if (this.tsSockets.Count > 0)
+ //{
+ // for (int i = 0; i < tsSockets.Count; i++)
+ // {
+ // var context = this.tsSockets[i].SequenceFileContext;
+ // context?.StationGlobals.SetValBoolean("StationState.StopTest", 1, true);
+ // }
+ //}
+ engine.Globals.SetValBoolean("StationState.StopTest", 1, true);
if (this.execution == null) return true;
- bool res = this.execution.WaitForEndEx(2000, true, null, null);
+ //bool res = this.execution.WaitForEndEx(-1, true, null, null);
+ bool res = this.execution?.WaitForEndEx(-1, true, Type.Missing, null) == true;
+ Marshal.ReleaseComObject(this.execution);
+ this.execution = null;
return res;
}
catch (Exception ex)
@@ -1070,21 +1192,29 @@
private void StartClick()
{
- new MaskWindow(Window.GetWindow(this),
- (win) =>
- {
- try
- {
- StartSequence();
- }
- finally
- {
- win.Dispatcher.Invoke(() =>
- {
- win.Close();
- });
- }
- }).Info(LangUtil.Get("Ts.SequenceIsStarting"));
+ canSwitchModel = true;
+ ShowMask(() =>
+ {
+ StartSequence();
+ }, null, null, LangUtil.Get("Ts.SequenceIsStarting"));
+ //new MaskWindow(Window.GetWindow(this),
+ // (win) =>
+ // {
+ // try
+ // {
+ // StartSequence();
+ // }
+ // catch (Exception ex) {
+
+ // }
+ // finally
+ // {
+ // win.Dispatcher.Invoke(() =>
+ // {
+ // win.Close();
+ // });
+ // }
+ // }).Info(LangUtil.Get("Ts.SequenceIsStarting"));
}
/// <summary>
@@ -1148,7 +1278,7 @@
{
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");
+ string csvPath = Path.Combine(csvDir, CurrentProductModel ?? "鏈煡浜у搧", time.ToString("yyyyMMdd"), status, $"{this.tsSockets[index].Barcode}-{time.ToString("HHmmss")}.csv");
this.tsSockets[index].WriteToCSV(csvPath);
}
@@ -1158,7 +1288,7 @@
var socket = this.tsSockets[index];
var time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
string snr = socket.Barcode;
- string model = SelectedProduct?.Name;
+ string model = CurrentProductModel;
List<string> sqls = new List<string>();
foreach (var data in socket.Datasource)
@@ -1247,7 +1377,7 @@
this.tsSockets[index].ElapseTime = strData;
break;
case (int)UIMessageCodes.UIMsg_EndExecution://鎵ц缁撴潫
- IsTesting = false;
+ //IsTesting = false;
//this.ReleaseSequenceFile();
break;
case 10030://鏄剧ず娴嬭瘯杩涘害
@@ -1284,19 +1414,91 @@
this.tsSockets[index].ShowPausePanel();
break;
case 10033:
- ShowAlarm(strData);
+ var alarm = new AlarmText
+ {
+ VirtualId = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
+ AlarmInfo = strData
+ };
+ ShowAlarm(alarm);
+ break;
+ case 10034:
+ CurrentProductModel = strData;
+ break;
+ case 10035:
+ string[] arr_10035 = strData.Split(';');
+
+ int[][] points = new int[arr_10035.Length - 1][];
+
+ for (int i = 1; i < arr_10035.Length; i++)
+ {
+ string[] strs = arr_10035[i].Split(',');
+ points[i - 1] = new int[2] { int.Parse(strs[0]), int.Parse(strs[1]) };
+ }
+ this.tsSockets[index].DrawScreenPoints(int.Parse(arr_10035[0]), points);
+ break;
+ case 10036:
+ this.tsSockets[index].ClearScreenPoint(int.Parse(strData));
break;
case 10099:
+ string[] arr = strData.Split(',');
+ if (canSwitchModel) SwitchSequenceByModel(index, arr[0], arr[1]);
break;
default:
break;
}
}
- private void ShowAlarm(string info)
+ private void SwitchSequenceByModel(int index, string model, string snr)
{
- AlarmShowHelper.ShowAlarm(info);
- mSMQHelper.Send("Alarm", $"ATE娴嬭瘯 {info}");
+ Dispatcher.Invoke(() =>
+ {
+ var target = Products.FirstOrDefault(e => e.Name == model);
+
+ ShowMask(() =>
+ {
+ bool stoped = StopSequence();
+ //if (stoped)
+ //{
+ // IsTesting = false;
+ //}
+ }, null, null, "鎹㈠瀷涓紝璇风◢鍚�...");
+
+ if (target == null)
+ {
+ MsgBoxHelper2.Warn($"璇峰厛鍦ㄤ骇鍝佺鐞嗛〉闈㈤厤缃瀷鍙� [{model}] 鐨勪骇鍝佷俊鎭紒");
+ return;
+ }
+
+ switchAction = () =>
+ {
+ switchAction = null;
+ log?.Info($"灏濊瘯鑷姩鎹㈠瀷: {switchAction}");
+ if (canSwitchModel)
+ {
+ Dispatcher.Invoke(() =>
+ {
+ try
+ {
+ log?.Info("寮�濮嬭嚜鍔ㄦ崲鍨�");
+ SelectedProduct = target;
+ engine?.Globals.SetValString($"CacheSNR[{index}]", 1, snr);
+ engine?.CommitGlobalsToDisk(false);
+ StartClick();
+ }
+ catch (Exception ex)
+ {
+ log?.Error("鑷姩鎹㈠瀷澶辫触", ex);
+ }
+ });
+ }
+ };
+ });
+ }
+
+ private void ShowAlarm(AlarmText alarm)
+ {
+ AlarmShowHelper.ShowAlarm(alarm);
+ mSMQHelper.Send("Alarm", $"ATE娴嬭瘯 {alarm.AlarmInfo}");
}
/// <summary>
@@ -1314,7 +1516,7 @@
try
{
- log.Info($"Event: {eventCode}, NumericData: {index}, StringData: {strData}");
+ log.Debug($"Event: {eventCode}, NumericData: {index}, StringData: {strData}");
}
catch
{
@@ -1322,6 +1524,8 @@
}
if (eventCode == 10001)
{
+ sequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
+
tsSockets[index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
return;
}
@@ -1403,6 +1607,10 @@
{
lock (this)
{
+ if (this.testSeq == null)
+ {
+ return true;
+ }
//execution.Abort();
int count = 10;
while (count > 0)
@@ -1412,15 +1620,18 @@
if (this.testSeq == null)
return true;
- if (this.engine.ReleaseSequenceFileEx(this.testSeq, 4))
+ if (this.engine?.ReleaseSequenceFileEx(this.testSeq, 4) == true)
{
+ Marshal.ReleaseComObject(this.testSeq);
this.testSeq = null;
+ // GC.Collect();
}
- if (this.engine.ReleaseSequenceFileEx(this.modeSeq, 4))
+ if (this.engine?.ReleaseSequenceFileEx(this.modeSeq, 4) == true)
{
+ Marshal.ReleaseComObject(this.modeSeq);
this.modeSeq = null;
}
- this.engine.UnloadAllModules();
+ this.engine?.UnloadAllModules();
return this.testSeq == null && this.modeSeq == null;
}
catch (Exception ex)
@@ -1461,5 +1672,23 @@
{
}
}
+
+ private void Label_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
+ {
+ //workOrderEditor.Focus();
+ //workOrderEditor.IsEditing = true;
+ if (RequirePassword() == true)
+ {
+ var win = new WorkOrderWin
+ {
+ WorkOrder = CurrentWorkorder,
+ Owner = Window.GetWindow(this)
+ };
+ if (win.ShowDialog() == true)
+ {
+ CurrentWorkorder = win.WorkOrder;
+ }
+ }
+ }
}
}
\ No newline at end of file
--
Gitblit v1.9.1