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
|
{
|
/// <summary>
|
/// 夹爪孔位、列坐标计算处理
|
/// </summary>
|
public class WellCalcOfGripper
|
{
|
#region 夹爪孔坐标计算处理
|
/// <summary>
|
/// 夹爪孔坐标计算处理得到所有孔的夹爪坐标列表
|
/// </summary>
|
/// <param name="labware">耗材对象</param>
|
/// <param name="gripperCoordinate">夹爪在板位上的坐标对象</param>
|
/// <returns>孔的夹爪坐标列表</returns>
|
public List<GripperCoordinateForWell> 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<GripperCoordinateForWell> lstWells = new List<GripperCoordinateForWell>();
|
|
// 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<GripperCoordinateForColumn> GetReallyColumnsLabwareCoordinatesOnLattice(Labware labware, Lattice lattice)
|
{
|
List<GripperCoordinateForColumn> lstWells = new List<GripperCoordinateForColumn>();
|
return lstWells;
|
}
|
#endregion
|
|
|
#region 获取数据并计算夹爪孔的坐标--左上角为零点
|
/// <summary>
|
/// 获取数据并计算夹爪孔的坐标--左上角为零点
|
/// </summary>
|
/// <param name="labware">耗材对象</param>
|
/// <param name="lattice">夹爪抓板的板位坐标对象</param>
|
/// <returns>夹爪的孔位坐标表</returns>
|
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<LabwareWellInfo> 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 获取管架关联的管子
|
/// <summary>
|
/// 获取管架关联的管子
|
/// </summary>
|
/// <param name="jsonText">管架关联的管子json文本</param>
|
/// <returns>管子对象</returns>
|
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
|
}
|
}
|