public async void BeginOpenEgsDoseAsync() { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Multiselect = false; openFileDialog.Title = "Open 3D Dose File"; if (openFileDialog.ShowDialog() == true) { var progressItem = ProgressService.CreateNew("Loading 3DDose File...", false); var progress = new Progress <double>(x => { progressItem.ProgressAmount = (int)x; }); EgsDoseObject openedObject = null; await Task.Run(async() => { try { openedObject = await DicomLoader.LoadEgsObjectAsync(openFileDialog.FileName, progress); } catch (Exception e) { Messenger.Default.Send(new NotificationMessage("Could not open file: " + e.Message)); } }); if (openedObject != null) { Messenger.Default.Send(new RTDicomViewer.Message.RTObjectAddedMessage <EgsDoseObject>(openedObject)); } ProgressService.End(progressItem); } }
public static async Task <EgsDoseObject> LoadEgsObjectAsync(string file, IProgress <double> progress) { var loader = new EgsDoseLoader(); var dose = new EgsDoseObject(); loader.Load(file, dose, progress); return(dose); }
#pragma warning disable CS1998 // This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. public static async Task <EgsDoseObject> LoadEgsObjectAsync(string file, IProgress <double> progress) #pragma warning restore CS1998 // This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. { var loader = new EgsDoseLoader(); var dose = new EgsDoseObject(); loader.Load(file, dose, progress); return(dose); }
public EgsDoseObject Load(string fileName) { EgsDoseObject dose = new EgsDoseObject(); GridBasedVoxelDataStructure grid = new GridBasedVoxelDataStructure(); dose.Name = Path.GetFileName(fileName); string text = File.ReadAllText(fileName); string[] numbers = text.Split(new char[] { '\n', ' ', '\t', '\r' }, StringSplitOptions.RemoveEmptyEntries); int SizeX = Int32.Parse(numbers[0]); int SizeY = Int32.Parse(numbers[1]); int SizeZ = Int32.Parse(numbers[2]); grid.XCoords = new double[SizeX]; grid.YCoords = new double[SizeY]; grid.ZCoords = new double[SizeZ]; grid.Data = new float[SizeX, SizeY, SizeZ]; int offset = 3; for (int i = 0; i < SizeX; i++) { grid.XCoords[i] = 10 * (Double.Parse(numbers[offset + i]) + Double.Parse(numbers[offset + i + 1])) / 2; } offset += SizeX + 1; for (int i = 0; i < SizeY; i++) { grid.YCoords[i] = 10 * (Double.Parse(numbers[offset + i]) + Double.Parse(numbers[offset + i + 1])) / 2; } offset += SizeY + 1; for (int i = 0; i < SizeZ; i++) { grid.ZCoords[i] = 10 * (Double.Parse(numbers[offset + i]) + Double.Parse(numbers[offset + i + 1])) / 2; } offset += SizeZ + 1; for (int i = 0; i < SizeX * SizeY * SizeZ; i++) { int indexX = i % SizeX; int indexZ = (int)(i / (SizeX * SizeY)); int indexY = (int)(i / SizeX) - indexZ * (SizeY); grid.Data[indexX, indexY, indexZ] = float.Parse(numbers[offset + i]); } foreach (Voxel voxel in grid.Voxels) { if (voxel.Value > grid.GlobalMax.Value) { grid.GlobalMax = voxel; } } return(dose); }
public EgsDoseObject Load(string fileName, EgsDoseObject doseObject, IProgress <double> progress) { GridBasedVoxelDataStructure grid = new GridBasedVoxelDataStructure(); grid.Name = Path.GetFileName(fileName); double max = 0; int SizeX, SizeY, SizeZ; using (TextReader reader = File.OpenText(fileName)) { SizeX = (int)ReadDouble(reader); SizeY = (int)ReadDouble(reader); SizeZ = (int)ReadDouble(reader); grid.XCoords = new float[SizeX]; grid.YCoords = new float[SizeY]; grid.ZCoords = new float[SizeZ]; grid.Data = new float[SizeX * SizeY * SizeZ]; fillCoords(grid.XCoords, SizeX, reader); fillCoords(grid.YCoords, SizeY, reader); fillCoords(grid.ZCoords, SizeZ, reader); int Size = SizeX * SizeY * SizeZ; for (int i = 0; i < Size; i++) { int indexX = i % SizeX; int indexZ = (int)(i / (SizeX * SizeY)); int indexY = (int)(i / SizeX) - indexZ * (SizeY); float data = ReadFloat(reader); grid.SetVoxelByIndices(indexX, indexY, indexZ, data); if (data > grid.MaxVoxel.Value) { grid.MaxVoxel.Value = data; grid.MaxVoxel.Position.X = grid.XCoords[indexX]; grid.MaxVoxel.Position.Y = grid.XCoords[indexY]; grid.MaxVoxel.Position.Z = grid.XCoords[indexZ]; } if (data < grid.MinVoxel.Value) { grid.MinVoxel.Value = data; grid.MinVoxel.Position.X = grid.XCoords[indexX]; grid.MinVoxel.Position.Y = grid.XCoords[indexY]; grid.MinVoxel.Position.Z = grid.XCoords[indexZ]; } //only report progress every 5%. if (i % (Size / 20) == 0) { progress.Report(100 * (double)i / (double)(Size)); } } } grid.XRange = new Range((double)grid.XCoords[0], (double)grid.XCoords[grid.XCoords.Length - 1]); grid.YRange = new Range(grid.YCoords[0], grid.YCoords[grid.YCoords.Length - 1]); grid.ZRange = new Range(grid.ZCoords[0], grid.ZCoords[grid.ZCoords.Length - 1]); doseObject.Grid = grid; doseObject.Grid.ValueUnit = Unit.Egs; //doseObject.Grid.ComputeMax(); return(doseObject); }