Exemplo n.º 1
0
    def loadFromMRML(self, mrmlNode=None):
        '''
    '''
        if not self.__updating:

            self.__updating = 1

            self.resetPanel()

            if mrmlNode:
                # adjust the panel to the given mrmlNode
                vtkId = self.mrmlManager().MapMRMLNodeIDToVTKNodeID(
                    mrmlNode.GetID())

                # number of volumes
                numberOfVolumes = self.mrmlManager(
                ).GetTargetNumberOfSelectedVolumes()

                # re-enable the widgets
                self.resetPanel(True)

                self.__classLabel2.setText("Class: " + mrmlNode.GetName())

                self.setupManualSampleTable(mrmlNode)

                for c in range(numberOfVolumes):

                    value = self.mrmlManager(
                    ).GetTreeNodeDistributionMeanWithCorrection(vtkId, c)

                for r in range(numberOfVolumes):
                    for c in range(numberOfVolumes):
                        value = self.mrmlManager(
                        ).GetTreeNodeDistributionLogCovarianceWithCorrection(
                            vtkId, r, c)

                #
                # overview panel
                #

                # first, clear it all
                for i in self.__classWeights:
                    self.__overviewBoxLayout.removeWidget(i)
                    i.deleteLater()
                    i.setParent(None)
                    i = None

                self.__classWeights = []
                self.__classWeightLayouts = []
                self.__classWeightLabels = []
                self.__classWeightSpinBoxes = []
                self.__classWeightCheckBoxes = []

                # fill it again
                if vtkId != self.mrmlManager().GetTreeRootNodeID():
                    # other node than root selected
                    parent = self.mrmlManager().GetTreeNodeParentNodeID(vtkId)
                    numberOfChildren = self.mrmlManager(
                    ).GetTreeNodeNumberOfChildren(parent)
                    for i in range(numberOfChildren):
                        child = self.mrmlManager().GetTreeNodeChildNodeID(
                            parent, i)
                        name = self.mrmlManager().GetTreeNodeName(child)
                        probability = self.mrmlManager(
                        ).GetTreeNodeClassProbability(child)

                        label = qt.QLabel(name + ":")

                        spinBox = qt.QDoubleSpinBox()
                        spinBox.minimum = 0
                        spinBox.maximum = 1
                        spinBox.singleStep = 0.01
                        spinBox.value = probability

                        checkBox = qt.QCheckBox("  ")
                        checkBox.toolTip = 'Toggle for auto-update when changing other weights.'

                        self.__classWeightLabels.append(label)
                        self.__classWeightSpinBoxes.append(spinBox)
                        self.__classWeightCheckBoxes.append(checkBox)

                        self.__classWeightSpinBoxes[-1].connect(
                            'valueChanged(double)', self.updateClassWeights)
                        self.__classWeightCheckBoxes[-1].connect(
                            'stateChanged(int)', self.updateClassWeights)

                        weightRow = qt.QWidget()
                        weightRowLayout = qt.QHBoxLayout(weightRow)
                        weightRowLayout.addWidget(self.__classWeightLabels[-1])
                        weightRowLayout.addWidget(
                            self.__classWeightSpinBoxes[-1])
                        weightRowLayout.addWidget(
                            self.__classWeightCheckBoxes[-1])

                        self.__classWeights.append(weightRow)
                        self.__classWeightLayouts.append(weightRowLayout)

                        self.__overviewBoxLayout.addWidget(
                            self.__classWeights[-1], 0, 2)

            self.__updating = 0
Exemplo n.º 2
0
  def create(self,widgetType='window',showHeader=False,showPreview=False):
    """
    main window is a frame with widgets from the app
    widget repacked into it along with slicer-specific
    extra widgets
    """

    # find internals of widget for reference and repacking
    self.toolBar = slicer.util.findChildren(self.dicomBrowser, 'ToolBar')[0]
    self.databaseNameLabel = slicer.util.findChildren(self.dicomBrowser, 'DatabaseNameLabel')[0]
    self.databaseDirectoryButton = slicer.util.findChildren(self.dicomBrowser, 'DirectoryButton')[0]
    self.tableDensityLabel = qt.QLabel('Density: ')
    self.tableDensityComboBox = slicer.util.findChildren(self.dicomBrowser, 'tableDensityComboBox')[0]
    self.tableDensityComboBox.connect('currentIndexChanged(QString)', self.onTableDensityComboBox)
    index = self.tableDensityComboBox.findText(self.tableDensity)
    if  (index != -1) :
      self.tableDensityComboBox.setCurrentIndex(index)

    #self.tables = self.dicomBrowser.tableManager
    self.tables = slicer.util.findChildren(self.dicomBrowser, 'dicomTableManager')[0]
    patientTable = slicer.util.findChildren(self.tables, 'patientsTable')[0]
    patientTableView = slicer.util.findChildren(patientTable, 'tblDicomDatabaseView')[0]
    patientSearchBox = slicer.util.findChildren(patientTable, 'leSearchBox')[0]
    studyTable = slicer.util.findChildren(self.tables, 'studiesTable')[0]
    studyTableView = slicer.util.findChildren(studyTable, 'tblDicomDatabaseView')[0]
    studySearchBox = slicer.util.findChildren(studyTable, 'leSearchBox')[0]
    seriesTable = slicer.util.findChildren(self.tables, 'seriesTable')[0]
    seriesTableView = slicer.util.findChildren(seriesTable, 'tblDicomDatabaseView')[0]
    seriesSearchBox = slicer.util.findChildren(seriesTable, 'leSearchBox')[0]
    self.tableSplitter = qt.QSplitter()
    self.tableSplitter.addWidget(patientTableView)
    self.tableSplitter.addWidget(studyTableView)
    self.tableSplitter.addWidget(seriesTableView)

    # TODO: Move to this part to CTK
    patientTableView.resizeColumnsToContents()
    studyTableView.resizeColumnsToContents()
    seriesTableView.resizeColumnsToContents()

    #self.userFrame = slicer.util.findChildren(self.dicomBrowser, 'UserFrame')[0]
    self.userFrame = qt.QWidget()
    #self.thumbs = slicer.util.findChildren(self.dicomBrowser, 'ThumbnailsWidget')[0]
    #self.widthSlider = slicer.util.findChildren(self.dicomBrowser, 'ThumbnailWidthSlider')[0]
    self.preview = qt.QWidget()

    self.widgetType = widgetType
    if widgetType == 'dialog':
      self.window = qt.QDialog(self.dicomBrowser)
    elif widgetType == 'window':
      self.window = qt.QWidget()
    elif widgetType == 'popup':
      self.window = ctk.ctkPopupWidget(self.dicomBrowser)
      self.window.orientation = 1
      self.window.horizontalDirection = 0
      self.window.alignment = 0x82
    elif widgetType == 'dock':
      self.dock = qt.QDockWidget(slicer.util.mainWindow())
      self.dock.setFeatures( qt.QDockWidget.DockWidgetFloatable |
                                qt.QDockWidget.DockWidgetMovable |
                                qt.QDockWidget.DockWidgetClosable )
      slicer.util.mainWindow().addDockWidget(0x15, self.dock)
      self.window = qt.QFrame()
      self.dock.setWidget(self.window)
    else:
      raise "Unknown widget type - should be dialog, window, dock or popup"

    self.setModality(not self.browserPersistent)

    self.window.setWindowTitle('DICOM Browser')

    self.layout = qt.QVBoxLayout(self.window)

    # tool row at top, with commands and database
    self.toolFrame = qt.QWidget()
    self.toolFrame.setMaximumHeight(40)
    self.toolFrame.setContentsMargins(-5,-5,-5,-5)
    self.toolLayout = qt.QHBoxLayout(self.toolFrame)
    self.layout.addWidget(self.toolFrame)
    self.toolLayout.addWidget(self.toolBar)
    self.settingsButton = ctk.ctkExpandButton()
    self.toolLayout.addWidget(self.settingsButton)
    self.toolLayout.addWidget(self.databaseNameLabel)
    self.databaseNameLabel.visible = False
    self.toolLayout.addWidget(self.databaseDirectoryButton)
    self.databaseDirectoryButton.visible = False
    self.toolLayout.addWidget(self.tableDensityLabel)
    self.tableDensityLabel.visible = False
    self.toolLayout.addWidget(self.tableDensityComboBox)
    self.tableDensityComboBox.visible = False
    self.settingsButton.connect('toggled(bool)', self.onSettingsButton)

    # enable export button and make new connection
    self.actionExport = self.dicomBrowser.findChildren('QAction', 'ActionExport')[0]
    self.actionExport.enabled = 1
    self.actionExport.connect('triggered()', self.onExportAction)

    # search row
    self.searchFrame = qt.QWidget()
    self.searchFrame.setMaximumHeight(40)
    self.searchLayout = qt.QHBoxLayout(self.searchFrame)
    self.layout.addWidget(self.searchFrame)
    patinetsLabel = qt.QLabel('Patients: ')
    self.searchLayout.addWidget(patinetsLabel)
    self.searchLayout.addWidget(patientSearchBox)
    studiesLabel = qt.QLabel('Studies: ')
    self.searchLayout.addWidget(studiesLabel)
    self.searchLayout.addWidget(studySearchBox)
    seriesLabel = qt.QLabel('Series: ')
    self.searchLayout.addWidget(seriesLabel)
    self.searchLayout.addWidget(seriesSearchBox)

    # tables goes next, spread across 1 row, 2 columns
    if self.horizontalTables:
      self.tableSplitter.setOrientation(1)
    else:
      self.tableSplitter.setOrientation(0)
    self.layout.addWidget(self.tableSplitter)

    #
    # preview related column
    #
    self.previewLayout = qt.QVBoxLayout()
    #self.layout.addLayout(self.previewLayout,selectionRow,0)

    #self.previewLayout.addWidget(self.thumbs)
    #self.previewLayout.addWidget(self.widthSlider)
    if showPreview:
      self.previewLayout.addWidget(self.preview)
    else:
      self.preview.hide()

    #
    # action related column (interacting with slicer)
    #
    self.loadableTableFrame = qt.QWidget()
    self.loadableTableFrame.setMaximumHeight(200)
    self.loadableTableLayout = qt.QFormLayout(self.loadableTableFrame)
    self.layout.addWidget(self.loadableTableFrame)

    self.loadableTableLayout.addWidget(self.userFrame)
    self.userFrame.hide()

    tableWidth = 350 if showHeader else 600
    self.loadableTable = DICOMLoadableTable(self.userFrame,width=tableWidth)
    #self.loadableTableLayout.addWidget(self.loadableTable.widget)
    #self.loadableTable.widget.hide()

    #
    # button row for action column
    #
    self.actionButtonsFrame = qt.QWidget()
    self.actionButtonsFrame.setMaximumHeight(40)
    self.layout.addWidget(self.actionButtonsFrame)
    #self.layout.addStretch(1)
    self.actionButtonLayout = qt.QHBoxLayout()
    self.actionButtonsFrame.setLayout(self.actionButtonLayout)

    self.loadButton = qt.QPushButton('Load')
    self.loadButton.enabled = True
    self.loadButton.toolTip = 'Load Selection to Slicer'
    self.actionButtonLayout.addWidget(self.loadButton)
    self.loadButton.connect('clicked()', self.loadCheckedLoadables)

    self.headerPopup = DICOMLib.DICOMHeaderPopup()

    self.viewMetadataButton = qt.QPushButton('Metadata')
    self.viewMetadataButton.toolTip = 'Display Metadata of the Selected Series'
    self.viewMetadataButton.enabled = False
    self.actionButtonLayout.addWidget(self.viewMetadataButton)
    self.viewMetadataButton.connect('clicked()', self.onViewHeaderButton)
    self.viewMetadataButton.connect('clicked()', self.headerPopup.open)
    self.actionButtonLayout.addStretch(1)

    self.examineButton = qt.QPushButton('Examine')
    self.actionButtonLayout.addWidget(self.examineButton)
    self.examineButton.enabled = False
    self.examineButton.connect('clicked()', self.examineForLoading)

    self.uncheckAllButton = qt.QPushButton('Uncheck All')
    self.actionButtonLayout.addWidget(self.uncheckAllButton)
    self.uncheckAllButton.connect('clicked()', self.uncheckAllLoadables)
    self.actionButtonLayout.addStretch(1)

    self.closeButton = qt.QPushButton('Close')
    #self.actionButtonLayout.addWidget(self.closeButton)
    self.closeButton.connect('clicked()', self.close)

    self.advancedViewButton = qt.QCheckBox('Advanced')
    self.actionButtonLayout.addWidget(self.advancedViewButton)
    self.advancedViewButton.enabled = True
    self.advancedViewButton.checked = self.advancedView
    self.advancedViewButton.connect('clicked()', self.onAdvanedViewButton)

    self.horizontalViewCheckBox = qt.QCheckBox('Horizontal')
    self.horizontalViewCheckBox.checked = self.horizontalTables
    self.horizontalViewCheckBox.connect('clicked()', self.onHorizontalViewCheckBox)
    self.actionButtonLayout.addWidget(self.horizontalViewCheckBox)
    self.toolLayout.addStretch(1)

    self.browserPersistentButton = qt.QCheckBox('Browser Persistent')
    self.browserPersistentButton.toolTip = 'When enabled, DICOM Browser remains open after loading data or switching to another module'
    self.browserPersistentButton.checked = self.browserPersistent
    self.actionButtonLayout.addWidget(self.browserPersistentButton)
    self.browserPersistentButton.connect('stateChanged(int)', self.setBrowserPersistence)

    if self.advancedView:
      self.loadableTableFrame.visible = True
    else:
      self.loadableTableFrame.visible = False
      self.examineButton.visible = False
      self.uncheckAllButton.visible = False
    #
    # header related column (more details about the selected file)
    #
    if showHeader:
      self.headerLayout = qt.QVBoxLayout()
      self.layout.addLayout(self.headerLayout,selectionRow,2)
      self.header = DICOMHeaderWidget(self.window)
      self.headerLayout.addWidget(self.header.widget)

    #
    # Plugin selection widget
    #
    self.pluginSelector = DICOMPluginSelector(self.window)
    self.loadableTableLayout.addRow(self.pluginSelector.widget,self.loadableTable.widget)
    self.checkBoxByPlugins = []

    for pluginClass in slicer.modules.dicomPlugins:
      self.checkBox = self.pluginSelector.checkBoxByPlugin[pluginClass]
      self.checkBox.connect('stateChanged(int)', self.onPluginStateChanged)
      self.checkBoxByPlugins.append(self.checkBox)
