def setup(self): self.mainFrame = qt.QFrame() frameLayout = qt.QGridLayout() self.mainFrame.setLayout(frameLayout) self.layout.addWidget(self.mainFrame) self.saveButton = ctk.ctkPushButton() self.saveButton.text = "Save" self.saveButton.toolTip = "Save the current table" self.saveButton.objectName = "reportSaveButton" self.saveButton.setIcon(qt.QIcon("{0}/Save.png".format(SlicerUtil.CIP_ICON_DIR))) self.saveButton.setIconSize(qt.QSize(24, 24)) frameLayout.addWidget(self.saveButton, 0, 0) self.openButton = ctk.ctkPushButton() self.openButton.text = "Open" self.openButton.toolTip = "Open all the results saved" self.openButton.objectName = "reportOpenButton" self.openButton.setIcon(qt.QIcon("{0}/open_file.png".format(SlicerUtil.CIP_ICON_DIR))) self.openButton.setIconSize(qt.QSize(24,24)) frameLayout.addWidget(self.openButton, 0, 1) self.exportButton = ctk.ctkPushButton() self.exportButton.text = "Export" self.exportButton.toolTip = "Export all the saved results to a CSV file" self.exportButton.objectName = "reportExportButton" self.exportButton.setIcon(qt.QIcon("{0}/export-csv.png".format(SlicerUtil.CIP_ICON_DIR))) self.exportButton.setIconSize(qt.QSize(24,24)) frameLayout.addWidget(self.exportButton, 0, 2) self.removeButton = ctk.ctkPushButton() self.removeButton.setIcon(qt.QIcon("{0}/delete.png".format(SlicerUtil.CIP_ICON_DIR))) self.removeButton.setIconSize(qt.QSize(24,24)) self.removeButton.text = "Clean cache" frameLayout.addWidget(self.removeButton, 0, 3) self.printButton = ctk.ctkPushButton() self.printButton.text = "Print" self.printButton.toolTip = "Print report" self.printButton.objectName = "reportPrintButton" self.printButton.setIcon(qt.QIcon("{0}/print.png".format(SlicerUtil.CIP_ICON_DIR))) self.printButton.setIconSize(qt.QSize(24,24)) self.printButton.setVisible(False) # By default, this button will be hidden frameLayout.addWidget(self.printButton, 0, 4) self.additionalComentsLabel = qt.QLabel("Additional comments:") self.additionalComentsLabel.setStyleSheet("margin-top: 3px") frameLayout.addWidget(self.additionalComentsLabel, 1, 0, 1, 2) self.additionalComentsTextEdit = CollapsibleMultilineText() frameLayout.addWidget(self.additionalComentsTextEdit, 1, 1, 1, 3) self.openButton.connect('clicked()', self.onShowStoredData) self.saveButton.connect('clicked()', self.onSave) self.exportButton.connect('clicked()', self.onExport) self.printButton.connect('clicked()', self.onPrintReport) self.removeButton.connect('clicked()', self.onRemoveStoredData)
def __init__(self, parent): """ Window that display the data :param parent: CaseReportsWidget object """ super(CaseReportsWindow, self).__init__() self.mainLayout = qt.QVBoxLayout(self) self.setLayout(self.mainLayout) self.resize(400, 300) self.label = qt.QLabel("Data stored in the module: ") self.label.setStyleSheet("margin: 10px 0 15px 0") self.mainLayout.addWidget(self.label) self.tableView = slicer.qMRMLTableView() self.tableView.setColumnWidth(0, 125) self.tableView.setMRMLTableNode(parent.logic.tableNode) self.tableView.setFirstRowLocked(True) # First row will be headers self.tableView.setSortingEnabled(True) self.tableView.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Expanding) self.mainLayout.addWidget(self.tableView) self.expandRowsButton = ctk.ctkPushButton() self.expandRowsButton.text = "Expand rows" self.expandRowsButton.toolTip = "Change the height of the rows to show/hide all the multiline data" self.expandRowsButton.setFixedWidth(150) self.expandRowsButton.setIcon( qt.QIcon("{0}/reload.png".format(SlicerUtil.CIP_ICON_DIR))) self.expandRowsButton.setIconSize(qt.QSize(24, 24)) self.mainLayout.addWidget(self.expandRowsButton) self.exportButton = ctk.ctkPushButton() self.exportButton.text = "Export" self.exportButton.toolTip = "Export to a CVS file" self.exportButton.setFixedWidth(150) self.exportButton.setIcon( qt.QIcon("{0}/export-csv.png".format(SlicerUtil.CIP_ICON_DIR))) self.exportButton.setIconSize(qt.QSize(24, 24)) self.mainLayout.addWidget(self.exportButton) self.removeButton = ctk.ctkPushButton() self.removeButton.text = "Clean" self.removeButton.setIcon( qt.QIcon("{0}/delete.png".format(SlicerUtil.CIP_ICON_DIR))) self.removeButton.setIconSize(qt.QSize(24, 24)) self.removeButton.setFixedWidth(150) self.mainLayout.addWidget(self.removeButton) self.expandRowsButton.connect('clicked()', parent.onExpandRows) self.exportButton.connect('clicked()', parent.onExport) self.removeButton.connect('clicked()', parent.onRemoveStoredData)
def setup(self): """This is called one time when the module GUI is initialized """ ScriptedLoadableModuleWidget.setup(self) # Create objects that can be used anywhere in the module. Example: in most cases there should be just one # object of the logic class self.logic = CIP_PAARatioLogic() # # Create all the widgets. Example Area mainAreaCollapsibleButton = ctk.ctkCollapsibleButton() mainAreaCollapsibleButton.text = "Main parameters" self.layout.addWidget(mainAreaCollapsibleButton) self.mainAreaLayout = qt.QGridLayout(mainAreaCollapsibleButton) self.label = qt.QLabel("Select the volume") self.label.setStyleSheet("margin:10px 0 20px 7px") self.mainAreaLayout.addWidget(self.label, 0, 0) self.volumeSelector = slicer.qMRMLNodeComboBox() self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "") self.volumeSelector.name = "paa_volumeSelector" self.volumeSelector.selectNodeUponCreation = True self.volumeSelector.autoFillBackground = True self.volumeSelector.addEnabled = True self.volumeSelector.noneEnabled = False self.volumeSelector.removeEnabled = False self.volumeSelector.showHidden = False self.volumeSelector.showChildNodeTypes = False self.volumeSelector.setMRMLScene(slicer.mrmlScene) self.volumeSelector.setStyleSheet( "margin:0px 0 0px 0; padding:2px 0 2px 5px") self.mainAreaLayout.addWidget(self.volumeSelector, 0, 1) self.jumptToTemptativeSliceButton = ctk.ctkPushButton() self.jumptToTemptativeSliceButton.name = "jumptToTemptativeSliceButton" self.jumptToTemptativeSliceButton.text = "Jump to temptative slice" self.jumptToTemptativeSliceButton.toolTip = "Jump to the best estimated slice to place the rulers" self.jumptToTemptativeSliceButton.setIcon( qt.QIcon("{0}/ruler.png".format(SlicerUtil.CIP_ICON_DIR))) self.jumptToTemptativeSliceButton.setIconSize(qt.QSize(20, 20)) self.jumptToTemptativeSliceButton.setStyleSheet("font-weight: bold;") # self.jumptToTemptativeSliceButton.setFixedWidth(140) self.mainAreaLayout.addWidget(self.jumptToTemptativeSliceButton, 1, 1) ### Structure Selector self.structuresGroupbox = qt.QGroupBox("Select the structure") self.groupboxLayout = qt.QVBoxLayout() self.structuresGroupbox.setLayout(self.groupboxLayout) self.mainAreaLayout.addWidget(self.structuresGroupbox, 2, 0) self.structuresButtonGroup = qt.QButtonGroup() # btn = qt.QRadioButton("None") # btn.visible = False # self.structuresButtonGroup.addButton(btn) # self.groupboxLayout.addWidget(btn) btn = qt.QRadioButton("Both") btn.name = "paaButton" btn.checked = True self.structuresButtonGroup.addButton(btn, 0) self.groupboxLayout.addWidget(btn) btn = qt.QRadioButton("Pulmonary Arterial") btn.name = "paRadioButton" self.structuresButtonGroup.addButton(btn, 1) self.groupboxLayout.addWidget(btn) btn = qt.QRadioButton("Aorta") btn.name = "aortaRadioButton" self.structuresButtonGroup.addButton(btn, 2) self.groupboxLayout.addWidget(btn) ### Buttons toolbox self.buttonsToolboxFrame = qt.QFrame() self.buttonsToolboxLayout = qt.QGridLayout() self.buttonsToolboxFrame.setLayout(self.buttonsToolboxLayout) self.mainAreaLayout.addWidget(self.buttonsToolboxFrame, 2, 1) self.placeRulersButton = ctk.ctkPushButton() self.placeRulersButton.text = "Place ruler/s" self.placeRulersButton.name = "placeRulersButton" self.placeRulersButton.toolTip = "Place the ruler/s for the selected structure/s in the current slice" self.placeRulersButton.setIcon( qt.QIcon("{0}/ruler.png".format(SlicerUtil.CIP_ICON_DIR))) self.placeRulersButton.setIconSize(qt.QSize(20, 20)) self.placeRulersButton.setFixedWidth(105) self.placeRulersButton.setStyleSheet("font-weight:bold") self.buttonsToolboxLayout.addWidget(self.placeRulersButton, 0, 0) self.moveUpButton = ctk.ctkPushButton() self.moveUpButton.text = "Move up" self.moveUpButton.toolTip = "Move the selected ruler/s one slice up" self.moveUpButton.setIcon( qt.QIcon("{0}/move_up.png".format(SlicerUtil.CIP_ICON_DIR))) self.moveUpButton.setIconSize(qt.QSize(20, 20)) self.moveUpButton.setFixedWidth(95) self.buttonsToolboxLayout.addWidget(self.moveUpButton, 0, 1) self.moveDownButton = ctk.ctkPushButton() self.moveDownButton.text = "Move down" self.moveDownButton.toolTip = "Move the selected ruler/s one slice down" self.moveDownButton.setIcon( qt.QIcon("{0}/move_down.png".format(SlicerUtil.CIP_ICON_DIR))) self.moveDownButton.setIconSize(qt.QSize(20, 20)) self.moveDownButton.setFixedWidth(95) self.buttonsToolboxLayout.addWidget(self.moveDownButton, 0, 2) self.removeButton = ctk.ctkPushButton() self.removeButton.text = "Remove ALL rulers" self.removeButton.toolTip = "Remove all the rulers for this volume" self.removeButton.setIcon( qt.QIcon("{0}/delete.png".format(SlicerUtil.CIP_ICON_DIR))) self.removeButton.setIconSize(qt.QSize(20, 20)) self.buttonsToolboxLayout.addWidget(self.removeButton, 1, 1, 1, 2, 2) ### Textboxes self.textboxesFrame = qt.QFrame() self.textboxesLayout = qt.QFormLayout() self.textboxesFrame.setLayout(self.textboxesLayout) self.textboxesFrame.setFixedWidth(190) self.mainAreaLayout.addWidget(self.textboxesFrame, 3, 0) self.paTextBox = qt.QLineEdit() self.paTextBox.setReadOnly(True) self.textboxesLayout.addRow("PA (mm): ", self.paTextBox) self.aortaTextBox = qt.QLineEdit() self.aortaTextBox.setReadOnly(True) self.textboxesLayout.addRow("Aorta (mm): ", self.aortaTextBox) self.ratioTextBox = qt.QLineEdit() self.ratioTextBox.name = "ratioTextBox" self.ratioTextBox.setReadOnly(True) self.textboxesLayout.addRow("Ratio PA/A: ", self.ratioTextBox) # Save case data self.reportsCollapsibleButton = ctk.ctkCollapsibleButton() self.reportsCollapsibleButton.text = "Reporting" self.layout.addWidget(self.reportsCollapsibleButton) self.reportsLayout = qt.QHBoxLayout(self.reportsCollapsibleButton) self.storedColumnNames = [ "caseId", "paDiameterMm", "aortaDiameterMm", "pa1r", "pa1a", "pa1s", "pa2r", "pa2a", "pa2s", "a1r", "a1a", "a1s", "a2r", "a2a", "a2s" ] columns = CaseReportsWidget.getColumnKeysNormalizedDictionary( self.storedColumnNames) self.reportsWidget = CaseReportsWidget( self.moduleName, columns, parentWidget=self.reportsCollapsibleButton) self.reportsWidget.setup() # Init state self.resetModuleState() self.preventSavingState = False self.saveStateBeforeEnteringModule() self.preventSavingState = True self.switchToRedView() ##### # Case navigator if SlicerUtil.isSlicerACILLoaded(): caseNavigatorAreaCollapsibleButton = ctk.ctkCollapsibleButton() caseNavigatorAreaCollapsibleButton.text = "Case navigator" self.layout.addWidget(caseNavigatorAreaCollapsibleButton, 0x0020) # caseNavigatorLayout = qt.QVBoxLayout(caseNavigatorAreaCollapsibleButton) # Add a case list navigator from ACIL.ui import CaseNavigatorWidget self.caseNavigatorWidget = CaseNavigatorWidget( self.moduleName, caseNavigatorAreaCollapsibleButton) self.caseNavigatorWidget.setup() self.layout.addStretch() # Connections self.observers = [] self.volumeSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.onVolumeSelectorChanged) self.jumptToTemptativeSliceButton.connect( 'clicked()', self.onJumpToTemptativeSliceButtonClicked) self.placeRulersButton.connect('clicked()', self.onPlaceRulersClicked) self.moveUpButton.connect('clicked()', self.onMoveUpRulerClicked) self.moveDownButton.connect('clicked()', self.onMoveDownRulerClicked) self.removeButton.connect('clicked()', self.onRemoveRulerClicked) self.reportsWidget.addObservable( self.reportsWidget.EVENT_SAVE_BUTTON_CLICKED, self.onSaveReport) # Init state self.resetModuleState() self.preventSavingState = False self.saveStateBeforeEnteringModule() self.preventSavingState = True
def setup(self): """Init the widget """ # self.firstLoad = True ScriptedLoadableModuleWidget.setup(self) # Create objects that can be used anywhere in the module. Example: in most cases there should be just one # object of the logic class self._initLogic_() ########## # Main area self.mainAreaCollapsibleButton = ctk.ctkCollapsibleButton() self.mainAreaCollapsibleButton.text = "Main area" self.layout.addWidget(self.mainAreaCollapsibleButton, SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.mainLayout = qt.QGridLayout(self.mainAreaCollapsibleButton) # Node selector volumeLabel = qt.QLabel("Active volume: ") volumeLabel.setStyleSheet("margin-left:5px") self.mainLayout.addWidget(volumeLabel, 0, 0) self.volumeSelector = slicer.qMRMLNodeComboBox() self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "") self.volumeSelector.selectNodeUponCreation = True self.volumeSelector.autoFillBackground = True self.volumeSelector.addEnabled = False self.volumeSelector.noneEnabled = False self.volumeSelector.removeEnabled = False self.volumeSelector.showHidden = False self.volumeSelector.showChildNodeTypes = False self.volumeSelector.setMRMLScene(slicer.mrmlScene) self.volumeSelector.setMinimumWidth(150) self.volumeSelector.setStyleSheet("margin: 15px 0") # self.volumeSelector.selectNodeUponCreation = False self.mainLayout.addWidget(self.volumeSelector, 0, 1, 1, 2) self.volumeSelector.connect('currentNodeChanged(vtkMRMLNode*)', self._onMainVolumeChanged_) ### Radio buttons frame self.radioButtonsFrame = qt.QFrame() self.radioButtonsLayout = qt.QHBoxLayout(self.radioButtonsFrame) self.typesFrame = qt.QFrame() self.radioButtonsLayout.addWidget(self.typesFrame) self.typesLayout = qt.QVBoxLayout(self.typesFrame) labelsStyle = "font-weight: bold; margin: 0 0 10px 0px;" # Types Radio Buttons typesLabel = qt.QLabel("Select type") typesLabel.setStyleSheet(labelsStyle) self.typesLayout.addWidget(typesLabel) self.typesRadioButtonGroup = qt.QButtonGroup() for key in self.logic.params.mainTypes.keys(): rbitem = qt.QRadioButton(self.logic.params.getMainTypeLabel(key)) self.typesRadioButtonGroup.addButton(rbitem, key) self.typesLayout.addWidget(rbitem) self.typesRadioButtonGroup.buttons()[0].setChecked(True) # Subtypes Radio buttons # The content will be loaded dynamically every time the main type is modified self.subtypesFrame = qt.QFrame() self.radioButtonsLayout.addWidget(self.subtypesFrame) self.subtypesLayout = qt.QVBoxLayout(self.subtypesFrame) subtypesLabel = qt.QLabel("Select subtype") subtypesLabel.setStyleSheet(labelsStyle) self.subtypesLayout.addWidget(subtypesLabel) self.subtypesLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.subtypesRadioButtonGroup = qt.QButtonGroup() # Add all the subtypes (we will filter later in "updateState" function) for key in self.logic.params.subtypes.keys(): # Build the description rbitem = qt.QRadioButton(self.logic.params.getSubtypeLabel(key)) self.subtypesRadioButtonGroup.addButton(rbitem, key) self.subtypesLayout.addWidget(rbitem, SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.subtypesLayout.addStretch() # Region radio buttons self.regionsFrame = qt.QFrame() self.radioButtonsLayout.addWidget(self.regionsFrame) self.regionsLayout = qt.QVBoxLayout(self.regionsFrame) regionsLabel = qt.QLabel("Select region") regionsLabel.setStyleSheet(labelsStyle) self.regionsLayout.addWidget(regionsLabel) self.regionsLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.regionsLayout.setStretch(0, 0) self.regionsRadioButtonGroup = qt.QButtonGroup() self.regionsFrame = qt.QFrame() # Add all the regions for key in self.logic.params.regions.keys(): # Build the description rbitem = qt.QRadioButton(self.logic.params.getRegionLabel(key)) self.regionsRadioButtonGroup.addButton(rbitem, key) self.regionsLayout.addWidget(rbitem, SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.regionsLayout.addStretch() self.regionsRadioButtonGroup.buttons()[0].setChecked(True) # Artifact radio buttons (Add them to the same layout as the type) # self.separatorLabel = qt.QLabel("------------") # labelsStyle = "margin: 5px 0 5px 0;" # self.separatorLabel.setStyleSheet(labelsStyle) # self.typesLayout.addWidget(self.separatorLabel) # self.artifactsLabel = qt.QLabel("Select artifact") # labelsStyle = "font-weight: bold; margin: 15px 0 10px 0;" # self.artifactsLabel.setStyleSheet(labelsStyle) # self.typesLayout.addWidget(self.artifactsLabel) # self.artifactsRadioButtonGroup = qt.QButtonGroup() # for artifactId in self.logic.params.artifacts.iterkeys(): # rbitem = qt.QRadioButton(self.logic.params.getArtifactLabel(artifactId)) # self.artifactsRadioButtonGroup.addButton(rbitem, artifactId) # self.typesLayout.addWidget(rbitem) # self.artifactsRadioButtonGroup.buttons()[0].setChecked(True) # self.typesLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.typesLayout.addStretch() # Connections self.typesRadioButtonGroup.connect("buttonClicked (QAbstractButton*)", self.__onTypesRadioButtonClicked__) self.subtypesRadioButtonGroup.connect( "buttonClicked (QAbstractButton*)", self.__onSecondaryRadioButtonClicked__) self.regionsRadioButtonGroup.connect( "buttonClicked (QAbstractButton*)", self.__onSecondaryRadioButtonClicked__) # self.artifactsRadioButtonGroup.connect("buttonClicked (QAbstractButton*)", self.__onTypesRadioButtonClicked__) self.mainLayout.addWidget(self.radioButtonsFrame, 2, 0, 1, 3, SlicerUtil.ALIGNMENT_VERTICAL_TOP) # Save results button self.saveResultsButton = ctk.ctkPushButton() self.saveResultsButton.setText("Save results") self.saveResultsButton.toolTip = "Save the results labelmap in the specified directory" self.saveResultsButton.setIcon( qt.QIcon("{0}/Save.png".format(SlicerUtil.CIP_ICON_DIR))) self.saveResultsButton.setIconSize(qt.QSize(20, 20)) self.saveResultsButton.setFixedWidth(135) self.mainLayout.addWidget(self.saveResultsButton, 4, 0) self.saveResultsButton.connect('clicked()', self._onSaveResultsButtonClicked_) # Save results directory button defaultPath = os.path.join( SlicerUtil.getSettingsDataFolder(self.moduleName), "results") # Assign a default path for the results path = SlicerUtil.settingGetOrSetDefault(self.moduleName, "SaveResultsDirectory", defaultPath) self.saveResultsDirectoryButton = ctk.ctkDirectoryButton() self.saveResultsDirectoryButton.directory = path self.saveResultsDirectoryButton.setMaximumWidth(440) self.mainLayout.addWidget(self.saveResultsDirectoryButton, 4, 1, 1, 2) self.saveResultsDirectoryButton.connect( "directoryChanged (QString)", self._onSaveResultsDirectoryChanged_) self._createSegmentEditorWidget_() # MIP viewer (by default it will be hidden) self.mipCollapsibleButton = ctk.ctkCollapsibleButton() self.mipCollapsibleButton.text = "MIP viewer" mipLayout = qt.QVBoxLayout(self.mipCollapsibleButton) self.mainLayout.addWidget(self.mipCollapsibleButton) self.mipViewer = CIPUI.MIPViewerWidget(mipLayout) self.mipCollapsibleButton.setVisible(False) self.mipViewer.setup() self.mipViewer.isCrosshairEnabled = False self.mipCollapsibleButton.collapsed = True ##### # Case navigator self.caseNavigatorWidget = None if SlicerUtil.isSlicerACILLoaded(): caseNavigatorAreaCollapsibleButton = ctk.ctkCollapsibleButton() caseNavigatorAreaCollapsibleButton.text = "Case navigator" self.layout.addWidget(caseNavigatorAreaCollapsibleButton, 0x0020) # caseNavigatorLayout = qt.QVBoxLayout(caseNavigatorAreaCollapsibleButton) # Add a case list navigator from ACIL.ui import CaseNavigatorWidget self.caseNavigatorWidget = CaseNavigatorWidget( self.moduleName, caseNavigatorAreaCollapsibleButton) self.caseNavigatorWidget.setup() # Listen for event in order to save the current labelmap before moving to the next case self.caseNavigatorWidget.addObservable( self.caseNavigatorWidget.EVENT_PRE_NEXT, self._checkSaveChanges_) self.caseNavigatorWidget.addObservable( self.caseNavigatorWidget.EVENT_PRE_PREVIOUS, self._checkSaveChanges_) self.caseNavigatorWidget.addObservable( self.caseNavigatorWidget.EVENT_PRE_LABELMAP_LOAD, self._onPreNavigatorLabelmapLoaded_) self.caseNavigatorWidget.addObservable( self.caseNavigatorWidget.EVENT_LABELMAP_LOADED, self._onNavigatorLabelmapLoaded_) self.layout.addStretch() # Extra Connections self._createSceneObservers_() self.disableEvents = False self.setMainTypeGUIProperties()
def setup(self): """Init the widget """ # self.firstLoad = True ScriptedLoadableModuleWidget.setup(self) self.disableEvents = False # Create objects that can be used anywhere in the module. Example: in most cases there should be just one # object of the logic class self._initLogic_() ########## # Main area self.mainAreaCollapsibleButton = ctk.ctkCollapsibleButton() self.mainAreaCollapsibleButton.text = "Main area" self.layout.addWidget(self.mainAreaCollapsibleButton, SlicerUtil.ALIGNMENT_VERTICAL_TOP) # self.layout.addWidget(self.mainAreaCollapsibleButton) # self.mainLayout = qt.QGridLayout(self.mainAreaCollapsibleButton) self.mainLayout = qt.QFormLayout(self.mainAreaCollapsibleButton) row = 0 # Node selector volumeLabel = qt.QLabel("Active volume: ") volumeLabel.setStyleSheet("margin-left:5px") # self.mainLayout.addWidget(volumeLabel, row, 0) self.volumeSelector = slicer.qMRMLNodeComboBox() self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "") self.volumeSelector.selectNodeUponCreation = True self.volumeSelector.autoFillBackground = True self.volumeSelector.addEnabled = False self.volumeSelector.noneEnabled = False self.volumeSelector.removeEnabled = False self.volumeSelector.showHidden = False self.volumeSelector.showChildNodeTypes = False self.volumeSelector.setMRMLScene(slicer.mrmlScene) self.volumeSelector.setMinimumWidth(150) # self.volumeSelector.setStyleSheet("margin: 15px 0") # self.volumeSelector.selectNodeUponCreation = False #self.mainLayout.addWidget(self.volumeSelector, row, 1) self.mainLayout.addRow(volumeLabel, self.volumeSelector) self.volumeSelector.connect('currentNodeChanged(vtkMRMLNode*)', self._onMainVolumeChanged_) row += 1 lb = qt.QLabel("Click to select the calibration type and, if needed, modify the HU value expected for that area") lb.setStyleSheet("margin:10px 0 10px 5px") self.mainLayout.addRow(lb) #self.mainLayout.addWidget(lb, row, 0, 1, 2) self.typeRadioButtonGroup = qt.QButtonGroup() self.typeRadioButtonGroup.connect("buttonClicked (QAbstractButton*)", self.__onTypeRadioButtonClicked__) row += 1 self.rbAir = qt.QRadioButton("Air") self.rbAir.setStyleSheet("margin-left:10px; margin-top: 5px") self.typeRadioButtonGroup.addButton(self.rbAir, 1) # self.mainLayout.addWidget(self.rbAir, row, 0) self.txtAir = qt.QLineEdit() self.txtAir.setText("-1000") self.txtAir.setFixedWidth(80) self.txtAir.setValidator(qt.QIntValidator()) self.mainLayout.addRow(self.rbAir, self.txtAir) row += 1 self.rbBlood = qt.QRadioButton("Blood") self.rbBlood.setStyleSheet("margin-left:10px; margin-top: 5px") self.typeRadioButtonGroup.addButton(self.rbBlood, 2) # self.mainLayout.addWidget(self.rbBlood, row, 0) self.txtBlood = qt.QLineEdit() self.txtBlood.setText("50") self.txtBlood.setFixedWidth(80) self.txtBlood.setValidator(qt.QIntValidator()) # self.mainLayout.addWidget(self.txtBlood, row, 1) self.mainLayout.addRow(self.rbBlood, self.txtBlood) row += 1 # Calibrate button self.calibrateButton = ctk.ctkPushButton() self.calibrateButton.setText("Calibrate") self.calibrateButton.toolTip = "Run the calibration" self.calibrateButton.setIcon(qt.QIcon("{0}/scale.png".format(SlicerUtil.CIP_ICON_DIR))) self.calibrateButton.setIconSize(qt.QSize(20, 20)) self.calibrateButton.setFixedWidth(135) self.mainLayout.addRow(None, self.calibrateButton) self.calibrateButton.connect('clicked()', self._onCalibrateButtonClicked_) self._createEditorWidget_() self.setEditorValues()
def setup(self): """This is called one time when the module GUI is initialized """ ScriptedLoadableModuleWidget.setup(self) # Create objects that can be used anywhere in the module. Example: in most cases there should be just one # object of the logic class self.logic = CIP_ParenchymaSubtypeTrainingLogic() self.currentVolumeLoaded = None self.blockNodeEvents = False ########## # Main area self.mainAreaCollapsibleButton = ctk.ctkCollapsibleButton() self.mainAreaCollapsibleButton.text = "Main area" self.layout.addWidget(self.mainAreaCollapsibleButton, SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.mainLayout = qt.QGridLayout(self.mainAreaCollapsibleButton) # Node selector volumeLabel = qt.QLabel("Active volume: ") volumeLabel.setStyleSheet("margin-left:5px") self.mainLayout.addWidget(volumeLabel, 0, 0) self.volumeSelector = slicer.qMRMLNodeComboBox() self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "") self.volumeSelector.selectNodeUponCreation = True self.volumeSelector.autoFillBackground = True self.volumeSelector.addEnabled = False self.volumeSelector.noneEnabled = False self.volumeSelector.removeEnabled = False self.volumeSelector.showHidden = False self.volumeSelector.showChildNodeTypes = False self.volumeSelector.setMRMLScene(slicer.mrmlScene) self.volumeSelector.setFixedWidth(250) self.volumeSelector.setStyleSheet("margin: 15px 0") #self.volumeSelector.selectNodeUponCreation = False self.mainLayout.addWidget(self.volumeSelector, 0, 1, 1, 3) labelsStyle = "font-weight: bold; margin: 0 0 5px 5px;" # Types Radio Buttons typesLabel = qt.QLabel("Select the type") typesLabel.setStyleSheet(labelsStyle) typesLabel.setFixedHeight(15) self.mainLayout.addWidget(typesLabel, 1, 0) self.typesFrame = qt.QFrame() self.typesLayout = qt.QVBoxLayout(self.typesFrame) self.mainLayout.addWidget(self.typesFrame, 2, 0, SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.typesRadioButtonGroup = qt.QButtonGroup() for key in self.logic.params.mainTypes.iterkeys(): rbitem = qt.QRadioButton(self.logic.params.getMainTypeLabel(key)) self.typesRadioButtonGroup.addButton(rbitem, key) self.typesLayout.addWidget(rbitem) self.typesRadioButtonGroup.buttons()[0].setChecked(True) # Subtypes Radio buttons subtypesLabel = qt.QLabel("Select the subtype") subtypesLabel.setStyleSheet(labelsStyle) subtypesLabel.setFixedHeight(15) self.mainLayout.addWidget(subtypesLabel, 1, 1) self.subtypesRadioButtonGroup = qt.QButtonGroup() self.subtypesFrame = qt.QFrame() self.subtypesFrame.setMinimumHeight(275) self.subtypesLayout = qt.QVBoxLayout(self.subtypesFrame) self.subtypesLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.subtypesLayout.setStretch(0, 0) self.mainLayout.addWidget( self.subtypesFrame, 2, 1, SlicerUtil.ALIGNMENT_VERTICAL_TOP) # Put the frame in the top # The content will be loaded dynamically every time the main type is modified # Artifact radio buttons self.artifactsLabel = qt.QLabel("Artifact") self.artifactsLabel.setStyleSheet(labelsStyle) self.artifactsLabel.setFixedHeight(15) self.mainLayout.addWidget(self.artifactsLabel, 1, 2) #self.mainLayout.addWidget(qt.QLabel("Select the artifact"), 1, 1) self.artifactsRadioButtonGroup = qt.QButtonGroup() self.artifactsFrame = qt.QFrame() self.artifactsLayout = qt.QVBoxLayout(self.artifactsFrame) self.mainLayout.addWidget(self.artifactsFrame, 2, 2, SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.artifactsRadioButtonGroup = qt.QButtonGroup() for artifactId in self.logic.params.artifacts.iterkeys(): rbitem = qt.QRadioButton( self.logic.params.getArtifactLabel(artifactId)) self.artifactsRadioButtonGroup.addButton(rbitem, artifactId) self.artifactsLayout.addWidget(rbitem) self.artifactsRadioButtonGroup.buttons()[0].setChecked(True) # Load caselist button self.loadButton = ctk.ctkPushButton() self.loadButton.text = "Load fiducials file" self.loadButton.setIcon( qt.QIcon("{0}/open_file.png".format(SlicerUtil.CIP_ICON_DIR))) self.loadButton.setIconSize(qt.QSize(20, 20)) self.loadButton.setFixedWidth(135) self.mainLayout.addWidget(self.loadButton, 3, 0) # Remove fiducial button self.removeLastFiducialButton = ctk.ctkPushButton() self.removeLastFiducialButton.text = "Remove last fiducial" self.removeLastFiducialButton.toolTip = "Remove the last fiducial added" self.removeLastFiducialButton.setIcon( qt.QIcon("{0}/delete.png".format(SlicerUtil.CIP_ICON_DIR))) self.removeLastFiducialButton.setIconSize(qt.QSize(20, 20)) self.removeLastFiducialButton.setFixedWidth(200) self.mainLayout.addWidget(self.removeLastFiducialButton, 3, 1) # Save results button self.saveResultsButton = ctk.ctkPushButton() self.saveResultsButton.setText("Save markups") self.saveResultsButton.toolTip = "Save the markups in the specified directory" self.saveResultsButton.setIcon( qt.QIcon("{0}/Save.png".format(SlicerUtil.CIP_ICON_DIR))) self.saveResultsButton.setIconSize(qt.QSize(20, 20)) self.mainLayout.addWidget(self.saveResultsButton, 4, 0) # Save results directory button defaultPath = os.path.join( SlicerUtil.getSettingsDataFolder(self.moduleName), "results") # Assign a default path for the results path = SlicerUtil.settingGetOrSetDefault(self.moduleName, "SaveResultsDirectory", defaultPath) self.saveResultsDirectoryButton = ctk.ctkDirectoryButton() self.saveResultsDirectoryButton.directory = path self.saveResultsDirectoryButton.setMaximumWidth(375) self.mainLayout.addWidget(self.saveResultsDirectoryButton, 4, 1, 1, 2) ##### # Case navigator self.caseNavigatorWidget = None if SlicerUtil.isSlicerACILLoaded(): caseNavigatorAreaCollapsibleButton = ctk.ctkCollapsibleButton() caseNavigatorAreaCollapsibleButton.text = "Case navigator" self.layout.addWidget(caseNavigatorAreaCollapsibleButton, 0x0020) # caseNavigatorLayout = qt.QVBoxLayout(caseNavigatorAreaCollapsibleButton) # Add a case list navigator from ACIL.ui import CaseNavigatorWidget self.caseNavigatorWidget = CaseNavigatorWidget( self.moduleName, caseNavigatorAreaCollapsibleButton) self.caseNavigatorWidget.setup() # Listen for the event of loading a new labelmap self.caseNavigatorWidget.addObservable( self.caseNavigatorWidget.EVENT_LABELMAP_LOADED, self.__onNewILDClassificationLabelmapLoaded__) self.layout.addStretch() self.updateState() # Connections self.typesRadioButtonGroup.connect("buttonClicked (QAbstractButton*)", self.__onTypesRadioButtonClicked__) self.subtypesRadioButtonGroup.connect( "buttonClicked (QAbstractButton*)", self.__onSubtypesRadioButtonClicked__) self.artifactsRadioButtonGroup.connect( "buttonClicked (QAbstractButton*)", self.__onSubtypesRadioButtonClicked__) self.volumeSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.__onCurrentNodeChanged__) self.loadButton.connect('clicked()', self.openFiducialsFile) self.removeLastFiducialButton.connect( 'clicked()', self.__onRemoveLastFiducialButtonClicked__) # self.saveResultsOpenDirectoryDialogButton.connect('clicked()', self.onOpenDirectoryDialogButtonClicked) self.saveResultsDirectoryButton.connect( "directoryChanged (QString)", self.__onSaveResultsDirectoryChanged__) self.saveResultsButton.connect('clicked()', self.__onSaveResultsButtonClicked__) self.observers = [] self.observers.append( slicer.mrmlScene.AddObserver(slicer.vtkMRMLScene.NodeAddedEvent, self.__onNodeAddedObserver__)) self.observers.append( slicer.mrmlScene.AddObserver(slicer.vtkMRMLScene.EndCloseEvent, self.__onSceneClosed__))
def setup(self): """This is called one time when the module GUI is initialized """ ScriptedLoadableModuleWidget.setup(self) # Create objects that can be used anywhere in the module. Example: in most cases there should be just one # object of the logic class self._initLogic_() self.currentVolumeLoaded = None self.blockNodeEvents = False ########## # Main area self.mainAreaCollapsibleButton = ctk.ctkCollapsibleButton() self.mainAreaCollapsibleButton.text = "Main area" self.layout.addWidget(self.mainAreaCollapsibleButton, SlicerUtil.ALIGNMENT_VERTICAL_TOP) self.mainLayout = qt.QGridLayout(self.mainAreaCollapsibleButton) # Node selector volumeLabel = qt.QLabel("Active volume: ") volumeLabel.setStyleSheet("margin-left:5px") self.mainLayout.addWidget(volumeLabel, 0, 0) self.volumeSelector = slicer.qMRMLNodeComboBox() self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "") self.volumeSelector.selectNodeUponCreation = True self.volumeSelector.autoFillBackground = True self.volumeSelector.addEnabled = False self.volumeSelector.noneEnabled = False self.volumeSelector.removeEnabled = False self.volumeSelector.showHidden = False self.volumeSelector.showChildNodeTypes = False self.volumeSelector.setMRMLScene(slicer.mrmlScene) self.volumeSelector.setFixedWidth(250) self.volumeSelector.setStyleSheet("margin: 15px 0") #self.volumeSelector.selectNodeUponCreation = False self.mainLayout.addWidget(self.volumeSelector, 0, 1, 1, 3) self.volumeSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.__onCurrentNodeChanged__) # Radio buttons frame. This will be filled by every child module self.radioButtonsFrame = qt.QFrame() self.mainLayout.addWidget(self.radioButtonsFrame, 2, 0, 1, 3, SlicerUtil.ALIGNMENT_VERTICAL_TOP) # Load caselist button self.loadButton = ctk.ctkPushButton() self.loadButton.text = "Load fiducials file" self.loadButton.setIcon( qt.QIcon("{0}/open_file.png".format(SlicerUtil.CIP_ICON_DIR))) self.loadButton.setIconSize(qt.QSize(20, 20)) self.loadButton.setFixedWidth(135) self.mainLayout.addWidget(self.loadButton, 3, 0) self.loadButton.connect('clicked()', self.openFiducialsFile) # Remove fiducial button self.removeLastFiducialButton = ctk.ctkPushButton() self.removeLastFiducialButton.text = "Remove last fiducial" self.removeLastFiducialButton.toolTip = "Remove the last fiducial added" self.removeLastFiducialButton.setIcon( qt.QIcon("{0}/delete.png".format(SlicerUtil.CIP_ICON_DIR))) self.removeLastFiducialButton.setIconSize(qt.QSize(20, 20)) self.removeLastFiducialButton.setFixedWidth(200) self.mainLayout.addWidget(self.removeLastFiducialButton, 3, 1) self.removeLastFiducialButton.connect( 'clicked()', self.__onRemoveLastFiducialButtonClicked__) # Save results button self.saveResultsButton = ctk.ctkPushButton() self.saveResultsButton.setText("Save markups") self.saveResultsButton.toolTip = "Save the markups in the specified directory" self.saveResultsButton.setIcon( qt.QIcon("{0}/Save.png".format(SlicerUtil.CIP_ICON_DIR))) self.saveResultsButton.setIconSize(qt.QSize(20, 20)) self.saveResultsButton.setFixedWidth(135) self.mainLayout.addWidget(self.saveResultsButton, 4, 0) self.saveResultsButton.connect('clicked()', self.__onSaveResultsButtonClicked__) # Save results directory button defaultPath = os.path.join( SlicerUtil.getSettingsDataFolder(self.moduleName), "results") # Assign a default path for the results path = SlicerUtil.settingGetOrSetDefault(self.moduleName, "SaveResultsDirectory", defaultPath) self.saveResultsDirectoryButton = ctk.ctkDirectoryButton() self.saveResultsDirectoryButton.directory = path self.saveResultsDirectoryButton.setMaximumWidth(375) self.mainLayout.addWidget(self.saveResultsDirectoryButton, 4, 1, 1, 2) self.saveResultsDirectoryButton.connect( "directoryChanged (QString)", self.__onSaveResultsDirectoryChanged__) ##### # Case navigator self.caseNavigatorWidget = None if SlicerUtil.isSlicerACILLoaded(): caseNavigatorAreaCollapsibleButton = ctk.ctkCollapsibleButton() caseNavigatorAreaCollapsibleButton.text = "Case navigator" self.layout.addWidget(caseNavigatorAreaCollapsibleButton, 0x0020) # caseNavigatorLayout = qt.QVBoxLayout(caseNavigatorAreaCollapsibleButton) # Add a case list navigator from ACIL.ui import CaseNavigatorWidget self.caseNavigatorWidget = CaseNavigatorWidget( self.moduleName, caseNavigatorAreaCollapsibleButton) self.caseNavigatorWidget.setup() # Listen for the event of loading a new labelmap # self.caseNavigatorWidget.addObservable(self.caseNavigatorWidget.EVENT_LABELMAP_LOADED, self.__onNewILDClassificationLabelmapLoaded__) self.caseNavigatorWidget.addObservable( self.caseNavigatorWidget.EVENT_BUNDLE_CASE_FINISHED, self.__onFinishCaseBundleLoad__) self.layout.addStretch() # Extra Connections self._createSceneObservers_()
def setup(self): ScriptedLoadableModuleWidget.setup(self) self.caseInfoCollapsibleButton = ctk.ctkCollapsibleButton() self.caseInfoCollapsibleButton.text = "Case information" self.caseInfoCollapsibleButton.collapsed = False self.layout.addWidget(self.caseInfoCollapsibleButton) self.caseAreaLayout = qt.QGridLayout(self.caseInfoCollapsibleButton) # Select case row = 0 self.loadCaseButton = ctk.ctkPushButton() self.loadCaseButton.text = "Load case" self.loadCaseButton.toolTip = "Load a case folder" self.caseAreaLayout.addWidget(self.loadCaseButton, row, 0) # Reset button self.resetButton = ctk.ctkPushButton() self.resetButton.text = "Close case" self.resetButton.toolTip = "Close the current case" self.caseAreaLayout.addWidget(self.resetButton, row, 1) # Case info row += 1 self.caseInfoFrame = qt.QFrame() self.caseInfoFrame.setFrameStyle(0x0002 | 0x0010) self.caseInfoFrame.lineWidth = 2 self.caseInfoFrame.setStyleSheet( "background-color: #EEEEEE; margin: 10px") self.caseAreaLayout.addWidget(self.caseInfoFrame, row, 0, 1, 2) self.caseInfoFrameLayout = qt.QGridLayout() self.caseInfoFrame.setLayout(self.caseInfoFrameLayout) self.caseIdLabel = qt.QLabel("Case id: ") self.caseIdLabel.setStyleSheet("font-weight: bold") self.caseInfoFrameLayout.addWidget(self.caseIdLabel, 0, 0) self.showEnhancementCheckboxGroup = qt.QButtonGroup() self.showJustOriginalButton = qt.QRadioButton("Original only") self.showJustOriginalButton.setChecked(True) self.showEnhancementCheckboxGroup.addButton( self.showJustOriginalButton, 0) self.caseInfoFrameLayout.addWidget(self.showJustOriginalButton, 1, 0) self.showOriginalPlusEnhancedButton = qt.QRadioButton( "Original and enhanced") self.showEnhancementCheckboxGroup.addButton( self.showOriginalPlusEnhancedButton, 1) self.caseInfoFrameLayout.addWidget(self.showOriginalPlusEnhancedButton, 2, 0) self.showJustEnhancedButton = qt.QRadioButton("Enhanced only") self.showEnhancementCheckboxGroup.addButton( self.showJustEnhancedButton, 2) self.caseInfoFrameLayout.addWidget(self.showJustEnhancedButton, 3, 0) # Center Volumes button self.centerVolumesButton = ctk.ctkPushButton() self.centerVolumesButton.text = "Center image/s" self.centerVolumesButton.toolTip = "Center all the current visible images" self.centerVolumesButton.setFixedWidth(200) # self.centerVolumesButton.toolTip = "Load a case folder" self.caseInfoFrameLayout.addWidget(self.centerVolumesButton, 4, 0) # Enhancement fine tuning self.vascularFactorLabel = qt.QLabel("Vascular factor") self.vascularFactorLabel.setStyleSheet("font-weight: bold") self.caseInfoFrameLayout.addWidget(self.vascularFactorLabel, 0, 1) self.vascularFactorSlider = qt.QSlider() self.vascularFactorSlider.orientation = 2 # Vertical self.vascularFactorSlider.value = 5 self.vascularFactorSlider.minimum = 0 self.vascularFactorSlider.maximum = 10 # self.vascularFactorSlider.setStyleSheet("margin-top:10px;padding-top:20px") # self.vascularFactorSlider.setToolTip("Move the slider for a fine tuning segmentation") self.caseInfoFrameLayout.addWidget(self.vascularFactorSlider, 1, 1, 4, 1, 0x0004) self.enhancementFactorLabel = qt.QLabel("Enhancement factor") self.enhancementFactorLabel.setStyleSheet("font-weight: bold") self.caseInfoFrameLayout.addWidget(self.enhancementFactorLabel, 0, 2) self.enhancementFactorSlider = qt.QSlider() self.enhancementFactorSlider.orientation = 2 # Vertical self.enhancementFactorSlider.minimum = 0 self.enhancementFactorSlider.maximum = 10 self.enhancementFactorSlider.value = 5 # self.vascularFactorSlider.setStyleSheet("margin-top:10px;padding-top:20px") # self.vascularFactorSlider.setToolTip("Move the slider for a fine tuning segmentation") self.caseInfoFrameLayout.addWidget(self.enhancementFactorSlider, 1, 2, 4, 1, 0x0004) # Editor row += 1 self.editorWidget = ui.CustomEditorWidget(self.parent) self.editorWidget.setup() self.editorCollapsibleButton = self.editorWidget.editLabelMapsFrame self.editorCollapsibleButton.text = "Edit the current eye image" self.editorCollapsibleButton.collapsed = False self.editorWidget.toolsColor.terminologyCollapsibleButton.setVisible( False) self.layout.addWidget(self.editorCollapsibleButton) ### DIAGNOSIS self.diagnosisCollapsibleButton = ctk.ctkCollapsibleButton() self.diagnosisCollapsibleButton.text = "Diagnosis" self.diagnosisCollapsibleButton.collapsed = False self.layout.addWidget(self.diagnosisCollapsibleButton) self.diagnosisAreaLayout = qt.QVBoxLayout( self.diagnosisCollapsibleButton) # Visual Acuity label = qt.QLabel("Visual acuity (VA): ") label.setStyleSheet("margin: 10px 0 0 10px; font-weight: bold") self.diagnosisAreaLayout.addWidget(label) self.vaFrame = qt.QFrame() self.vaFrame.setFrameStyle(0x0002 | 0x0010) self.vaFrame.lineWidth = 2 self.vaFrame.setStyleSheet("background-color: #EEEEEE; margin: 10px") self.vaFrame.setFixedWidth(240) self.diagnosisAreaLayout.addWidget(self.vaFrame) self.vaFrameLayout = qt.QGridLayout(self.vaFrame) self.vaFrameLayout.addWidget(qt.QLabel("OS"), 0, 0) self.osLineEdit = qt.QLineEdit() self.osLineEdit.setFixedWidth(80) self.osLineEdit.setStyleSheet("background-color: white") self.vaFrameLayout.addWidget(self.osLineEdit, 0, 1) self.vaFrameLayout.addWidget(qt.QLabel("OD"), 1, 0) self.odLineEdit = qt.QLineEdit() self.odLineEdit.setFixedWidth(80) self.odLineEdit.setStyleSheet("background-color: white") self.vaFrameLayout.addWidget(self.odLineEdit, 1, 1) self.vaModalityButtonGroup = qt.QButtonGroup() self.scvaRadioButton = qt.QRadioButton() self.scvaRadioButton.setText("SCVA") self.vaFrameLayout.addWidget(self.scvaRadioButton, 0, 2) self.vaModalityButtonGroup.addButton(self.scvaRadioButton) self.bcvaRadioButton = qt.QRadioButton() self.bcvaRadioButton.setText("BCVA") self.vaFrameLayout.addWidget(self.bcvaRadioButton, 1, 2) self.vaModalityButtonGroup.addButton(self.bcvaRadioButton) self.ucvaRadioButton = qt.QRadioButton() self.ucvaRadioButton.setText("UCVA") self.vaFrameLayout.addWidget(self.ucvaRadioButton, 2, 2) self.vaModalityButtonGroup.addButton(self.ucvaRadioButton) # Problems detected label = qt.QLabel("Problems detected: ") label.setStyleSheet("margin: 10px 0 0 10px; font-weight: bold") self.diagnosisAreaLayout.addWidget(label) self.problemsFrame = qt.QFrame() self.problemsFrame.setFrameStyle(0x0002 | 0x0010) self.problemsFrame.lineWidth = 2 self.problemsFrame.setStyleSheet( "background-color: #EEEEEE; margin: 10px") self.diagnosisAreaLayout.addWidget(self.problemsFrame) self.problemsFrameLayout = qt.QGridLayout() self.problemsFrame.setLayout(self.problemsFrameLayout) self.problemsButtons = [] self.microaneurysmsCheckbox = qt.QCheckBox() self.microaneurysmsCheckbox.setText("Microaneurysms") self.problemsFrameLayout.addWidget(self.microaneurysmsCheckbox, 0, 0) self.problemsButtons.append(self.microaneurysmsCheckbox) self.exudatesCheckbox = qt.QCheckBox() self.exudatesCheckbox.setText("Exudates") self.problemsFrameLayout.addWidget(self.exudatesCheckbox, 0, 1) self.problemsButtons.append(self.exudatesCheckbox) self.haemorrhagesCheckbox = qt.QCheckBox() self.haemorrhagesCheckbox.setText("Haemorrhages") self.problemsFrameLayout.addWidget(self.haemorrhagesCheckbox, 0, 2) self.problemsButtons.append(self.haemorrhagesCheckbox) self.cottonWoolSpotsCheckbox = qt.QCheckBox() self.cottonWoolSpotsCheckbox.setText("Cotton wool spots") self.problemsFrameLayout.addWidget(self.cottonWoolSpotsCheckbox, 1, 0) self.problemsButtons.append(self.cottonWoolSpotsCheckbox) self.NeovascularisationCheckbox = qt.QCheckBox() self.NeovascularisationCheckbox.setText("Neovascularisation") self.problemsFrameLayout.addWidget(self.NeovascularisationCheckbox, 1, 1) self.problemsButtons.append(self.NeovascularisationCheckbox) label = qt.QLabel("Diabetic retinopathy diagnosis: ") label.setStyleSheet("margin: 10px 0 0 10px; font-weight: bold") self.diagnosisAreaLayout.addWidget(label) # Diabetic Retinopathy diagnosis self.diabeticRetinopathyDiagnosisFrame = qt.QFrame() self.diabeticRetinopathyDiagnosisFrame.setFrameStyle(0x0002 | 0x0010) self.diabeticRetinopathyDiagnosisFrame.lineWidth = 2 self.diabeticRetinopathyDiagnosisFrame.setStyleSheet( "background-color: #EEEEEE; margin: 10px") self.diagnosisAreaLayout.addWidget( self.diabeticRetinopathyDiagnosisFrame) self.diabeticRetinopathyDiagnosisFrameLayout = qt.QHBoxLayout() self.diabeticRetinopathyDiagnosisFrame.setLayout( self.diabeticRetinopathyDiagnosisFrameLayout) self.diagnosisRadioButtonGroup = qt.QButtonGroup() for i in range(5): rb = qt.QRadioButton(str(i)) self.diagnosisRadioButtonGroup.addButton(rb, i) self.diabeticRetinopathyDiagnosisFrameLayout.addWidget(rb) self.diagnosisRadioButtonGroup.buttons()[0].setChecked(True) # Additional comments label = qt.QLabel("Additional comments:") label.setStyleSheet("margin: 10px 0 0 10px; font-weight: bold") self.diagnosisAreaLayout.addWidget(label) row += 1 self.additionalCommentsText = qt.QTextEdit() self.additionalCommentsText.setStyleSheet("margin: 10px") self.diagnosisAreaLayout.addWidget(self.additionalCommentsText) self.saveReportButton = ctk.ctkPushButton() self.saveReportButton.text = "Save report" self.saveReportButton.setFixedWidth(300) self.diagnosisAreaLayout.addWidget(self.saveReportButton) self.printReportButton = ctk.ctkPushButton() self.printReportButton.text = "Save and generate PDF" self.printReportButton.setFixedWidth(300) self.diagnosisAreaLayout.addWidget(self.printReportButton) self.expertModeCollapsibleButton = ctk.ctkCollapsibleButton() self.expertModeCollapsibleButton.text = "Expert mode" self.expertModeCollapsibleButton.collapsed = True self.layout.addWidget(self.expertModeCollapsibleButton) self.expertModeLayout = qt.QVBoxLayout( self.expertModeCollapsibleButton) self.expertModeCheckbox = qt.QCheckBox("Activate expert mode") self.expertModeCheckbox.checked = False self.expertModeLayout.addWidget(self.expertModeCheckbox) self.layout.addStretch(1) # Connections self.loadCaseButton.connect('clicked()', self.__onLoadCaseClicked__) # self.loadReportButton.connect('clicked()', self.__onLoadReportClicked__) self.showEnhancementCheckboxGroup.connect( "buttonClicked (int)", self.__onEnhancementButtonGroupClicked__) self.centerVolumesButton.connect('clicked()', SlicerUtil.centerAllVolumes) self.vascularFactorSlider.connect('sliderReleased()', self.__onEnhancementFineTuning__) self.enhancementFactorSlider.connect('sliderReleased()', self.__onEnhancementFineTuning__) self.saveReportButton.connect('clicked()', self.__onSaveReportClicked__) self.printReportButton.connect('clicked()', self.__onPrintReportClicked__) self.resetButton.connect('clicked()', self.reset) self.expertModeCheckbox.connect("stateChanged(int)", self.__onExpertModeStateChanged__) slicer.mrmlScene.AddObserver(slicer.vtkMRMLScene.EndCloseEvent, self.__onSceneClosed__) # Set default layout Red SlicerUtil.changeLayoutRedSingle() self.refreshUI()
def setup(self): ScriptedLoadableModuleWidget.setup(self) # Instantiate and connect widgets ... # # Format Scene Area # loadGroupBox = ctk.ctkCollapsibleGroupBox() loadGroupBox.setTitle('Sequence Data') self.layout.addWidget(loadGroupBox) loadGroupBoxLayout = qt.QFormLayout(loadGroupBox) self.volumeSequenceComboBox = slicer.qMRMLNodeComboBox() self.volumeSequenceComboBox.nodeTypes = ( ("vtkMRMLSequenceNode"), "" ) self.volumeSequenceComboBox.setMRMLScene( slicer.mrmlScene ) self.volumeSequenceComboBox.noneEnabled = False loadGroupBoxLayout.addRow('Volume Sequence: ',self.volumeSequenceComboBox) self.transformSequenceComboBox = slicer.qMRMLNodeComboBox() self.transformSequenceComboBox.nodeTypes = ( ("vtkMRMLSequenceNode"), "" ) self.transformSequenceComboBox.selectNodeUponCreation = False self.transformSequenceComboBox.setMRMLScene( slicer.mrmlScene ) self.transformSequenceComboBox.noneEnabled = True loadGroupBoxLayout.addRow('Transform Sequence: ',self.transformSequenceComboBox) self.labelSequenceComboBox = slicer.qMRMLNodeComboBox() self.labelSequenceComboBox.nodeTypes = ( ("vtkMRMLSequenceNode"), "" ) self.labelSequenceComboBox.selectNodeUponCreation = False self.labelSequenceComboBox.setMRMLScene( slicer.mrmlScene ) self.labelSequenceComboBox.noneEnabled = True loadGroupBoxLayout.addRow('Label Sequence: ',self.labelSequenceComboBox) sliceButtonsLayout = qt.QHBoxLayout() loadGroupBoxLayout.addRow('Slice Views: ',sliceButtonsLayout) self.axialCheckbox = qt.QCheckBox('Axial') self.axialCheckbox.checked = True sliceButtonsLayout.addWidget(self.axialCheckbox) self.sagittalCheckBox = qt.QCheckBox('Sagittal') self.sagittalCheckBox.checked = True sliceButtonsLayout.addWidget(self.sagittalCheckBox) self.coronalCheckBox = qt.QCheckBox('Coronal') self.coronalCheckBox.checked = False sliceButtonsLayout.addWidget(self.coronalCheckBox) formatSceneButton = qt.QPushButton('Format Scene') loadGroupBoxLayout.addRow('',formatSceneButton) # # Editor Widget # editorWidget = slicer.modules.editor.widgetRepresentation().self() self.labelEditor = editorWidget.editLabelMapsFrame self.layout.addWidget(self.labelEditor) self.labelEditor.collapsed = False # add vertical spacer self.layout.addStretch(1) # # Format Scene Widget # self.formatSceneWidget = slicer.qMRMLWidget() self.formatSceneWidget.setWindowTitle('Format Scene View') self.formatSceneWidgetLayout = qt.QGridLayout(self.formatSceneWidget) nodeSelectionRegion = qt.QGroupBox() self.formatSceneWidgetLayout.addWidget(nodeSelectionRegion,1,1,4,1) nodeSelectionRegion.setTitle('Data Selection') nodeSelectionLayout = qt.QVBoxLayout(nodeSelectionRegion) volumeSelectionLabel = qt.QLabel('Volume Data') nodeSelectionLayout.addWidget(volumeSelectionLabel) volumeSelectionList = slicer.qMRMLListWidget() nodeSelectionLayout.addWidget(volumeSelectionList) transformSelectionLabel = qt.QLabel('Transforms') nodeSelectionLayout.addWidget(transformSelectionLabel) transformSelectionList = slicer.qMRMLListWidget() nodeSelectionLayout.addWidget(transformSelectionList) addToSceneArrow = ctk.ctkPushButton() self.formatSceneWidgetLayout.addWidget(addToSceneArrow,2,2,1,1) removeFromSceneArrow = ctk.ctkPushButton() self.formatSceneWidgetLayout.addWidget(removeFromSceneArrow,3,2,1,1) organizeSceneRegion = qt.QGroupBox() self.formatSceneWidgetLayout.addWidget(organizeSceneRegion,1,3,4,5) organizeSceneRegion.setTitle('Scene Format') self.organizeSceneRegionLayout = qt.QGridLayout(organizeSceneRegion) self.backgroundSceneButtons = [] backgroundVolumeBox = qt.QPushButton('Background') backgroundVolumeBox.setCheckable(True) #backgroundVolumeBox.connect('toggled(bool)',self.testClick) self.organizeSceneRegionLayout.addWidget(backgroundVolumeBox,1,1,1,1) self.backgroundSceneButtons.append(backgroundVolumeBox) self.foregroundSceneButtons = [] foregroundVolumeBox = qt.QPushButton('Foreground') foregroundVolumeBox.setCheckable(True) self.organizeSceneRegionLayout.addWidget(foregroundVolumeBox,2,1,1,1) #foregroundVolumeBox.connect('toggled(bool)',self.testClick) backgroundVolumeBox.connect('clicked()',lambda i=1: self.backgroundButtonClicked(i)) foregroundVolumeBox.connect('clicked()',lambda i=1: self.foregroundButtonClicked(i)) self.backgroundSceneButtons.append(backgroundVolumeBox) self.foregroundSceneButtons.append(foregroundVolumeBox) #self.backgroundSceneButtons[0].connect('clicked(bool)', self.backgroundButtonClicked(1)) #self.foregroundSceneButtons[0].connect('clicked(bool)', self.foregroundButtonClicked(1)) self.addColumnButton = qt.QPushButton('+Add') self.organizeSceneRegionLayout.addWidget(self.addColumnButton,1,2,1,1) self.sceneColumns = 1 loadFormattedSceneButton = qt.QPushButton('Load Scene') self.formatSceneWidgetLayout.addWidget(loadFormattedSceneButton,5,8,1,1) # connections formatSceneButton.connect('clicked(bool)', self.onFormatSceneButtonClicked) self.addColumnButton.connect('clicked(bool)', self.onAddColumn)