using DataEntity.Event; using DataEntity.Share; using DataEntity.Sockets.Base; using DataRWDAL; using DataRWDAL.Device; using DriverLib.Engine; using DriverLibrary; using HandyControl.Data; using HxEnum; using HxSocket; using HxSocketImplement.Sockets; //using HxUserManagement; using Microsoft.Win32; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Configuration; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Threading; using System.Xml; using XCommon; using XCommon.Event; using XCommon.Log; using XCommon.Tip; using XCommon.Xml; using XCore; using XHandler.Class; using XHandler.Class.DataEx; using XHandler.Controls; using XHandler.Controls.Run.Com; using XHandler.View; using XHandler.View.BacteriaPickResult; using XHandler.View.BacteriaProperty; using XHandler.View.Com; using XHandler.View.Consumables; using XHandler.View.Device; using XHandler.View.Dialog; using XHandler.View.Liquids; using XHandler.View.Login; using XHandler.View.MethodProperty; using XHandler.View.DataLog; using XHandler.View.OperateAudit; using XHandler.View.TestList; using XHandler.View.MoveLiquidReport; using XHandler.View.Tabletop; using XImagingXhandler.XDAL; using static DataEntity.Event.EventExArgs; using ResultType = DriverLib.Engine.ResultType; using SystemInformation = XHandler.View.About.SystemInformation; using XCoreBLL; using Sodao.FastSocket.Server; using BiosenSocketService; using System.Windows.Controls.Primitives; using DataEntity; using MySqlX.XDevAPI.Common; namespace XHandler { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { #region 变量 private DeviceStatus deviceStatus = null; public ConsumableManagement consumableManagement = null; private DeveiceManagement deveiceManagement = null; private BacteriaManagement bacteriaManagement = null; private BacteriaPickResult bacteriaPickResult = null; private DataLogList dataLogList = null; private OperateAuditList operateAuditList = null; private ExperimentFolder experimentFolder = null; private MoveLiquidResult moveLiquidResult = null; private TabletopManagement tabletopManagement = null; private UIElement uIElement = null; private DispatcherTimer lockScreenTimer; //界面锁屏检测定时器 private DispatcherTimer checkConnectTimer; //设备连接状态检测定时器 private Timer heartConnectTimer; //成像设备连接心跳包发送定时器 public bool isAuthorEnable = false;//本次加密狗是否启动 public bool isAuthorPreviewEnable = false;//前一次加密狗是否启动 #region BLL private ChoiceBll choiceBll = new ChoiceBll(); private CoatingBll coatingBll = new CoatingBll(); private HoldingLabwareBll holdingLabwareBll = new HoldingLabwareBll(); public OperateAuditLogBll operateAuditLogBll = new OperateAuditLogBll(); #endregion public static int tickcount = 30;//30分钟,锁屏控制 public string CurWorkFlowName = ""; public TestDesign testDesign = null; public LiquidManagement liquidManagement = null; public bool EnableSimulator = false; //false:不启动;ture:启动 public bool IsOpenDoor = false; //false:门已关;ture:门已开 public bool wasLoadedTip = false; //false:抢上无头;true抢上有头 public bool connectedEquip = false; //true:已连接上设备;false:未连接上设备; public bool firstConnectedEquip = false; //初次连接上驱动 public bool[] enableManualSetDevice; //保存是否已使用过手动设置设备的开关 // 拍照通讯类 public HxSocketClient socketTcpListener = new HxSocketClient(ConfigurationManager.AppSettings["socketClientIP"].ToString(), Convert.ToInt32(ConfigurationManager.AppSettings["socketClientPort"])); public List methodMsgs = new List();//用于存放各种异常错误待处理消息 public Stack stackOperateDialog = new Stack(); public int remoteMark = 0;//远程控制信号,控制窗口开关;1:跳过;2重试;3取消;4确认继续 public RunWnd runWnd = null; //运行界面对象 public bool wasExecuteInitial = false; // 挑菌位数字ID public int ChoiceLatticeId = 0; //角色控制菜单 List roleMenuAllList = null; #endregion #region 界面类构造函数 public MainWindow() { EventBind.MainEvent -= MainEvent; EventBind.MainEvent += MainEvent; string choiceLatticeId = ConfigurationManager.AppSettings["choiceLatticeId"].ToString(); if (choiceLatticeId.Length >= 1) { ChoiceLatticeId = Convert.ToInt32(choiceLatticeId.Substring(1)); } InitializeComponent(); this.Width = Shared.Config.DisplaySizeW; this.Height = Shared.Config.DisplaySizeH; this.Top = Shared.Config.DisplayMarginTop; this.Left = 0; Shared.Main = this; } #endregion #region 界面加载完成事件 private void Window_Loaded(object sender, RoutedEventArgs e) { try { if (Shared.SoftwareInformation.category.Equals(1))//区分设备类型,加载登录界面 { xHandlerLogin xhandlerlogin = new xHandlerLogin(); xhandlerlogin.mainWindow = this; xhandlerlogin.okEvent += Xhandlerlogin_okEvent; xhandlerlogin.closeEvent += login_closeEvent; loginGrid.Children.Add(xhandlerlogin); } else { BacteriaLogin bacterialogin = new BacteriaLogin(); bacterialogin.mainWindow = this; bacterialogin.okEvent += Xhandlerlogin_okEvent; bacterialogin.closeEvent += login_closeEvent; loginGrid.Children.Add(bacterialogin); } rootGrid.Visibility = Visibility.Hidden; ComponentDispatcher.ThreadFilterMessage -= ComponentDispatcher_ThreadFilterMessage; ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage; // 开关门信号检测 MethodAction.Instance.SignalChanged -= this.SignalChangedEvent; MethodAction.Instance.SignalChanged += this.SignalChangedEvent; #region 检查加密狗是否正确安装定时器 DispatcherTimer dispatcherTimer = new DispatcherTimer(); dispatcherTimer.Interval = TimeSpan.FromMilliseconds(Convert.ToInt32(ConfigurationManager.AppSettings["dogCheckTime"].ToString())); dispatcherTimer.Tick += DispatcherTimer_Tick; dispatcherTimer.Start(); #endregion #region 界面锁屏检测定时器 lockScreenTimer = new DispatcherTimer(); lockScreenTimer.Interval = TimeSpan.FromMilliseconds(Convert.ToInt32(ConfigurationManager.AppSettings["mouseMoveCheckTime"].ToString())); // 1分钟 lockScreenTimer.Tick += timer_Tick; lockScreenTimer.Start(); #endregion #region 驱动连接状态检测定时器 checkConnectTimer = new DispatcherTimer(); checkConnectTimer.Interval = TimeSpan.FromMilliseconds(1000); checkConnectTimer.Tick += checkConnectTimer_Tick; #endregion #region 开启工作站服务、作为客户端连接外部服务 if ("true" == ConfigurationManager.AppSettings.Get("AutoService")) { // 开启服务端监听 //SocketInteriorService.OpenService(); InitService(); } new Thread(() => { // 连接设备 ConnectService(); }).Start(); #endregion //btnStartFirstPage_Click(null, null); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } } #region 连接设备 /// /// 连接设备 /// /// public bool ConnectService() { bool IsOk = false; var deviceConfigResult = DeviceConfigDB.GetDeviceConfigListByProjectId(Shared.SoftwareInformation.software_information_id); if (deviceConfigResult == null || deviceConfigResult.Count == 0) { return IsOk; } // 作为客户端连接设备的服务端 var result = EquConnect.ConnectService(); var resultList = JsonConvert.DeserializeObject>(result.msg); StringBuilder sb = new StringBuilder(); StringBuilder sbByTemp = new StringBuilder(); foreach (var item in resultList) { if (item.Contains("失败")) { sbByTemp.Append(item + Environment.NewLine); } sb.Append(item + Environment.NewLine); } if (sbByTemp.ToString().Contains("失败")) { ShowTip.ShowNotice(sbByTemp.ToString(), InfoType.Error); IsOk = false; } else { ShowTip.ShowNotice("外部设备【连接成功】", InfoType.Success); IsOk = true; ; } return IsOk; } #endregion #endregion #region 开关门信号检测 /// /// 开关门信号检测 /// /// /// private void SignalChangedEvent(object sender, SignalChangedEventArgs e) { LoggerHelper.InfoLog(string.Format("[SignalChangedEvent]: Name = {0}, Value = {1}", e.Name, e.Value)); if (e.Name.Equals("FrontDoor")) { IsOpenDoor = e.Value; if (runWnd != null && IsOpenDoor) { // 操作流程 runWnd.OperateExpFolw(true); } } } #endregion #region 定时器事件——检测是否在30分钟内持续操作了本软件,否则锁屏 private void timer_Tick(object sender, EventArgs e) { //Console.WriteLine("次数:" + tickcount.ToString()); //tickcount--; //if (tickcount == 0) //{ // if (rootGrid.Visibility == Visibility.Hidden || loginGrid.Visibility == Visibility.Visible) // { // return; // } // //timer.Stop(); // //锁屏 // PlsLookWin plsToolTipWin = new PlsLookWin(Properties.Resources.strLockInfo, usernamestr, passwordstr); // plsToolTipWin.WindowStartupLocation = WindowStartupLocation.CenterScreen; // plsToolTipWin.Height = this.ActualHeight; // plsToolTipWin.Width = this.ActualWidth; // SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(130, 0, 0, 0)); // plsToolTipWin.Background = (System.Windows.Media.Brush)mybtn1_Brush; // if (!wasEnableOverTimePopWin) // { // wasEnableOverTimePopWin = true; // plsToolTipWin.ShowDialog(); // wasEnableOverTimePopWin = false; // } // //tickcount = 30; // //timer.Start(); //} } #endregion #region 定时器事件——检测设备是否连接 private void checkConnectTimer_Tick(object sender, EventArgs e) { if (MethodAction.Instance != null && !MethodAction.Instance.Connected && connectedEquip) { // 状态0 未链接 黄闪 CommonBll.StatusLamp(0, false); EnableSimulator = true; connectedEquip = false; string TargetPath = "Assets/disconnect.png"; imgDeviceStatus.Source = new BitmapImage(new Uri(TargetPath, UriKind.Relative)); } else if (MethodAction.Instance != null && MethodAction.Instance.Connected && !connectedEquip) { // 状态1 链接成功 蓝亮 CommonBll.StatusLamp(1, false); connectedEquip = true; string TargetPath = "Assets/connect.png"; imgDeviceStatus.Source = new BitmapImage(new Uri(TargetPath, UriKind.Relative)); } } #endregion #region 定时器时间——定时向成像设备发送心跳数据 private void heartConnectTimer_Tick(object sender) { try { if (socketTcpListener.IsConnect()) { socketTcpListener.SendMessage(GenerateHeatCommand(), false); } else { //LoggerHelper.DebugLog("[heartConnectTimer_Tick]: socketTcpListener.IsConnect = false"); } } catch (Exception ex) { LoggerHelper.ErrorLog("[heartConnectTimer_Tick]:ERROR:", ex); } } /// /// 获取向成像设备发送心跳数据 /// /// public string GenerateHeatCommand() { string strResult = string.Empty; strResult = "{" + "message_id:\"" + Guid.NewGuid().ToString() + "\",message_type:0" + ",equipment_id:\"ID2023\"" + ",workflow_id:\"\"" + ",experiment_id:\"" + "\"" + ",experiment_status:0" + ",actual_device_status:0" + ",connected:1" + ",timestamp:\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\"}"; return strResult; } #endregion #region 本装软件界面状态消息检测事件 private void ComponentDispatcher_ThreadFilterMessage(ref MSG m, ref bool handled) { //如果检测到有鼠标或则键盘的消息,则使计数为初始值0..... if (m.message == 0x0200 || m.message == 0x0201 || m.message == 0x0204 || m.message == 0x0207) { tickcount = 30; //Console.WriteLine("统计:" + tickcount.ToString()); } } #endregion #region 定时器事件--检测加密狗状态 private void DispatcherTimer_Tick(object sender, EventArgs e) { bool isAuthor = true;// IsAuthority.IsAuthorityDog(); if (isAuthor) { isAuthorEnable = true; if (isAuthorPreviewEnable == isAuthorEnable) { } else { isAuthorPreviewEnable = true; if (runWnd != null) { if (RunWnd.IsRunning && rootGrid.Visibility.Equals(Visibility.Visible)) { runWnd.btnPause_Click(sender, null); } } } } else { isAuthorEnable = false; rootGrid.Visibility = Visibility.Collapsed; loginGrid.Visibility = Visibility.Visible; if (isAuthorPreviewEnable == isAuthorEnable) { } else { if (runWnd != null) { if (RunWnd.IsRunning) { runWnd.btnPause_Click(sender, null); } } } } } #endregion #region 登录确认按钮事件 private void Xhandlerlogin_okEvent(object sender, CustomRoutedEventArgs e) { SetMenusFromRole(); string name = e.param as string; textBlockLoginUser.Text = Properties.Resources.strUserName1 + name; rootGrid.Visibility = Visibility.Visible; rootGridTitle.RowDefinitions[1].Height = new GridLength(0); loginGrid.Visibility = Visibility.Collapsed; // 连接设备硬件初始化 Thread deviceTD = new Thread(InitializeDevice); deviceTD.Start(); // 建立成像的通信连接 connectToCaptureAndCControl(); InitService(); btnTestDesign.IsChecked = true; isAuthorPreviewEnable = true; } #endregion #region 通过角色权限设置界面 /// /// 通过角色权限设置界面 /// private void SetMenusFromRole() { string userid = UserDB.GetUserInfByUserName(Shared.User.username).id; //所有菜单 roleMenuAllList = UserDB.GetWholeRoleMenuByUserId(userid); SolidColorBrush mybtn2_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(117, 123, 123, 125));//禁用颜色 //左侧主菜单权限控制 //首页 var firstPage = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuFirstPage)); if (firstPage != null) { btnStartFirstPage.IsEnabled = true; btnStartFirstPage.Background = Brushes.Transparent; } else { btnStartFirstPage.IsEnabled = false; btnStartFirstPage.Background = mybtn2_Brush; } //液体管理 var LiquidManager = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuLiquidManage)); if (LiquidManager != null) { btnLiquidManager.IsEnabled = true; btnLiquidManager.Background = Brushes.Transparent; btnLiquidManager.Visibility = Visibility.Visible; if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceHXELEC)) { btnLiquidManager.Content = Properties.Resources.strColloid; } } else { btnLiquidManager.IsEnabled = false; btnLiquidManager.Background = mybtn2_Brush; btnLiquidManager.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[1].Height = new GridLength(0); } //耗材管理 var LabwareManager = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuLabwareManage)); if (LabwareManager != null) { btnConsumableManager.IsEnabled = true; btnConsumableManager.Background = Brushes.Transparent; btnConsumableManager.Visibility = Visibility.Visible; } else { btnConsumableManager.IsEnabled = false; btnConsumableManager.Background = mybtn2_Brush; btnConsumableManager.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[2].Height = new GridLength(0); } //设备管理 var DeviceManager = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuDeviceManage)); if (DeviceManager != null) { btnDeviceManager.IsEnabled = true; btnDeviceManager.Background = Brushes.Transparent; btnDeviceManager.Visibility = Visibility.Visible; } else { btnDeviceManager.IsEnabled = false; btnDeviceManager.Background = mybtn2_Brush; btnDeviceManager.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[4].Height = new GridLength(0); } //实验设计 var TestDesignMenu = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuTestDesign)); if (TestDesignMenu != null) { btnTestDesign.IsEnabled = true; btnTestDesign.Background = Brushes.Transparent; btnTestDesign.Visibility = Visibility.Visible; } else { btnTestDesign.IsEnabled = false; btnTestDesign.Background = mybtn2_Brush; btnTestDesign.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[0].Height = new GridLength(0); } //菌落管理 var BacteriaMenu = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuBacteriaManage)); if (BacteriaMenu != null) { btnBacteriaManager.IsEnabled = true; btnBacteriaManager.Background = Brushes.Transparent; btnBacteriaManager.Visibility = Visibility.Visible; } else { btnBacteriaManager.IsEnabled = false; btnBacteriaManager.Background = mybtn2_Brush; btnBacteriaManager.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[3].Height = new GridLength(0); } //菌落挑选 var BacteriaChoiceMenu = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuBacteriaChoice)); if (BacteriaChoiceMenu != null) { btnBacteriaPick.IsEnabled = true; btnBacteriaPick.Background = Brushes.Transparent; btnBacteriaPick.Visibility = Visibility.Visible; } else { btnBacteriaPick.IsEnabled = false; btnBacteriaPick.Background = mybtn2_Brush; btnBacteriaPick.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[5].Height = new GridLength(0); } //实验列表 var TestListMenu = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuTestList)); if (TestListMenu != null) { btnTestList.IsEnabled = true; btnTestList.Background = Brushes.Transparent; btnTestList.Visibility = Visibility.Visible; } else { btnTestList.IsEnabled = false; btnTestList.Background = mybtn2_Brush; btnTestList.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[8].Height = new GridLength(0); } //API对接 //var APIMenu = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuAPI)); //if (APIMenu != null) //{ // btnLims.IsEnabled = true; // btnLims.Background = Brushes.Transparent; //} //else //{ // btnLims.IsEnabled = false; // btnLims.Background = mybtn2_Brush; //} //数据管理 var DataMenu = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuDataManage)); if (DataMenu != null) { btnDataManager.IsEnabled = true; btnDataManager.Background = Brushes.Transparent; btnDataManager.Visibility = Visibility.Visible; } else { btnDataManager.IsEnabled = false; btnDataManager.Background = mybtn2_Brush; btnDataManager.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[6].Height = new GridLength(0); } //审计追踪 var CheckTrackMenu = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuCheckTrack)); if (CheckTrackMenu != null) { btnAuditTrail.IsEnabled = true; btnAuditTrail.Background = Brushes.Transparent; btnAuditTrail.Visibility = Visibility.Visible; } else { btnAuditTrail.IsEnabled = false; btnAuditTrail.Background = mybtn2_Brush; btnAuditTrail.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[7].Height = new GridLength(0); } //移液报告 var MoveLiquidMenu = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuMoveLiquid)); if (MoveLiquidMenu != null) { btnMoveLiquid.IsEnabled = true; btnMoveLiquid.Background = Brushes.Transparent; btnMoveLiquid.Visibility = Visibility.Visible; if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceHXELEC)) { btnMoveLiquid.Content = Properties.Resources.strMoveColloid; } } else { btnMoveLiquid.IsEnabled = false; btnMoveLiquid.Background = mybtn2_Brush; btnMoveLiquid.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[9].Height = new GridLength(0); } //台面管理 var TabletopManageMenu = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuTabletopManage)); if (TabletopManageMenu != null) { btnTabletop.IsEnabled = true; btnTabletop.Background = Brushes.Transparent; btnTabletop.Visibility = Visibility.Visible; } else { btnTabletop.IsEnabled = false; btnTabletop.Background = mybtn2_Brush; btnTabletop.Visibility = Visibility.Collapsed; gdLeftImageList.RowDefinitions[10].Height = new GridLength(0); } //上部主菜单权限控制 //权限控制 var MenuUserManage = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuUserManage)); if (MenuUserManage != null) { btnUserManager.IsEnabled = true; btnUserManager.Visibility = Visibility.Visible; } else { btnUserManager.IsEnabled = false; btnUserManager.Visibility = Visibility.Collapsed; gridMenu.ColumnDefinitions[3].Width = new GridLength(0); } //系统设置 var MenuSystemSettingManage = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuSystemSetting)); if (MenuSystemSettingManage != null) { btnSettings.IsEnabled = true; btnSettings.Visibility = Visibility.Visible; } else { btnSettings.IsEnabled = false; btnSettings.Visibility = Visibility.Collapsed; gridMenu.ColumnDefinitions[4].Width = new GridLength(0); } } #endregion #region 启动BiosenSocketService /// /// 启动BiosenSocketService /// private void InitService() { try { string value = ConfigurationManager.AppSettings.Get("AutoService"); if (value == "true") { SocketServerManager.Init(); SocketServerManager.Start(); BiosenHttpServer.Init(); HttpServer.Init(HttpServer.GetLocalIP(), ConfigurationManager.AppSettings["socketURLPort"].ToString(), "test1.json", "启动项目是要初始化这行,才能启动访问查看WEB页面地址,这行代码不要删。" + DateTime.Now); } } catch (Exception ex) { LoggerHelper.ErrorLog("System error:" + ex.Source + ":" + ex.Message.ToString()); } } #endregion #region 建立成像的通信连接 public void connectToCaptureAndCControl() { try { if (ConfigurationManager.AppSettings["openTakePhoto"].ToString() == "true") { Task.Run(() => { bool bResult = socketTcpListener.connectServer(ConfigurationManager.AppSettings["socketClientIP"].ToString(), Convert.ToInt32(ConfigurationManager.AppSettings["socketClientPort"]));//启动成像系统通信服务 if (bResult) { LoggerHelper.InfoLog("Capture system was successfully connected!"); } else { System.Windows.Application.Current.Dispatcher.Invoke(new Action(() => { PlsToolTipWin plsToolTipWin = new PlsToolTipWin("相机系统设备通信失败!"); plsToolTipWin.Height = this.ActualHeight; plsToolTipWin.Width = this.ActualWidth; SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0)); plsToolTipWin.Background = (System.Windows.Media.Brush)mybtn1_Brush; plsToolTipWin.btnCancel.Visibility = Visibility.Hidden; plsToolTipWin.ShowDialog(); })); LoggerHelper.InfoLog("Capture system was failed connected!"); } }); heartConnectTimer = new System.Threading.Timer(heartConnectTimer_Tick, null, 0, 1000); } checkConnectTimer.Start(); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } } #endregion #region 初始化链接设备 public void InitializeDevice() { try { HxResult ret = MethodAction.Instance.Initialize(); wasExecuteInitial = true; this.Dispatcher.Invoke(new Action(() => { if (ret.Result != ResultType.Success) { // 状态0 未链接 黄闪 ret = CommonBll.StatusLamp(0, false); EnableSimulator = true; connectedEquip = false; } else { // 状态1 链接成功 蓝亮 ret = CommonBll.StatusLamp(1, false); string TargetPath = "Assets/connect.png"; imgDeviceStatus.Source = new BitmapImage(new Uri(TargetPath, UriKind.Relative)); connectedEquip = true; // 连接设备初始化后 DoAfterInitDevice(); } })); //checkConnectTimer.Start(); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } } /// /// 连接设备初始化后 /// private void DoAfterInitDevice() { #region 自动打开FFU、LED、UV等模块 // 软件启动自动打开FFU HxResult ret = MethodAction.Instance.FFU(EnumManagement.GetEnumValue(DeviceStateModeEnum.TurnOn)); #endregion #region 设置全局速度 MethodAction.Instance.GlobalSpeed = Shared.SoftwareInformation.global_speed; #endregion } #endregion #region 取消登录事件 private void login_closeEvent(object sender, EventArgs e) { this.Close(); } #endregion #region 右上角退出重新登录按钮 private void btnRelogin_Click(object sender, RoutedEventArgs e) { PlsToolTipWin plsToolTipWin = new PlsToolTipWin("确定要注销登录吗?"); plsToolTipWin.ShowDialog(); if (plsToolTipWin.DialogResult != true) { return; } rootGrid.Visibility = Visibility.Collapsed; loginGrid.Visibility = Visibility.Visible; OperateAuditLogDB.AddOperateAuditLogIntodb(operateAuditLogBll.GenerateOperateAuditLog("注销退出", "用户:" + Shared.User.username + "注销退出系统", Shared.User.username, "登录模块", "", "", "用户[id:" + Shared.User.username + "]", "成功")); if (runWnd != null) { if (RunWnd.IsRunning) { runWnd.btnPause_Click(sender, null); } } } #endregion #region 右上角最小化窗口按钮事件 private void btnMinimize_Click(object sender, RoutedEventArgs e) { WindowState = WindowState.Minimized; } #endregion #region 右上角关闭软件按钮事件 private void btnQuit_Click(object sender, RoutedEventArgs e) { try { PlsToolTipWin plsToolTipWin = new PlsToolTipWin("确定要退出系统吗?"); plsToolTipWin.ShowDialog(); if (plsToolTipWin.DialogResult != true) { OperateAuditLogDB.AddOperateAuditLogIntodb(operateAuditLogBll.GenerateOperateAuditLog("退出", "用户:" + Shared.User.username + "退出系统", Shared.User.username, "登录模块", "", "", "用户[id:" + Shared.User.username + "]", "成功")); return; } this.Close(); Application.Current.Shutdown(); Environment.Exit(0); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); OperateAuditLogDB.AddOperateAuditLogIntodb(operateAuditLogBll.GenerateOperateAuditLog("退出", "用户:" + Shared.User.username + "退出系统", Shared.User.username, "登录模块", "", "", "用户[id:" + Shared.User.username + "]", "异常失败")); } } #endregion #region 切换左侧主菜单按钮事件 public void radioButton_Checked(object sender, RoutedEventArgs e) { firstPagePressed = false; btnStartFirstPage.IsChecked = false; btnFirst.Visibility = Visibility.Hidden; btnUserManager.IsChecked = false; btnUser.Visibility = Visibility.Hidden; RadioButton btn = (RadioButton)sender; switch (btn.Name) { case "btnTestDesign": // 实验设计 btnOpen.IsEnabled = true; ShowTestDesign(); SetTopMenuByRole(btnTestDesign); break; case "btnConsumableManager": // 耗材管理 ShowConsumableManagement(); SetTopMenuByRole(btnConsumableManager); break; case "btnLiquidManager": // 液体管理 ShowLiquidManagement(); SetTopMenuByRole(btnLiquidManager); break; case "btnBacteriaManager": // 菌落管理 ShowBacteriaManagement(); SetTopMenuByRole(btnBacteriaManager); break; case "btnBacteriaPick": // 菌落挑选 ShowBacteriaPickResult(); SetTopMenuByRole(btnBacteriaPick); break; case "btnDeviceManager": // 设备管理 ShowDeviceManagement(); SetTopMenuByRole(btnDeviceManager); break; case "btnDataManager": ShowDataLogList(); SetTopMenuByRole(btnDataManager); break; case "btnAuditTrail": ShowOperateAuditList(); SetTopMenuByRole(btnAuditTrail); break; case "btnTestList": ShowTestList(); //实验列表 SetTopMenuByRole(btnTestList); break; case "btnMoveLiquid": ShowMoveLiquidReport(); //移液报告 SetTopMenuByRole(btnMoveLiquid); break; case "btnTabletop": ShowTabletopTemplate(); //台面模板 SetTopMenuByRole(btnTabletop); break; default: break; } } #endregion #region 根据用户角色权限设置顶部菜单 public void SetTopMenuByRole(ImageRadioButton imageRadioButton) { try { string userid = UserDB.GetUserInfByUserName(Shared.User.username).id; //所有菜单 List roleMenuAllList = UserDB.GetWholeRoleMenuByUserId(userid); //权限控制 var MenuSystemSetting = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(imageRadioButton.Content.ToString())); if (MenuSystemSetting != null) { if (MenuSystemSetting.rolemenuchildren != null) { var SubMenuNew = MenuSystemSetting.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuNew)); if (SubMenuNew != null) { btnNew.Visibility = Visibility.Visible; btnNew.IsEnabled = true; //gridOperMenu.ColumnDefinitions[0].Width = new GridLength(80); } else { btnNew.Visibility = Visibility.Collapsed; //gridOperMenu.ColumnDefinitions[0].Width = new GridLength(0); } var SubMenuOpen = MenuSystemSetting.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuOpen)); if (SubMenuOpen != null) { btnOpen.Visibility = Visibility.Visible; //gridOperMenu.ColumnDefinitions[1].Width = new GridLength(80); } else { btnOpen.Visibility = Visibility.Collapsed; //gridOperMenu.ColumnDefinitions[1].Width = new GridLength(0); } var SubMenuSave = MenuSystemSetting.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuSave)); if (SubMenuSave != null) { btnSave.Visibility = Visibility.Visible; //gridOperMenu.ColumnDefinitions[2].Width = new GridLength(80); } else { btnSave.Visibility = Visibility.Collapsed; //gridOperMenu.ColumnDefinitions[2].Width = new GridLength(0); } var SubMenuAsSave = MenuSystemSetting.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuAsSave)); if (SubMenuAsSave != null) { btnSaveAs.Visibility = Visibility.Visible; //gridOperMenu.ColumnDefinitions[3].Width = new GridLength(80); } else { btnSaveAs.Visibility = Visibility.Collapsed; //gridOperMenu.ColumnDefinitions[3].Width = new GridLength(0); } } } } catch (Exception ex) { LoggerHelper.ErrorLog("Error", ex); } } #endregion #region 主内容区域显示--台面模板 private void ShowTabletopTemplate() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (tabletopManagement == null) { tabletopManagement = new TabletopManagement(); tabletopManagement.mainWindow = this; gridContent.Children.Add(tabletopManagement); } else { gridContent.Children.Add(tabletopManagement); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = true; } #endregion #region 主内容区域显示——审计界面 private void ShowOperateAuditList() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (operateAuditList == null) { operateAuditList = new OperateAuditList(); gridContent.Children.Add(operateAuditList); } else { gridContent.Children.Add(operateAuditList); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = false; } #endregion #region 主内容区域显示——数据界面 private void ShowDataLogList() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (dataLogList == null) { dataLogList = new DataLogList(); gridContent.Children.Add(dataLogList); } else { gridContent.Children.Add(dataLogList); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = false; } #endregion #region 主内容区域显示——实验列表界面 private void ShowTestList() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (experimentFolder == null) { experimentFolder = new ExperimentFolder(); experimentFolder.mainWindow = this; gridContent.Children.Add(experimentFolder); } else { gridContent.Children.Add(experimentFolder); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = false; } #endregion #region 主内容区域显示——移液报告界面 private void ShowMoveLiquidReport() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (moveLiquidResult == null) { moveLiquidResult = new MoveLiquidResult(); moveLiquidResult.mainWindow = this; gridContent.Children.Add(moveLiquidResult); } else { gridContent.Children.Add(moveLiquidResult); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = false; } #endregion #region 主内容区域显示——菌落挑选结果界面 private void ShowBacteriaPickResult() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (bacteriaPickResult == null) { bacteriaPickResult = new BacteriaPickResult(); gridContent.Children.Add(bacteriaPickResult); } else { gridContent.Children.Add(bacteriaPickResult); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = false; } #endregion #region 主内容区域显示——菌落管理界面 private void ShowBacteriaManagement() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (bacteriaManagement == null) { bacteriaManagement = new BacteriaManagement(); gridContent.Children.Add(bacteriaManagement); } else { gridContent.Children.Add(bacteriaManagement); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = true; } #endregion #region 主内容区域显示——台面模板管理界面 private void ShowTabletopTemplateManagement() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (tabletopManagement == null) { tabletopManagement = new TabletopManagement(); gridContent.Children.Add(tabletopManagement); } else { gridContent.Children.Add(tabletopManagement); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = true; } #endregion #region 主内容区域显示——实验设计界面 public void ShowTestDesign() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (testDesign == null) { testDesign = new TestDesign(); gridContent.Children.Add(testDesign); } else { gridContent.Children.Add(testDesign); } gridControl.IsEnabled = true; gridOperMenu.IsEnabled = true; } #endregion #region 主内容区域显示——耗材管理界面 private void ShowConsumableManagement() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (consumableManagement == null) { consumableManagement = new ConsumableManagement(); gridContent.Children.Add(consumableManagement); } else { gridContent.Children.Add(consumableManagement); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = true; //权限控制 var MenuLabwareManage = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuLabwareManage)); if (MenuLabwareManage != null) { var MenuLabwareNew = MenuLabwareManage.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuNew)); if (MenuLabwareNew != null) { btnNew.IsEnabled = true; } else { btnNew.IsEnabled = false; } var MenuLabwareOpen = MenuLabwareManage.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuOpen)); if (MenuLabwareOpen != null) { btnOpen.IsEnabled = true; } else { btnOpen.IsEnabled = false; } var MenuLabwareSave = MenuLabwareManage.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuSave)); if (MenuLabwareSave != null) { btnSave.IsEnabled = true; } else { btnSave.IsEnabled = false; } var MenuLabwareAsSave = MenuLabwareManage.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuAsSave)); if (MenuLabwareAsSave != null) { btnSaveAs.IsEnabled = true; } else { btnSaveAs.IsEnabled = false; } } } #endregion #region 主内容区域显示——设备管理界面 private void ShowDeviceManagement() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (deveiceManagement == null) { deveiceManagement = new DeveiceManagement(); gridContent.Children.Add(deveiceManagement); } else { gridContent.Children.Add(deveiceManagement); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = false; } #endregion #region 主内容区域显示——液体管理界面 private void ShowLiquidManagement() { if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (liquidManagement == null) { liquidManagement = new LiquidManagement(roleMenuAllList); gridContent.Children.Add(liquidManagement); } else { gridContent.Children.Add(liquidManagement); } gridControl.IsEnabled = false; gridOperMenu.IsEnabled = true; //权限控制 var MenuLiquidManage = roleMenuAllList.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.MenuLiquidManage)); if (MenuLiquidManage != null) { var MenuLiquidNew = MenuLiquidManage.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuNew)); if (MenuLiquidNew != null) { btnNew.IsEnabled = true; } else { btnNew.IsEnabled = false; } var MenuLiquidOpen = MenuLiquidManage.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuOpen)); if (MenuLiquidOpen != null) { btnOpen.IsEnabled = true; } else { btnOpen.IsEnabled = false; } var MenuLiquidSave = MenuLiquidManage.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuSave)); if (MenuLiquidSave != null) { btnSave.IsEnabled = true; } else { btnSave.IsEnabled = false; } var MenuLiquidAsSave = MenuLiquidManage.rolemenuchildren.FirstOrDefault(x => x.rolemenuname.Equals(MenuName.SubMenuAsSave)); if (MenuLiquidAsSave != null) { btnSaveAs.IsEnabled = true; } else { btnSaveAs.IsEnabled = false; } } } #endregion #region 主菜单——用户管理按钮事件 private void btnUserManager_Click(object sender, RoutedEventArgs e) { firstPagePressed = false; btnStartFirstPage.IsChecked = false; btnUser.Visibility = Visibility.Visible; btnFirst.Visibility = Visibility.Hidden; if (gridContent.Children.Count > 0) { gridContent.Children.RemoveAt(gridContent.Children.Count - 1); } List listBtn = ViewCom.GetChildObjects((DependencyObject)gdLeftImageList, typeof(ImageRadioButton)); if (listBtn.Count > 0) { foreach (ImageRadioButton i in listBtn) { if (i.IsChecked == true) { i.IsChecked = false; } } } UserManagerment um = new UserManagerment(Shared.User.id); um.closeEvent += SubContent_closeEvent; gridContent.Children.Add(um); gridControl.IsEnabled = false; gridOperMenu.IsEnabled = false; } #endregion #region 主菜单——用户管理关闭按钮事件 private void UC_closeEvent(object sender, EventArgs e) { Window wnd = Application.Current.MainWindow; Grid grid = Utilities.FindVisualChild(wnd); UIElement element = sender as UIElement; grid.Children.Remove(element); } #endregion #region 主界面保存按钮事件 /// /// 主界面保存按钮事件 /// 判断当前选中的是哪个主菜单 /// 由主菜单,判断保存的对象是耗材、液体、还是流程方法 /// /// /// private void btnSave_Click(object sender, RoutedEventArgs e) { try { if (btnTestDesign.IsChecked == true) { // 实验设计 SaveTest(); } else if (btnConsumableManager.IsChecked == true) { // 耗材管理 consumableManagement.SaveConsumable(); SetObserverNode(testDesign.rootMethod); if (!consumableManagement.observers.Contains(testDesign)) { consumableManagement.AddObserver(testDesign); } consumableManagement.Update(); } else if (btnLiquidManager.IsChecked == true) { // 液体管理 liquidManagement.SaveLiquid(); SetObserverNode(testDesign.rootMethod); liquidManagement.Update(); } else if (btnBacteriaManager.IsChecked == true) { // 菌落管理 bacteriaManagement.SaveBacteria(); } else if (btnTabletop.IsChecked == true) { // 台面模板保存 tabletopManagement.SaveTabletopTemplate(); } } catch (Exception ex) { ShowTip.ShowNotice(string.Format("{0}失败{1}{2}", "保存", Environment.NewLine, ex.Message.ToString()), InfoType.Warning); } } /// /// 设置耗材观察者对象的进入被观察者数据集 /// /// 实验设计现有的方法节点树对象 public void SetObserverNode(MethodEx method) { int iNum = new MethodListBll().getNumByMethodName(method.method_name); switch (iNum) { case (int)MethodNameEnum.griptransport: // 抓板转移 { var obj = method.control as GripTransportProperty; if (obj != null) { if (consumableManagement != null) { if (!consumableManagement.observers.Contains(obj)) { consumableManagement.AddObserver(obj); } } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.holdingLabware: // 夹爪保持开始 { var obj = method.control as BeginHoldingLabwareProperty; if (obj != null) { if (consumableManagement != null) { if (!consumableManagement.observers.Contains(obj)) { consumableManagement.AddObserver(obj); } } if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.endHoldingLabware: // 夹爪保持结束 { var obj = method.control as EndHoldingLabwareProperty; if (obj != null) { if (consumableManagement != null) { if (!consumableManagement.observers.Contains(obj)) { consumableManagement.AddObserver(obj); } } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.loadtips: // 安装吸头 { var obj = method.control as LoadTipsProperty; if (obj != null) { if (consumableManagement != null) { if (!consumableManagement.observers.Contains(obj)) { consumableManagement.AddObserver(obj); } } if (systemSettings != null) { if (!systemSettings.observers.Contains(obj)) { systemSettings.AddObserver(obj); } } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.unloadtips: //卸载吸头 { var obj = method.control as LoadTipsProperty; if (obj != null) { if (systemSettings != null) { if (!systemSettings.observers.Contains(obj)) { systemSettings.AddObserver(obj); } } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.transferfile: // 文件 { var obj = method.control as FileProperty; if (obj != null) { if (consumableManagement != null) { if (!consumableManagement.observers.Contains(obj)) { consumableManagement.AddObserver(obj); } } if (systemSettings != null) { if (!systemSettings.observers.Contains(obj)) { systemSettings.AddObserver(obj); } } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.aspirate: // 吸液 { var obj = method.control as AspirateProperty; if (obj != null) { if (liquidManagement != null) { if (!liquidManagement.observers.Contains(obj)) { liquidManagement.AddObserver(obj); } } if (!testDesign.observers.Contains(obj)) { testDesign.AddObserver(obj); } if (systemSettings != null) { if (!systemSettings.observers.Contains(obj)) { systemSettings.AddObserver(obj); } } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.dispense: // 排液 { var obj = method.control as DispenseProperty; if (obj != null) { if (liquidManagement != null) { if (!liquidManagement.observers.Contains(obj)) { liquidManagement.AddObserver(obj); } } if (!testDesign.observers.Contains(obj)) { testDesign.AddObserver(obj); } if (systemSettings != null) { if (!systemSettings.observers.Contains(obj)) { systemSettings.AddObserver(obj); } } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.mixing: // 混合 { var obj = method.control as MixProperty; if (obj != null) { if (liquidManagement != null) { if (!liquidManagement.observers.Contains(obj)) { liquidManagement.AddObserver(obj); } } if (!testDesign.observers.Contains(obj)) { testDesign.AddObserver(obj); } if (systemSettings != null) { if (!systemSettings.observers.Contains(obj)) { systemSettings.AddObserver(obj); } } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.dilution: // 梯度稀释 { var obj = method.control as DilutionProperty; if (obj != null) { if (liquidManagement != null) { if (!liquidManagement.observers.Contains(obj)) { liquidManagement.AddObserver(obj); } } if (!testDesign.observers.Contains(obj)) { testDesign.AddObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.waitFor: // 等待 { var obj = method.control as WaitforProperty; if (obj != null) { if (!testDesign.observerTimers.Contains(obj)) { testDesign.AddObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; default: { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } break; } } /// /// 耗材观察者对象的移除出被观察者数据集 /// /// 实验设计现有的方法节点树对象 public void RemoveObserverNode(MethodEx method) { int iNum = new MethodListBll().getNumByMethodName(method.method_name); switch (iNum) { case (int)MethodNameEnum.griptransport: // 抓板转移 { var obj = method.control as GripTransportProperty; if (obj != null) { if (consumableManagement.observers.Contains(obj)) { consumableManagement.RemoveObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.holdingLabware: // 夹爪保持开始 { var obj = method.control as BeginHoldingLabwareProperty; if (obj != null) { if (consumableManagement.observers.Contains(obj)) { consumableManagement.RemoveObserver(obj); } if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.endHoldingLabware: // 夹爪保持结束 { var obj = method.control as EndHoldingLabwareProperty; if (obj != null) { if (consumableManagement.observers.Contains(obj)) { consumableManagement.RemoveObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.loadtips: // 安装吸头 { var obj = method.control as LoadTipsProperty; if (obj != null) { if (consumableManagement.observers.Contains(obj)) { consumableManagement.RemoveObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.transferfile: // 文件 { var obj = method.control as FileProperty; if (obj != null) { if (consumableManagement.observers.Contains(obj)) { consumableManagement.RemoveObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.aspirate: // 吸液 { var obj = method.control as AspirateProperty; if (obj != null) { if (liquidManagement != null) { if (liquidManagement.observers.Contains(obj)) { liquidManagement.RemoveObserver(obj); } } if (testDesign.observers.Contains(obj)) { testDesign.RemoveObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.dispense: // 排液 { var obj = method.control as DispenseProperty; if (obj != null) { if (liquidManagement != null) { if (liquidManagement.observers.Contains(obj)) { liquidManagement.RemoveObserver(obj); } } if (testDesign.observers.Contains(obj)) { testDesign.RemoveObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.mixing: // 混合 { var obj = method.control as MixProperty; if (obj != null) { if (liquidManagement != null) { if (liquidManagement.observers.Contains(obj)) { liquidManagement.RemoveObserver(obj); } } if (testDesign.observers.Contains(obj)) { testDesign.RemoveObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.dilution: // 梯度稀释 { var obj = method.control as DilutionProperty; if (obj != null) { if (liquidManagement != null) { if (liquidManagement.observers.Contains(obj)) { liquidManagement.RemoveObserver(obj); } } if (testDesign.observers.Contains(obj)) { testDesign.RemoveObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; case (int)MethodNameEnum.waitFor: // 梯度稀释 { var obj = method.control as WaitforProperty; if (obj != null) { if (testDesign.observerTimers.Contains(obj)) { testDesign.RemoveObserver(obj); } } else { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } } break; default: { if (method.Children.Count > 0) { foreach (var m in method.Children) { SetObserverNode(m); } } } break; } } #region 保存实验 /// /// 保存实验 /// private void SaveTest() { if (string.IsNullOrEmpty(CurWorkFlowName)) { Window wnd = Application.Current.MainWindow; Grid grid = Utilities.FindVisualChild(wnd); SaveMethodDlg saveDlg = new SaveMethodDlg(); saveDlg.closeEvent += SubWnd_closeEvent; saveDlg.saveEvent += SaveDlg_saveEvent; grid.Children.Add(saveDlg); } else { //PlsToolTipWin plsToolTipWin = new PlsToolTipWin("Do you want to cover this workflow?"); PlsToolTipWin plsToolTipWin = new PlsToolTipWin("保存当前实验流程?"); plsToolTipWin.Height = this.ActualHeight; plsToolTipWin.Width = this.ActualWidth; SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(0, 0, 0, 0)); plsToolTipWin.Background = (System.Windows.Media.Brush)mybtn1_Brush; plsToolTipWin.ShowDialog(); if (plsToolTipWin.DialogResult == true) { SaveWorkflow(CurWorkFlowName); } } } #endregion #endregion #region 主菜单——保存事件 private void SaveDlg_saveEvent(object sender, EventArgs e) { SaveMethodDlg saveDlg = (SaveMethodDlg)sender; CurWorkFlowName = saveDlg.methodFullPath; SaveWorkflow(CurWorkFlowName); Window wnd = Application.Current.MainWindow; Grid grid = Utilities.FindVisualChild(wnd); UIElement element = sender as UIElement; grid.Children.Remove(element); } #endregion #region 主菜单——保存实验流程方法 /// /// 主菜单——保存实验流程方法 /// /// 保存的全路径 /// 是否另存 private void SaveWorkflow(string name, bool isSaveAs = false) { // 构建xml信息 XmlHelper xmlHelper = new XmlHelper(); xmlHelper.xmlDoc = testDesign.GenerateLaunchXmlDocument(); //// 流程运行前备份env数据 //xmlEnvBak = xmlHelper.xmlDoc.SelectSingleNode("root/env").Clone(); // 保存方法xml对象 bool bIsOk = xmlHelper.SaveXml(name); if (bIsOk) { ShowTip.ShowNotice(string.Format("{0}成功{1}{2}", isSaveAs ? "另存" : "保存", Environment.NewLine, name), InfoType.Success); CurWorkFlowName = name; tbCaption.Text = Properties.Resources.strXHandler + " - " + CurWorkFlowName; Experiment experimentList = new Experiment(); experimentList.experimentid = DateTime.Now.ToString("yyyyMMddHHmmss"); string strNameOfFile = CurWorkFlowName.Substring(CurWorkFlowName.LastIndexOf('\\') + 1, CurWorkFlowName.Length - CurWorkFlowName.LastIndexOf('\\') - 1); experimentList.experimentname = strNameOfFile.Substring(0, strNameOfFile.LastIndexOf(".")); experimentList.experimentxmlcontent = xmlHelper.xmlDoc.InnerXml.ToString(); experimentList.experimentfile = name; experimentList.createtime = DateTime.Now; experimentList.status = 1; experimentList.updatetime = DateTime.Now; ExperimentListDB.AddExperiment(experimentList); } else { ShowTip.ShowNotice(string.Format("{0}失败{1}{2}", isSaveAs ? "另存" : "保存", Environment.NewLine, name), InfoType.Warning); } } #endregion #region 主菜单——新建事件 private void btnNew_Click(object sender, RoutedEventArgs e) { if (btnLiquidManager.IsChecked == true) { Window wnd = Application.Current.MainWindow; Grid parent = Utilities.FindVisualChild(wnd); NewLiquid newLiquid = new NewLiquid(); newLiquid.closeEvent += SubWnd_closeEvent; newLiquid.mainWindow = this; //newLiquid.OKEvent += NewLiquidType_OKEvent; parent.Children.Add(newLiquid); } else if (btnConsumableManager.IsChecked == true) { Window wnd = Application.Current.MainWindow; Grid parent = Utilities.FindVisualChild(wnd); NewConsumable newConsumable = new NewConsumable(); newConsumable.closeEvent += SubWnd_closeEvent; newConsumable.OKEvent += NewConsumable_OKEvent; parent.Children.Add(newConsumable); } else if (btnBacteriaManager.IsChecked == true) { Window wnd = Application.Current.MainWindow; Grid parent = Utilities.FindVisualChild(wnd); NewBacteria newBacteria = new NewBacteria(); newBacteria.closeEvent += SubWnd_closeEvent; newBacteria.OKEvent += NewBacteria_OKEvent; parent.Children.Add(newBacteria); } else if (btnTabletop.IsChecked == true) //新建台面模板 { Window wnd = Application.Current.MainWindow; Grid parent = Utilities.FindVisualChild(wnd); NewTabletopTemplate newTabletopTemplate = new NewTabletopTemplate(); newTabletopTemplate.closeEvent += SubWnd_closeEvent; newTabletopTemplate.OKEvent += NewTabletopTemplate_OKEvent; parent.Children.Add(newTabletopTemplate); } else if (btnTestDesign.IsChecked == true) { if (testDesign.rootMethod.Children.Count > 3) { PlsToolTipWin plsToolTipWin = new PlsToolTipWin("当前实验未保存,是否保存?"); plsToolTipWin.Height = this.ActualHeight; plsToolTipWin.Width = this.ActualWidth; SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0)); plsToolTipWin.Background = (System.Windows.Media.Brush)mybtn1_Brush; plsToolTipWin.ShowDialog(); if (plsToolTipWin.DialogResult == true) { SaveTest(); } else { gridContent.Children.RemoveAt(gridContent.Children.Count - 1); } } testDesign = new TestDesign(); gridContent.Children.Add(testDesign); tbCaption.Text = Properties.Resources.strXHandler; CurWorkFlowName = string.Empty; if (consumableManagement != null) { consumableManagement.observers.Clear(); } } } #endregion #region 主菜单——新建菌落界面确定按钮事件 private void NewBacteria_OKEvent(object sender, CustomRoutedEventArgs e) { string name = e.param as string; Bacteria bacteria = bacteriaManagement.AddNewBacteria(name); if (bacteria != null) { bacteriaManagement.listboxBacteria.SelectedItem = bacteria; } SubWnd_closeEvent(sender, null); } #endregion #region 主菜单——新建台面模板界面确定按钮事件 private void NewTabletopTemplate_OKEvent(object sender, CustomRoutedEventArgs e) { string name = e.param as string; TabletopTemplate tabletopTemplate = tabletopManagement.AddNewTabletopTemplate(name); if (tabletopTemplate != null) { tabletopManagement.lbxTabletopList.SelectedItem = tabletopTemplate; } SubWnd_closeEvent(sender, null); } #endregion #region 主菜单——检查方法属性事件 private void btnCheck_Click(object sender, RoutedEventArgs e) { firstPagePressed = false; btnStartFirstPage.IsChecked = false; btnFirst.Visibility = Visibility.Hidden; btnUserManager.IsChecked = false; btnUser.Visibility = Visibility.Hidden; if (btnTestDesign.IsChecked == true) { XmlHelper xmlHelper = new XmlHelper(); //从方法中获取列表方法,并构建xml进行保存 xmlHelper.xmlDoc = testDesign.GenerateLaunchXmlDocument(); MethodListBll methodListBll = new MethodListBll(); DataCheckResult dr = methodListBll.CheckWorkFlow(xmlHelper.xmlDoc); if (dr.result == 1) { string strError = string.Empty; for (int i = 0; i < dr.errorlist.Count; i++) { if (i == dr.errorlist.Count - 1) { strError += dr.errorlist[i]; } else { strError += dr.errorlist[i] + "\r\n"; } } if (testDesign.checkPropertyBreak == true) { testDesign.checkPropertyBreak = false; } else { PlsSetProperty plsSetProperty = new PlsSetProperty(strError); plsSetProperty.closeEvent += PlsSetProperty_closeEvent; Window wnd = Application.Current.MainWindow; Grid parent = Utilities.FindVisualChild(wnd); parent.Children.Add(plsSetProperty); } } } } private void PlsSetProperty_closeEvent(object sender, EventArgs e) { Window wnd = Application.Current.MainWindow; Grid grid = Utilities.FindVisualChild(wnd); UIElement element = sender as UIElement; grid.Children.Remove(element); } #endregion #region 模拟运行 public void btnSimulator_Click(object sender, RoutedEventArgs e) { EnableSimulator = true; if (btnTestDesign.IsChecked == true) { ShowRunResult(); btnOpen.IsEnabled = false; } } #endregion #region 真实运行 public void btnRun_Click(object sender, RoutedEventArgs e) { //if (connectedEquip) { EnableSimulator = false; if (btnTestDesign.IsChecked == true) { ShowRunResult(); } btnOpen.IsEnabled = false; } //else //{ // PlsToolTipWin plsToolTipWin = new PlsToolTipWin("设备未连接!"); // plsToolTipWin.Height = this.ActualHeight; // plsToolTipWin.Width = this.ActualWidth; // SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0)); // plsToolTipWin.Background = (System.Windows.Media.Brush)mybtn1_Brush; // plsToolTipWin.btnCancel.Visibility = Visibility.Hidden; // plsToolTipWin.ShowDialog(); //} } #endregion #region 运行界面显示 public void ShowRunResult() { // 添加运行的内容 MethodEx method = testDesign.GetWorkFlow(); if (method == null) { return; } XmlHelper xmlHelper = new XmlHelper(); // 从方法中获取列表方法,并构建xml进行保存 xmlHelper.xmlDoc = testDesign.GenerateLaunchXmlDocument(); // 保存住非运行的内容 if (gridMainContent.Children.Count > 0) { uIElement = gridMain; //gridMainContent.Children.RemoveAt(gridMainContent.Children.Count - 1); gridMainContent.Children.RemoveAt(0); } List list = testDesign.GetLabwaresOnTable(); if (RunWnd.hadRun) { if (EnableSimulator) { runWnd.tbxRunTitle.Text = "模拟运行"; } else { runWnd.tbxRunTitle.Text = "真机运行"; } // gridMainContent.Children.Add(runWnd); gridMainContent.Children.Insert(0, runWnd); return; } runWnd = new RunWnd(list, method, EnableSimulator, xmlHelper.xmlDoc); runWnd.mainWindow = this; if (EnableSimulator) { //runWnd.tbxRunTitle.Text = "模拟运行"; } // gridMainContent.Children.Add(runWnd); gridMainContent.Children.Insert(0, runWnd); } #endregion #region 运行时最新的methode的xml对象 /// /// 运行时最新的methode的xml对象 /// /// public XmlDocument RefreshRunXml() { XmlHelper xmlHelper = new XmlHelper(); //从方法中获取列表方法,并构建xml进行保存 xmlHelper.xmlDoc = testDesign.GenerateLaunchXmlDocument(); return xmlHelper.xmlDoc; } #endregion #region 刷新显示界面 public void RefreshRunResult() { // 添加运行的内容 MethodEx method = testDesign.GetWorkFlow(); if (method == null) { return; } XmlHelper xmlHelper = new XmlHelper(); // 从方法中获取列表方法,并构建xml进行保存 xmlHelper.xmlDoc = testDesign.GenerateLaunchXmlDocument(); // 保存住非运行的内容 if (gridMainContent.Children.Count > 0) { uIElement = gridMain; } if (runWnd != null) { List list = testDesign.GetLabwaresOnTable(); runWnd.RunWndRefresh(list, method, EnableSimulator, xmlHelper.xmlDoc); } } #endregion #region 新建耗材点击ok事件 private void NewConsumable_OKEvent(object sender, CustomRoutedEventArgs e) { Labware labware = e.param as Labware; consumableManagement.AddNewLabware(labware); SetObserverNode(testDesign.rootMethod); consumableManagement.Update(); SubWnd_closeEvent(sender, null); } #endregion #region 用户管理close事件 private void SubContent_closeEvent(object sender, EventArgs e) { UIElement element = sender as UIElement; gridContent.Children.Remove(element); } #endregion #region 保存方法 输入方法名Dialog取消事件 private void SubWnd_closeEvent(object sender, EventArgs e) { Window wnd = Application.Current.MainWindow; Grid grid = Utilities.FindVisualChild(wnd); UIElement element = sender as UIElement; grid.Children.Remove(element); } #endregion #region 主菜单——打开界面按钮事件 public bool isOpenning = false;//是否正打开实验 private void btnOpen_Click(object sender, RoutedEventArgs e) { methodExes.Clear(); methodExesForGroup.Clear(); try { if (btnLiquidManager.IsChecked == true) { // 打开文件加载液体配置 } else if (btnConsumableManager.IsChecked == true) { // 打开文件加载耗材配置 } else if (btnTestDesign.IsChecked == true) { #region 打开界面 OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = "选择一个文件"; openFileDialog.Multiselect = false; openFileDialog.Filter = @"method文件|*.xmed|所有文件|*.*"; if (openFileDialog.ShowDialog(this) == true) { isOpenning = true; rootGridTitle.RowDefinitions[1].Height = new GridLength(3); //pBarProgress.IsIndeterminate = true; //pBarProgress.Value = 0; //this.Cursor = Cursors.Wait; Mouse.OverrideCursor = Cursors.Wait; #region 清空设计区 if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (testDesign != null) { foreach (Canvas canvas in testDesign.gridTable.Children) { if (canvas != null) { for (int i = canvas.Children.Count - 1; i > 0; i--) { string objectName = canvas.Children[i].GetType().Name; if (objectName == "ControlLabware") { if ((canvas.Children[i] as ControlLabware).IsTrash) { } else { //if(Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceHXELEC)) //{ // if(canvas.Name.Equals("P1")) // { // continue; // } //} canvas.Children.RemoveAt(i); } } else { canvas.Children.RemoveAt(i); } } canvas.Tag = null; } } ObservableCollection methods = MethodDB.GetMethodFromdb(Shared.SoftwareInformation.software_device_number); testDesign.InitializeWorkFlow(methods); } else { testDesign = new TestDesign(); } gridContent.Children.Add(testDesign); if (consumableManagement != null) { consumableManagement.observers.Clear(); } #endregion CurWorkFlowName = string.Empty; CurWorkFlowName = openFileDialog.FileName; tbCaption.Text = Properties.Resources.strXHandler + " - " + CurWorkFlowName; #region 绑定数据 XmlHelper xmlHelper = new XmlHelper(); xmlHelper.xmlDoc.Load(CurWorkFlowName); //UpdateProgress(pBarProgress, 1); // 绑定台面 BindSetLatticesDataOnUI(xmlHelper.xmlDoc); //UpdateProgress(pBarProgress, 2); //Task.Run(() => //{ // 绑定命令集 BindWorkFlowIntoTree(xmlHelper.xmlDoc); //}); // 流程运行前备份env数据 //xmlEnvBak = xmlHelper.xmlDoc.SelectSingleNode("root/env").Clone(); #endregion } #endregion } } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } finally { //this.Cursor = Cursors.Arrow; //rootGridTitle.RowDefinitions[1].Height = new GridLength(0); } } #endregion #region 更新进度条进度值 public void UpdateProgress(int newValue) { // 更新UI元素时需要确保是在UI线程中执行 this.Dispatcher.Invoke(() => { pBarProgress.Value = newValue; }); } #endregion #region 在实验列表功能中,选中一个方法打开 public void OpenAndLoadMethod(string fileContent) { try { //#region 清空设计区 //if (gridContent.Children.Count > 0) // gridContent.Children.RemoveAt(gridContent.Children.Count - 1); //testDesign = new TestDesign(); //gridContent.Children.Add(testDesign); //#endregion #region 清空设计区 if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); if (testDesign != null) { foreach (Canvas canvas in testDesign.gridTable.Children) { if (canvas != null) { for (int i = canvas.Children.Count - 1; i > 0; i--) { string objectName = canvas.Children[i].GetType().Name; if (objectName == "ControlLabware") { if ((canvas.Children[i] as ControlLabware).IsTrash) { } else { canvas.Children.RemoveAt(i); } } else { canvas.Children.RemoveAt(i); } } canvas.Tag = null; } } ObservableCollection methods = MethodDB.GetMethodFromdb(Shared.SoftwareInformation.software_device_number); testDesign.InitializeWorkFlow(methods); } else { testDesign = new TestDesign(); } gridContent.Children.Add(testDesign); if (consumableManagement != null) { consumableManagement.observers.Clear(); } #endregion XmlHelper xmlHelper = new XmlHelper(); xmlHelper.xmlDoc.LoadXml(fileContent); //绑定台面 BindSetLatticesDataOnUI(xmlHelper.xmlDoc); //绑定命令集 BindWorkFlowIntoTree(xmlHelper.xmlDoc); } catch (Exception ex) { } } #endregion #region 绑定台面 public void BindSetLatticesDataOnUI(XmlDocument xmlDocument) { XmlNodeList xmlNodeList = xmlDocument.SelectNodes("root/env/platform"); object sender = new object(); RoutedEventArgs e = new RoutedEventArgs(); foreach (XmlNode xmlNode in xmlNodeList) { // 获取板子信息,克隆数据添加到板位上 //Labware labware = LabwareDB.GetLabware(); if (xmlNode.SelectNodes("labware") == null) { continue; } BindLabwareIntoLattice(xmlNode); } } public void BindLabwareIntoLattice(XmlNode xmlNode) { if (testDesign == null) return; for (int i = 0; i < testDesign.gridTable.Children.Count; i++) { //一个存放Canvas的DataContext的集合对象 Stack labwareExes = new Stack(); Canvas canvas = ((Canvas)testDesign.gridTable.Children[i]); int lapid = 0; TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb(); //增加台面模板判断 if (tabletopTemplate == null) { lapid = ControlCom.GetLatticeId(Convert.ToInt32(xmlNode.SelectSingleNode("lattice_id").InnerText)); } else { string latticeNumber = "P" + xmlNode.SelectSingleNode("lattice_id").InnerText; lapid = Convert.ToInt32(LatticeDB.GetLatticeDataByLatticeNumAndTempIdFromdb(latticeNumber, Convert.ToInt32(Shared.DeviceArmList.FirstOrDefault(x => x.arm_type.Equals(1)).device_arm_id), Shared.SoftwareInformation.software_device_number, tabletopTemplate.tabletopid).lattice_id); } string latticeNum = LatticeDB.GetLatticeDataByIdFromdb(lapid.ToString()).lattice_num; int isTrash = (int)LatticeDB.GetLatticeDataByIdFromdb(lapid.ToString()).is_trash; if (isTrash == 1) { continue; } if (((canvas.Children[0] as Border).Child as TextBlock).Text == latticeNum) { XmlNodeList labwareXmlNodeList = xmlNode.SelectNodes("labware"); for (int j = 0; j < labwareXmlNodeList.Count; j++) { string labwareId = labwareXmlNodeList[j].SelectSingleNode("labware_id").InnerText; Labware labware = LabwareDB.GetLabware(labwareId); if (labware != null) { if (labware.labware_type_id.Equals("4")) { labware.labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labware.labware_id); } } labware.labware_sname = labwareXmlNodeList[j].SelectSingleNode("labware_sname").InnerText; if (labwareXmlNodeList[j].SelectSingleNode("labware_barcode") != null) { labware.labware_barcode = labwareXmlNodeList[j].SelectSingleNode("labware_barcode").InnerText; } if (string.IsNullOrEmpty(labware.labware_id)) { continue; } Labware lbe = labware; ControlLabware control = new ControlLabware(); //if (isTrash == 1) //{ // ControlLabware cl = new ControlLabware() // { // IsTrash = true, // LabwareName = Properties.Resources.strTrash.ToString() // //LabwareName = string.Format("垃{0}圾{0}桶", Environment.NewLine) // }; // LabwareEx lb = new LabwareEx(); // lb.labware_name = Properties.Resources.strTrash; // //lb.labware_name = string.Format("垃{0}圾{0}桶", Environment.NewLine); // lb.row = Grid.GetRow(canvas); // lb.col = Grid.GetColumn(canvas); // canvas.DataContext = lb; // canvas.Children.Add(cl); //} //else //{ control.LeftSideColor = ComUtility.RGBToColor(lbe.labware_color_lside); // 侧面 control.FrontColor = ComUtility.RGBToColor(lbe.labware_color_front); // 前斜面 control.TopColor = ComUtility.RGBToColor(lbe.labware_color_top); // 正上 control.BorderColor = ComUtility.RGBToColor(lbe.labware_color_line); // 边线 control.AllowDrop = true; if (lbe.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.CircularDish).ToString()) // 圆形皿 { control.LabwareWidth = canvas.ActualWidth; control.LabwareHeight = canvas.ActualHeight;// canvas.ActualWidth*50/90; //LabwareDeep = 8, control.Rows = (int)lbe.number_row; control.Columns = (int)lbe.number_column; control.WellColor = Colors.White; control.IsFill = true; control.Label = latticeNum; control.LabwareType = Convert.ToInt16(lbe.labware_type_id); control.LabwareName = lbe.labware_name; control.Barcode = lbe.labware_barcode; control.Width = canvas.ActualWidth; control.Height = canvas.ActualHeight + 4; } else { if (tabletopTemplate == null) { control.LabwareWidth = 126.46153846153845;//canvas.ActualWidth; control.LabwareHeight = 48;//canvas.ActualHeight; } else { control.LabwareWidth = canvas.Width; control.LabwareHeight = canvas.Height; } control.Rows = (int)lbe.number_row; control.Columns = (int)lbe.number_column; control.WellColor = Colors.White; control.IsFill = true; if (!string.IsNullOrEmpty(lbe.labware_sname)) { control.Label = lbe.labware_sname; } else { control.Label = latticeNum; } if (!string.IsNullOrEmpty(lbe.labware_barcode)) { control.Barcode = lbe.labware_barcode; } else { control.Barcode = ""; } control.LabwareType = Convert.ToInt16(lbe.labware_type_id); control.LabwareName = lbe.labware_name; if (lbe.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Tube).ToString()) //管架 { control.LabwareRealLength = lbe.labware_length; control.LabwareRealWidth = lbe.labware_width; control.labwareWellInfoList = lbe.labwareWellInfoList; } if (lbe.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Electrophoto).ToString()) //电泳板位 { control.LabwareRealLength = lbe.labware_length; control.LabwareRealWidth = lbe.labware_width; control.labwareWellInfoList = lbe.labwareWellInfoList; } } control.ValidWells = labwareXmlNodeList[j].SelectSingleNode("residueValidWells").InnerText = labwareXmlNodeList[j].SelectSingleNode("allValidWells").InnerText; Canvas.SetLeft(control, 0); if (lbe.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Electrophoto).ToString()) //电泳切胶槽 { Canvas.SetTop(control, 0); } else { Canvas.SetBottom(control, 0); } LabwareEx lb = new LabwareEx(lbe); lb.row = Grid.GetRow(canvas); lb.col = Grid.GetColumn(canvas); lb.label = lbe.labware_sname; lb.position = canvas.Name; lb.validWells = control.ValidWells; canvas.DataContext = lb; if (canvas.Tag != null) { if (canvas.Tag.GetType().Name == "TabletopRelLattice") { } else { labwareExes = (Stack)canvas.Tag; } } if (labwareExes != null) { } else { labwareExes = new Stack(); } labwareExes.Push(lb); canvas.Tag = labwareExes; //根据重叠的层级,设置margin,用的是下层的耗材数据计算 double leftMargin = 0;//离左侧距离 double bottomMargin = 0;//离底部距离 for (int k = 0; k < canvas.Children.Count; k++) { ControlLabware a = canvas.Children[k] as ControlLabware; if (a != null) { leftMargin += a.LabwareDeep; bottomMargin += a.LabwareDeep; } } control.Margin = new Thickness(leftMargin, 0, 0, bottomMargin); canvas.Children.Add(control); control.SetValidWells(control.ValidWells); //如果是第二及其以上耗材,要隐藏标签 if (labwareExes.Count > 1) { control.Label = ""; } else { } //} } } } } #endregion List methodExes = new List(); MethodEx sourceItem = null; List methodExesForGroup = new List(); #region 往Tree上绑定命令集 /// /// 往Tree上绑定命令集 /// /// public void BindWorkFlowIntoTree(XmlDocument xmlDocument) { //this.Dispatcher.Invoke(() => //{ Task.Run(() => { try { //方法 XmlNodeList xmlNodeMethodList = xmlDocument.SelectNodes("root/method"); MethodListBll methodListBll = new MethodListBll(); this.Dispatcher.Invoke(() => { MethodEx methodExLast = testDesign.rootMethod.Children[testDesign.rootMethod.Children.Count - 1]; testDesign.rootMethod.Children.RemoveAt(testDesign.rootMethod.Children.Count - 1); //处理第一个节点 MethodStart methodStart = new MethodStart(); StartBll startBll = new StartBll(); methodStart = startBll.GenerateMethodStartDataByXmlNode(xmlNodeMethodList[0]); MethodEx mi = testDesign.rootMethod.Children[0]; mi.tag = methodStart; if (mi.control != null) { (mi.control as StartProperty).methodStart = methodStart; } //pBarProgress.IsIndeterminate = false; pBarProgress.Maximum = xmlNodeMethodList.Count;// + 2; }); //开始和结尾不要,其他的方法循环绑定数据 for (int i = 1; i < xmlNodeMethodList.Count; i++) { this.Dispatcher.Invoke(() => { string MethodName = xmlNodeMethodList[i].SelectSingleNode("label").InnerText; int iNum = methodListBll.getNumByMethodName(MethodName); MethodEx methodEx = null; switch (iNum) { case (int)MethodNameEnum.start: //m = this.GenerateMethodEx(xmlNodeMethodList[i]); //MethodStart methodStart = new MethodStart(); //StartBll startBll = new StartBll(); //methodStart = startBll.GenerateMethodStartDataByXmlNode(xmlNodeMethodList[i]); //m.tag= methodStart; //testDesign.rootMethod.Children.Add(m); break; case (int)MethodNameEnum.loadtips: #region 安装吸头 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodLoadTips methodLoadTips = new MethodLoadTips(); LoadTipsBll loadTipsBll = new LoadTipsBll(); methodLoadTips = loadTipsBll.GenerateMethodLoadTipsDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodLoadTips; if (methodLoadTips != null) { methodEx.method_Tipcontent = string.Format("安装{0}", methodLoadTips.labwaretipText); } methodEx.isEnabled = methodLoadTips.status == "enable"; testDesign.Method_LoadTips(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.unloadtips: #region 卸载吸头 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodUnloadTips methodUnloadTips = new MethodUnloadTips(); UnloadTipsBll unloadTipsBll = new UnloadTipsBll(); methodUnloadTips = unloadTipsBll.GenerateMethodUnloadTipsDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodUnloadTips; methodEx.isEnabled = methodUnloadTips.status == "enable"; testDesign.Method_UnloadTips(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.end: #region 结束 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodEnd methodEnd = new MethodEnd(); EndBll endBll = new EndBll(); methodEnd = endBll.GenerateMethodEndDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodEnd; methodEx.isEnabled = methodEnd.status == "enable"; methodEx.canDrop = false; methodEx.Moveable = false; testDesign.Method_End(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.loop: #region 开始循环 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodLoop methodLoop = new MethodLoop(); LoopBll loopBll = new LoopBll(); methodLoop = loopBll.GenerateMethodLoopDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodLoop; if (methodLoop != null) { methodEx.method_Tipcontent = string.Format("从{0}到{1},递增{2}", methodLoop.variablesValue.ToString(), methodLoop.variableeValue.ToString(), methodLoop.incrementValue.ToString()); } methodEx.isEnabled = methodLoop.status == "enable"; testDesign.Method_Loop(methodEx); //testDesign.rootMethod.Children.Add(m); #endregion break; case (int)MethodNameEnum.endloop: #region 结束循环 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); methodEx.Children[methodEx.Children.Count - 1].isEnabled = new LoopBll().GenerateMethodLoopDataByXmlNode(xmlNodeMethodList[i]).status == "enable"; if (methodExes.Count > 0) { if (methodExes[methodExes.Count - 1] != null) { sourceItem = null; methodExes[methodExes.Count - 1] = null; bool isAllNull = true; //循环向前找,找到最后一个不为null的,设置为sourceItem for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = methodExes[k]; isAllNull = false; break; } } //如果向前找没有一个不为null的,则添加到tree;否则不添加 if (isAllNull) { testDesign.rootMethod.Children.Add(methodEx); } methodExes.RemoveAt(methodExes.Count - 1); } else { bool isAllNull = true; int counAllNull = 0;//计算不为Null的个数 for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { counAllNull++; } } //循环向前找,找到最后一个不为null的,设置为null for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = null; methodExes[k] = null; isAllNull = false; break; } } //如果向前找没有一个不为null的,则添加到tree;否则不添加 if (isAllNull) { testDesign.rootMethod.Children.Add(methodEx); } else { if (counAllNull == 1) { testDesign.rootMethod.Children.Add(methodEx); } } } } else { testDesign.rootMethod.Children.Add(methodEx); sourceItem = null; methodExes[methodExes.Count - 1] = null; } #endregion break; case (int)MethodNameEnum.aspirate: #region 吸液 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodAspirate methodAspirate = new MethodAspirate(); AspirateBll aspirateBll = new AspirateBll(); methodAspirate = aspirateBll.GenerateMethodAspirateDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodAspirate; if (methodAspirate != null) { methodEx.method_Tipcontent = string.Format("{0};{1}", methodAspirate.positionText, methodAspirate.wellvolume); } methodEx.isEnabled = methodAspirate.status == "enable"; testDesign.Method_Aspirate(methodEx); //testDesign.treeviewWorkflow.SelectedItem = m; if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.dispense: #region 排液 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodDispense methodDispense = new MethodDispense(); DispenseBll dispenseBll = new DispenseBll(); methodDispense = dispenseBll.GenerateMethodDispenseDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodDispense; if (methodDispense != null) { methodEx.method_Tipcontent = string.Format("{0};{1}", methodDispense.positionText, methodDispense.wellvolume); } methodEx.isEnabled = methodDispense.status == "enable"; testDesign.Method_Dispense(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.mixing: #region 混合 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodMixing methodMixing = new MethodMixing(); MixingBll mixingBll = new MixingBll(); methodMixing = mixingBll.GenerateMethodMixingDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodMixing; if (methodMixing != null) { methodEx.method_Tipcontent = string.Format("{0};{1}", methodMixing.positionText, methodMixing.mixcount); } methodEx.isEnabled = methodMixing.status == "enable"; testDesign.Method_Mix(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.transferfile: #region 文件 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodTransferFile methodTransferFile = new MethodTransferFile(); TransferFileBll transferFileBll = new TransferFileBll(); methodTransferFile = transferFileBll.GenerateMethodTransferFileDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodTransferFile; methodEx.isEnabled = methodTransferFile.status == "enable"; testDesign.Method_File(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.griptransport: #region 抓板转移 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodGripTransport methodGripTransport = new MethodGripTransport(); GripTransportBll gripTransportBll = new GripTransportBll(); methodGripTransport = gripTransportBll.GenerateMethodGripTransport(xmlNodeMethodList[i]); methodEx.tag = methodGripTransport; if (methodGripTransport != null) { methodEx.method_Tipcontent = string.Format("从{0}到{1}", methodGripTransport.srcPositionText, methodGripTransport.desPositionText); } methodEx.isEnabled = methodGripTransport.status == "enable"; testDesign.Method_GripTransport(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.gripmove: #region 移动夹爪 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodGripMove methodGripMove = new MethodGripMove(); GripMoveBll gripMoveBll = new GripMoveBll(); methodGripMove = gripMoveBll.GenerateMethodGripMove(xmlNodeMethodList[i]); methodEx.tag = methodGripMove; methodEx.isEnabled = methodGripMove.status == "enable"; testDesign.Method_GripMove(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.holdingLabware: #region 夹爪保持开始 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodHoldingLabware methodHoldingLabware = holdingLabwareBll.GenerateMethodBeginHoldingLabware(xmlNodeMethodList[i]); methodEx.tag = methodHoldingLabware; methodEx.isEnabled = methodHoldingLabware.status == "enable"; methodEx.method_Tipcontent = string.Format("从{0}抓板", methodHoldingLabware.srcPositionText); testDesign.Method_HoldingLabware(methodEx); #endregion break; case (int)MethodNameEnum.endHoldingLabware: #region 夹爪保持结束 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodHoldingLabware endMethodHoldingLabware = holdingLabwareBll.GenerateMethodEndHoldingLabware(xmlNodeMethodList[i]); methodEx.Children[methodEx.Children.Count - 1].tag = endMethodHoldingLabware; methodEx.Children[methodEx.Children.Count - 1].isEnabled = endMethodHoldingLabware.status == "enable"; methodEx.Children[methodEx.Children.Count - 1].method_Tipcontent = string.Format("放板到{0}", endMethodHoldingLabware.desPositionText); testDesign.Method_HoldingLabware(methodEx.Children[methodEx.Children.Count - 1]); if (methodExes.Count > 0) { if (methodExes[methodExes.Count - 1] != null) { sourceItem = null; methodExes[methodExes.Count - 1] = null; bool isAllNull = true; //循环向前找,找到最后一个不为null的,sourceItem for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = methodExes[k]; isAllNull = false; break; } } //如果向前找没有一个不为null的,则添加到tree;否则不添加 if (isAllNull) { testDesign.rootMethod.Children.Add(methodEx); } methodExes.RemoveAt(methodExes.Count - 1); } else { bool isAllNull = true; int counAllNull = 0;//计算不为Null的个数 for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { counAllNull++; } } //循环向前找,找到最后一个不为null的,设置为null for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = null; methodExes[k] = null; isAllNull = false; break; } } //如果向前找没有一个不为null的,则添加到tree;否则不添加 if (isAllNull) { testDesign.rootMethod.Children.Add(methodEx); } else { if (counAllNull == 1) { testDesign.rootMethod.Children.Add(methodEx); } } } } else { testDesign.rootMethod.Children.Add(methodEx); sourceItem = null; methodExes[methodExes.Count - 1] = null; } #endregion break; case (int)MethodNameEnum.home: #region 复位 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodHome methodHome = new MethodHome(); HomeBll homeBll = new HomeBll(); methodHome = homeBll.GenerateMethodHome(xmlNodeMethodList[i]); methodEx.tag = methodHome; methodEx.isEnabled = methodHome.status == "enable"; testDesign.Method_Reset(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.pause: #region 暂停 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodPauseMove methodPauseMove = new MethodPauseMove(); PauseMoveBll pauseMoveBll = new PauseMoveBll(); methodPauseMove = pauseMoveBll.GenerateMethodPauseMove(xmlNodeMethodList[i]); methodEx.tag = methodPauseMove; if (methodPauseMove != null) { methodEx.method_Tipcontent = string.Format("{0};{1}", methodPauseMove.pauseTime, methodPauseMove.pauseTipInfo); } methodEx.isEnabled = methodPauseMove.status == "enable"; testDesign.Method_Pause(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.remark: #region 备注 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodRemark methodRemark = new MethodRemark(); CommentBll commentBll = new CommentBll(); methodRemark = commentBll.GenerateMethodRemark(xmlNodeMethodList[i]); methodEx.tag = methodRemark; if (methodRemark != null) { methodEx.method_Tipcontent = string.Format("{0}", methodRemark.title.ToString()); } methodEx.isEnabled = methodRemark.status == "enable"; testDesign.Method_Comment(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.dataimport: #region 数据导入 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodDataImport methodDataImport = new MethodDataImport(); DataImportBll dataImportBll = new DataImportBll(); methodDataImport = dataImportBll.GenerateMethodDataImportDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodDataImport; methodEx.isEnabled = methodDataImport.status == "enable"; testDesign.Method_DataImport(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.dataexport: #region 数据导出 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodDataExport methodDataExport = new MethodDataExport(); DataExportBll dataExportBll = new DataExportBll(); methodDataExport = dataExportBll.GenerateMethodDataExport(xmlNodeMethodList[i]); methodEx.tag = methodDataExport; methodEx.isEnabled = methodDataExport.status == "enable"; testDesign.Method_DataExport(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.group: #region 组合 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodCombination methodCombination = new MethodCombination(); GroupBll groupBll = new GroupBll(); methodCombination = groupBll.GenerateMethodGroup(xmlNodeMethodList[i]); methodEx.tag = methodCombination; methodEx.isEnabled = methodCombination.status == "enable"; testDesign.Method_Group(methodEx); #endregion break; case (int)MethodNameEnum.endgroup: #region 结束组合 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); methodEx.Children[methodEx.Children.Count - 1].isEnabled = new GroupBll().GenerateMethodGroup(xmlNodeMethodList[i]).status == "enable"; if (methodExes.Count > 0) { if (methodExes[methodExes.Count - 1] != null) { sourceItem = null; methodExes[methodExes.Count - 1] = null; bool isAllNull = true; //循环向前找,找到最后一个不为null的,sourceItem for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = methodExes[k]; isAllNull = false; break; } } //如果向前找没有一个不为null的,则添加到tree;否则不添加 if (isAllNull) { testDesign.rootMethod.Children.Add(methodEx); } methodExes.RemoveAt(methodExes.Count - 1); } else { bool isAllNull = true; int counAllNull = 0;//计算不为Null的个数 for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { counAllNull++; } } //循环向前找,找到最后一个不为null的,设置为null for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = null; methodExes[k] = null; isAllNull = false; break; } } //如果向前找没有一个不为null的,则添加到tree;否则不添加 if (isAllNull) { testDesign.rootMethod.Children.Add(methodEx); } else { if (counAllNull == 1) { testDesign.rootMethod.Children.Add(methodEx); } } } } else { testDesign.rootMethod.Children.Add(methodEx); sourceItem = null; methodExes[methodExes.Count - 1] = null; } #endregion break; case (int)MethodNameEnum.takephoto: #region 拍照 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceHXELEC)) { MethodTakePhotoForElectro methodTakePhotoForElectro = new MethodTakePhotoForElectro(); TakePhotoBll takePhotoBll = new TakePhotoBll(); methodTakePhotoForElectro = takePhotoBll.GenerateMethodTakePhotoForElectroDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodTakePhotoForElectro; methodEx.isEnabled = methodTakePhotoForElectro.status == "enable"; testDesign.Method_Capture(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } } else { MethodTakePhoto methodTakePhoto = new MethodTakePhoto(); TakePhotoBll takePhotoBll = new TakePhotoBll(); methodTakePhoto = takePhotoBll.GenerateMethodTakePhotoDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodTakePhoto; methodEx.isEnabled = methodTakePhoto.status == "enable"; testDesign.Method_Capture(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } } #endregion break; case (int)MethodNameEnum.choice: #region 挑选 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodChoice methodChoice = choiceBll.GenerateMethodChoiceDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodChoice; methodEx.isEnabled = methodChoice.status == "enable"; testDesign.Method_Pick(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.coating: #region 涂布 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodCoating methodCoating = coatingBll.GenerateMethodCoatingDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodCoating; methodEx.isEnabled = methodCoating.status == "enable"; testDesign.Method_Coating(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.coatingfile: #region 涂布文件 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodCoatingFile methodCoatingFile = new MethodCoatingFile(); CoatingFileBll coatingFileBll = new CoatingFileBll(); methodCoatingFile = coatingFileBll.GenerateMethodCoatingFileDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodCoatingFile; methodEx.isEnabled = methodCoatingFile.status == "enable"; testDesign.Method_FileCoating(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.coatingReport: #region 涂布报告 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodCoatingReport methodCoatingReport = new MethodCoatingReport(); CoatingReportBll coatingReportBll = new CoatingReportBll(); methodCoatingReport = coatingReportBll.GenerateMethodDataExport(xmlNodeMethodList[i]); methodEx.tag = methodCoatingReport; methodEx.isEnabled = methodCoatingReport.status == "enable"; testDesign.Method_CoatingFileExport(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.ultrasonic: #region 超声探测 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodUltrasonic methodUltrasonic = new MethodUltrasonic(); UltrasonicBll ultrasonicBll = new UltrasonicBll(); methodUltrasonic = ultrasonicBll.GenerateMethodUltrasonicDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodUltrasonic; methodEx.isEnabled = methodUltrasonic.status == "enable"; testDesign.Method_Ultrasonic(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.choiceTransfer: #region 挑选转板 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodChoiceAndTransfer methodChoiceTransfer = choiceBll.GenerateMethodChoiceAndTransferDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodChoiceTransfer; methodEx.isEnabled = methodChoiceTransfer.status == "enable"; testDesign.Method_PickAndTransfer(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.coatingTransfer: #region 涂布转板 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodCoatingAndTransfer methodCoatingTransfer = coatingBll.GenerateMethodCoatingAndTransferDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodCoatingTransfer; methodEx.isEnabled = methodCoatingTransfer.status == "enable"; testDesign.Method_CoatingAndTransfer(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.dilution: #region 梯度稀释 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodDilution methodDilution = new MethodDilution(); DilutionBll dilutionBll = new DilutionBll(); methodDilution = dilutionBll.GenerateMethodDilutionDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodDilution; methodEx.isEnabled = methodDilution.status == "enable"; testDesign.Method_Dilution(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.setVariable: #region 设置变量 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodSetVariable methodSetVariable = new MethodSetVariable(); SetVariableBll setVariableBll = new SetVariableBll(); methodSetVariable = setVariableBll.GenerateMethodSetVariable(xmlNodeMethodList[i]); methodEx.tag = methodSetVariable; if (methodSetVariable != null) { methodEx.method_Tipcontent = string.Format("{0}={1}", methodSetVariable.variablename.ToString(), methodSetVariable.variablevalue.ToString()); } methodEx.isEnabled = methodSetVariable.status == "enable"; testDesign.Method_SetVariable(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.VariableImport: #region 文件导入变量 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodVariableImport methodVariableImport = new MethodVariableImport(); VariableImportBll variableImportBll = new VariableImportBll(); methodVariableImport = variableImportBll.GenerateMethodVariableImportDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodVariableImport; methodEx.isEnabled = methodVariableImport.status == "enable"; testDesign.Method_VariableImport(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.ifStart: #region 开始if methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodIfElse methodIfElse = new MethodIfElse(); IfElseBll ifElseBll = new IfElseBll(); methodIfElse = ifElseBll.GenerateMethodIfElseDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodIfElse; if (methodIfElse != null) { string logicSymbol = string.Empty; if (methodIfElse.logicCondition == LogicMark.Above) { logicSymbol = ">"; } else if (methodIfElse.logicCondition == LogicMark.Below) { logicSymbol = "<"; } else if (methodIfElse.logicCondition == LogicMark.Equal) { logicSymbol = "="; } else if (methodIfElse.logicCondition == LogicMark.Unequal) { logicSymbol = "!="; } else if (methodIfElse.logicCondition == LogicMark.AboveEqual) { logicSymbol = ">="; } else if (methodIfElse.logicCondition == LogicMark.BelowEqual) { logicSymbol = "<="; } methodEx.method_Tipcontent = string.Format("{0}{1}{2}", methodIfElse.variableName, logicSymbol, methodIfElse.variableValue); } methodEx.isEnabled = methodIfElse.status == "enable"; testDesign.Method_IfElse(methodEx); #endregion break; case (int)MethodNameEnum.ifEnd: #region 结束if methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); methodEx.Children[methodEx.Children.Count - 1].isEnabled = true;// new IfElseBll().GenerateMethodIfElseDataByXmlNode(xmlNodeMethodList[i]).status == "enable"; if (methodExes.Count > 0) { if (methodExes[methodExes.Count - 1] != null) { sourceItem = null; methodExes[methodExes.Count - 1] = null; bool isAllNull = true; //循环向前找,找到最后一个不为null的,设置为sourceItem for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = methodExes[k]; isAllNull = false; break; } } //如果向前找没有一个不为null的,则添加到tree;否则不添加 if (isAllNull) { testDesign.rootMethod.Children.Add(methodEx); } methodExes.RemoveAt(methodExes.Count - 1); } else { bool isAllNull = true; int counAllNull = 0;//计算不为Null的个数 for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { counAllNull++; } } //循环向前找,找到最后一个不为null的,设置为null for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = null; methodExes[k] = null; isAllNull = false; break; } } //如果向前找没有一个不为null的,则添加到tree;否则不添加 if (isAllNull) { testDesign.rootMethod.Children.Add(methodEx); } else { if (counAllNull == 1) { testDesign.rootMethod.Children.Add(methodEx); } } } } else { testDesign.rootMethod.Children.Add(methodEx); sourceItem = null; methodExes[methodExes.Count - 1] = null; } #endregion break; case (int)MethodNameEnum.elseStart: #region 开始if methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); methodIfElse = new MethodIfElse(); ifElseBll = new IfElseBll(); methodIfElse = ifElseBll.GenerateMethodIfElseDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodIfElse; if (methodIfElse != null) { string logicSymbol = string.Empty; if (methodIfElse.logicCondition == LogicMark.Above) { logicSymbol = ">"; } else if (methodIfElse.logicCondition == LogicMark.Below) { logicSymbol = "<"; } else if (methodIfElse.logicCondition == LogicMark.Equal) { logicSymbol = "="; } else if (methodIfElse.logicCondition == LogicMark.Unequal) { logicSymbol = "!="; } else if (methodIfElse.logicCondition == LogicMark.AboveEqual) { logicSymbol = ">="; } else if (methodIfElse.logicCondition == LogicMark.BelowEqual) { logicSymbol = "<="; } methodEx.method_Tipcontent = string.Format("{0}{1}{2}", methodIfElse.variableName, logicSymbol, methodIfElse.variableValue); } methodEx.isEnabled = methodIfElse.status == "enable"; testDesign.Method_IfElse(methodEx); #endregion break; case (int)MethodNameEnum.elseEnd: #region 结束if methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); methodEx.Children[methodEx.Children.Count - 1].isEnabled = true;//new IfElseBll().GenerateMethodIfElseDataByXmlNode(xmlNodeMethodList[i]).status == "enable"; if (methodExes.Count > 0) { if (methodExes[methodExes.Count - 1] != null) { sourceItem = null; methodExes[methodExes.Count - 1] = null; bool isAllNull = true; //循环向前找,找到最后一个不为null的,设置为sourceItem for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = methodExes[k]; isAllNull = false; break; } } //如果向前找没有一个不为null的,则添加到tree;否则不添加 if (isAllNull) { testDesign.rootMethod.Children.Add(methodEx); } methodExes.RemoveAt(methodExes.Count - 1); } else { bool isAllNull = true; int counAllNull = 0;//计算不为Null的个数 for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { counAllNull++; } } //循环向前找,找到最后一个不为null的,设置为null for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = null; methodExes[k] = null; isAllNull = false; break; } } //如果向前找没有一个不为null的,则添加到tree;否则不添加 if (isAllNull) { testDesign.rootMethod.Children.Add(methodEx); } else { if (counAllNull == 1) { testDesign.rootMethod.Children.Add(methodEx); } } } } else { testDesign.rootMethod.Children.Add(methodEx); sourceItem = null; methodExes[methodExes.Count - 1] = null; } #endregion break; case (int)MethodNameEnum.timerSet: #region 计时器 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodTimer methodTimer = new MethodTimer(); TimerBll timerBll = new TimerBll(); methodTimer = timerBll.GenerateMethodTimer(xmlNodeMethodList[i]); methodEx.tag = methodTimer; if (methodTimer != null) { methodEx.method_Tipcontent = string.Format("{0}s", methodTimer.duringTime.ToString()); } methodEx.isEnabled = methodTimer.status == "enable"; testDesign.Method_Timer(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.waitFor: #region 等待 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodWaitFor methodWaitFor = new MethodWaitFor(); WaitForBll waitForBll = new WaitForBll(); methodWaitFor = waitForBll.GenerateMethodTimer(xmlNodeMethodList[i]); methodEx.tag = methodWaitFor; methodEx.isEnabled = methodWaitFor.status == "enable"; testDesign.Method_WaitFor(methodEx, null); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.pumpDispense: #region 泵排液 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodPumpDispese methodPumpDispese = new MethodPumpDispese(); PumpDispenseBll pumpDispenseBll = new PumpDispenseBll(); methodPumpDispese = pumpDispenseBll.GenerateMethodPumpDispenseDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodPumpDispese; methodEx.isEnabled = methodPumpDispese.status == "enable"; testDesign.Method_PumpDispense(methodEx); //testDesign.treeviewWorkflow.SelectedItem = m; if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.shaker: #region 振荡 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodShake methodShake = new MethodShake(); ShakerBll shakerBll = new ShakerBll(); methodShake = shakerBll.GenerateMethodShakeDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodShake; methodEx.isEnabled = methodShake.status == "enable"; testDesign.Method_Shake(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.switchLid: #region 开关盖 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodSwitchLid methodSwitchLid = new MethodSwitchLid(); SwitchLidBll switchLidBll = new SwitchLidBll(); methodSwitchLid = switchLidBll.GenerateMethodSwitchLidDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodSwitchLid; methodEx.isEnabled = methodSwitchLid.status == "enable"; testDesign.Method_SwitchLid(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.fileMoveLiquid: #region 文件开关盖移液 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodFileMoveLiquid methodFileMoveLiquid = new MethodFileMoveLiquid(); FileMoveLiquidBll fileMoveLiquidBll = new FileMoveLiquidBll(); methodFileMoveLiquid = fileMoveLiquidBll.GenerateMethodFileMoveLiquidDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodFileMoveLiquid; methodEx.isEnabled = methodFileMoveLiquid.status == "enable"; testDesign.Method_FileMoveLiquid(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.fileMoveLabware: #region 文件转板 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodFileMoveLabware methodFileMoveLabware = new MethodFileMoveLabware(); FileMoveLabwareBll fileMoveLabwareBll = new FileMoveLabwareBll(); methodFileMoveLabware = fileMoveLabwareBll.GenerateMethodFileMoveLabwareDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodFileMoveLabware; methodEx.isEnabled = methodFileMoveLabware.status == "enable"; testDesign.Method_FileMoveLabware(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.subMethod: #region 子方法 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodSubMethod methodSubMethod = new SubMethodBll().GenerateMethodSubMethodDataByXmlNode(xmlNodeMethodList[i], true); methodEx.tag = methodSubMethod; methodEx.isEnabled = methodSubMethod.status == "enable"; testDesign.Method_SubMethod(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.varCalc: #region 变量计算 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodVarCalc methodVarCalc = new MethodVarCalc(); VarCalcBll varCalcBll = new VarCalcBll(); methodVarCalc = varCalcBll.GenerateMethodVarCalcDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodVarCalc; if (methodVarCalc != null) { string logicSymbol = string.Empty; if (methodVarCalc.calcOperator == (int)CalcOperatorTypeEnum.Add) { logicSymbol = "+"; } else if (methodVarCalc.calcOperator == (int)CalcOperatorTypeEnum.Minus) { logicSymbol = "-"; } else if (methodVarCalc.calcOperator == (int)CalcOperatorTypeEnum.Time) { logicSymbol = "×"; } else if (methodVarCalc.calcOperator == (int)CalcOperatorTypeEnum.Pide) { logicSymbol = "÷"; } else if (methodVarCalc.calcOperator == (int)CalcOperatorTypeEnum.Mod) { logicSymbol = "%"; } methodEx.method_Tipcontent = string.Format("{0}{1}{2}={3}", methodVarCalc.calcValue1.ToString(), logicSymbol, methodVarCalc.calcValue2.ToString(), methodVarCalc.calcResult.ToString()); } methodEx.isEnabled = methodVarCalc.status == "enable"; testDesign.Method_VariableCalculate(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; case (int)MethodNameEnum.cutGum: #region 文件切胶 methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); MethodElectroFile methodElectroFile = new MethodElectroFile(); FileCutGumBll fileCutGumBll = new FileCutGumBll(); methodElectroFile = fileCutGumBll.GenerateMethodElectroFileDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodElectroFile; methodEx.isEnabled = methodElectroFile.status == "enable"; testDesign.Method_FileElectro(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } #endregion break; default: #region 第三方设备 if (xmlNodeMethodList[i].SelectSingleNode("isThirdPart") != null) { bool isThirdPart = bool.Parse(xmlNodeMethodList[i].SelectSingleNode("isThirdPart").InnerText); if (!isThirdPart) { break; } methodEx = this.GenerateMethodEx(xmlNodeMethodList[i]); ThirdPartBll thirdPartBll = new ThirdPartBll(); MethodThirdPart methodThirdPart = thirdPartBll.GenerateMethodThirdPartDataByXmlNode(xmlNodeMethodList[i]); methodEx.tag = methodThirdPart; methodEx.method_Tipcontent = string.Format("{0}", methodThirdPart.deviceMethod == null ? "" : methodThirdPart.deviceMethod.ParameterName); methodEx.isEnabled = methodThirdPart.status == "enable"; testDesign.Method_ThirdPart(methodEx); if (sourceItem == null) { testDesign.rootMethod.Children.Add(methodEx); } } #endregion break; } var mainWindow = (MainWindow)Application.Current.MainWindow; if (mainWindow != null) { if (methodEx != null) { mainWindow.SetObserverNode(methodEx); } } }); UpdateProgress(i); Thread.Sleep(1); // 模拟耗时操作 } this.Dispatcher.Invoke(() => { testDesign.treeviewWorkflow.ItemsSource = testDesign.rootMethod.Children; // testDesign.ReOrderMethodIndex("", testDesign.rootMethod); testDesign.updateWaitforOnWorkflow(); rootGridTitle.RowDefinitions[1].Height = new GridLength(0); }); //启动一个定时器,1秒内更新一下界面 DispatcherTimer timerText = new DispatcherTimer(); timerText.Interval = TimeSpan.FromMilliseconds(1000);//1秒 timerText.Tick += timerText_Tick; timerText.Start(); countOfLoad = 0; } catch (Exception ex) { LoggerHelper.ErrorLog("BindWorkFlowIntoTree error", ex); } finally { isOpenning = false; this.Dispatcher.Invoke(() => { Mouse.OverrideCursor = null; }); } }); return; } #endregion int countOfLoad = 0; #region 定时器事件——检测是否在30分钟内持续操作了本软件,否则锁屏 private void timerText_Tick(object sender, EventArgs e) { if (countOfLoad == 0) { countOfLoad++; testDesign.ReOrderMethodData(testDesign.rootMethod); } else { } } #endregion #region 根据XmlNode创建MethodEx public MethodEx GenerateMethodEx(XmlNode xmlNode) { MethodEx methodEx = null; try { ObservableCollection methods = MethodDB.GetMethodFromdb(Shared.SoftwareInformation.software_device_number); if (xmlNode.SelectSingleNode("label").InnerText == "start") { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("开始")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); testDesign.rootMethod.Children.Add(methodEx); } } #region 循环 else if (xmlNode.SelectSingleNode("label").InnerText == "循环开始") { if (methodExes.Count > 0) { if (methodExes[methodExes.Count - 1] != null) { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("循环")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); //methodExes[methodExes.Count - 1] = methodEx; methodExes.Add(methodEx); sourceItem.Children.Add(methodEx); methodEx.SetParent(sourceItem); sourceItem = methodEx; } } else { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("循环")); if (currentMethod != null) { sourceItem = methodEx; methodEx = new MethodEx(currentMethod, testDesign.rootMethod); sourceItem = methodEx; methodExes.Add(sourceItem); } } } else { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("循环")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); sourceItem = methodEx; methodExes.Add(sourceItem); } } } else if (xmlNode.SelectSingleNode("label").InnerText == "循环结束") { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("循环")); if (currentMethod != null) { string id = Guid.NewGuid().ToString(); sourceItem.method_name += Properties.Resources.strBegin; sourceItem.groupID = id; MethodEx source = new MethodEx(sourceItem); MethodEx endItem = new MethodEx(source, sourceItem); endItem.groupID = id; endItem.method_name = "循环" + Properties.Resources.strEnd; endItem.method_ico = "循环结束.png"; endItem.Moveable = false; endItem.method_Tipcontent = ""; sourceItem.Children.Add(endItem); } methodEx = sourceItem; } #endregion #region 组合 else if (xmlNode.SelectSingleNode("label").InnerText == "组合开始") { if (methodExes.Count > 0) { if (methodExes[methodExes.Count - 1] != null) { Method currentMethod = methods.FirstOrDefault(x => x.method_content.Equals("组合")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); methodExes.Add(methodEx); sourceItem.Children.Add(methodEx); methodEx.SetParent(sourceItem); sourceItem = methodEx; } } else { Method currentMethod = methods.FirstOrDefault(x => x.method_content.Equals("组合")); if (currentMethod != null) { sourceItem = methodEx; methodEx = new MethodEx(currentMethod, testDesign.rootMethod); sourceItem = methodEx; methodExes.Add(sourceItem); } } } else { Method currentMethod = methods.FirstOrDefault(x => x.method_content.Equals("组合")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); sourceItem = methodEx; methodExes.Add(sourceItem); } } } else if (xmlNode.SelectSingleNode("label").InnerText == "组合结束") { Method currentMethod = methods.FirstOrDefault(x => x.method_content.Equals("组合")); if (currentMethod != null) { string id = Guid.NewGuid().ToString(); sourceItem.groupID = id; MethodEx source = new MethodEx(sourceItem); MethodEx endItem = new MethodEx(source, sourceItem); endItem.groupID = id; endItem.method_name = "组合" + Properties.Resources.strEnd; endItem.method_ico = "组合结束.png"; endItem.Moveable = false; sourceItem.Children.Add(endItem); } methodEx = sourceItem; } #endregion #region 夹爪保持 else if (xmlNode.SelectSingleNode("label").InnerText == "夹爪保持开始") { if (methodExes.Count > 0) { if (methodExes[methodExes.Count - 1] != null) { Method currentMethod = methods.FirstOrDefault(x => x.method_content.Equals("夹爪保持")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); methodExes.Add(methodEx); sourceItem.Children.Add(methodEx); methodEx.SetParent(sourceItem); sourceItem = methodEx; } } else { Method currentMethod = methods.FirstOrDefault(x => x.method_content.Equals("夹爪保持")); if (currentMethod != null) { sourceItem = methodEx; methodEx = new MethodEx(currentMethod, testDesign.rootMethod); sourceItem = methodEx; methodExes.Add(sourceItem); } } } else { Method currentMethod = methods.FirstOrDefault(x => x.method_content.Equals("夹爪保持")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); sourceItem = methodEx; methodExes.Add(sourceItem); } } } else if (xmlNode.SelectSingleNode("label").InnerText == "夹爪保持结束") { Method currentMethod = methods.FirstOrDefault(x => x.method_content.Equals("夹爪保持")); if (currentMethod != null) { string id = Guid.NewGuid().ToString(); sourceItem.groupID = id; MethodEx source = new MethodEx(sourceItem); MethodEx endItem = new MethodEx(source, sourceItem); endItem.groupID = id; endItem.method_content = endItem.method_name = "夹爪保持" + Properties.Resources.strEnd; endItem.method_ico = "夹爪保持结束.png"; endItem.Moveable = false; sourceItem.Children.Add(endItem); //methodEx = endItem; } methodEx = sourceItem; } #endregion #region if开始 else if (xmlNode.SelectSingleNode("label").InnerText == "if开始") { if (methodExes.Count > 0) { if (methodExes[methodExes.Count - 1] != null) { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("条件判定")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); //methodExes[methodExes.Count - 1] = methodEx; methodEx.method_ico = "开始If.png"; methodEx.method_name = "if开始"; methodEx.method_content = "if开始"; methodExes.Add(methodEx); sourceItem.Children.Add(methodEx); methodEx.SetParent(sourceItem); sourceItem = methodEx; } } else { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("条件判定")); if (currentMethod != null) { sourceItem = methodEx; methodEx = new MethodEx(currentMethod, testDesign.rootMethod); methodEx.method_ico = "开始If.png"; methodEx.method_name = "if开始"; methodEx.method_content = "if开始"; sourceItem = methodEx; methodExes.Add(sourceItem); } } } else { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("条件判定")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); methodEx.method_ico = "开始If.png"; methodEx.method_name = "if开始"; methodEx.method_content = "if开始"; sourceItem = methodEx; methodExes.Add(sourceItem); } } } else if (xmlNode.SelectSingleNode("label").InnerText == "if结束") { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("条件判定")); if (currentMethod != null) { string id = Guid.NewGuid().ToString(); sourceItem.method_ico = "开始If.png"; sourceItem.method_name = "if开始"; sourceItem.method_content = "if开始"; sourceItem.groupID = id; MethodEx source = new MethodEx(sourceItem); MethodEx endItem = new MethodEx(source, sourceItem); endItem.groupID = id; endItem.method_name = "if" + Properties.Resources.strEnd; endItem.method_ico = "结束If.png"; endItem.Moveable = false; sourceItem.Children.Add(endItem); } methodEx = sourceItem; } #endregion #region else开始 else if (xmlNode.SelectSingleNode("label").InnerText == "else开始") { if (methodExes.Count > 0) { if (methodExes[methodExes.Count - 1] != null) { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("条件判定")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); //methodExes[methodExes.Count - 1] = methodEx; methodEx.method_ico = "开始else.png"; methodEx.method_name = "else开始"; methodEx.method_content = "else开始"; methodExes.Add(methodEx); sourceItem.Children.Add(methodEx); methodEx.SetParent(sourceItem); sourceItem = methodEx; } } else { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("条件判定")); if (currentMethod != null) { sourceItem = methodEx; methodEx = new MethodEx(currentMethod, testDesign.rootMethod); methodEx.method_ico = "开始else.png"; methodEx.method_name = "else开始"; methodEx.method_content = "else开始"; sourceItem = methodEx; methodExes.Add(sourceItem); } } } else { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("条件判定")); if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); methodEx.method_ico = "开始else.png"; methodEx.method_name = "else开始"; methodEx.method_content = "else开始"; sourceItem = methodEx; methodExes.Add(sourceItem); } } } else if (xmlNode.SelectSingleNode("label").InnerText == "else结束") { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals("条件判定")); if (currentMethod != null) { string id = Guid.NewGuid().ToString(); sourceItem.method_ico = "开始else.png"; sourceItem.method_name = "else开始"; sourceItem.method_content = "else开始"; sourceItem.groupID = id; MethodEx source = new MethodEx(sourceItem); MethodEx endItem = new MethodEx(source, sourceItem); endItem.groupID = id; endItem.method_name = "else" + Properties.Resources.strEnd; endItem.method_ico = "结束else.png"; endItem.Moveable = false; sourceItem.Children.Add(endItem); } methodEx = sourceItem; } #endregion #region 其它 else { Method currentMethod = methods.FirstOrDefault(x => x.method_name.Equals(xmlNode.SelectSingleNode("label").InnerText)); // 第三方设备名称变更后,可通过ID找出来 if (xmlNode.SelectSingleNode("isThirdPart") != null && bool.Parse(xmlNode.SelectSingleNode("isThirdPart").InnerText) && currentMethod == null) { currentMethod = methods.FirstOrDefault(x => x.method_id.Equals(xmlNode.SelectSingleNode("device/id").InnerText)); } Method currentMethodEnd = methods.FirstOrDefault(x => x.method_name.Equals("结束")); #region 常规方法 if (currentMethod != null) { methodEx = new MethodEx(currentMethod, testDesign.rootMethod); //节点内容绑定 //methodEx.control //判断是否还在循环内,如果还在,则取出最后一个添加 bool isInnerLoop = false; for (int i = methodExes.Count - 1; i >= 0; i--) { if (methodExes[i] != null) { isInnerLoop = true; break; } } if (isInnerLoop) { for (int k = methodExes.Count - 1; k >= 0; k--) { if (methodExes[k] != null) { sourceItem = methodExes[k]; break; } } if (sourceItem != null) { sourceItem.Children.Add(methodEx); methodEx.SetParent(sourceItem); } } else { if (sourceItem != null) { sourceItem.Children.Add(methodEx); } } } #endregion #region 结束 else if (currentMethodEnd != null && xmlNode.SelectSingleNode("name").InnerText == "Method_End") { methodEx = new MethodEx(currentMethodEnd, testDesign.rootMethod); if (sourceItem != null) { sourceItem.Children.Add(methodEx); } currentMethodEnd = null; } #endregion } #endregion } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } return methodEx; } #endregion #region 另存为 private void btnSaveAs_Click(object sender, RoutedEventArgs e) { try { if (btnTestDesign.IsChecked == true) { string fileDir = string.Empty; SaveFileDialog dlg = new SaveFileDialog(); dlg.Title = "另存为"; dlg.FileName = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}.xmed"; // Default file name dlg.DefaultExt = ".xmed"; // Default file extension dlg.Filter = "method文件|*.xmed"; // Filter files by extension dlg.InitialDirectory = System.AppDomain.CurrentDomain.BaseDirectory; if (dlg.ShowDialog(this) == true) { SaveWorkflow(dlg.FileName, true); } } else if (btnConsumableManager.IsChecked == true) { //consumableManagement.SaveConsumable(); //导出成文件 } else if (btnLiquidManager.IsChecked == true) { //liquidManagement.SaveLiquid(); //导出成文件 } else if (btnBacteriaManager.IsChecked == true) { //bacteriaManagement.SaveBacteria(); } } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } } #endregion #region 首页按钮 bool firstPagePressed = false;//首页是否被按下 public void btnStartFirstPage_Click(object sender, RoutedEventArgs e) { firstPagePressed = true; btnFirst.Visibility = Visibility.Visible; btnUserManager.IsChecked = false; btnUser.Visibility = Visibility.Collapsed; if (gridMainContent.Children.Count > 0) { uIElement = gridMain; // gridMainContent.Children.RemoveAt(gridMainContent.Children.Count - 1); gridMainContent.Children.RemoveAt(0); } // gridMainContent.Children.Add(uIElement); gridMainContent.Children.Insert(0, uIElement); if (gridContent.Children.Count > 0) gridContent.Children.RemoveAt(gridContent.Children.Count - 1); List listBtn = ViewCom.GetChildObjects((DependencyObject)gdLeftImageList, typeof(ImageRadioButton)); if (listBtn.Count > 0) { foreach (ImageRadioButton i in listBtn) { if (i.IsChecked == true) { i.IsChecked = false; } } } if (deviceStatus == null) { deviceStatus = new DeviceStatus(); gridContent.Children.Add(deviceStatus); } else { gridContent.Children.Add(deviceStatus); } } #endregion #region 主窗体关闭事件 private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { try { if (wasExecuteInitial) { // 断开设备底层连接 HxResult ret = MethodAction.Instance.ManualDispose(); #region 断开成像Socket if (ConfigurationManager.AppSettings["openTakePhoto"].ToString() == "true" && socketTcpListener != null) { if (socketTcpListener.IsConnect() == true) { socketTcpListener.CloseConnect(); } } #endregion #region 断开与设备的连接 // 停止服务端监听 SocketInteriorService.BreakConnect(); // 断开与设备的通讯 EquConnect.BreakDeviceConnect(); #endregion } Application.Current.Shutdown(); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } } #endregion #region 控制面板 private async void btnControl_Click(object sender, RoutedEventArgs e) { try { ControlPanel controlPanel = new ControlPanel(); controlPanel.Owner = (Window)Shared.Main; controlPanel.ShowDialog(); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } } #endregion #region 暂停按钮 //int pauseState = 0;//1:暂停状态;0:正常状态 //private async void btnPause_Click(object sender, RoutedEventArgs e) //{ // if (pauseState == 0) // { // pauseState = 1; // runWnd.manualEvent.Reset(); // btnPause.Content = Properties.Resources.btnContinue.ToString(); // HxResult ret = MethodAction.Instance.StatusLamp(5); // await Task.Factory.StartNew(() => MethodAction.Instance.Interrupt(1, true)); // } // else // { // pauseState = 0; // runWnd.manualEvent.Set(); // btnPause.Content = Properties.Resources.btnPause.ToString(); // HxResult ret = MethodAction.Instance.StatusLamp(4); // await Task.Factory.StartNew(() => MethodAction.Instance.Interrupt(2)); // } //} #endregion #region 断线重连 private void imgDeviceStatus_PreviewMouseDown(object sender, MouseButtonEventArgs e) { if (MethodAction.Instance != null) { if (!MethodAction.Instance.Connected) { HxResult ret = MethodAction.Instance.Connect(); if (ret.Result != ResultType.Success) { // 状态0 未链接 黄闪 ret = CommonBll.StatusLamp(0, false); EnableSimulator = true; connectedEquip = false; OperateAuditLogDB.AddOperateAuditLogIntodb(operateAuditLogBll.GenerateOperateAuditLog("设备连接", "用户:" + Shared.User.username + "重新连接设备", Shared.User.username, "设备连接", "", "", "用户[id:" + Shared.User.username + "]", "失败")); } else { // 状态1 链接成功 蓝亮 ret = CommonBll.StatusLamp(1, false); string TargetPath = "Assets/connect.png"; imgDeviceStatus.Source = new BitmapImage(new Uri(TargetPath, UriKind.Relative)); connectedEquip = true; OperateAuditLogDB.AddOperateAuditLogIntodb(operateAuditLogBll.GenerateOperateAuditLog("设备连接", "用户:" + Shared.User.username + "重新连接设备", Shared.User.username, "设备连接", "", "", "用户[id:" + Shared.User.username + "]", "成功")); // 连接设备初始化后 DoAfterInitDevice(); } } } } #endregion #region 系统设置 SystemSettings systemSettings = null; private void btnSettings_Click(object sender, RoutedEventArgs e) { systemSettings = new SystemSettings(); systemSettings.mainWindow = this; systemSettings.observers.Clear(); SetObserverNode(testDesign.rootMethod); systemSettings.ShowDialog(); } #endregion #region 关于 private void btnAbout_Click(object sender, RoutedEventArgs e) { SystemInformation systemInformation = new SystemInformation(); systemInformation.Width = 760; systemInformation.Height = 410; systemInformation.Owner = this; systemInformation.ShowDialog(); } #endregion #region 事件接收函数 private void MainEvent(object sender, EventExArgs e) { // 显示设置报错Dialog if (e.nType == EventEnum.ShowDeviceErrorDialg) { Application.Current.Dispatcher.Invoke(() => { ErrorClientData errorData = (ErrorClientData)sender; OperateDeviceDialog operateDeviceDialog = new OperateDeviceDialog(errorData); operateDeviceDialog.ShowDialog(); EventBind.OperMark = operateDeviceDialog.OperMark; // 节点操作类型(1跳过、2重试、3终止) SocketInteriorService.dicManualResetEvent[Shared.Exp.ExperimentId].Set(); }); } } #endregion private void btnStartFirstPage_MouseEnter(object sender, MouseEventArgs e) { //RectangleGeometry rectangleGeometry = new RectangleGeometry(new Rect(0, 0, 70, 70), 5, 5); //GeometryDrawing MaskDrawing = new GeometryDrawing(Brushes.White, null, rectangleGeometry); //DrawingBrush drawingBrush = new DrawingBrush(MaskDrawing); //btnStartFirstPage.OpacityMask = drawingBrush; //drawingBrush.Stretch = Stretch.Fill; //btnStartFirstPage.OpacityMask.Opacity = 0.8d; } private void btnStartFirstPage_MouseLeave(object sender, MouseEventArgs e) { //btnStartFirstPage.OpacityMask.Opacity = 1d; } private void UserControl_PreviewKeyDown(object sender, KeyEventArgs e) { } } }