using DataEntity.Rack;
using DataRWDAL;
using DriverLib.Engine;
using HxEnum;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Xml;
using XCoreBLL.Resource;
using XImagingXhandler.XDAL;
namespace XCore
{
public class GripTransportBll
{
#region 获取抓板方向
///
/// 获取抓板方向
///
///
///
public List GenerateGripTransportModel(string softwareDevicNumber)
{
List gripTransportModels= new List();
GripTransportModel gripTransportModel = null;
gripTransportModel = new GripTransportModel();
gripTransportModel.model_id = EnumManagement.GetEnumValue(GripperModelEnum.Right).ToString();
gripTransportModel.model_name = "夹爪轴心在板位右侧";
gripTransportModels.Add(gripTransportModel);
gripTransportModel = new GripTransportModel();
gripTransportModel.model_id = EnumManagement.GetEnumValue(GripperModelEnum.Left).ToString();
gripTransportModel.model_name = "夹爪轴心在板位左侧";
gripTransportModels.Add(gripTransportModel);
gripTransportModel = new GripTransportModel();
gripTransportModel.model_id = EnumManagement.GetEnumValue(GripperModelEnum.Up).ToString(); ;
gripTransportModel.model_name = "夹爪轴心在板位上侧";
gripTransportModels.Add(gripTransportModel);
gripTransportModel = new GripTransportModel();
gripTransportModel.model_id = EnumManagement.GetEnumValue(GripperModelEnum.Down).ToString(); ;
gripTransportModel.model_name = "夹爪轴心在板位下侧";
gripTransportModels.Add(gripTransportModel);
return gripTransportModels;
}
#endregion
#region 构建抓板时的模式位置数据
public List GetGripTransportModelPoss()
{
List gripTransportModels = new List();
GripTransportModel gripTransportModel = new GripTransportModel();
gripTransportModel.model_id = "1";
gripTransportModel.model_name = "底部";
gripTransportModels.Add(gripTransportModel);
gripTransportModel = new GripTransportModel();
gripTransportModel.model_id = "2";
gripTransportModel.model_name = "顶部";
gripTransportModels.Add(gripTransportModel);
return gripTransportModels;
}
#endregion
string strCurrentCulture = "";
public GripTransportBll()
{
strCurrentCulture = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
}
///
/// 生成抓板转移方法的xml节点属性对象
///
/// 抓板转移方法的xml节点
/// 抓板转移方法的xml节点属性对象
public MethodGripTransport GenerateMethodGripTransport(XmlNode xmlNode)
{
MethodGripTransport methodGripTransport = new MethodGripTransport();
methodGripTransport.isrun = xmlNode.SelectSingleNode("isrun").InnerText;
methodGripTransport.status = xmlNode.SelectSingleNode("status").InnerText;
methodGripTransport.name = xmlNode.SelectSingleNode("name").InnerText;
methodGripTransport.strIndex = xmlNode.SelectSingleNode("strIndex").InnerText;
methodGripTransport.label = xmlNode.SelectSingleNode("label").InnerText;
methodGripTransport.armText = xmlNode.SelectSingleNode("arm/text").InnerText;
methodGripTransport.armValue = xmlNode.SelectSingleNode("arm/value").InnerText;
#region 来源点位
methodGripTransport.srcPositionText = xmlNode.SelectSingleNode("sourceLattice/text").InnerText;
methodGripTransport.srcPositionValue = xmlNode.SelectSingleNode("sourceLattice/value").InnerText;
methodGripTransport.srcPositionType = Convert.ToInt32(xmlNode.SelectSingleNode("sourceLattice/type").InnerText);
#endregion
#region 目标点位
methodGripTransport.desPositionText = xmlNode.SelectSingleNode("destinationLattice/text").InnerText;
methodGripTransport.desPositionValue = xmlNode.SelectSingleNode("destinationLattice/value").InnerText;
methodGripTransport.desPositionType = Convert.ToInt32(xmlNode.SelectSingleNode("destinationLattice/type").InnerText);
#endregion
methodGripTransport.gripModelText = xmlNode.SelectSingleNode("gripModel/text").InnerText;
methodGripTransport.gripModelValue = Convert.ToInt32(xmlNode.SelectSingleNode("gripModel/value").InnerText);
methodGripTransport.gripModelSetText = xmlNode.SelectSingleNode("gripModelSet/text").InnerText;
methodGripTransport.gripModelSetValue = Convert.ToInt32(xmlNode.SelectSingleNode("gripModelSet/value").InnerText);
methodGripTransport.gripPickLabwareText = xmlNode.SelectSingleNode("gripPickObject/text").InnerText;
methodGripTransport.gripPickLabwareValue = xmlNode.SelectSingleNode("gripPickObject/value").InnerText;
methodGripTransport.pickPosMode = xmlNode.SelectSingleNode("pickPosMode")!=null? Convert.ToInt32(xmlNode.SelectSingleNode("pickPosMode").InnerText):0;
methodGripTransport.pickPosValue = xmlNode.SelectSingleNode("pickPosValue") != null ? xmlNode.SelectSingleNode("pickPosValue").InnerText : "0";
methodGripTransport.gripPlaceLabwareText = xmlNode.SelectSingleNode("gripPlaceObject/text").InnerText;
methodGripTransport.gripPlaceLabwareValue = xmlNode.SelectSingleNode("gripPlaceObject/value").InnerText;
methodGripTransport.gripModelPosText = xmlNode.SelectSingleNode("gripModelPos/text").InnerText;
methodGripTransport.gripModelPosValue = Convert.ToInt32(xmlNode.SelectSingleNode("gripModelPos/value").InnerText);
methodGripTransport.placePosMode = xmlNode.SelectSingleNode("placePosMode") != null ? Convert.ToInt32(xmlNode.SelectSingleNode("placePosMode").InnerText) : 0;
methodGripTransport.placePosValue = xmlNode.SelectSingleNode("placePosValue") != null ? xmlNode.SelectSingleNode("placePosValue").InnerText : "0";
methodGripTransport.transportMode= Convert.ToInt32(xmlNode.SelectSingleNode("transportMode").InnerText);
methodGripTransport.transportCount = Convert.ToInt32(xmlNode.SelectSingleNode("transportCount").InnerText);
return methodGripTransport;
}
#region 检查所有属性设置是否满足要求
///
/// 检查所有属性设置是否满足要求
///
/// 抓板转移属性对象
/// 检查所有属性设置是否满足要求
public MethodPropertyInfo CheckProperty(MethodGripTransport methodGripTransport)
{
MethodPropertyInfo methodPropertyInfo = new MethodPropertyInfo();
if (strCurrentCulture == "zh-CN")
{
methodPropertyInfo.property_tips_info = GripTransportResourceCHS.tipsInfo.ToString();
if (methodGripTransport.armText == null || methodGripTransport.armText == "")
{
methodPropertyInfo.property_name_info = GripTransportResourceCHS.armText.ToString();
}
if (methodGripTransport.srcPositionText == null || methodGripTransport.srcPositionText == "")
{
methodPropertyInfo.property_name_info = GripTransportResourceCHS.sourceLatticeText.ToString();
}
if (methodGripTransport.desPositionText == null || methodGripTransport.desPositionText == "")
{
methodPropertyInfo.property_name_info = GripTransportResourceCHS.destinationLatticeText.ToString();
}
}
else if (strCurrentCulture == "en-US")
{
methodPropertyInfo.property_tips_info = GripTransportResourceENU.tipsInfo.ToString();
if (methodGripTransport.armText == null || methodGripTransport.armText == "")
{
methodPropertyInfo.property_name_info = GripTransportResourceENU.armText.ToString();
}
if (methodGripTransport.srcPositionText == null || methodGripTransport.srcPositionText == "")
{
methodPropertyInfo.property_name_info = GripTransportResourceENU.sourceLatticeText.ToString();
}
if (methodGripTransport.desPositionText == null || methodGripTransport.desPositionText == "")
{
methodPropertyInfo.property_name_info = GripTransportResourceENU.destinationLatticeText.ToString();
}
}
return methodPropertyInfo;
}
#endregion
#region 判断当前板位左右是否有障碍耗材
///
/// 判断当前板位左右是否有障碍耗材
///
/// 当前板位数据节点xml
/// 夹爪方法属性参数xml节点对象
/// 当前设备号
/// 夹爪指尖与夹爪横梁之间距离高度
/// 是否来源板位;1是;2目标板
/// 0:没有障碍,夹爪正常位抓取;1:较小编号台面有障碍;3:较大编号台面有障碍;2;前后两个都有障碍
public int IsExistObstacle(XmlNode latticesNode, XmlNode methodNode, string software_device_number, float fGripperBaseHeight, int isSourceLattice)
{
int iResult = 0;
string strSrcLatticeid = "";
if (isSourceLattice == 1)
{
strSrcLatticeid = methodNode.SelectSingleNode("sourceLattice/value").InnerText;//来源板
}else if(isSourceLattice==2)
{
strSrcLatticeid = methodNode.SelectSingleNode("destinationLattice/value").InnerText;//来源板
}
ArrayList arrayList = GetFourDirectionLatticeId(Convert.ToInt32(strSrcLatticeid), software_device_number);
for (int i = 0; i < arrayList.Count; i++)
{
var latticeXn = latticesNode.SelectSingleNode("platform[lattice_id=" + arrayList[i] + "]");
string strlabwareId = "";
if (latticeXn != null)
{
strlabwareId = latticeXn.SelectSingleNode("labware_id").InnerText;//板位上放的耗材Id
//数据库读取耗材个总高度
//判断耗材的高度是否在夹爪的安全抓取范围
//夹爪正向耗材是在范围;夹爪纵向耗材是在范围;两者都在安全范围;两者都不在安全范围;
ObservableCollection labwares = LabwareDB.GetLabware(1, strlabwareId);
if (labwares.Count == 0)
{
labwares = LabwareDB.GetLabware(0, strlabwareId);
}
if (labwares.Count >= 1)
{
if (labwares[0].labware_height >= fGripperBaseHeight)
{
if (arrayList.Count == 1 && ((int)arrayList[i] < Convert.ToInt32(strSrcLatticeid)))
{
iResult = 1;
}
else if (arrayList.Count == 1 &&((int)arrayList[i] > Convert.ToInt32(strSrcLatticeid)))
{
iResult = 3;
}
else
{
iResult++;
}
}
}
}
else
{
}
}
return iResult;
}
#endregion
#region 根据当前板位Id,获取其四周的板位Id
///
/// 根据当前板位Id,获取其四周的板位Id
///
/// 当前板位id
/// 当前设备号
///
public ArrayList GetFourDirectionLatticeId(int currentLatticeId, string software_device_number)
{
ArrayList arrayList= new ArrayList();
Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(currentLatticeId.ToString());
int currentLatticeIndex = Convert.ToInt32(lattice.lattice_num.Substring(1, lattice.lattice_num.Length - 1));
return arrayList;
}
#endregion
#region 执行抓板,返回结果字符串
///
/// 执行放板,返回结果字符串
///
/// 抓板动作参数实体
/// 0:连接设备;1:虚拟运行
/// 结果实体对象
public HxResult ExecuteGripTransportPick(GripTransportMParam gripTransportMParam, bool isSimulator = false)
{
HxResult ret = new HxResult();
if (!isSimulator)
{
ret = MethodAction.Instance.Pick(gripTransportMParam);
}
else
{
System.Threading.Thread.Sleep(1000);
ret.Result = ResultType.Success;
//ret.AlarmInfo = "空测试";
}
return ret;
}
#endregion
#region 执行放板,返回结果字符串
///
/// 执行放板,返回结果字符串
///
/// 放板动作参数实体
/// 0:连接设备;1:虚拟运行
/// 结果实体对象
public HxResult ExecuteGripTransportPlace(GripTransportMParam gripTransportMParam, bool isSimulator=false)
{
HxResult ret = new HxResult();
if (!isSimulator)
{
ret = MethodAction.Instance.Place(gripTransportMParam);
}
else
{
System.Threading.Thread.Sleep(1000);
ret.Result = ResultType.Success;
}
return ret;
}
#endregion
}
}