using System; using System.Collections.Generic; using System.Linq; using AI.Common; using AI.DiagSystem; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using WingInterfaceLibrary.Enum; namespace WingAIDiagnosisService.Manage { public class AIDiagnosisPerImageModel { public AIDiagnosisPerImageModel() { } public AIDiagnosisPerImageModel(int index, AIDiagResultPerImg diagResult) { Index = index; PriorityScore = diagResult.PriorityScore; DiagResultsForEachOrgan = diagResult?.DiagResultsForEachOrgan.Select(o => new AIDiagnosisResultPerOrgan(o))?.ToList() ?? new List(); } public int Index { get; set; } public float PriorityScore { get; set; } public List DiagResultsForEachOrgan { get; set; } = new List(); } public class AIDiagnosisResultPerOrgan { public AIDiagnosisResultPerOrgan() { } public AIDiagnosisResultPerOrgan(AIDiagResultPerOrgan perOrgan) { var organ = DiagnosisOrganEnum.Null; var organName = Enum.GetName(typeof(DiagnosisOrganEnum), (int)perOrgan.Organ); if (!string.IsNullOrWhiteSpace(organName)) { organ = (DiagnosisOrganEnum)perOrgan.Organ; } Organ = organ; OrganBoundBox = new AIDiagnosisRect(perOrgan.OrganBoundBox); var organContours = new List(); if (perOrgan.OrganContours != null && perOrgan.OrganContours.Length > 0) { var coutours = perOrgan.OrganContours[0]; if (coutours != null && coutours.Length > 0) { foreach (var coutour in coutours) { organContours.Add(new AIDiagnosisPoint2D(coutour)); } } } OrganContours = organContours; OrganDescriptions = perOrgan.OrganDescriptions.Select(d => new AIDiagnosisDescription(d))?.ToList() ?? new List(); DetectedObjects = perOrgan.DetectedObjects?.Select(d => new AIDetectedObject(d))?.ToList() ?? new List(); } public DiagnosisOrganEnum Organ { get; set; } public AIDiagnosisRect OrganBoundBox { get; set; } public List OrganContours { get; set; } public List OrganDescriptions { get; set; } public List DetectedObjects { get; set; } } public class AIDiagnosisRect { public AIDiagnosisRect() { } public AIDiagnosisRect(Rect rect) { Right = rect.Right; Bottom = rect.Bottom; Left = rect.Left; Top = rect.Top; Width = rect.Width; Height = rect.Height; } public int Right { get; } public int Bottom { get; } public int Left { get; set; } public int Top { get; set; } public int Width { get; set; } public int Height { get; set; } } public class AIDiagnosisPoint2D { public AIDiagnosisPoint2D() { } public AIDiagnosisPoint2D(Point2D point) { X = point.X; Y = point.Y; } public int X { get; set; } public int Y { get; set; } } public class AIDetectedObject { public AIDetectedObject() { } public AIDetectedObject(DetectedObject detectedObject) { Label = detectedObject.Label; Confidence = detectedObject.Confidence; if (!detectedObject.BoundingBox.IsEmpty()) { BoundingBox = new AIDiagnosisRect(detectedObject.BoundingBox); } var contours = new List(); if (detectedObject.Contours != null && detectedObject.Contours.Length > 0) { var coutours = detectedObject.Contours[0]; if (coutours != null && coutours.Length > 0) { foreach (var coutour in coutours) { contours.Add(new AIDiagnosisPoint2D(coutour)); } } } Contours = contours; Descriptions = detectedObject.Descriptions?.Select(d => new AIDiagnosisDescription(d))?.ToList() ?? new List(); } public int Label { get; set; } public float Confidence { get; set; } public AIDiagnosisRect BoundingBox { get; set; } public List Contours { get; set; } public List Descriptions { get; set; } } public class AIDiagnosisDescription { public AIDiagnosisDescription() { } public AIDiagnosisDescription(IDescription description) { Type = (DiagnosisDescription)description.Type; if (description is DescriptionLesionSize lesionSize) { var lesionSizeInfo = lesionSize.Value; if (lesionSizeInfo != null) { var lz = new AIDiagnosisLesionSize { HorizontalLengthInPixel = lesionSizeInfo.HorizontalLengthInPixel, VerticalLengthInPixel = lesionSizeInfo.VerticalLengthInPixel, }; if (lesionSizeInfo.HorizontalPoint1 != null) { lz.HorizontalPoint1 = new AIDiagnosisPoint2D { X = lesionSizeInfo.HorizontalPoint1.X, Y = lesionSizeInfo.HorizontalPoint1.Y }; } if (lesionSizeInfo.HorizontalPoint2 != null) { lz.HorizontalPoint2 = new AIDiagnosisPoint2D { X = lesionSizeInfo.HorizontalPoint2.X, Y = lesionSizeInfo.HorizontalPoint2.Y }; } if (lesionSizeInfo.VerticalPoint1 != null) { lz.VerticalPoint1 = new AIDiagnosisPoint2D { X = lesionSizeInfo.VerticalPoint1.X, Y = lesionSizeInfo.VerticalPoint1.Y }; } if (lesionSizeInfo.VerticalPoint2 != null) { lz.VerticalPoint2 = new AIDiagnosisPoint2D { X = lesionSizeInfo.VerticalPoint2.X, Y = lesionSizeInfo.VerticalPoint2.Y }; } Value = Newtonsoft.Json.JsonConvert.SerializeObject(lz); } } else if (description is DescriptionShape shape) { Value = shape.Value.ToString(); } else if (description is DescriptionOrientation orientation) { Value = orientation.Value.ToString(); } else if (description is DescriptionEchoPattern echoPattern) { Value = echoPattern.Value.ToString(); } else if (description is DescriptionLesionBoundary lesionBoundary) { Value = lesionBoundary.Value.ToString(); } else if (description is DescriptionMargin margin) { Value = margin.Value.ToString(); } else if (description is DescriptionCalcifications calcifications) { Value = calcifications.Value.ToString(); } } public DiagnosisDescription Type { get; set; } public string Value { get; set; } } public class AIDiagnosisLesionSize { public AIDiagnosisLesionSize() { } public AIDiagnosisPoint2D HorizontalPoint1 { get; set; } public AIDiagnosisPoint2D HorizontalPoint2 { get; set; } public int HorizontalLengthInPixel { get; set; } public AIDiagnosisPoint2D VerticalPoint1 { get; set; } public AIDiagnosisPoint2D VerticalPoint2 { get; set; } public int VerticalLengthInPixel { get; set; } } }