Exemplo n.º 3
0
    def setup(self):

        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.onVCMRMLSceneChanged)

        w = qt.QWidget()
        layout = qt.QGridLayout()
        w.setLayout(layout)
        self.layout.addWidget(w)
        w.show()
        self.layout = layout

        # create frames
        self.inputFrame = ctk.ctkCollapsibleButton()
        self.inputFrame.text = "Input"
        self.inputFrame.collapsed = 0
        inputFrameLayout = qt.QFormLayout(self.inputFrame)
        self.layout.addWidget(self.inputFrame)

        self.ctrlFrame = ctk.ctkCollapsibleButton()
        self.ctrlFrame.text = "Frame control"
        self.ctrlFrame.collapsed = 0
        ctrlFrameLayout = qt.QGridLayout(self.ctrlFrame)
        self.layout.addWidget(self.ctrlFrame)

        self.plotFrame = ctk.ctkCollapsibleButton()
        self.plotFrame.text = "Plotting"
        self.plotFrame.collapsed = 0
        plotFrameLayout = qt.QGridLayout(self.plotFrame)
        self.layout.addWidget(self.plotFrame)

        label = qt.QLabel('Input multivolume')
        self.__mvSelector = slicer.qMRMLNodeComboBox()
        self.__mvSelector.nodeTypes = ['vtkMRMLMultiVolumeNode']
        self.__mvSelector.setMRMLScene(slicer.mrmlScene)
        self.__mvSelector.connect('mrmlSceneChanged(vtkMRMLScene*)',
                                  self.onVCMRMLSceneChanged)
        self.__mvSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                  self.onInputChanged)
        self.__mvSelector.addEnabled = 0

        inputFrameLayout.addRow(label, self.__mvSelector)
        ##self.layout.addWidget(label)
        ##self.layout.addWidget(self.__mvSelector)

        # TODO: initialize the slider based on the contents of the labels array
        # slider to scroll over metadata stored in the vector container being explored
        self.__mdSlider = ctk.ctkSliderWidget()
        #self.__mdSlider.setRange(0,10)
        #self.__mdSlider.setValue(5)

        label = qt.QLabel('Current frame number')
        ##self.layout.addWidget(label)
        ##self.layout.addWidget(self.__mdSlider)

        # "play" control
        self.playButton = qt.QPushButton('Play')
        self.playButton.toolTip = 'Iterate over multivolume frames'
        self.playButton.checkable = True

        ctrlFrameLayout.addWidget(label, 0, 0)
        ctrlFrameLayout.addWidget(self.__mdSlider, 0, 1)
        ctrlFrameLayout.addWidget(self.playButton, 0, 2)

        self.playButton.connect('toggled(bool)', self.onPlayButtonToggled)

        self.__mdSlider.connect('valueChanged(double)', self.onSliderChanged)

        label = qt.QLabel('Current frame copy')

        self.__vfSelector = slicer.qMRMLNodeComboBox()
        self.__vfSelector.nodeTypes = ['vtkMRMLScalarVolumeNode']
        self.__vfSelector.setMRMLScene(slicer.mrmlScene)
        self.__vfSelector.connect('mrmlSceneChanged(vtkMRMLScene*)',
                                  self.onVFMRMLSceneChanged)
        self.__vfSelector.addEnabled = 1
        self.__vfSelector.enabled = 0
        # do not show "children" of vtkMRMLScalarVolumeNode
        self.__vfSelector.hideChildNodeTypes = ["vtkMRMLDiffusionWeightedVolumeNode", \
            "vtkMRMLDiffusionTensorVolumeNode", "vtkMRMLVectorVolumeNode"]

        self.extractFrame = False
        self.extractButton = qt.QPushButton('Enable current frame copying')
        self.extractButton.checkable = True
        self.extractButton.connect('toggled(bool)', self.onExtractFrameToggled)

        ctrlFrameLayout.addWidget(label, 1, 0)
        ctrlFrameLayout.addWidget(self.__vfSelector, 1, 1, 1, 2)
        ctrlFrameLayout.addWidget(self.extractButton, 2, 0, 1, 3)

        # initialize slice observers (from DataProbe.py)
        # keep list of pairs: [observee,tag] so they can be removed easily
        self.styleObserverTags = []
        # keep a map of interactor styles to sliceWidgets so we can easily get sliceLogic
        self.sliceWidgetsPerStyle = {}
        self.refreshObservers()

        # label map for probing
        label = qt.QLabel('Probed label volume')
        self.__fSelector = slicer.qMRMLNodeComboBox()
        self.__fSelector.nodeTypes = ['vtkMRMLScalarVolumeNode']
        self.__fSelector.addAttribute('vtkMRMLScalarVolumeNode', 'LabelMap',
                                      '1')
        self.__fSelector.toolTip = 'Label map to be probed'
        self.__fSelector.setMRMLScene(slicer.mrmlScene)
        self.__fSelector.addEnabled = 0
        self.__fSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                 self.onLabelVolumeChanged)
        self.__fSelector.connect('mrmlSceneChanged(vtkMRMLScene*)',
                                 self.onLVMRMLSceneChanged)
        plotFrameLayout.addWidget(label, 0, 0, 1, 1)
        plotFrameLayout.addWidget(self.__fSelector, 0, 1, 1, 2)

        self.iCharting = qt.QPushButton()
        self.iCharting.text = 'Enable interactive charting'
        self.iCharting.checkable = True

        plotFrameLayout.addWidget(self.iCharting, 1, 0, 1, 3)
        self.iCharting.setChecked(True)
        self.iCharting.connect('toggled(bool)',
                               self.onInteractiveChartingChanged)

        label = qt.QLabel("Use intensity range to fix axis extent")
        label.toolTip = "If checked, the extent of the vertical axis of the plot will be fixed to the range of the intensities in the input MultiVolume"
        self.__fixedAxesCheckbox = qt.QCheckBox()
        self.__fixedAxesCheckbox.toolTip = "If checked, the extent of the vertical axis of the plot will be fixed to the range of the intensities in the input MultiVolume"
        self.__fixedAxesCheckbox.checked = False
        plotFrameLayout.addWidget(label, 2, 0)
        plotFrameLayout.addWidget(self.__fixedAxesCheckbox, 2, 1, 1, 2)

        # add chart container widget
        self.__chartView = ctk.ctkVTKChartView(w)
        plotFrameLayout.addWidget(self.__chartView, 3, 0, 1, 3)

        self.__chart = self.__chartView.chart()
        self.__chartTable = vtk.vtkTable()
        self.__xArray = vtk.vtkFloatArray()
        self.__yArray = vtk.vtkFloatArray()
        # will crash if there is no name
        self.__xArray.SetName('')
        self.__yArray.SetName('signal intensity')
        self.__chartTable.AddColumn(self.__xArray)
        self.__chartTable.AddColumn(self.__yArray)
