using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataEntity;
using DataEntity.Share;
using DataRWDAL;
using HxEnum;
using Newtonsoft.Json.Linq;
using XCommon;
using XHandler.Class.DataEx;
using XImagingXhandler.XDAL;
namespace DataCalcDAL
{
///
/// 夹爪孔位、列坐标计算处理
///
public class WellCalcOfGripper
{
#region 夹爪孔坐标计算处理
///
/// 夹爪孔坐标计算处理得到所有孔的夹爪坐标列表
///
/// 耗材对象
/// 夹爪在板位上的坐标对象
/// 孔的夹爪坐标列表
public List GetReallyWellsLabwareCoordinatesOnLattice(Labware labware, GripperCoordinate gripperCoordinate)
{
int posVal = 0;
DataTable dtWellDes = null;
// 原点坐标:左上角
if (Shared.SoftwareInformation.originType == EnumManagement.GetEnumValue(OriginTypeEnum.LeftTop))
{
posVal = 2;
// 获取目标板位上孔坐标数据
dtWellDes = GetDataTableForWellOfGripperOnLeftTop(labware, gripperCoordinate);
}
// 原点坐标:右上角
else if (Shared.SoftwareInformation.originType == EnumManagement.GetEnumValue(OriginTypeEnum.RightTop))
{
posVal = 3;
}
List lstWells = new List();
// dt 转化为实体类对象集合
for (int k = 0; k < dtWellDes.Rows.Count; k++)
{
GripperCoordinateForWell wellDes = new GripperCoordinateForWell();
wellDes.lattice_num = dtWellDes.Rows[k]["lattice_num"].ToString();
wellDes.lattice_X = (float)Convert.ToDouble(dtWellDes.Rows[k]["axis_b_X"].ToString());
wellDes.lattice_Y = (float)Convert.ToDouble(dtWellDes.Rows[k]["axis_b_Y"].ToString());
wellDes.lattice_Z = (float)Convert.ToDouble(dtWellDes.Rows[k]["axis_b_Z"].ToString());
wellDes.gripper_rotational = Convert.ToDouble(gripperCoordinate.gripper_rotational.ToString());
wellDes.gripper_model = gripperCoordinate.gripper_model;
wellDes.device_arm_id = gripperCoordinate.device_arm_id;
wellDes.software_information_id = gripperCoordinate.software_information_id;
wellDes.wellname = dtWellDes.Rows[k]["wellname"].ToString();
wellDes.objectwidth= dtWellDes.Rows[k]["object_width"].ToString();
wellDes.spreadVal = (float)Convert.ToDouble(dtWellDes.Rows[k]["spreadVal"].ToString());
wellDes.squeezeVal = (float)Convert.ToDouble(dtWellDes.Rows[k]["squeezeVal"].ToString());
wellDes.gripperpowerVal = (float)Convert.ToDouble(dtWellDes.Rows[k]["powerVal"].ToString());
wellDes.gripSpeed = (float)Convert.ToDouble(dtWellDes.Rows[k]["speedVal"].ToString());
lstWells.Add(wellDes);
}
return lstWells;
}
#endregion
#region 夹爪列坐标计算处理
public List GetReallyColumnsLabwareCoordinatesOnLattice(Labware labware, Lattice lattice)
{
List lstWells = new List();
return lstWells;
}
#endregion
#region 获取数据并计算夹爪孔的坐标--左上角为零点
///
/// 获取数据并计算夹爪孔的坐标--左上角为零点
///
/// 耗材对象
/// 夹爪抓板的板位坐标对象
/// 夹爪的孔位坐标表
private DataTable GetDataTableForWellOfGripperOnLeftTop(Labware labware, GripperCoordinate lattice)
{
DataTable dt = new DataTable();
DataColumn dc = new DataColumn();
dc = new DataColumn();
dc.ColumnName = "labware_id";//孔板Id
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "wellname";//孔名称
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "axis_b_X";//板内x轴
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "axis_b_Y";//板内y轴
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "axis_b_Z";//板内底部高z轴
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "well_top_shape";//板内孔口形状;1:圆形;2:方形
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "axis_b_r";//孔半径或者半边长度
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "object_width";//夹取宽度
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "spreadVal";//张开距离
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "squeezeVal";//夹紧距离
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "powerVal";//夹紧力度
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "speedVal";//夹紧速度
dt.Columns.Add(dc);
dc = new DataColumn();
dc.ColumnName = "lattice_num";//板位编号
dt.Columns.Add(dc);
Labware labware1 = LabwareDB.GetLabware(labware.labware_id);
//离心管耗材对象
Labware centrifugalLabware = GetCentrifugalLabwer(labware1.piled_script);
if (labware1 != null)
{
double a1DistanceX = 0; // A1孔中心距短边的距离
double a1DistanceY = 0; // A1孔中心距长边的距离
//判断是否为异形管架耗材
if (labware1.labware_tubeshelf_type == 0)
{
for (int nCol = 1; nCol < (int)labware1.number_column + 1; nCol++)
{
for (int nRow = 1; nRow < labware1.number_row + 1; nRow++)
{
string rowName = ComUtility.GetRowChar(nRow - 1);
a1DistanceX = (double)labware1.a1_distance_x;
a1DistanceY = (double)labware1.a1_distance_y;
// A1
string wellName = rowName + nCol.ToString();
DataRow dr = dt.NewRow();
dr["labware_id"] = labware1.labware_id;
dr["wellname"] = wellName;
dr["axis_b_X"] = lattice.lattice_X+a1DistanceX + ((nCol - 1) * labware1.a1_a2_distance);
dr["axis_b_Y"] = lattice.lattice_Y+a1DistanceY + ((nRow - 1) * labware1.a1_b1_distance);
dr["axis_b_Z"] = lattice.lattice_Z-labware1.well_bottom_height;
dr["well_top_shape"] = labware1.well_shape;
if (labware1.well_shape == 1) // 孔洞形状,1:圆柱体
{
dr["axis_b_r"] = labware1.well_mouth_radius;
}
else
{
dr["axis_b_r"] = (labware1.well_top_x / 2);
if (labware1.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Through).ToString()) // 试剂槽
{
dr["axis_b_X"] = (float)Convert.ToDouble(dr["axis_b_X"]) + (float)Convert.ToDouble(dr["axis_b_r"]);
dr["axis_b_Y"] = (float)Convert.ToDouble(dr["axis_b_Y"]) + 1f;
}
}
dr["object_width"] = (float)(centrifugalLabware.well_mouth_out_radius * 2);
dr["spreadVal"] = (float)(centrifugalLabware.gripper_spread);
dr["squeezeVal"] = (float)(centrifugalLabware.gripper_squeeze);
dr["powerVal"] = (float)(centrifugalLabware.gripper_power);
dr["speedVal"]= (float)(centrifugalLabware.gripper_speed);
dr["lattice_num"] = lattice.lattice_num;
dt.Rows.Add(dr);
}
}
}
else
//异形管架耗材
{
ObservableCollection labwareWellInfos = LabwareDB.GetSpecialLabwareWellInfo(labware1.labware_id);
foreach(LabwareWellInfo labwareWellInfo in labwareWellInfos)
{
DataRow dr = dt.NewRow();
dr["labware_id"] = labware1.labware_id;
dr["wellname"] = labwareWellInfo.labware_well_name;
dr["axis_b_X"] = lattice.lattice_X+labwareWellInfo.labware_well_center_x;
dr["axis_b_Y"] = lattice.lattice_Y+labwareWellInfo.labware_well_center_y;
Labware labware2 = LabwareDB.GetLabware(labwareWellInfo.well_labware_id);//管架孔内安装的耗材
dr["axis_b_Z"] = lattice.lattice_Z - labware2.well_bottom_height;
dr["well_top_shape"] = labware1.well_shape;
if (labware1.well_shape == 1) // 孔洞形状,1:圆柱体
{
dr["axis_b_r"] = labware2.well_mouth_out_radius;
}
else
{
dr["axis_b_r"] = (labware2.well_bottom_width / 2);
}
dr["object_width"] = (float)(labware2.well_mouth_out_radius * 2);
dr["spreadVal"] = (float)(labware2.gripper_spread);
dr["squeezeVal"] = (float)labware2.gripper_squeeze;
dr["powerVal"] = (float)(labware2.gripper_power);
dr["speedVal"] = (float)(labware2.gripper_speed);
dr["lattice_num"] = lattice.lattice_num;
dt.Rows.Add(dr);
}
}
}
return dt;
}
#endregion
#region 获取管架关联的管子
///
/// 获取管架关联的管子
///
/// 管架关联的管子json文本
/// 管子对象
public Labware GetCentrifugalLabwer(string jsonText)
{
string labwareCentrifugalId = string.Empty;
Labware centrifugalLabware = new Labware();
if (!string.IsNullOrEmpty(jsonText))
{
JObject job = JObject.Parse(jsonText);
JArray jArray = (JArray)job["list"];
if (jArray != null)
{
if (jArray.Count > 0)
{
labwareCentrifugalId = jArray[0]["labwereid"].ToString();
centrifugalLabware = LabwareDB.GetLabware(labwareCentrifugalId);
}
}
}
return centrifugalLabware;
}
#endregion
}
}