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"); } } } }