Skip to content

Commit 8692f0c

Browse files
authored
Merge pull request mlavik1#37 from mlavik1/issue-36-dicomextension
Import DICOM without DICOM file extension
2 parents 3a66816 + 7dc4bbb commit 8692f0c

File tree

4 files changed

+60
-17
lines changed

4 files changed

+60
-17
lines changed

Assets/Editor/EditorDatasetImporter.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using System.IO;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
25
using UnityEditor;
36

47
namespace UnityVolumeRendering
@@ -23,7 +26,13 @@ public static void ImportDataset(string filePath)
2326
}
2427
case DatasetType.DICOM:
2528
{
26-
DatasetImporterBase importer = new DICOMImporter(new FileInfo(filePath).Directory.FullName, false);
29+
string directoryPath = new FileInfo(filePath).Directory.FullName;
30+
31+
// Find all DICOM files in directory
32+
IEnumerable<string> fileCandidates = Directory.EnumerateFiles(directoryPath, "*.*", SearchOption.TopDirectoryOnly)
33+
.Where(p => p.EndsWith(".dcm", StringComparison.InvariantCultureIgnoreCase) || p.EndsWith(".dicom", StringComparison.InvariantCultureIgnoreCase) || p.EndsWith(".dicm", StringComparison.InvariantCultureIgnoreCase));
34+
35+
DatasetImporterBase importer = new DICOMImporter(fileCandidates, Path.GetFileName(directoryPath));
2736
VolumeDataset dataset = importer.Import();
2837

2938
if (dataset != null)

Assets/Editor/VolumeRendererEditorFunctions.cs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using UnityEditor;
22
using UnityEngine;
33
using System.IO;
4+
using System.Collections.Generic;
5+
using System;
6+
using System.Linq;
47

58
namespace UnityVolumeRendering
69
{
@@ -26,10 +29,34 @@ static void ShowDICOMImporter()
2629
string dir = EditorUtility.OpenFolderPanel("Select a folder to load", "", "");
2730
if (Directory.Exists(dir))
2831
{
29-
DICOMImporter importer = new DICOMImporter(dir, true);
30-
VolumeDataset dataset = importer.Import();
31-
if(dataset != null)
32-
VolumeObjectFactory.CreateObject(dataset);
32+
bool recursive = true;
33+
34+
// Read all files
35+
IEnumerable<string> fileCandidates = Directory.EnumerateFiles(dir, "*.*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly)
36+
.Where(p => p.EndsWith(".dcm", StringComparison.InvariantCultureIgnoreCase) || p.EndsWith(".dicom", StringComparison.InvariantCultureIgnoreCase) || p.EndsWith(".dicm", StringComparison.InvariantCultureIgnoreCase));
37+
38+
if (!fileCandidates.Any())
39+
{
40+
#if UNITY_EDITOR
41+
if (UnityEditor.EditorUtility.DisplayDialog("Could not find any DICOM files",
42+
$"Failed to find any files with DICOM file extension.{Environment.NewLine}Do you want to include files without DICOM file extension?", "Yes", "No"))
43+
{
44+
fileCandidates = Directory.EnumerateFiles(dir, "*.*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
45+
}
46+
#endif
47+
}
48+
49+
if (fileCandidates.Any())
50+
{
51+
DICOMImporter importer = new DICOMImporter(fileCandidates, Path.GetFileName(dir));
52+
VolumeDataset dataset = importer.Import();
53+
if (dataset != null)
54+
VolumeObjectFactory.CreateObject(dataset);
55+
}
56+
else
57+
Debug.LogError("Could not find any DICOM files to import.");
58+
59+
3360
}
3461
else
3562
{

Assets/Scripts/GUI/Components/RuntimeGUI.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
using UnityEngine;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using UnityEngine;
26

37
namespace UnityVolumeRendering
48
{
@@ -67,8 +71,14 @@ private void OnOpenDICOMDatasetResult(RuntimeFileBrowser.DialogResult result)
6771
// We'll only allow one dataset at a time in the runtime GUI (for simplicity)
6872
DespawnAllDatasets();
6973

74+
bool recursive = true;
75+
76+
// Read all files
77+
IEnumerable<string> fileCandidates = Directory.EnumerateFiles(result.path, "*.*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly)
78+
.Where(p => p.EndsWith(".dcm", StringComparison.InvariantCultureIgnoreCase) || p.EndsWith(".dicom", StringComparison.InvariantCultureIgnoreCase) || p.EndsWith(".dicm", StringComparison.InvariantCultureIgnoreCase));
79+
7080
// Import the dataset
71-
DICOMImporter importer = new DICOMImporter(result.path, true);
81+
DICOMImporter importer = new DICOMImporter(fileCandidates, Path.GetFileName(result.path));
7282
VolumeDataset dataset = importer.Import();
7383
// Spawn the object
7484
if (dataset != null)

Assets/Scripts/Importing/DICOMImporter.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ private class DICOMSliceFile
2828
public float pixelSpacing = 0.0f;
2929
}
3030

31-
private string diroctoryPath;
32-
private bool recursive;
31+
private IEnumerable<string> fileCandidates;
32+
private string datasetName;
3333

34-
public DICOMImporter(string diroctoryPath, bool recursive)
34+
public DICOMImporter(IEnumerable<string> files, string name = "DICOM_Dataset")
3535
{
36-
this.diroctoryPath = diroctoryPath;
37-
this.recursive = recursive;
36+
this.fileCandidates = files;
37+
datasetName = name;
3838
}
3939

4040
public override VolumeDataset Import()
@@ -52,9 +52,6 @@ public override VolumeDataset Import()
5252
return null;
5353
}
5454

55-
// Read all files
56-
IEnumerable<string> fileCandidates = Directory.EnumerateFiles(diroctoryPath, "*.*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly)
57-
.Where(p => p.EndsWith(".dcm") || p.EndsWith(".dicom") || p.EndsWith(".dicm"));
5855
List<DICOMSliceFile> files = new List<DICOMSliceFile>();
5956
foreach (string filePath in fileCandidates)
6057
{
@@ -79,7 +76,7 @@ public override VolumeDataset Import()
7976

8077
// Create dataset
8178
VolumeDataset dataset = new VolumeDataset();
82-
dataset.name = Path.GetFileName(Path.GetDirectoryName(diroctoryPath));
79+
dataset.datasetName = Path.GetFileName(datasetName);
8380
dataset.dimX = files[0].file.PixelData.Columns;
8481
dataset.dimY = files[0].file.PixelData.Rows;
8582
dataset.dimZ = files.Count;

0 commit comments

Comments
 (0)