Package SlicerVMTKLevelSet :: Module SlicerVMTKLevelSetGUI
[hide private]
[frames] | no frames]

Source Code for Module SlicerVMTKLevelSet.SlicerVMTKLevelSetGUI

  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   
24 -class SlicerVMTKLevelSetGUI(ScriptedModuleGUI):
25
26 - def __init__(self):
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
74 - def Destructor(self):
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
130 - def RemoveMRMLNodeObservers(self):
131 pass
132
133 - def RemoveLogicObservers(self):
134 pass
135
136 - def AddGUIObservers(self):
137 138 139 self._moduleNodeSelectorSelectedTag = self.AddObserverByNumber(self._moduleNodeSelector,vtkSlicerNodeSelectorWidget_NodeSelectedEvent) 140 #self._moduleNodeSelectorNewTag = self.AddObserverByNumber(self._moduleNodeSelector,vtkSlicerNodeSelectorWidget_NewNodeEvent) 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 # observers for interaction 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
173 - def ProcessClickOnInitTabs(self):
174 175 if self._updating != 1: 176 177 self.UpdateMRML()
178
179 - def ProcessClickOnEvolTabs(self):
180 181 if self._updating != 1: 182 183 self.UpdateMRML()
184
185 - def RemoveGUIObservers(self):
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
205 - def ProcessGUIEvents(self,caller,event):
206 207 ### process events added to GUI and update MRML node 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 ### update the thresholdsliders 216 self._state = 0 217 self.UpdateMRML() # update reference to volume 218 for page in self._initPages: 219 page.Reset() 220 for page in self._evolPages: 221 page.Reset() 222 self.UpdateMRML() # update extent values 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() ### scripted module node has changed, update the GUI with the values stored to the node 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
285 - def UpdateMRML(self):
286 287 ### create the node or update all parameters from gui 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 ### save the current flow state 356 node.SetParameter('state',self._state) 357 358 ### save the raised tab to the node 359 node.SetParameter('raisedInitializationPageID', str(self._advancedInitTabs.GetRaisedPageId())) 360 node.SetParameter('raisedEvolutionPageID', str(self._advancedEvolTabs.GetRaisedPageId())) 361 362 ### all needed values set, this is now a valid VMTKParameters node 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
383 - def UpdateGUI(self):
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 ### old node 394 ### set the values of the node into the GUI 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 ### select the connected inVolume 406 if node.GetParameter('InputVolumeRef')=="None": 407 self._helper.debug("no inputVolumeRef so far..") 408 self.UnLockInitInterface(0) 409 if self._inVolumeSelector.GetSelected(): 410 # update input volume to current selection 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 # no input volume at all 418 # raise first page 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 ### InputVolumeRef is set, test if it points to a valid node 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 # update view of slice and 3d 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 #showModel? 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 #showModel? 490 491 ### raise the correct initialization tab 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 # new node 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 ### reset all states 524 self.UpdateMRML() 525 for page in self._initPages: 526 page.Reset() 527 for page in self._evolPages: 528 page.Reset() 529 self.UpdateMRML() # two times MRML update because of threshold slider 530 531 532 ### parameter Node changed, reset interactive mode 533 self._helper.SetIsInteractiveMode(0,None) 534 535 self.UpdateGUIByState() 536 537 self._helper.debug("main UpdateGUI end")
538
539 - def ProcessMRMLEvents(self,caller,event):
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
546 - def BuildGUI(self):
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 # initialization tabs start here 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 # init merge and end frame 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 # evolution tabs start here 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 # evol undo and end frame 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
763 - def TearDownGUI(self):
764 765 self._helper.debug("main TearDownGUI called") 766 767 if self.GetUIPanel().GetUserInterfaceManager(): 768 self.GetUIPanel().RemovePage("Level-Set Segmentation")
769
770 - def GetHelper(self):
771 return self._helper
772
773 - def GetMyLogic(self):
774 return self._logic
775
776 - def UnLockInitInterface(self,action):
777 778 self._advancedInitTabs.SetEnabled(action)
779
780 - def UnLockEvolInterface(self,action):
781 782 self._advancedEvolTabs.SetEnabled(action)
783 784 785
786 - def SetUpdatingOn(self):
787 self._updating = 1
788
789 - def SetUpdatingOff(self):
790 self._updating = 0
791
792 - def ChangeInfoLabel(self,text):
793 self._infoLabel.SetText(text) 794 self._infoLabel.SetImageToPredefinedIcon(20023) 795 self._infoLabel.SetCompoundModeToLeft()
796 797 798 799 # state machine for merge and init flow
800 - def UpdateGUIByState(self):
801 802 self._helper.debug("Updating the GUI using state: " + str(self._state)) 803 804 self._advancedInitFrame.CollapseFrame() 805 self.UnLockInitInterface(0) # lock init interface 806 self._advancedInitNewButton.SetEnabled(0) 807 self._advancedInitRemoveLastButton.SetEnabled(0) 808 self._advancedInitEndButton.SetEnabled(0) 809 810 self._advancedEvolFrame.CollapseFrame() 811 self.UnLockEvolInterface(0) # lock evol interface 812 self._advancedEvolRemoveLastButton.SetEnabled(0) 813 self._advancedEvolEndButton.SetEnabled(0) 814 815 if self._state==-1: 816 # no input volume 817 self.ChangeInfoLabel("Input volume needed!") 818 819 820 elif self._state==0: 821 # input volume valid 822 823 self._helper.debug("mode 0") 824 self.ChangeInfoLabel("Choose initialization method..") 825 self._advancedInitFrame.ExpandFrame() 826 self.UnLockInitInterface(1) # unlock init interface 827 828 elif self._state==1: 829 # one init done 830 # collapse init tab frame 831 # activate add button 832 # activate undo button 833 # activate finish button 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 # undo pressed 844 # dont know yet 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 # finish pressed 853 # enable evolution frame 854 # deenable init frame 855 # deenable all init buttons 856 # enable all evolve buttons 857 self._helper.debug("mode 3") 858 self.ChangeInfoLabel("Choose evolution method..") 859 860 self._advancedEvolFrame.ExpandFrame() 861 self.UnLockEvolInterface(1) # unlock evol interface 862 self._advancedEvolRemoveLastButton.SetEnabled(0) 863 self._advancedEvolEndButton.SetEnabled(0) 864 865 elif self._state == 4: 866 # evolution done 867 self._helper.debug("mode 4") 868 self.ChangeInfoLabel("Evolution done. Accept?") 869 self._advancedEvolRemoveLastButton.SetEnabled(1) 870 self._advancedEvolEndButton.SetEnabled(1)
871