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
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)
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)
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()
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()
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)
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)
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
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 )
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)
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)
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
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)
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')
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)