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