Exemplo n.º 4
0
    def addDownloadRow(self, uri, size=-1):
        """ Constructs a download row object based
            on the URI
        """

        #-------------------
        # Cancel button row
        #-------------------
        rowWidget = qt.QWidget()
        rowWidget.setObjectName('downloadRowWidget')
        rowWidget.setStyleSheet(
            '#downloadRowWidget {border: 1px ' +
            ' solid rgb(160,160,160); border-radius: 2px; width: 100%;}')
        #rowWidget.setFixedHeight(self.rowWidgetHeight)
        #rowWidget.setSizePolicy(qt.QSizePolicy.MinimumExpanding,
        #                        qt.QSizePolicy.MinimumExpanding)
        layout = qt.QVBoxLayout()
        rowWidget.setLayout(layout)

        #-------------------
        # Text Edit
        #-------------------
        textEdit = qt.QTextEdit()
        textEdit.setStyleSheet("border: none")
        textEdit.setFixedHeight(55)
        textEdit.verticalScrollBar().hide()
        textEdit.setFont(
            qt.QFont(XnatDownloadPopup.FONT_NAME, XnatDownloadPopup.FONT_SIZE,
                     10, False))
        layout.addWidget(textEdit)

        #-------------------
        # Progress Bar
        #-------------------
        progressBar = qt.QProgressBar(rowWidget)
        progressBar.setFixedHeight(17)
        progressBar.setFixedWidth(600)
        progressBar.setMinimum(0)
        progressBar.setMaximum(100)
        progressBar.setAlignment(0x0084)

        #-------------------
        # Cancel button row
        #-------------------
        cancelButton = qt.QPushButton()
        cancelButton.setText("Cancel")
        cancelButton.setFont(XnatDownloadPopup.LABEL_FONT)
        cancelButton.setFixedWidth(60)
        cancelButton.setFixedHeight(19)

        #-------------------
        # Progress bar row
        #-------------------
        progressRow = qt.QHBoxLayout()
        progressRow.addWidget(progressBar)
        progressRow.addStretch()
        progressRow.addWidget(cancelButton)
        layout.addLayout(progressRow)

        #-------------------
        # Row dict
        #-------------------
        downloadRow = {
            'queuePosition': len(self.downloadRows),
            'size': 0,
            'downloaded': 0,
            'textEdit': textEdit,
            'pathDict': XnatSlicerUtils.getXnatPathDict(uri),
            'progressBar': progressBar,
            'widget': rowWidget,
            'cancelButton': cancelButton
        }

        #-------------------
        # default text
        #-------------------
        dlStr = self.makeDownloadPath(downloadRow['pathDict'])
        textEdit.setText("QUEUED<br>%s<br>Please wait...<br>" % (dlStr))

        #-------------------
        # Cancel callback
        #-------------------
        def cancelClick():
            rowWidget.setEnabled(False)
            #print "Cancelling download '%s'"%(dlStr)
            textEdit.setText(textEdit.toHtml().replace('DOWNLOADING',
                                                       'CANCELLED'))
            for key, item in self.downloadRows.iteritems():
                if item['progressBar'] == progressBar:
                    item['progressBar'].setEnabled(False)
                    item['progressBar'].setMaximum(100)
                    self.cancelCallback(key)

        cancelButton.connect('pressed()', cancelClick)

        self.downloadRows[uri] = downloadRow
        self.remakeWidget()
Exemplo n.º 5
0
    def remakeWidget(self):
        """ Ideally, this would be unncessary.  But, since QScrollArea doesn't
            dynamically update, we have to update this ourselves.
        """

        #-------------------
        # Clear all of the inner widgets
        #-------------------
        if self.innerWidget:
            del self.innerWidget
        if self.innerWidgetLayout:
            del self.innerWidgetLayout
        if self.scrollWidget:
            del self.scrollWidget

        #-------------------
        # Reset the inner widget layout
        #-------------------
        self.innerWidgetLayout = qt.QFormLayout()
        self.innerWidgetLayout.setVerticalSpacing(10)

        #-------------------
        # Sort download rows by their queue positions,
        # add them to the innerWidgetLayout.
        #-------------------
        sortedRows = [None] * len(self.downloadRows)
        for key, item in self.downloadRows.iteritems():
            #print len(sortedRows), item['queuePosition']
            sortedRows[item['queuePosition']] = key
        for key in sortedRows:
            self.innerWidgetLayout.addRow(self.downloadRows[key]['widget'])

        #-------------------
        # Remake the inner widget
        #-------------------
        self.innerWidget = qt.QWidget()
        self.innerWidget.setLayout(self.innerWidgetLayout)
        self.innerWidget.setObjectName('innerWidget')
        self.innerWidget.setStyleSheet('#innerWidget {width: 100%;}')
        self.innerWidget.setSizePolicy(qt.QSizePolicy.MinimumExpanding,
                                       qt.QSizePolicy.MinimumExpanding)

        #-------------------
        # Remake the scroll widget
        #-------------------
        self.scrollWidget = qt.QScrollArea()
        self.scrollWidget.setWidget(self.innerWidget)
        self.scrollWidget.verticalScrollBar().setStyleSheet('width: 15px')
        self.scrollWidget.setObjectName('scrollWidget')
        self.scrollWidget.setStyleSheet('#scrollWidget {border: none}')
        self.scrollWidget.setSizePolicy(qt.QSizePolicy.MinimumExpanding,
                                        qt.QSizePolicy.MinimumExpanding)
        self.scrollWidget.setWidgetResizable(True)

        #-------------------
        # Clear the master widget and add the new contents.
        #-------------------
        delWidget = self.masterLayout.itemAt(0)
        while (delWidget):
            self.masterLayout.removeItem(delWidget)
            del delWidget
            delWidget = self.masterLayout.itemAt(0)

        self.innerWidget.update()
        self.masterLayout.addRow(self.scrollWidget)
        self.setSizePolicy(qt.QSizePolicy.MinimumExpanding,
                           qt.QSizePolicy.MinimumExpanding)

        calcHeight = (self.rowWidgetHeight + 12) * len(self.downloadRows)
        if calcHeight < 800:
            self.setMinimumHeight(calcHeight)
        else:
            self.setMinimumHeight(800)

        self.update()
Exemplo n.º 6
0
  def setup(self):

    w = qt.QWidget();
    layout = qt.QGridLayout();
    w.setLayout(layout);
    self.layout.addWidget(w);
    w.show();
    self.layout = layout;

####################IMPORTAR VOLUMEN 4D#################################################3

### Se crea la sección para cargar el volumen 4D en una pestaña desplegable
    importDataCollapsibleButton = ctk.ctkCollapsibleButton()
    importDataCollapsibleButton.text = "Import Data"
    self.layout.addWidget(importDataCollapsibleButton)

    importDataFormLayout = qt.QFormLayout(importDataCollapsibleButton)


#### Crear desplegable para seleccionar dirección del volumen
    self.__fDialog = ctk.ctkDirectoryButton()
    self.__fDialog.caption = 'Input directory'
    importDataFormLayout.addRow('Input directory:', self.__fDialog)


 ###Selector de volumen donde se guardara el volumen de la direccion
    self.outputSelector = slicer.qMRMLNodeComboBox()
    self.outputSelector.nodeTypes = ['vtkMRMLMultiVolumeNode']
    self.outputSelector.addEnabled = True  # Se habilita la posibildad al usuario de crear un nuevo nodo con este widget
    self.outputSelector.removeEnabled = False  # Se le quita al usuario la posibilidad de eliminar el nodo seleccionado en ese momento
    self.outputSelector.setMRMLScene(slicer.mrmlScene)
    importDataFormLayout.addRow("Output node:", self.outputSelector)
    self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.outputSelector, 'setMRMLScene(vtkMRMLScene*)')  


### Parametros avanzados
    
    self.__dicomTag = qt.QLineEdit()
    self.__dicomTag.text = 'NA'
    importDataFormLayout.addRow('Frame identifying DICOM tag:', self.__dicomTag)

    self.__veLabel = qt.QLineEdit()
    self.__veLabel.text = 'na'
    importDataFormLayout.addRow('Frame identifying units:', self.__veLabel)

    self.__veInitial = qt.QDoubleSpinBox()
    self.__veInitial.value = 0
    importDataFormLayout.addRow('Initial value:', self.__veInitial)

    self.__veStep = qt.QDoubleSpinBox()
    self.__veStep.value = 1
    importDataFormLayout.addRow('Step:', self.__veStep)

  
    self.__te = qt.QDoubleSpinBox()
    self.__te.value = 1
    importDataFormLayout.addRow('EchoTime:', self.__te)

    
    self.__tr = qt.QDoubleSpinBox()
    self.__tr.value = 1
    importDataFormLayout.addRow('RepetitionTime:', self.__tr)

    self.__fa = qt.QDoubleSpinBox()
    self.__fa.value = 1
    importDataFormLayout.addRow('FlipAngle:', self.__fa)


    # Botón de importar

    self.buttonImport = qt.QPushButton("Import")
    self.buttonImport.toolTip = "Run the algorithm."
    ##self.buttonImport.enabled = True
    importDataFormLayout.addRow("                                       ", self.buttonImport)

    self.buttonImport.connect('clicked(bool)', self.importFunction)
    ##self.inputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)


###########################REGISTRO##########################################
    
##    # Se crea una sección de parámetros en una pestaña desplegable
    registerCollapsibleButton = ctk.ctkCollapsibleButton()
    registerCollapsibleButton.text = "Register"
    self.layout.addWidget(registerCollapsibleButton)

    registerFormLayout = qt.QFormLayout(registerCollapsibleButton)


    #Se crea una ventana desplegable en la cual se ingresa el volumen 4D de
    #entrada que se quiere registrar, este volumen debe ser de tipo
    #"vtkMRMLMultiVolumeNode", además si se tienen varios multivolumenes cargados
    #se puede elegir entre ellos el que se desea registrar
    self.inputRegSelector = slicer.qMRMLNodeComboBox()
    self.inputRegSelector.nodeTypes = ["vtkMRMLMultiVolumeNode"]
    self.inputRegSelector.selectNodeUponCreation = True
    self.inputRegSelector.addEnabled = True
    self.inputRegSelector.removeEnabled = False
    self.inputRegSelector.noneEnabled = True
    self.inputRegSelector.showHidden = False
    self.inputRegSelector.showChildNodeTypes = False
    self.inputRegSelector.setMRMLScene( slicer.mrmlScene )
    self.inputRegSelector.setToolTip( "Pick the input to the algorithm." )
    registerFormLayout.addRow("Volumen 4D: ", self.inputRegSelector)
    self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.inputRegSelector, 'setMRMLScene(vtkMRMLScene*)')


   ###Selector de volumen donde se guardara el volumen de la direccion
    self.outputRegSelector = slicer.qMRMLNodeComboBox()
    self.outputRegSelector.nodeTypes = ['vtkMRMLMultiVolumeNode']
    self.outputRegSelector.addEnabled = True  # Se habilita la posibildad al usuario de crear un nuevo nodo con este widget
    self.outputRegSelector.removeEnabled = False  # Se le quita al usuario la posibilidad de eliminar el nodo seleccionado en ese momento
    self.outputRegSelector.setMRMLScene(slicer.mrmlScene)
    registerFormLayout.addRow("Output node:", self.outputRegSelector)
    self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.outputRegSelector, 'setMRMLScene(vtkMRMLScene*)')  

 # Botón de Registro
    #Este botón solo se activa si el multivolumen ha sido seleccionado en la
    #ventana desplegable de Volumen 4D. Al presionarlo, el algoritmo
    #realiza el registro de los diferentes volumenes en el volumen 4D
    self.applyButton = qt.QPushButton("Registrar")
    self.applyButton.toolTip = "Run the algorithm."
    self.applyButton.enabled = True
    registerFormLayout.addRow(self.applyButton)

    # Conexiones necesarias para el algoritmo
    #entrega al algoritmo el volumen 4D de entrada y conecta la función del botón
    #con la ejecución del registro
    self.applyButton.connect('clicked(bool)', self.registrarButton)
