def __init__(self, parent):
    vLayout = qt.QVBoxLayout(parent)
    hLayout = qt.QHBoxLayout()

    self.icon = qt.QLabel()
    self.icon.setPixmap(_dialogIcon(qt.QStyle.SP_MessageBoxQuestion))
    hLayout.addWidget(self.icon, 0)

    self.label = qt.QLabel()
    self.label.wordWrap = True
    hLayout.addWidget(self.label, 1)

    vLayout.addLayout(hLayout)

    self.moduleList = qt.QListWidget()
    self.moduleList.selectionMode = qt.QAbstractItemView.NoSelection
    vLayout.addWidget(self.moduleList)

    self.addToSearchPaths = qt.QCheckBox()
    vLayout.addWidget(self.addToSearchPaths)

    self.enableDeveloperMode = qt.QCheckBox()
    self.enableDeveloperMode.text = "Enable developer mode"
    self.enableDeveloperMode.toolTip = "Sets the 'Developer mode' application option to enabled. Enabling developer mode is recommended while developing scripted modules, as it makes the Reload and Testing section displayed in the module user interface."
    self.enableDeveloperMode.checked = True
    vLayout.addWidget(self.enableDeveloperMode)

    self.buttonBox = qt.QDialogButtonBox()
    self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Yes |
                                      qt.QDialogButtonBox.No)
    vLayout.addWidget(self.buttonBox)
Example #2
0
  def open(self):
    # main dialog
    self.dialog = qt.QDialog(slicer.util.mainWindow())
    self.dialog.setWindowTitle('Send DICOM Study')
    self.dialog.setWindowModality(1)
    layout = qt.QVBoxLayout()
    self.dialog.setLayout(layout)

    self.studyLabel = qt.QLabel('Send %d items to destination' % len(self.files))
    layout.addWidget(self.studyLabel)

    # Send Parameters
    self.dicomFrame = qt.QFrame(self.dialog)
    self.dicomFormLayout = qt.QFormLayout()
    self.dicomFrame.setLayout(self.dicomFormLayout)
    self.dicomEntries = {}
    self.dicomParameters = {
      "Destination Address": self.sendAddress,
      "Destination Port": self.sendPort
    }
    for label in self.dicomParameters.keys():
      self.dicomEntries[label] = qt.QLineEdit()
      self.dicomEntries[label].text = self.dicomParameters[label]
      self.dicomFormLayout.addRow(label+": ", self.dicomEntries[label])
    layout.addWidget(self.dicomFrame)

    # button box
    bbox = qt.QDialogButtonBox(self.dialog)
    bbox.addButton(bbox.Ok)
    bbox.addButton(bbox.Cancel)
    bbox.connect('accepted()', self.onOk)
    bbox.connect('rejected()', self.onCancel)
    layout.addWidget(bbox)

    self.dialog.open()
  def createUserInterface(self):
    self.__layout = self.__parent.createUserInterface()
    
    self.__spacerLabel = qt.QLabel(" ")      
    self.__layout.addRow(self.__spacerLabel)
      
#    self.__segmentationSectionLabel = qt.QLabel("Fix the Level-set Segmentation:")     
#    self.__layout.addRow(self.__segmentationSectionLabel)
      
    self.__ioAdvancedPanel = qt.QFrame(self)
    print "testss"
    self.__ioAdvancedPanel.setFrameStyle(6)
    self.__layout.addRow(self.__ioAdvancedPanel)
#    self.__ioAdvancedToggle.connect("clicked()", self.onIOAdvancedToggle) 
    
    ioAdvancedFormLayout = qt.QFormLayout(self.__ioAdvancedPanel)
          
      
    self.__buttonBox = qt.QDialogButtonBox() 
    self.__resetButton = self.__buttonBox.addButton(self.__buttonBox.RestoreDefaults)
    self.__resetButton.text = "Undersegmentation"
    self.__resetButton.toolTip = "Click to perfom an Undersegmentation."
    self.__previewButton = self.__buttonBox.addButton(self.__buttonBox.Discard)
    self.__previewButton.setIcon(qt.QIcon())
    self.__previewButton.text = "Oversegmentation"
    self.__previewButton.toolTip = "Click to perfom an Oversegmentation."
#      self.__startButton = self.__buttonBox.addButton(self.__buttonBox.Apply)
#      self.__startButton.setIcon(qt.QIcon())
#      self.__startButton.text = "Start!"
#      self.__startButton.enabled = False
#      self.__startButton.toolTip = "Click to start the filtering."
    ioAdvancedFormLayout.addWidget(self.__buttonBox)
    def __init__(self, parent):
        vLayout = qt.QVBoxLayout(parent)
        formLayout = qt.QFormLayout()

        self.nameEdit = qt.QLineEdit()
        formLayout.addRow("Name:", self.nameEdit)

        self.categoryEdit = qt.QLineEdit()
        formLayout.addRow("Category:", self.categoryEdit)

        self.descriptionEdit = qt.QTextEdit()
        self.descriptionEdit.acceptRichText = False
        formLayout.addRow("Description:", self.descriptionEdit)

        self.contributorsList = EditableTreeWidget()
        self.contributorsList.rootIsDecorated = False
        self.contributorsList.selectionBehavior = qt.QAbstractItemView.SelectRows
        self.contributorsList.selectionMode = qt.QAbstractItemView.ExtendedSelection
        self.contributorsList.setHeaderLabels(["Name", "Organization"])
        formLayout.addRow("Contributors:", self.contributorsList)

        vLayout.addLayout(formLayout)
        vLayout.addStretch(1)

        self.buttonBox = qt.QDialogButtonBox()
        self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Ok
                                          | qt.QDialogButtonBox.Cancel)
        vLayout.addWidget(self.buttonBox)
Example #5
0
    def __init__(self, parent):
        vLayout = qt.QVBoxLayout(parent)
        hLayout = qt.QHBoxLayout()

        self.icon = qt.QLabel()
        self.icon.setPixmap(_dialogIcon(qt.QStyle.SP_MessageBoxQuestion))
        hLayout.addWidget(self.icon, 0)

        self.label = qt.QLabel()
        self.label.wordWrap = True
        hLayout.addWidget(self.label, 1)

        vLayout.addLayout(hLayout)

        self.moduleList = qt.QListWidget()
        self.moduleList.selectionMode = qt.QAbstractItemView.NoSelection
        vLayout.addWidget(self.moduleList)

        self.addToSearchPaths = qt.QCheckBox()
        vLayout.addWidget(self.addToSearchPaths)

        self.buttonBox = qt.QDialogButtonBox()
        self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Yes
                                          | qt.QDialogButtonBox.No)
        vLayout.addWidget(self.buttonBox)
