using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace XImagingXhandler.XDAL { /// /// 板位表校准后的坐标x轴,y轴,z轴值计算写入数据库 /// public class LatticeCalc { #region 判断是否在同一平面内平行或符合误差范围(四点定位法) /// /// 判断是否在同一平面内平行或符合误差范围(四点定位法) /// /// 多个板位采集点对象数据集 /// 允许的误差范围值 /// true:在允许范围内;false:不在允许范围内 public bool isEnableValue(List lattices, double rangeVal) { bool bResult = true; if (lattices.Count >= 2) { if (lattices.Count == 2) { if (lattices[0].lattice_X - rangeVal < lattices[1].lattice_X && lattices[1].lattice_X < lattices[0].lattice_X + rangeVal) { } else { bResult = false; } } if (lattices.Count == 3) { if (lattices[0].lattice_X - rangeVal < lattices[2].lattice_X && lattices[2].lattice_X < lattices[0].lattice_X + rangeVal) { } else { bResult = false; } if (lattices[0].lattice_Y - rangeVal < lattices[1].lattice_Y && lattices[1].lattice_Y < lattices[0].lattice_Y + rangeVal) { } else { bResult = false; } if (lattices[2].lattice_Z - rangeVal < lattices[0].lattice_Z && lattices[0].lattice_Z < lattices[2].lattice_Z + rangeVal) { } else { bResult = false; } if (lattices[1].lattice_Z - rangeVal < lattices[0].lattice_Z && lattices[0].lattice_Z < lattices[1].lattice_Z + rangeVal) { } else { bResult = false; } } if (lattices.Count == 4) { if (lattices[0].lattice_X - rangeVal < lattices[1].lattice_X && lattices[1].lattice_X < lattices[0].lattice_X + rangeVal) { } else { bResult = false; } if (lattices[1].lattice_X - rangeVal < lattices[2].lattice_X && lattices[2].lattice_X < lattices[1].lattice_X + rangeVal) { } else { bResult = false; } if (lattices[2].lattice_X - rangeVal < lattices[3].lattice_X && lattices[3].lattice_X < lattices[2].lattice_X + rangeVal) { } else { bResult = false; } if (lattices[3].lattice_X - rangeVal < lattices[4].lattice_X && lattices[4].lattice_X < lattices[3].lattice_X + rangeVal) { } else { bResult = false; } if (lattices[4].lattice_X - rangeVal < lattices[0].lattice_X && lattices[0].lattice_X < lattices[4].lattice_X + rangeVal) { } else { bResult = false; } if (lattices[3].lattice_X - rangeVal < lattices[1].lattice_X && lattices[1].lattice_X < lattices[3].lattice_X + rangeVal) { } else { bResult = false; } } } return bResult; } #endregion #region 根据标定采集的点,计算出板位坐标和偏转角(四点定位法) /// /// 根据标定采集的点,计算出板位坐标和偏转角(四点定位法) /// /// 移采集的点位坐标实体集合 /// 精度值 /// 校准后的板位对象包含点位偏转值 public Lattice GenerateLatticeData(List lattices, double rangeVal) { Lattice lattice = new Lattice(); lattice.lattice_id = lattices[0].lattice_id; lattice.lattice_num = lattices[0].lattice_num; lattice.lattice_X = lattices[0].lattice_X; lattice.lattice_Y = lattices[0].lattice_Y; lattice.lattice_Z = lattices[0].lattice_Z; lattice.software_information_id = lattices[0].software_information_id; lattice.lattice_length = lattices[0].lattice_length; lattice.lattice_width = lattices[0].lattice_width; lattice.lattice_height = lattices[0].lattice_height; if (lattices.Count > 3) { //第一条和第二条为X轴校准,比较y轴差值 double cVal1 = (double)lattices[1].lattice_Y - (double)lattices[0].lattice_Y; double cVal2 = (double)lattices[2].lattice_X - (double)lattices[0].lattice_X; double Q1 = 0; double Q2 = 0; if (Math.Abs(cVal1) > rangeVal) { //需要计算转角值 Q1 = Math.Atan2(Math.Abs((double)lattices[1].lattice_Y - (double)lattices[0].lattice_Y), Math.Abs((double)lattices[1].lattice_X - (double)lattices[0].lattice_X));//角度 } if (Math.Abs(cVal2) > rangeVal) { //需要计算转角值 Q2 = Math.Atan2(Math.Abs((double)lattices[2].lattice_X - (double)lattices[0].lattice_X), Math.Abs((double)lattices[1].lattice_Y - (double)lattices[0].lattice_Y));//角度 } lattice.lattice_lp_X = Q1; lattice.lattice_lp_Y = Q2; } if (lattices.Count == 2) { //第一条和第二条为X轴校准,比较y轴差值 double cVal1 = (double)lattices[1].lattice_Y - (double)lattices[0].lattice_Y; //double cVal2 = (double)lattices[2].lattice_X - (double)lattices[0].lattice_X; double Q1 = 0; double Q2 = 0; if (Math.Abs(cVal1) > rangeVal) { //需要计算转角值 Q1 = Math.Atan2(Math.Abs((double)lattices[1].lattice_Y - (double)lattices[0].lattice_Y), Math.Abs((double)lattices[1].lattice_X - (double)lattices[0].lattice_X));//角度 } //if (Math.Abs(cVal2) > rangeVal) //{ // //需要计算转角值 // Q2 = Math.Atan2(Math.Abs((double)lattices[2].lattice_X - (double)lattices[0].lattice_X), Math.Abs((double)lattices[1].lattice_Y - (double)lattices[0].lattice_Y));//角度 //} Q2 = Q1; lattice.lattice_lp_X = Q1; lattice.lattice_lp_Y = Q2; } //if (lattices.Count == 1) //{ // //第一条和第二条为X轴校准,比较y轴差值 // double cVal1 = (double)lattices[1].lattice_Y - (double)lattices[0].lattice_Y; // //double cVal2 = (double)lattices[2].lattice_X - (double)lattices[0].lattice_X; // double Q1 = 0; // double Q2 = 0; // if (Math.Abs(cVal1) > rangeVal) // { // //需要计算转角值 // Q1 = Math.Atan2(Math.Abs((double)lattices[1].lattice_Y - (double)lattices[0].lattice_Y), Math.Abs((double)lattices[1].lattice_X - (double)lattices[0].lattice_X));//角度 // } // //if (Math.Abs(cVal2) > rangeVal) // //{ // // //需要计算转角值 // // Q2 = Math.Atan2(Math.Abs((double)lattices[2].lattice_X - (double)lattices[0].lattice_X), Math.Abs((double)lattices[1].lattice_Y - (double)lattices[0].lattice_Y));//角度 // //} // Q2 = Q1; // lattice.lattice_lp_X = Q1; // lattice.lattice_lp_Y = Q2; //} return lattice; } #endregion #region 根据标定采集的耗材A1孔坐标,计算出板位左上角的坐标(A1孔中心定位法) /// /// 根据标定采集的耗材A1孔坐标,计算出板位左上角的坐标(A1孔中心定位法) /// /// 移采集的点位坐标实体集合 /// 耗材实体 /// 利用A1孔中心定位法计算出的板位左上角坐标的板位对象 public Lattice GenerateLatticeData(List lattices, Labware labware) { Lattice lattice = new Lattice(); lattice.lattice_id = lattices[0].lattice_id; lattice.lattice_num = lattices[0].lattice_num; lattice.lattice_X = lattices[0].lattice_X; lattice.lattice_Y = lattices[0].lattice_Y; lattice.lattice_Z = lattices[0].lattice_Z; lattice.software_information_id = lattices[0].software_information_id; lattice.lattice_length = lattices[0].lattice_length; lattice.lattice_width = lattices[0].lattice_width; lattice.lattice_height = lattices[0].lattice_height; if (lattices.Count == 1) { //根据校准的A1孔坐标换算出板位左上角的坐标 if (labware.well_shape == 1)//圆形 { lattice.lattice_X = lattices[0].lattice_X + labware.a1_distance_x; lattice.lattice_Y = lattices[0].lattice_Y - labware.a1_distance_y; lattice.lattice_lp_X = 0; lattice.lattice_lp_Y = 0; } else if (labware.well_shape == 2)//方形 { lattice.lattice_X = lattices[0].lattice_X + labware.a1_distance_x; lattice.lattice_Y = lattices[0].lattice_Y - labware.a1_distance_y; lattice.lattice_lp_X = 0; lattice.lattice_lp_Y = 0; } } return lattice; } #endregion #region 根据标定板位上刻度为A1的中心焦点(如果是单通道,采集四个点,如果是8通道,采集左上角一个点),计算出板位左上角的坐标(原点在右上角) /// /// 根据标定板位上刻度为A1的中心焦点(如果是单通道,采集四个点,如果是8通道,采集左上角一个点),计算出板位左上角的坐标(原点在右上角) /// /// 移采集的点位坐标实体集合 /// 耗材实体 /// 在某个通道臂下,最终板位左上角的坐标 public Lattice GenerateLatticeDataForX1(List lattices, Labware labware) { Lattice lattice = new Lattice(); lattice.lattice_id = lattices[0].lattice_id; lattice.lattice_num = lattices[0].lattice_num; lattice.lattice_X = lattices[0].lattice_X; lattice.lattice_Y = lattices[0].lattice_Y; lattice.lattice_Z = lattices[0].lattice_Z; lattice.software_information_id = lattices[0].software_information_id; lattice.lattice_length = lattices[0].lattice_length; lattice.lattice_width = lattices[0].lattice_width; lattice.lattice_height = lattices[0].lattice_height; if (lattices.Count == 1) { lattice.lattice_X = lattices[0].lattice_X + 14.40d; lattice.lattice_Y = lattices[0].lattice_Y - 11.25d; lattice.lattice_Z = lattices[0].lattice_Z + 10.09 + (labware.tip_length - labware.press_tipinto_depth); lattice.lattice_lp_X = 0; lattice.lattice_lp_Y = 0; } return lattice; } #endregion #region 根据标定小孔采集点(如果是单通道,采集四个点,如果是8通道,采集左上角一个点),计算出板位左上角的坐标(原点在左上角) /// /// 根据标定小孔采集点(如果是单通道,采集四个点,如果是8通道,采集左上角一个点),计算出板位左上角的坐标(原点在左上角) /// /// 移采集的点位坐标实体集合 /// 耗材实体 /// 在某个通道臂下,最终板位左上角的坐标 public Lattice GenerateLatticeDataForLite(List lattices, Labware labware) { Lattice lattice = new Lattice(); lattice.lattice_id = lattices[0].lattice_id; lattice.lattice_num = lattices[0].lattice_num; lattice.lattice_X = lattices[0].lattice_X; lattice.lattice_Y = lattices[0].lattice_Y; lattice.lattice_Z = lattices[0].lattice_Z; lattice.software_information_id = lattices[0].software_information_id; lattice.lattice_length = lattices[0].lattice_length; lattice.lattice_width = lattices[0].lattice_width; lattice.lattice_height = lattices[0].lattice_height; if (lattices.Count == 1) { lattice.lattice_X = lattices[0].lattice_X - 14.40d; lattice.lattice_Y = lattices[0].lattice_Y - 11.25d; lattice.lattice_Z = lattices[0].lattice_Z + 10.09 + (labware.tip_length - labware.press_tipinto_depth); lattice.lattice_lp_X = 0; lattice.lattice_lp_Y = 0; } return lattice; } #endregion } }