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 } }