using DataEntity;
using DataEntity.Share;
using DataRWDAL;
using DriverLib.Engine;
using HandyControl.Controls;
using HxEnum;
using HxSocket;
using MySqlX.XDevAPI.Common;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using System.Xml;
using XCommon;
using XCommon.Log;
using XCore;
using XHandler.Class;
using XHandler.Class.DataEx;
using XHandler.Controls;
using XHandler.Controls.Run;
using XHandler.Controls.Run.Com;
using XHandler.View.Com;
using XHandler.View.MethodProperty;
using XImagingXhandler.XDAL;
using Application = System.Windows.Application;
using Panel = System.Windows.Controls.Panel;
using XImaging.Automation.Service;
namespace XHandler.View
{
///
/// RunWnd.xaml 的交互逻辑
///
public partial class RunWnd : System.Windows.Controls.UserControl
{
#region 变量
///
/// 运行日志相关
///
private static object m_lockTipMsg = new object();
private ObservableCollection logList = new ObservableCollection();
private List labwareList;
private List latticeList;
private MethodEx rootMethod;
private int nTableRows;
private int nTableColumns;
// 实验状态 key:实验ID,value:线程启停控制
private static Dictionary dicManualResetEvent = new Dictionary(); // 为true,一开始就可以执行
private Dictionary VariableDictionary = new Dictionary(); // 存储方法序列中的所有变量与值
public event EventHandler closeEvent;
public CancellationTokenSource _cancelSource = new CancellationTokenSource(); // 取消线程
public bool EnableSimulator = false;
public XmlDocument xmlDocument = null;
public MainWindow mainWindow = null;
public float currentLengthOfTip = 0f; // 当前已加载的Tip去掉插入深度后的Tip长度,用于吸液排液Z轴的计算
public bool currentIsLoadingTips = false; // 当前运行时,设备枪上是否装上了枪头
public string currentInValidWell = string.Empty; // 当前运行时,台面上已经被安装的枪头孔位数据串
public static List currentIsUsedWellLattice = new List(); // 存储当前被使用过的板位和孔配对象,保存在xml文件中
public string currentWellLatticeId = string.Empty; // 当前已安装的枪头所在的板位Id
public Stack gloadVariable = new Stack(); // 保存流程中声明的变量
public DataTable dataTableTotal = new DataTable(); // 保存所有移液数据记录
public float fVolumeToNull = 0.0f; // 排到空的体积
public bool isRemotingOper = false; // 是否是远程整合运行
public string captureData = string.Empty; // 保存当前拍照返回的数据
//public XmlNode xmlEnvBak = null; // 流程运行前备份env数据
public List lstCoatingLabware = null; // 涂布使用的所有目标耗材板
public string choiceBarcode = string.Empty; // 上次往成像位移动的皿的barcode
public string choiceSrcLabwareSname = string.Empty; // 上次往成像位移动的皿的实际板位号
public int choiceTimes = 1; // 上次往成像节点设置的涂布接种次数
public string batchId = Guid.NewGuid().ToString(); // 批次ID(用于暂停)
public MethodEx selectedMethodEx = null;//当前选中的运行节点--提供给单次运行选中的节点用
public ExperimentRunLog currentExperimentRunLog = new ExperimentRunLog();//保存当前的运行记录对象
private double zoomVal = 1.5; //真实台面与显示台面的比例
public List methodTimers = new List();//保存当前正在运行的计时器时间对象
System.Threading.Timer timeTimer = null;//计时器时间循环计时
public List taskForSubmethod = new List();//保存当前正在运行的异步子流程task对象
#region 循环命令控制变量
bool isLoop1Start = false;//是否处在循环之中
#endregion
#region 夹爪保持的开始数据对象
public MethodGripTransport startMethodGripTransport;
#endregion
#region BLL
private MethodListBll methodListBll = new MethodListBll();
private LabwareBll labwareBll = new LabwareBll();
private TakePhotoBll takePhotoBll = new TakePhotoBll();
#endregion
#region control
private UnloadTipsControl unloadTipsCtrl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
#endregion
#region remote
public Action OnError;
public Action OnAbort;
public Object remoteObjectCmd;//远程专用接收消息参数
#endregion
#endregion
#region 构造函数
///
/// 构造函数
///
public RunWnd()
{
InitializeComponent();
mainWindow = (MainWindow)Application.Current.MainWindow;
// 初始化移液记录表结构
DataExportBll dataExportBll = new DataExportBll();
dataTableTotal = dataExportBll.GenerateDataPortStructure().Clone();
methodTimers = new List();
}
public RunWnd(List labwareList, MethodEx method, bool enableSimulator, XmlDocument xmlDoc)
{
if (hadRun)
{
return;
}
InitializeComponent();
this.labwareList = labwareList;
this.rootMethod = method;
this.EnableSimulator = enableSimulator;
this.xmlDocument = xmlDoc;
this.mainWindow = (MainWindow)Application.Current.MainWindow;
methodTimers = new List();
// 创建台面数据
CreateLattice(true);
}
#endregion
///
/// 刷新显示界面
///
///
///
///
///
public void RunWndRefresh(List labwareList, MethodEx method, bool enableSimulator, XmlDocument xmlDoc)
{
try
{
if (runTreeviewWorkflow != null)
{
this.labwareList = labwareList;
this.rootMethod = method;
this.EnableSimulator = enableSimulator;
this.xmlDocument = xmlDoc;
// 创建台面数据
CreateLattice(false);
// 加载台面和流程方法
LoadLatticeAndMethod(false);
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
try
{
if (Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceChoice)
{
double W = gridTable.ActualWidth / Shared.SoftwareInformation.rows;
double H = gridTable.ActualHeight / Shared.SoftwareInformation.columns;
imgdish.Width = W * 2 - 20;
imgdish.Height = H * 2 - 10;
imgdish.Visibility = Visibility.Visible;
//imgdish1.Visibility = Visibility.Collapsed;
}
else if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
//double W = (gridTable.ActualWidth) / Shared.SoftwareInformation.columns;
//double H = gridTable.ActualHeight / Shared.SoftwareInformation.rows;
//imgdish1.Width = W - 10;
//imgdish1.Height = H * 2 - 10;
//imgdish1.Visibility = Visibility.Visible;
imgdish.Visibility = Visibility.Collapsed;
}
else
{
imgdish.Visibility = Visibility.Collapsed;
//imgdish1.Visibility = Visibility.Collapsed;
}
if (hadRun)
{
return;
}
// 加载台面和流程方法
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
LoadLatticeAndMethod(true);
}
methodTimers = new List();
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
}
///
/// 创建台面数据
///
///
private void CreateLattice(bool isInitFlg = false)
{
if (isInitFlg)
{
#region 清除缓存
// 清空所有控件数据
gridTable.Children.Clear();
gridTable.RowDefinitions.Clear();
gridTable.ColumnDefinitions.Clear();
runTreeviewWorkflow.ItemsSource = null;
logListbox.ItemsSource = logList;
if (logList.Count > 0)
{
logList.Clear();
}
if (workStack.Count > 0)
{
workStack.Clear();
}
// 初始化移液记录表结构
DataExportBll dataExportBll = new DataExportBll();
dataTableTotal = dataExportBll.GenerateDataPortStructure().Clone();
#endregion
#region 创建台面布局
//判断当前系统使用的是什么台面模板
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
nTableRows = Shared.SoftwareInformation.rows;
nTableColumns = Shared.SoftwareInformation.columns;
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
// 第6列是垃圾桶
nTableColumns++;
}
// 获取台面点位信息
latticeList = DataModule.getInstance().GetLattices();
// 流程跟踪
runTreeviewWorkflow.ItemsSource = rootMethod.Children;
// 台面布局
for (int i = 0; i < nTableRows; i++)
{
gridTable.RowDefinitions.Add(new RowDefinition());
}
for (int j = 0; j < nTableColumns; j++)
{
gridTable.ColumnDefinitions.Add(new ColumnDefinition());
}
int latticeNum = 1; // PN
for (int iColumnIndex = 0; iColumnIndex < nTableColumns; iColumnIndex++)
{
for (int iRowIndex = 0; iRowIndex < nTableRows; iRowIndex++)
{
// 板位索引
int latticeIndex = iColumnIndex * Shared.SoftwareInformation.rows + iRowIndex;
if (latticeIndex + 1 > latticeList.Count)
{
break;
}
// 微牧:P16与P17合并单元格,不添加P17控件
if ((Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceLiteChoice ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200)) &&
latticeNum == mainWindow.ChoiceLatticeId + 1)
{
latticeNum++;
continue;
}
// Lite:P10与P11、P12合并单元格,不添加P11、P12控件
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLite) &&
(latticeNum == 11 || latticeNum == 12))
{
latticeNum++;
continue;
}
// 是否是垃圾桶
bool isTrash = latticeList[latticeIndex].is_trash == 1;
// 添加台面布置格子
Canvas canvas = AddTableItems(iRowIndex, iColumnIndex, latticeNum, isTrash);
if (!isInitFlg)
{
canvas.Width = (gridTable.ActualWidth - 10d * 2 * nTableColumns) / (double)nTableColumns;
canvas.Height = (gridTable.ActualHeight - 10d * 2 * nTableRows) / (double)nTableRows;
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
// 成像板位
if (latticeNum == mainWindow.ChoiceLatticeId)
{
canvas.Height = (canvas.Height + 10d) * 2;
}
// 垃圾桶
else if (isTrash)
{
canvas.Height = (canvas.Height + 10d) * 3;
}
}
}
latticeNum++;
int ncol = nTableColumns - iColumnIndex - 1;
int zindex = ncol * nTableRows + iRowIndex;
Panel.SetZIndex(canvas, zindex);
}
}
}
else
{
SetTabletopGraduated();
//加载台面板位
//加载该台面模板
ObservableCollection latticesList = TabletopTemplateDB.GetLatticesByTabletopTemplateId(tabletopTemplate.tabletopid);
int iLatticeCount = 0;
numOfCanvas = 0;
foreach (Lattice lattice in latticesList)
{
// 是否是垃圾桶
bool isTrash = (lattice.is_trash == 1) ? true : false;
//if (isTrash)
//nTrashIndex = Convert.ToInt32(lattice.lattice_num.Substring(1, lattice.lattice_num.Length - 1));
// 添加台面布置格子
Canvas canvas = AddLatticeIntoTabletop(lattice, tabletopTemplate.tabletopid);
//latticeNum++;
//int ncol = nTableColumns - iColumnIndex - 1;
int zindex = (latticesList.Count - iLatticeCount++);
Panel.SetZIndex(canvas, zindex);
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
if (Convert.ToInt32(lattice.lattice_num.Substring(1, lattice.lattice_num.Length - 1)) == mainWindow.ChoiceLatticeId - 1) // P16、P17
{
Labware lbe = LabwareDB.GetLabware(ConfigurationManager.AppSettings["choicelabwareId"].ToString());
ControlLabware control = new ControlLabware();
if (lbe.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.CircularDish).ToString()) // 圆形皿
{
control.LabwareWidth = canvas.ActualWidth;
control.LabwareHeight = canvas.ActualHeight;
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.Rows = (int)lbe.number_row;
control.Columns = (int)lbe.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = canvas.Name;
control.LabwareType = Convert.ToInt16(lbe.labware_type_id);
control.ValidWells = "";
control.Width = canvas.ActualWidth;
control.Height = canvas.ActualHeight + 4;
}
Canvas.SetLeft(control, 0);
Canvas.SetBottom(control, 0);
LabwareEx lb = new LabwareEx(lbe);
lb.row = Grid.GetRow(canvas);
lb.col = Grid.GetColumn(canvas);
lb.position = canvas.Name;
lb.validWells = control.ValidWells;
canvas.DataContext = lb;
canvas.Children.Add(control);
control.SetValidWells(control.ValidWells);
}
}
/*else if (Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceHXELEC)//电泳切胶槽位置
{
if (Convert.ToInt32(lattice.lattice_num.Substring(1, lattice.lattice_num.Length - 1)) == 1) // P1
{
Labware lbe = LabwareDB.GetLabware(ConfigurationManager.AppSettings["choicelabwareId"].ToString());
ControlLabware control = new ControlLabware();
if (lbe.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Electrophoto).ToString()) //电泳槽
{
control.LabwareWidth = canvas.Width;
control.LabwareHeight = canvas.Height;
control.LabwareRealLength = lbe.labware_length;
control.LabwareRealWidth = lbe.labware_width;
control.Rows = (int)lbe.number_row;
control.Columns = (int)lbe.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = canvas.Name;
control.LabwareName = lbe.labware_name;
control.LabwareType = Convert.ToInt16(lbe.labware_type_id);
control.ValidWells = "";
control.labwareWellInfoList = lbe.labwareWellInfoList;
control.Width = canvas.Width;
control.Height = canvas.Height + 4;
control.Loaded += ControlLabware_Loaded;
}
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.position = canvas.Name;
lb.validWells = control.ValidWells;
canvas.DataContext = lb;
canvas.Children.Add(control);
control.SetValidWells(control.ValidWells);
}
}*/
}
// 流程跟踪
runTreeviewWorkflow.ItemsSource = rootMethod.Children;
}
#endregion
}
else
{
runTreeviewWorkflow.ItemsSource = null;
logListbox.ItemsSource = logList;
if (logList.Count > 0)
{
logList.Clear();
}
if (workStack.Count > 0)
{
workStack.Clear();
}
// 流程跟踪
runTreeviewWorkflow.ItemsSource = rootMethod.Children;
ClearLattices();
}
// 模拟运行/真机运行
tbxRunTitle.Text = EnableSimulator ? Properties.Resources.strSimulatorRun : Properties.Resources.strRealMachineRun;
}
#region 布局当前台面的大小
///
/// 布局当前台面的大小
///
public void SetTabletopGraduated()
{
double length = Shared.SoftwareInformation.realtabletoplength;//mm
double width = Shared.SoftwareInformation.realtabletopwidth;//mm
gridTable.Width = length / zoomVal;//统一缩小,即1个像素代表2.5mm
gridTable.Height = width / zoomVal;
}
#endregion
#region 向新布局的台面中添加板位--板位用canvas
public Canvas AddLatticeIntoTabletop(Lattice lattice, string tabletopid)
{
int latticeId = Convert.ToInt32(lattice.lattice_num.Substring(1, lattice.lattice_num.Length - 1));
bool bAllowDrop = true;
if (latticeId == mainWindow.ChoiceLatticeId)
{
bAllowDrop = false;
}
else if ((Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200)) &&
latticeId == 19)
{
latticeId = 0;
}
TabletopRelLattice tabletopRelLattice = TabletopRelLatticeDB.GetTabletopRelLatticeByTabletopIdAndLatticeId(tabletopid, Convert.ToInt32(lattice.lattice_id));
Canvas canvas = new Canvas()
{
Margin = new Thickness(6, 6, 6, 6),
AllowDrop = bAllowDrop,
Name = "P" + latticeId.ToString(),
Width = LabwareDB.GetLabware(tabletopRelLattice.labware_id).labware_length / zoomVal,
Height = LabwareDB.GetLabware(tabletopRelLattice.labware_id).labware_width / zoomVal
};
TextBlock tb = new TextBlock();
tb.Text = "P" + latticeId.ToString();
tb.FontSize = 18;
tb.Foreground = Brushes.Black;
tb.VerticalAlignment = VerticalAlignment.Center;
tb.HorizontalAlignment = HorizontalAlignment.Center;
Border border = new Border()
{
Background = Brushes.DarkGray,
CornerRadius = new CornerRadius(5),
Child = tb,
};
canvas.Children.Add(border);
canvas.SizeChanged += Canvas_SizeChanged;
canvas.Loaded += Canvas_Loaded;
canvas.Tag = tabletopRelLattice;
if (lattice.is_trash == 1)
{
ControlLabware cl = new ControlLabware()
{
IsTrash = true,
LabwareName = Properties.Resources.strTrash.ToString()
};
LabwareEx lb = new LabwareEx();
lb.labware_name = Properties.Resources.strTrash;
//lb.row = row;
//lb.col = column;
canvas.DataContext = lb;
canvas.Children.Add(cl);
}
gridTable.Children.Add(canvas);
//Grid.SetColumn(canvas, column);
//Grid.SetRow(canvas, row);
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
#region 挑菌台面暂时屏蔽
/*if (lattice.is_trash == 1)
{
Grid.SetColumnSpan(canvas, 1);
Grid.SetRowSpan(canvas, 3);
}
else if (latticeId == mainWindow.ChoiceLatticeId)
{
Grid.SetColumnSpan(canvas, 1);
Grid.SetRowSpan(canvas, 2);
// 将Image控件添加到Canvas上
Image image = new Image();
image.Source = (ImageSource)(new ImageSourceConverter()).ConvertFrom(new Uri(@"pack://application:,,,/XHandler;component/Assets/dish_LiteChoice.png"));
image.Stretch = Stretch.Fill;
image.Width = canvas.Width - 4;
image.Height = canvas.Height - 23;
Canvas.SetLeft(image, 2);
Canvas.SetTop(image, 2);
canvas.Children.Add(image);
Panel.SetZIndex(image, 99);
}*/
#endregion
}
return canvas;
}
#endregion
#region 板位加载显示完成后,处理布局
int numOfCanvas = 0;//记录已加载的板位数
private void Canvas_Loaded(object sender, RoutedEventArgs e)
{
Canvas canvasOfLattice = sender as Canvas;
canvasOfLattice.HorizontalAlignment = HorizontalAlignment.Left;
canvasOfLattice.VerticalAlignment = VerticalAlignment.Top;
canvasOfLattice.Loaded -= Canvas_Loaded;//运行完去掉
//换算在新的平面坐标中,板位的位置
if (canvasOfLattice.Tag == null)
{
return;
}
TabletopRelLattice tabletopRelLattice = (TabletopRelLattice)canvasOfLattice.Tag;
double xPixelVal = tabletopRelLattice.lattice_pixel_x / (zoomVal / (double)2);
double yPixelVal = tabletopRelLattice.lattice_pixel_y / (zoomVal / (double)2);
canvasOfLattice.Margin = new Thickness(xPixelVal, yPixelVal, 0, 0);
canvasOfLattice.Tag = null;
numOfCanvas++;
ObservableCollection latticesList = TabletopTemplateDB.GetLatticesByTabletopTemplateId(tabletopRelLattice.tabletopid);
if (numOfCanvas == latticesList.Count)
{
//加载耗材
LoadLatticeAndMethod(true);
numOfCanvas = 0;
}
}
#endregion
#region 清空台面耗材
public void ClearLattices()
{
foreach (Canvas canvas in gridTable.Children)
{
if (canvas.DataContext != null)
{
LabwareEx labware = canvas.DataContext as LabwareEx;
if (!string.IsNullOrEmpty(labware.labware_id))
{
canvas.DataContext = null;
canvas.Tag = null;
for (int i=canvas.Children.Count-1;i>0;i--)
{
var item = canvas.Children[i];
canvas.Children.Remove(item);
}
}
}
}
}
#endregion
///
/// 加载台面和流程方法
///
///
private void LoadLatticeAndMethod(bool isInitFlg = false)
{
#region 加载流程和台面
foreach (var lb in labwareList)
{
int row = lb.row;
int col = lb.col;
// 获取台面对应格子的Canvas
Canvas canvas = null;
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
canvas = GetGridTableCanvas(row, col);
}
else
{
canvas = GetCanvasByLatticeNumOfLabware(lb);
}
Stack labwareExes = new Stack();
if (canvas == null)
{
continue;
}
ControlLabware control;
if (string.IsNullOrEmpty(lb.labware_id))
{
control = new ControlLabware()
{
IsTrash = true,
Width = canvas.ActualWidth,
Height = canvas.ActualHeight,
};
}
else
{
control = new ControlLabware();
control.AllowDrop = true;
double canvasWidth = 0d;
double canvasHeight = 0d;
if (isInitFlg)
{
canvasWidth = canvas.ActualWidth;
canvasHeight = canvas.ActualHeight;
}
else
{
canvasWidth = canvas.ActualWidth == 0 ? canvas.Width : canvas.ActualWidth;
canvasHeight = canvas.ActualHeight == 0 ? canvas.Height : canvas.ActualHeight;
}
if (canvas.Name.Equals(ConfigurationManager.AppSettings["choiceLatticeId"].ToString()))
{
control.LabwareWidth = canvasWidth - 5;
control.LabwareHeight = canvasHeight / 2;
}
else
{
control.LabwareWidth = canvasWidth;
control.LabwareHeight = canvasHeight;
}
control.LeftSideColor = ComUtility.RGBToColor(lb.labware_color_lside);
control.FrontColor = ComUtility.RGBToColor(lb.labware_color_front);
control.TopColor = ComUtility.RGBToColor(lb.labware_color_top);
control.BorderColor = ComUtility.RGBToColor(lb.labware_color_line);
control.Rows = (int)lb.number_row;
control.Columns = (int)lb.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = (string.IsNullOrEmpty(lb.labware_sname) ? lb.position : lb.labware_sname);
control.LabwareName = lb.labware_name;
control.LabwareType = Convert.ToInt16(lb.labware_type_id);
control.ValidWells = lb.validWells;
//control.InValidWells = lb.invalidWells;
if (lb.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Tube).ToString()) //管架
{
control.LabwareRealLength = lb.labware_length;
control.LabwareRealWidth = lb.labware_width;
control.labwareWellInfoList = lb.labwareWellInfoList;
}
if (lb.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Electrophoto).ToString()) //电泳切胶槽
{
control.LabwareRealLength = lb.labware_length;
control.LabwareRealWidth = lb.labware_width;
control.labwareWellInfoList = lb.labwareWellInfoList;
control.Loaded += ControlLabware_Loaded;
}
}
Canvas.SetLeft(control, 0);
if (lb.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Electrophoto).ToString()) //电泳切胶槽
{
Canvas.SetTop(control, 0);
}
else
{
Canvas.SetBottom(control, 0);
}
lb.label = lb.position;
canvas.DataContext = lb;
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 i = 0; i < canvas.Children.Count; i++)
{
ControlLabware a = canvas.Children[i] as ControlLabware;
if (a != null)
{
leftMargin += a.LabwareDeep;
bottomMargin += a.LabwareDeep;
}
}
control.Margin = new Thickness(leftMargin, 0, 0, bottomMargin);
canvas.Children.Add(control);
Border labelText = Utilities.FindVisualChild(canvas);
if (labelText != null)
{
labelText.Width = canvas.ActualWidth;
}
//如果是第二及其以上耗材,要隐藏标签
if (labwareExes.Count > 1)
{
control.Label = "";
}
else
{
control.Label = (string.IsNullOrEmpty(lb.labware_sname) ? lb.position : lb.labware_sname);
}
}
if (runTreeviewWorkflow.Items.Count > 0)
{
TreeViewItem tvi = runTreeviewWorkflow.ItemContainerGenerator.ContainerFromItem(runTreeviewWorkflow.Items[0]) as TreeViewItem;
if (tvi != null)
{
tvi.Focus();
}
}
#endregion
}
#region 耗材加载后,重新设置高度
private void ControlLabware_Loaded(object sender, RoutedEventArgs e)
{
var controlLabware = sender as ControlLabware;
if (controlLabware != null)
{
controlLabware.Height = ((Canvas)(controlLabware.Parent)).Height;
controlLabware.Width = ((Canvas)(controlLabware.Parent)).Width;
}
}
#endregion
#region 根据当前耗材所在的板位名称查找板位对象
///
/// 根据当前耗材所在的板位名称查找板位对象
///
/// 当前耗材对象
/// 符合条件的板位对象
public Canvas GetCanvasByLatticeNumOfLabware(LabwareEx labwareEx)
{
List canvasList = Utilities.FindAllVisualChild(gridTable);
foreach(Canvas canvas in canvasList)
{
if(canvas.Name==labwareEx.position)
{
return canvas;
}
}
return null;
}
#endregion
#region 设计界面板位名称查找板位对象
///
///
///
///
///
public Canvas GetCanvasByLatticeNumOfLabwareMainForm(LabwareEx labwareEx)
{
if (mainWindow != null)
{
foreach (var canvasItem in mainWindow.testDesign.gridTable.Children)
{
Canvas canvas = canvasItem as Canvas;
if (canvas.Name == labwareEx.position)
{
return canvas;
}
}
}
return null;
}
#endregion
#region 加载当前运行方法的labware到台面
public int LoadLabwareOnRunningRemote()
{
int iresult = 1;
try
{
//2.找到台面运行的开始节点
XmlNode startNode = xmlDocument.SelectSingleNode("root/method[isrun='运行起点']");
if (startNode != null)
{
int mid = Convert.ToInt32(startNode.Attributes["id"].Value);
if (startNode.SelectSingleNode("name").InnerText == "start")
{
mid = mid;
}
//Task taskMain= Task.Run(() =>
//{
iresult = ExecMethodList(xmlDocument, mid);
//return iresult;
//},_cancelSource.Token);
//iresult = taskMain.Result;
}
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
LoggerHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>" + Properties.MachineRunResource.strSystem.ToString() + Properties.MachineRunResource.strGameOver.ToString());
LoggerHelper.InfoLog("///////////////////////////////////////////////////////////////////////////////////////////////////////////////////");
}
else
{
LoggerHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>System:End method-complete.");
LoggerHelper.InfoLog("///////////////////////////////////////////////////////////////////////////////////////////////////////////////////");
}
MethodAction.Instance.OnAlarm -= GenerateAlarmingMessage;
}
catch(Exception ex)
{
LoggerHelper.InfoLog("执行错误:" + ex.Message.ToString());
}
return iresult;
}
#endregion
#region 告警事件处理
private void GenerateAlarmingMessage(object sender, EventArgs e)
{
if (Shared.SoftwareInformation.currentculture.Equals("zh_CN"))
{
AddLogs("运行出现异常报警,消息源:" + sender.ToString() + ";事件:" + e.ToString());
LoggerRunHelper.WarnLog("运行出现异常报警,消息源:" + sender.ToString() + ";事件:" + e.ToString());
if (isRemotingOper)
{
OnError?.Invoke(remoteObjectCmd, "EC-1041", 5, "程序运行中遇到错误(具体原因请查看日志),运行方法终止.", 2);
}
}
else
{
AddLogs("There is a alarm on the running task, source:" + sender.ToString() + ";event:" + e.ToString());
LoggerRunHelper.WarnLog("There is a alarm on the running task, source:" + sender.ToString() + ";event:" + e.ToString());
if (isRemotingOper)
{
OnError?.Invoke(remoteObjectCmd, "EC-1041", 5, "程序运行中遇到错误(具体原因请查看日志),运行方法终止.", 2);
}
}
}
#endregion
#region 加载当前运行方法的labware到台面
public async Task LoadLabwareOnRunning()
{
int iresult = 1;
//XmlDocument xmlDocument = new XmlDocument();
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
//Window wnd = Application.Current.MainWindow;
//xmlDocument = wnd.testDesign.GenerateLaunchXmlDocument();
}));
#region 登录实验表、实验运行表
Shared.Exp = AddExp(xmlDocument.OuterXml);
LoggerRunHelper.InfoLog(string.Format("【{0}】>experimentid = {1}, 实验开始 ====================== ",
Properties.MachineRunResource.strSystem, Shared.Exp.ExperimentId));
#endregion
#region 运行开始节点
XmlNode startNode = xmlDocument.SelectSingleNode("root/method[isrun='运行起点']");
if (startNode != null)
{
int mid = Convert.ToInt32(startNode.Attributes["id"].Value);
// 流程运行前备份env数据
//xmlEnvBak = xmlDocument.SelectSingleNode("root/env").Clone();
if (startNode.SelectSingleNode("name").InnerText == "start")
{
mid = mid;
}
await Task.Run(() =>
{
iresult = ExecMethodList(xmlDocument, mid);
Task.WaitAll(taskForSubmethod.ToArray());
}, _cancelSource.Token);
}
#endregion
#region 更新运行状态、结束时间
Shared.Exp.EndTime = DateTime.Now;
// 0:失败;2:停止
if (iresult == 0 || iresult == 2)
{
Shared.Exp.Status = EnumManagement.GetEnumValue(ExpStatusEnum.Stop); // 异常终止
}
else
{
Shared.Exp.Status = EnumManagement.GetEnumValue(ExpStatusEnum.Completed); // 1;正常结束
}
ExperimentDB.Update(Shared.Exp);
#endregion
#region 结束日志
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>" + Properties.MachineRunResource.strSystem.ToString() + Properties.MachineRunResource.strGameOver.ToString());
}
else
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>System:End method-complete.");
}
LoggerRunHelper.InfoLog(string.Format("【{0}】>experimentid = {1}, 实验结束 ====================== ",
Properties.MachineRunResource.strSystem, Shared.Exp.ExperimentId));
#endregion
#region 状态7 运行结束 蓝闪/蜂鸣5S
HxResult ret = CommonBll.StatusLamp(7, EnableSimulator);
if (!isRemotingOper)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
string strMsg = string.Empty;
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
strMsg = iresult == 1 ? Properties.MachineRunResource.strMethodRunSuccess.ToString() : Properties.MachineRunResource.strMethodRunFail.ToString();
}
else
{
strMsg = iresult == 1 ? "method-complete!" : "method-fail!";
}
PlsToolTipWin plsToolTipWin = new PlsToolTipWin(strMsg);
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.btnCancel.Visibility = Visibility.Hidden;
plsToolTipWin.ShowDialog();
}));
}
#endregion
return iresult;
}
#endregion
///
/// 执行流程中方法
///
///
///
/// 0:失败;1:成功;2:停止;3:skip
public int ExecMethodList(XmlDocument xmlDocument, int startId)
{
int resultExc = 1;
// 方法
XmlNodeList xmlNodeMethodList = xmlDocument.SelectNodes("root/method[@id>=" + startId + "]");
XmlNode xmlEnv = xmlDocument.SelectSingleNode("root/env");
var platformNodeList = xmlEnv.SelectNodes("platform");
bool bResult = false;
int ind = 0;
//生成运行时台面所有板位上的对象数据
// 清空方法列表
for (int n = 0; n < xmlNodeMethodList.Count; n++)
{
string MethodName = xmlNodeMethodList[n].SelectSingleNode("label").InnerText;
workStack.Push(MethodName);
string id = xmlNodeMethodList[n].Attributes["id"].Value.ToString();
string strIndex = xmlNodeMethodList[n].SelectSingleNode("strIndex").InnerText;
float xAxisSafeVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["xAxisSafeVal"]);
float yAxisSafeVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["yAxisSafeVal"]);
float zAxisSafeVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["zAxisSafeVal"]);
int iNum = methodListBll.getNumByMethodName(MethodName);
if (_cancelSource.IsCancellationRequested)
{
_cancelSource = new CancellationTokenSource();
return 2;
}
if (xmlNodeMethodList[n].SelectSingleNode("status")==null)
{
continue;
}
if(xmlNodeMethodList[n].SelectSingleNode("status").InnerText != "enable")
{
continue;
}
if(selectedMethodEx == null)
{
}
else if(ExistNodeByNodeIndex(selectedMethodEx, strIndex))
{
}
else if(!ExistNodeByNodeIndex(selectedMethodEx,strIndex))
{
continue;
}
// 设置节点状态
SetRunningStatus(strIndex);
switch (iNum)
{
case (int)MethodNameEnum.start: // 开始
#region 开始
lstCoatingLabware = null; // 清空涂布使用的所有目标耗材板
string usehepa = xmlNodeMethodList[n].SelectSingleNode("usehepa").InnerText;
string isReset = xmlNodeMethodList[n].SelectSingleNode("isreset").InnerText;
string isCheckTakePhotoPlate = xmlNodeMethodList[n].SelectSingleNode("isCheckTakePhotoPlate").InnerText;
#region 复位
bool isOk = DoRest(this, isReset, xmlNodeMethodList[n]);
if (!isOk)
{
return 2;
}
#endregion
#region 检查成像板位是否有板
if (ConfigurationManager.AppSettings["openTakePhoto"].ToString() == "true")
{
isOk = DoCheckTakePhotoPlate(isCheckTakePhotoPlate, EnableSimulator);
if (!isOk)
{
return 2;
}
}
#endregion
#endregion
break;
case (int)MethodNameEnum.aspirate: // 吸液
#region 吸液
AspirateControl aspirateControl = new AspirateControl(Shared.SoftwareInformation.currentculture);
aspirateControl.launchView = this;
bResult = aspirateControl.ExecuteAspirate(xmlEnv, xmlNodeMethodList[n], currentLengthOfTip, zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.dispense: // 排液
#region 排液
DispenseControl dispenseControl = new DispenseControl(Shared.SoftwareInformation.currentculture);
dispenseControl.launchView = this;
// 是否在循环中,当前循环的
bResult = dispenseControl.ExecuteDispense(xmlEnv, xmlNodeMethodList[n], currentLengthOfTip, zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.end: // 结束
#region 结束
lstCoatingLabware = null; // 清空涂布使用的所有目标耗材板
ChoiceTransferControl.ChoiceData = null;
CoatingTransferControl.CoatingData = null;
string isGoHome = xmlNodeMethodList[n].SelectSingleNode("isGoHome").InnerText;
string isTipsOff = xmlNodeMethodList[n].SelectSingleNode("isTipsOff").InnerText;
if (!isRemotingOper)
{
if (mainWindow.wasLoadedTip)//抢上有枪头,需要卸载
{
if (isTipsOff.ToLower() == "true")
{
//调用执行方法,更新执行结果字符串
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
unloadTipsControl.launchView = this;
unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, xmlNodeMethodList[n], EnableSimulator);
}
}
}
if (isGoHome.ToLower() == "true")
{
//调用复位
//判断是否有未卸载的枪头
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.MachineRunResource.strStartReset));
}
else
{
AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), "start reset"));
}
//判断是否有未卸载的枪头
//判断是否有抓取中的板子
if (!isRemotingOper)
{
if (mainWindow.wasLoadedTip)//抢上有枪头,需要卸载
{
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.RunUnloadTipsResource.strUnloadTip));
}
else
{
AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), "unload tip"));
}
}
}
////调用复位方法全部轴复位回零
//if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
//{
// AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.MachineRunResource.strGoHome));
//}
//else
//{
// AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), "go home"));
//}
//调用执行方法,更新执行结果字符串
HomeControl homeControl = new HomeControl(Shared.SoftwareInformation.currentculture);
homeControl.launchView = this;
bResult = homeControl.ExecuteHome(xmlNodeMethodList[n], xAxisSafeVal, yAxisSafeVal, zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
}
// 状态3 待机 蓝色
CommonBll.StatusLamp(3, EnableSimulator);
#endregion
break;
case (int)MethodNameEnum.endgroup: // 结束组合
#region 结束组合
ind = Convert.ToInt32(xmlNodeMethodList[n].Attributes["id"].Value.ToString());
return ind;
#endregion
case (int)MethodNameEnum.endloop: // 结束循环
#region 结束循环
{
if (isLoop1Start == false)//&& isLoop2Start == false)
{
}
else if (isLoop1Start == true)// && isLoop2Start == false)
{
//n = n + calculationTotalOfCmdInLoop() + 1;//最外一层循环
//isLoop1Start = false;
return 1;
}
else if (isLoop1Start == true)// && isLoop2Start == true)
{
//isLoop2Start = false;
return 1;
}
else if (isLoop1Start == false)// && isLoop2Start == true)
{
//isLoop1Start = false;
}
}
#endregion
break;
case (int)MethodNameEnum.griptransport: // 抓板转移
#region 抓板转移
{
GripTransportControl gripTransportControl = new GripTransportControl(Shared.SoftwareInformation.currentculture);
gripTransportControl.launchView = this;
if (isRemotingOper)
{
gripTransportControl.socketTcpListener = ((MainWindow)Application.Current.MainWindow).socketTcpListener;
}
else
{
gripTransportControl.socketTcpListener = mainWindow.socketTcpListener;
}
bool result = gripTransportControl.ExecuteGripTransport(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.holdingLabware: // 夹爪保持开始
#region 夹爪保持开始
{
HoldingLabwareControl holdingLabwareControl = new HoldingLabwareControl(Shared.SoftwareInformation.currentculture);
holdingLabwareControl.LaunchView = this;
if (isRemotingOper)
{
holdingLabwareControl.SocketTcpListener = ((MainWindow)Application.Current.MainWindow).socketTcpListener;
}
else
{
holdingLabwareControl.SocketTcpListener = mainWindow.socketTcpListener;
}
bool result = holdingLabwareControl.ExecuteBeginHolding(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.endHoldingLabware: // 夹爪保持结束
#region 夹爪保持结束
{
HoldingLabwareControl holdingLabwareControl = new HoldingLabwareControl(Shared.SoftwareInformation.currentculture);
holdingLabwareControl.LaunchView = this;
if (isRemotingOper)
{
holdingLabwareControl.SocketTcpListener = ((MainWindow)Application.Current.MainWindow).socketTcpListener;
}
else
{
holdingLabwareControl.SocketTcpListener = mainWindow.socketTcpListener;
}
bool result = holdingLabwareControl.ExecuteEndHolding(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.group: // 组合
#region 组合
{
int loopStartId = Convert.ToInt32(xmlNodeMethodList[n].Attributes["id"].InnerText);
ind = ExecMethodList(xmlDocument, loopStartId + 1);
if (ind == 0 || ind == 2) // 失败、停止
{
return ind;
}
else if (ind == 3) // skip
{
}
//记住当前n的值
n = n + ind - loopStartId;
//n = n + calculationTotalOfCmdInGroup() + 1;//最外一层组合
}
#endregion
break;
case (int)MethodNameEnum.home: // 复位
#region 复位
{
//调用复位
//判断是否有未卸载的枪头
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.MachineRunResource.strStartReset));
}
else
{
AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), "start reset"));
}
//判断是否有未卸载的枪头
//判断是否有抓取中的板子
if (!isRemotingOper)
{
if (mainWindow.wasLoadedTip)//抢上有枪头,需要卸载
{
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.RunUnloadTipsResource.strUnloadTip));
}
else
{
AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), "unload tip"));
}
}
}
//调用复位方法全部轴复位回零
//if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
//{
// AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.MachineRunResource.strGoHome));
//}
//else
//{
// AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), "go home"));
//}
//调用执行方法,更新执行结果字符串
HomeControl homeControl = new HomeControl(Shared.SoftwareInformation.currentculture);
homeControl.launchView = this;
bResult = homeControl.ExecuteHome(xmlNodeMethodList[n], xAxisSafeVal, yAxisSafeVal, zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
CommonBll.StatusLamp(4, EnableSimulator);
}
#endregion
break;
case (int)MethodNameEnum.loadtips: // 安装吸头
#region 安装吸头
{
if (_cancelSource.IsCancellationRequested)
{
return 2;
}
//调用执行方法,更新执行结果字符串
LoadTipsControl loadTipsControl = new LoadTipsControl(Shared.SoftwareInformation.currentculture);
if (!isRemotingOper)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
LoadTipsControl.launchView = this;
if (mainWindow.wasLoadedTip)
{
MessageBoxResult msbox = System.Windows.MessageBox.Show("可能有枪头未卸载,是否先卸载?", "提示", MessageBoxButton.YesNo);
if (msbox == MessageBoxResult.Yes)
{
//调用执行方法,更新执行结果字符串
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
unloadTipsControl.launchView = this;
unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, xmlNodeMethodList[n], EnableSimulator);
}
}
}));
}
else
{
LoadTipsControl.launchView = this;
if (mainWindow.wasLoadedTip)
{
MessageBoxResult msbox = System.Windows.MessageBox.Show("可能有枪头未卸载,是否先卸载?", "提示", MessageBoxButton.YesNo);
if (msbox == MessageBoxResult.Yes)
{
//调用执行方法,更新执行结果字符串
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
unloadTipsControl.launchView = this;
unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, xmlNodeMethodList[n], EnableSimulator);
}
}
#region 计算加载Tip头后,Z轴多出来的长度
//XmlNodeList labwareNodeh = xmlDocument.SelectNodes("root/env/platform");
//Labware labwaresa = labwareBll.GetLabware(xmlNodeMethodList[n].SelectSingleNode("labwaretip/value").InnerText);
//currentLengthOfTip = (float)labwaresa.tip_length - (float)labwaresa.press_tipinto_depth;
//ControlCom.CurrentLengthOfTip= currentLengthOfTip;
#endregion
}
bool result = loadTipsControl.ExecuteLoadTips(xmlDocument.SelectNodes("root/env/platform"), xmlNodeMethodList[n], EnableSimulator);
if (!result)
{
return 0;
}
#region 计算加载Tip头后,Z轴多出来的长度
XmlNodeList labwareNode = xmlDocument.SelectNodes("root/env/platform");
Labware labwares = labwareBll.GetLabware(xmlNodeMethodList[n].SelectSingleNode("labwaretip/value").InnerText);
currentLengthOfTip = (float)labwares.tip_length - (float)labwares.press_tipinto_depth;
ControlCom.CurrentLengthOfTip = currentLengthOfTip;
ControlCom.CurrentTipLabware = labwares;
#endregion
//获取command list 中对应节点,恢复为原色表示运行结束
}
#endregion
break;
case (int)MethodNameEnum.loop: // 开始循环
#region 开始循环
{
int loopStartId = Convert.ToInt32(xmlNodeMethodList[n].Attributes["id"].InnerText);
string endIndex = xmlNodeMethodList[n].SelectSingleNode("endIndex").InnerText;
if (isLoop1Start == false)// && isLoop2Start == false)
{
isLoop1Start = true;
string strVariable1 = xmlNodeMethodList[n].SelectSingleNode("variableName").InnerText;
Variable variable = new Variable();
variable.variablename = strVariable1;
variable.variablecurval = xmlNodeMethodList[n].SelectSingleNode("variablesValue").InnerText;
variable.variableinitval = xmlNodeMethodList[n].SelectSingleNode("variablesValue").InnerText;
gloadVariable.Push(variable);
int sk1 = Convert.ToInt32(variable.variableinitval);
int aVariable = 0;//循环的结束值
string strVariable = xmlNodeMethodList[n].SelectSingleNode("variableeValue").InnerText;
if (strVariable.Contains("&"))
{
strVariable = strVariable.Substring(1, strVariable.Length - 1);
}
#region 循环的结束值,支持数值变量命令
bool result = VariableDictionary.TryGetValue(strVariable, out aVariable);
int ek1 = 0;
if (result && xmlNodeMethodList[n].SelectSingleNode("variableeValue").InnerText.Contains("&"))
{
ek1 = aVariable;
}
else if (!result && xmlNodeMethodList[n].SelectSingleNode("variableeValue").InnerText.Contains("&"))
{
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();
return 0;
}
else
{
ek1 = Convert.ToInt32(xmlNodeMethodList[n].SelectSingleNode("variableeValue").InnerText);
}
#endregion
int ik1 = Convert.ToInt32(xmlNodeMethodList[n].SelectSingleNode("incrementValue").InnerText);
Variable v = gloadVariable.Peek();
//找到此循环对应的结束的点,返回结束点的index
for (int i = sk1; i <= ek1; i = i + ik1)
{
v.variablecurval = i.ToString();
//gloadVariable.Push(v);
int iq = ExecMethodList(xmlDocument, loopStartId + 1);
if (iq == 0 || iq == 2) // 失败、停止
{
return iq;
}
else if (iq == 3) // skip
{
break;
}
}
XmlNode xnd = xmlDocument.SelectSingleNode("root/method[strIndex='" + endIndex + "']");
ind = Convert.ToInt32(xnd.Attributes["id"].InnerText);
n = n + ind - loopStartId;
//记住当前n的值
//n = n + calculationTotalOfCmdInLoop()+1;//最外一层循环
isLoop1Start = false;
}
else if (isLoop1Start == true) //&& isLoop2Start == false)
{
Variable variable = new Variable();
variable.variablename = xmlNodeMethodList[n].SelectSingleNode("variableName").InnerText;
variable.variablecurval = xmlNodeMethodList[n].SelectSingleNode("variablesValue").InnerText;
variable.variableinitval = xmlNodeMethodList[n].SelectSingleNode("variablesValue").InnerText;
gloadVariable.Push(variable);
int sk2 = Convert.ToInt32(variable.variableinitval);
int ek2 = Convert.ToInt32(xmlNodeMethodList[n].SelectSingleNode("variableeValue").InnerText);
int ik2 = Convert.ToInt32(xmlNodeMethodList[n].SelectSingleNode("incrementValue").InnerText);
//int ck2 = sk2;
for (int i = sk2; i <= ek2; i = i + ik2)
{
//ck2 = i;
int iq = ExecMethodList(xmlDocument, loopStartId + 1);
if (iq == 0 || iq == 2) // 失败、停止
{
return iq;
}
else if (iq == 3) // skip
{
break;
}
}
//isLoop2Start = false;
//返回到最外一层的循环
//return 1;
}
else if (isLoop1Start == true) //&& isLoop2Start == true)
{
//isLoop1Start = false;
}
else if (isLoop1Start == false) //&& isLoop2Start == true)
{
//isLoop1Start = false;
}
}
#endregion
break;
case (int)MethodNameEnum.mixing: // 混合
#region 混合
{
MixingControl mixingControl = new MixingControl(Shared.SoftwareInformation.currentculture);
mixingControl.launchView = this;
bool result = mixingControl.ExecuteMixing(xmlEnv, xmlNodeMethodList[n], currentLengthOfTip, zAxisSafeVal, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.pause: // 暂停
#region 暂停
{
//调用执行方法,更新执行结果字符串
PauseControl pauseControl = new PauseControl(Shared.SoftwareInformation.currentculture);
pauseControl.launchView = this;
bool result = pauseControl.ExecutePause(xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.remark: // 备注
#region 备注
{
string title = xmlNodeMethodList[n].SelectSingleNode("title").InnerText;
string remark= xmlNodeMethodList[n].SelectSingleNode("remark").InnerText;
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】" + Properties.Resources.strTips+":"+title+","+Properties.Resources.strTipsMsg+":"+remark);
}
else
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】title of mark: " + title + ", content or mark: " + remark);
}
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.MachineRunResource.strEnd.ToString());
}
else
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】progress: completed.");
}
}
#endregion
break;
case (int)MethodNameEnum.transferfile: // 文件
#region 文件
{
//调用执行方法,更新执行结果字符串
TransferFileControl transferFileControl = new TransferFileControl(Shared.SoftwareInformation.currentculture);
transferFileControl.launchView = this;
bool result = transferFileControl.ExecuteTransferFile(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.unloadtips: // 卸载吸头
#region 卸载吸头
{
// 调用执行方法,更新执行结果字符串
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
unloadTipsControl.launchView = this;
bool result = unloadTipsControl.ExecuteUnloadTips(xmlDocument.SelectNodes("root/env/platform"), xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
currentWellLatticeId = string.Empty;
currentInValidWell = string.Empty;
}
#endregion
break;
case (int)MethodNameEnum.setVariable: //设置变量
#region 设置变量
{
// 调用执行方法,更新执行结果字符串
SetVariableControl setVariableControl = new SetVariableControl(Shared.SoftwareInformation.currentculture);
setVariableControl.launchView = this;
bool result = setVariableControl.ExecuteSetVariable(xmlEnv, xmlNodeMethodList[n]);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.dataexport: // 数据导出
#region 数据导出
{
//调用执行方法,更新执行结果字符串
DataExportControl dataExportControl = new DataExportControl(Shared.SoftwareInformation.currentculture);
dataExportControl.launchView = this;
bool result = dataExportControl.ExecuteDataExport(xmlNodeMethodList[n], dataTableTotal, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.coatingfile: // 涂布文件
#region 涂布文件
{
// 调用执行方法,更新执行结果字符串
CoatingFileControl coatingFileControl = new CoatingFileControl(Shared.SoftwareInformation.currentculture);
coatingFileControl.launchView = this;
bool result = coatingFileControl.ExecuteCoatingFile(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.takephoto: // 拍照
#region 拍照
{
// 调用执行方法,更新执行结果字符串
TakePhotoControl takePhotoControl = new TakePhotoControl();
takePhotoControl.launchView = this;
bool result = takePhotoControl.ExecuteTakePhoto(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.cutGum: // 切胶文件
#region 切胶文件
{
// 调用执行方法,更新执行结果字符串
CutGumFileControl cutGumFileControl = new CutGumFileControl(Shared.SoftwareInformation.currentculture);
cutGumFileControl.launchView = this;
bool result = cutGumFileControl.ExecuteCoatingFile(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.coatingReport: // 涂布报告
#region 涂布报告
{
// 调用执行方法,更新执行结果字符串
CoatingReportControl dataExportControl = new CoatingReportControl(Shared.SoftwareInformation.currentculture);
dataExportControl.launchView = this;
bool result = dataExportControl.ExecuteCoatingFileExport(xmlNodeMethodList[n], dataTableTotal, EnableSimulator);
if (!result)
{
return 0;
}
else
{
//发送涂布数据给中控
if (isRemotingOper)
{
}
}
}
#endregion
break;
case (int)MethodNameEnum.ultrasonic: // 超声探测
#region 超声探测
{
//调用执行方法,更新执行结果字符串
UltrasonicControl ultrasonicControl = new UltrasonicControl(Shared.SoftwareInformation.currentculture);
ultrasonicControl.launchView = this;
bool result = ultrasonicControl.ExecuteUltrasonic(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.choiceTransfer: // 挑选转板
#region 挑选转板
{
// 调用执行方法
ChoiceTransferControl choiceTransferControl = new ChoiceTransferControl();
ChoiceTransferControl.LaunchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
int result = choiceTransferControl.ExecuteChoiceTransfer(xmlDocument, xmlNodeMethodList[n], EnableSimulator);
if (result == 0)
{
// 0:失败;1:成功;2:停止;3:skip
return 0;
}
else if (result == 1)
{
// 0:失败;1:成功;2:停止;3:skip
return 3;
}
else
{
}
}
#endregion
break;
case (int)MethodNameEnum.coatingTransfer: // 涂布转板
#region 涂布转板
{
// 调用执行方法
CoatingTransferControl coatingTransferControl = new CoatingTransferControl();
CoatingTransferControl.LaunchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
int result = coatingTransferControl.ExecuteCoatingTransfer(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (result == 0)
{
// 0:失败;1:成功;2:停止;3:skip
return 0;
}
else if (result == 1)
{
// 0:失败;1:成功;2:停止;3:skip
return 3;
}
else
{
}
}
#endregion
break;
case (int)MethodNameEnum.dilution: // 梯度稀释
#region 梯度稀释
{
// 调用执行方法
DilutionControl dilutionControl = new DilutionControl();
DilutionControl.LaunchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
bool result = dilutionControl.ExecuteDilution(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.VariableImport: //文件导入变量
#region 文件导入变量
{
// 调用执行方法
VariableImportControl variableImportControl = new VariableImportControl(Shared.SoftwareInformation.currentculture);
variableImportControl.launchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
bool result = variableImportControl.ExecuteVariableImport(xmlNodeMethodList[n]);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.ifStart: //if开始
#region if开始
{
// 调用执行方法
IfElseControl ifElseControl = new IfElseControl(Shared.SoftwareInformation.currentculture);
ifElseControl.launchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
int result = ifElseControl.ExecuteIfElse(xmlNodeMethodList[n]);
if (result == -1) //有错终止
{
return 0;
}
else if (result == 0) //条件不满足
{
//跳过,直接执行else
string indexName = xmlNodeMethodList[n].SelectSingleNode("strIndex").InnerText;
string indexOfElse = string.Empty;
if (indexName.Contains("-"))
{
string heardOfIndex = indexName.Substring(0, indexName.LastIndexOf("-"));
string nextOfIndex = indexName.Substring(indexName.LastIndexOf("-") + 1, indexName.Length - indexName.LastIndexOf("-") - 1);
indexOfElse = (heardOfIndex + "-" + (Convert.ToInt32(nextOfIndex) + 1)).ToString();
}
else
{
indexOfElse = (Convert.ToInt32(indexName) + 1).ToString();
}
int indexOfNextNode = 0; //下个待执行节点索引
for(int i=n;i n)
{
n = indexOfNextNode-2;
}
}
else if (result == 1) //条件满足
{
result = 1;//正常继续执行
}
}
#endregion
break;
case (int)MethodNameEnum.ifEnd: //if结束
#region if结束
{
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.MachineRunResource.strEnd.ToString());
}
else
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】progress: completed.");
}
}
#endregion
break;
case (int)MethodNameEnum.elseStart: //else开始
#region else开始
{
// 调用执行方法
IfElseControl ifElseControl = new IfElseControl(Shared.SoftwareInformation.currentculture);
ifElseControl.launchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
int result = ifElseControl.ExecuteIfElse(xmlNodeMethodList[n]);
if (result == -1) //有错终止
{
return 0;
}
else if (result == 0) //条件不满足
{
//跳过,直接执行else
string indexName = xmlNodeMethodList[n].SelectSingleNode("strIndex").InnerText;
string indexOfElse = string.Empty;
if (indexName.Contains("-"))
{
string heardOfIndex = indexName.Substring(0, indexName.LastIndexOf("-"));
string nextOfIndex = indexName.Substring(indexName.LastIndexOf("-") + 1, indexName.Length - indexName.LastIndexOf("-") - 1);
indexOfElse = (heardOfIndex + "-" + (Convert.ToInt32(nextOfIndex) + 1)).ToString();
}
else
{
indexOfElse = (Convert.ToInt32(indexName) + 1).ToString();
}
int indexOfNextNode = 0; //下个待执行节点索引
for (int i = n; i < xmlNodeMethodList.Count; i++)
{
if (xmlNodeMethodList[i].SelectSingleNode("strIndex").InnerText == indexOfElse)
{
indexOfNextNode = i;
break;
}
}
if (indexOfNextNode > n)
{
n = indexOfNextNode - 2;
}
}
else if (result == 1) //条件满足
{
result = 1;//正常继续执行
}
}
#endregion
break;
case (int)MethodNameEnum.elseEnd: //else结束
#region else 结束
#region else结束
{
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.MachineRunResource.strEnd.ToString());
}
else
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】progress: completed.");
}
}
#endregion
#endregion
break;
case (int)MethodNameEnum.timerSet: //timer计时器
#region 计时器
{
if(timeTimer==null)
{
timeTimer=new Timer(timerTimer_Tick, null, 0, 1000);
}
TimerControl timerControl = new TimerControl(Shared.SoftwareInformation.currentculture);
timerControl.launchView = this;
bool result = timerControl.ExecuteTimer(xmlEnv, xmlNodeMethodList[n], xmlDocument, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.waitFor: //等待
#region 等待
{
Task.WaitAll(taskForSubmethod.ToArray());//等待并行结束
//调用执行方法,更新执行结果字符串
WaitForControl waitForControl = new WaitForControl(Shared.SoftwareInformation.currentculture);
waitForControl.launchView = this;
bool result = waitForControl.ExecuteWaitFor(xmlEnv, xmlNodeMethodList[n], xmlDocument, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.pumpDispense: //泵排液
#region 泵排液
PumpDispenseControl pumpDispenseControl = new PumpDispenseControl(Shared.SoftwareInformation.currentculture);
pumpDispenseControl.launchView = this;
bResult = pumpDispenseControl.ExecutePumpDispense(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.shaker: //振荡
#region 振荡
ShakeControl shakeControl = new ShakeControl(Shared.SoftwareInformation.currentculture);
shakeControl.launchView = this;
bResult = shakeControl.ExecuteShake(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.switchLid: //开关盖
#region 开关盖
SwitchLidControl switchLidControl = new SwitchLidControl(Shared.SoftwareInformation.currentculture);
switchLidControl.launchView = this;
bResult = switchLidControl.ExecuteSwitchLid(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.fileMoveLiquid: //文件开关盖移液
#region 文件开关盖移液
FileMoveLiquidControl fileMoveLiquidControl = new FileMoveLiquidControl(Shared.SoftwareInformation.currentculture);
fileMoveLiquidControl.launchView = this;
bResult = fileMoveLiquidControl.ExecuteFileMoveLiquid(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal,EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.fileMoveLabware: //文件转板
#region 文件转板
FileMoveLabwareControl fileMoveLabwareControl = new FileMoveLabwareControl(Shared.SoftwareInformation.currentculture);
fileMoveLabwareControl.launchView = this;
bResult = fileMoveLabwareControl.ExecuteFileMoveLabware(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.varCalc: //变量计算
#region 变量计算
{
// 调用执行方法,更新执行结果字符串
VarCalcControl varCalcControl = new VarCalcControl();
varCalcControl.launchView = this;
bool result = varCalcControl.Execute(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.subMethod: // 子方法
#region 子方法
{
SubMethodControl subMethodControl = new SubMethodControl();
subMethodControl.launchView = this;
bResult = subMethodControl.Execute(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!bResult) { return 0; }
}
#endregion
break;
default:
{
int totalpause = 0;
if(!IsRunning)
{
return 2;
}
while (pauseState == 1) //仅提供给暂停使用
{
Thread.Sleep(1000);
AddLogs("暂停"+(++totalpause).ToString()+"s");
}
if (_cancelSource.IsCancellationRequested)
{
return 2;
}
XmlNode isThirdPartXmlNode = xmlNodeMethodList[n].SelectSingleNode("isThirdPart");
if (isThirdPartXmlNode != null && bool.Parse(isThirdPartXmlNode.InnerText)) // 第三方设备
{
bool result = ExecThirdPart(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
}
break;
}
}
return resultExc;
}
#region 执行流程中的方法---专为并行使用
///
/// 执行流程中方法
///
///
///
/// 0:失败;1:成功;2:停止;3:skip
public int ExecMethodListForCombine(XmlDocument xmlDocument, int startId)
{
int resultExc = 1;
// 方法
XmlNodeList xmlNodeMethodList = xmlDocument.SelectNodes("root/method[@id>=" + startId + "]");
XmlNode xmlEnv = xmlDocument.SelectSingleNode("root/env");
var platformNodeList = xmlEnv.SelectNodes("platform");
bool bResult = false;
int ind = 0;
//生成运行时台面所有板位上的对象数据
// 清空方法列表
for (int n = 0; n < xmlNodeMethodList.Count; n++)
{
string MethodName = xmlNodeMethodList[n].SelectSingleNode("label").InnerText;
workStack.Push(MethodName);
string id = xmlNodeMethodList[n].Attributes["id"].Value.ToString();
string strIndex = xmlNodeMethodList[n].SelectSingleNode("strIndex").InnerText;
float xAxisSafeVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["xAxisSafeVal"]);
float yAxisSafeVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["yAxisSafeVal"]);
float zAxisSafeVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["zAxisSafeVal"]);
int iNum = methodListBll.getNumByMethodName(MethodName);
if (_cancelSource.IsCancellationRequested)
{
_cancelSource = new CancellationTokenSource();
return 2;
}
if (xmlNodeMethodList[n].SelectSingleNode("status") == null)
{
continue;
}
if (xmlNodeMethodList[n].SelectSingleNode("status").InnerText != "enable")
{
continue;
}
if (selectedMethodEx == null)
{
}
else if (ExistNodeByNodeIndex(selectedMethodEx, strIndex))
{
}
else if (!ExistNodeByNodeIndex(selectedMethodEx, strIndex))
{
continue;
}
// 设置节点状态
SetRunningStatus(strIndex);
switch (iNum)
{
case (int)MethodNameEnum.start: // 开始
#region 开始
lstCoatingLabware = null; // 清空涂布使用的所有目标耗材板
string usehepa = xmlNodeMethodList[n].SelectSingleNode("usehepa").InnerText;
string isReset = xmlNodeMethodList[n].SelectSingleNode("isreset").InnerText;
string isCheckTakePhotoPlate = xmlNodeMethodList[n].SelectSingleNode("isCheckTakePhotoPlate").InnerText;
#region 复位
bool isOk = DoRest(this, isReset, xmlNodeMethodList[n]);
if (!isOk)
{
return 2;
}
#endregion
#region 检查成像板位是否有板
if (ConfigurationManager.AppSettings["openTakePhoto"].ToString() == "true")
{
isOk = DoCheckTakePhotoPlate(isCheckTakePhotoPlate, EnableSimulator);
if (!isOk)
{
return 2;
}
}
#endregion
#endregion
break;
case (int)MethodNameEnum.aspirate: // 吸液
#region 吸液
AspirateControl aspirateControl = new AspirateControl(Shared.SoftwareInformation.currentculture);
aspirateControl.launchView = this;
bResult = aspirateControl.ExecuteAspirate(xmlEnv, xmlNodeMethodList[n], currentLengthOfTip, zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.dispense: // 排液
#region 排液
DispenseControl dispenseControl = new DispenseControl(Shared.SoftwareInformation.currentculture);
dispenseControl.launchView = this;
// 是否在循环中,当前循环的
bResult = dispenseControl.ExecuteDispense(xmlEnv, xmlNodeMethodList[n], currentLengthOfTip, zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.end: // 结束
#region 结束
lstCoatingLabware = null; // 清空涂布使用的所有目标耗材板
ChoiceTransferControl.ChoiceData = null;
CoatingTransferControl.CoatingData = null;
string isGoHome = xmlNodeMethodList[n].SelectSingleNode("isGoHome").InnerText;
string isTipsOff = xmlNodeMethodList[n].SelectSingleNode("isTipsOff").InnerText;
if (!isRemotingOper)
{
if (mainWindow.wasLoadedTip)//抢上有枪头,需要卸载
{
if (isTipsOff.ToLower() == "true")
{
//调用执行方法,更新执行结果字符串
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
unloadTipsControl.launchView = this;
unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, xmlNodeMethodList[n], EnableSimulator);
}
}
}
if (isGoHome.ToLower() == "true")
{
//调用复位
//判断是否有未卸载的枪头
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.MachineRunResource.strStartReset));
}
else
{
AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), "start reset"));
}
//判断是否有未卸载的枪头
//判断是否有抓取中的板子
if (!isRemotingOper)
{
if (mainWindow.wasLoadedTip)//抢上有枪头,需要卸载
{
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.RunUnloadTipsResource.strUnloadTip));
}
else
{
AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), "unload tip"));
}
}
}
////调用复位方法全部轴复位回零
//if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
//{
// AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.MachineRunResource.strGoHome));
//}
//else
//{
// AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), "go home"));
//}
//调用执行方法,更新执行结果字符串
HomeControl homeControl = new HomeControl(Shared.SoftwareInformation.currentculture);
homeControl.launchView = this;
bResult = homeControl.ExecuteHome(xmlNodeMethodList[n], xAxisSafeVal, yAxisSafeVal, zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
}
// 状态3 待机 蓝色
CommonBll.StatusLamp(3, EnableSimulator);
#endregion
break;
case (int)MethodNameEnum.endgroup: // 结束组合
#region 结束组合
ind = Convert.ToInt32(xmlNodeMethodList[n].Attributes["id"].Value.ToString());
return ind;
#endregion
case (int)MethodNameEnum.endloop: // 结束循环
#region 结束循环
{
if (isLoop1Start == false)//&& isLoop2Start == false)
{
}
else if (isLoop1Start == true)// && isLoop2Start == false)
{
//n = n + calculationTotalOfCmdInLoop() + 1;//最外一层循环
//isLoop1Start = false;
return 1;
}
else if (isLoop1Start == true)// && isLoop2Start == true)
{
//isLoop2Start = false;
return 1;
}
else if (isLoop1Start == false)// && isLoop2Start == true)
{
//isLoop1Start = false;
}
}
#endregion
break;
case (int)MethodNameEnum.griptransport: // 抓板转移
#region 抓板转移
{
GripTransportControl gripTransportControl = new GripTransportControl(Shared.SoftwareInformation.currentculture);
gripTransportControl.launchView = this;
if (isRemotingOper)
{
gripTransportControl.socketTcpListener = ((MainWindow)Application.Current.MainWindow).socketTcpListener;
}
else
{
gripTransportControl.socketTcpListener = mainWindow.socketTcpListener;
}
bool result = gripTransportControl.ExecuteGripTransport(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.holdingLabware: // 夹爪保持开始
#region 夹爪保持开始
{
HoldingLabwareControl holdingLabwareControl = new HoldingLabwareControl(Shared.SoftwareInformation.currentculture);
holdingLabwareControl.LaunchView = this;
if (isRemotingOper)
{
holdingLabwareControl.SocketTcpListener = ((MainWindow)Application.Current.MainWindow).socketTcpListener;
}
else
{
holdingLabwareControl.SocketTcpListener = mainWindow.socketTcpListener;
}
bool result = holdingLabwareControl.ExecuteBeginHolding(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.endHoldingLabware: // 夹爪保持结束
#region 夹爪保持结束
{
HoldingLabwareControl holdingLabwareControl = new HoldingLabwareControl(Shared.SoftwareInformation.currentculture);
holdingLabwareControl.LaunchView = this;
if (isRemotingOper)
{
holdingLabwareControl.SocketTcpListener = ((MainWindow)Application.Current.MainWindow).socketTcpListener;
}
else
{
holdingLabwareControl.SocketTcpListener = mainWindow.socketTcpListener;
}
bool result = holdingLabwareControl.ExecuteEndHolding(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.group: // 组合
#region 组合
{
int loopStartId = Convert.ToInt32(xmlNodeMethodList[n].Attributes["id"].InnerText);
ind = ExecMethodList(xmlDocument, loopStartId + 1);
if (ind == 0 || ind == 2) // 失败、停止
{
return ind;
}
else if (ind == 3) // skip
{
}
//记住当前n的值
n = n + ind - loopStartId;
//n = n + calculationTotalOfCmdInGroup() + 1;//最外一层组合
}
#endregion
break;
case (int)MethodNameEnum.home: // 复位
#region 复位
{
//调用复位
//判断是否有未卸载的枪头
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.MachineRunResource.strStartReset));
}
else
{
AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), "start reset"));
}
//判断是否有未卸载的枪头
//判断是否有抓取中的板子
if (!isRemotingOper)
{
if (mainWindow.wasLoadedTip)//抢上有枪头,需要卸载
{
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.RunUnloadTipsResource.strUnloadTip));
}
else
{
AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), "unload tip"));
}
}
}
//调用复位方法全部轴复位回零
//if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
//{
// AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.MachineRunResource.strGoHome));
//}
//else
//{
// AddLogs(string.Format("【{0}】> {1}", DateTime.Now.ToString("HH:mm:ss:fff"), "go home"));
//}
//调用执行方法,更新执行结果字符串
HomeControl homeControl = new HomeControl(Shared.SoftwareInformation.currentculture);
homeControl.launchView = this;
bResult = homeControl.ExecuteHome(xmlNodeMethodList[n], xAxisSafeVal, yAxisSafeVal, zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
CommonBll.StatusLamp(4, EnableSimulator);
}
#endregion
break;
case (int)MethodNameEnum.loadtips: // 安装吸头
#region 安装吸头
{
if (_cancelSource.IsCancellationRequested)
{
return 2;
}
//调用执行方法,更新执行结果字符串
LoadTipsControl loadTipsControl = new LoadTipsControl(Shared.SoftwareInformation.currentculture);
if (!isRemotingOper)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
LoadTipsControl.launchView = this;
if (mainWindow.wasLoadedTip)
{
MessageBoxResult msbox = System.Windows.MessageBox.Show("可能有枪头未卸载,是否先卸载?", "提示", MessageBoxButton.YesNo);
if (msbox == MessageBoxResult.Yes)
{
//调用执行方法,更新执行结果字符串
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
unloadTipsControl.launchView = this;
unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, xmlNodeMethodList[n], EnableSimulator);
}
}
}));
}
else
{
LoadTipsControl.launchView = this;
if (mainWindow.wasLoadedTip)
{
MessageBoxResult msbox = System.Windows.MessageBox.Show("可能有枪头未卸载,是否先卸载?", "提示", MessageBoxButton.YesNo);
if (msbox == MessageBoxResult.Yes)
{
//调用执行方法,更新执行结果字符串
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
unloadTipsControl.launchView = this;
unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, xmlNodeMethodList[n], EnableSimulator);
}
}
#region 计算加载Tip头后,Z轴多出来的长度
//XmlNodeList labwareNodeh = xmlDocument.SelectNodes("root/env/platform");
//Labware labwaresa = labwareBll.GetLabware(xmlNodeMethodList[n].SelectSingleNode("labwaretip/value").InnerText);
//currentLengthOfTip = (float)labwaresa.tip_length - (float)labwaresa.press_tipinto_depth;
//ControlCom.CurrentLengthOfTip= currentLengthOfTip;
#endregion
}
bool result = loadTipsControl.ExecuteLoadTips(xmlDocument.SelectNodes("root/env/platform"), xmlNodeMethodList[n], EnableSimulator);
if (!result)
{
return 0;
}
#region 计算加载Tip头后,Z轴多出来的长度
XmlNodeList labwareNode = xmlDocument.SelectNodes("root/env/platform");
Labware labwares = labwareBll.GetLabware(xmlNodeMethodList[n].SelectSingleNode("labwaretip/value").InnerText);
currentLengthOfTip = (float)labwares.tip_length - (float)labwares.press_tipinto_depth;
ControlCom.CurrentLengthOfTip = currentLengthOfTip;
ControlCom.CurrentTipLabware = labwares;
#endregion
//获取command list 中对应节点,恢复为原色表示运行结束
}
#endregion
break;
case (int)MethodNameEnum.loop: // 开始循环
#region 开始循环
{
int loopStartId = Convert.ToInt32(xmlNodeMethodList[n].Attributes["id"].InnerText);
string endIndex = xmlNodeMethodList[n].SelectSingleNode("endIndex").InnerText;
if (isLoop1Start == false)// && isLoop2Start == false)
{
isLoop1Start = true;
string strVariable1 = xmlNodeMethodList[n].SelectSingleNode("variableName").InnerText;
Variable variable = new Variable();
variable.variablename = strVariable1;
variable.variablecurval = xmlNodeMethodList[n].SelectSingleNode("variablesValue").InnerText;
variable.variableinitval = xmlNodeMethodList[n].SelectSingleNode("variablesValue").InnerText;
gloadVariable.Push(variable);
int sk1 = Convert.ToInt32(variable.variableinitval);
int aVariable = 0;//循环的结束值
string strVariable = xmlNodeMethodList[n].SelectSingleNode("variableeValue").InnerText;
if (strVariable.Contains("&"))
{
strVariable = strVariable.Substring(1, strVariable.Length - 1);
}
#region 循环的结束值,支持数值变量命令
bool result = VariableDictionary.TryGetValue(strVariable, out aVariable);
int ek1 = 0;
if (result && xmlNodeMethodList[n].SelectSingleNode("variableeValue").InnerText.Contains("&"))
{
ek1 = aVariable;
}
else if (!result && xmlNodeMethodList[n].SelectSingleNode("variableeValue").InnerText.Contains("&"))
{
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();
return 0;
}
else
{
ek1 = Convert.ToInt32(xmlNodeMethodList[n].SelectSingleNode("variableeValue").InnerText);
}
#endregion
int ik1 = Convert.ToInt32(xmlNodeMethodList[n].SelectSingleNode("incrementValue").InnerText);
Variable v = gloadVariable.Peek();
//找到此循环对应的结束的点,返回结束点的index
for (int i = sk1; i <= ek1; i = i + ik1)
{
v.variablecurval = i.ToString();
//gloadVariable.Push(v);
int iq = ExecMethodListForCombine(xmlDocument, loopStartId + 1);
if (iq == 0 || iq == 2) // 失败、停止
{
return iq;
}
else if (iq == 3) // skip
{
break;
}
}
XmlNode xnd = xmlDocument.SelectSingleNode("root/method[strIndex='" + endIndex + "']");
ind = Convert.ToInt32(xnd.Attributes["id"].InnerText);
n = n + ind - loopStartId;
//记住当前n的值
//n = n + calculationTotalOfCmdInLoop()+1;//最外一层循环
isLoop1Start = false;
}
else if (isLoop1Start == true) //&& isLoop2Start == false)
{
Variable variable = new Variable();
variable.variablename = xmlNodeMethodList[n].SelectSingleNode("variableName").InnerText;
variable.variablecurval = xmlNodeMethodList[n].SelectSingleNode("variablesValue").InnerText;
variable.variableinitval = xmlNodeMethodList[n].SelectSingleNode("variablesValue").InnerText;
gloadVariable.Push(variable);
int sk2 = Convert.ToInt32(variable.variableinitval);
int ek2 = Convert.ToInt32(xmlNodeMethodList[n].SelectSingleNode("variableeValue").InnerText);
int ik2 = Convert.ToInt32(xmlNodeMethodList[n].SelectSingleNode("incrementValue").InnerText);
//int ck2 = sk2;
for (int i = sk2; i <= ek2; i = i + ik2)
{
//ck2 = i;
int iq = ExecMethodListForCombine(xmlDocument, loopStartId + 1);
if (iq == 0 || iq == 2) // 失败、停止
{
return iq;
}
else if (iq == 3) // skip
{
break;
}
}
//isLoop2Start = false;
//返回到最外一层的循环
//return 1;
}
else if (isLoop1Start == true) //&& isLoop2Start == true)
{
//isLoop1Start = false;
}
else if (isLoop1Start == false) //&& isLoop2Start == true)
{
//isLoop1Start = false;
}
}
#endregion
break;
case (int)MethodNameEnum.mixing: // 混合
#region 混合
{
MixingControl mixingControl = new MixingControl(Shared.SoftwareInformation.currentculture);
mixingControl.launchView = this;
bool result = mixingControl.ExecuteMixing(xmlEnv, xmlNodeMethodList[n], currentLengthOfTip, zAxisSafeVal, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.pause: // 暂停
#region 暂停
{
//调用执行方法,更新执行结果字符串
PauseControl pauseControl = new PauseControl(Shared.SoftwareInformation.currentculture);
pauseControl.launchView = this;
bool result = pauseControl.ExecutePause(xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.remark: // 备注
#region 备注
{
string title = xmlNodeMethodList[n].SelectSingleNode("title").InnerText;
string remark = xmlNodeMethodList[n].SelectSingleNode("remark").InnerText;
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】" + Properties.Resources.strTips + ":" + title + "," + Properties.Resources.strTipsMsg + ":" + remark);
}
else
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】title of mark: " + title + ", content or mark: " + remark);
}
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.MachineRunResource.strEnd.ToString());
}
else
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】progress: completed.");
}
}
#endregion
break;
case (int)MethodNameEnum.transferfile: // 文件
#region 文件
{
//调用执行方法,更新执行结果字符串
TransferFileControl transferFileControl = new TransferFileControl(Shared.SoftwareInformation.currentculture);
transferFileControl.launchView = this;
bool result = transferFileControl.ExecuteTransferFile(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.unloadtips: // 卸载吸头
#region 卸载吸头
{
// 调用执行方法,更新执行结果字符串
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
unloadTipsControl.launchView = this;
bool result = unloadTipsControl.ExecuteUnloadTips(xmlDocument.SelectNodes("root/env/platform"), xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
currentWellLatticeId = string.Empty;
currentInValidWell = string.Empty;
}
#endregion
break;
case (int)MethodNameEnum.setVariable: //设置变量
#region 设置变量
{
// 调用执行方法,更新执行结果字符串
SetVariableControl setVariableControl = new SetVariableControl(Shared.SoftwareInformation.currentculture);
setVariableControl.launchView = this;
bool result = setVariableControl.ExecuteSetVariable(xmlEnv, xmlNodeMethodList[n]);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.dataexport: // 数据导出
#region 数据导出
{
//调用执行方法,更新执行结果字符串
DataExportControl dataExportControl = new DataExportControl(Shared.SoftwareInformation.currentculture);
dataExportControl.launchView = this;
bool result = dataExportControl.ExecuteDataExport(xmlNodeMethodList[n], dataTableTotal, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.coatingfile: // 涂布文件
#region 涂布文件
{
// 调用执行方法,更新执行结果字符串
CoatingFileControl coatingFileControl = new CoatingFileControl(Shared.SoftwareInformation.currentculture);
coatingFileControl.launchView = this;
bool result = coatingFileControl.ExecuteCoatingFile(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.takephoto: // 拍照
#region 拍照
{
// 调用执行方法,更新执行结果字符串
TakePhotoControl takePhotoControl = new TakePhotoControl();
takePhotoControl.launchView = this;
bool result = takePhotoControl.ExecuteTakePhoto(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.coatingReport: // 涂布报告
#region 涂布报告
{
// 调用执行方法,更新执行结果字符串
CoatingReportControl dataExportControl = new CoatingReportControl(Shared.SoftwareInformation.currentculture);
dataExportControl.launchView = this;
bool result = dataExportControl.ExecuteCoatingFileExport(xmlNodeMethodList[n], dataTableTotal, EnableSimulator);
if (!result)
{
return 0;
}
else
{
//发送涂布数据给中控
if (isRemotingOper)
{
}
}
}
#endregion
break;
case (int)MethodNameEnum.ultrasonic: // 超声探测
#region 超声探测
{
//调用执行方法,更新执行结果字符串
UltrasonicControl ultrasonicControl = new UltrasonicControl(Shared.SoftwareInformation.currentculture);
ultrasonicControl.launchView = this;
bool result = ultrasonicControl.ExecuteUltrasonic(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.choiceTransfer: // 挑选转板
#region 挑选转板
{
// 调用执行方法
ChoiceTransferControl choiceTransferControl = new ChoiceTransferControl();
ChoiceTransferControl.LaunchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
int result = choiceTransferControl.ExecuteChoiceTransfer(xmlDocument, xmlNodeMethodList[n], EnableSimulator);
if (result == 0)
{
// 0:失败;1:成功;2:停止;3:skip
return 0;
}
else if (result == 1)
{
// 0:失败;1:成功;2:停止;3:skip
return 3;
}
else
{
}
}
#endregion
break;
case (int)MethodNameEnum.coatingTransfer: // 涂布转板
#region 涂布转板
{
// 调用执行方法
CoatingTransferControl coatingTransferControl = new CoatingTransferControl();
CoatingTransferControl.LaunchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
int result = coatingTransferControl.ExecuteCoatingTransfer(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (result == 0)
{
// 0:失败;1:成功;2:停止;3:skip
return 0;
}
else if (result == 1)
{
// 0:失败;1:成功;2:停止;3:skip
return 3;
}
else
{
}
}
#endregion
break;
case (int)MethodNameEnum.dilution: // 梯度稀释
#region 梯度稀释
{
// 调用执行方法
DilutionControl dilutionControl = new DilutionControl();
DilutionControl.LaunchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
bool result = dilutionControl.ExecuteDilution(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.VariableImport: //文件导入变量
#region 文件导入变量
{
// 调用执行方法
VariableImportControl variableImportControl = new VariableImportControl(Shared.SoftwareInformation.currentculture);
variableImportControl.launchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
bool result = variableImportControl.ExecuteVariableImport(xmlNodeMethodList[n]);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.ifStart: //if开始
#region if开始
{
// 调用执行方法
IfElseControl ifElseControl = new IfElseControl(Shared.SoftwareInformation.currentculture);
ifElseControl.launchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
int result = ifElseControl.ExecuteIfElse(xmlNodeMethodList[n]);
if (result == -1) //有错终止
{
return 0;
}
else if (result == 0) //条件不满足
{
//跳过,直接执行else
string indexName = xmlNodeMethodList[n].SelectSingleNode("strIndex").InnerText;
string indexOfElse = string.Empty;
if (indexName.Contains("-"))
{
string heardOfIndex = indexName.Substring(0, indexName.LastIndexOf("-"));
string nextOfIndex = indexName.Substring(indexName.LastIndexOf("-") + 1, indexName.Length - indexName.LastIndexOf("-") - 1);
indexOfElse = (heardOfIndex + "-" + (Convert.ToInt32(nextOfIndex) + 1)).ToString();
}
else
{
indexOfElse = (Convert.ToInt32(indexName) + 1).ToString();
}
int indexOfNextNode = 0; //下个待执行节点索引
for (int i = n; i < xmlNodeMethodList.Count; i++)
{
if (xmlNodeMethodList[i].SelectSingleNode("strIndex").InnerText == indexOfElse)
{
indexOfNextNode = i;
break;
}
}
if (indexOfNextNode > n)
{
n = indexOfNextNode - 2;
}
}
else if (result == 1) //条件满足
{
result = 1;//正常继续执行
}
}
#endregion
break;
case (int)MethodNameEnum.ifEnd: //if结束
#region if结束
{
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.MachineRunResource.strEnd.ToString());
}
else
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】progress: completed.");
}
}
#endregion
break;
case (int)MethodNameEnum.elseStart: //else开始
#region else开始
{
// 调用执行方法
IfElseControl ifElseControl = new IfElseControl(Shared.SoftwareInformation.currentculture);
ifElseControl.launchView = this;
// 0:异常结束, 1:正常继续,2:正常结束
int result = ifElseControl.ExecuteIfElse(xmlNodeMethodList[n]);
if (result == -1) //有错终止
{
return 0;
}
else if (result == 0) //条件不满足
{
//跳过,直接执行else
string indexName = xmlNodeMethodList[n].SelectSingleNode("strIndex").InnerText;
string indexOfElse = string.Empty;
if (indexName.Contains("-"))
{
string heardOfIndex = indexName.Substring(0, indexName.LastIndexOf("-"));
string nextOfIndex = indexName.Substring(indexName.LastIndexOf("-") + 1, indexName.Length - indexName.LastIndexOf("-") - 1);
indexOfElse = (heardOfIndex + "-" + (Convert.ToInt32(nextOfIndex) + 1)).ToString();
}
else
{
indexOfElse = (Convert.ToInt32(indexName) + 1).ToString();
}
int indexOfNextNode = 0; //下个待执行节点索引
for (int i = n; i < xmlNodeMethodList.Count; i++)
{
if (xmlNodeMethodList[i].SelectSingleNode("strIndex").InnerText == indexOfElse)
{
indexOfNextNode = i;
break;
}
}
if (indexOfNextNode > n)
{
n = indexOfNextNode - 2;
}
}
else if (result == 1) //条件满足
{
result = 1;//正常继续执行
}
}
#endregion
break;
case (int)MethodNameEnum.elseEnd: //else结束
#region else 结束
#region else结束
{
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.MachineRunResource.strEnd.ToString());
}
else
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + xmlNodeMethodList[n].SelectSingleNode("name").InnerText + "】progress: completed.");
}
}
#endregion
#endregion
break;
case (int)MethodNameEnum.timerSet: //timer计时器
#region 计时器
{
if (timeTimer == null)
{
timeTimer = new Timer(timerTimer_Tick, null, 0, 1000);
}
TimerControl timerControl = new TimerControl(Shared.SoftwareInformation.currentculture);
timerControl.launchView = this;
bool result = timerControl.ExecuteTimer(xmlEnv, xmlNodeMethodList[n], xmlDocument, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.waitFor: //等待
#region 等待
{
//调用执行方法,更新执行结果字符串
WaitForControl waitForControl = new WaitForControl(Shared.SoftwareInformation.currentculture);
waitForControl.launchView = this;
bool result = waitForControl.ExecuteWaitFor(xmlEnv, xmlNodeMethodList[n], xmlDocument, EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.pumpDispense: //泵排液
#region 泵排液
PumpDispenseControl pumpDispenseControl = new PumpDispenseControl(Shared.SoftwareInformation.currentculture);
pumpDispenseControl.launchView = this;
bResult = pumpDispenseControl.ExecutePumpDispense(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.shaker: //振荡
#region 振荡
ShakeControl shakeControl = new ShakeControl(Shared.SoftwareInformation.currentculture);
shakeControl.launchView = this;
bResult = shakeControl.ExecuteShake(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.switchLid: //开关盖
#region 开关盖
SwitchLidControl switchLidControl = new SwitchLidControl(Shared.SoftwareInformation.currentculture);
switchLidControl.launchView = this;
bResult = switchLidControl.ExecuteSwitchLid(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.fileMoveLiquid: //文件开关盖移液
#region 文件开关盖移液
FileMoveLiquidControl fileMoveLiquidControl = new FileMoveLiquidControl(Shared.SoftwareInformation.currentculture);
fileMoveLiquidControl.launchView = this;
bResult = fileMoveLiquidControl.ExecuteFileMoveLiquid(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.fileMoveLabware: //文件转板
#region 文件转板
FileMoveLabwareControl fileMoveLabwareControl = new FileMoveLabwareControl(Shared.SoftwareInformation.currentculture);
fileMoveLabwareControl.launchView = this;
bResult = fileMoveLabwareControl.ExecuteFileMoveLabware(xmlEnv, xmlNodeMethodList[n], zAxisSafeVal, EnableSimulator);
if (!bResult) { return 0; }
#endregion
break;
case (int)MethodNameEnum.varCalc: //变量计算
#region 变量计算
{
// 调用执行方法,更新执行结果字符串
VarCalcControl varCalcControl = new VarCalcControl();
varCalcControl.launchView = this;
bool result = varCalcControl.Execute(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
#endregion
break;
case (int)MethodNameEnum.subMethod: // 子方法
#region 子方法
{
SubMethodControl subMethodControl = new SubMethodControl();
subMethodControl.launchView = this;
bResult = subMethodControl.Execute(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!bResult) { return 0; }
}
#endregion
break;
default:
#region 第三方设备
{
while(pauseState==1) //仅提供给暂停使用
{
Thread.Sleep(1000);
//AddLogs("暂停");
}
if (_cancelSource.IsCancellationRequested)
{
return 2;
}
XmlNode isThirdPartXmlNode = xmlNodeMethodList[n].SelectSingleNode("isThirdPart");
if (isThirdPartXmlNode != null && bool.Parse(isThirdPartXmlNode.InnerText)) // 第三方设备
{
bool result = ExecThirdPart(xmlEnv, xmlNodeMethodList[n], EnableSimulator);
if (!result) { return 0; }
}
}
#endregion
break;
}
}
return resultExc;
}
#endregion
#region 定时器事件--计时器每秒减少1s
private void timerTimer_Tick(object sender)
{
try
{
lock (methodTimers)
{
List methodTimerEnds = new List();//存储计时结束的计时器对象
foreach (MethodTimer t in methodTimers)
{
if (Convert.ToDouble(t.duringTime) > 0)
{
t.duringTime = (Convert.ToDouble(t.duringTime) - 1d).ToString();
}
else
{
AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + t.name + "】" + "计时结束");
methodTimerEnds.Add(t);
}
}
foreach(MethodTimer t in methodTimerEnds)
{
methodTimers.Remove(t);
}
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("[timerTimer_Tick]:ERROR:", ex);
}
}
#endregion
#region 查找当前的节点编号是否在要运行的单节点中
///
/// 查找当前的节点编号是否在要运行的单节点中
///
/// 当前节点对象
/// 待查找节点编号
/// true:存在;false: 不存在
public bool ExistNodeByNodeIndex(MethodEx currentMethodEx,string strIndex)
{
bool result = false;
if(currentMethodEx != null)
{
if(currentMethodEx.strIndex.Equals(strIndex))
{
result= true;
return result;
}
else
{
if(currentMethodEx.Children.Count>0)
{
foreach(MethodEx methodEx in currentMethodEx.Children)
{
result=ExistNodeByNodeIndex(methodEx, strIndex);
if(result)
{
return result;
}
}
}
}
}
return result;
}
#endregion
///
/// 执行【第三方设备】指令
///
///
private bool ExecThirdPart(XmlNode xmlEnv, XmlNode currentNode, bool EnableSimulator)
{
// 调用执行方法
ThirdPartControl thirdPartControl = new ThirdPartControl();
ThirdPartControl.LaunchView = this;
return thirdPartControl.ExecuteCoatingTransfer(xmlEnv, currentNode, EnableSimulator);
}
///
/// 检查成像板位是否有板
///
///
///
///
private bool DoCheckTakePhotoPlate(string isCheckTakePhotoPlate, bool EnableSimulator)
{
bool isOk = true;
if (isCheckTakePhotoPlate.ToLower() == "true" && !EnableSimulator)
{
PlsToolTipWin checkSafeRuningDialog = null;
bool bIsError = false;
Application.Current.Dispatcher.Invoke(new Action(() =>
{
string strMsg = string.Empty;
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
strMsg = Properties.TackPhotoResource.strCheckingSafe.ToString();
}
else
{
strMsg = "The action of check safe is executing...";
}
checkSafeRuningDialog = new PlsToolTipWin(strMsg);
checkSafeRuningDialog.Height = 200;
checkSafeRuningDialog.Width = 520;
SolidColorBrush mybtn2_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(0, 0, 0, 0));
checkSafeRuningDialog.Background = (System.Windows.Media.Brush)mybtn2_Brush;
checkSafeRuningDialog.btnCancel.Visibility = Visibility.Collapsed;
checkSafeRuningDialog.btnOK.Visibility = Visibility.Collapsed;
checkSafeRuningDialog.btnClose.Visibility = Visibility.Collapsed;
checkSafeRuningDialog.Show();
takePhotoBll.socketTcpListener = mainWindow.socketTcpListener;
bIsError = takePhotoBll.DoCheckSafe();
// 关闭运行页面
checkSafeRuningDialog.Close();
}));
if (bIsError)
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
// 状态6 报错/急停 红闪/蜂鸣5S;
CommonBll.StatusLamp(6, EnableSimulator);
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.btnCancel.Visibility = Visibility.Hidden;
plsToolTipWin.ShowDialog();
}));
isOk = false;
}
}
return isOk;
}
///
/// 复位
///
///
///
///
///
private bool DoRest(RunWnd launchView, string isReset, XmlNode methodNode)
{
if (launchView._cancelSource.IsCancellationRequested)
{
return false;
}
if (isReset.ToLower() == "true")
{
#region 开始复位日志
if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
{
AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.MachineRunResource.strStartRest));
}
else
{
AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), "start reset"));
}
#endregion
#region 复位
////调用复位方法全部轴复位回零
//if (Shared.SoftwareInformation.currentculture.Equals("zh-CN"))
//{
// AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), Properties.MachineRunResource.strGoHome));
//}
//else
//{
// AddLogs(string.Format("【{0}】> {1}.", DateTime.Now.ToString("HH:mm:ss:fff"), "go home"));
//}
HomeControl homeControl = new HomeControl(Shared.SoftwareInformation.currentculture);
homeControl.launchView = this;
float xAxisSafeVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["xAxisSafeVal"]);
float yAxisSafeVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["yAxisSafeVal"]);
float zAxisSafeVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["zAxisSafeVal"]);
string deviceNumber = "";
bool result = homeControl.ExecuteHome(methodNode, xAxisSafeVal, yAxisSafeVal, zAxisSafeVal, EnableSimulator);
if (!result) { return false; }
#endregion
#region 判断是否有枪头并卸载枪头
//int retN = ControlCom.ExecuteADPCheckTip(this, EnableSimulator);
//if (retN == 2) // 检查正常 && 有枪头
//{
// return false;
//}
#endregion
#region 初始化外部jaka机械臂
//// 枪头卸载成功后再复位
//result = homeControl.ExecuteHome(methodNode, xAxisSafeVal, yAxisSafeVal, zAxisSafeVal, EnableSimulator);
//if (!result) { return false; }
#endregion
#region Choice
if (Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceChoice)
{
if (!isRemotingOper)
{
if (mainWindow != null)
{
if (mainWindow.socketTcpListener != null && mainWindow.socketTcpListener.IsConnect())
{
MethodMsg methodMsgS = new MethodMsg(Guid.NewGuid().ToString(), "ID202_Choice_machine", 2, "", "ClawOpen", "", "", 1, 0);
// 拍照
mainWindow.socketTcpListener.SendMessage(mainWindow.socketTcpListener.CreateSendOpenCraw(methodMsgS), true);
System.Threading.Thread.Sleep(5000);
}
}
}
else
{
}
}
#endregion
// 状态4 运行 绿色
CommonBll.StatusLamp(4, EnableSimulator);
}
return true;
}
#region 查找当前是否有已经使用的Tip保存的文件
public List GetUsedTipFromXML()
{
List dropdownNames = new List();
XmlDocument xmlDocument = new XmlDocument();
try
{
string directoryBase = System.AppDomain.CurrentDomain.BaseDirectory;
string xmlFilePath = directoryBase + "Config\\" + "CurrentUsedTips.xml";
if (File.Exists(xmlFilePath))
{
xmlDocument.Load(xmlFilePath);
XmlNodeList xnList = xmlDocument.SelectNodes("root/data/tipdata");
if (xnList != null && xnList.Count > 0)
{
foreach (XmlNode xn in xnList)
{
DropdownName dropdown = new DropdownName();
dropdown.dropdown_id = xn.SelectSingleNode("lattice_id").InnerText;
dropdown.dropdown_name = xn.SelectSingleNode("wellname").InnerText;
dropdownNames.Add(dropdown);
}
}
}
else
{
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
return dropdownNames;
}
#endregion
#region 保存当前的枪头盒子信息到xml文件中
public int SaveUsedTipInfoIntoXML(List dropdownNames)
{
LoggerRunHelper.InfoLog("当前已使用的Tip头孔位数据集个数" + dropdownNames.Count.ToString());
List oldDropdownName = this.GetUsedTipFromXML();//读取上次的数据
foreach (DropdownName ddn in oldDropdownName)
{
DropdownName ddnew = new DropdownName();
ddnew.dropdown_id = ddn.dropdown_id;
ddnew.dropdown_name = ddn.dropdown_name;
var selectOne = dropdownNames.FirstOrDefault(x => x.dropdown_id.Equals(ddn.dropdown_id) && x.dropdown_name.Equals(ddn.dropdown_name));
if (selectOne == null || selectOne.dropdown_id == "")
{
dropdownNames.Add(ddnew);
}
}
LoggerRunHelper.InfoLog("当前已使用的Tip头孔位数据集更新后的个数" + dropdownNames.Count.ToString());
XmlDocument xmlDoc = new XmlDocument();
XmlElement root;
XmlDeclaration dec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(dec);
root = xmlDoc.CreateElement("root");
xmlDoc.AppendChild(root);
XmlElement xeKey = xmlDoc.CreateElement("data");//创建子节点,并且设置子节点的属性
foreach (DropdownName dropdownName in dropdownNames)
{
XmlElement xeformX = xmlDoc.CreateElement("tipdata");
XmlElement xeformX1 = xmlDoc.CreateElement("lattice_id");
xeformX1.InnerText = dropdownName.dropdown_id;
xeformX.AppendChild(xeformX1);
xeformX1 = xmlDoc.CreateElement("wellname");
xeformX1.InnerText = dropdownName.dropdown_name;
xeformX.AppendChild(xeformX1);
xeKey.AppendChild(xeformX);
}
root.AppendChild(xeKey);//挂载父节点
int iresult = 0;
try
{
if (xmlDoc.SelectNodes("root/data/tipdata") != null && xmlDoc.SelectNodes("root/data/tipdata").Count > 0)
{
//xmlDoc.Save(filePath.Split('.')[0] + ".xml");//保存xml文件
//File.Move(filePath.Split('.')[0] + ".xml", filePath.Split('.')[0] + ".mod");
string directoryBase = System.AppDomain.CurrentDomain.BaseDirectory;
string xmlFilePath = directoryBase + "Config\\" + "CurrentUsedTips.xml";
if (File.Exists(xmlFilePath))
{
File.Delete(xmlFilePath);
LoggerRunHelper.InfoLog("当前已使用的Tip头孔位数据集保存前删除旧的文件");
xmlDoc.Save(xmlFilePath);
LoggerRunHelper.InfoLog("当前已使用的Tip头孔位数据集保存文件");
}
else
{
xmlDoc.Save(xmlFilePath);
LoggerRunHelper.InfoLog("当前已使用的Tip头孔位数据集保存文件");
}
iresult = 1;
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
iresult = 0;
}
return iresult;
}
#endregion
Stack workStack = new Stack();//用来保存流程命令序列
#region 计算本次循环内的命令个数
private int calculationTotalOfCmdInLoop()
{
int icount = 0;
for (int i = 0; i < workStack.Count; i++)
{
string name = workStack.Pop();
if (i == 0 && name == "Method_EndLoop")
{
}
else
{
if (name != "循环开始" && name != "Method_EndLoop")
{
icount = icount + 1;
}
else if (name == "循环开始" || name == "Method_EndLoop")
{
break;
}
}
}
return icount;
}
#endregion
#region 计算本次组合内的命令个数
private int calculationTotalOfCmdInGroup()
{
int icount = 0;
for (int i = 0; i < workStack.Count; i++)
{
string name = workStack.Pop();
if (i == 0 && name == "Method_EndGroup")
{
}
else
{
if (name != "组合开始" && name != "Method_EndGroup")
{
icount = icount + 1;
}
else if (name == "组合开始" || name == "Method_EndGroup")
{
name = workStack.Pop();
while (name != "循环开始")
{
workStack.Pop();
}
break;
}
}
}
return icount;
}
#endregion
public int GetIndex(XmlDocument xmlDocument, int startId, int mark)
{
int iResult = 0;
XmlNodeList xmlNodeMethodList = xmlDocument.SelectNodes("root/method[@id>=" + startId + "]");
int totalOfLoop = 1;//嵌套的for循环次数
//清空方法列表
for (int n = 0; n < xmlNodeMethodList.Count; n++)
{
string MethodName = xmlNodeMethodList[n].SelectSingleNode("name").InnerText;
int iNum = methodListBll.getNumByMethodName(MethodName);
workStack.Push(MethodName);
switch (iNum)
{
case (int)MethodNameEnum.loop:
{
if (isLoop1Start == false)// && isLoop2Start == false)
{
}
else if (isLoop1Start == true)// && isLoop2Start == false)
{
//isLoop2Start = true;
totalOfLoop = totalOfLoop + 1;
//iResult = n;
//return iResult;
}
else if (isLoop1Start == true)// && isLoop2Start == true)
{
//isLoop2Start = false;
}
else if (isLoop1Start == false)// && isLoop2Start == true)
{
//isLoop1Start = false;
}
}
break;
case (int)MethodNameEnum.endloop:
{
if (isLoop1Start == false)// && isLoop2Start == false)
{
}
else if (isLoop1Start == true)// && isLoop2Start == false)
{
//isLoop1Start = false;
iResult = n;
return iResult;
}
else if (isLoop1Start == true)// && isLoop2Start == true)
{
if (totalOfLoop >= 2)
{
//isLoop2Start = false;
if (mark == 2)
{
iResult = n;
return iResult;
}
}
}
else if (isLoop1Start == false)// && isLoop2Start == true)
{
//isLoop1Start = false;
}
}
break;
default:
break;
}
}
return iResult;
}
#region 更新指定xml节点上的单枪头
///
/// 更新指定xml节点上的单枪头
///
/// 枪头运行属性实体对象
public void UpdateLabwaretips(TipsTable tipsTable)
{
if (!isRemotingOper)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
if (xmlDocument != null)
{
int pid = 0;
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceX1))
{
if (Convert.ToInt32(tipsTable.lattice_id) > 20)
{
pid = Convert.ToInt32(tipsTable.lattice_id) - 66;
}
}
else if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(tipsTable.lattice_id);
pid = Convert.ToInt32(lattice.lattice_num.Substring(1));// ControlCom.GetLatticeId(Convert.ToInt32(tipsTable.lattice_id), false);
}
else if(Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceHXFX))
{
//Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(tipsTable.lattice_num,Convert.ToInt32(Shared.DeviceArmList.FirstOrDefault(x=>x.arm_type.Equals(1))).device_arm_id,Shared.SoftwareInformation.software_device_number);
pid = Convert.ToInt32(tipsTable.lattice_num.Substring(1));// ControlCom.GetLatticeId(Convert.ToInt32(tipsTable.lattice_id), false);
}
else if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceHXELEC))
{
//Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(tipsTable.lattice_num,Convert.ToInt32(Shared.DeviceArmList.FirstOrDefault(x=>x.arm_type.Equals(1))).device_arm_id,Shared.SoftwareInformation.software_device_number);
pid = Convert.ToInt32(tipsTable.lattice_num.Substring(1));// ControlCom.GetLatticeId(Convert.ToInt32(tipsTable.lattice_id), false);
}
else
{
pid = Convert.ToInt32(tipsTable.lattice_id);
}
XmlNodeList xList = xmlDocument.SelectNodes("root/env/platform[lattice_id='" + pid + "']/labware");
XmlNode x = xmlDocument.SelectSingleNode("root/env/platform[lattice_id='" + pid + "']/labware[@id='"+ xList.Count + "'][labware_id='" + tipsTable.labware_id + "']");
string wells = x.SelectSingleNode("residueValidWells").InnerText;
List swell = wells.Split(',').ToList();
// 去掉当前正在使用的Tip头位置
if (swell.Contains(tipsTable.wellname))
{
swell.Remove(tipsTable.wellname);
DropdownName currentAWellLattice = new DropdownName();
currentAWellLattice.dropdown_id = tipsTable.lattice_id;
currentAWellLattice.dropdown_name = tipsTable.wellname;
currentIsUsedWellLattice.Add(currentAWellLattice);
}
wells = string.Empty;
// 组装使用后剩余的位置
for (int i = 0; i < swell.Count; i++)
{
wells += swell[i] + ",";
}
if(wells.Length>0)
{
wells= wells.Substring(0,wells.Length-1);
}
if (!string.IsNullOrEmpty(wells))
{
x.SelectSingleNode("residueValidWells").InnerText = wells;
}
else
{
x.SelectSingleNode("residueValidWells").InnerText = "";
}
foreach (var lb in labwareList)
{
int row = lb.row;
int col = lb.col;
// 获取台面对应格子的Canvas
Canvas canvas = null;
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
canvas = GetGridTableCanvas(row, col);
}
else
{
canvas = GetCanvasByLatticeNumOfLabware(lb);
}
if (canvas == null)
{
continue;
}
ControlLabware control = Utilities.FindVisualChild(canvas);
LabwareEx labwareEx = control.DataContext as LabwareEx;
if (lb.label.Equals(tipsTable.lattice_num))
{
control.ValidWells = wells;
labwareEx.validWells = wells;
}
////更新 设计界面的对应格子的Canvas
//Canvas canvasDesign = this.GetGridTableCanvasOnDesign(row, col);
Canvas canvasDesign = null;
tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
canvasDesign = GetGridTableCanvasOnDesign(row, col);
}
else
{
canvasDesign = GetCanvasByLatticeNumOfLabwareMainForm(lb);
}
if (canvasDesign == null)
{
continue;
}
ControlLabware controlDesign = Utilities.FindVisualChild(canvasDesign);
labwareEx = canvasDesign.DataContext as LabwareEx;
if (lb.label.Equals(tipsTable.lattice_num))
{
controlDesign.ValidWells = wells;
labwareEx.validWells = wells;
}
}
}
}));
}
else
{
if (xmlDocument != null)
{
int pid = Convert.ToInt32(tipsTable.lattice_id);
XmlNodeList xList = xmlDocument.SelectNodes("root/env/platform[lattice_id='" + pid + "']/labware");
XmlNode x = xmlDocument.SelectSingleNode("root/env/platform[lattice_id='" + pid + "']/labware[@id='"+ xList.Count + "'][labware_id='" + tipsTable.labware_id + "']");
string wells = x.SelectSingleNode("residueValidWells").InnerText;
List swell = wells.Split(',').ToList();
if (swell.Contains(tipsTable.wellname))
{
swell.Remove(tipsTable.wellname);
DropdownName currentAWellLattice = new DropdownName();
currentAWellLattice.dropdown_id = tipsTable.lattice_id;
currentAWellLattice.dropdown_name = tipsTable.wellname;
currentIsUsedWellLattice.Add(currentAWellLattice);
if (isRemotingOper)
{
this.SaveUsedTipInfoIntoXML(currentIsUsedWellLattice);
}
}
wells = string.Empty;
for (int i = 0; i < swell.Count; i++)
{
wells += swell[i] + ",";
}
if (!string.IsNullOrEmpty(wells))
{
x.SelectSingleNode("residueValidWells").InnerText = wells;
}
else
{
x.SelectSingleNode("residueValidWells").InnerText = "";
}
}
}
}
#endregion
#region 更新指定xml节点上的单孔位
///
/// 更新指定xml节点上的单孔位
///
/// 枪头运行属性实体对象
///
/// 孔位状态类型:1 无效孔白色;2:正在吸液红色;3:正在放液水红色;4:放液完成绿色;5:有效未使用蓝色
public void UpdateLabwareWells(TipsTable tipsTable, string[] wells, int markOfColor)
{
if (!isRemotingOper)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
if (xmlDocument != null)
{
Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(tipsTable.lattice_id);
int lapid = Convert.ToInt32(lattice.lattice_num.Substring(1));// ControlCom.GetLatticeId(Convert.ToInt32(tipsTable.lattice_id), false);
XmlNodeList xList = xmlDocument.SelectNodes("root/env/platform[lattice_id='" + lapid + "']/labware");
XmlNode x = xmlDocument.SelectSingleNode("root/env/platform[lattice_id='" + lapid.ToString() + "']/labware[@id='"+ xList.Count + "'][labware_id='" + tipsTable.labware_id + "']");
string swell = string.Empty;
for (int i = 0; i < wells.Length; i++)
{
swell += wells[i] + ",";
}
if (swell.Length > 0)
{
swell = swell.Substring(0, swell.Length - 1);
}
foreach (var lb in labwareList)
{
int row = lb.row;
int col = lb.col;
// 获取台面对应格子的Canvas
Canvas canvas = null;
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
canvas = GetGridTableCanvas(row, col);
}
else
{
canvas = GetCanvasByLatticeNumOfLabware(lb);
}
if (canvas == null)
{
continue;
}
ControlLabware control = Utilities.FindVisualChild(canvas);
if (lb.label.Equals(tipsTable.lattice_num))
{
if (markOfColor == 1)
{
control.UpdateWells(swell, Brushes.White.Color);
}
else if (markOfColor == 2)
{
control.UpdateWells(swell, Brushes.Red.Color);
}
else if (markOfColor == 3)
{
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 128, 255, 255));
control.UpdateWells(swell, Brushes.Pink.Color);
}
else if (markOfColor == 4)
{
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 128, 255, 255));
control.UpdateWells(swell, mybtn1_Brush.Color);
}
else if (markOfColor == 5)
{
control.UpdateWells(swell, Color.FromArgb(0xFF, 0x0E, 0x81, 0xEC));
}
}
}
}
}));
}
else
{
}
}
#endregion
#region 更新指定xml节点上的8通道枪头
///
/// 更新指定xml节点上的8通道枪头
///
/// 枪头运行属性实体对象
/// 已使用枪头名称串组
public void UpdateLabwaretips(TipsTable tipsTable, string strWell)
{
if (!isRemotingOper)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
if (xmlDocument != null)
{
Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(tipsTable.lattice_id);
int lapid = Convert.ToInt32(lattice.lattice_num.Substring(1));//ControlCom.GetLatticeId(Convert.ToInt32(tipsTable.lattice_id), false);
XmlNodeList xList = xmlDocument.SelectNodes("root/env/platform[lattice_id='" + lapid + "']/labware");
XmlNode x = xmlDocument.SelectSingleNode("root/env/platform[lattice_id='" + lapid + "']/labware[@id='"+ xList.Count + "'][labware_id='" + tipsTable.labware_id + "']");
string wells = x.SelectSingleNode("residueValidWells").InnerText;
List swell = wells.Split(',').ToList();
List chWells = strWell.Split(',').ToList();
string Inwells = string.Empty;
for (int i = 0; i < chWells.Count; i++)
{
if (swell.Contains(chWells[i]))
{
swell.Remove(chWells[i]);
DropdownName currentAWellLattice = new DropdownName();
currentAWellLattice.dropdown_id = tipsTable.lattice_id;
currentAWellLattice.dropdown_name = chWells[i];
currentIsUsedWellLattice.Add(currentAWellLattice);
Inwells += chWells[i] + ",";
}
}
Inwells = Inwells.Substring(0, Inwells.Length - 1);
wells = string.Empty;
for (int i = 0; i < swell.Count; i++)
{
wells += swell[i] + ",";
}
if (wells.Length > 0)
{
wells = wells.Substring(0, wells.Length - 1);
}
if (!string.IsNullOrEmpty(wells))
{
x.SelectSingleNode("residueValidWells").InnerText = wells;
}
else
{
x.SelectSingleNode("residueValidWells").InnerText = "";
}
foreach (var lb in labwareList)
{
int row = lb.row;
int col = lb.col;
// 获取台面对应格子的Canvas
Canvas canvas = null;
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
canvas = GetGridTableCanvas(row, col);
}
else
{
canvas = GetCanvasByLatticeNumOfLabware(lb);
}
if (canvas == null)
{
continue;
}
ControlLabware control = Utilities.FindVisualChild(canvas);
if (lb.label.Equals(tipsTable.lattice_num))
{
control.ValidWells = wells;
}
//Canvas canvasDesign = this.GetGridTableCanvasOnDesign(row, col);
Canvas canvasDesign = null;
tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
canvasDesign = GetGridTableCanvasOnDesign(row, col);
}
else
{
canvasDesign = GetCanvasByLatticeNumOfLabware(lb);
}
if (canvasDesign == null)
{
continue;
}
ControlLabware controlDesign = Utilities.FindVisualChild(canvasDesign);
LabwareEx labwareEx = canvasDesign.DataContext as LabwareEx;
if (lb.label.Equals(tipsTable.lattice_num))
{
controlDesign.ValidWells = wells;
labwareEx.validWells = wells;
}
}
}
}));
}
else
{
if (xmlDocument != null)
{
Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(tipsTable.lattice_id);
int lapid = Convert.ToInt32(lattice.lattice_num.Substring(1));//ControlCom.GetLatticeId(Convert.ToInt32(tipsTable.lattice_id), false);
XmlNodeList xList = xmlDocument.SelectNodes("root/env/platform[lattice_id='" + lapid + "']/labware");
XmlNode x = xmlDocument.SelectSingleNode("root/env/platform[lattice_id='" + lapid + "']/labware[@id='"+ xList.Count + "'][labware_id='" + tipsTable.labware_id + "']");
string wells = x.SelectSingleNode("residueValidWells").InnerText;
List swell = wells.Split(',').ToList();
List chWells = strWell.Split(',').ToList();
string Inwells = string.Empty;
for (int i = 0; i < chWells.Count; i++)
{
if (swell.Contains(chWells[i]))
{
swell.Remove(chWells[i]);
DropdownName currentAWellLattice = new DropdownName();
currentAWellLattice.dropdown_id = tipsTable.lattice_id;
currentAWellLattice.dropdown_name = chWells[i];
currentIsUsedWellLattice.Add(currentAWellLattice);
if (isRemotingOper)
{
this.SaveUsedTipInfoIntoXML(currentIsUsedWellLattice);
}
Inwells += chWells[i] + ",";
}
}
Inwells = Inwells.Substring(0, Inwells.Length - 1);
wells = string.Empty;
for (int i = 0; i < swell.Count; i++)
{
wells += swell[i] + ",";
}
if (wells.Length > 0)
{
wells = wells.Substring(0, wells.Length - 1);
}
if (!string.IsNullOrEmpty(wells))
{
x.SelectSingleNode("residueValidWells").InnerText = wells;
}
else
{
x.SelectSingleNode("residueValidWells").InnerText = "";
}
}
}
}
#endregion
#region 更新指定xml节点上的8通道枪头,放回原孔
///
/// 更新指定xml节点上的8通道枪头,放回原孔
///
/// 枪头运行属性实体对象
/// 已放回枪头名称串组
public void UpdateLabwaretipsPutIntoSrc(TipsTable tipsTable, string strWell)
{
if (!isRemotingOper)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
if (xmlDocument != null)
{
Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(tipsTable.lattice_id);
int lapid = Convert.ToInt32(lattice.lattice_num.Substring(1));//ControlCom.GetLatticeId(Convert.ToInt32(tipsTable.lattice_id), false);
XmlNodeList xList = xmlDocument.SelectNodes("root/env/platform[lattice_id='" + lapid + "']/labware");
XmlNode x = xmlDocument.SelectSingleNode("root/env/platform[lattice_id='" + lapid.ToString() + "']/labware[@id='"+ xList.Count + "'][labware_id='" + tipsTable.labware_id + "']");
string wells = x.SelectSingleNode("residueValidWells").InnerText;
List swell = wells.Split(',').ToList();
List chWells = strWell.Split(',').ToList();
string Inwells = string.Empty;
for (int i = 0; i < chWells.Count; i++)
{
if (!swell.Contains(chWells[i]))
{
swell.Add(chWells[i]);
}
}
wells = string.Empty;
for (int i = 0; i < swell.Count; i++)
{
wells += swell[i] + ",";
}
if (wells.Length > 0)
{
wells = wells.Substring(0, wells.Length - 1);
}
if (!string.IsNullOrEmpty(wells))
{
x.SelectSingleNode("residueValidWells").InnerText = wells;
}
else
{
x.SelectSingleNode("residueValidWells").InnerText = "";
}
foreach (var lb in labwareList)
{
int row = lb.row;
int col = lb.col;
//int pos = col * Shared.SoftwareInformation.rows + row;
//Canvas canvas = gridTable.Children[pos] as Canvas;
// 获取台面对应格子的Canvas
Canvas canvas = null;
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
canvas = GetGridTableCanvas(row, col);
}
else
{
canvas = GetCanvasByLatticeNumOfLabware(lb);
}
if (canvas == null)
{
continue;
}
ControlLabware control = Utilities.FindVisualChild(canvas);
if (lb.label.Equals(tipsTable.lattice_num))
{
control.ValidWells = wells;
//control.InValidWells = "";
}
//更新 设计界面的对应格子的Canvas
//Canvas canvasDesign = this.GetGridTableCanvasOnDesign(row, col);
// 获取台面对应格子的Canvas
Canvas canvasDesign = null;
tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
canvasDesign = GetGridTableCanvasOnDesign(row, col);
}
else
{
canvasDesign = GetCanvasByLatticeNumOfLabwareMainForm(lb);
}
if (canvasDesign == null)
{
continue;
}
ControlLabware controlDesign = Utilities.FindVisualChild(canvasDesign);
LabwareEx labwareEx = canvasDesign.DataContext as LabwareEx;
if (lb.label.Equals(tipsTable.lattice_num))
{
controlDesign.ValidWells = wells;
labwareEx.validWells = wells;
}
}
}
}));
}
else
{
if (xmlDocument != null)
{
Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(tipsTable.lattice_id);
int lapid = Convert.ToInt32(lattice.lattice_num.Substring(1));// ControlCom.GetLatticeId(Convert.ToInt32(tipsTable.lattice_id), false);
XmlNodeList xList = xmlDocument.SelectNodes("root/env/platform[lattice_id='" + lapid + "']/labware");
XmlNode x = xmlDocument.SelectSingleNode("root/env/platform[lattice_id='" + lapid.ToString() + "']/labware[@id='"+ xList.Count + "'][labware_id='" + tipsTable.labware_id + "']");
string wells = x.SelectSingleNode("residueValidWells").InnerText;
List swell = wells.Split(',').ToList();
List chWells = strWell.Split(',').ToList();
string Inwells = string.Empty;
for (int i = 0; i < chWells.Count; i++)
{
if (!swell.Contains(chWells[i]))
{
swell.Add(chWells[i]);
}
}
wells = string.Empty;
for (int i = 0; i < swell.Count; i++)
{
wells += swell[i] + ",";
}
if (wells.Length > 0)
{
wells = wells.Substring(0, wells.Length - 1);
}
if (!string.IsNullOrEmpty(wells))
{
x.SelectSingleNode("residueValidWells").InnerText = wells;
}
else
{
x.SelectSingleNode("residueValidWells").InnerText = "";
}
foreach (var lb in labwareList)
{
int row = lb.row;
int col = lb.col;
//int pos = col * Shared.SoftwareInformation.rows + row;
//Canvas canvas = gridTable.Children[pos] as Canvas;
// 获取台面对应格子的Canvas
Canvas canvas = null;
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
canvas = GetGridTableCanvas(row, col);
}
else
{
canvas = GetCanvasByLatticeNumOfLabware(lb);
}
if (canvas == null)
{
continue;
}
ControlLabware control = Utilities.FindVisualChild(canvas);
if (lb.label.Equals(tipsTable.lattice_num))
{
control.ValidWells = wells;
//control.InValidWells = "";
}
}
}
}
}
#endregion
#region 夹爪移动动画
#region 根据抓板转移执行动作的板位,创建两个台面之间的动画耗材转移,仅支持正规耗材板位
Canvas pathCanvas = new Canvas();
ControlLabware pickLabware;//抓板位上的耗材对象
List pickLabwareList;//抓板位上的耗材对象集
Canvas pickCanvas;//抓板位对象
Canvas placeCanvas;//放板位对象
Stack moveLabwareExes;//保存被移动的耗材的DataContext
public void GenerateAnimation(XmlNode xmlEnv,MethodGripTransport gripTransportData)
{
string sourceLatticeName, targetLatticeName;
sourceLatticeName = gripTransportData.srcPositionText;
targetLatticeName = gripTransportData.desPositionText;
moveLabwareExes = new Stack();
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
Canvas srcCanvas = pickCanvas = this.GetGridTableCanvasByNum(sourceLatticeName);
if (srcCanvas != null)
{
pickLabwareList = Utilities.FindAllVisualChild(srcCanvas);//叠放的耗材
if (gripTransportData.transportMode == (int)GripTransportModeEnum.TransportAll)
{
}
else if (gripTransportData.transportMode == (int)GripTransportModeEnum.TransportExceptOne)
{
pickLabwareList.RemoveAt(0);
}
else if (gripTransportData.transportMode == (int)GripTransportModeEnum.TransportCount)
{
int countOfLeftLabware = pickLabwareList.Count - gripTransportData.transportCount;
for (int i = 0; i < countOfLeftLabware; i++)
{
pickLabwareList.RemoveAt(0);
}
}
pickLabware = Utilities.FindVisualChild(srcCanvas);//叠放的耗材怎么搜索?
pickLabwareList.Reverse();
foreach (ControlLabware c in pickLabwareList)
{
Stack labwareExes = new Stack();
labwareExes = (Stack)srcCanvas.Tag;
LabwareEx labwareExPop = new LabwareEx(); ;
if (labwareExes.Count > 0)
{
moveLabwareExes.Push(labwareExes.Pop());
}
srcCanvas.Children.Remove(c);
}
//srcCanvas.DataContext = null;
System.Windows.Shapes.Path pathT = new System.Windows.Shapes.Path();
pathT.StrokeThickness = 1;
pathT.Stroke = Brushes.Transparent;
//pathT.Width = gridTable.ActualWidth;
//pathT.Height= gridTable.ActualHeight;
pathCanvas = new Canvas();
pathCanvas.Background = Brushes.Transparent;
pathCanvas.Width = gridTable.ActualWidth;
pathCanvas.Height = gridTable.ActualHeight;
Canvas.SetZIndex(pathCanvas, 999);
pathCanvas.Children.Add(pathT);
//根据重叠的层级,设置margin,用的是下层的耗材数据计算
double leftMargin = 0;//离左侧距离
double bottomMargin = 0;//离底部距离
pickLabwareList.Reverse();
for (int i = 0; i < pickLabwareList.Count; i++)
{
if(i==0)
{
}
else if (i != 0)
{
leftMargin += pickLabwareList[i].LabwareDeep;
bottomMargin += pickLabwareList[i].LabwareDeep;
}
pickLabwareList[i].Margin = new Thickness(leftMargin, 0, 0, bottomMargin);
pathCanvas.Children.Add(pickLabwareList[i]);
}
gridTable.Children.Add(pathCanvas);
Grid.SetColumnSpan(pathT, 5);
Grid.SetRowSpan(pathT, 5);
Grid.SetColumn(pathCanvas, 0);
Grid.SetRow(pathCanvas, 0);
//Grid.SetColumnSpan(pathCanvas, 5);
//Grid.SetRowSpan(pathCanvas, 5);
string startMovePoint = GetStraightLineStartPointAXis(Grid.GetRow(srcCanvas), Grid.GetColumn(srcCanvas));
//目标
placeCanvas = this.GetGridTableCanvasByNum(targetLatticeName);
string endMovePoint = GetStraightLineStartPointAXis(Grid.GetRow(placeCanvas), Grid.GetColumn(placeCanvas));
pathT.Data = Geometry.Parse("M " + startMovePoint + " L " + endMovePoint);
Console.WriteLine("M " + startMovePoint + " L " + endMovePoint);
ExcuteAnimation(pickLabwareList, pathT, Convert.ToInt32(ConfigurationManager.AppSettings["AnimationDurationMilliSeconds"]));
}
}));
}
#endregion
#region 计算动画移动路径坐标
private string GetStraightLineStartPointAXis(int i, int j)
{
System.Windows.Point gridLocation = gridTable.TransformToAncestor(this).Transform(new System.Windows.Point(0, 0));
string endMovePoint = string.Empty;
if (i == 0 && j == 0)
{
endMovePoint = (gridTable.ColumnDefinitions[i].ActualWidth / 2).ToString() + "," + (gridTable.RowDefinitions[j].ActualHeight / 2).ToString();
}
else if (i > 0 && j > 0)
{
endMovePoint = (gridTable.ColumnDefinitions[i].ActualWidth * j + gridTable.ColumnDefinitions[i].ActualWidth / 2).ToString() + "," + (gridTable.RowDefinitions[j].ActualHeight * i + gridTable.RowDefinitions[j].ActualHeight / 2).ToString();
}
else if (i > 0 && j == 0)
{
endMovePoint = (gridTable.ColumnDefinitions[i].ActualWidth / 2).ToString() + "," + (gridTable.RowDefinitions[4].ActualHeight * i + gridTable.RowDefinitions[j].ActualHeight / 2).ToString();
}
else if (i == 0 && j > 0)
{
endMovePoint = (gridTable.ColumnDefinitions[i].ActualWidth * j + gridTable.ColumnDefinitions[i].ActualWidth / 2).ToString() + "," + (gridTable.RowDefinitions[j].ActualHeight / 2).ToString();
}
//path1.Data = Geometry.Parse("M " + startMovePoint + " L " + endMovePoint);
return endMovePoint;
}
#endregion
#region 按路径执行耗材移动动画
///
/// 使用动画前提:先获取原板位上耗材
/// 调用该函数
/// 函数执行结束后,添加耗材到新板位上
///
/// 要移动的耗材对象
///
///
public void ExcuteAnimation(List controlLabwareList,System.Windows.Shapes.Path pathT,int durationMilliSeconds)
{
//需要根据行列设置偏移
double topValue=0, leftValue=0;
//topValue = gridTable.RowDefinitions[j].ActualHeight * i;
//leftValue = gridTable.ColumnDefinitions[i].ActualWidth * j;
Canvas canvas = gridTable.Children[0] as Canvas;
TranslateTransform translate = new TranslateTransform();
double topMargin=0, leftMargin = 0;
int count = 0;
foreach (ControlLabware c in controlLabwareList)
{
Canvas.SetTop(c, -canvas.ActualHeight / 2 - topValue-topMargin-c.LabwareDeep);
Canvas.SetLeft(c, -canvas.ActualWidth / 2 - leftValue);
c.RenderTransformOrigin = new System.Windows.Point(0.5, 0.5);
c.RenderTransform = translate;
leftMargin += c.LabwareDeep;
topMargin += c.LabwareDeep;
}
NameScope.SetNameScope(this, new NameScope());
this.RegisterName("translate", translate);
DoubleAnimationUsingPath animationX = new DoubleAnimationUsingPath();
animationX.PathGeometry = pathT.Data.GetFlattenedPathGeometry();
animationX.Source = PathAnimationSource.X;
animationX.Duration = new Duration(TimeSpan.FromMilliseconds(durationMilliSeconds));
DoubleAnimationUsingPath animationY = new DoubleAnimationUsingPath();
animationY.PathGeometry = pathT.Data.GetFlattenedPathGeometry();
animationY.Source = PathAnimationSource.Y;
animationY.Duration = animationX.Duration;
Storyboard story = new Storyboard();
//story.RepeatBehavior = RepeatBehavior.Forever;
//story.AutoReverse = true;
story.Children.Add(animationX);
story.Children.Add(animationY);
Storyboard.SetTargetName(animationX, "translate");
Storyboard.SetTargetName(animationY, "translate");
Storyboard.SetTargetProperty(animationX, new PropertyPath(TranslateTransform.XProperty));
Storyboard.SetTargetProperty(animationY, new PropertyPath(TranslateTransform.YProperty));
//Storyboard.SetTarget(animationX, gridTable);
//Storyboard.SetTargetProperty(animationX, new PropertyPath("Opacity"));
//Storyboard.SetTarget(animationY, gridTable);
//Storyboard.SetTargetProperty(animationY, new PropertyPath("Opacity"));
// 注册Completed事件
story.Completed += Storyboard_Completed;
story.Begin(this);
}
#endregion
// 动画完成时调用的事件处理器
Stack labwareExes = new Stack();
private void Storyboard_Completed(object sender, EventArgs e)
{
// 动画执行完毕后的代码
//MessageBox.Show("Storyboard 执行完毕!");
//移除pathT和pathCanvas
foreach (ControlLabware c in pickLabwareList)
{
pathCanvas.Children.Remove(c);
}
gridTable.Children.Remove(pathCanvas);
List placeLabware = Utilities.FindAllVisualChild(placeCanvas);
if(placeLabware!=null)//叠放
{
//placeCanvas.DataContext = null;
//placeCanvas.Children.Remove(placeLabware);
}
//placeCanvas = this.GetGridTableCanvasByNum("P13");
//placeCanvas.Background = Brushes.Red;
//Canvas.SetLeft(pickLabware, 0);
//Canvas.SetTop(pickLabware, 0);
foreach (ControlLabware c in pickLabwareList)
{
LabwareEx lb = moveLabwareExes.Pop();
pickLabware = c;
lb.label = placeCanvas.Name;
ControlLabware control = new ControlLabware();
control.LeftSideColor = pickLabware.LeftSideColor;
control.FrontColor = pickLabware.FrontColor;
control.TopColor = pickLabware.TopColor;
control.BorderColor = pickLabware.BorderColor;
if (pickLabware.LabwareType.ToString() == EnumManagement.GetEnumValue(ConsumableTypeEnum.CircularDish).ToString()) // 圆形皿
{
control.LabwareWidth = placeCanvas.ActualWidth;
control.LabwareHeight = placeCanvas.ActualHeight;// canvas.ActualWidth*50/90;
control.Rows = pickLabware.Rows;
control.Columns = pickLabware.Columns;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = placeCanvas.Name;
control.LabwareName = pickLabware.LabwareName;
control.LabwareType = Convert.ToInt16(pickLabware.LabwareType);
control.ValidWells = pickLabware.ValidWells;
control.Width = placeCanvas.ActualWidth;
control.Height = placeCanvas.ActualHeight + 4;
}
else if (pickLabware.LabwareType.ToString() == EnumManagement.GetEnumValue(ConsumableTypeEnum.TipsBox).ToString()) // 吸头盒
{
control.LabwareWidth = placeCanvas.ActualWidth;
control.LabwareHeight = placeCanvas.ActualHeight;
control.Rows = (int)pickLabware.Rows;
control.Columns = (int)pickLabware.Columns;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = placeCanvas.Name;
control.LabwareName = pickLabware.LabwareName;
control.LabwareType = Convert.ToInt16(pickLabware.LabwareType);
}
else
{
control.LabwareWidth = placeCanvas.ActualWidth;
control.LabwareHeight = placeCanvas.ActualHeight;
control.Rows = (int)pickLabware.Rows;
control.Columns = (int)pickLabware.Columns;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = placeCanvas.Name;
control.LabwareName = pickLabware.LabwareName;
control.LabwareType = Convert.ToInt16(pickLabware.LabwareType);
control.ValidWells = pickLabware.ValidWells;
}
if (pickLabware.LabwareType.ToString() == EnumManagement.GetEnumValue(ConsumableTypeEnum.TipsBox).ToString() ||
pickLabware.LabwareType.ToString() == EnumManagement.GetEnumValue(ConsumableTypeEnum.Plate).ToString()) // 吸头盒、孔板
{
// 设置有效孔位
string validWells = ComUtility.GetValidWells((int)pickLabware.Rows, (int)pickLabware.Columns);
pickLabware.ValidWells = control.ValidWells = validWells;
}
else
{
control.LabwareWidth = placeCanvas.ActualWidth;
control.LabwareHeight = placeCanvas.ActualHeight;
control.Rows = (int)pickLabware.Rows;
control.Columns = (int)pickLabware.Columns;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = placeCanvas.Name;
control.LabwareName = pickLabware.LabwareName;
control.LabwareType = Convert.ToInt16(pickLabware.LabwareType);
control.ValidWells = pickLabware.ValidWells;
}
Canvas.SetLeft(control, 0);
Canvas.SetBottom(control, 0);
pickLabware.Rows = Grid.GetRow(placeCanvas);
pickLabware.Columns = Grid.GetColumn(placeCanvas);
lb.position = placeCanvas.Name;
placeCanvas.DataContext = lb;
labwareExes = (Stack)placeCanvas.Tag;
if (labwareExes != null)
{
}
else
{
labwareExes = new Stack();
}
labwareExes.Push(lb);
placeCanvas.Tag = labwareExes;
//根据重叠的层级,设置margin,用的是下层的耗材数据计算
double leftMargin = 0;//离左侧距离
double bottomMargin = 0;//离底部距离
for (int i = 0; i < placeCanvas.Children.Count; i++)
{
ControlLabware a = placeCanvas.Children[i] as ControlLabware;
if (a != null)
{
leftMargin += a.LabwareDeep;
bottomMargin += a.LabwareDeep;
}
}
control.Margin = new Thickness(leftMargin, 0, 0, bottomMargin);
placeCanvas.Children.Add(control);
//如果是第二及其以上耗材,要隐藏标签
if (labwareExes.Count > 1)
{
control.Label = "";
}
else
{
control.Label = placeCanvas.Name;
}
}
}
#endregion
#region 暂停弹出倒计时或者提示信息界面
public bool ShowDialogForPause(MethodPauseMove methodPauseMove)
{
bool result = false;
if (!isRemotingOper)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
if (methodPauseMove.pauseMode == 0)
{
//调用倒计时界面
PlsPausewin plsPausewin = new PlsPausewin(methodPauseMove);
plsPausewin.Height = this.ActualHeight;
plsPausewin.Width = this.ActualWidth;
plsPausewin.WindowStartupLocation = WindowStartupLocation.CenterScreen;
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(40, 0, 0, 0));
plsPausewin.Background = (System.Windows.Media.Brush)mybtn1_Brush;
result = (bool)plsPausewin.ShowDialog();
}
else
{
PlsToolTipWin plsPausewin = new PlsToolTipWin(methodPauseMove.pauseTipInfo);
plsPausewin.Height = this.ActualHeight;
plsPausewin.Width = this.ActualWidth;
plsPausewin.WindowStartupLocation = WindowStartupLocation.CenterScreen;
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0));
plsPausewin.Background = (System.Windows.Media.Brush)mybtn1_Brush;
result = (bool)plsPausewin.ShowDialog();
}
}));
}
else
{
if (methodPauseMove.pauseMode == 0)
{
// 调用倒计时界面
PlsPausewin plsPausewin = new PlsPausewin(methodPauseMove);
plsPausewin.Height = this.ActualHeight;
plsPausewin.Width = this.ActualWidth;
plsPausewin.WindowStartupLocation = WindowStartupLocation.CenterScreen;
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(40, 0, 0, 0));
plsPausewin.Background = (System.Windows.Media.Brush)mybtn1_Brush;
result = (bool)plsPausewin.ShowDialog();
}
else
{
PlsToolTipWin plsPausewin = new PlsToolTipWin(methodPauseMove.pauseTipInfo);
plsPausewin.Height = this.ActualHeight;
plsPausewin.Width = this.ActualWidth;
plsPausewin.WindowStartupLocation = WindowStartupLocation.CenterScreen;
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0));
plsPausewin.Background = (System.Windows.Media.Brush)mybtn1_Brush;
result = (bool)plsPausewin.ShowDialog();
}
}
return result;
}
#endregion
#region 暂停弹出等待倒计时界面
public bool ShowDialogForWaitFor(MethodTimer methodTimer,MethodWaitFor methodWaitFor)
{
bool result = false;
if (!isRemotingOper)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
//调用倒计时界面
PlsWaitForwin plsWaitForwin = new PlsWaitForwin(methodTimer, methodWaitFor);
plsWaitForwin.Height = this.ActualHeight;
plsWaitForwin.Width = this.ActualWidth;
plsWaitForwin.WindowStartupLocation = WindowStartupLocation.CenterScreen;
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(40, 0, 0, 0));
plsWaitForwin.Background = (System.Windows.Media.Brush)mybtn1_Brush;
result = (bool)plsWaitForwin.ShowDialog();
}));
}
else
{
// 调用倒计时界面
PlsWaitForwin plsWaitForwin = new PlsWaitForwin(methodTimer, methodWaitFor);
plsWaitForwin.Height = this.ActualHeight;
plsWaitForwin.Width = this.ActualWidth;
plsWaitForwin.WindowStartupLocation = WindowStartupLocation.CenterScreen;
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(40, 0, 0, 0));
plsWaitForwin.Background = (System.Windows.Media.Brush)mybtn1_Brush;
result = (bool)plsWaitForwin.ShowDialog();
}
return result;
}
#endregion
#region 添加吸液数据行进入报表
public void addDataIntoReport(string labwareLabel, string volumn, string[] strWell, string result, string strBarcode = "", string[] indexCoating = null)
{
DataExportBll dataExportBll = new DataExportBll();
try
{
List dropdownNames = dataExportBll.GenerateReportColumn();
for (int i = 0; i < strWell.Length; i++)
{
int maxStepIndex = 0;
if (isRemotingOper)
{
maxStepIndex = ExperimentRunDetailDB.GetMaxStepIndexByRunChoiceBacteraId(ControlCom.ExpChoiceBactera(true, currentExperimentRunLog.experimentrunid).RunChoiceBacteraId) + 1;
}
else
{
maxStepIndex = ExperimentRunDetailDB.GetMaxStepIndexByRunChoiceBacteraId(ControlCom.ExpChoiceBactera().RunChoiceBacteraId) + 1;
}
DataRow dataRow = dataTableTotal.NewRow();
if (indexCoating != null)
{
dataRow[dropdownNames[0].dropdown_name] = indexCoating[i];
}
dataRow[dropdownNames[1].dropdown_name] = labwareLabel;
dataRow[dropdownNames[2].dropdown_name] = strBarcode;
dataRow[dropdownNames[3].dropdown_name] = strWell[i];
dataRow[dropdownNames[7].dropdown_name] = volumn;
dataRow[dropdownNames[8].dropdown_name] = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
dataRow[dropdownNames[10].dropdown_name] = result;
dataRow["StepIndex"] = maxStepIndex.ToString();
dataTableTotal.Rows.Add(dataRow);
#region 记录到数据库
ExperimentRunDetailModel experimentRunDetail = new ExperimentRunDetailModel();
if (isRemotingOper)
{
experimentRunDetail.RunChoiceBacteraId = ControlCom.ExpChoiceBactera().RunChoiceBacteraId;
experimentRunDetail.StepIndex = maxStepIndex;
experimentRunDetail.ExperimentId = currentExperimentRunLog.experimentrunid;
}
else
{
experimentRunDetail.RunChoiceBacteraId = ControlCom.ExpChoiceBactera().RunChoiceBacteraId;
experimentRunDetail.StepIndex = maxStepIndex;
experimentRunDetail.ExperimentId = Shared.Exp.ExperimentId;
}
experimentRunDetail.ExecuteMethod = "Aspirate";
experimentRunDetail.SourcePosition = labwareLabel;
experimentRunDetail.SourceBarcode = strBarcode;
experimentRunDetail.SourceWell = strWell[i];
experimentRunDetail.Volume = Convert.ToDouble(volumn);
experimentRunDetail.SourceStartTime = DateTime.Now;
experimentRunDetail.SourceEndTime = DateTime.Now;
experimentRunDetail.ExecSourceResult = result.Equals("pass") ? 1 : 0;
ExperimentRunDetailDB.Add(experimentRunDetail);
#endregion
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
}
#endregion
#region 添加吸液数据行进入报表
///
/// 添加吸液数据行进入报表
///
///
///
///
/// 多个结果
///
///
public void addDataIntoReport(string labwareLabel, string volumn, string[] strWell, string[] result, string strBarcode = "", string[] indexCoating = null)
{
DataExportBll dataExportBll = new DataExportBll();
try
{
List dropdownNames = dataExportBll.GenerateReportColumn();
for (int i = 0; i < strWell.Length; i++)
{
int maxStepIndex = 0;
if (isRemotingOper)
{
maxStepIndex = ExperimentRunDetailDB.GetMaxStepIndexByRunChoiceBacteraId(ControlCom.ExpChoiceBactera(true, currentExperimentRunLog.experimentrunid).RunChoiceBacteraId) + 1;
}
else
{
maxStepIndex = ExperimentRunDetailDB.GetMaxStepIndexByRunChoiceBacteraId(ControlCom.ExpChoiceBactera().RunChoiceBacteraId) + 1;
}
DataRow dataRow = dataTableTotal.NewRow();
if (indexCoating != null)
{
dataRow[dropdownNames[0].dropdown_name] = indexCoating[i];
}
dataRow[dropdownNames[1].dropdown_name] = labwareLabel;
dataRow[dropdownNames[2].dropdown_name] = strBarcode;
dataRow[dropdownNames[3].dropdown_name] = strWell[i];
dataRow[dropdownNames[7].dropdown_name] = volumn;
dataRow[dropdownNames[8].dropdown_name] = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
dataRow[dropdownNames[10].dropdown_name] = result[i];
dataRow["StepIndex"] = maxStepIndex.ToString();
dataTableTotal.Rows.Add(dataRow);
#region 记录到数据库
ExperimentRunDetailModel experimentRunDetail = new ExperimentRunDetailModel();
if (isRemotingOper)
{
experimentRunDetail.RunChoiceBacteraId = ControlCom.ExpChoiceBactera().RunChoiceBacteraId;
experimentRunDetail.StepIndex = maxStepIndex;
experimentRunDetail.ExperimentId = currentExperimentRunLog.experimentrunid;
}
else
{
experimentRunDetail.RunChoiceBacteraId = ControlCom.ExpChoiceBactera().RunChoiceBacteraId;
experimentRunDetail.StepIndex = maxStepIndex;
experimentRunDetail.ExperimentId = Shared.Exp.ExperimentId;
}
experimentRunDetail.ExecuteMethod = "Aspirate";
experimentRunDetail.SourcePosition = labwareLabel;
experimentRunDetail.SourceBarcode = strBarcode;
experimentRunDetail.SourceWell = strWell[i];
experimentRunDetail.Volume = Convert.ToDouble(volumn);
experimentRunDetail.SourceStartTime = DateTime.Now;
experimentRunDetail.SourceEndTime = DateTime.Now;
experimentRunDetail.ExecSourceResult = result[i].Equals("pass") ? 1 : 0;
ExperimentRunDetailDB.Add(experimentRunDetail);
#endregion
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
}
#endregion
#region 添加挑菌数据行进入报表
public void addChoiceDataIntoReport(TipsTable tipsTable, string labwareLabel, string volumn, string[] strWell, string result, string indexCoating,
DateTime startTime, DateTime endTime, string actionName, string strBarcode = "")
{
CoatingReportBll dataExportBll = new CoatingReportBll();
try
{
List dropdownNames = dataExportBll.GenerateReportColumn();
for (int i = 0; i < strWell.Length; i++)
{
DataRow dataRow = dataTableTotal.NewRow();
if (!string.IsNullOrEmpty(indexCoating))
{
dataRow[dropdownNames[0].dropdown_name] = indexCoating;
}
else
{
dataRow[dropdownNames[0].dropdown_name] = dataTableTotal.Rows.Count + 1;
}
int maxStepIndex = ExperimentRunDetailDB.GetMaxStepIndexByRunChoiceBacteraId(ControlCom.ExpChoiceBactera().RunChoiceBacteraId) + 1;
dataRow[dropdownNames[1].dropdown_name] = labwareLabel;
dataRow[dropdownNames[2].dropdown_name] = strBarcode;
dataRow[dropdownNames[3].dropdown_name] = strWell[i];
dataRow[dropdownNames[7].dropdown_name] = volumn;
dataRow[dropdownNames[8].dropdown_name] = startTime.ToString("yyyy-MM-dd HH:mm:ss:fff");
dataRow[dropdownNames[10].dropdown_name] = result;
dataRow["StepIndex"] = maxStepIndex.ToString();
dataTableTotal.Rows.Add(dataRow);
#region 记录到数据库
ExperimentRunDetailModel experimentRunDetail = new ExperimentRunDetailModel();
experimentRunDetail.RunChoiceBacteraId = ControlCom.ExpChoiceBactera().RunChoiceBacteraId;
experimentRunDetail.StepIndex = maxStepIndex;
experimentRunDetail.ExperimentId = Shared.Exp.ExperimentId;
experimentRunDetail.ExecuteMethod = actionName;
experimentRunDetail.SourcePosition = dataRow[dropdownNames[1].dropdown_name].ToString();
experimentRunDetail.SourceBarcode = dataRow[dropdownNames[2].dropdown_name].ToString();
experimentRunDetail.SourceWell = strWell[i];
experimentRunDetail.Volume = Convert.ToDouble(dataRow[dropdownNames[7].dropdown_name]);
experimentRunDetail.SourceStartTime = startTime;
experimentRunDetail.SourceEndTime = endTime;
experimentRunDetail.ExecSourceResult = (dataRow[dropdownNames[10].dropdown_name].ToString().Equals("pass") || dataRow[dropdownNames[10].dropdown_name].ToString().Equals("1")) ? 1 : 0;
ExperimentRunDetailDB.Add(experimentRunDetail);
#endregion
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
}
#endregion
#region 添加排液数据行进入报表
public void addFinishDataIntoReport(TipsTable tipsTable, string labwareLabel, string volumn, string[] strWell,
string result, string[] strBarcode, int atimeTotal = 0, int cnTotal = 0)
{
DataExportBll dataExportBll = new DataExportBll();
try
{
List dropdownNames = dataExportBll.GenerateReportColumn();
for (int i = 0; i < strWell.Length; i++)
{
DataRow dataRow = dataTableTotal.Rows[dataTableTotal.Rows.Count - strWell.Length + i];
if (atimeTotal != 0)
{
dataRow = dataTableTotal.Rows[dataTableTotal.Rows.Count - atimeTotal + (cnTotal - strWell.Length) + i];
}
if (string.IsNullOrEmpty(dataRow[dropdownNames[4].dropdown_name].ToString()))
{
dataRow[dropdownNames[4].dropdown_name] = labwareLabel;
dataRow[dropdownNames[5].dropdown_name] = strBarcode[i] == "" ? "" : strBarcode[i].ToString();
dataRow[dropdownNames[6].dropdown_name] = strWell[i];
dataRow[dropdownNames[7].dropdown_name] = volumn;
dataRow[dropdownNames[9].dropdown_name] = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
dataRow[dropdownNames[10].dropdown_name] = result;
// 更新到数据库
int nStepIndex = Convert.ToInt32(dataRow["StepIndex"].ToString());
ExperimentRunDetailModel experimentRunDetail = ExperimentRunDetailDB.GetInfodById(ControlCom.ExpChoiceBactera().RunChoiceBacteraId, nStepIndex);
experimentRunDetail.TargetPosition = labwareLabel;
experimentRunDetail.TargetBarcode = strBarcode[i] == "" ? "" : strBarcode[i].ToString();
experimentRunDetail.TargetWell = strWell[i];
experimentRunDetail.ActionName = "Dispense";
experimentRunDetail.TargetStartTime = DateTime.Now;
experimentRunDetail.TargetEndTime = DateTime.Now;
experimentRunDetail.ExecTargetResult = result.Equals("pass") ? 1 : 0;
ExperimentRunDetailDB.Update(experimentRunDetail);
}
else
{
if (i == 0)
{
// 分液状态下要增加吸液排液记录
for (int j = 0; j < strWell.Length; j++)
{
DataRow dr = dataTableTotal.NewRow();
dr[dropdownNames[0].dropdown_name] = dataRow[dropdownNames[0].dropdown_name];
dr[dropdownNames[1].dropdown_name] = dataRow[dropdownNames[4].dropdown_name];
dr[dropdownNames[2].dropdown_name] = dataRow[dropdownNames[5].dropdown_name];
dr[dropdownNames[3].dropdown_name] = strWell[j];//dataRow[dropdownNames[5].dropdown_name];
dr[dropdownNames[7].dropdown_name] = dataRow[dropdownNames[7].dropdown_name];
dr[dropdownNames[8].dropdown_name] = dataRow[dropdownNames[9].dropdown_name];
dr[dropdownNames[10].dropdown_name] = dataRow[dropdownNames[10].dropdown_name];
dataTableTotal.Rows.Add(dr);
// 添加
int maxStepIndex = ExperimentRunDetailDB.GetMaxStepIndexByRunChoiceBacteraId(ControlCom.ExpChoiceBactera().RunChoiceBacteraId) + 1;
ExperimentRunDetailModel experimentRunDetail = new ExperimentRunDetailModel();
experimentRunDetail.RunChoiceBacteraId = ControlCom.ExpChoiceBactera().RunChoiceBacteraId;
experimentRunDetail.ExperimentId = Shared.Exp.ExperimentId;
experimentRunDetail.StepIndex = maxStepIndex;
experimentRunDetail.ExecuteMethod = "Aspirate";
experimentRunDetail.SourcePosition = dataRow[dropdownNames[4].dropdown_name].ToString();
experimentRunDetail.SourceBarcode = dataRow[dropdownNames[5].dropdown_name].ToString();
experimentRunDetail.SourceWell = strWell[i];
experimentRunDetail.Volume = Convert.ToDouble(dataRow[dropdownNames[7].dropdown_name]);
experimentRunDetail.SourceStartTime = DateTime.Now;
experimentRunDetail.SourceEndTime = DateTime.Now;
experimentRunDetail.ExecSourceResult = dataRow[dropdownNames[10].dropdown_name].ToString().Equals("pass") ? 1 : 0;
ExperimentRunDetailDB.Add(experimentRunDetail);
}
DataRow d = dataTableTotal.Rows[dataTableTotal.Rows.Count - strWell.Length + i];
if (atimeTotal != 0)
{
d = dataTableTotal.Rows[dataTableTotal.Rows.Count - atimeTotal + (cnTotal - strWell.Length) + i];
}
if (string.IsNullOrEmpty(d[dropdownNames[4].dropdown_name].ToString()))
{
d[dropdownNames[5].dropdown_name] = strBarcode[i] == "" ? "" : strBarcode[i].ToString();
d[dropdownNames[6].dropdown_name] = strWell[i];
d[dropdownNames[7].dropdown_name] = volumn;
d[dropdownNames[9].dropdown_name] = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
d[dropdownNames[10].dropdown_name] = result;
// 更新
int nStepIndex = Convert.ToInt32(d["StepIndex"].ToString());
ExperimentRunDetailModel experimentRunDetail = ExperimentRunDetailDB.GetInfodById(ControlCom.ExpChoiceBactera().RunChoiceBacteraId, nStepIndex);
experimentRunDetail.TargetPosition = labwareLabel;
experimentRunDetail.TargetBarcode = strBarcode[i] == "" ? "" : strBarcode[i].ToString();
experimentRunDetail.TargetWell = strWell[i];
experimentRunDetail.ActionName = "Dispense";
experimentRunDetail.TargetStartTime = DateTime.Now;
experimentRunDetail.TargetEndTime = DateTime.Now;
experimentRunDetail.ExecTargetResult = result.Equals("pass") ? 1 : 0;
ExperimentRunDetailDB.Update(experimentRunDetail);
}
}
}
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
}
#endregion
#region 添加涂布数据行进入报表
public void addCoatingFinishDataIntoReport(TipsTable tipsTable, string labwareLabel, string volumn, string[] strWell, string result,
string[] indexCoating, string strBarcode, DateTime startTime, DateTime endTime, string actionName, int index = 0, int loop = 0)
{
CoatingReportBll dataExportBll = new CoatingReportBll();
try
{
List dropdownNames = dataExportBll.GenerateReportColumn();
int currentDataCount = dataTableTotal.Rows.Count;
int countOfValid = 0;//本次有效的通道号个数
for (int i = 0; i < strWell.Length; i++)
{
{
if (strWell[i] == null || strWell[i] == "")
{
break;
}
DataRow dataRow = dataTableTotal.Rows[dataTableTotal.Rows.Count - index + i];
if (string.IsNullOrEmpty(dataRow[dropdownNames[4].dropdown_name].ToString()))
{
dataRow[dropdownNames[4].dropdown_name] = labwareLabel;
dataRow[dropdownNames[5].dropdown_name] = strBarcode;
dataRow[dropdownNames[6].dropdown_name] = strWell[i];
dataRow[dropdownNames[7].dropdown_name] = volumn;
dataRow[dropdownNames[9].dropdown_name] = startTime.ToString("yyyy-MM-dd HH:mm:ss:fff");
dataRow[dropdownNames[10].dropdown_name] = result;
// 更新到数据库
int nStepIndex = Convert.ToInt32(dataRow["StepIndex"].ToString());
ExperimentRunDetailModel experimentRunDetail = ExperimentRunDetailDB.GetInfodById(ControlCom.ExpChoiceBactera().RunChoiceBacteraId, nStepIndex);
experimentRunDetail.TargetPosition = labwareLabel;
experimentRunDetail.TargetBarcode = strBarcode;
experimentRunDetail.TargetWell = strWell[i];
experimentRunDetail.Volume = Convert.ToDouble(dataRow[dropdownNames[7].dropdown_name]);
experimentRunDetail.ActionName = actionName;
experimentRunDetail.TargetStartTime = startTime;
experimentRunDetail.TargetEndTime = endTime;
experimentRunDetail.ExecTargetResult = (result.Equals("pass") || result.Equals("1")) ? 1 : 0;
ExperimentRunDetailDB.Update(experimentRunDetail);
}
else
{
if (loop == 0)
{
dataRow = dataTableTotal.Rows[currentDataCount - index + i];
}
if (loop == 1)
{
dataRow = dataTableTotal.Rows[currentDataCount - index + i - 2];
}
if (loop == 2)
{
dataRow = dataTableTotal.Rows[currentDataCount - index + i - 4];
}
if (i == 0)
{
//复制状态下要增加涂布记录
for (int j = 0; j < strWell.Length; j++)
{
if (strWell[j] == null || strWell[j] == "")
{
break;
}
countOfValid++;
DataRow dr = dataTableTotal.NewRow();
if (isRemotingOper)
{
dr[dropdownNames[0].dropdown_name] = indexCoating[j];
}
else
{
dr[dropdownNames[0].dropdown_name] = dataTableTotal.Rows.Count + 1;
}
dr[dropdownNames[1].dropdown_name] = dataRow[dropdownNames[4].dropdown_name];
dr[dropdownNames[2].dropdown_name] = dataRow[dropdownNames[5].dropdown_name];
dr[dropdownNames[3].dropdown_name] = strWell[j];//dataRow[dropdownNames[5].dropdown_name];
dr[dropdownNames[7].dropdown_name] = dataRow[dropdownNames[7].dropdown_name];
dr[dropdownNames[8].dropdown_name] = dataRow[dropdownNames[9].dropdown_name];
dr[dropdownNames[10].dropdown_name] = dataRow[dropdownNames[10].dropdown_name];
dataTableTotal.Rows.Add(dr);
// 添加
int maxStepIndex = ExperimentRunDetailDB.GetMaxStepIndexByRunChoiceBacteraId(ControlCom.ExpChoiceBactera().RunChoiceBacteraId) + 1;
ExperimentRunDetailModel experimentRunDetail = new ExperimentRunDetailModel();
experimentRunDetail.RunChoiceBacteraId = ControlCom.ExpChoiceBactera().RunChoiceBacteraId;
experimentRunDetail.ExperimentId = Shared.Exp.ExperimentId;
experimentRunDetail.StepIndex = maxStepIndex;
experimentRunDetail.ExecuteMethod = "Choice";
experimentRunDetail.SourcePosition = dataRow[dropdownNames[4].dropdown_name].ToString();
experimentRunDetail.SourceBarcode = dataRow[dropdownNames[5].dropdown_name].ToString();
experimentRunDetail.SourceWell = strWell[i];
experimentRunDetail.Volume = Convert.ToDouble(dataRow[dropdownNames[7].dropdown_name]);
experimentRunDetail.SourceStartTime = DateTime.Now;
experimentRunDetail.SourceEndTime = DateTime.Now;
experimentRunDetail.ExecSourceResult = (dataRow[dropdownNames[10].dropdown_name].ToString().Equals("pass") || dataRow[dropdownNames[10].dropdown_name].ToString().Equals("1")) ? 1 : 0;
ExperimentRunDetailDB.Add(experimentRunDetail);
}
}
DataRow d = dataTableTotal.Rows[dataTableTotal.Rows.Count - countOfValid + i];
if (string.IsNullOrEmpty(d[dropdownNames[4].dropdown_name].ToString()))
{
d[dropdownNames[4].dropdown_name] = labwareLabel;
d[dropdownNames[5].dropdown_name] = strBarcode;
d[dropdownNames[6].dropdown_name] = strWell[i];
d[dropdownNames[7].dropdown_name] = volumn;
d[dropdownNames[9].dropdown_name] = startTime.ToString("yyyy-MM-dd HH:mm:ss:fff");
d[dropdownNames[10].dropdown_name] = result;
// 更新
int nStepIndex = Convert.ToInt32(d["StepIndex"].ToString());
ExperimentRunDetailModel experimentRunDetail = ExperimentRunDetailDB.GetInfodById(ControlCom.ExpChoiceBactera().RunChoiceBacteraId, nStepIndex);
experimentRunDetail.TargetPosition = labwareLabel;
experimentRunDetail.TargetBarcode = strBarcode;
experimentRunDetail.TargetWell = strWell[i];
experimentRunDetail.ActionName = "Coating";
experimentRunDetail.TargetStartTime = DateTime.Now;
experimentRunDetail.TargetEndTime = DateTime.Now;
experimentRunDetail.ExecTargetResult = (result.Equals("pass") || result.Equals("1")) ? 1 : 0;
ExperimentRunDetailDB.Update(experimentRunDetail);
}
}
}
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
}
#endregion
#region 构建涂布报告结果数据文字描述
public string GenerateCoatingReport(string imageName)
{
string strJson = string.Empty;
DataTable dtResult = new DataTable();
try
{
// 从拍照的json文件中,读取菌属性值,打包成涂布报告的格式
string jsonFilePath = ConfigurationManager.AppSettings["captureFilePath"].ToString();
string[] files = Directory.GetFiles(jsonFilePath);
int fiMax = 1;
foreach (string f in files)
{
string f1 = f.Split('.')[0];
int startIndex = f1.LastIndexOf('\\');
string namestr = f1.Substring(startIndex + 1, f1.Length - startIndex - 1);
if (namestr.Contains("_原"))
{
continue;
}
int fileName = Convert.ToInt32(namestr);
if (fileName > fiMax)
{
fiMax = fileName;
}
}
string fullJsonFileName = jsonFilePath + "\\" + (fiMax).ToString() + ".json";
ObservableCollection bacteriaCoordinates = DataModule.getInstance().GetBacteriaCoordinateList(fullJsonFileName);
string jsonData = File.ReadAllText(fullJsonFileName);
jsonData = jsonData.Replace("#!HxSEP!#", "");
JObject job = JObject.Parse(jsonData);
string barcode = job["barcode"].ToString();
string countOfBacteria = job["count"].ToString();
string color_str = string.Empty;
string shape = string.Empty;
string diameterSize = string.Empty;
string proximity = string.Empty;
JArray jArray = (JArray)job["germlist"];
if (dataTableTotal.Rows.Count != 0)
{
dtResult = dataTableTotal.Clone();
//再增加几个列
#region
DataColumn d = new DataColumn();
d.ColumnName = "barcode";
dtResult.Columns.Add(d);
d = new DataColumn();
d.ColumnName = "color_str";
dtResult.Columns.Add(d);
d = new DataColumn();
d.ColumnName = "shape";
dtResult.Columns.Add(d);
d = new DataColumn();
d.ColumnName = "diameterSize";
dtResult.Columns.Add(d);
d = new DataColumn();
d.ColumnName = "proximity";
dtResult.Columns.Add(d);
#endregion
foreach (JToken jt in jArray)
{
color_str = jt["color_str"].ToString();
shape = jt["shape"].ToString();
diameterSize = jt["diameterSize"].ToString();
proximity = jt["proximity"].ToString();
int index = Convert.ToInt32(jt["index"].ToString());
string coordinate3D = string.Empty;
string coordinate3Dx = jt["coordinate3D"]["x"].ToString();
string coordinate3Dy = jt["coordinate3D"]["y"].ToString();
string coordinate3Dz = jt["coordinate3D"]["z"].ToString();
coordinate3D = jt["coordinate3D"]["x"].ToString() + "," + jt["coordinate3D"]["y"].ToString() + "," + jt["coordinate3D"]["z"].ToString();
//拿坐标到涂布报表中搜寻相同的坐标
if (dataTableTotal.Rows.Count != 0)
{
for (int i = 0; i < dataTableTotal.Rows.Count; i++)
{
//if (dataTableTotal.Rows[i]["SourcePlateWell"].ToString() == coordinate3D)
//{
DataRow r = dtResult.NewRow();
r["CoatingDataId"] = dataTableTotal.Rows[i]["CoatingDataId"].ToString();
r["SourcePlateID"] = dataTableTotal.Rows[i]["SourcePlateID"].ToString();
r["SourcePlateBarcode"] = (dataTableTotal.Rows[i]["SourcePlateBarcode"] != null) ? dataTableTotal.Rows[i]["SourcePlateBarcode"].ToString() : "";
r["SourcePlateWell"] = dataTableTotal.Rows[i]["SourcePlateWell"].ToString();
r["TargetPlateID"] = dataTableTotal.Rows[i]["TargetPlateID"].ToString();
r["TargetPlateBarcode"] = dataTableTotal.Rows[i]["TargetPlateBarcode"].ToString();
r["TargetPlateWell"] = dataTableTotal.Rows[i]["TargetPlateWell"].ToString();
r["Volume"] = dataTableTotal.Rows[i]["Volume"].ToString();
r["StartActionTime"] = dataTableTotal.Rows[i]["StartActionTime"].ToString();
r["EndActionTime"] = dataTableTotal.Rows[i]["EndActionTime"].ToString();
r["ExcuteResult"] = dataTableTotal.Rows[i]["ExcuteResult"].ToString();
r["diameterSize"] = diameterSize.ToString();
r["shape"] = shape.ToString();
r["color_str"] = color_str.ToString();
r["proximity"] = proximity.ToString();
dtResult.Rows.Add(r);
//}
}
}
}
}
string j = JsonConvert.SerializeObject(dtResult);
strJson = "{" +
"\"barcode\": \"" + barcode + "\"" +
",\"countofbacteria\": " + countOfBacteria + "" +
",\"image\": \"" + imageName + "\"" +
",\"germlist\":" + j + "}";
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
return strJson;
}
#endregion
#region 构建涂布报告结果数据文字描述
public string GenerateMoveLiquidReportBase()
{
string strJson = string.Empty;
DataTable dtResult = new DataTable();
//直接利用移液数据文件构建表结构
dtResult.Columns.Add("CoatingDataId", typeof(string));
dtResult.Columns.Add("SourceA", typeof(string));
dtResult.Columns.Add("SourceBarcode", typeof(string));
dtResult.Columns.Add("SourceWell", typeof(string));
dtResult.Columns.Add("TargetB", typeof(string));
dtResult.Columns.Add("TargetBarcode", typeof(string));
dtResult.Columns.Add("TargetWell", typeof(string));
dtResult.Columns.Add("Volume", typeof(string));
dtResult.Columns.Add("StartActionTime", typeof(string));
dtResult.Columns.Add("EndActionTime", typeof(string));
dtResult.Columns.Add("ExcuteResult", typeof(int));
try
{
if (dataTableTotal.Rows.Count != 0)
{
//dtResult = dataTableTotal.Clone();
//拿坐标到涂布报表中搜寻相同的坐标
if (dataTableTotal.Rows.Count != 0)
{
for (int i = 0; i < dataTableTotal.Rows.Count; i++)
{
//if (dataTableTotal.Rows[i]["SourcePlateWell"].ToString() == coordinate3D)
//{
DataRow r = dtResult.NewRow();
r["CoatingDataId"] = dataTableTotal.Rows[i]["CoatingDataId"].ToString();
r["SourceA"] = dataTableTotal.Rows[i]["SourcePlateID"].ToString();
r["SourceBarcode"] = (dataTableTotal.Rows[i]["SourcePlateBarcode"] != null) ? dataTableTotal.Rows[i]["SourcePlateBarcode"].ToString() : "";
r["SourceWell"] = dataTableTotal.Rows[i]["SourcePlateWell"].ToString();
r["TargetB"] = dataTableTotal.Rows[i]["TargetPlateID"].ToString();
r["TargetBarcode"] = dataTableTotal.Rows[i]["TargetPlateBarcode"].ToString();
r["TargetWell"] = dataTableTotal.Rows[i]["TargetPlateWell"].ToString();
r["Volume"] = dataTableTotal.Rows[i]["Volume"].ToString();
r["StartActionTime"] = dataTableTotal.Rows[i]["StartActionTime"].ToString();
r["EndActionTime"] = dataTableTotal.Rows[i]["EndActionTime"].ToString();
r["ExcuteResult"] = dataTableTotal.Rows[i]["ExcuteResult"].ToString() == "pass" ? 1 : 0;
dtResult.Rows.Add(r);
}
}
}
string j = JsonConvert.SerializeObject(dtResult);
strJson = j;//"{" +"\"germlist\":" + j + "}";
}
catch (Exception ex)
{
LoggerHelper.ErrorLog(ex.ToString());
}
return strJson;
}
public string GenerateMoveLiquidReport(string file)
{
string strJson = string.Empty;
DataTable dtResult = new DataTable();
//直接利用移液数据文件构建表结构
string ext = Path.GetExtension(file);
if (string.Compare(ext, ".csv", true) == 0)
{
dtResult = ExcelAndCsvHelper.GetDataTableFromCsvFile(file, false);
}
else
{
dtResult = ExcelAndCsvHelper.GetDataTableFromExcelFile(file, true);
}
DataColumn dataColumn = new DataColumn();
dataColumn.ColumnName = "执行结果";
dtResult.Columns.Add(dataColumn);
try
{
if (dataTableTotal.Rows.Count != 0)
{
//dtResult = dataTableTotal.Clone();
//拿坐标到涂布报表中搜寻相同的坐标
if (dataTableTotal.Rows.Count != 0)
{
for (int i = 0; i < dataTableTotal.Rows.Count; i++)
{
dtResult.Rows[i]["执行结果"] = dataTableTotal.Rows[i]["ExcuteResult"].ToString() == "pass" ? "成功" : "失败";
}
}
}
string j = JsonConvert.SerializeObject(dtResult);
strJson = j;//"{" +"\"germlist\":" + j + "}";
}
catch (Exception ex)
{
LoggerHelper.ErrorLog(ex.ToString());
}
return strJson;
}
#endregion
///
/// 添加台面布置格子
///
///
///
///
///
///
///
private Canvas AddTableItems(int row, int column, int latticeNum, bool isTrash)
{
Canvas canvas = new Canvas();
if (nTableRows == 6 && nTableColumns == 6)
{
canvas.Margin = new Thickness(14, 6, 14, 6);
}
else
{
canvas.Margin = new Thickness(10, 10, 10, 10);
}
canvas.AllowDrop = true;
canvas.Name = "P" + latticeNum.ToString();
TextBlock tb = new TextBlock();
tb.Text = "P" + latticeNum.ToString();
tb.FontSize = 18;
tb.Foreground = Brushes.Black;
tb.VerticalAlignment = System.Windows.VerticalAlignment.Center;
tb.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
Border border = new Border()
{
Background = Brushes.DarkGray,
CornerRadius = new CornerRadius(5),
Child = tb,
};
canvas.Children.Add(border);
//grid.Drop += Canvas_Drop;
//grid.PreviewMouseDown += Canvas_PreviewMouseDown;
//grid.PreviewMouseMove += Canvas_PreviewMouseMove;
//grid.QueryContinueDrag += DoQueryContinueDrag;
//grid.PreviewDragOver += Canvas_PreviewDragOver;
canvas.SizeChanged += Canvas_SizeChanged;
//grid.ContextMenu = FindResource("tableMenu") as ContextMenu;
if (isTrash)
{
ControlLabware cl = new ControlLabware()
{
IsTrash = true,
LabwareName = Properties.Resources.strTrash.ToString()
};
LabwareEx lb = new LabwareEx();
lb.labware_name = Properties.Resources.strTrash;
canvas.DataContext = lb;
canvas.Children.Add(cl);
}
Canvas.SetZIndex(canvas, 0);
gridTable.Children.Add(canvas);
Grid.SetColumn(canvas, column);
Grid.SetRow(canvas, row);
if (Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceLiteChoice ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
if (isTrash)
{
Grid.SetColumnSpan(canvas, 1);
Grid.SetRowSpan(canvas, 3);
}
else if (latticeNum == mainWindow.ChoiceLatticeId)
{
// P16、17合并单元格
Grid.SetColumnSpan(canvas, 1);
Grid.SetRowSpan(canvas, 2);
// 将Image控件添加到Canvas上
Image image = new Image();
image.Source = (ImageSource)(new ImageSourceConverter()).ConvertFrom(new Uri(@"pack://application:,,,/XHandler;component/Assets/dish_LiteChoice.png"));
image.Stretch = Stretch.Fill;
image.Width = canvas.Width - 4;
image.Height = canvas.Height - 23;
Canvas.SetLeft(image, 2);
Canvas.SetTop(image, 2);
canvas.Children.Add(image);
Panel.SetZIndex(image, 99);
}
}
//else if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLite))
//{
// if (isTrash)
// {
// Grid.SetColumnSpan(canvas, 1);
// Grid.SetRowSpan(canvas, 3);
// }
//}
return canvas;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (EventResponseController.Instance.CanExecute() == false)
return;
closeEvent?.Invoke(this, EventArgs.Empty);
}
private void Canvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
Canvas canvas = (Canvas)sender;
if (canvas.Children.Count > 0)
{
Border bd = canvas.Children[0] as Border;
bd.Width = canvas.ActualWidth;
bd.Height = canvas.ActualHeight;
//cl.LabwareWidth = canvas.ActualWidth - cl.LabwareDeep;
}
if (canvas.DataContext != null)
{
LabwareEx l = (LabwareEx)canvas.DataContext;
if (string.IsNullOrEmpty(l.labware_type_id))
{
ControlLabware cl = Utilities.FindVisualChild(canvas);
if (cl != null)
{
cl.Width = canvas.ActualWidth;
cl.Height = canvas.ActualHeight;
}
}
else
{
if (canvas.Children.Count > 1)
{
ControlLabware cl = Utilities.FindVisualChild(canvas);
if (cl != null)
{
cl.Width = canvas.ActualWidth;
cl.Height = canvas.ActualHeight;
}
}
}
}
// 挑菌位图片大小适配
if (canvas.Name.Equals(ConfigurationManager.AppSettings["choiceLatticeId"].ToString()))
{
Image img = Utilities.FindVisualChild(canvas);
if (img != null)
{
img.Width = canvas.ActualWidth - 4;
img.Height = canvas.ActualHeight - 23;
}
ControlLabware cl = Utilities.FindVisualChild(canvas);
if (cl != null)
{
cl.LabwareWidth = canvas.ActualWidth - 10;
cl.LabwareHeight = canvas.ActualHeight / 2;
}
}
}
///
/// 添加运行日志
///
///
public void AddLogs(string log)
{
lock (m_lockTipMsg)
{
if (isRemotingOper)//如果是远程运行不添加日志到界面
{
LoggerRunHelper.InfoLog(log);
}
else
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
logList.Add(log);
if (logList.Count > Convert.ToInt32(ConfigurationManager.AppSettings["runLogCnt"]))
{
logList.RemoveAt(0);
}
logListbox.ScrollIntoView(log);
LoggerRunHelper.InfoLog(log);
}));
}
}
}
public void UpdateInvalidStatus(string position, string wells)
{
if (!isRemotingOper)
{
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
foreach (Canvas canvas in gridTable.Children)
{
if (canvas.Name == position)
{
LabwareEx labwareEx = canvas.DataContext as LabwareEx;
ControlLabware labware = Utilities.FindVisualChild(canvas);
if (labwareEx != null && labware != null)
{
labware.UpdateWells(wells, Colors.Green);
}
break;
}
}
}));
}
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
SetRunningStatus("3");
}
private void Button_Click_3(object sender, RoutedEventArgs e)
{
SetErrorStatus("4-1");
}
///
/// 设置节点状态
///
///
private void SetRunningStatus(string indexName)
{
if (isRemotingOper)
{
return;
}
MethodEx methodEx = FindMethodExByIndex(rootMethod, indexName);
if (methodEx != null)
{
//methodEx.isSelected = true;
methodEx.IsError = 2;
//Dispatcher.Invoke(new Action(() =>
//{
// runTreeviewWorkflow.UpdateLayout();
//}), DispatcherPriority.Background);
//滚动条跟随,只支持第一层跟随
Dispatcher.Invoke(new Action(() =>
{
TreeViewItem item = runTreeviewWorkflow.ItemContainerGenerator.ContainerFromItem(methodEx) as TreeViewItem;
if (item != null)
{
// 将TreeViewItem设置为焦点
item.Focus();
// 滚动TreeViewItem到视图中
item.BringIntoView();
}
}), DispatcherPriority.Background);
}
//runTreeviewWorkflow.UpdateLayout();
//runTreeviewWorkflow.BringIntoView(new Rect(runTreeviewWorkflow.s));
}
//private void myTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e)
//{
// if (runTreeviewWorkflow.SelectedItem != null)
// {
// // 计算并设置ScrollViewer的ScrollOffset
// // 注意:此处的TreeViewItemContainerGenerator可能需要你根据实际的TreeView命名进行调整
// var itemContainer = runTreeviewWorkflow.ItemContainerGenerator.ContainerFromItem(runTreeviewWorkflow.SelectedItem) as UIElement;
// if (itemContainer != null)
// {
// double itemTop = itemContainer.TranslatePoint(new System.Windows.Point(0, 0), runTreeviewWorkflow).Y;
// double scrollTop = runTreeviewWorkflow.ScrollViewer.VerticalOffset;
// double scrollOffset = itemTop + scrollTop - runTreeviewWorkflow.ScrollViewer.ViewportHeight / 2;
// runTreeviewWorkflow.ScrollViewer.ScrollToVerticalOffset(scrollOffset);
// }
// }
//}
private void SetErrorStatus(string indexName)
{
if (isRemotingOper)
{
return;
}
MethodEx methodEx = FindMethodExByIndex(rootMethod, indexName);
if (methodEx != null)
methodEx.IsError = 1;
}
private MethodEx FindMethodExByIndex(MethodEx method, string indexName)
{
if (method.strIndex == indexName)
return method;
else
{
if (method.Children.Count > 0)
{
foreach (var m in method.Children)
{
MethodEx find = FindMethodExByIndex(m, indexName);
if (find != null)
return find;
}
}
else
return null;
}
return null;
}
#region 运行按钮事件
public static bool IsRunning = false;
public static bool hadRun = false;//是否运行过,如果运行过就不重新初始化
public async void btnPlay_Click(object sender, RoutedEventArgs e)
{
if (IsRunning)
{
#region Del
//bool isContinue = dicManualResetEvent[batchId].WaitOne(300);
//if (!isContinue)
//{
// // 解除暂停
// ReleasePause();
//}
#endregion
return;
}
PlsToolTipWin plsToolTipWin = null;
SolidColorBrush mybtn1_Brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(70, 0, 0, 0));
#region 开关门检查
if (!EnableSimulator && mainWindow.IsOpenDoor &&
"true" == ConfigurationManager.AppSettings.Get("isCheckOpenDoor"))
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
// 状态4 运行 绿色;
CommonBll.StatusLamp(4, EnableSimulator);
// 状态6 报错/急停 红闪/蜂鸣5S;
CommonBll.StatusLamp(6, EnableSimulator);
plsToolTipWin = new PlsToolTipWin("请关闭设备推拉门后再启动实验!");
plsToolTipWin.Height = this.ActualHeight;
plsToolTipWin.Width = this.ActualWidth;
plsToolTipWin.Background = (System.Windows.Media.Brush)mybtn1_Brush;
plsToolTipWin.btnCancel.Visibility = Visibility.Hidden;
plsToolTipWin.ShowDialog();
}));
return;
}
#endregion
//plsToolTipWin = new PlsToolTipWin("运行最后一次加载的方法?");
//plsToolTipWin.Height = ActualHeight;
//plsToolTipWin.Width = ActualWidth;
//plsToolTipWin.btnClearData.Visibility = Visibility.Visible;
//plsToolTipWin.lauchView = this;
//plsToolTipWin.Background = (System.Windows.Media.Brush)mybtn1_Brush;
//plsToolTipWin.ShowDialog();
this.xmlDocument = mainWindow.RefreshRunXml();
RunAgoTips RunAgoTips = new RunAgoTips(this);
RunAgoTips.ShowDialog();
if (RunAgoTips.DialogResult == true)
{
BtnIsEnabled(1);
tbxRunTip.Text = string.Empty;
gloadVariable.Clear();
VariableDictionary.Clear();
// 状态灯:状态4 运行 绿色;
HxResult ret = CommonBll.StatusLamp(4, EnableSimulator);
batchId = Guid.NewGuid().ToString();
dicManualResetEvent.Add(batchId, new ManualResetEvent(true));
if (hadRun)
{
hadRun = false;
if (tbxRunTitle.Text.Equals("模拟运行"))
{
EnableSimulator = true;
}
mainWindow.RefreshRunResult();
_cancelSource = new CancellationTokenSource();
isLoop1Start = false;
}
#region 调用运行方法
try
{
IsRunning = true;
hadRun = true;
TaskFactory taskFactory = new TaskFactory();
int iresult = await LoadLabwareOnRunning();
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
finally
{
IsRunning = false;
Shared.Exp = null;
Shared.ExpChoiceBactera = null;
selectedMethodEx = null;
}
#endregion
BtnIsEnabled(5);
}
}
#endregion
#region 暂停按钮事件
int pauseState = 0; //1:暂停状态;0:正常状态
public void btnPause_Click(object sender, RoutedEventArgs e)
{
// 操作流程
OperateExpFolw(false);
}
///
/// 操作流程
///
///
public void OperateExpFolw(bool isAutoFlg = false)
{
if (!IsRunning)
{
LoggerHelper.InfoLog(string.Format("[OperateExpFolw]: IsRunning = false, 无可用流程操作 return."));
return;
}
bool isPause = false;
if (!isAutoFlg)
{
// pauseState = 0:正常状态 => 暂停
isPause = pauseState == 0 ? true : false;
}
else
{
isPause = mainWindow.IsOpenDoor ? true : false;
}
Application.Current.Dispatcher.Invoke(new Action(() =>
{
// 想要暂停 && 0:正常状态
if (isPause && pauseState == 0)
{
pauseState = 1; // 保持暂停
dicManualResetEvent[batchId].Reset();
btnPause.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/pausedisable.png"));
// 状态5 暂停 黄色
CommonBll.StatusLamp(5, EnableSimulator);
// 1=暂停
MethodAction.Instance.Interrupt(1, true);
BtnIsEnabled(3);
tbxRunTip.Text = Properties.Resources.strExpPaused;
}
// 想要继续 && 1:暂停状态
else if (!isPause && pauseState == 1)
{
pauseState = 0; // 解除暂停
dicManualResetEvent[batchId].Set();
btnPause.IsEnabled = true;
btnPause.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/pause.png"));
// 状态4 运行 绿色
CommonBll.StatusLamp(4, EnableSimulator);
// 2=继续
MethodAction.Instance.Interrupt(2);
BtnIsEnabled(2);
tbxRunTip.Text = string.Empty;
}
else
{
LoggerHelper.InfoLog(string.Format("[OperateExpFolw]: isPause = {0}, pauseState = {1}, return.", isPause, pauseState));
}
}));
}
#endregion
#region 停止按钮事件
private async void btnStop_Click(object sender, RoutedEventArgs e)
{
try
{
PlsToolTipWin plsToolTipWin = new PlsToolTipWin("确定要停止运行吗?");
plsToolTipWin.ShowDialog();
if (plsToolTipWin.DialogResult != true)
{
return;
}
// 先点暂停、再点停止
_cancelSource.Cancel();
// 状态7 运行结束 蓝闪/蜂鸣5S
HxResult ret = CommonBll.StatusLamp(7, EnableSimulator);
// 3=停止
ret = await Task.Factory.StartNew(() => MethodAction.Instance.Interrupt(3, true));
if (ret.Result != ResultType.Success)
{
}
else
{
IsRunning = false;
isLoop1Start = false;
btnPause.IsEnabled = true;
btnPause.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/pause.png"));
}
BtnIsEnabled(4);
tbxRunTip.Text = string.Empty;
pauseState = 0;
//if (_cancelSource.IsCancellationRequested)
//{
// _cancelSource = new CancellationTokenSource();
//}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
}
#endregion
#region 返回实验设计
private void btnGoBack_Click(object sender, RoutedEventArgs e)
{
if (mainWindow != null)
{
mainWindow.btnStartFirstPage_Click(sender, e);
mainWindow.btnTestDesign.IsChecked = true;
mainWindow.ShowTestDesign();
mainWindow.btnOpen.IsEnabled = true;
}
}
#endregion
#region 获取运行时台面对应格子的Canvas
///
/// 获取台面对应格子的Canvas
///
///
///
///
private Canvas GetGridTableCanvas(int row, int col)
{
foreach (var canvasItem in gridTable.Children)
{
Canvas canvas = canvasItem as Canvas;
int curColumnIndex = Grid.GetColumn(canvas);
int curRowIndex = Grid.GetRow(canvas);
if (row == curRowIndex && col == curColumnIndex)
{
return canvas;
}
}
return null;
}
#endregion
#region 根据台面板位编号获取台面板位对象
private Canvas GetGridTableCanvasByNum(string latticeNum)
{
foreach (var canvasItem in gridTable.Children)
{
Canvas canvas = canvasItem as Canvas;
if(canvas.Name.Equals(latticeNum))
{
return canvas;
}
}
return null;
}
#endregion
#region 获取实验设计台面对应格子的Canvas
///
/// 获取实验设计台面对应格子的Canvas
///
///
///
///
private Canvas GetGridTableCanvasOnDesign(int row, int col)
{
if (mainWindow != null)
{
foreach (var canvasItem in mainWindow.testDesign.gridTable.Children)
{
Canvas canvas = canvasItem as Canvas;
int curColumnIndex = Grid.GetColumn(canvas);
int curRowIndex = Grid.GetRow(canvas);
if (row == curRowIndex && col == curColumnIndex)
{
return canvas;
}
}
}
return null;
}
#endregion
///
/// 设置启停信号量
///
public void SetWaitOne()
{
try
{
if (batchId == string.Empty || dicManualResetEvent.Count == 0)
{
return;
}
if (dicManualResetEvent[batchId] == null)
{
return;
}
dicManualResetEvent[batchId].WaitOne();
}
catch (Exception ex)
{
return;
}
}
///
/// 按钮是否启用
///
/// 1 开始运行、2 暂停、3 继续、4 停止、 5流程结束
private void BtnIsEnabled(int flag)
{
switch (flag)
{
case 1:
btnPlay.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/playdisable.png"));
btnStop.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/stop.png"));
btnPause.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/pause.png"));
btnPlay.IsEnabled = false;
btnStop.IsEnabled = true;
btnPause.IsEnabled = true;
break;
case 2:
btnPlay.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/playdisable.png"));
btnPause.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/pause.png"));
btnStop.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/stop.png"));
btnPlay.IsEnabled = false;
btnPause.IsEnabled = true;
btnStop.IsEnabled = true;
break;
case 3:
btnPlay.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/playdisable.png"));
btnPause.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/pause.png"));
btnStop.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/stop.png"));
btnPlay.IsEnabled = false;
btnPause.IsEnabled = true;
btnStop.IsEnabled = true;
break;
case 4:
btnPlay.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/play.png"));
btnStop.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/stopdisable.png"));
btnPause.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/pausedisable.png"));
btnPlay.IsEnabled = true;
btnStop.IsEnabled = false;
btnPause.IsEnabled = false;
break;
case 5:
btnPlay.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/play.png"));
btnStop.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/stopdisable.png"));
btnPause.NormalImage = new BitmapImage(new Uri("pack://application:,,,./Assets/Run/pausedisable.png"));
btnPlay.IsEnabled = true;
btnStop.IsEnabled = false;
btnPause.IsEnabled = false;
break;
}
}
#region 添加运行实验
public ExperimentModel AddExp(string xmlContent)
{
ExperimentModel experiment = new ExperimentModel();
try
{
experiment.ExperimentId = DateTime.Now.ToString("yyyyMMddHHmmss");
string methodFileName = mainWindow.CurWorkFlowName;
experiment.ExperimentName = string.Empty;
if (methodFileName.Length > 0)
{
experiment.ExperimentName = methodFileName.Substring(methodFileName.LastIndexOf('\\') + 1, methodFileName.Length - methodFileName.LastIndexOf('\\') - 1);
}
experiment.ExperimentXmlContent = xmlContent;
experiment.ExperimentFile = methodFileName.Replace("\\", "\\\\");
experiment.LunchTime = DateTime.Now;
experiment.Status = EnumManagement.GetEnumValue(ExpStatusEnum.Running);
experiment.OperaterName = Shared.User.username;
ExperimentDB.Add(experiment);
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("添加运行记录时错误:" + ex.ToString());
}
return experiment;
}
#endregion
#region 台面加载完成后,数据的处理
private void gridTable_Loaded(object sender, RoutedEventArgs e)
{
double xVal = gridTable.ActualWidth;
double yVal = gridTable.ActualHeight;
}
#endregion
#region 运行界面时,右键子方法的节点弹出菜单
private void runTreeviewWorkflow_PreviewMouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
DependencyObject source = e.OriginalSource as DependencyObject;
while (source != null && source.GetType() != typeof(TreeViewItem))
source = VisualTreeHelper.GetParent(source);
if (source != null)
{
TreeViewItem item = source as TreeViewItem;
item.IsSelected = true;
MethodEx mEx = item.DataContext as MethodEx;
ContextMenu menu = FindResource("workflowMenu") as ContextMenu;
MenuItem menuItem = menu.Items[0] as MenuItem;
int iNum = methodListBll.getNumByMethodName(mEx.method_name);
menuItem.IsEnabled = (iNum==(int)MethodNameEnum.subMethod) ? true : false;
}
}
#endregion
private void workflowMenuRunStatus_Click(object sender, RoutedEventArgs e)
{
// 打开子方法流程状态页面
ViewCom.OpenSubMethodWorkflow(runTreeviewWorkflow);
}
}
}