Exemplo n.º 7
0
  def setup(self):

    w = qt.QWidget();
    layout = qt.QGridLayout();
    w.setLayout(layout);
    self.layout.addWidget(w);
    w.show();
    self.layout = layout;

####################IMPORTAR VOLUMEN 4D#################################################3

### Se crea la sección para cargar el volumen 4D en una pestaña desplegable
    importDataCollapsibleButton = ctk.ctkCollapsibleButton()
    importDataCollapsibleButton.text = "Import Data"
    self.layout.addWidget(importDataCollapsibleButton)

    importDataFormLayout = qt.QFormLayout(importDataCollapsibleButton)


#### Crear desplegable para seleccionar dirección del volumen
    self.__fDialog = ctk.ctkDirectoryButton()
    self.__fDialog.caption = 'Input directory'
    importDataFormLayout.addRow('Input directory:', self.__fDialog)


 ###Selector de volumen donde se guardara el volumen de la direccion
    self.outputSelector = slicer.qMRMLNodeComboBox()
    self.outputSelector.nodeTypes = ['vtkMRMLMultiVolumeNode']
    self.outputSelector.addEnabled = True  # Se habilita la posibildad al usuario de crear un nuevo nodo con este widget
    self.outputSelector.removeEnabled = False  # Se le quita al usuario la posibilidad de eliminar el nodo seleccionado en ese momento
    self.outputSelector.setMRMLScene(slicer.mrmlScene)
    importDataFormLayout.addRow("Output node:", self.outputSelector)
    self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.outputSelector, 'setMRMLScene(vtkMRMLScene*)')  


### Parametros avanzados
    
    self.__dicomTag = qt.QLineEdit()
    self.__dicomTag.text = 'NA'
    importDataFormLayout.addRow('Frame identifying DICOM tag:', self.__dicomTag)

    self.__veLabel = qt.QLineEdit()
    self.__veLabel.text = 'na'
    importDataFormLayout.addRow('Frame identifying units:', self.__veLabel)

    self.__veInitial = qt.QDoubleSpinBox()
    self.__veInitial.value = 0
    importDataFormLayout.addRow('Initial value:', self.__veInitial)

    self.__veStep = qt.QDoubleSpinBox()
    self.__veStep.value = 1
    importDataFormLayout.addRow('Step:', self.__veStep)

  
    self.__te = qt.QDoubleSpinBox()
    self.__te.value = 1
    importDataFormLayout.addRow('EchoTime:', self.__te)

    
    self.__tr = qt.QDoubleSpinBox()
    self.__tr.value = 1
    importDataFormLayout.addRow('RepetitionTime:', self.__tr)

    self.__fa = qt.QDoubleSpinBox()
    self.__fa.value = 1
    importDataFormLayout.addRow('FlipAngle:', self.__fa)


    # Botón de importar

    self.buttonImport = qt.QPushButton("Import")
    self.buttonImport.toolTip = "Run the algorithm."
    ##self.buttonImport.enabled = True
    importDataFormLayout.addRow("                                       ", self.buttonImport)

    self.buttonImport.connect('clicked(bool)', self.importFunction)
    ##self.inputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)

################################### PARÁMETROS DE PROCESAMIENTO#################################################
##    # Se crea la sección para seleccionar parámetros el volumen 4D en una pestaña desplegable
    parametersCollapsibleButton = ctk.ctkCollapsibleButton()
    parametersCollapsibleButton.text = "Parameters"
    self.layout.addWidget(parametersCollapsibleButton)

    parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton)

    self.inputSelector = slicer.qMRMLNodeComboBox()
    self.inputSelector.nodeTypes = ["vtkMRMLMultiVolumeNode"]
    self.inputSelector.selectNodeUponCreation = True
    self.inputSelector.addEnabled = True
    self.inputSelector.removeEnabled = False
    self.inputSelector.noneEnabled = True
    self.inputSelector.showHidden = False
    self.inputSelector.showChildNodeTypes = False
    self.inputSelector.setMRMLScene( slicer.mrmlScene )
    self.inputSelector.setToolTip( "Pick the input to the algorithm." )
    parametersFormLayout.addRow("Volumen 4D: ", self.inputSelector)
    self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.inputSelector, 'setMRMLScene(vtkMRMLScene*)')


##########################PROCESAMIENTO##########################################################################

##    # Se crea la sección para seleccionar procesamiento del volumen 4D en una pestaña desplegable
    processingCollapsibleButton = ctk.ctkCollapsibleButton()
    processingCollapsibleButton.text = "Processing"
    self.layout.addWidget(processingCollapsibleButton)

    processingFormLayout = qt.QFormLayout(processingCollapsibleButton)

        # Botón de Segmentación
    #Este botón solo se activa si el multivolumen ha sido seleccionado en la
    #ventana desplegable de Volumen 4D. Al presionarlo, el algoritmo
    #realiza el registro de los diferentes volumenes en el volumen 4D

    self.buttonSegmentation = qt.QPushButton("Segmentation")
    self.buttonSegmentation.toolTip = "Run the algorithm."
    self.buttonSegmentation.enabled = True
    processingFormLayout.addRow("                                       ", self.buttonSegmentation)


    # Botón de modelo 3D
    #Este botón solo se activa si el multivolumen ha sido seleccionado en la
    #ventana desplegable de Volumen 4D. Al presionarlo, el algoritmo
    #realiza el registro de los diferentes volumenes en el volumen 4D
    self.buttonModel = qt.QPushButton("Show 3D model")
    self.buttonModel.toolTip = "Run the algorithm."
    self.buttonModel.enabled = True
    processingFormLayout.addRow("                                       ",self.buttonModel)



########################################CURVAS#######################################################

    
##    # Se crea la sección para seleccionar curvas del volumen 4D en una pestaña desplegable
    curvesCollapsibleButton = ctk.ctkCollapsibleButton()
    curvesCollapsibleButton.text = "Curves"
    self.layout.addWidget(curvesCollapsibleButton)

    curvesFormLayout = qt.QFormLayout(curvesCollapsibleButton)

# Botón de generación de curvas
    #Este botón solo se activa si el multivolumen ha sido seleccionado en la
    #ventana desplegable de Volumen 4D. Al presionarlo, el algoritmo
    #realiza el registro de los diferentes volumenes en el volumen 4D
    self.buttonCurves = qt.QPushButton("Generate curves")
    self.buttonCurves.toolTip = "Run the algorithm."
    self.buttonCurves.enabled = True
    curvesFormLayout.addRow("                                       ",self.buttonCurves)
Exemplo n.º 8
0
    def setup(self, wName, frameActiveFlag, parent):
        if self.ctrlWidget:
            return

        self.SetLinkViewers(1)
        self.numFrames = len(self.nodeImgList[0][0])

        if parent:
            self.ctrlWidget = parent
        else:
            # Create seperate window
            self.ctrlWidget = slicer.qMRMLWidget()
            self.ctrlWidget.setMRMLScene(slicer.mrmlScene)
            self.ctrlWidget.setLayout(qt.QFormLayout())

        self.ctrlWidget.setWindowTitle(wName)
        ctrlLayout = self.ctrlWidget.layout()

        # Create Slider Panel
        self.sliderPanel = qt.QWidget()
        self.sliderPanel.setLayout(qt.QGridLayout())
        ctrlLayout.addWidget(self.sliderPanel)
        sliderLayout = self.sliderPanel.layout()

        if self.numFrames > 1 or frameActiveFlag:
            self.ctrlFrameLabel = qt.QLabel('Frame')
            self.ctrlFrameSlider = ctk.ctkSliderWidget()
            self.ctrlFrameSlider.connect('valueChanged(double)',
                                         self.onSliderFrameChanged)
            sliderLayout.addWidget(self.ctrlFrameLabel, 0, 0)
            sliderLayout.addWidget(self.ctrlFrameSlider, 0, 1)

        self.ctrlLevelLabel = qt.QLabel('Level')
        self.ctrlLevelSlider = ctk.ctkSliderWidget()
        self.ctrlLevelSlider.connect('valueChanged(double)',
                                     self.onSliderLevelChanged)
        sliderLayout.addWidget(self.ctrlLevelLabel, 1, 0)
        sliderLayout.addWidget(self.ctrlLevelSlider, 1, 1)

        self.ctrlWindowLabel = qt.QLabel('Window')
        self.ctrlWindowSlider = ctk.ctkSliderWidget()
        self.ctrlWindowSlider.connect('valueChanged(double)',
                                      self.onSliderWindowChanged)
        sliderLayout.addWidget(self.ctrlWindowLabel, 2, 0)
        sliderLayout.addWidget(self.ctrlWindowSlider, 2, 1)

        # self.setSliderRangesAndValues()

        if self.sliceNodeList:
            self.orientPanel = qt.QWidget()
            self.orientPanel.setLayout(qt.QGridLayout())
            ctrlLayout.addWidget(self.orientPanel)

            self.orientationButtons = {}
            index = 0
            for orientation in self.orientations:
                self.orientationButtons[orientation] = qt.QRadioButton()
                self.orientationButtons[orientation].text = orientation
                # self.orientationBox.layout().addWidget(self.orientationButtons[orientation])
                if not self.allOrientationsFlag:
                    self.orientPanel.layout().addWidget(
                        self.orientationButtons[orientation], 0, index)
                    self.orientationButtons[orientation].connect(
                        "clicked()",
                        lambda o=orientation: self.setOrientation(o))
                index += 1

        self.setOrientation(self.selectedOrientation)
        self.setDisplay()
        if len(self.nodeList[1]):
            self.SetFGOpacity(0.6)

        self.valuePanel = qt.QWidget()
        self.valuePanel.setLayout(qt.QGridLayout())
        ctrlLayout.addWidget(self.valuePanel)
        valueLayout = self.valuePanel.layout()

        self.valueFrameLabel = qt.QLabel('FG:')
        self.valueFrameValues = qt.QLabel('')
        valueLayout.addWidget(self.valueFrameLabel, 0, 0)
        valueLayout.addWidget(self.valueFrameValues, 0, 1)

        if True:
            # self.plotFrame = ctk.ctkCollapsibleButton()
            # self.plotFrame.text = "Plotting"
            # self.plotFrame.collapsed = 0
            # f=ctk.ctkVTKChartView()
            # f.show()

            self.plotFrame = qt.QWidget()
            # self.plotFrame.resize(self.plotFrame.width,400)
            plotFrameLayout = qt.QGridLayout(self.plotFrame)
            ctrlLayout.addWidget(self.plotFrame)

            self.plotSettingsFrame = ctk.ctkCollapsibleButton()
            self.plotSettingsFrame.text = "Settings"
            self.plotSettingsFrame.collapsed = 1
            plotSettingsFrameLayout = qt.QGridLayout(self.plotSettingsFrame)
            # plotFrameLayout.addWidget(self.plotSettingsFrame,0,1)

            self.xLogScaleCheckBox = qt.QCheckBox()
            self.xLogScaleCheckBox.setChecked(0)

            self.yLogScaleCheckBox = qt.QCheckBox()
            self.yLogScaleCheckBox.setChecked(0)

            # taken from  https://github.com/fedorov/MultiVolumeExplorer
            self.__chartView = ctk.ctkVTKChartView(self.ctrlWidget)
            plotFrameLayout.addWidget(self.__chartView, 0, 0)

            self.__chart = self.__chartView.chart()
            self.__chartTable = vtk.vtkTable()
            self.__xArray = vtk.vtkFloatArray()
            self.__yArray = vtk.vtkFloatArray()
            # will crash if there is no name
            self.__xArray.SetName('Time1')
            self.__yArray.SetName('Intensity1')
            self.__chartTable.AddColumn(self.__xArray)
            self.__chartTable.AddColumn(self.__yArray)

            self.onInputChanged()

        self.refreshObservers()

        self.buttonPanel = qt.QWidget()
        self.buttonPanel.setLayout(qt.QGridLayout())
        ctrlLayout.addWidget(self.buttonPanel)

        self.exitButton = qt.QPushButton("Exit")
        self.exitButton.toolTip = "Close down slicer."
        self.exitButton.name = "sviewer exit"
        self.buttonPanel.layout().addWidget(self.exitButton, 0, 0)
        self.exitButton.connect('clicked()', exit)

        # do not do ctrlWin.show() here - for some reason window does not pop up then
        return self.ctrlWidget
