IMHOTEP Framework
 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Pages
DicomVolumeControl.cs
1 using System.Collections;
2 using System.Collections.Generic;
3 using System.IO;
4 using UnityEngine;
5 using UnityEngine.UI;
6 
7 public class DicomVolumeControl : MonoBehaviour {
8 
9  public GameObject DICOMVolume;
10  public GameObject NoVolumeText;
11  public GameObject LoadingText;
12 
13  public GameObject TextureListEntry;
14 
15  public GameObject SideScreenEmpty;
16  public GameObject SideScreenMain;
17  public GameObject SideScreenTextureList;
18 
19  public Image HistogramImage;
20 
21  //private Dictionary<string, Texture2D> textures = new Dictionary<string, Texture2D>();
22 
23  // Use this for initialization
24  void Start () {
25  TextureListEntry.SetActive (false);
26  }
27 
28  void OnEnable()
29  {
30  PatientEventSystem.startListening( PatientEventSystem.Event.DICOM_CloseVolume, eventDicomClosed );
31  PatientEventSystem.startListening( PatientEventSystem.Event.DICOM_NewLoadedVolume, eventNewDicom );
32  PatientEventSystem.startListening( PatientEventSystem.Event.DICOM_StartLoadingVolume, eventLoadingStarted );
33 
34  // If a DICOM is already loaded, display the transfer function and histogram:
36  eventNewDicom ();
37  } else {
38  eventDicomClosed ();
39  }
40  }
41 
42  void OnDisable()
43  {
44  PatientEventSystem.stopListening( PatientEventSystem.Event.DICOM_CloseVolume, eventDicomClosed );
45  PatientEventSystem.stopListening( PatientEventSystem.Event.DICOM_NewLoadedVolume, eventNewDicom );
46  PatientEventSystem.stopListening( PatientEventSystem.Event.DICOM_StartLoadingVolume, eventLoadingStarted );
47  }
48 
49  void eventNewDicom( object obj = null )
50  {
51  NoVolumeText.SetActive (false);
52  LoadingText.SetActive (false);
53  SideScreenEmpty.SetActive (false);
54  displayHistogram ();
55  displayMainScreen ();
56  }
57 
58  void eventDicomClosed( object obj = null )
59  {
60  NoVolumeText.SetActive (true);
61  LoadingText.SetActive (false);
62  SideScreenEmpty.SetActive (true);
63 
64  SideScreenMain.SetActive (false);
65  SideScreenTextureList.SetActive (false);
66  }
67 
68  void eventLoadingStarted( object obj = null )
69  {
70  NoVolumeText.SetActive (false);
71  LoadingText.SetActive (true);
72  SideScreenEmpty.SetActive (true);
73 
74  SideScreenMain.SetActive (false);
75  SideScreenTextureList.SetActive (false);
76  }
77 
78  public void setTransferFunctionRange( float min, float max )
79  {
80  DICOMVolume.GetComponent<MeshRenderer>().material.SetFloat ("minimum", min);
81  DICOMVolume.GetComponent<MeshRenderer>().material.SetFloat ("maximum", max);
82  }
83 
84  void setTransferFunction( Texture2D tex )
85  {
86  DICOMVolume.GetComponent<MeshRenderer>().material.SetTexture ("_TransferFunction", tex);
87  }
88 
89  void displayHistogram( object obj = null )
90  {
91  Debug.Log ("Histogram Event");
92  Histogram hist = DICOMLoader.instance.currentDICOMVolume.histogram;
93  if (hist != null) {
94  Texture2D tex = hist.asTexture ();
95  Sprite sprite = Sprite.Create (tex, new Rect (0, 0, tex.width, tex.height), new Vector2 (0.5f, 0.5f));
96  HistogramImage.sprite = sprite;
97  }
98  }
99 
100  // =========================================================
101  // Load and handle transfer function textures:
102 
103  Texture2D loadTransferFunctionTexture( string path )
104  {
105  Texture2D tex = new Texture2D (2, 2);
106  if (File.Exists (path)) {
107  byte[] data = File.ReadAllBytes (path);
108  tex.LoadImage (data);
109  }
110  return tex;
111  }
112 
113  List<string> getTextureFiles( string directory )
114  {
115  string[] files = Directory.GetFiles (directory);
116  List<string> list = new List<string>();
117  foreach( string f in files )
118  {
119  list.Add( Path.GetFileNameWithoutExtension(f) );
120  }
121  return list;
122  }
123 
124  void generateTextureList()
125  {
126  List<string> filenames = getTextureFiles ("../TransferFunctions/");
127  clearTextureList ();
128  foreach (string filename in filenames) {
129  Texture2D tex = loadTransferFunctionTexture ("../TransferFunctions/" + filename + ".png");
130 
131  GameObject listEntry = Instantiate (TextureListEntry) as GameObject;
132  listEntry.SetActive (true);
133  listEntry.transform.SetParent (TextureListEntry.transform.parent, false);
134 
135  Image img = listEntry.transform.Find("Texture").GetComponent<Image> () as Image;
136  Sprite sprite = Sprite.Create (tex, new Rect (0, 0, tex.width, tex.height), new Vector2 (0.5f, 0.5f));
137  img.sprite = sprite;
138 
139  Text text = listEntry.GetComponentInChildren<Text> () as Text;
140  text.text = filename;
141 
142  listEntry.GetComponent<Button> ().onClick.AddListener(() => setTransferFunction( tex ));
143  listEntry.GetComponent<Button> ().onClick.AddListener(() => displayMainScreen());
144  }
145  }
146 
147 
148  void clearTextureList()
149  {
150  foreach (Transform tf in TextureListEntry.transform.parent) {
151  if (tf != TextureListEntry.transform) {
152  Destroy (tf.gameObject);
153  }
154  }
155  }
156 
157  // =========================================================
158 
159  public void displayTransferFunctionList()
160  {
161  generateTextureList ();
162 
163  SideScreenMain.SetActive (false);
164  SideScreenTextureList.SetActive (true);
165  SideScreenEmpty.SetActive (false);
166  }
167 
168  void displayMainScreen()
169  {
170 
171  SideScreenTextureList.SetActive (false);
172  SideScreenEmpty.SetActive (false);
173 
175  Texture2D currentTex = DICOMVolume.GetComponent<MeshRenderer> ().material.GetTexture ("_TransferFunction") as Texture2D;
176  Sprite sprite = Sprite.Create (currentTex, new Rect (0, 0, currentTex.width, currentTex.height), new Vector2 (0.5f, 0.5f));
177  SideScreenMain.transform.Find ("Background/Texture").GetComponent<Image> ().sprite = sprite;
178  SideScreenMain.SetActive (true);
179  } else {
180  SideScreenMain.SetActive (false);
181  SideScreenEmpty.SetActive (true);
182  }
183  }
184  // =========================================================
185 }
static DICOMLoader instance
Definition: DICOMLoader.cs:18
DICOM3D currentDICOMVolume
Definition: DICOMLoader.cs:23