using System; using System.IO; using System.Linq; using ClearCanvas.Common; using ClearCanvas.Desktop; using ClearCanvas.Desktop.Actions; using ClearCanvas.ImageViewer; using ClearCanvas.ImageViewer.BaseTools; using ClearCanvas.ImageViewer.RoiGraphics; using Nullstack.ClearCanvasEx.ViewerEx.FileOps.Utilities; namespace Nullstack.ClearCanvasEx.ViewerEx.FileOps { [MenuAction("DumpRoi", "global-menus/mnFile/mnDumpRoi", "DumpRoi")] [GroupHint("DumpRoi", "File.Measurements.Dump")] [ExtensionOf(typeof (ImageViewerToolExtensionPoint))] internal class RoiDumpTool : ImageViewerTool { public void DumpRoi() { var img = SelectedPresentationImage; if (img == null) return; var graphic = img.SelectedGraphic as RoiGraphic; if (graphic == null) { return; } var args = new FileDialogCreationArgs(string.Empty); args.Title = SR.szSavePresentationState; args.Filters.Add(new StandardFileExtensionFilter("CSV File", "csv")); args.Filters.Add(StandardFileExtensionFilter.AllFilesExtensionFilter); args.FileExtension = "csv"; var result = Context.DesktopWindow.ShowSaveFileDialogBox(args); if (result.Action == DialogBoxAction.Ok) { try { DumpRoi(graphic, result.FileName); } catch (Exception ex) { Platform.Log(LogLevel.Error, ex, "Failed to serialize presentation state."); ExceptionHandler.Report(ex, Context.DesktopWindow); } } } private static void DumpRoi(RoiGraphic g, string filename) { using (var fs = File.OpenWrite(filename)) using (var sw = new StreamWriter(fs)) { sw.WriteLine("X,Y,Raw,Transformed"); var roi = g.GetRoi(); foreach (var x in roi.GetRawPixelValues().Zip(roi.GetPixelValues(), (i, d) => new {Raw = i, Xform = d}).Zip(roi.GetPixelCoordinates(), (q, p) => new {q.Raw, q.Xform, p.X, p.Y})) { sw.WriteLine("{0},{1},{2},{3}", x.X, x.Y, x.Raw, x.Xform); } sw.Flush(); sw.Close(); } } } }