Exemplo n.º 9
0
  def createUserInterface( self ):
    '''
    '''
    self.__layout = super( EMSegmentSpecifyIntensityDistributionStep, self ).createUserInterface()

    # the anatomical tree
    anatomicalTreeGroupBox = qt.QGroupBox()
    anatomicalTreeGroupBox.setTitle( 'Anatomical Tree' )
    self.__layout.addWidget( anatomicalTreeGroupBox )

    anatomicalTreeGroupBoxLayout = qt.QFormLayout( anatomicalTreeGroupBox )

    self.__anatomicalTree = slicer.modulewidget.qSlicerEMSegmentAnatomicalTreeWidget()
    self.__anatomicalTree.structureNameEditable = False
    self.__anatomicalTree.labelColumnVisible = False
    self.__anatomicalTree.probabilityMapColumnVisible = False
    self.__anatomicalTree.classWeightColumnVisible = False
    self.__anatomicalTree.updateClassWeightColumnVisible = False
    self.__anatomicalTree.atlasWeightColumnVisible = False
    self.__anatomicalTree.alphaColumnVisible = False
    self.__anatomicalTree.displayAlphaCheckBoxVisible = False
    self.__anatomicalTree.setMinimumHeight( 200 )
    self.__anatomicalTree.toolTip = 'Select a structure to configure the intensity distribution.'
    self.__anatomicalTree.setSizePolicy( qt.QSizePolicy.MinimumExpanding, qt.QSizePolicy.MinimumExpanding )
    self.__anatomicalTree.connect( 'currentTreeNodeChanged(vtkMRMLNode*)', self.onTreeSelectionChanged )
    anatomicalTreeGroupBoxLayout.addWidget( self.__anatomicalTree )

    self.__tabWidget = qt.QTabWidget()
    self.__layout.addWidget( self.__tabWidget )

    #
    # intensityDistributionPage
    #
    intensityDistributionPage = qt.QWidget()
    intensityDistributionPageLayout = qt.QFormLayout( intensityDistributionPage )

    self.__classLabel = qt.QLabel( "XX" )
    intensityDistributionPageLayout.addRow( "Class:", self.__classLabel )

    self.__specificationComboBox = qt.QComboBox()
    self.__specificationComboBox.addItems( Helper.GetSpecificationTypes() )
    #self.__specificationComboBox.model().item( 2 ).setSelectable( False )
    #self.__specificationComboBox.model().item( 2 ).setEnabled( False )
    self.__specificationComboBox.toolTip = 'The intensity distribution can be specified manually or through manual sampling.'
    intensityDistributionPageLayout.addRow( "Specification:", self.__specificationComboBox )
    self.__specificationComboBox.connect( 'currentIndexChanged(int)', self.propagateToMRML )

    self.__meanMatrixWidget = ctk.ctkMatrixWidget()
    self.__meanMatrixWidget.columnCount = 1
    self.__meanMatrixWidget.rowCount = 1
    self.__meanMatrixWidget.decimals = 4
    self.__meanMatrixWidget.minimum = 0
    self.__meanMatrixWidget.maximum = 1000000
    self.__meanMatrixWidget.toolTip = 'The mean intensity value for this structure.'
    intensityDistributionPageLayout.addRow( "Mean:", self.__meanMatrixWidget )
    self.__meanMatrixWidget.connect( 'matrixChanged()', self.propagateToMRML )

    self.__logCovarianceMatrixWidget = ctk.ctkMatrixWidget()
    self.__logCovarianceMatrixWidget.columnCount = 1
    self.__logCovarianceMatrixWidget.rowCount = 1
    self.__logCovarianceMatrixWidget.decimals = 4
    self.__logCovarianceMatrixWidget.minimum = 0
    self.__logCovarianceMatrixWidget.maximum = 1000000
    self.__logCovarianceMatrixWidget.toolTip = 'The log covariance for this structure.'
    intensityDistributionPageLayout.addRow( "Log Covariance:", self.__logCovarianceMatrixWidget )
    self.__logCovarianceMatrixWidget.connect( 'matrixChanged()', self.propagateToMRML )

    self.__resetDistributionButton = qt.QPushButton()
    self.__resetDistributionButton.text = "Reset Distribution"
    self.__resetDistributionButton.toolTip = 'Reset the distribution to the old value.'
    intensityDistributionPageLayout.addRow( self.__resetDistributionButton )
    self.__resetDistributionButton.connect( 'clicked()', self.resetDistribution )

    #
    # manualSamplingPage
    #
    manualSamplingPage = qt.QWidget()
    manualSamplingPageLayout = qt.QFormLayout( manualSamplingPage )

    self.__classLabel2 = qt.QLabel( "Class: XX" )
    manualSamplingPageLayout.addWidget( self.__classLabel2 )

    self.__infoLabel = qt.QLabel( "left mouse Click in a slice window to pick a sample" )
    manualSamplingPageLayout.addWidget( self.__infoLabel )

    self.__manualSampleTable = qt.QTableWidget()
    manualSamplingPageLayout.addWidget( self.__manualSampleTable )

    self.__tabWidget.addTab( intensityDistributionPage, "Intensity Distribution" )
    self.__tabWidget.addTab( manualSamplingPage, "Manual Sampling" )

    self.__plotDistributionButton = qt.QPushButton()
    self.__plotDistributionButton.text = "Plot Distribution"
    self.__plotDistributionButton.toolTip = 'Click to plot the intensity distributions for all structures.'
    self.__layout.addRow( self.__plotDistributionButton )
    self.__plotDistributionButton.connect( 'clicked()', self.plotDistribution )
