1 from SlicerScriptedModule import ScriptedModuleGUI
2 from Slicer import slicer
3 import time
4
5 from SlicerVMTKLevelSetLogic import SlicerVMTKLevelSetLogic
6 from SlicerVMTKLevelSetGUIHelper import SlicerVMTKLevelSetGUIHelper
7 from SlicerVMTKInitializationWelcomeGUI import SlicerVMTKInitializationWelcomeGUI
8 from SlicerVMTKInitializationCollidingFrontsGUI import SlicerVMTKInitializationCollidingFrontsGUI
9 from SlicerVMTKInitializationFastMarchingGUI import SlicerVMTKInitializationFastMarchingGUI
10 from SlicerVMTKInitializationThresholdGUI import SlicerVMTKInitializationThresholdGUI
11 from SlicerVMTKInitializationIsosurfaceGUI import SlicerVMTKInitializationIsosurfaceGUI
12 from SlicerVMTKInitializationSeedsGUI import SlicerVMTKInitializationSeedsGUI
13 from SlicerVMTKEvolutionWelcomeGUI import SlicerVMTKEvolutionWelcomeGUI
14 from SlicerVMTKEvolutionGeodesicGUI import SlicerVMTKEvolutionGeodesicGUI
15 from SlicerVMTKEvolutionCurvesGUI import SlicerVMTKEvolutionCurvesGUI
16
17 vtkSlicerNodeSelectorWidget_NodeSelectedEvent = 11000
18 vtkKWPushButton_InvokedEvent = 10000
19
20 vtkSlicerNodeSelectorWidget_NewNodeEvent = 11001
21
22
23
25
27
28 ScriptedModuleGUI.__init__(self)
29
30 self.SetCategory("Segmentation")
31 self.SetModuleName("Level-Set Segmentation using VMTK")
32 self.SetGUIName("Level-Set Segmentation using VMTK")
33
34 self._moduleNodeSelector = slicer.vtkSlicerNodeSelectorWidget()
35 self._inVolumeSelector = slicer.vtkSlicerNodeSelectorWidget()
36
37 self._topFrame = slicer.vtkSlicerModuleCollapsibleFrame()
38 self._advancedInitFrame = slicer.vtkSlicerModuleCollapsibleFrame()
39 self._advancedInitTabs = slicer.vtkKWNotebook()
40
41 self._advancedInitMergeAndEndFrame = slicer.vtkKWFrame()
42 self._infoLabel = slicer.vtkKWLabel()
43 self._advancedInitMergeAndEndButtonSet = slicer.vtkKWPushButtonSet()
44
45 self._advancedEvolFrame = slicer.vtkSlicerModuleCollapsibleFrame()
46 self._advancedEvolTabs = slicer.vtkKWNotebook()
47
48 self._advancedEvolUndoAndEndFrame = slicer.vtkKWFrame()
49 self._advancedEvolUndoAndEndButtonSet = slicer.vtkKWPushButtonSet()
50
51 self._helper = SlicerVMTKLevelSetGUIHelper(self)
52 self._logic = SlicerVMTKLevelSetLogic(self)
53
54 self._outInitVolume = None
55 self._outInitVolumeLast = None
56
57 self._outEvolVolume = None
58 self._outEvolVolumeLast = None
59
60 self._outInitModel = None
61 self._outInitModelDisplay = None
62
63 self._outEvolModel = None
64 self._outEvolModelDisplay = None
65
66 self._initPages = []
67
68 self._evolPages = []
69
70 self._updating = 0
71
72 self._state = -1
73
75
76 self._helper.debug("main Destructor called")
77
78 for page in self._initPages:
79 page.Destructor()
80
81 self._moduleNodeSelector.SetParent(None)
82 self._moduleNodeSelector = None
83 self._inVolumeSelector.SetParent(None)
84 self._inVolumeSelector = None
85
86 self._topFrame.SetParent(None)
87 self._topFrame = None
88 self._advancedInitFrame.SetParent(None)
89 self._advancedInitFrame = None
90 self._advancedInitTabs.SetParent(None)
91 self._advancedInitTabs = None
92
93 self._advancedInitMergeAndEndFrame.SetParent(None)
94 self._advancedInitMergeAndEndFrame = None
95 self._infoLabel.SetParent(None)
96 self._infoLabel = None
97 self._advancedInitMergeAndEndButtonSet.SetParent(None)
98 self._advancedInitMergeAndEndButtonSet = None
99
100 self._advancedEvolFrame.SetParent(None)
101 self._advancedEvolFrame = None
102 self._advancedEvolTabs.SetParent(None)
103 self._advancedEvolTabs = None
104
105 self._advancedEvolUndoAndEndFrame.SetParent(None)
106 self._advancedEvolUndoAndEndFrame = None
107 self._advancedEvolUndoAndEndButtonSet.SetParent(None)
108 self._advancedEvolUndoAndEndButtonSet = None
109
110 self._logic = None
111 self._helper = None
112
113 self._outInitVolume = None
114 self._outInitVolumeLast = None
115
116 self._outEvolVolume = None
117 self._outEvolVolumeLast = None
118
119 self._outInitModel = None
120 self._outInitModelDisplay = None
121
122 self._outEvolModel = None
123 self._outEvolModelDisplay = None
124
125 self._initPages = None
126 self._evolPages = None
127 self._updating = None
128
129
132
135
137
138
139 self._moduleNodeSelectorSelectedTag = self.AddObserverByNumber(self._moduleNodeSelector,vtkSlicerNodeSelectorWidget_NodeSelectedEvent)
140
141 self._inVolumeSelectorSelectedTag = self.AddObserverByNumber(self._inVolumeSelector,vtkSlicerNodeSelectorWidget_NodeSelectedEvent)
142
143
144 self._advancedInitNewButtonTag = self.AddObserverByNumber(self._advancedInitNewButton,vtkKWPushButton_InvokedEvent)
145 self._advancedInitRemoveLastButtonTag = self.AddObserverByNumber(self._advancedInitRemoveLastButton,vtkKWPushButton_InvokedEvent)
146 self._advancedInitEndButtonTag = self.AddObserverByNumber(self._advancedInitEndButton,vtkKWPushButton_InvokedEvent)
147
148 self._advancedEvolRemoveLastButtonTag = self.AddObserverByNumber(self._advancedEvolRemoveLastButton,vtkKWPushButton_InvokedEvent)
149 self._advancedEvolEndButtonTag = self.AddObserverByNumber(self._advancedEvolEndButton,vtkKWPushButton_InvokedEvent)
150
151
152 self._renderWindowInteractor = slicer.ApplicationGUI.GetRenderWindowInteractor()
153 self._renderWindowLeftButtonReleaseTag = self._renderWindowInteractor.AddObserver("LeftButtonReleaseEvent",self._helper.HandleClickInRenderWindow)
154
155 self._redSliceInteractor = slicer.ApplicationGUI.GetMainSliceGUI("Red").GetSliceViewer().GetRenderWidget().GetRenderWindowInteractor()
156 self._redSliceLeftButtonReleaseTag = self._redSliceInteractor.AddObserver("LeftButtonReleaseEvent",self._helper.HandleClickInRedSliceWindow)
157
158 self._yellowSliceInteractor = slicer.ApplicationGUI.GetMainSliceGUI("Yellow").GetSliceViewer().GetRenderWidget().GetRenderWindowInteractor()
159 self._yellowSliceLeftButtonReleaseTag = self._yellowSliceInteractor.AddObserver("LeftButtonReleaseEvent",self._helper.HandleClickInYellowSliceWindow)
160
161 self._greenSliceInteractor = slicer.ApplicationGUI.GetMainSliceGUI("Green").GetSliceViewer().GetRenderWidget().GetRenderWindowInteractor()
162 self._greenSliceLeftButtonReleaseTag = self._greenSliceInteractor.AddObserver("LeftButtonReleaseEvent",self._helper.HandleClickInGreenSliceWindow)
163
164 self._helper.RegisterInteractors(self._renderWindowInteractor, self._redSliceInteractor, self._yellowSliceInteractor, self._greenSliceInteractor)
165
166
167
168 for page in self._initPages:
169 page.AddGUIObservers()
170 for page in self._evolPages:
171 page.AddGUIObservers()
172
174
175 if self._updating != 1:
176
177 self.UpdateMRML()
178
180
181 if self._updating != 1:
182
183 self.UpdateMRML()
184
186
187 self.RemoveObserver(self._moduleNodeSelectorSelectedTag)
188 self.RemoveObserver(self._inVolumeSelectorSelectedTag)
189
190 self.RemoveObserver(self._advancedInitNewButtonTag)
191 self.RemoveObserver(self._advancedInitRemoveLastButtonTag)
192 self.RemoveObserver(self._advancedInitEndButtonTag)
193 self.RemoveObserver(self._advancedEvolRemoveLastButtonTag)
194
195 self._renderWindowInteractor.RemoveObserver(self._renderWindowLeftButtonReleaseTag)
196 self._redSliceInteractor.RemoveObserver(self._redSliceLeftButtonReleaseTag)
197 self._yellowSliceInteractor.RemoveObserver(self._yellowSliceLeftButtonReleaseTag)
198 self._greenSliceInteractor.RemoveObserver(self._greenSliceLeftButtonReleaseTag)
199
200 for page in self._initPages:
201 page.RemoveGUIObservers()
202 for page in self._evolPages:
203 page.RemoveGUIObservers()
204
206
207
208
209 if self._updating != 1:
210
211 self._helper.debug("main ProcessGUIEvents called")
212
213 if caller == self._inVolumeSelector and event == vtkSlicerNodeSelectorWidget_NodeSelectedEvent and self._inVolumeSelector.GetSelected():
214 self._helper.debug("inVolume node changed, calling main UpdateMRML")
215
216 self._state = 0
217 self.UpdateMRML()
218 for page in self._initPages:
219 page.Reset()
220 for page in self._evolPages:
221 page.Reset()
222 self.UpdateMRML()
223 self.UpdateGUI()
224 elif caller == self._moduleNodeSelector and event == vtkSlicerNodeSelectorWidget_NodeSelectedEvent and self._moduleNodeSelector.GetSelected():
225 self._helper.debug("parameter node changed, calling main UpdateGUI")
226 node = self._moduleNodeSelector.GetSelected()
227 self.GetLogic().SetAndObserveScriptedModuleNode(node)
228 self.SetAndObserveScriptedModuleNode(node)
229 self.UpdateGUI()
230
231 elif caller == self._advancedInitNewButton and event == vtkKWPushButton_InvokedEvent:
232 self._helper.debug("Add new init Button clicked")
233 self._state = 0
234 for page in self._initPages:
235 page.Reset()
236 self.UpdateMRML()
237 self.UpdateGUIByState()
238 elif caller == self._advancedInitRemoveLastButton and event == vtkKWPushButton_InvokedEvent:
239 self._helper.debug("Remove last init Button clicked")
240 resultContainer = self._helper.UndoInit()
241 self._helper.GenerateInitializationModel(resultContainer)
242 self._state = 2
243 for page in self._initPages:
244 page.DeleteFiducialListsFromScene(3)
245 page.Reset()
246 self.UpdateMRML()
247 self.UpdateGUIByState()
248 elif caller == self._advancedInitEndButton and event == vtkKWPushButton_InvokedEvent:
249 self._helper.debug("Accept init Button clicked")
250 self._state = 3
251 for page in self._evolPages:
252 page.Reset()
253 self.UpdateMRML()
254 self.UpdateGUIByState()
255 elif caller == self._advancedEvolRemoveLastButton and event == vtkKWPushButton_InvokedEvent:
256 resultContainer = self._helper.UndoEvol()
257 self._helper.GenerateEvolutionModel(resultContainer)
258 self._state = 3
259 for page in self._evolPages:
260 page.Reset()
261 self.UpdateMRML()
262 self.UpdateGUIByState()
263 elif caller == self._advancedEvolEndButton and event == vtkKWPushButton_InvokedEvent:
264 self._state = 0
265 for page in self._initPages:
266 page.Reset()
267 for page in self._evolPages:
268 page.Reset()
269 self.GetLogic().GetMRMLScene().RemoveNode(self._outInitVolume)
270 self.GetLogic().GetMRMLScene().RemoveNode(self._outInitVolumeLast)
271 self.GetLogic().GetMRMLScene().RemoveNode(self._outInitModel)
272 self.GetLogic().GetMRMLScene().RemoveNode(self._outInitModelDisplay)
273 self._outInitVolume = None
274 self._outInitVolumeLast = None
275 self._outInitModel = None
276 self._outInitModelDisplay = None
277 self.UpdateMRML()
278 self.UpdateGUIByState()
279
280 for page in self._initPages:
281 page.ProcessGUIEvents(caller,event)
282 for page in self._evolPages:
283 page.ProcessGUIEvents(caller,event)
284
286
287
288
289 self._helper.debug("main UpdateMRML called")
290
291 if self._updating != 1:
292
293 node = self.GetScriptedModuleNode()
294 self._updating = 1
295 if not node or not self._moduleNodeSelector.GetSelected():
296 self._helper.debug("no node associated to this scriptedmodule, creating new..")
297 self._moduleNodeSelector.SetSelectedNew("vtkMRMLScriptedModuleNode")
298 self._moduleNodeSelector.ProcessNewNodeCommand("vtkMRMLScriptedModuleNode", "VMTKParameters")
299 node = self._moduleNodeSelector.GetSelected()
300 self.GetLogic().SetAndObserveScriptedModuleNode(node)
301 self.SetScriptedModuleNode(node)
302 self._helper.debug("new node created!")
303
304 if self._inVolumeSelector.GetSelected():
305 node.SetParameter('InputVolumeRef',self._inVolumeSelector.GetSelected())
306 else:
307 node.SetParameter('InputVolumeRef',"None")
308
309
310 if node.GetParameter('InputVolumeRef')=="None":
311 self.UnLockInitInterface(0)
312 else:
313 self.UnLockInitInterface(1)
314
315 if self._outInitVolume != None:
316 node.SetParameter('OutputInitVolumeRef', self._outInitVolume.GetID())
317 else:
318 node.SetParameter('OutputInitVolumeRef', "None")
319
320 if self._outInitVolumeLast != None:
321 node.SetParameter('OutputInitVolumeLastRef', self._outInitVolumeLast.GetID())
322 else:
323 node.SetParameter('OutputInitVolumeLastRef', "None")
324
325 if self._outEvolVolume != None:
326 node.SetParameter('OutputEvolVolumeRef', self._outEvolVolume.GetID())
327 else:
328 node.SetParameter('OutputEvolVolumeRef', "None")
329
330 if self._outEvolVolumeLast != None:
331 node.SetParameter('OutputEvolVolumeLastRef', self._outEvolVolumeLast.GetID())
332 else:
333 node.SetParameter('OutputEvolVolumeLastRef', "None")
334
335 if self._outInitModel != None:
336 node.SetParameter('OutputInitModelRef', self._outInitModel.GetID())
337 else:
338 node.SetParameter('OutputInitModelRef', "None")
339
340 if self._outInitModelDisplay != None:
341 node.SetParameter('OutputInitModelDisplayRef', self._outInitModelDisplay.GetID())
342 else:
343 node.SetParameter('OutputInitModelDisplayRef', "None")
344
345 if self._outEvolModel != None:
346 node.SetParameter('OutputEvolModelRef', self._outEvolModel.GetID())
347 else:
348 node.SetParameter('OutputEvolModelRef', "None")
349
350 if self._outEvolModelDisplay != None:
351 node.SetParameter('OutputEvolModelDisplayRef', self._outEvolModelDisplay.GetID())
352 else:
353 node.SetParameter('OutputEvolModelDisplayRef', "None")
354
355
356 node.SetParameter('state',self._state)
357
358
359 node.SetParameter('raisedInitializationPageID', str(self._advancedInitTabs.GetRaisedPageId()))
360 node.SetParameter('raisedEvolutionPageID', str(self._advancedEvolTabs.GetRaisedPageId()))
361
362
363 node.SetParameter('isValidVMTKNode',1)
364
365 for page in self._initPages:
366 page.UpdateMRML()
367 for page in self._evolPages:
368 page.Reset()
369
370 node.RequestParameterList()
371 self._helper.debug("parameterlist which was just set in main UpdateMRML " + node.GetParameterList())
372
373 self.GetLogic().GetMRMLScene().SaveStateForUndo(node)
374
375
376 self._updating = 0
377
378 self._helper.debug("main UpdateMRML end")
379
380 else:
381 self._helper.debug("blocked call of UpdateMRML because updating is in progress")
382
384
385
386 if self._updating != 1:
387 self._helper.debug("main UpdateGUI called")
388
389 node = self.GetScriptedModuleNode()
390 if node:
391
392 if node.GetParameter('isValidVMTKNode'):
393
394
395
396
397 self._helper.debug("setting the MRML parameters to the GUI")
398
399 node.RequestParameterList()
400 self._helper.debug("parameterlist which was just read in main UpdateGUI " + node.GetParameterList())
401
402 self._state = node.GetParameter('state')
403 self._helper.debug("updated state to: " + str(self._state))
404
405
406 if node.GetParameter('InputVolumeRef')=="None":
407 self._helper.debug("no inputVolumeRef so far..")
408 self.UnLockInitInterface(0)
409 if self._inVolumeSelector.GetSelected():
410
411 self._helper.debug("update inputVolumeRef to the current selection")
412 self._updating = 1
413 node.SetParameter('InputVolumeRef',self._inVolumeSelector.GetSelected())
414 self._updating = 0
415 self.UnLockInitInterface(1)
416 else:
417
418
419 self._state = -1
420 self._updating = 1
421 node.SetParameter('raisedInitializationPageID',0)
422 node.SetParameter('raisedEvolutionPageID',0)
423 self._updating = 0
424 else:
425
426 if self.GetLogic().GetMRMLScene().IsNodePresent(node.GetParameter('InputVolumeRef')):
427 self._helper.debug("inputVolumeRef is already associated, select this one in the GUI!")
428 self._updating = 1
429 self._inVolumeSelector.SetSelected(node.GetParameter('InputVolumeRef'))
430 self.UnLockInitInterface(1)
431
432 slicer.ApplicationLogic.GetSelectionNode().SetReferenceActiveVolumeID(self._inVolumeSelector.GetSelected().GetID())
433 slicer.ApplicationLogic.PropagateVolumeSelection()
434 self._updating = 0
435 else:
436 self._helper.debug("inputVolumeRef points to a deleted node! update.. and lock interface")
437 self._updating = 1
438 node.SetParameter('InputVolumeRef',"None")
439 node.SetParameter('raisedInitializationPageID',0)
440 node.SetParameter('raisedEvolutionPageID',0)
441 self._updating = 0
442 self._state = -1
443 self.UnLockInitInterface(0)
444
445 if node.GetParameter('OutputInitVolumeRef')=="None" or not node.GetParameter('OutputInitVolumeRef'):
446 self._outInitVolume = None
447 else:
448 if self.GetLogic().GetMRMLScene().IsNodePresent(self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputInitVolumeRef'))):
449 self._outInitVolume = self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputInitVolumeRef'))
450
451 if node.GetParameter('OutputInitVolumeLastRef')=="None" or not node.GetParameter('OutputInitVolumeLastRef'):
452 self._outInitVolumeLast = None
453 else:
454 if self.GetLogic().GetMRMLScene().IsNodePresent(self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputInitVolumeLastRef'))):
455 self._outInitVolumeLast = self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputInitVolumeLastRef'))
456
457
458 if node.GetParameter('OutputEvolVolumeRef')=="None" or not node.GetParameter('OutputEvolVolumeRef'):
459 self._outEvolVolume = None
460 else:
461 if self.GetLogic().GetMRMLScene().IsNodePresent(self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputEvolVolumeRef'))):
462 self._outEvolVolume = self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputEvolVolumeRef'))
463
464
465 if node.GetParameter('OutputInitModelRef')=="None" or not node.GetParameter('OutputInitModelRef'):
466 self._outInitModel = None
467 else:
468 if self.GetLogic().GetMRMLScene().IsNodePresent(self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputInitModelRef'))):
469 self._outInitModel = self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputInitModelRef'))
470
471 if node.GetParameter('OutputInitModelDisplayRef')=="None" or not node.GetParameter('OutputInitModelDisplayRef'):
472 self._outInitModelDisplay = None
473 else:
474 if self.GetLogic().GetMRMLScene().IsNodePresent(self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputInitModelDisplayRef'))):
475 self._outInitModelDisplay = self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputInitModelDisplayRef'))
476
477
478 if node.GetParameter('OutputEvolModelRef')=="None" or not node.GetParameter('OutputEvolModelRef'):
479 self._outEvolModel = None
480 else:
481 if self.GetLogic().GetMRMLScene().IsNodePresent(self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputEvolModelRef'))):
482 self._outEvolModel = self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputEvolModelRef'))
483
484 if node.GetParameter('OutputEvolModelDisplayRef')=="None" or not node.GetParameter('OutputEvolModelDisplayRef'):
485 self._outEvolModelDisplay = None
486 else:
487 if self.GetLogic().GetMRMLScene().IsNodePresent(self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputEvolModelDisplayRef'))):
488 self._outEvolModelDisplay = self.GetLogic().GetMRMLScene().GetNodeByID(node.GetParameter('OutputEvolModelDisplayRef'))
489
490
491
492 self._updating = 1
493 self._advancedInitTabs.RaisePage(node.GetParameter('raisedInitializationPageID'))
494 self._advancedEvolTabs.RaisePage(node.GetParameter('raisedEvolutionPageID'))
495 self._updating = 0
496
497 for page in self._initPages:
498 page.UpdateGUI()
499 for page in self._evolPages:
500 page.UpdateGUI()
501
502 else:
503
504 self._helper.debug("new node, resetting the GUI and calling UpdateMRML to save the values")
505 self._advancedInitTabs.RaisePage(0)
506 self._advancedEvolTabs.RaisePage(0)
507 self._outInitVolume = None
508 self._outInitVolumeLast = None
509 self._outEvolVolume = None
510 self._outEvolVolumeLast = None
511
512 self._outInitModel = None
513 self._outInitModelDisplay = None
514
515 self._outEvolModel = None
516 self._outEvolModelDisplay = None
517
518 if self._inVolumeSelector.GetSelected():
519 self._state = 0
520 else:
521 self._state = -1
522
523
524 self.UpdateMRML()
525 for page in self._initPages:
526 page.Reset()
527 for page in self._evolPages:
528 page.Reset()
529 self.UpdateMRML()
530
531
532
533 self._helper.SetIsInteractiveMode(0,None)
534
535 self.UpdateGUIByState()
536
537 self._helper.debug("main UpdateGUI end")
538
540 if self._updating != 1:
541 self._helper.debug("main ProcessMRMLEvents called, event: "+str(event))
542
543 if caller == self.GetScriptedModuleNode() and self.GetScriptedModuleNode!=None:
544 self.UpdateGUI()
545
547
548 self._helper.debug("main BuildGUI called")
549
550 self.GetUIPanel().AddPage("Level-Set Segmentation using VMTK","Level-Set Segmentation using VMTK","")
551 self._vmtkLvlSetPage = self.GetUIPanel().GetPageWidget("Level-Set Segmentation using VMTK")
552 helpText = "VMTK Level-Set Segmentation in 3D Slicer, developed by Daniel Haehn. This module uses the Vascular Modeling Toolkit (http://www.vmtk.org)."
553 aboutText = "This work is supported by NA-MIC, NAC, BIRN, NCIGT, and the Slicer Community. See http://www.slicer.org for details."
554 self._helpAboutFrame = self.BuildHelpAndAboutFrame(self._vmtkLvlSetPage,helpText,aboutText)
555
556
557 self._topFrame.SetParent(self._vmtkLvlSetPage)
558 self._topFrame.Create()
559 self._topFrame.SetLabelText("Level-Set Segmentation Parameters")
560 self._topFrame.ExpandFrame()
561 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2 -in %s" % (self._topFrame.GetWidgetName(),self._vmtkLvlSetPage.GetWidgetName()))
562
563 self._moduleNodeSelector.SetNodeClass("vtkMRMLScriptedModuleNode", "ScriptedModuleName", self.GetLogic().GetModuleName(), "VMTKParameters")
564 self._moduleNodeSelector.NewNodeEnabledOn()
565 self._moduleNodeSelector.NoneEnabledOn()
566 self._moduleNodeSelector.ShowHiddenOn()
567 self._moduleNodeSelector.SetParent(self._topFrame.GetFrame())
568 self._moduleNodeSelector.Create()
569 self._moduleNodeSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
570 self._moduleNodeSelector.UpdateMenu()
571 self._moduleNodeSelector.SetBorderWidth(2)
572 self._moduleNodeSelector.SetLabelText("Module Parameters:")
573 self._moduleNodeSelector.SetBalloonHelpString("select a VMTK node from the current mrml scene.")
574 slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" % self._moduleNodeSelector.GetWidgetName())
575
576 self._inVolumeSelector.SetNodeClass("vtkMRMLScalarVolumeNode","","","")
577 self._inVolumeSelector.SetParent(self._topFrame.GetFrame())
578 self._inVolumeSelector.Create()
579 self._inVolumeSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
580 self._inVolumeSelector.UpdateMenu()
581 self._inVolumeSelector.SetBorderWidth(2)
582 self._inVolumeSelector.SetLabelText("Input Volume:")
583 self._inVolumeSelector.SetBalloonHelpString("select an input volume from the current mrml scene.")
584 slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" % self._inVolumeSelector.GetWidgetName())
585
586 self._infoLabel.SetParent(self._vmtkLvlSetPage)
587 self._infoLabel.Create()
588 self._infoLabel.SetText("Choose initialization method..")
589 self._infoLabel.SetImageToPredefinedIcon(20023)
590 self._infoLabel.SetCompoundModeToLeft()
591 self._infoLabel.SetPadX(2)
592 slicer.TkCall("pack %s -side top -fill x -expand n -padx 2 -pady 2 -in %s" % (self._infoLabel.GetWidgetName(),self._vmtkLvlSetPage.GetWidgetName()))
593
594
595 self._advancedInitFrame.SetParent(self._vmtkLvlSetPage)
596 self._advancedInitFrame.Create()
597 self._advancedInitFrame.SetLabelText("Initialization")
598 self._advancedInitFrame.ExpandFrame()
599 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2 -in %s" % (self._advancedInitFrame.GetWidgetName(),self._vmtkLvlSetPage.GetWidgetName()))
600
601
602 self._advancedInitTabs.SetParent(self._advancedInitFrame.GetFrame())
603 self._advancedInitTabs.Create()
604 self._advancedInitTabs.AddObserver(2088,self.ProcessClickOnInitTabs)
605
606 self._advancedInitTabs.AddPage("Welcome","An overview of the initialization methods","")
607 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedInitTabs.GetWidgetName())
608 id = self._advancedInitTabs.GetFrame("Welcome")
609 self._advancedWelcomePanel = SlicerVMTKInitializationWelcomeGUI(id,self)
610 self._advancedWelcomePanel.BuildGUI()
611 self._initPages.append(self._advancedWelcomePanel)
612
613 self._advancedInitTabs.AddPage("Colliding Fronts","Colliding Fronts Initialization","")
614 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedInitTabs.GetWidgetName())
615 id = self._advancedInitTabs.GetFrame("Colliding Fronts")
616 self._advancedCollidingFrontsPanel = SlicerVMTKInitializationCollidingFrontsGUI(id,self)
617 self._advancedCollidingFrontsPanel.BuildGUI()
618 self._initPages.append(self._advancedCollidingFrontsPanel)
619
620 self._advancedInitTabs.AddPage("Fast Marching","Fast Marching Initialization","")
621 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedInitTabs.GetWidgetName())
622 id = self._advancedInitTabs.GetFrame("Fast Marching")
623 self._advancedFastMarchingPanel = SlicerVMTKInitializationFastMarchingGUI(id,self)
624 self._advancedFastMarchingPanel.BuildGUI()
625 self._initPages.append(self._advancedFastMarchingPanel)
626
627 self._advancedInitTabs.AddPage("Isosurface","Isosurface Initialization","")
628 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedInitTabs.GetWidgetName())
629 id = self._advancedInitTabs.GetFrame("Isosurface")
630 self._advancedIsosurfacePanel = SlicerVMTKInitializationIsosurfaceGUI(id,self)
631 self._advancedIsosurfacePanel.BuildGUI()
632 self._initPages.append(self._advancedIsosurfacePanel)
633
634 self._advancedInitTabs.AddPage("Threshold","Threshold Initialization","")
635 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedInitTabs.GetWidgetName())
636 id = self._advancedInitTabs.GetFrame("Threshold")
637 self._advancedThresholdPanel = SlicerVMTKInitializationThresholdGUI(id,self)
638 self._advancedThresholdPanel.BuildGUI()
639 self._initPages.append(self._advancedThresholdPanel)
640
641 self._advancedInitTabs.AddPage("Seeds","Seed Initialization","")
642 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedInitTabs.GetWidgetName())
643 id = self._advancedInitTabs.GetFrame("Seeds")
644 self._advancedSeedsPanel = SlicerVMTKInitializationSeedsGUI(id,self)
645 self._advancedSeedsPanel.BuildGUI()
646 self._initPages.append(self._advancedSeedsPanel)
647
648
649
650 self._advancedInitMergeAndEndFrame.SetParent(self._advancedInitFrame)
651 self._advancedInitMergeAndEndFrame.Create()
652 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2 -in %s" % (self._advancedInitMergeAndEndFrame.GetWidgetName(),self._advancedInitFrame.GetWidgetName()))
653
654 self._advancedInitMergeAndEndButtonSet.SetParent(self._advancedInitMergeAndEndFrame)
655 self._advancedInitMergeAndEndButtonSet.Create()
656 self._advancedInitMergeAndEndButtonSet.SetBorderWidth(2)
657 self._advancedInitMergeAndEndButtonSet.SetReliefToGroove()
658 self._advancedInitMergeAndEndButtonSet.SetWidgetsPadX(1)
659 self._advancedInitMergeAndEndButtonSet.SetWidgetsPadY(1)
660 self._advancedInitMergeAndEndButtonSet.SetPadX(1)
661 self._advancedInitMergeAndEndButtonSet.SetPadY(1)
662 self._advancedInitMergeAndEndButtonSet.PackHorizontallyOn()
663 self._advancedInitMergeAndEndButtonSet.ExpandWidgetsOn()
664 self._advancedInitMergeAndEndButtonSet.SetMaximumNumberOfWidgetsInPackingDirection(3)
665
666 self._advancedInitNewButton = self._advancedInitMergeAndEndButtonSet.AddWidget(0)
667 self._advancedInitNewButton.Create()
668 self._advancedInitNewButton.SetText("Add")
669 self._advancedInitNewButton.SetImageToPredefinedIcon(20045)
670 self._advancedInitNewButton.SetCompoundModeToLeft()
671 self._advancedInitNewButton.SetForegroundColor(0.3,0.6,0.3)
672
673 self._advancedInitRemoveLastButton = self._advancedInitMergeAndEndButtonSet.AddWidget(1)
674 self._advancedInitRemoveLastButton.Create()
675 self._advancedInitRemoveLastButton.SetText("Undo")
676 self._advancedInitRemoveLastButton.SetImageToPredefinedIcon(20049)
677 self._advancedInitRemoveLastButton.SetCompoundModeToLeft()
678 self._advancedInitRemoveLastButton.SetForegroundColor(0.6,0.3,0.3)
679
680 self._advancedInitEndButton = self._advancedInitMergeAndEndButtonSet.AddWidget(2)
681 self._advancedInitEndButton.Create()
682 self._advancedInitEndButton.SetText("Accept")
683 self._advancedInitEndButton.SetImageToPredefinedIcon(20044)
684 self._advancedInitEndButton.SetCompoundModeToLeft()
685 self._advancedInitEndButton.SetForegroundColor(0.3,0.3,0.6)
686
687
688 slicer.TkCall("pack %s -side top -fill x -expand n -padx 2 -pady 2 -in %s" % (self._advancedInitMergeAndEndButtonSet.GetWidgetName(),self._advancedInitMergeAndEndFrame.GetWidgetName()))
689
690
691
692 self._advancedEvolFrame.SetParent(self._vmtkLvlSetPage)
693 self._advancedEvolFrame.Create()
694 self._advancedEvolFrame.SetLabelText("Evolution")
695 self._advancedEvolFrame.ExpandFrame()
696 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2 -in %s" % (self._advancedEvolFrame.GetWidgetName(),self._vmtkLvlSetPage.GetWidgetName()))
697
698
699 self._advancedEvolTabs.SetParent(self._advancedEvolFrame.GetFrame())
700 self._advancedEvolTabs.Create()
701 self._advancedEvolTabs.AddObserver(2088,self.ProcessClickOnEvolTabs)
702
703 self._advancedEvolTabs.AddPage("Welcome","An overview of the evolution methods","")
704 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedEvolTabs.GetWidgetName())
705 id = self._advancedEvolTabs.GetFrame("Welcome")
706 self._advancedEvolWelcomePanel = SlicerVMTKEvolutionWelcomeGUI(id,self)
707 self._advancedEvolWelcomePanel.BuildGUI()
708 self._evolPages.append(self._advancedEvolWelcomePanel)
709
710 self._advancedEvolTabs.AddPage("Geodesic","Geodesic Evolution","")
711 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedEvolTabs.GetWidgetName())
712 id = self._advancedEvolTabs.GetFrame("Geodesic")
713 self._advancedGeodesicPanel = SlicerVMTKEvolutionGeodesicGUI(id,self)
714 self._advancedGeodesicPanel.BuildGUI()
715 self._evolPages.append(self._advancedGeodesicPanel)
716
717 self._advancedEvolTabs.AddPage("Curves","Curves Evolution","")
718 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._advancedEvolTabs.GetWidgetName())
719 id = self._advancedEvolTabs.GetFrame("Curves")
720 self._advancedCurvesPanel = SlicerVMTKEvolutionCurvesGUI(id,self)
721 self._advancedCurvesPanel.BuildGUI()
722 self._evolPages.append(self._advancedCurvesPanel)
723
724
725
726 self._advancedEvolUndoAndEndFrame.SetParent(self._advancedEvolFrame)
727 self._advancedEvolUndoAndEndFrame.Create()
728 slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2 -in %s" % (self._advancedEvolUndoAndEndFrame.GetWidgetName(),self._advancedEvolFrame.GetWidgetName()))
729
730 self._advancedEvolUndoAndEndButtonSet.SetParent(self._advancedEvolUndoAndEndFrame)
731 self._advancedEvolUndoAndEndButtonSet.Create()
732 self._advancedEvolUndoAndEndButtonSet.SetBorderWidth(2)
733 self._advancedEvolUndoAndEndButtonSet.SetReliefToGroove()
734 self._advancedEvolUndoAndEndButtonSet.SetWidgetsPadX(1)
735 self._advancedEvolUndoAndEndButtonSet.SetWidgetsPadY(1)
736 self._advancedEvolUndoAndEndButtonSet.SetPadX(1)
737 self._advancedEvolUndoAndEndButtonSet.SetPadY(1)
738 self._advancedEvolUndoAndEndButtonSet.PackHorizontallyOn()
739 self._advancedEvolUndoAndEndButtonSet.ExpandWidgetsOn()
740 self._advancedEvolUndoAndEndButtonSet.SetMaximumNumberOfWidgetsInPackingDirection(2)
741
742 self._advancedEvolRemoveLastButton = self._advancedEvolUndoAndEndButtonSet.AddWidget(1)
743 self._advancedEvolRemoveLastButton.Create()
744 self._advancedEvolRemoveLastButton.SetText("Undo")
745 self._advancedEvolRemoveLastButton.SetImageToPredefinedIcon(20049)
746 self._advancedEvolRemoveLastButton.SetCompoundModeToLeft()
747 self._advancedEvolRemoveLastButton.SetForegroundColor(0.6,0.3,0.3)
748
749 self._advancedEvolEndButton = self._advancedEvolUndoAndEndButtonSet.AddWidget(2)
750 self._advancedEvolEndButton.Create()
751 self._advancedEvolEndButton.SetText("Accept")
752 self._advancedEvolEndButton.SetImageToPredefinedIcon(20044)
753 self._advancedEvolEndButton.SetCompoundModeToLeft()
754 self._advancedEvolEndButton.SetForegroundColor(0.3,0.3,0.6)
755
756 slicer.TkCall("pack %s -side top -fill x -expand n -padx 2 -pady 2 -in %s" % (self._advancedEvolUndoAndEndButtonSet.GetWidgetName(),self._advancedEvolUndoAndEndFrame.GetWidgetName()))
757
758
759
760 self.UpdateGUIByState()
761
762
764
765 self._helper.debug("main TearDownGUI called")
766
767 if self.GetUIPanel().GetUserInterfaceManager():
768 self.GetUIPanel().RemovePage("Level-Set Segmentation")
769
772
775
777
778 self._advancedInitTabs.SetEnabled(action)
779
781
782 self._advancedEvolTabs.SetEnabled(action)
783
784
785
788
791
793 self._infoLabel.SetText(text)
794 self._infoLabel.SetImageToPredefinedIcon(20023)
795 self._infoLabel.SetCompoundModeToLeft()
796
797
798
799
801
802 self._helper.debug("Updating the GUI using state: " + str(self._state))
803
804 self._advancedInitFrame.CollapseFrame()
805 self.UnLockInitInterface(0)
806 self._advancedInitNewButton.SetEnabled(0)
807 self._advancedInitRemoveLastButton.SetEnabled(0)
808 self._advancedInitEndButton.SetEnabled(0)
809
810 self._advancedEvolFrame.CollapseFrame()
811 self.UnLockEvolInterface(0)
812 self._advancedEvolRemoveLastButton.SetEnabled(0)
813 self._advancedEvolEndButton.SetEnabled(0)
814
815 if self._state==-1:
816
817 self.ChangeInfoLabel("Input volume needed!")
818
819
820 elif self._state==0:
821
822
823 self._helper.debug("mode 0")
824 self.ChangeInfoLabel("Choose initialization method..")
825 self._advancedInitFrame.ExpandFrame()
826 self.UnLockInitInterface(1)
827
828 elif self._state==1:
829
830
831
832
833
834 self._helper.debug("mode 1")
835 self.ChangeInfoLabel("Initialization done. Add another branch?")
836
837 self._advancedInitNewButton.SetEnabled(1)
838 self._advancedInitRemoveLastButton.SetEnabled(1)
839 self._advancedInitEndButton.SetEnabled(1)
840
841
842 elif self._state==2:
843
844
845 self._helper.debug("mode 2")
846 self.ChangeInfoLabel("Undo done.")
847
848 self._advancedInitNewButton.SetEnabled(1)
849 self._advancedInitEndButton.SetEnabled(1)
850
851 elif self._state==3:
852
853
854
855
856
857 self._helper.debug("mode 3")
858 self.ChangeInfoLabel("Choose evolution method..")
859
860 self._advancedEvolFrame.ExpandFrame()
861 self.UnLockEvolInterface(1)
862 self._advancedEvolRemoveLastButton.SetEnabled(0)
863 self._advancedEvolEndButton.SetEnabled(0)
864
865 elif self._state == 4:
866
867 self._helper.debug("mode 4")
868 self.ChangeInfoLabel("Evolution done. Accept?")
869 self._advancedEvolRemoveLastButton.SetEnabled(1)
870 self._advancedEvolEndButton.SetEnabled(1)
871