Example #6
0
 def __createButtons(self):
     """
     As stated.
     """
     self.addButton = qt.QPushButton()
     self.addButton.setText("Add")
     self.addButton.setEnabled(False)
     self.cancelButton = qt.QPushButton()
     self.cancelButton.setText("Cancel")
     self.buttonRow = qt.QDialogButtonBox()
     self.buttonRow.addButton(self.cancelButton, 2)
     self.buttonRow.addButton(self.addButton, 0)
     self.buttonRow.connect('clicked(QAbstractButton*)',
                            self.__onButtonClicked)
Example #7
0
  def createUserInterface( self ):
    '''
    '''
    self.buttonBoxHints = self.ButtonBoxHidden

    self.__layout = self.__parent.createUserInterface()

    # let's load all tasks
    self.loadTasks()
    self.loadPreprocessingTasks()

    selectTaskLabel = qt.QLabel( 'Select Task' )
    selectTaskLabel.setFont( self.__parent.getBoldFont() )
    self.__layout.addRow( selectTaskLabel )

    self.__taskComboBox = qt.QComboBox()
    self.__taskComboBox.toolTip = "Choose a task."

    # fill the comboBox with the taskNames
    self.__taskComboBox.addItems( self.getTaskNames() )
    # TODO select MRI Human Brain as default
    self.__taskComboBox.connect( 'currentIndexChanged(int)', self.onTaskSelected )
    self.__layout.addRow( Helper.CreateSpace( 20 ), self.__taskComboBox )

    # add empty row
    self.__layout.addRow( "", qt.QWidget() )

    chooseModeLabel = qt.QLabel( 'Choose Mode' )
    chooseModeLabel.setFont( self.__parent.getBoldFont() )
    self.__layout.addRow( chooseModeLabel )

    self.__buttonBox = qt.QDialogButtonBox()
    simpleButton = self.__buttonBox.addButton( self.__buttonBox.Discard )
    simpleButton.setIcon( qt.QIcon() )
    simpleButton.text = "Simple"
    simpleButton.toolTip = "Click to use the simple mode."
    advancedButton = self.__buttonBox.addButton( self.__buttonBox.Apply )
    advancedButton.setIcon( qt.QIcon() )
    advancedButton.text = "Advanced"
    advancedButton.toolTip = "Click to use the advanced mode."
    self.__layout.addWidget( self.__buttonBox )

    # connect the simple and advanced buttons
    simpleButton.connect( 'clicked()', self.goSimple )
    advancedButton.connect( 'clicked()', self.goAdvanced )
Example #8
0
  def onTaskSelected( self ):
    '''
    '''
    index = self.__taskComboBox.currentIndex
    taskName = self.__taskComboBox.currentText

    # re-enable the simple and advanced buttons
    self.__buttonBox.enabled = True

    if taskName == self.__newTaskString:
      # create new task was selected

      # disable the simple and advanced buttons
      self.__buttonBox.enabled = False

      # create new dialog
      self.__d = qt.QDialog()
      dLayout = qt.QFormLayout( self.__d )

      self.__nameEdit = qt.QLineEdit()
      dLayout.addRow( 'New Task Name:', self.__nameEdit )

      self.__preprocessingComboBox = qt.QComboBox()
      list = self.__preprocessingTasksList.keys()
      list.sort( lambda x, y: cmp( x.lower(), y.lower() ) )
      self.__preprocessingComboBox.addItems( list )
      # also, add None
      self.__preprocessingComboBox.addItem( 'None' )
      dLayout.addRow( 'Pre-processing:', self.__preprocessingComboBox )

      buttonBox = qt.QDialogButtonBox()
      #cancelButton = buttonBox.addButton(buttonBox.Discard)
      #cancelButton.text = 'Cancel'
      okButton = buttonBox.addButton( buttonBox.Apply )
      okButton.setIcon( qt.QIcon() )
      okButton.text = 'Apply'
      okButton.connect( 'clicked()', self.createNewTask )
      dLayout.addWidget( buttonBox )

      self.__d.setModal( True )
      self.__d.show()
    def __init__(self, parent):
        self.vLayout = qt.QVBoxLayout(parent)
        self.formLayout = qt.QFormLayout()

        self.componentName = qt.QLineEdit()
        self.formLayout.addRow("Name:", self.componentName)

        self.componentType = qt.QComboBox()
        self.formLayout.addRow("Type:", self.componentType)

        self.destination = ctk.ctkPathLineEdit()
        self.destination.filters = ctk.ctkPathLineEdit.Dirs
        self.formLayout.addRow("Destination:", self.destination)

        self.vLayout.addLayout(self.formLayout)
        self.vLayout.addStretch(1)

        self.buttonBox = qt.QDialogButtonBox()
        self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Ok
                                          | qt.QDialogButtonBox.Cancel)
        self.vLayout.addWidget(self.buttonBox)
Example #10
0
    def open(self):

        # main dialog
        self.dialog = qt.QDialog(slicer.util.mainWindow())
        self.dialog.setWindowTitle('Export to DICOM Study')
        self.dialog.setWindowModality(1)
        layout = qt.QVBoxLayout()
        self.dialog.setLayout(layout)

        self.studyLabel = qt.QLabel('Attach Data to Study: %s' % self.studyUID)
        layout.addWidget(self.studyLabel)

        # scene or volume option
        self.selectFrame = qt.QFrame(self.dialog)
        layout.addWidget(self.selectFrame)
        self.selectLayout = qt.QGridLayout()
        self.selectFrame.setLayout(self.selectLayout)
        self.exportScene = qt.QRadioButton("Export Entire Scene",
                                           self.selectFrame)
        self.exportScene.setToolTip(
            "Create a Slicer Data Bundle in a DICOM Private Creator\n(Only compatible with Slicer)"
        )
        self.exportVolume = qt.QRadioButton("Export Selected Volume",
                                            self.selectFrame)
        self.exportVolume.setToolTip(
            "Create a compatible DICOM series of slice images")
        self.exportVolume.checked = True
        self.selectLayout.addWidget(self.exportScene, 0, 0)
        self.selectLayout.addWidget(self.exportVolume, 1, 0)
        self.exportScene.connect('toggled(bool)', self.onExportRadio)
        self.exportVolume.connect('toggled(bool)', self.onExportRadio)

        # select volume
        self.volumeSelector = slicer.qMRMLNodeComboBox(self.dialog)
        self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "")
        self.volumeSelector.selectNodeUponCreation = False
        self.volumeSelector.addEnabled = False
        self.volumeSelector.noneEnabled = False
        self.volumeSelector.removeEnabled = False
        self.volumeSelector.showHidden = False
        self.volumeSelector.showChildNodeTypes = False
        self.volumeSelector.setMRMLScene(slicer.mrmlScene)
        self.volumeSelector.setToolTip("Pick the label map to edit")
        self.selectLayout.addWidget(self.volumeSelector, 1, 1)

        # DICOM Parameters
        self.dicomFrame = qt.QFrame(self.dialog)
        self.dicomFormLayout = qt.QFormLayout()
        self.dicomFrame.setLayout(self.dicomFormLayout)
        self.dicomEntries = {}
        exporter = DICOMLib.DICOMExporter(self.studyUID)
        self.dicomParameters = exporter.parametersFromStudy()
        self.dicomParameters['Series Description'] = '3D Slicer Export'
        for label in self.dicomParameters.keys():
            self.dicomEntries[label] = qt.QLineEdit()
            self.dicomEntries[label].text = self.dicomParameters[label]
            self.dicomFormLayout.addRow(label + ": ", self.dicomEntries[label])
        layout.addWidget(self.dicomFrame)

        # button box
        bbox = qt.QDialogButtonBox(self.dialog)
        bbox.addButton(bbox.Ok)
        bbox.addButton(bbox.Cancel)
        bbox.connect('accepted()', self.onOk)
        bbox.connect('rejected()', self.onCancel)
        layout.addWidget(bbox)

        self.dialog.open()
