using LB_VisionControl;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
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(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.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 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)
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();
Outputs[i] = realValue;
}
}
}
}