using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using Vinno.DataTypes;
using Vinno.DataManager.Utilities;
namespace WingAIDiagnosisService.URMManage
{
public class UrmProcessRequest
{
///
/// GUID
///
public string GUID { get; set; }
///
/// RemedicalCode
///
public string RemedicalCode { get; set; }
///
/// Token
///
public string Token { get; set; }
///
/// 操作类型 0-后处理测量,1-colorbar,2-zoom
///
///
public int ProcessType { get; set; } = 0;
//文件路径
public string DenDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\srcDenArray.bin";
public string DirDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\srcDirArray.bin";
public string VelDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\srcVelArray.bin";
public string AngleDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\srcAngleArray.bin";
public string MaskDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\srcMaskArray.bin";
/////
///// 生成图片保存路径
/////
//public string ImgFilePath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\test0627.png";
//探头信息
public string FamilyName { get; set; } = "Linear";
public string TypeInfo { get; set; } = "Linear_U5-15LE";
public string NativeId { get; set; } = "Breast";
// 图像配置
public string UrmImageType { get; set; } = "0"; // Den 0, Dir 1, Vel 2, Angle 3
public bool UrmBlend { get; set; } = true;
// 用于后处理计算的算法参数(需要传入)
public float DownsampleIndex { get; set; } = 3f;
public float IntPowerDen { get; set; } = 4f;
public float IntPowerDir { get; set; } = 4f;
public float SigmaGauss { get; set; } = 2.4f;
public float VessScale { get; set; } = 1f;
public float VelMaxScaler { get; set; } = 1f;
public float VelMinScaler { get; set; } = 0f;
public float Iterations { get; set; } = 1f; // URM的基础参数包括分析结果的数据与大小以及Res
public double Res { get; set; } = 2.5;
public int Urmsrcwidth { get; set; } = 188; // URM分析后的数据宽度
public int Urmsrcheight { get; set; } = 1233; // URM分析后的数据高度
public double ScaleOfPixel_x { get; set; } = 0.214925914347303;
public double ScaleOfPixel_y { get; set; } = 0.61038961038961;
public int ImgProcessVer { get; set; } = 1;//后处理算法版本 0 Ver2(<2.7) 1 Ver3(2.7)
public bool Isliner { get; set; } = true;
// URM的绘制参数
public bool ZoomOn { get; set; } = false; // 是否开启 zoom
public double ZoomRoix { get; set; } = 0; // zoom 区域在 ROI 中的归一化坐标
public double ZoomRoiy { get; set; } = 0; // zoom 区域在 ROI 中的归一化坐标
public double ZoomRoiwidth { get; set; } = 1; // zoom 区域在 ROI 中的归一化坐标
public double ZoomRoiheight { get; set; } = 1; // zoom 区域在 ROI 中的归一化坐标
public int Roix { get; set; } = 274;// Roi 区域在整个图像中的像素位置
public int Roiy { get; set; } = 16;// Roi 区域在整个图像中的像素位置
public int Roiwidth { get; set; } = 243; // Roi 区域在整个图像中的像素位置
public int Roiheight { get; set; } = 616; // Roi 区域在整个图像中的像素位置
public bool LeftRight { get; set; } = false;
public bool UpDown { get; set; } = false;
public int ScreenWidth { get; set; } = 666;// 输出的图像的尺寸
public int ScreenHeight { get; set; } = 650; // 输出的图像的尺寸
public DPoint[] UrmTraceDPoints { get; set; } = new DPoint[0];
protected virtual string GetUniqueValue()
{
var datas = new StringBuilder();
datas.Append(DenDataPath);
datas.Append(DirDataPath);
datas.Append(VelDataPath);
datas.Append(AngleDataPath);
datas.Append(MaskDataPath);
datas.Append(FamilyName);
datas.Append(TypeInfo);
datas.Append(NativeId);
datas.Append(UrmImageType);
datas.Append(UrmBlend);
datas.Append(DownsampleIndex);
datas.Append(IntPowerDen);
datas.Append(IntPowerDir);
datas.Append(SigmaGauss);
datas.Append(VessScale);
datas.Append(VelMaxScaler);
datas.Append(VelMinScaler);
datas.Append(Iterations);
datas.Append(Res);
datas.Append(Urmsrcwidth);
datas.Append(Urmsrcheight);
datas.Append(ScaleOfPixel_x);
datas.Append(ScaleOfPixel_y);
datas.Append(ImgProcessVer);
datas.Append(Isliner);
datas.Append(ZoomOn);
datas.Append(ZoomRoix);
datas.Append(ZoomRoiy);
datas.Append(ZoomRoiwidth);
datas.Append(ZoomRoiheight);
datas.Append(Roix);
datas.Append(Roiy);
datas.Append(Roiwidth);
datas.Append(Roiheight);
datas.Append(LeftRight);
datas.Append(UpDown);
datas.Append(ScreenWidth);
datas.Append(ScreenHeight);
datas.Append(Newtonsoft.Json.JsonConvert.SerializeObject(UrmTraceDPoints));
return datas.ToString();
}
public virtual string GetUniqueCode()
{
try
{
var datas = new StringBuilder();
datas.Append(Token);
datas.Append(RemedicalCode);
datas.Append(ProcessType);
return ToSHA256(datas.ToString());
}
catch
{
return Guid.NewGuid().ToString("N");
}
}
protected string ToSHA256(string originalString)
{
using (SHA256 sha256Hash = SHA256.Create())
{
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(originalString));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
builder.Append(bytes[i].ToString("x2"));
}
string encryptedString = builder.ToString().Substring(0, 32); // 获取前32位作为加密后的字符串
return encryptedString;
}
}
}
public class UrmMeasureProcessRequest : UrmProcessRequest
{
///
/// 测量项枚举
///
public URMMeasureType UrmMeasureType { get; set; }
///
/// 点集
///
public List SrcDPoints { get; set; }
///
/// 两点物理距离
///
public double? CMlength { get; set; }
///
/// 画布物理宽度
///
public double Phywidth { get; set; }
///
/// ROI 类型
///
public URMROIType ROIType { get; set; }
///
/// Rim 宽度
///
public double ShellWidth { get; set; }
protected override string GetUniqueValue()
{
var datas = new StringBuilder();
// datas.Append(UrmMeasureType);
// datas.Append(CMlength);
// datas.Append(Phywidth);
// datas.Append(ROIType);
// datas.Append(ShellWidth);
// datas.Append(Newtonsoft.Json.JsonConvert.SerializeObject(SrcDPoints));
return base.GetUniqueValue() + datas.ToString();
}
public override string GetUniqueCode()
{
try
{
return ToSHA256(GetUniqueValue());
}
catch
{
return Guid.NewGuid().ToString("N");
}
}
}
public class URMProcessorClass
{
///
/// GUID
///
public string GUID { get; set; }
public URMProcess Processor { get; set; }
public DateTime LastActiveTime { get; set; }
public bool HasDrawed { get; set; }
public double UrmMinVal { get; set; }
public double UrmMaxVal { get; set; }
public NativeArray DenArray { get; set; }
public NativeArray DirArray { get; set; }
public NativeArray VelArray { get; set; }
public NativeArray AngleArray { get; set; }
public NativeArray MaskArray { get; set; }
}
public class DoUrmVideoProcessRequest : UrmProcessRequest
{
// 当前播放帧
public int VideoFrame { get; set; } = 0;
// 视频配置
public float URMVideoScaler { get; set; } = 3;
public float URMVideoParameter { get; set; } = 2;
public float URMVideoType { get; set; } = 1;
//数据路径
public string PointsDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\URMPoints.bin";
public string PointNumsDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\URMPointNums.bin";
protected override string GetUniqueValue()
{
var datas = new StringBuilder();
datas.Append(URMVideoScaler);
datas.Append(URMVideoParameter);
datas.Append(URMVideoType);
datas.Append(PointsDataPath);
datas.Append(PointNumsDataPath);
return base.GetUniqueValue() + datas.ToString();
}
public override string GetUniqueCode()
{
try
{
return ToSHA256(GetUniqueValue());
}
catch
{
return Guid.NewGuid().ToString("N");
}
}
}
}