using DataEntity.Share;
using DataRWDAL;
using HxEnum;
using HxSocket;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Xml;
using XCommon;
using XCommon.Log;
using XCore;
using XHandler.Class.DataEx;
using XHandler.Controls.Run.Com;
using XHandler.View;
using XImagingXhandler.XDAL;
namespace XHandler.Controls
{
///
/// 梯度稀释逻辑控制类
///
public class DilutionControl
{
#region 变量
// 系统语言
private string m_currentCulture = string.Empty;
// 涂布用变量
private MethodDilution DilutionData = null;
#region BLL
private DilutionBll dilutionBll = new DilutionBll();
private LiquidAccuracyBll liquidAccuracyBll = new LiquidAccuracyBll();
private AspirateBll aspirateBll = new AspirateBll();
private DispenseBll dispenseBll = new DispenseBll();
//private BacteriaBll bacteriaBll = new BacteriaBll();
#endregion
// 运行界面
public static RunWnd LaunchView = null;
public HxSocketClient socketTcpClientToRemote = null;
#endregion
///
/// 构造函数
///
public DilutionControl()
{
m_currentCulture = Shared.SoftwareInformation.currentculture;
}
#region 执行涂布转板
///
/// 执行涂布转板
///
///
///
///
///
public bool ExecuteDilution(XmlNode xmlEnv, XmlNode methodNode, bool isSimulator)
{
bool bResult = false;
var platformNodeList = xmlEnv.SelectNodes("platform");
string strMethodName = methodNode.SelectSingleNode("name").InnerText;
#region 任务被取消
if (LaunchView._cancelSource.IsCancellationRequested)
{
return bResult;
}
#endregion
#region RunLog start
if (m_currentCulture.Equals("zh-CN"))
{
LaunchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + strMethodName + "】" + Properties.MachineRunResource.strStart.ToString());
}
else
{
LaunchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + strMethodName + "】start:");
}
#endregion
try
{
#region 数据准备
DilutionData = dilutionBll.GenerateMethodDilutionDataByXmlNode(methodNode);
#region 加稀释液
#region 吸液
// 获取吸液的耗材:试剂槽
Labware aspirateLabwareAddDiluent = LabwareDB.GetLabware(DilutionData.labwareValueAddDiluent);
// 获取吸液板位
XmlNode xmlAspirateAddDiluent = xmlEnv.SelectSingleNode("platform[labware_sname='" + DilutionData.positionTextAddDiluent + "']");
string aspirateLatticeNoAddDiluent = xmlAspirateAddDiluent.SelectSingleNode("lattice_id").InnerText;
int aspirateLatticeIdAddDiluent = ControlCom.GetLatticeId(Convert.ToInt32(aspirateLatticeNoAddDiluent));
Lattice aspirateLatticeAddDiluent = LatticeDB.GetLatticeDataByIdFromdb(aspirateLatticeIdAddDiluent.ToString());
// 吸液选中区域排序
List aspirateWellsAddDiluent = SortWells(aspirateLabwareAddDiluent, aspirateLatticeAddDiluent, DilutionData.wellarrayAddDiluent);
// 每个孔加稀释液的体积: 500 * (2-1) =500
float dilutionVolAddDiluent = DilutionData.volume * (DilutionData.dilutionFactor - 1);
// 吸液板条码
string aspirateLabwareBarcodeAddDiluent = xmlAspirateAddDiluent.SelectSingleNode("labware_barcode").InnerText;
#endregion
#region 放液
// 获取放液的耗材:96深孔板
Labware dispenseLabwareAddDiluent = LabwareDB.GetLabware(DilutionData.labwareValueGradientDilution);
// 获取放液板位
XmlNode xmlDispenseAddDiluent = xmlEnv.SelectSingleNode("platform[labware_sname='" + DilutionData.positionTextGradientDilution + "']");
string dispenseLatticeNoAddDiluent = xmlDispenseAddDiluent.SelectSingleNode("lattice_id").InnerText;
int dispenseLatticeIdAddDiluent = ControlCom.GetLatticeId(Convert.ToInt32(dispenseLatticeNoAddDiluent));
Lattice dispenseLatticeAddDiluent = LatticeDB.GetLatticeDataByIdFromdb(dispenseLatticeIdAddDiluent.ToString());
// 放液板条码
string dispenseLabwareBarcodeAddDiluent = xmlDispenseAddDiluent.SelectSingleNode("labware_barcode").InnerText;
// 放液选中区域所有孔位信息(已排序)
List dispenseWellsAddDiluent = SortWells(dispenseLabwareAddDiluent, dispenseLatticeAddDiluent, DilutionData.wellarrayGradientDilution);
// 放液首列数据
List dispenseFirstWellsAddDiluent = GetFirstOrLastData(dispenseWellsAddDiluent, 0, DilutionData.dilutionDirectionValue);
List dispenseNoFirstWellsAddDiluent = GetFirstOrLastData(dispenseWellsAddDiluent, 1, DilutionData.dilutionDirectionValue);
// 最终需要加稀释液的集合
List dispenseWellsFinalAddDiluent = DilutionData.isTargetSelectRangeFirstAddDiluent ? dispenseWellsAddDiluent : dispenseNoFirstWellsAddDiluent;
#endregion
#region 枪头
LoadTipsControl.launchView = DilutionControl.LaunchView;
List tipWells = LoadTipsControl.GetLeftTipsByLoadTips(platformNodeList, methodNode);
// 加稀释液时是否更换枪头
bool isChangeTipAddDiluent = Convert.ToInt32(DilutionData.changeTipsValueAddDiluent) ==
EnumManagement.GetEnumValue(ChangeTipEnum.Change) ? true : false;
#endregion
#endregion
#region 梯度稀释
#region 吸放液
// 获取吸放液的耗材:96深孔板
Labware labwareGradientDilution = LabwareDB.GetLabware(DilutionData.labwareValueGradientDilution);
// 获取吸放液板位
XmlNode xmlGradientDilution = xmlEnv.SelectSingleNode("platform[labware_sname='" + DilutionData.positionTextGradientDilution + "']");
string latticeNoGradientDilution = xmlGradientDilution.SelectSingleNode("lattice_id").InnerText;
int latticeIdGradientDilution = ControlCom.GetLatticeId(Convert.ToInt32(latticeNoGradientDilution));
Lattice latticeGradientDilution = LatticeDB.GetLatticeDataByIdFromdb(latticeIdGradientDilution.ToString());
// 梯度稀释选中区域排序
List wellsGradientDilution = SortWells(labwareGradientDilution, latticeGradientDilution, DilutionData.wellarrayGradientDilution);
// 每个孔移液的体积: 500
float volGradientDilution = DilutionData.volume;
// 吸放液板条码
string labwareBarcodeGradientDilution = xmlGradientDilution.SelectSingleNode("labware_barcode").InnerText;
// 首列/行数据
List firstWellsGradientDilution = GetFirstOrLastData(wellsGradientDilution, 0, DilutionData.dilutionDirectionValue);
List noFirstWellsGradientDilution = GetFirstOrLastData(wellsGradientDilution, 1, DilutionData.dilutionDirectionValue);
#endregion
#region 枪头
//LoadTipsControl.launchView = DilutionControl.LaunchView;
//List tipWellsGradientDilution = LoadTipsControl.GetLeftTipsByLoadTips(platformNodeList, methodNode);
// 梯度稀释时是否更换枪头
bool isChangeTipGradientDilution = Convert.ToInt32(DilutionData.changeTipsValueGradientDilution) ==
EnumManagement.GetEnumValue(ChangeTipEnum.Change) ? true : false;
#endregion
#endregion
#endregion
#region 根据所选区域 加稀释液
// 计算加稀释液的执行seq
List multiChannelList = GetNeedChanelInfo(DilutionData.channels, tipWells, isChangeTipAddDiluent,
aspirateLabwareAddDiluent, aspirateLatticeAddDiluent, aspirateWellsAddDiluent,
dispenseLabwareAddDiluent, dispenseLatticeAddDiluent, dispenseWellsFinalAddDiluent, DilutionData.dilutionDirectionValue);
for (int nBatchIndex = 0; nBatchIndex < multiChannelList.Count; nBatchIndex++)
{
MultiChannel multiChannel = multiChannelList[nBatchIndex];
#region 安装枪头
if (nBatchIndex == 0 || isChangeTipAddDiluent)
{
// 自动计算位置安装Tip
bool bLoadTipResult = ControlCom.LoadTipAutomation(xmlEnv.SelectNodes("platform"), methodNode,
isSimulator, LaunchView, socketTcpClientToRemote, 0);
if (!bLoadTipResult)
{
return false;
}
}
#endregion
#region 吸液
// 获取加稀释液的吸液参数
AspirateMultiParams aspirateAddDiluentParams = GetAspirateParamsAddDiluent(DilutionData);
bResult = ControlCom.DoAspirateForMulti(LaunchView, m_currentCulture, aspirateAddDiluentParams, multiChannel,
aspirateLabwareAddDiluent, dilutionVolAddDiluent, strMethodName, dispenseLabwareBarcodeAddDiluent, isSimulator);
if (!bResult)
{
return bResult;
}
#endregion
#region 放液
// 获取吸液参数
DispenseMultiParams dispenseAddDiluentParams = GetDispenseParamsAddDiluent(DilutionData);
bResult = ControlCom.DoDispenseForMulti(LaunchView, m_currentCulture, dispenseAddDiluentParams, multiChannel,
dispenseLabwareAddDiluent, dilutionVolAddDiluent, strMethodName, dispenseLabwareBarcodeAddDiluent, isSimulator);
if (!bResult)
{
return bResult;
}
#endregion
#region 卸载Tip,丢在垃圾桶
if ((nBatchIndex == multiChannelList.Count - 1) || isChangeTipAddDiluent)
{
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
unloadTipsControl.launchView = LaunchView;
unloadTipsControl.socketTcpClientToRemote = socketTcpClientToRemote;
bool bUnloadResult = unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, methodNode, isSimulator);
if (!bUnloadResult)
{
bResult = false;
return bResult;
}
LaunchView.currentIsLoadingTips = false;
}
#endregion
}
#endregion
#region 进行梯度稀释
// 放液首列数据
//dispenseFirstWellsAddDiluent
// 计算梯度稀释的执行seq
List multiChannelGradientDilutionList = GetGradientDilutionSeqInfo(DilutionData.channels, tipWells, isChangeTipGradientDilution,
wellsGradientDilution, DilutionData.dilutionDirectionValue, DilutionData.isDiscardLastVolume);
bool isDiscardLastTip = false;
for (int nBatchIndex = 0; nBatchIndex < multiChannelGradientDilutionList.Count; nBatchIndex++)
{
MultiChannel multiChannel = multiChannelGradientDilutionList[nBatchIndex];
#region 修改通道数量
List channelList = new List();
for (int channelNo = 1; channelNo <= multiChannel.SrcPlateWells.Count; channelNo++)
{
channelList.Add(channelNo);
}
string strChn = string.Join(",", channelList);
methodNode.SelectSingleNode("channels").InnerText = strChn;
DilutionData.channels = ComUtility.GetChannelsFromXml(strChn);
#endregion
#region 安装枪头
if (nBatchIndex == 0 || isChangeTipGradientDilution || isDiscardLastTip)
{
isDiscardLastTip = false;
// 自动计算位置安装Tip
bool bLoadTipResult = ControlCom.LoadTipAutomation(xmlEnv.SelectNodes("platform"), methodNode,
isSimulator, LaunchView, socketTcpClientToRemote, 0);
if (!bLoadTipResult)
{
return false;
}
}
#endregion
#region 吸液
// 获取加稀释液的吸液参数
AspirateMultiParams aspirateAddDiluentParams = GetAspirateParamsGradientDilution(DilutionData);
bResult = ControlCom.DoAspirateForMulti(LaunchView, m_currentCulture, aspirateAddDiluentParams, multiChannel,
labwareGradientDilution, dilutionVolAddDiluent, strMethodName, labwareBarcodeGradientDilution, isSimulator);
if (!bResult)
{
return bResult;
}
#endregion
#region 放液
if (multiChannel.DesPlateWells != null)
{
// 获取吸液参数
DispenseMultiParams dispenseAddDiluentParams = GetDispenseParamsGradientDilution(DilutionData, labwareGradientDilution);
bResult = ControlCom.DoDispenseForMulti(LaunchView, m_currentCulture, dispenseAddDiluentParams, multiChannel,
labwareGradientDilution, dilutionVolAddDiluent, strMethodName, labwareBarcodeGradientDilution, isSimulator);
if (!bResult)
{
return bResult;
}
}
else
{
isDiscardLastTip = true;
}
#endregion
#region 卸载Tip,丢在垃圾桶
if ((nBatchIndex == multiChannelGradientDilutionList.Count - 1) || isChangeTipGradientDilution || isDiscardLastTip)
{
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
unloadTipsControl.launchView = LaunchView;
unloadTipsControl.socketTcpClientToRemote = socketTcpClientToRemote;
bool bUnloadResult = unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, methodNode, isSimulator);
if (!bUnloadResult)
{
bResult = false;
return bResult;
}
LaunchView.currentIsLoadingTips = false;
}
#endregion
}
#endregion
bResult = true;
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
#region Exception
LaunchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + strMethodName + "】error:source:" + ex.Source + ";error:" + ex.Message + ";");
bResult = false;
#endregion
}
return bResult;
}
#endregion
#region 获取吸液参数
///
/// 获取加稀释液 吸液参数
///
///
///
private AspirateMultiParams GetAspirateParamsAddDiluent(MethodDilution dilutionData)
{
AspirateMultiParams aspirateParams = new AspirateMultiParams();
aspirateParams.liquidTypeText = dilutionData.liquidTypeTextAddDiluent;
aspirateParams.liquidTypeValue = dilutionData.liquidTypeValueAddDiluent;
aspirateParams.liquidRangeText = dilutionData.liquidRangeTextAddDiluent;
aspirateParams.liquidRangeValue = dilutionData.liquidRangeValueAddDiluent;
aspirateParams.liquidText = dilutionData.liquidTextAddDiluent;
aspirateParams.liquidValue = dilutionData.liquidValueAddDiluent;
aspirateParams.armValue = dilutionData.armValue;
aspirateParams.channels = dilutionData.channels;
aspirateParams.isMix = false;
return aspirateParams;
}
///
/// 获取梯度稀释 吸液参数
///
///
///
private AspirateMultiParams GetAspirateParamsGradientDilution(MethodDilution dilutionData)
{
AspirateMultiParams aspirateParams = new AspirateMultiParams();
aspirateParams.liquidTypeText = dilutionData.liquidTypeTextGradientDilution;
aspirateParams.liquidTypeValue = dilutionData.liquidTypeValueGradientDilution;
aspirateParams.liquidRangeText = dilutionData.liquidRangeTextGradientDilution;
aspirateParams.liquidRangeValue = dilutionData.liquidRangeValueGradientDilution;
aspirateParams.liquidText = dilutionData.liquidTextGradientDilution;
aspirateParams.liquidValue = dilutionData.liquidValueGradientDilution;
aspirateParams.armValue = dilutionData.armValue;
aspirateParams.channels = dilutionData.channels;
aspirateParams.isMix = false;
return aspirateParams;
}
#endregion
#region 获取加稀释 放液参数
///
/// 获取加稀释液吸液参数
///
///
///
private DispenseMultiParams GetDispenseParamsAddDiluent(MethodDilution dilutionData)
{
DispenseMultiParams dispenseParams = new DispenseMultiParams();
dispenseParams.liquidTypeText = dilutionData.liquidTypeTextAddDiluent;
dispenseParams.liquidTypeValue = dilutionData.liquidTypeValueAddDiluent;
dispenseParams.liquidRangeText = dilutionData.liquidRangeTextAddDiluent;
dispenseParams.liquidRangeValue = dilutionData.liquidRangeValueAddDiluent;
dispenseParams.liquidText = dilutionData.liquidTextAddDiluent;
dispenseParams.liquidValue = dilutionData.liquidValueAddDiluent;
dispenseParams.armValue = dilutionData.armValue;
dispenseParams.channels = dilutionData.channels; // 移液枪通道: 已sort
dispenseParams.isMix = false;
return dispenseParams;
}
#endregion
#region 获取梯度稀释 放液参数
///
/// 获取梯度稀释 放液参数
///
///
///
///
private DispenseMultiParams GetDispenseParamsGradientDilution(MethodDilution dilutionData, Labware labware)
{
DispenseMultiParams dispenseParams = new DispenseMultiParams();
dispenseParams.liquidTypeText = dilutionData.liquidTypeTextGradientDilution;
dispenseParams.liquidTypeValue = dilutionData.liquidTypeValueGradientDilution;
dispenseParams.liquidRangeText = dilutionData.liquidRangeTextGradientDilution;
dispenseParams.liquidRangeValue = dilutionData.liquidRangeValueGradientDilution;
dispenseParams.liquidText = dilutionData.liquidTextGradientDilution;
dispenseParams.liquidValue = dilutionData.liquidValueGradientDilution;
dispenseParams.armValue = dilutionData.armValue;
dispenseParams.channels = dilutionData.channels; // 移液枪通道: 已sort
dispenseParams.isMix = dilutionData.bMix;
dispenseParams.mixvolume = (float)Convert.ToDouble(dilutionData.mixvolume);
dispenseParams.mixCount = dilutionData.mixcount;
dispenseParams.mixAspiratePositionValue = Convert.ToInt32(dilutionData.mixAspiratePositionValue);
dispenseParams.mixAspiratePositionText = dilutionData.mixAspiratePositionText;
dispenseParams.mixAspirateDistance = (float)Convert.ToDouble(dilutionData.mixAspirateDistance);
dispenseParams.mixAspirateSpeed = (float)Convert.ToDouble(dilutionData.mixAspirateSpeed);
dispenseParams.mixDispensePositionValue = Convert.ToInt32(dilutionData.mixDispensePositionValue);
dispenseParams.mixDispensePositionText = dilutionData.mixDispensePositionText;
dispenseParams.mixDispenseDistance = (float)Convert.ToDouble(dilutionData.mixDispenseDistance);
dispenseParams.mixDispenseSpeed = (float)Convert.ToDouble(dilutionData.mixDispenseSpeed);
return dispenseParams;
}
#endregion
#region 选中区域排序
///
/// 选中区域排序
///
///
///
///
///
private List SortWells(Labware srcLabware, Lattice srcLattice, string wells)
{
List sortWells = new List();
if (!string.IsNullOrEmpty(wells))
{
List dtsTips = ControlCom.GenerateWellCoordinate(srcLabware, srcLattice);
List srcWellList = wells.Split(',').ToList();
foreach (var item in dtsTips)
{
if (srcWellList.Contains(item.wellname))
{
sortWells.Add(item);
}
}
}
return sortWells;
}
#endregion
#region 计算加稀释液的执行seq
///
/// 计算加稀释液的执行seq
///
/// 通道数
/// 来源板
/// 是否考虑枪头
/// 来源板
///
///
/// 目标板
///
///
///
private List GetNeedChanelInfo(int[] channels, List tipWells, bool isCareTips,
Labware srcLabware, Lattice srcLattice, List srcWells,
Labware desLabware, Lattice desLattice, List desWells, DilutionDirectionEnum dilutionDirectionValue)
{
List multiChannelList = new List();
//int chnCount = channels.Length;
//int srcCount = srcWells.Count;
//int desCount = desWells.Count;
// 根据列有效数量计算列的批次信息
List> tipWellBatchList = ComUtility.GetWellBatchInfo(tipWells, channels, dilutionDirectionValue);
List> srcWellsWellBatchList = ComUtility.GetWellBatchInfo(srcWells, channels, dilutionDirectionValue);
List> desWellBatchList = ComUtility.GetWellBatchInfo(desWells, channels, DilutionDirectionEnum.LeftToRight);
// 此处算法不通用 需要优化
for (int i = 0; i < desWellBatchList.Count; i++)
{
MultiChannel multiChannel = new MultiChannel();
//multiChannel.Tips = isCareTips ? tipWellBatchList[i] : tipWellBatchList[0];
// 试剂槽
if (Convert.ToInt32(srcLabware.labware_type_id) == EnumManagement.GetEnumValue(ConsumableTypeEnum.Through))
{
List finalSrcWells = new List(srcWellsWellBatchList[0]);
int nAddCnt = desWellBatchList[i].Count - srcWellsWellBatchList[0].Count;
for (int nAddIndex = 0; nAddIndex < nAddCnt; nAddIndex++)
{
finalSrcWells.Add(srcWellsWellBatchList[0][0]);
}
multiChannel.SrcPlateWells = finalSrcWells;
}
else
{
multiChannel.SrcPlateWells = srcWellsWellBatchList[i];
}
multiChannel.DesPlateWells = desWellBatchList[i];
multiChannelList.Add(multiChannel);
}
return multiChannelList;
}
#endregion
#region 计算梯度稀释的执行seq
///
/// 计算梯度稀释的执行seq
///
///
///
///
///
///
/// 舍弃选中范围最后一行或最后一列多余的体积
///
private List GetGradientDilutionSeqInfo(int[] channels, List tipWells, bool isCareTips,
List wellsGradientDilution, DilutionDirectionEnum dilutionDirectionValue, bool isDiscardLastVolume)
{
List multiChannelList = new List();
// 根据列有效数量计算列的批次信息
List> tipWellBatchList = ComUtility.GetWellBatchInfo(tipWells, channels, dilutionDirectionValue);
#region 吸液范围
// 默认为尾列以外的数据
List srcWells = GetFirstOrLastData(wellsGradientDilution, 3, DilutionData.dilutionDirectionValue);
// 舍弃选中范围最后一行或最后一列多余的体积
if (isDiscardLastVolume)
{
srcWells = wellsGradientDilution;
}
#endregion
#region 放液范围
List lastWellsGradientDilution = GetFirstOrLastData(wellsGradientDilution, 2, DilutionData.dilutionDirectionValue);
// 默认为首行/列数据以外的数据
List desWells = GetFirstOrLastData(wellsGradientDilution, 1, DilutionData.dilutionDirectionValue);
#endregion
List> srcWellBatchList = ComUtility.GetWellBatchInfo(srcWells, channels, dilutionDirectionValue);
List> desWellBatchList = ComUtility.GetWellBatchInfo(desWells, channels, dilutionDirectionValue);
for (int i = 0; i < srcWellBatchList.Count; i++)
{
MultiChannel multiChannel = new MultiChannel();
//multiChannel.Tips = isCareTips ? tipWellBatchList[i] : tipWellBatchList[0];
multiChannel.SrcPlateWells = srcWellBatchList[i];
// 舍弃选中范围最后一行或最后一列多余的体积
if (isDiscardLastVolume)
{
if (srcWellBatchList[i].Exists(it => lastWellsGradientDilution.Exists(kk=>kk.wellname.Equals(it.wellname))))
{
desWellBatchList.Insert(i, null);
}
}
multiChannel.DesPlateWells = desWellBatchList[i];
//multiChannel.DesPlateWells = null;
//if (i < desWellBatchList.Count())
//{
//}
multiChannelList.Add(multiChannel);
}
return multiChannelList;
}
#endregion
#region 获取首行或首列数据
///
/// 获取首行/列数据
///
///
/// 0: 首行/列数据; 1: 首行/列数据以外的数据; 2: 尾行/列数据; 3: 尾行/列数据以外的数据
/// 方向
///
private List GetFirstOrLastData(List srcData, int type,
DilutionDirectionEnum direction)
{
List rtnData = new List();
if (srcData.Count > 0)
{
IEnumerable selTipWells = null;
// 从左到右
if (direction == DilutionDirectionEnum.LeftToRight)
{
int strFirstColNum = ComUtility.GetColNum(srcData[0].wellname);
int strLastColNum = ComUtility.GetColNum(srcData.LastOrDefault().wellname);
selTipWells = srcData.Where(it => ((type == 0 && ComUtility.GetColNum(it.wellname) == strFirstColNum)) ||
(type ==1 && ComUtility.GetColNum(it.wellname) != strFirstColNum) ||
(type == 2 && ComUtility.GetColNum(it.wellname) == strLastColNum) ||
(type == 3 && ComUtility.GetColNum(it.wellname) != strLastColNum));
}
// 从上到下
else if (direction == DilutionDirectionEnum.UpToDown)
{
string strFirstRowChar = ComUtility.GetRowChar(srcData[0].wellname);
string strLastRowChar = ComUtility.GetRowChar(srcData.LastOrDefault().wellname);
selTipWells = srcData.Where(it => ((type == 0 && ComUtility.GetRowChar(it.wellname).Equals(strFirstRowChar))) ||
(type == 1 && !ComUtility.GetRowChar(it.wellname).Equals(strFirstRowChar)) ||
(type == 2 && ComUtility.GetRowChar(it.wellname).Equals(strLastRowChar)) ||
(type == 3 && !ComUtility.GetRowChar(it.wellname).Equals(strLastRowChar)));
}
// 从下到上
else if (direction == DilutionDirectionEnum.DownToUp)
{
string strFirstRowChar = ComUtility.GetRowChar(srcData.LastOrDefault().wellname);
string strLastRowChar = ComUtility.GetRowChar(srcData[0].wellname);
selTipWells = srcData.Where(it => ((type == 0 && ComUtility.GetRowChar(it.wellname).Equals(strFirstRowChar))) ||
(type == 1 && !ComUtility.GetRowChar(it.wellname).Equals(strFirstRowChar)) ||
(type == 2 && ComUtility.GetRowChar(it.wellname).Equals(strLastRowChar)) ||
(type == 3 && !ComUtility.GetRowChar(it.wellname).Equals(strLastRowChar)));
}
if (selTipWells.Any())
{
rtnData = selTipWells.ToList();
}
}
return rtnData;
}
#endregion
}
}