Example #11
0
    def __init__(self, MODULE, saveWorkflow):
        """ Init function.
        """

        
        #--------------------
        # Call parent.
        #--------------------
        super(XnatFileSaveDialog, self).__init__(MODULE, saveWorkflow)

        self.MODULE = MODULE
        
        
        #--------------------
        # Determine filename.
        #--------------------
        self.fileName = None


        #--------------------
        # Dialog setup.
        #--------------------
        self.inputIndex = 0  
        self.noticeLabel = qt.QLabel("")

  

        #--------------------
        # Window setup.   
        #--------------------
        self.setNumDialogs(1, {'0':qt.QDialog(slicer.util.mainWindow())}) 
        self.dialogs[0].setFixedWidth(600)
        self.dialogs[0].setWindowModality(1)


        
        #--------------------
        # Label button and fileLine.
        #--------------------
        self.saveButtonStr = "Save"
        fileLineLabel = qt.QLabel("File Name: ")

        

        #--------------------
        # Set fileline text (where user enters the file
        # name) 
        #--------------------
        self.fileLine = qt.QLineEdit(self.MODULE.View.sessionManager.sessionArgs['fileName'].split(XnatSlicerGlobals.DEFAULT_SLICER_EXTENSION)[0])

        

        #--------------------
        # Create file name input layout.
        #--------------------
        fileInputLayout = qt.QHBoxLayout()
        fileInputLayout.addWidget(fileLineLabel)
        fileInputLayout.addWidget(self.fileLine)
        dialogLayout = qt.QVBoxLayout()
     

        
        #--------------------
        # Create the buttons.
        #--------------------
        saveButton = qt.QPushButton()
        saveButton.setText(self.saveButtonStr)
        cancelButton = qt.QPushButton()
        cancelButton.setText("Cancel")
        buttonRow = qt.QDialogButtonBox()
        buttonRow.addButton(saveButton, 0)
        buttonRow.addButton(cancelButton, 2)               
        

        
        #--------------------
        # Put buttons in the bottom row.
        #--------------------
        bottomRow = qt.QHBoxLayout()
        bottomRow.addWidget(buttonRow)

        

        #--------------------
        # Add the layouts to the dialog.
        #--------------------
        dialogLayout.addLayout(fileInputLayout)
        dialogLayout.addWidget(self.noticeLabel)
        dialogLayout.addLayout(bottomRow)
        self.dialogs[0].setLayout(dialogLayout)


        
        #--------------------
        # Set onClick connections.
        #--------------------  
        buttonRow.connect('clicked(QAbstractButton*)', self.onButtonClicked)
    def createUserInterface(self):
        '''
    '''

        self.buttonBoxHints = self.ButtonBoxHidden

        self.__layout = super(EMSegmentSelectTaskStep,
                              self).createUserInterface()

        # let's load all tasks
        self.loadTasks()
        self.loadPreprocessingTasks()

        eminfoLabel = qt.QLabel(
            'This module provides EM segmentation based on an atlas.\nBy defining an anatomical tree, different structures can be segmented.\n\n'
        )
        eminfoLabel.setFont(self.getBoldFont())
        self.__layout.addRow(eminfoLabel)

        selectTaskLabel = qt.QLabel('Select Task')
        selectTaskLabel.setFont(self.getBoldFont())
        self.__layout.addRow(selectTaskLabel)

        self.__taskComboBox = qt.QComboBox()
        self.__taskComboBox.toolTip = "Choose a task."

        # fill the comboBox with the taskNames
        self.__taskComboBox.addItems(self.getTaskNames())
        self.__taskComboBox.setCurrentIndex(
            self.__taskComboBox.findText('MRI Human Brain'))
        self.__taskComboBox.connect('currentIndexChanged(int)',
                                    self.onTaskSelected)
        self.__layout.addRow(Helper.CreateSpace(20), self.__taskComboBox)

        infoLabel = qt.QLabel(
            'For more information about the tasks click here:')
        self.__layout.addRow(Helper.CreateSpace(20), infoLabel)

        urlLabel = qt.QLabel(
            '<a href=http://www.slicer.org/slicerWiki/index.php/EMSegmenter-Tasks>http://www.slicer.org/slicerWiki/index.php/EMSegmenter-Tasks</a>'
        )
        urlLabel.setOpenExternalLinks(True)
        self.__layout.addRow(Helper.CreateSpace(20), urlLabel)

        # add empty row
        self.__layout.addRow("", qt.QWidget())
        # add empty row
        self.__layout.addRow("", qt.QWidget())
        # add empty row
        self.__layout.addRow("", qt.QWidget())
        # add empty row
        self.__layout.addRow("", qt.QWidget())

        chooseModeLabel = qt.QLabel('Choose Mode')
        chooseModeLabel.setFont(self.getBoldFont())
        self.__layout.addRow(chooseModeLabel)

        self.__buttonBox = qt.QDialogButtonBox()
        simpleButton = self.__buttonBox.addButton(self.__buttonBox.Discard)
        simpleButton.setIcon(qt.QIcon())
        simpleButton.text = "Simple"
        simpleButton.toolTip = "Click to use the simple mode."
        advancedButton = self.__buttonBox.addButton(self.__buttonBox.Apply)
        advancedButton.setIcon(qt.QIcon())
        advancedButton.text = "Advanced"
        advancedButton.toolTip = "Click to use the advanced mode."
        self.__layout.addWidget(self.__buttonBox)

        # connect the simple and advanced buttons
        simpleButton.connect('clicked()', self.goSimple)
        advancedButton.connect('clicked()', self.goAdvanced)
