1 from SlicerScriptedModule import ScriptedModuleGUI
2 from Slicer import slicer
3
4
5 from time import strftime
6
7 from SlicerVMTKVesselEnhancementFrangiGUI import SlicerVMTKVesselEnhancementFrangiGUI
8 from SlicerVMTKVesselEnhancementSatoGUI import SlicerVMTKVesselEnhancementSatoGUI
9 from SlicerVMTKVesselEnhancementVEDGUI import SlicerVMTKVesselEnhancementVEDGUI
10 from SlicerVMTKVesselEnhancementLogic import SlicerVMTKVesselEnhancementLogic
11
12
13 vtkKWPushButton_InvokedEvent = 10000
14
15 vtkSlicerNodeSelectorWidget_NodeSelectedEvent = 11000
16
18
20
21 '''debug prints to stdout (better than print because of flush)'''
22
23
24 debugMode = 1
25
26 if debugMode:
27
28
29
30 print "[slicerVMTKVesselEnhancement " + strftime("%H:%M:%S") + "] " + str(msg)
31 import sys
32 sys.stdout.flush()
33
35
36 ScriptedModuleGUI.__init__(self)
37
38 self.SetCategory("Vascular Modeling Toolkit")
39 self.SetModuleName("Vessel Enhancement using VMTK")
40 self.SetGUIName("Vessel Enhancement using VMTK")
41
42 self._moduleNodeSelector = slicer.vtkSlicerNodeSelectorWidget()
43 self._inVolumeSelector = slicer.vtkSlicerNodeSelectorWidget()
44 self._outVolumeSelector = slicer.vtkSlicerNodeSelectorWidget()
45
46 self._topFrame = slicer.vtkSlicerModuleCollapsibleFrame()
47 self._advancedFrame = slicer.vtkSlicerModuleCollapsibleFrame()
48 self._advancedTabs = slicer.vtkKWNotebook()
49
50 self._logic = SlicerVMTKVesselEnhancementLogic(self)
51
52 self._updating = 0
53
54 self._pages = []
55
57
58 for page in self._pages:
59 page.Destructor()
60
61 self._moduleNodeSelector.SetParent(None)
62 self._moduleNodeSelector = None
63 self._inVolumeSelector.SetParent(None)
64 self._inVolumeSelector = None
65 self._outVolumeSelector.SetParent(None)
66 self._outVolumeSelector = None
67
68 self._advancedFrame.SetParent(None)
69 self._advancedFrame = None
70 self._advancedTabs.SetParent(None)
71 self._advancedTabs = None
72
73 self._logic = None
74
77
80
87
91
110
111
113
114 if not self._updating:
115
116 self._updating = 1
117
118 node = self.GetScriptedModuleNode()
119
120 if not node or not self._moduleNodeSelector.GetSelected():
121 self.debug("no node associated to this scriptedmodule, creating new..")
122 self._moduleNodeSelector.SetSelectedNew("vtkMRMLScriptedModuleNode")
123 self._moduleNodeSelector.ProcessNewNodeCommand("vtkMRMLScriptedModuleNode", "VMTKEnhParameters")
124 node = self._moduleNodeSelector.GetSelected()
125 self.GetLogic().SetAndObserveScriptedModuleNode(node)
126 self.SetScriptedModuleNode(node)
127 self.debug("new node created!")
128
129
130
131 for page in self._pages:
132 page.UpdateMRML()
133
134 node.SetParameter('isValidVMTKnode',"1")
135
136 node.RequestParameterList()
137 self.debug("parameterlist which was just set in main UpdateMRML " + node.GetParameterList())
138
139 self._updating = 0
140
142
143 if not self._updating:
144
145 self._updating = 1
146
147
148 node = self.GetScriptedModuleNode()
149
150 self.debug("calling UpdateGUI")
151
152 if node:
153
154 if str(node.GetParameter('isValidVMTKnode'))=="1":
155
156 self.debug("found valid VMTK node")
157
158 for page in self._pages:
159 page.UpdateGUI()
160
161 node.RequestParameterList()
162 self.debug("parameterlist which was just read in main UpdateGUI " + str(node.GetParameterList()))
163
164 self.CreateOutVolumeNode()
165
166 else:
167
168 for page in self._pages:
169 page.Reset()
170
171 self._updating = 0
172
174
175 if not self._outVolumeSelector.GetSelected():
176
177 self._outVolumeSelector.SetSelectedNew("vtkMRMLScalarVolumeNode")
178 self._outVolumeSelector.ProcessNewNodeCommand("vtkMRMLScalarVolumeNode", "EnhancedVesselnessOut")
179
180
183
185
186 self.GetUIPanel().AddPage("VesselEnhancement","VesselEnhancement","")
187 self._vmtkVesEnhPage = self.GetUIPanel().GetPageWidget("VesselEnhancement")
188 helpText = "**Vessel highlighting using VMTK Vessel Enhancement Filters**, developed by Daniel Haehn. \n\n\nFor further information to FrangiVesselness see <a>http://www.tecn.upf.es/~afrangi/articles/miccai1998.pdf</a>.\n\n\nDetails on SatoVesselness can be found here <a>http://www.spl.harvard.edu/archive/spl-pre2007/pages/papers/yoshi/cr.html</a>.\n\n\nInformation to Vessel Enhancement Diffusion is available at <a>http://www.springerlink.com/content/d11hxca163edccwk/fulltext.pdf</a>."
189 aboutText = "This work is supported by NA-MIC, NAC, BIRN, NCIGT, and the Slicer Community. See http://www.slicer.org for details."
190 self._helpAboutFrame = self.BuildHelpAndAboutFrame(self._vmtkVesEnhPage,helpText,aboutText)
191
192 self.debug("Creating VesselEnhancement GUI")
193
194
195 self._topFrame.SetParent(self._vmtkVesEnhPage)
196 self._topFrame.Create()
197 self._topFrame.SetLabelText("Input/Output")
198 self._topFrame.ExpandFrame()
199 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2 -in %s" % (self._topFrame.GetWidgetName(),self._vmtkVesEnhPage.GetWidgetName()))
200
201
202 self._moduleNodeSelector.SetNodeClass("vtkMRMLScriptedModuleNode", "ScriptedModuleName", self.GetLogic().GetModuleName(), "VMTKParameters")
203 self._moduleNodeSelector.NewNodeEnabledOn()
204 self._moduleNodeSelector.NoneEnabledOn()
205 self._moduleNodeSelector.ShowHiddenOn()
206 self._moduleNodeSelector.SetParent(self._topFrame.GetFrame())
207 self._moduleNodeSelector.Create()
208 self._moduleNodeSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
209 self._moduleNodeSelector.UpdateMenu()
210 self._moduleNodeSelector.SetBorderWidth(2)
211 self._moduleNodeSelector.SetLabelText("Module Parameters:")
212 self._moduleNodeSelector.SetBalloonHelpString("select a VMTK node from the current mrml scene.")
213 slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" % self._moduleNodeSelector.GetWidgetName())
214
215 self._inVolumeSelector.SetNodeClass("vtkMRMLScalarVolumeNode","","","")
216 self._inVolumeSelector.SetParent(self._topFrame.GetFrame())
217 self._inVolumeSelector.Create()
218 self._inVolumeSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
219 self._inVolumeSelector.UpdateMenu()
220 self._inVolumeSelector.SetBorderWidth(2)
221 self._inVolumeSelector.SetLabelText("Input Volume: ")
222 self._inVolumeSelector.SetBalloonHelpString("select an input volume from the current mrml scene.")
223 slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" % self._inVolumeSelector.GetWidgetName())
224
225
226 self._outVolumeSelector.SetNodeClass("vtkMRMLScalarVolumeNode","","","EnhancedVesselnessOut")
227 self._outVolumeSelector.SetNewNodeEnabled(1)
228 self._outVolumeSelector.SetParent(self._topFrame.GetFrame())
229 self._outVolumeSelector.Create()
230 self._outVolumeSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
231 self._outVolumeSelector.UpdateMenu()
232 self._outVolumeSelector.SetBorderWidth(2)
233 self._outVolumeSelector.SetLabelText("Output Volume: ")
234 self._outVolumeSelector.SetBalloonHelpString("select an output volume from the current mrml scene.")
235 slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" % self._outVolumeSelector.GetWidgetName())
236
237
238 self._advancedFrame.SetParent(self._vmtkVesEnhPage)
239 self._advancedFrame.Create()
240 self._advancedFrame.SetLabelText("Vessel Enhancement")
241 self._advancedFrame.ExpandFrame()
242 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2 -in %s" % (self._advancedFrame.GetWidgetName(),self._vmtkVesEnhPage.GetWidgetName()))
243
244
245 self._advancedTabs.SetParent(self._advancedFrame.GetFrame())
246 self._advancedTabs.Create()
247
248
249 self._advancedTabs.AddPage("FrangiVesselness","FrangiVesselness","")
250 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedTabs.GetWidgetName())
251 id = self._advancedTabs.GetFrame("FrangiVesselness")
252 self._advancedFrangiPanel = SlicerVMTKVesselEnhancementFrangiGUI(id,self)
253 self._advancedFrangiPanel.BuildGUI()
254 self._pages.append(self._advancedFrangiPanel)
255
256 self._advancedTabs.AddPage("SatoVesselness","SatoVesselness","")
257 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedTabs.GetWidgetName())
258 id = self._advancedTabs.GetFrame("SatoVesselness")
259 self._advancedSatoPanel = SlicerVMTKVesselEnhancementSatoGUI(id,self)
260 self._advancedSatoPanel.BuildGUI()
261 self._pages.append(self._advancedSatoPanel)
262
263 self._advancedTabs.AddPage("VED","VesselEnhancingDiffusion (interface under construction)","")
264 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedTabs.GetWidgetName())
265 id = self._advancedTabs.GetFrame("VED")
266 self._advancedVEDPanel = SlicerVMTKVesselEnhancementVEDGUI(id,self)
267 self._advancedVEDPanel.BuildGUI()
268 self._pages.append(self._advancedVEDPanel)
269
270 self.debug("Creating VesselEnhancement subclasses GUI")
271
272
274 if self.GetUIPanel().GetUserInterfaceManager():
275 self.GetUIPanel().RemovePage("VesselEnhancement")
276