Exemplo n.º 10
0
    def __init__(self, logic, applyButton, buttonsList):
        super(ILSVisualizationWidget, self).__init__()
        self.logic = logic
        self.applyButton = applyButton
        self.fiducialButtonsList = buttonsList
        self.enableApplyButton = False

        self.widget = qt.QWidget()
        self.layout = qt.QFormLayout(self.widget)
        self.boxHolder = qt.QWidget()
        self.boxHolder.setLayout(qt.QVBoxLayout())
        self.layout.addRow(self.boxHolder)

        self.groupBox = qt.QFrame()
        self.groupBox.setLayout(qt.QHBoxLayout())

        self.fiducialsCollapsibleButton = ctk.ctkCollapsibleButton()
        self.fiducialsCollapsibleButton.text = "Show Fiducials"
        self.fiducialsCollapsibleButton.hide()
        self.fiducialsFormLayout = qt.QFormLayout(
            self.fiducialsCollapsibleButton)

        # Table Widget Definition
        self.tableWidget = qt.QTableWidget()
        self.tableWidget.sortingEnabled = False
        self.tableWidget.hide()
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setColumnWidth(0, 190)
        self.tableWidget.setColumnWidth(1, 190)
        self.tableWidget.setColumnWidth(2, 190)
        self.tableWidget.setMaximumWidth(590)
        horizontalBar = self.tableWidget.horizontalScrollBar()
        horizontalBar.setDisabled(True)
        horizontalBar.hide()
        self.tableWidget.setHorizontalHeaderLabels([
            "Left Oblique Fiducials", "Right Oblique Fiducials",
            "Right Horizontal Fiducials"
        ])
        behavior = qt.QAbstractItemView()
        self.tableWidget.setSelectionBehavior(behavior.SelectItems)
        self.tableWidget.setSelectionMode(behavior.SingleSelection)
        self.tableWidget.setContextMenuPolicy(3)
        self.tableWidget.customContextMenuRequested.connect(self.onRightClick)

        self.groupBox.layout().addWidget(self.tableWidget)

        self.fiducialsFormLayout.addWidget(self.groupBox)
        self.boxHolder.layout().addWidget(self.fiducialsCollapsibleButton)

        self.pendingUpdate = False
        self.updatingFiducials = False
        self.observerTags = []

        self.leftRow = 0
        self.rightObliqueRow = 0
        self.rightHorizontalRow = 0

        self.tableItems = []

        self.deletionGroupBox = qt.QFrame()
        self.deletionGroupBox.setLayout(qt.QHBoxLayout())
        self.fiducialsFormLayout.addWidget(self.deletionGroupBox)

        #
        # Delete Selected Fiducials Button
        #
        self.deleteButton = qt.QPushButton("Delete Selected Fiducial")
        self.deleteButton.toolTip = "Select a fiducial from the table and push this button to delete the selected fiducial from the scene."
        self.deleteButton.enabled = True
        selectedIcon = qt.QIcon(":/Icons/MarkupsDelete.png")
        self.deleteButton.setIcon(selectedIcon)
        self.deleteButton.setFixedSize(220, 30)
        self.deletionGroupBox.layout().addWidget(self.deleteButton)
        self.deleteButton.connect('clicked(bool)',
                                  self.onDeleteOneFiducialButton)

        #
        # Delete All Fiducials Button
        #
        self.deleteAllButton = qt.QPushButton("Delete All Fiducials")
        self.deleteAllButton.toolTip = "Delete all fiducials in the scene."
        self.deleteAllButton.enabled = True
        allIcon = qt.QIcon(":/Icons/MarkupsDeleteAllRows.png")
        self.deleteAllButton.setIcon(allIcon)
        self.deleteAllButton.setFixedSize(220, 30)
        self.deletionGroupBox.layout().addWidget(self.deleteAllButton)
        #self.fiducialsFormLayout.addRow(self.deleteAllButton)
        self.deleteAllButton.connect('clicked(bool)', self.dialogBoxFunction)
    def onEntry(self, comingFrom, transitionType):
        Helper.Info('Report step: entering onEntry()')
        super(ChangeTrackerReportROIStep,
              self).onEntry(comingFrom, transitionType)

        pNode = self.parameterNode()
        Helper.Info('Report step: onEntry')
        # create the tabs
        self.__metricsTabs.clear()
        metrics = pNode.GetParameter('metrics')
        self.__metricTabsList = {}
        self.__metricsVolumes = {}

        print 'Metrics list: ', metrics
        metricsReports = string.split(pNode.GetParameter('resultReports'), ',')
        metricsVolumesIDs = string.split(pNode.GetParameter('resultVolumes'),
                                         ',')

        i = 0

        metricsList = string.split(metrics, ',')

        if len(metricsVolumesIDs) != len(metricsList):
            Helper.Error('Missing metric processing results!')

        for m in metricsList:
            metricWidget = qt.QWidget()
            metricLayout = qt.QFormLayout(metricWidget)
            textWidget = qt.QTextEdit()
            textWidget.setReadOnly(1)

            self.__metricsVolumes[m] = metricsVolumesIDs[i]
            currentVolume = Helper.getNodeByID(metricsVolumesIDs[i])

            textWidget.setText(currentVolume.GetDescription())
            metricLayout.addRow(textWidget)
            self.__metricsTabs.addTab(metricWidget, m)
            self.__metricTabsList[m] = textWidget
            i = i + 1

        self.__metricsTabs.connect("currentChanged(int)", self.onTabChanged)

        # change the layout to Compare
        lm = slicer.app.layoutManager()
        lm.setLayout(12)
        lm.setLayoutNumberOfCompareViewRows(2)

        pNode = self.parameterNode()

        # use GetLayoutName() to identify the corresponding slice node and slice
        # composite node

        # find the compare nodes and initialize them as we wish
        sliceNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLSliceNode')
        sliceNodes.SetReferenceCount(sliceNodes.GetReferenceCount() - 1)
        sliceCompositeNodes = slicer.mrmlScene.GetNodesByClass(
            'vtkMRMLSliceCompositeNode')
        sliceCompositeNodes.SetReferenceCount(
            sliceCompositeNodes.GetReferenceCount() - 1)

        # setup slice nodes
        for s in range(0, sliceNodes.GetNumberOfItems()):
            sNode = sliceNodes.GetItemAsObject(s)
            thisLayoutName = sNode.GetLayoutName()
            # TODO: check they should have the same layout name!
            if thisLayoutName.find('Compare') == 0:
                sNode.SetLayoutGrid(1, 6)

        # setup slice composite nodes
        for s in range(0, sliceCompositeNodes.GetNumberOfItems()):
            scNode = sliceCompositeNodes.GetItemAsObject(s)
            thisLayoutName = scNode.GetLayoutName()
            if thisLayoutName == 'Compare1':
                scNode.SetBackgroundVolumeID(
                    pNode.GetParameter('croppedBaselineVolumeID'))
                scNode.SetForegroundVolumeID('')
                scNode.SetLabelVolumeID('')
                scNode.SetLinkedControl(1)
            if thisLayoutName == 'Compare2':
                scNode.SetBackgroundVolumeID(
                    pNode.GetParameter('croppedFollowupVolumeID'))
                scNode.SetForegroundVolumeID('')
                scNode.SetLabelVolumeID('')
                scNode.SetLinkedControl(1)

        qt.QTimer.singleShot(0, self.fitSlices)

        # Enable crosshairs
        # Is there only one crosshair node?
        xnodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLCrosshairNode')
        xnodes.SetReferenceCount(xnodes.GetReferenceCount() - 1)
        self.__xnode = xnodes.GetItemAsObject(0)
        if self.__xnode != None:
            self.__xnode.SetCrosshairMode(5)
        else:
            print 'Failed to find crosshair node!'
        '''
    setup for volume rendering
    '''
        if self.__vrDisplayNode == None:
            # self.__vrDisplayNode = self.__vrLogic.CreateVolumeRenderingDisplayNode()
            # reuse existing node
            vrDisplayNodeID = pNode.GetParameter('vrDisplayNodeID')
            self.__vrDisplayNode = slicer.mrmlScene.GetNodeByID(
                vrDisplayNodeID)
            #viewNode = slicer.util.getNode('vtkMRMLViewNode1')
            #self.__vrDisplayNode.SetCurrentVolumeMapper(0)
            #self.__vrDisplayNode.AddViewNodeID(viewNode.GetID())
        '''
    trigger volume rendering and label update
    '''
        self.onTabChanged(0)

        pNode.SetParameter('currentStep', self.stepid)

        Helper.Info('Report step: leaving onEntry()')

        qt.QTimer.singleShot(0, self.killButton)
Exemplo n.º 12
0
  def createUserInterface( self ):
    '''
    '''
#    self.buttonBoxHints = self.ButtonBoxHidden

    self.__layout = self.__parent.createUserInterface()

    # find all metrics in the plugins directory. The assumption is that all
    # metrics are named as ChangeTracker*Metric
    allModules = dir(slicer.moduleNames)
    changeTrackerMetrics = []
    for m in allModules:
      if m.endswith('Metric'):
        changeTrackerMetrics.append(m)

    print 'Metrics discovered: ', changeTrackerMetrics

    # if len(changeTrackerMetrics) == 0:
    #   report error -- should this be done in __init__ ? 
    
    self.__metricCheckboxList = {}

    self.__basicFrame = ctk.ctkCollapsibleButton()
    self.__basicFrame.text = "Basic settings"
    self.__basicFrame.collapsed = 0
    basicFrameLayout = qt.QFormLayout(self.__basicFrame)
    self.__layout.addRow(self.__basicFrame)

    self.__advancedFrame = ctk.ctkCollapsibleButton()
    self.__advancedFrame.text = "Advanced settings"
    self.__advancedFrame.collapsed = 1
    boxLayout = qt.QVBoxLayout(self.__advancedFrame)
    self.__layout.addRow(self.__advancedFrame)

    self.__metricsFrame = ctk.ctkCollapsibleButton()
    self.__metricsFrame.text = "Change Detection Metrics"
    self.__metricsFrame.collapsed = 0
    metricsFrameLayout = qt.QVBoxLayout(self.__metricsFrame)
    boxLayout.addWidget(self.__metricsFrame)

    self.__registrationFrame = ctk.ctkCollapsibleButton()
    self.__registrationFrame.text = "Registration"
    self.__registrationFrame.collapsed = 0
    registrationFrameLayout = qt.QFormLayout(self.__registrationFrame)
    boxLayout.addWidget(self.__registrationFrame)

    self.__metricsTabs = qt.QTabWidget()
    metricsFrameLayout.addWidget(self.__metricsTabs)

    # TODO: error checking!
    for m in changeTrackerMetrics:
      pluginName = m
      moduleManager = slicer.app.moduleManager()
      plugin = moduleManager.module(pluginName)
      label = qt.QLabel(plugin.title)
      checkbox = qt.QCheckBox()
      self.__metricCheckboxList[checkbox] = pluginName

      # initialize basic frame
      basicFrameLayout.addRow(label, checkbox)

      # initialize advanced frame
      metricGui = slicer.util.getModuleGui(pluginName)
      parametersWidget = Helper.findChildren(metricGui, text='Parameters')[0]

      if parametersWidget != None:
        metricWidget = qt.QWidget()
        metricLayout = qt.QFormLayout(metricWidget)
        metricLayout.addRow(parametersWidget)
        self.__metricsTabs.addTab(metricWidget, pluginName)
      
    self.__transformSelector = slicer.qMRMLNodeComboBox()
    self.__transformSelector.toolTip = "Transform aligning the follow-up scan with the baseline"
    self.__transformSelector.nodeTypes = ['vtkMRMLLinearTransformNode']
    self.__transformSelector.noneEnabled = 1
    self.__transformSelector.setMRMLScene(slicer.mrmlScene)

    transformSelectorLabel = qt.QLabel('Transform: ')
    registrationFrameLayout.addRow(transformSelectorLabel, self.__transformSelector)
Exemplo n.º 13
0
  def setup(self):  
    #Instantiate and Connect Widgets 
    #################################################
    #HeterogeneityCAD Inputs Collapsible Button
    
    self.inputHeterogeneityCADCollapsibleButton = ctk.ctkCollapsibleButton()
    self.inputHeterogeneityCADCollapsibleButton.text = "HeterogeneityCAD Input"
    self.layout.addWidget(self.inputHeterogeneityCADCollapsibleButton)
    self.inputHeterogeneityCADLayout = qt.QFormLayout(self.inputHeterogeneityCADCollapsibleButton)
             
    ##Input Volume as a PET/CT/MRI image or parameter map converted to a volume
    self.inputVolHetFrame = qt.QFrame(self.inputHeterogeneityCADCollapsibleButton)
    self.inputVolHetFrame.setLayout(qt.QHBoxLayout())
    self.inputHeterogeneityCADLayout.addRow(self.inputVolHetFrame)     
    # label for selecting individual node
    self.inputVolHet = qt.QLabel("Input Node: ", self.inputVolHetFrame)
    self.inputVolHetFrame.layout().addWidget(self.inputVolHet)    
    # select individual nodes
    self.inputSelectorVolHet = slicer.qMRMLNodeComboBox(self.inputVolHetFrame)
    self.inputSelectorVolHet.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" )
    #self.inputSelectorVolHet.addAttribute( ("vtkMRMLScalarVolumeNode"), "LabelMap", "0")
    self.inputSelectorVolHet.selectNodeUponCreation = False 
    self.inputSelectorVolHet.addEnabled = False
    self.inputSelectorVolHet.removeEnabled = False
    self.inputSelectorVolHet.setMRMLScene( slicer.mrmlScene )
    self.inputVolHetFrame.layout().addWidget(self.inputSelectorVolHet)
    # add Data Node button
    self.addDataNodeButton = qt.QPushButton("Add Node", self.inputVolHetFrame)
    self.addDataNodeButton.objectName = 'AddDataNodeButton'
    self.addDataNodeButton.setToolTip( "Add a Node to Queue" )
    self.addDataNodeButton.connect('clicked()', self.onAddDataNodeButtonClicked)
    self.inputVolHetFrame.layout().addWidget(self.addDataNodeButton)
         
    ## data nodes Frame
    self.dataNodesFrame = ctk.ctkCollapsibleGroupBox(self.inputHeterogeneityCADCollapsibleButton)
    self.dataNodesFrame.title = "Nodes List"
    self.dataNodesFrame.collapsed = False
    self.dataNodesFrame.setLayout(qt.QVBoxLayout())    
    # all buttons frame
    self.allButtonsFrame = qt.QFrame(self.inputHeterogeneityCADCollapsibleButton)
    self.allButtonsFrame.objectName = 'AllButtonsFrameButton'
    self.allButtonsFrame.setLayout(qt.QVBoxLayout())
    self.inputHeterogeneityCADLayout.addRow(self.dataNodesFrame, self.allButtonsFrame)
    # Data Nodes view
    # Use list view here with scroll area widget.
    self.dataScrollArea = qt.QScrollArea()  
    self.dataNodesListWidget = qt.QListWidget()
    self.dataNodesListWidget.name = 'dataNodesListWidget'
    self.dataScrollArea.setWidget(self.dataNodesListWidget)
    self.dataNodesListWidget.resize(350,100)
    self.dataNodesFrame.layout().addWidget(self.dataScrollArea)
    #self.listWidget.setProperty('SH_ItemView_ActivateItemOnSingleClick', 1)
    #self.listWidget.connect('activated(QModelIndex)', self.onActivated)       
    # add all Data Nodes from scene button
    self.addAllDataNodesButton = qt.QPushButton("Add All Nodes From Scene", self.allButtonsFrame)
    self.addAllDataNodesButton.objectName = 'AddAllDataNodesButton'
    self.addAllDataNodesButton.setToolTip( "Add all Nodes from the Scene to Queue" )
    self.addAllDataNodesButton.connect('clicked()', self.onAddAllDataNodesButtonClicked)
    self.allButtonsFrame.layout().addWidget(self.addAllDataNodesButton)
    # remove single Data Node
    self.removeDataNodeButton = qt.QPushButton("Remove Node", self.allButtonsFrame)
    self.removeDataNodeButton.objectName = 'RemoveDataNodeButton'
    self.removeDataNodeButton.setToolTip( "Removes Selected Node from the Queue." )
    self.removeDataNodeButton.connect('clicked()', self.onRemoveDataNodeButtonClicked)
    self.allButtonsFrame.layout().addWidget(self.removeDataNodeButton)   
    # remove all Data Nodes button
    self.removeAllDataNodesButton = qt.QPushButton("Remove All Nodes", self.allButtonsFrame)
    self.removeAllDataNodesButton.objectName = 'RemoveAllDataNodesButton'
    self.removeAllDataNodesButton.setToolTip( "Removes All Nodes from the Queue." )
    self.removeAllDataNodesButton.connect('clicked()', self.onRemoveAllDataNodesButtonClicked)
    self.allButtonsFrame.layout().addWidget(self.removeAllDataNodesButton)
        
    # Use Label Map as ROI(segmentation output or user-selected ROI)
    self.inputLabelROIFrame = qt.QFrame(self.inputHeterogeneityCADCollapsibleButton)
    self.inputLabelROIFrame.setLayout(qt.QHBoxLayout())
    self.inputHeterogeneityCADLayout.addRow(self.inputLabelROIFrame)
    # Enable Input Label Map as ROI
    self.inputLabelROI = qt.QLabel("Label Map ROI: ", self.inputLabelROIFrame)
    self.inputLabelROIFrame.layout().addWidget(self.inputLabelROI) 
    # Select Input Label Map as ROI
    self.inputSelectorLabel = slicer.qMRMLNodeComboBox(self.inputLabelROIFrame)
    self.inputSelectorLabel.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" )
    self.inputSelectorLabel.addAttribute( ("vtkMRMLScalarVolumeNode"), "LabelMap", "1")
    self.inputSelectorLabel.selectNodeUponCreation = False
    self.inputSelectorLabel.renameEnabled = True
    self.inputSelectorLabel.removeEnabled = False 
    self.inputSelectorLabel.noneEnabled = True
    self.inputSelectorLabel.addEnabled = False
    self.inputSelectorLabel.setMRMLScene( slicer.mrmlScene )    
    self.inputLabelROIFrame.layout().addWidget(self.inputSelectorLabel)

    #End HeterogeneityCAD Inputs Collapsible Button
    #################################################
    #HeterogeneityCAD Features Collapsible Button
    
    self.HeterogeneityCADCollapsibleButton = ctk.ctkCollapsibleButton()
    self.HeterogeneityCADCollapsibleButton.text = "HeterogeneityCAD Features Selection"
    self.layout.addWidget(self.HeterogeneityCADCollapsibleButton)
    self.featuresHeterogeneityCADLayout = qt.QFormLayout(self.HeterogeneityCADCollapsibleButton)

    # auto-generate QTabWidget Tabs and QCheckBoxes (subclassed in FeatureWidgetHelperLib)
    self.tabsFeatureClasses = FeatureWidgetHelperLib.CheckableTabWidget()
    self.featuresHeterogeneityCADLayout.addRow(self.tabsFeatureClasses)
     
    gridWidth, gridHeight = 3, 9
    for featureClass in self.featureClassKeys:    
      # by default, features from the following features classes are checked:
      if featureClass in ["Node Information", "First-Order Statistics", "Morphology and Shape", "Texture: GLCM", "Texture: GLRL"]:
        check = True
      else:
        check = False 
      tabFeatureClass = qt.QWidget()
      tabFeatureClass.setLayout(qt.QGridLayout())         
      #featureList = (feature for feature in self.featureClassKeys[featureClass])
      gridLayoutCoordinates = ((row,col) for col in range(gridWidth) for row in range(gridHeight))
      for featureName in self.featureClassKeys[featureClass]:
        row, col = next(gridLayoutCoordinates, None)
        if featureName is None or row is None or col is None:
          break       
        featureCheckboxWidget = FeatureWidgetHelperLib.FeatureWidget()      
        featureCheckboxWidget.Setup(featureName=featureName, checkStatus=check)
                   
        tabFeatureClass.layout().addWidget(featureCheckboxWidget, row, col)
        self.featureWidgets[featureClass].append(featureCheckboxWidget)       
      self.tabsFeatureClasses.addTab(tabFeatureClass, featureClass, self.featureWidgets[featureClass], checkStatus=check)
      
    self.tabsFeatureClasses.setCurrentIndex(1)
    
    # note: try using itertools list merging with lists of GLRL diagonal    
    self.heterogeneityFeatureWidgets = list(itertools.chain.from_iterable(self.featureWidgets.values()))
    self.classes = list(self.featureWidgets.keys())
    # or reduce(lambda x,y: x+y, self.featureWidgets.values())
    
    ########## Parameter options 
    # add parameters for top-level feature classes
    self.tabsFeatureClasses.addParameter("Geometrical Measures", "Extrusion Parameter 1")
    self.tabsFeatureClasses.addParameter("Texture: GLCM", "GLCM Matrix Parameter 1")
    self.tabsFeatureClasses.addParameter("Texture: GLRL", "GLRL Matrix Parameter 1")
    
    # compile dict of feature classes with parameter names and values
    self.featureClassParametersDict = collections.OrderedDict()
    for featureClassWidget in self.tabsFeatureClasses.getFeatureClassWidgets():      
      featureClassName = featureClassWidget.getName()  
      self.featureClassParametersDict[featureClassName] = collections.OrderedDict()
      self.updateFeatureClassParameterDict(0,featureClassWidget)
      for parameterName in featureClassWidget.widgetMenu.parameters:
        featureClassWidget.getParameterEditWindow(parameterName).connect('intValueChanged(int)', lambda intValue, featureClassWidget=featureClassWidget: self.updateFeatureClassParameterDict(intValue, featureClassWidget))
    
    # add parameters for individual features
    for featureWidget in self.heterogeneityFeatureWidgets:
      if featureWidget.getName() == "Voxel Count":
        featureWidget.addParameter("Example Parameter 1")
        featureWidget.addParameter("Example Parameter 2")
      if featureWidget.getName() == "Gray Levels":
        featureWidget.addParameter("Example Parameter 1-GL")
        featureWidget.addParameter("Example Parameter 2-GL")
    
    # compile dict of features with parameter names and values
    self.featureParametersDict = collections.OrderedDict()
    for featureWidget in self.heterogeneityFeatureWidgets:
      featureName = featureWidget.getName()      
      self.featureParametersDict[featureName] = collections.OrderedDict()
      self.updateFeatureParameterDict(0,featureWidget)
      for parameterName in featureWidget.widgetMenu.parameters:
        featureWidget.getParameterEditWindow(parameterName).connect('intValueChanged(int)', lambda intValue, featureWidget=featureWidget: self.updateFeatureParameterDict(intValue, featureWidget)) #connect intvaluechanged signals to updateParamaterDict function 
    ##########
    
    # Feature Buttons Frame and Layout
    self.featureButtonFrame = qt.QFrame(self.HeterogeneityCADCollapsibleButton)
    self.featureButtonFrame.setLayout(qt.QHBoxLayout()) 
    self.featuresHeterogeneityCADLayout.addRow(self.featureButtonFrame)
       
    # HeterogeneityCAD Apply Button
    self.HeterogeneityCADButton = qt.QPushButton("Apply HeterogeneityCAD", self.featureButtonFrame)
    self.HeterogeneityCADButton.toolTip = "Analyze input volume using selected Heterogeneity Features."
    self.featureButtonFrame.layout().addWidget(self.HeterogeneityCADButton)
    self.HeterogeneityCADButton.connect('clicked()', self.onHeterogeneityCADButtonClicked)
        
    # Save Button
    self.saveButton = qt.QPushButton("Save to File", self.featureButtonFrame)
    self.saveButton.toolTip = "Save analyses to CSV file"
    self.saveButton.enabled = False
    self.featureButtonFrame.layout().addWidget(self.saveButton)
    self.saveButton.connect('clicked()', self.onSave)
    
    #End HeterogeneityCAD Features Collapsible Button
    #################################################
    #Feature Summary Chart

    #Complete chart options, export list of user-selected options identified via connections to labelstatistics module
    self.chartOptions = ("Count", "Volume mm^3", "Volume cc", "Min", "Max", "Mean", "StdDev")
    self.StatisticsChartCollapsibleButton = ctk.ctkCollapsibleButton()
    self.StatisticsChartCollapsibleButton.text = "HeterogeneityCAD Features Summary"
    self.layout.addWidget(self.StatisticsChartCollapsibleButton)
    self.StatisticsChartLayout = qt.QFormLayout(self.StatisticsChartCollapsibleButton)
    self.StatisticsChartCollapsibleButton.collapsed = False
    
    #Table View to display Label statistics
    self.view = qt.QTableView(self.StatisticsChartCollapsibleButton)
    self.view.sortingEnabled = True
    self.StatisticsChartLayout.addWidget(self.view)
    self.view.minimumHeight = 175   
Exemplo n.º 14
0
    def createUserInterface(self):
        '''
    '''
        self.__layout = super(EMSegmentQuickStep3, self).createUserInterface()

        self.__top = qt.QWidget()
        self.__topLayout = qt.QHBoxLayout(self.__top)

        # the anatomical tree
        anatomicalTreeGroupBox = qt.QGroupBox()
        anatomicalTreeGroupBox.setTitle('Anatomical Tree')
        self.__topLayout.addWidget(anatomicalTreeGroupBox)

        anatomicalTreeGroupBoxLayout = qt.QFormLayout(anatomicalTreeGroupBox)

        self.__anatomicalTree = slicer.modulewidget.qSlicerEMSegmentAnatomicalTreeWidget(
        )
        self.__anatomicalTree.structureNameEditable = False
        self.__anatomicalTree.labelColumnVisible = False
        self.__anatomicalTree.probabilityMapColumnVisible = False
        self.__anatomicalTree.classWeightColumnVisible = False
        self.__anatomicalTree.updateClassWeightColumnVisible = False
        self.__anatomicalTree.atlasWeightColumnVisible = False
        self.__anatomicalTree.alphaColumnVisible = False
        self.__anatomicalTree.displayAlphaCheckBoxVisible = False
        self.__anatomicalTree.setMinimumHeight(200)
        self.__anatomicalTree.toolTip = 'Select a structure to configure the intensity distribution.'
        self.__anatomicalTree.setSizePolicy(qt.QSizePolicy.MinimumExpanding,
                                            qt.QSizePolicy.MinimumExpanding)
        self.__anatomicalTree.connect('currentTreeNodeChanged(vtkMRMLNode*)',
                                      self.onTreeSelectionChanged)
        anatomicalTreeGroupBoxLayout.addWidget(self.__anatomicalTree)

        #
        # overview of class weights panel
        #
        self.__overviewBox = qt.QGroupBox()
        self.__overviewBox.title = 'Guesses of Probability'
        self.__overviewBox.toolTip = 'These are your guesses of probability relations between structures. Which structure takes how much percentage of the volume?'
        self.__overviewBoxLayout = qt.QVBoxLayout(self.__overviewBox)
        self.__topLayout.addWidget(self.__overviewBox)

        self.__layout.addWidget(self.__top)

        self.__tabWidget = qt.QTabWidget()
        self.__layout.addWidget(self.__tabWidget)

        #
        # manualSamplingPage
        #
        manualSamplingPage = qt.QWidget()
        manualSamplingPageLayout = qt.QFormLayout(manualSamplingPage)

        self.__classLabel2 = qt.QLabel("Class: XX")
        manualSamplingPageLayout.addWidget(self.__classLabel2)

        self.__infoLabel = qt.QLabel(
            "left mouse Click in a slice window to pick a sample")
        manualSamplingPageLayout.addWidget(self.__infoLabel)

        self.__manualSampleTable = qt.QTableWidget()
        manualSamplingPageLayout.addWidget(self.__manualSampleTable)

        self.__tabWidget.addTab(manualSamplingPage, "Manual Sampling")

        self.__plotDistributionButton = qt.QPushButton()
        self.__plotDistributionButton.text = "Plot Distribution"
        self.__plotDistributionButton.toolTip = 'Click to plot the intensity distributions for all structures.'
        self.__layout.addRow(self.__plotDistributionButton)
        self.__plotDistributionButton.connect('clicked()',
                                              self.plotDistribution)
Exemplo n.º 15
0
    def construct(self):
        """ Constructs the MetadataEditorSet widget.
        """

        #--------------------
        # Loop through all folders as per
        # Xnat.path.DEFAULT_LEVELS.  We create an AnimatedCollapsible
        # for every folder, one MetadataEditor_Custom and one
        # MetadataEditor_Default, along with the relevant buttons for
        # very folder in XNAT_LEVELS.
        #--------------------
        for xnatLevel in Xnat.path.DEFAULT_LEVELS:

            #
            # Set DEFAULT label per xnat level.
            #
            self.labels[xnatLevel] = []
            self.labels[xnatLevel].append(qt.QLabel('<b>DEFAULT<b>'))
            self.labels[xnatLevel][0].setFont(
                XnatSlicerGlobals.LABEL_FONT_BOLD)

            #
            # Set the collapsible's internal layout
            # (a qt.QGridLayout) per folder.
            #
            self.collapsibleLayouts[xnatLevel] = qt.QGridLayout()
            self.collapsibleLayouts[xnatLevel].\
                addWidget(self.labels[xnatLevel][0], 0, 0)

            #
            # Set the MetadataEditor_Default,
            # add to layout.
            #
            self.defaultMetadataEditors[xnatLevel] = \
            MetadataEditor_Default(xnatLevel)
            self.collapsibleLayouts[xnatLevel].\
                addWidget(self.defaultMetadataEditors[xnatLevel], 1, 0)

            #
            # Set the MetadataEditor_Custom,
            # add to layout.
            #
            self.customMetadataEditors[xnatLevel] = \
                MetadataEditor_Custom(xnatLevel)
            self.collapsibleLayouts[xnatLevel].\
                addWidget(self.customMetadataEditors[xnatLevel], 1, 1, 1, 2)

            #
            # Set DEFAULT label per xnat level.
            #
            self.labels[xnatLevel].append(qt.QLabel('<b>CUSTOM<b>'))
            self.labels[xnatLevel][1].setFont(
                XnatSlicerGlobals.LABEL_FONT_BOLD)
            self.collapsibleLayouts[xnatLevel].\
                addWidget(self.labels[xnatLevel][1], 0, 1)

            #
            # Add the 'editCustom' button.
            #
            # NOTE: The user can choose to hide/show these buttons,
            # based on what's needed.  For isntance, the Settings['METADATA']
            # class hides these buttons as they are not necessary for
            # its workflow.
            #
            self.editCustomButtons[xnatLevel] = \
                XnatSlicerUtils.generateButton(iconOrLabel = \
                    "Edit custom tags for '%s'"%(xnatLevel),
                toolTip = "Adds a custom metadata tag to display in the" +
                                               " 'Info' column.",
                font = XnatSlicerGlobals.LABEL_FONT,
                size = qt.QSize(180, 20),
                enabled = True)

            self.collapsibleLayouts[xnatLevel].\
                addWidget(self.editCustomButtons[xnatLevel], 0, 2)
            self.editCustomButtonGroup.\
                addButton(self.editCustomButtons[xnatLevel])

            #
            # Put all of the widgets into first, a contentsWidget.
            # Then set the widget of the AnimatedCollapsible to the
            # contentsWidget.
            #
            self.collapsibles[xnatLevel] = AnimatedCollapsible(self, \
                                                        xnatLevel.title())
            self.collapsibles[xnatLevel].setMaxExpandedHeight(250)
            self.collapsibles[xnatLevel].setMinExpandedHeight(250)

            contentsWidget = qt.QWidget()
            contentsWidget.setLayout(self.collapsibleLayouts[xnatLevel])
            self.collapsibles[xnatLevel].setContents(contentsWidget)
            self.collapsibles[xnatLevel].setFixedWidth(550)

            #
            # Add collapsible to self.mainLayout.
            #
            self.mainLayout.addWidget(self.collapsibles[xnatLevel])
            self.mainLayout.addSpacing(10)

        #--------------------
        # Set callback to Update XNATSlicer's
        # layout when animating.
        #--------------------
        for key, collapsible in self.collapsibles.iteritems():
            collapsible.onEvent('animate', self.updateLayout)

        #--------------------
        # Set mainLayout to the master layout.
        #--------------------
        self.mainLayout.addStretch()
        self.setLayout(self.mainLayout)

        #--------------------
        # Set the current item tyype to label.
        # The user can change it to 'checkbox'
        # later.
        #--------------------
        self.setItemType('label')
Exemplo n.º 16
0
    def __init__(self, logic):
        super(VisualizationWidget, self).__init__()
        self.rockCount = 0
        self.rocking = False
        self.rockTimer = None
        self.flickerTimer = None
        self.logic = logic
        self.revealCursor = None
        self.volumes = (
            "Fixed",
            "Moving",
            "Transformed",
        )
        self.layoutOptions = (
            "Axial",
            "Coronal",
            "Sagittal",
            "Axi/Sag/Cor",
        )
        self.layoutOption = 'Axi/Sag/Cor'
        self.volumeDisplayCheckboxes = {}

        # mimic the structure of the LandmarksWidget for visual
        # consistency (it needs sub widget so it can delete and refresh the internals)
        self.widget = qt.QWidget()
        self.layout = qt.QFormLayout(self.widget)
        self.boxHolder = qt.QWidget()
        self.boxHolder.setLayout(qt.QVBoxLayout())
        self.layout.addRow(self.boxHolder)
        self.groupBox = qt.QGroupBox("Visualization")
        self.groupBoxLayout = qt.QFormLayout(self.groupBox)
        self.boxHolder.layout().addWidget(self.groupBox)

        #
        # layout selection
        #
        layoutHolder = qt.QWidget()
        layout = qt.QHBoxLayout()
        layoutHolder.setLayout(layout)
        for layoutOption in self.layoutOptions:
            layoutButton = qt.QPushButton(layoutOption)
            layoutButton.connect('clicked()',
                                 lambda lo=layoutOption: self.selectLayout(lo))
            layout.addWidget(layoutButton)
        self.groupBoxLayout.addRow("Layout", layoutHolder)

        #
        # Volume display selection
        #
        checkboxHolder = qt.QWidget()
        layout = qt.QHBoxLayout()
        checkboxHolder.setLayout(layout)
        for volume in self.volumes:
            checkBox = qt.QCheckBox()
            checkBox.text = volume
            checkBox.checked = True
            checkBox.connect('toggled(bool)', self.updateVisualization)
            layout.addWidget(checkBox)
            self.volumeDisplayCheckboxes[volume] = checkBox
        checkBox = qt.QCheckBox()
        checkBox.text = "RevealCursor"
        checkBox.checked = False
        checkBox.connect('toggled(bool)', self.revealToggled)
        layout.addWidget(checkBox)
        self.groupBoxLayout.addRow("Display", checkboxHolder)

        #
        # fade slider
        #
        fadeHolder = qt.QWidget()
        fadeLayout = qt.QHBoxLayout()
        fadeHolder.setLayout(fadeLayout)
        self.fadeSlider = ctk.ctkSliderWidget()
        self.fadeSlider.minimum = 0
        self.fadeSlider.maximum = 1.0
        self.fadeSlider.value = 0.5
        self.fadeSlider.singleStep = 0.05
        self.fadeSlider.connect('valueChanged(double)', self.onFadeChanged)
        fadeLayout.addWidget(self.fadeSlider)

        #
        # Rock and Flicker
        #
        animaHolder = qt.QWidget()
        animaLayout = qt.QVBoxLayout()
        animaHolder.setLayout(animaLayout)
        fadeLayout.addWidget(animaHolder)
        # Rock
        checkBox = qt.QCheckBox()
        checkBox.text = "Rock"
        checkBox.checked = False
        checkBox.connect('toggled(bool)', self.onRockToggled)
        animaLayout.addWidget(checkBox)
        # Flicker
        checkBox = qt.QCheckBox()
        checkBox.text = "Flicker"
        checkBox.checked = False
        checkBox.connect('toggled(bool)', self.onFlickerToggled)
        animaLayout.addWidget(checkBox)

        self.groupBoxLayout.addRow("Fade", fadeHolder)

        #
        # zoom control
        #
        zoomHolder = qt.QWidget()
        layout = qt.QHBoxLayout()
        zoomHolder.setLayout(layout)
        zooms = {
            "+": 0.7,
            "-": 1.3,
            "Fit": "Fit",
        }
        for zoomLabel, zoomFactor in zooms.items():
            zoomButton = qt.QPushButton(zoomLabel)
            zoomButton.connect('clicked()',
                               lambda zf=zoomFactor: self.onZoom(zf))
            layout.addWidget(zoomButton)
        self.groupBoxLayout.addRow("Zoom", zoomHolder)