Example #13
0
    def __init__(self, parent, MODULE=None):
        """ Init function.
        """

        self.MODULE = MODULE

        #--------------------
        # Call parent init.
        #--------------------
        super(XnatFolderMaker, self).__init__()

        #--------------------
        # Adjust window features.
        #--------------------
        self.setWindowTitle("Add Folder to Xnat")
        self.setWindowModality(2)

        #--------------------
        # Hide the widget initially.
        #--------------------
        self.hide()

        #--------------------
        # Set fixed width.
        #--------------------
        self.setFixedWidth(500)
        self.setFixedHeight(250)

        #--------------------
        # Make the xsiList for experiment
        # creation.
        #--------------------
        self.xsiList = qt.QComboBox()
        self.xsiList.addItems([
            key
            for key, value in self.MODULE.GLOBALS.XNAT_XSI_TYPES.iteritems()
        ])

        #--------------------
        # Displayable wigets.
        #--------------------
        self.levelLabels = {}
        self.nameLabels = {}
        self.lineEdits = {}
        self.errorLines = {}
        self.levelLayouts = {}
        self.labelLineStacks = {}
        self.levelRows = {}

        #--------------------
        # Make the buttons:
        # create, cancel,
        # etc.
        #--------------------
        self.addButton = qt.QPushButton()
        self.addButton.setText("Add")
        self.addButton.setEnabled(False)
        self.cancelButton = qt.QPushButton()
        self.cancelButton.setText("Cancel")
        buttonRow = qt.QDialogButtonBox()
        buttonRow.addButton(self.cancelButton, 2)
        buttonRow.addButton(self.addButton, 0)

        #-------------------
        # Create the keys in the displayable widgets.
        #--------------------
        self.addFolderXnatLevels = ['projects', 'subjects', 'experiments']
        for level in self.addFolderXnatLevels:

            #
            # Labels (name and level)
            #
            self.levelLabels[level] = qt.QLabel(self)
            self.levelLabels[level].setFixedHeight(25)
            self.nameLabels[level] = qt.QLabel(self)
            self.nameLabels[level].setFixedHeight(25)

            #
            # Line edits
            #
            self.lineEdits[level] = qt.QLineEdit(self)
            self.lineEdits[level].installEventFilter(self)
            self.lineEdits[level].setFixedHeight(25)

            #
            # Error lines
            #
            self.errorLines[level] = qt.QLabel(self)
            self.errorLines[level].setTextFormat(1)
            self.errorLines[level].setFixedHeight(25)

            #
            # Make the label-line stacks, adjusting
            # for 'experiments' as necessary.
            #
            self.labelLineStacks[level] = qt.QStackedLayout()
            if level == 'experiments':
                experimentRow = qt.QHBoxLayout()
                experimentRow.addWidget(self.xsiList)
                experimentRow.addWidget(self.lineEdits[level])
                experimentWidget = qt.QWidget()
                experimentWidget.setLayout(experimentRow)
                self.labelLineStacks[level].addWidget(experimentWidget)
            else:
                self.labelLineStacks[level].addWidget(self.nameLabels[level])
                self.labelLineStacks[level].addWidget(self.lineEdits[level])

            #
            # make row widgets
            #
            self.levelRows[level] = qt.QWidget(self)
            levelRowLayout = qt.QGridLayout()
            levelRowLayout.addWidget(self.levelLabels[level], 0, 0)
            levelRowLayout.addLayout(self.labelLineStacks[level], 0, 1)
            levelRowLayout.addWidget(self.errorLines[level], 1, 1)
            self.levelRows[level].setLayout(levelRowLayout)

        #--------------------
        # Connect button click events.
        #--------------------
        buttonRow.connect('clicked(QAbstractButton*)', self.onAddButtonClicked)

        #--------------------
        # Make the mainLayout and add all widgets.
        #--------------------
        self.mainLayout = qt.QVBoxLayout()
        for level in self.addFolderXnatLevels:
            self.mainLayout.addWidget(self.levelRows[level])
        self.mainLayout.addStretch()
        self.mainLayout.addWidget(buttonRow)
        self.setLayout(self.mainLayout)
    def setup(self):

        # check if the SlicerVmtk module is installed properly
        # self.__vmtkInstalled = SlicerVmtkCommonLib.Helper.CheckIfVmtkIsInstalled()
        # Helper.Debug("VMTK found: " + self.__vmtkInstalled)

        #
        # the I/O panel
        #

        ioCollapsibleButton = ctk.ctkCollapsibleButton()
        ioCollapsibleButton.text = "Input/Output"
        self.layout.addWidget(ioCollapsibleButton)

        ioFormLayout = qt.QFormLayout(ioCollapsibleButton)

        # inputVolume selector
        self.__inputVolumeNodeSelector = slicer.qMRMLNodeComboBox()
        self.__inputVolumeNodeSelector.objectName = 'inputVolumeNodeSelector'
        self.__inputVolumeNodeSelector.toolTip = "Select the input volume. This should always be the original image and not a vesselness image, if possible."
        self.__inputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode']
        self.__inputVolumeNodeSelector.noneEnabled = False
        self.__inputVolumeNodeSelector.addEnabled = False
        self.__inputVolumeNodeSelector.removeEnabled = False
        self.__inputVolumeNodeSelector.addAttribute("vtkMRMLScalarVolumeNode",
                                                    "LabelMap", "0")
        ioFormLayout.addRow("Input Volume:", self.__inputVolumeNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.__inputVolumeNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')
        self.__inputVolumeNodeSelector.connect(
            'currentNodeChanged(vtkMRMLNode*)', self.onInputVolumeChanged)
        self.__inputVolumeNodeSelector.connect('nodeActivated(vtkMRMLNode*)',
                                               self.onInputVolumeChanged)

        # seed selector
        self.__seedFiducialsNodeSelector = slicer.qMRMLNodeComboBox()
        self.__seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector'
        self.__seedFiducialsNodeSelector.toolTip = "Select a hierarchy containing the fiducials to use as Seeds."
        self.__seedFiducialsNodeSelector.nodeTypes = [
            'vtkMRMLAnnotationHierarchyNode'
        ]
        self.__seedFiducialsNodeSelector.baseName = "Seeds"
        self.__seedFiducialsNodeSelector.noneEnabled = False
        self.__seedFiducialsNodeSelector.addEnabled = False
        self.__seedFiducialsNodeSelector.removeEnabled = False
        ioFormLayout.addRow("Seeds:", self.__seedFiducialsNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.__seedFiducialsNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')

        self.__ioAdvancedToggle = qt.QCheckBox("Show Advanced I/O Properties")
        self.__ioAdvancedToggle.setChecked(False)
        ioFormLayout.addRow(self.__ioAdvancedToggle)

        #
        # I/O advanced panel
        #

        self.__ioAdvancedPanel = qt.QFrame(ioCollapsibleButton)
        self.__ioAdvancedPanel.hide()
        self.__ioAdvancedPanel.setFrameStyle(6)
        ioFormLayout.addRow(self.__ioAdvancedPanel)
        self.__ioAdvancedToggle.connect("clicked()", self.onIOAdvancedToggle)

        ioAdvancedFormLayout = qt.QFormLayout(self.__ioAdvancedPanel)

        # inputVolume selector
        self.__vesselnessVolumeNodeSelector = slicer.qMRMLNodeComboBox()
        self.__vesselnessVolumeNodeSelector.objectName = 'vesselnessVolumeNodeSelector'
        self.__vesselnessVolumeNodeSelector.toolTip = "Select the input vesselness volume. This is optional input."
        self.__vesselnessVolumeNodeSelector.nodeTypes = [
            'vtkMRMLScalarVolumeNode'
        ]
        self.__vesselnessVolumeNodeSelector.noneEnabled = True
        self.__vesselnessVolumeNodeSelector.addEnabled = False
        self.__vesselnessVolumeNodeSelector.removeEnabled = False
        self.__vesselnessVolumeNodeSelector.addAttribute(
            "vtkMRMLScalarVolumeNode", "LabelMap", "0")
        ioAdvancedFormLayout.addRow("Vesselness Volume:",
                                    self.__vesselnessVolumeNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.__vesselnessVolumeNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')
        self.__vesselnessVolumeNodeSelector.setCurrentNode(None)

        # stopper selector
        self.__stopperFiducialsNodeSelector = slicer.qMRMLNodeComboBox()
        self.__stopperFiducialsNodeSelector.objectName = 'stopperFiducialsNodeSelector'
        self.__stopperFiducialsNodeSelector.toolTip = "Select a hierarchy containing the fiducials to use as Stoppers. Whenever one stopper is reached, the segmentation stops."
        self.__stopperFiducialsNodeSelector.nodeTypes = [
            'vtkMRMLAnnotationHierarchyNode'
        ]
        self.__stopperFiducialsNodeSelector.baseName = "Stoppers"
        self.__stopperFiducialsNodeSelector.noneEnabled = False
        self.__stopperFiducialsNodeSelector.addEnabled = True
        self.__stopperFiducialsNodeSelector.removeEnabled = False
        ioAdvancedFormLayout.addRow("Stoppers:",
                                    self.__stopperFiducialsNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.__stopperFiducialsNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')

        # outputVolume selector
        self.__outputVolumeNodeSelector = slicer.qMRMLNodeComboBox()
        self.__outputVolumeNodeSelector.toolTip = "Select the output labelmap."
        self.__outputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode']
        self.__outputVolumeNodeSelector.baseName = "LevelSetSegmentation"
        self.__outputVolumeNodeSelector.noneEnabled = False
        self.__outputVolumeNodeSelector.addEnabled = True
        self.__outputVolumeNodeSelector.selectNodeUponCreation = True
        self.__outputVolumeNodeSelector.addAttribute("vtkMRMLScalarVolumeNode",
                                                     "LabelMap", "1")
        self.__outputVolumeNodeSelector.removeEnabled = True
        ioAdvancedFormLayout.addRow("Output Labelmap:",
                                    self.__outputVolumeNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.__outputVolumeNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')

        # outputModel selector
        self.__outputModelNodeSelector = slicer.qMRMLNodeComboBox()
        self.__outputModelNodeSelector.objectName = 'outputModelNodeSelector'
        self.__outputModelNodeSelector.toolTip = "Select the output model."
        self.__outputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode']
        self.__outputModelNodeSelector.baseName = "LevelSetSegmentationModel"
        self.__outputModelNodeSelector.hideChildNodeTypes = [
            'vtkMRMLAnnotationNode'
        ]  # hide all annotation nodes
        self.__outputModelNodeSelector.noneEnabled = False
        self.__outputModelNodeSelector.addEnabled = True
        self.__outputModelNodeSelector.selectNodeUponCreation = True
        self.__outputModelNodeSelector.removeEnabled = True
        ioAdvancedFormLayout.addRow("Output Model:",
                                    self.__outputModelNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.__outputModelNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')

        #
        # the segmentation panel
        #

        segmentationCollapsibleButton = ctk.ctkCollapsibleButton()
        segmentationCollapsibleButton.text = "Segmentation"
        self.layout.addWidget(segmentationCollapsibleButton)

        segmentationFormLayout = qt.QFormLayout(segmentationCollapsibleButton)

        # Threshold slider
        thresholdLabel = qt.QLabel()
        thresholdLabel.text = "Thresholding" + SlicerVmtkCommonLib.Helper.CreateSpace(
            7)
        thresholdLabel.toolTip = "Choose the intensity range to segment."
        thresholdLabel.setAlignment(4)
        segmentationFormLayout.addRow(thresholdLabel)

        self.__thresholdSlider = slicer.qMRMLRangeWidget()
        segmentationFormLayout.addRow(self.__thresholdSlider)
        self.__thresholdSlider.connect('valuesChanged(double,double)',
                                       self.onThresholdSliderChanged)

        self.__segmentationAdvancedToggle = qt.QCheckBox(
            "Show Advanced Segmentation Properties")
        self.__segmentationAdvancedToggle.setChecked(False)
        segmentationFormLayout.addRow(self.__segmentationAdvancedToggle)

        #
        # segmentation advanced panel
        #

        self.__segmentationAdvancedPanel = qt.QFrame(
            segmentationCollapsibleButton)
        self.__segmentationAdvancedPanel.hide()
        self.__segmentationAdvancedPanel.setFrameStyle(6)
        segmentationFormLayout.addRow(self.__segmentationAdvancedPanel)
        self.__segmentationAdvancedToggle.connect(
            "clicked()", self.onSegmentationAdvancedToggle)

        segmentationAdvancedFormLayout = qt.QFormLayout(
            self.__segmentationAdvancedPanel)

        # inflation slider
        inflationLabel = qt.QLabel()
        inflationLabel.text = "less inflation <-> more inflation" + SlicerVmtkCommonLib.Helper.CreateSpace(
            14)
        inflationLabel.setAlignment(4)
        inflationLabel.toolTip = "Define how fast the segmentation expands."
        segmentationAdvancedFormLayout.addRow(inflationLabel)

        self.__inflationSlider = ctk.ctkSliderWidget()
        self.__inflationSlider.decimals = 0
        self.__inflationSlider.minimum = -100
        self.__inflationSlider.maximum = 100
        self.__inflationSlider.singleStep = 10
        self.__inflationSlider.toolTip = inflationLabel.toolTip
        segmentationAdvancedFormLayout.addRow(self.__inflationSlider)

        # curvature slider
        curvatureLabel = qt.QLabel()
        curvatureLabel.text = "less curvature <-> more curvature" + SlicerVmtkCommonLib.Helper.CreateSpace(
            14)
        curvatureLabel.setAlignment(4)
        curvatureLabel.toolTip = "Choose a high curvature to generate a smooth segmentation."
        segmentationAdvancedFormLayout.addRow(curvatureLabel)

        self.__curvatureSlider = ctk.ctkSliderWidget()
        self.__curvatureSlider.decimals = 0
        self.__curvatureSlider.minimum = -100
        self.__curvatureSlider.maximum = 100
        self.__curvatureSlider.singleStep = 10
        self.__curvatureSlider.toolTip = curvatureLabel.toolTip
        segmentationAdvancedFormLayout.addRow(self.__curvatureSlider)

        # attraction slider
        attractionLabel = qt.QLabel()
        attractionLabel.text = "less attraction to gradient <-> more attraction to gradient" + SlicerVmtkCommonLib.Helper.CreateSpace(
            14)
        attractionLabel.setAlignment(4)
        attractionLabel.toolTip = "Configure how the segmentation travels towards gradient ridges (vessel lumen wall)."
        segmentationAdvancedFormLayout.addRow(attractionLabel)

        self.__attractionSlider = ctk.ctkSliderWidget()
        self.__attractionSlider.decimals = 0
        self.__attractionSlider.minimum = -100
        self.__attractionSlider.maximum = 100
        self.__attractionSlider.singleStep = 10
        self.__attractionSlider.toolTip = attractionLabel.toolTip
        segmentationAdvancedFormLayout.addRow(self.__attractionSlider)

        # iteration spinbox
        self.__iterationSpinBox = qt.QSpinBox()
        self.__iterationSpinBox.minimum = 0
        self.__iterationSpinBox.maximum = 5000
        self.__iterationSpinBox.singleStep = 10
        self.__iterationSpinBox.toolTip = "Choose the number of evolution iterations."
        segmentationAdvancedFormLayout.addRow(
            SlicerVmtkCommonLib.Helper.CreateSpace(100) + "Iterations:",
            self.__iterationSpinBox)

        #
        # Reset, preview and apply buttons
        #

        self.__buttonBox = qt.QDialogButtonBox()
        self.__resetButton = self.__buttonBox.addButton(
            self.__buttonBox.RestoreDefaults)
        self.__resetButton.toolTip = "Click to reset all input elements to default."
        self.__previewButton = self.__buttonBox.addButton(
            self.__buttonBox.Discard)
        self.__previewButton.setIcon(qt.QIcon())
        self.__previewButton.text = "Preview.."
        self.__previewButton.toolTip = "Click to refresh the preview."
        self.__startButton = self.__buttonBox.addButton(self.__buttonBox.Apply)
        self.__startButton.setIcon(qt.QIcon())
        self.__startButton.text = "Start!"
        self.__startButton.enabled = False
        self.__startButton.toolTip = "Click to start the filtering."
        self.layout.addWidget(self.__buttonBox)
        self.__resetButton.connect("clicked()", self.restoreDefaults)
        self.__previewButton.connect("clicked()", self.onRefreshButtonClicked)
        self.__startButton.connect("clicked()", self.onStartButtonClicked)

        # be ready for events
        self.__updating = 0

        # set default values
        self.restoreDefaults()

        # compress the layout
        self.layout.addStretch(1)
Example #15
0
  def setup( self ):

    # check if the SlicerVmtk module is installed properly
    # self.__vmtkInstalled = SlicerVmtkCommonLib.Helper.CheckIfVmtkIsInstalled()
    # Helper.Debug("VMTK found: " + self.__vmtkInstalled)

    #
    # the I/O panel
    #

    ioCollapsibleButton = ctk.ctkCollapsibleButton()
    ioCollapsibleButton.text = "Input/Output"
    self.layout.addWidget( ioCollapsibleButton )

    ioFormLayout = qt.QFormLayout( ioCollapsibleButton )

    # inputVolume selector
    self.__inputVolumeNodeSelector = slicer.qMRMLNodeComboBox()
    self.__inputVolumeNodeSelector.objectName = 'inputVolumeNodeSelector'
    self.__inputVolumeNodeSelector.toolTip = "Select the input volume."
    self.__inputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode']
    self.__inputVolumeNodeSelector.noneEnabled = False
    self.__inputVolumeNodeSelector.addEnabled = False
    self.__inputVolumeNodeSelector.removeEnabled = False
    self.__inputVolumeNodeSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", "0" )
    ioFormLayout.addRow( "Input Volume:", self.__inputVolumeNodeSelector )
    self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)',
                        self.__inputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)' )
    self.__inputVolumeNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onInputVolumeChanged )

    # seed selector
    self.__seedFiducialsNodeSelector = slicer.qMRMLNodeComboBox()
    self.__seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector'
    self.__seedFiducialsNodeSelector.toolTip = "Select a fiducial to use as a Seed to detect the maximal diameter."
    self.__seedFiducialsNodeSelector.nodeTypes = ['vtkMRMLAnnotationFiducialNode']
    self.__seedFiducialsNodeSelector.baseName = "DiameterSeed"
    self.__seedFiducialsNodeSelector.noneEnabled = False
    self.__seedFiducialsNodeSelector.addEnabled = False
    self.__seedFiducialsNodeSelector.removeEnabled = False
    ioFormLayout.addRow( "Seed in largest Vessel:", self.__seedFiducialsNodeSelector )
    self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)',
                        self.__seedFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)' )
    self.__seedFiducialsNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onSeedChanged )

    self.__ioAdvancedToggle = qt.QCheckBox( "Show Advanced Properties" )
    self.__ioAdvancedToggle.setChecked( False )
    ioFormLayout.addRow( self.__ioAdvancedToggle )

    #
    # I/O advanced panel
    #

    self.__ioAdvancedPanel = qt.QFrame( ioCollapsibleButton )
    self.__ioAdvancedPanel.hide()
    self.__ioAdvancedPanel.setFrameStyle( 6 )
    ioFormLayout.addRow( self.__ioAdvancedPanel )
    self.__ioAdvancedToggle.connect( "clicked()", self.onIOAdvancedToggle )

    ioAdvancedFormLayout = qt.QFormLayout( self.__ioAdvancedPanel )

    # lock button
    self.__detectPushButton = qt.QPushButton()
    self.__detectPushButton.text = "Detect parameters automatically"
    self.__detectPushButton.checkable = True
    self.__detectPushButton.checked = True
    # self.__unLockPushButton.connect("clicked()", self.calculateParameters())
    ioAdvancedFormLayout.addRow( self.__detectPushButton )

    # outputVolume selector
    self.__outputVolumeNodeSelector = slicer.qMRMLNodeComboBox()
    self.__outputVolumeNodeSelector.toolTip = "Select the output labelmap."
    self.__outputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode']
    self.__outputVolumeNodeSelector.baseName = "VesselnessFiltered"
    self.__outputVolumeNodeSelector.noneEnabled = False
    self.__outputVolumeNodeSelector.addEnabled = True
    self.__outputVolumeNodeSelector.selectNodeUponCreation = True
    self.__outputVolumeNodeSelector.removeEnabled = True
    ioAdvancedFormLayout.addRow( "Output Volume:", self.__outputVolumeNodeSelector )
    self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)',
                        self.__outputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)' )

    # previewVolume selector
    self.__previewVolumeNodeSelector = slicer.qMRMLNodeComboBox()
    self.__previewVolumeNodeSelector.toolTip = "Select the preview volume."
    self.__previewVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode']
    self.__previewVolumeNodeSelector.baseName = "VesselnessPreview"
    self.__previewVolumeNodeSelector.noneEnabled = False
    self.__previewVolumeNodeSelector.addEnabled = True
    self.__previewVolumeNodeSelector.selectNodeUponCreation = True
    self.__previewVolumeNodeSelector.removeEnabled = True
    ioAdvancedFormLayout.addRow( "Preview Volume:", self.__previewVolumeNodeSelector )
    self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)',
                        self.__previewVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)' )

    self.__minimumDiameterSpinBox = qt.QSpinBox()
    self.__minimumDiameterSpinBox.minimum = 0
    self.__minimumDiameterSpinBox.maximum = 1000
    self.__minimumDiameterSpinBox.singleStep = 1
    self.__minimumDiameterSpinBox.toolTip = "Specify the minimum Diameter manually."
    ioAdvancedFormLayout.addRow( "Minimum Diameter [vx]:", self.__minimumDiameterSpinBox )

    self.__maximumDiameterSpinBox = qt.QSpinBox()
    self.__maximumDiameterSpinBox.minimum = 0
    self.__maximumDiameterSpinBox.maximum = 1000
    self.__maximumDiameterSpinBox.singleStep = 1
    self.__maximumDiameterSpinBox.toolTip = "Specify the maximum Diameter manually."
    ioAdvancedFormLayout.addRow( "Maximum Diameter [vx]:", self.__maximumDiameterSpinBox )

    # add empty row
    ioAdvancedFormLayout.addRow( "", qt.QWidget() )

    # alpha slider
    alphaLabel = qt.QLabel()
    alphaLabel.text = "more Tubes <-> more Plates" + SlicerVmtkCommonLib.Helper.CreateSpace( 16 )
    alphaLabel.setAlignment( 4 )
    alphaLabel.toolTip = "A lower value detects tubes rather than plate-like structures."
    ioAdvancedFormLayout.addRow( alphaLabel )

    self.__alphaSlider = ctk.ctkSliderWidget()
    self.__alphaSlider.decimals = 1
    self.__alphaSlider.minimum = 0.1
    self.__alphaSlider.maximum = 500
    self.__alphaSlider.singleStep = 0.1
    self.__alphaSlider.toolTip = alphaLabel.toolTip
    ioAdvancedFormLayout.addRow( self.__alphaSlider )

    # beta slider
    betaLabel = qt.QLabel()
    betaLabel.text = "more Blobs <-> more Tubes" + SlicerVmtkCommonLib.Helper.CreateSpace( 16 )
    betaLabel.setAlignment( 4 )
    betaLabel.toolTip = "A higher value detects tubes rather than blobs."
    ioAdvancedFormLayout.addRow( betaLabel )

    self.__betaSlider = ctk.ctkSliderWidget()
    self.__betaSlider.decimals = 1
    self.__betaSlider.minimum = 0.1
    self.__betaSlider.maximum = 500
    self.__betaSlider.singleStep = 0.1
    self.__betaSlider.toolTip = betaLabel.toolTip
    ioAdvancedFormLayout.addRow( self.__betaSlider )

    # contrast slider
    contrastLabel = qt.QLabel()
    contrastLabel.text = "low Input Contrast <-> high Input Contrast" + SlicerVmtkCommonLib.Helper.CreateSpace( 14 )
    contrastLabel.setAlignment( 4 )
    contrastLabel.toolTip = "If the intensity contrast in the input image between vessel and background is high, choose a high value else choose a low value."
    ioAdvancedFormLayout.addRow( contrastLabel )

    self.__contrastSlider = ctk.ctkSliderWidget()
    self.__contrastSlider.decimals = 0
    self.__contrastSlider.minimum = 0
    self.__contrastSlider.maximum = 500
    self.__contrastSlider.singleStep = 10
    self.__contrastSlider.toolTip = contrastLabel.toolTip
    ioAdvancedFormLayout.addRow( self.__contrastSlider )

    #
    # Reset, preview and apply buttons
    #

    self.__buttonBox = qt.QDialogButtonBox()
    self.__resetButton = self.__buttonBox.addButton( self.__buttonBox.RestoreDefaults )
    self.__resetButton.toolTip = "Click to reset all input elements to default."
    self.__previewButton = self.__buttonBox.addButton( self.__buttonBox.Discard )
    self.__previewButton.setIcon( qt.QIcon() )
    self.__previewButton.text = "Preview.."
    self.__previewButton.toolTip = "Click to refresh the preview."
    self.__startButton = self.__buttonBox.addButton( self.__buttonBox.Apply )
    self.__startButton.setIcon( qt.QIcon() )
    self.__startButton.text = "Start!"
    self.__startButton.enabled = False
    self.__startButton.toolTip = "Click to start the filtering."
    self.layout.addWidget( self.__buttonBox )
    self.__resetButton.connect( "clicked()", self.restoreDefaults )
    self.__previewButton.connect( "clicked()", self.onRefreshButtonClicked )
    self.__startButton.connect( "clicked()", self.onStartButtonClicked )

    # be ready for events
    self.__updating = 0

    # set default values
    self.restoreDefaults()

    # compress the layout
    self.layout.addStretch( 1 )
    def setup(self):

        # check if the SlicerVmtk4 module is installed properly
        #self.__vmtkInstalled = SlicerVmtk4CommonLib.Helper.CheckIfVmtkIsInstalled()
        #Helper.Debug("VMTK found: " + self.__vmtkInstalled)

        #
        # the I/O panel
        #

        ioCollapsibleButton = ctk.ctkCollapsibleButton()
        ioCollapsibleButton.text = "Input/Output"
        self.layout.addWidget(ioCollapsibleButton)

        ioFormLayout = qt.QFormLayout(ioCollapsibleButton)

        # inputVolume selector
        self.__inputModelNodeSelector = slicer.qMRMLNodeComboBox()
        self.__inputModelNodeSelector.objectName = 'inputModelNodeSelector'
        self.__inputModelNodeSelector.toolTip = "Select the input model."
        self.__inputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode']
        self.__inputModelNodeSelector.hideChildNodeTypes = [
            'vtkMRMLAnnotationNode'
        ]  # hide all annotation nodes
        self.__inputModelNodeSelector.noneEnabled = False
        self.__inputModelNodeSelector.addEnabled = False
        self.__inputModelNodeSelector.removeEnabled = False
        ioFormLayout.addRow("Input Model:", self.__inputModelNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.__inputModelNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')
        self.__inputModelNodeSelector.connect(
            'currentNodeChanged(vtkMRMLNode*)', self.onInputModelChanged)

        # seed selector
        self.__seedFiducialsNodeSelector = slicer.qMRMLNodeComboBox()
        self.__seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector'
        self.__seedFiducialsNodeSelector.toolTip = "Select a fiducial to use as the origin of the Centerline."
        self.__seedFiducialsNodeSelector.nodeTypes = [
            'vtkMRMLAnnotationFiducialNode'
        ]
        self.__seedFiducialsNodeSelector.baseName = "OriginSeed"
        self.__seedFiducialsNodeSelector.noneEnabled = False
        self.__seedFiducialsNodeSelector.addEnabled = False
        self.__seedFiducialsNodeSelector.removeEnabled = False
        ioFormLayout.addRow("Start Point:", self.__seedFiducialsNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.__seedFiducialsNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')
        self.__seedFiducialsNodeSelector.connect(
            'currentNodeChanged(vtkMRMLNode*)', self.onSeedChanged)

        self.__ioAdvancedToggle = qt.QCheckBox("Show Advanced Properties")
        self.__ioAdvancedToggle.setChecked(False)
        ioFormLayout.addRow(self.__ioAdvancedToggle)

        #
        # I/O advanced panel
        #

        self.__ioAdvancedPanel = qt.QFrame(ioCollapsibleButton)
        self.__ioAdvancedPanel.hide()
        self.__ioAdvancedPanel.setFrameStyle(6)
        ioFormLayout.addRow(self.__ioAdvancedPanel)
        self.__ioAdvancedToggle.connect("clicked()", self.onIOAdvancedToggle)

        ioAdvancedFormLayout = qt.QFormLayout(self.__ioAdvancedPanel)

        # outputModel selector
        self.__outputModelNodeSelector = slicer.qMRMLNodeComboBox()
        self.__outputModelNodeSelector.objectName = 'outputModelNodeSelector'
        self.__outputModelNodeSelector.toolTip = "Select the output model for the Centerlines."
        self.__outputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode']
        self.__outputModelNodeSelector.baseName = "CenterlineComputationModel"
        self.__outputModelNodeSelector.hideChildNodeTypes = [
            'vtkMRMLAnnotationNode'
        ]  # hide all annotation nodes
        self.__outputModelNodeSelector.noneEnabled = False
        self.__outputModelNodeSelector.addEnabled = True
        self.__outputModelNodeSelector.selectNodeUponCreation = True
        self.__outputModelNodeSelector.removeEnabled = True
        ioAdvancedFormLayout.addRow("Output Centerline Model:",
                                    self.__outputModelNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.__outputModelNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')

        # voronoiModel selector
        self.__voronoiModelNodeSelector = slicer.qMRMLNodeComboBox()
        self.__voronoiModelNodeSelector.objectName = 'voronoiModelNodeSelector'
        self.__voronoiModelNodeSelector.toolTip = "Select the output model for the Voronoi Diagram."
        self.__voronoiModelNodeSelector.nodeTypes = ['vtkMRMLModelNode']
        self.__voronoiModelNodeSelector.baseName = "VoronoiModel"
        self.__voronoiModelNodeSelector.hideChildNodeTypes = [
            'vtkMRMLAnnotationNode'
        ]  # hide all annotation nodes
        self.__voronoiModelNodeSelector.noneEnabled = False
        self.__voronoiModelNodeSelector.addEnabled = True
        self.__voronoiModelNodeSelector.selectNodeUponCreation = True
        self.__voronoiModelNodeSelector.removeEnabled = True
        ioAdvancedFormLayout.addRow("Output Voronoi Model:",
                                    self.__voronoiModelNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.__voronoiModelNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')

        #
        # Reset, preview and apply buttons
        #

        self.__buttonBox = qt.QDialogButtonBox()
        self.__resetButton = self.__buttonBox.addButton(
            self.__buttonBox.RestoreDefaults)
        self.__resetButton.toolTip = "Click to reset all input elements to default."
        self.__previewButton = self.__buttonBox.addButton(
            self.__buttonBox.Discard)
        self.__previewButton.setIcon(qt.QIcon())
        self.__previewButton.text = "Preview.."
        self.__previewButton.toolTip = "Click to refresh the preview."
        self.__startButton = self.__buttonBox.addButton(self.__buttonBox.Apply)
        self.__startButton.setIcon(qt.QIcon())
        self.__startButton.text = "Start!"
        self.__startButton.enabled = False
        self.__startButton.toolTip = "Click to start the filtering."
        self.layout.addWidget(self.__buttonBox)
        self.__resetButton.connect("clicked()", self.restoreDefaults)
        self.__previewButton.connect("clicked()", self.onRefreshButtonClicked)
        self.__startButton.connect("clicked()", self.onStartButtonClicked)

        # be ready for events
        self.__updating = 0

        # set default values
        self.restoreDefaults()

        # compress the layout
        self.layout.addStretch(1)