Example #1
0
        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);
            }
        }
Example #2
0
        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);
        }
Example #3
0
#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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }