public SemiAutomaticPreviewDTO Add(SemiAutomaticPreviewDTO contour) { SemiAutomaticPreviewDTO result = SemiAutomatic.Default(contour); repository.Save(result); return(result); }
public void Save(SemiAutomaticPreviewDTO contour) { using (var db = new ContourContext()) { ContourEntity ce = new ContourEntity(); ce.ContourEntityId = contour.guid; ce.DicomId = contour.dicomid; ce.Tag = contour.tag; ce.IsManual = false; db.Contours.Add(ce); db.SaveChanges(); } string filename = "../data/preview/" + contour.guid.ToString() + ".csv"; StreamWriter sw = new StreamWriter(filename); sw.WriteLine(contour.guid.ToString()); sw.WriteLine(contour.dicomid.ToString()); sw.WriteLine(contour.tag); sw.WriteLine(string.Join(',', contour.lines.First().points.Select(s => s.x.ToString() + "," + s.y.ToString()))); sw.WriteLine(string.Join(',', contour.lines.First().pixels.Select(s => s.x.ToString() + "," + s.y.ToString()))); sw.WriteLine(contour.lines.First().brushColor); sw.WriteLine(contour.width); sw.WriteLine(contour.height); sw.WriteLine(contour.pixelSpacing); sw.Close(); }
public bool Edit(SemiAutomaticPreviewDTO contour) { if (Delete(contour.guid)) { Save(contour); return(true); } return(false); }
public ActionResult <SemiAutomaticPreviewDTO> Get(Guid guid) { SemiAutomaticPreviewDTO contour = logic.Get(guid); if (contour == null) { return(NotFound()); } return(contour); }
public SemiAutomaticPreviewDTO Get(Guid guid) { SemiAutomaticPreviewDTO result = null; try { result = repository.Load(guid); } catch (Exception e) { Console.WriteLine("Catched exception: "); Console.WriteLine(e.ToString()); } return(result); }
public ActionResult <SemiAutomaticPreviewDTO> Put([FromBody] SemiAutomaticPreviewDTO contour) { SemiAutomaticPreviewDTO result; bool boolResult; (boolResult, result) = logic.Edit(contour); if (!boolResult) { return(BadRequest()); } if (result == null) { return(BadRequest()); } return(CreatedAtAction(nameof(Get), new { guid = result.guid }, result)); }
public static SemiAutomaticPreviewDTO CannyWithoutStatistics(SemiAutomaticPreviewDTO points) { List <Point> pixels; pixels = CannyAlgorithm.CannyWithoutStatistics(points.dicomid, points.lines.First().points, points.width, points.height); List <LinePointsAndPixels> lines = new List <LinePointsAndPixels>(); LinePointsAndPixels line = new LinePointsAndPixels(); line.points = new List <Point>(points.lines.First().points); line.pixels = new List <Point>(pixels); line.brushColor = points.lines.First().brushColor; lines.Add(line); SemiAutomaticPreviewDTO contour = new SemiAutomaticPreviewDTO(points.guid, points.dicomid, points.tag, lines, points.width, points.height, points.pixelSpacing, false); return(contour); }
public ActionResult <SemiAutomaticPreviewDTO> Post([FromBody] SemiAutomaticPreviewDTO points) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (points == null) { return(BadRequest()); } if (points.lines == null) { return(BadRequest()); } if (points.lines.Count == 0) { return(BadRequest()); } foreach (var l in points.lines) { if (l.points == null) { return(BadRequest()); } if (l.points.Count < 3) { return(BadRequest()); } } SemiAutomaticPreviewDTO result = logic.Add(points); return(CreatedAtAction(nameof(Get), new { guid = result.guid }, result)); }
public static SemiAutomaticPreviewDTO Default(SemiAutomaticPreviewDTO points) => CannyWithoutStatistics(points);
public (bool, SemiAutomaticPreviewDTO) Edit(SemiAutomaticPreviewDTO contour) { SemiAutomaticPreviewDTO old = repository.Load(contour.guid); if (old == null) { return(false, null); } List <Point> newListOfPoints = new List <Point>(); int i = 0; int j = 0; int countOld = old.lines.First().points.Count; int countNew = contour.lines.First().points.Count; Point currentInOld = old.lines.First().points[i]; Point currentInNew = contour.lines.First().points[j]; while (i < countOld) { currentInOld = old.lines.First().points[i]; currentInNew = contour.lines.First().points[j]; while (currentInOld.x != currentInNew.x || currentInOld.y != currentInNew.y) { i++; if (i == countOld) { break; } currentInOld = old.lines.First().points[i]; } newListOfPoints.Add(currentInOld); i++; j++; if (j == countNew) { break; } } while (j < countNew) { currentInNew = contour.lines.First().points[j]; double minDistance = double.MaxValue; int index = 0; for (int k = 0; k < newListOfPoints.Count; k++) { Point point1 = newListOfPoints[k]; Point point2 = newListOfPoints[(k + 1) % newListOfPoints.Count]; double A = point2.y - point1.y; double B = point1.x - point2.x; double C = point2.x * point1.y - point1.x * point2.y; double m = Math.Sqrt(A * A + B * B); double distance = Math.Abs(A * currentInNew.x + B * currentInNew.y + C) / m; double dy = Math.Abs(point2.y - point1.y); double dx = Math.Abs(point2.x - point1.x); bool inside = true; if (currentInNew.x > Math.Max(point1.x, point2.x) + (dx + dy) / 2) { inside = false; } if (currentInNew.x < Math.Min(point1.x, point2.x) - (dx + dy) / 2) { inside = false; } if (currentInNew.y > Math.Max(point1.y, point2.y) + (dy + dx) / 2) { inside = false; } if (currentInNew.y < Math.Min(point1.y, point2.y) - (dy + dx) / 2) { inside = false; } if (distance < minDistance && inside) { minDistance = distance; index = k + 1; } } newListOfPoints.Insert(index, currentInNew); j++; } contour.lines.First().points = new List <Point>(newListOfPoints); List <LinePointsAndPixels> list = new List <LinePointsAndPixels>(); LinePointsAndPixels line = new LinePointsAndPixels(); line.points = new List <Point>(newListOfPoints); line.pixels = old.lines.First().pixels; line.brushColor = contour.lines.First().brushColor; list.Add(line); SemiAutomaticPreviewDTO contourPointsDTO = new SemiAutomaticPreviewDTO(contour.guid, contour.dicomid, contour.tag, list, contour.width, contour.height, contour.pixelSpacing, contour.disablePreviewCalculations); SemiAutomaticPreviewDTO result = contourPointsDTO; if (!contour.disablePreviewCalculations) { result = SemiAutomatic.Default(contourPointsDTO); } if (repository.Edit(result)) { return(true, result); } else { return(false, result); } }
public SemiAutomaticPreviewDTO Load(Guid guid) { using (var db = new ContourContext()) { if (db.Contours.Where(c => c.ContourEntityId == guid).ToList().Count == 0) { return(null); } } string DICOMid; string tag; List <LinePointsAndPixels> lines = new List <LinePointsAndPixels>(); int width; int height; string buffor; string filename = "../data/preview/" + guid.ToString() + ".csv"; StreamReader sr = null; try { sr = new StreamReader(filename); } catch (Exception) { return(null); } if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); if (Guid.Parse(buffor) != guid) { throw new Exception($"Guid in file diffrent that in name of file {filename}"); } if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } DICOMid = sr.ReadLine(); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } tag = sr.ReadLine(); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } LinePointsAndPixels line = new LinePointsAndPixels(); line.pixels = new List <Point>(); line.points = new List <Point>(); buffor = sr.ReadLine(); List <int> points = buffor.Split(',').Select(s => int.Parse(s)).ToList(); int i = 0; while (i + 1 < points.Count) { line.points.Add(new Point(points[i++], points[i++])); } //It the same as: // while(i + 1 < points.Count) // { // line.pixels.Add(new Point(points[i], points[i+1])); // i += 2; // } // But it's look more funny buffor = sr.ReadLine(); points = buffor.Split(',').Select(s => int.Parse(s)).ToList(); while (i + 1 < points.Count) { line.pixels.Add(new Point(points[i++], points[i++])); } line.brushColor = sr.ReadLine(); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } lines.Add(line); buffor = sr.ReadLine(); width = int.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); height = int.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } string pixelSpacing = sr.ReadLine(); sr.Close(); SemiAutomaticPreviewDTO contour = new SemiAutomaticPreviewDTO(guid, DICOMid, tag, lines, width, height, pixelSpacing, true); return(contour); }