using HalconDotNet;
using LB_VisionControls;
using LB_VisionProcesses.Alogrithms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LB_VisionProcesses
{
[Serializable]
public class ProcessParams
{
///
/// 输入集合
///
public ProcessCollections Inputs = new ProcessCollections();
///
/// 输出集合
///
public ProcessCollections Outputs = new ProcessCollections();
///
/// 感兴趣区域
///
[JsonConverter(typeof(ROIConverter))] // 使用自定义的 JSON 转换器
public ROI ROI
{
get
{
return UpdataROI();
}
set
{
if (value == null)
{
_kRoi.Item1 = RoiType.None;
_kRoi.Item2 = new double[] { };
return;
}
if (!(value is ROI))
return;
Type type = value.GetType();
if (typeof(HRectangle2) == type)
{
_kRoi.Item1 = RoiType.Rectangle2;
_kRoi.Item2 = new double[] { value.X, value.Y
, ((HRectangle2)value).Phi, ((HRectangle2)value).Width, ((HRectangle2)value).Height };
}
else if (typeof(HCircle) == type)
{
_kRoi.Item1 = RoiType.Circle;
_kRoi.Item2 = new double[] { value.X, value.Y, ((HCircle)value).Radius };
}
else if (typeof(HEllipse) == type)
{
_kRoi.Item1 = RoiType.Ellipse;
_kRoi.Item2 = new double[] { value.X, value.Y, ((HEllipse)value).Phi, ((HEllipse)value).Radius1, ((HEllipse)value).Radius2
, ((HEllipse)value).StartPhi, ((HEllipse)value).EndPhi};
}
else if (typeof(HSegment) == type)
{
_kRoi.Item1 = RoiType.Segment;
_kRoi.Item2 = new double[] { ((HSegment)value).StartX, ((HSegment)value).StartY
, ((HSegment)value).EndX, ((HSegment)value).EndY };
}
else
{
_kRoi.Item1 = RoiType.None;
_kRoi.Item2 = new double[] { };
}
}
}
///
/// 固定跟随空间
///
public Fixture Fixture = new Fixture();
///
/// ROI KEY
///
private (RoiType, double[]) _kRoi = (RoiType.None, new double[] { });
///
/// 刷新搜索区域
///
private ROI UpdataROI()
{
if (_kRoi.Item1 == RoiType.Rectangle2)
{
double[] val = _kRoi.Item2 as double[];
return new HRectangle2(val[0], val[1], val[2], val[3], val[4]);
}
else if (_kRoi.Item1 == RoiType.Circle)
{
double[] val = _kRoi.Item2 as double[];
return new HCircle(val[0], val[1], val[2]);
}
else if (_kRoi.Item1 == RoiType.Ellipse)
{
double[] val = _kRoi.Item2 as double[];
return new HEllipse(val[0], val[1], val[2], val[3], val[4], val[5], val[6]);
}
else if (_kRoi.Item1 == RoiType.Segment)
{
double[] val = _kRoi.Item2 as double[];
return new HSegment(val[0], val[1], val[2], val[3]);
}
else
{
return new ROI();
}
}
public static string ConvertToString(object data)
{
try
{
if (data == null)
{
return string.Empty;
}
Type type = data.GetType();
switch (type)
{
case Type t when t == typeof(JArray):
{
return string.Join(",", ((JArray)data).Cast());
}
case Type t when t == typeof(List):
{
return string.Join(",", (List)data);
}
case Type t when t == typeof(List):
{
return string.Join(",", ((List)data).Select(x => x.ToString("F4")));
}
case Type t when t == typeof(List):
{
return string.Join(",", (List)data);
}
case Type t when t == typeof(List):
{
return string.Join(",", (List)data);
}
default:
{//throw new ArgumentException("Unsupported data type");
return data?.ToString();
}
}
}
catch { return string.Empty; }
}
public static int ConvertToInt32(object data)
{
try
{
if (data == null)
{
return -9994;
}
Type type = data.GetType();
switch (type)
{
case Type a when a == typeof(string):
case Type b when b == typeof(short):
case Type c when c == typeof(long):
case Type e when e == typeof(double):
{
return Convert.ToInt32(data);
}
default:
{//throw new ArgumentException("Unsupported data type");
return Convert.ToInt32(data?.ToString());
}
}
}
catch { return -9994; }
}
public static double ConvertToDouble(object data)
{
try
{
if (data == null)
{
return -9994;
}
Type type = data.GetType();
switch (type)
{
case Type a when a == typeof(string):
case Type b when b == typeof(short):
case Type c when c == typeof(long):
case Type e when e == typeof(double):
case Type f when f == typeof(float):
{
return Convert.ToDouble(data);
}
default:
//throw new ArgumentException("Unsupported data type");
{
return Convert.ToDouble(data?.ToString());
}
}
}
catch { return -9994; }
}
public void FixDeserializedData()
{
for (int i = 0; i < Inputs.Count; i++)
{
var value = Inputs[i];
if (value == null)
{
continue;
}
var realValue = value;
if (value is JArray jArray)
{
realValue = (JArray.FromObject(value)).ToObject>();
}
else if (value is JObject jObject)
{
realValue = JsonConvert.DeserializeObject(value.ToString())?.ToObject>();
}
else if (value is short || value is long || value is double || value is int)
{
realValue = Convert.ToDouble(value);
}
else if (value is bool)
{
realValue = Convert.ToBoolean(value);
}
else
{
realValue = value?.ToString();
}
Inputs[i] = realValue;
}
for (int i = 0; i < Outputs.Count; i++)
{
var value = Outputs[i];
if (value == null)
{
continue;
}
var realValue = value;
if (value is JArray jArray)
{
try
{
realValue = (JArray.FromObject(value)).ToObject>();
}
catch
{
realValue = null;
}
}
else if (value is JObject jObject)
{
try
{
realValue = JsonConvert.DeserializeObject(value.ToString())?.ToObject>();
}
catch
{
realValue = null;
}
}
else if (value is short || value is long || value is double || value is int)
{
try
{
realValue = Convert.ToDouble(value);
}
catch
{
realValue = null;
}
}
else if (value is bool)
{
try
{
realValue = Convert.ToBoolean(value);
}
catch
{
realValue = null;
}
}
else
{
try
{
realValue = value?.ToString();
}
catch
{
realValue = null;
}
}
Outputs[i] = realValue;
}
}
}
}