def __init__(self, parent): 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 = qt.QTableView() self.tableView.setColumnWidth(0,125) self.tableView.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Expanding) self.mainLayout.addWidget(self.tableView) self.exportButton = ctk.ctkPushButton() self.exportButton.text = "Export" 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 cache" 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.exportButton.connect('clicked()', parent.onExport) self.removeButton.connect('clicked()', parent.onRemoveStoredData)
def setup(self): self.saveValuesButton = ctk.ctkPushButton() self.saveValuesButton.text = "Save" self.saveValuesButton.setIcon(qt.QIcon("{0}/Save.png".format(SlicerUtil.CIP_ICON_DIR))) self.saveValuesButton.setIconSize(qt.QSize(24,24)) self.layout.addWidget(self.saveValuesButton) self.openButton = ctk.ctkPushButton() self.openButton.text = "Open" self.openButton.setIcon(qt.QIcon("{0}/open_file.png".format(SlicerUtil.CIP_ICON_DIR))) self.openButton.setIconSize(qt.QSize(24,24)) self.layout.addWidget(self.openButton) self.exportButton = ctk.ctkPushButton() self.exportButton.text = "Export" self.exportButton.setIcon(qt.QIcon("{0}/export-csv.png".format(SlicerUtil.CIP_ICON_DIR))) self.exportButton.setIconSize(qt.QSize(24,24)) self.layout.addWidget(self.exportButton) 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" self.layout.addWidget(self.removeButton) self.saveValuesButton.connect('clicked()', self.onSave) self.exportButton.connect('clicked()', self.onExport) self.openButton.connect('clicked()', self.onShowStoredData) self.removeButton.connect('clicked()', self.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_BlankLogic() # Create all the widgets. Main Area mainAreaCollapsibleButton = ctk.ctkCollapsibleButton() mainAreaCollapsibleButton.text = "Main parameters" self.layout.addWidget(mainAreaCollapsibleButton) # Layout within the dummy collapsible button. See http://doc.qt.io/qt-4.8/layout.html for more info about layouts self.mainAreaLayout = qt.QFormLayout(mainAreaCollapsibleButton) # Example button with some common properties self.exampleButton = ctk.ctkPushButton() self.exampleButton.text = "Push me!" self.exampleButton.toolTip = "This is the button tooltip" self.exampleButton.setIcon(qt.QIcon("{0}/Reload.png".format(SlicerUtil.CIP_ICON_DIR))) self.exampleButton.setIconSize(qt.QSize(20,20)) self.exampleButton.setStyleSheet("font-weight:bold; font-size:12px" ) self.exampleButton.setFixedWidth(200) self.mainAreaLayout.addWidget(self.exampleButton) # Connections self.exampleButton.connect('clicked()', self.onApplyButton)
def __createGUI__(self): """Add the GUI components""" self.autoupdateCollapsibleButton = ctk.ctkCollapsibleButton() self.autoupdateCollapsibleButton.text = "Auto update" self.autoupdateCollapsibleButton.collapsed = True self.layout.addWidget(self.autoupdateCollapsibleButton) #self.mainLayout = qt.QHBoxLayout(self.autoupdateCollapsibleButton) self.mainLayout = qt.QFormLayout(self.autoupdateCollapsibleButton) self.checkAutoUpdate = qt.QCheckBox() self.checkAutoUpdate.checked = self.autoUpdate self.checkAutoUpdate.text = "Auto update CIP at startup" self.checkForceUpdate = qt.QCheckBox() self.checkForceUpdate.checked = False self.checkForceUpdate.text = "Force update" self.mainLayout.addRow(self.checkAutoUpdate, self.checkForceUpdate) self.btnUpdate = ctk.ctkPushButton() self.btnUpdate.text = "Update CIP now" self.mainLayout.addWidget(self.btnUpdate) self.btnUpdate.connect('clicked()', self.onbtnUpdateClicked) self.checkAutoUpdate.connect('stateChanged(int)', self.onCheckAutoUpdateClicked)
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_BlankLogic() # Create all the widgets. Main Area mainAreaCollapsibleButton = ctk.ctkCollapsibleButton() mainAreaCollapsibleButton.text = "Main parameters" self.layout.addWidget(mainAreaCollapsibleButton) # Layout within the dummy collapsible button. See http://doc.qt.io/qt-4.8/layout.html for more info about layouts self.mainAreaLayout = qt.QFormLayout(mainAreaCollapsibleButton) # Example button with some common properties self.exampleButton = ctk.ctkPushButton() self.exampleButton.text = "Push me!" self.exampleButton.toolTip = "This is the button tooltip" self.exampleButton.setIcon( qt.QIcon("{0}/Reload.png".format(SlicerUtil.CIP_ICON_DIR))) self.exampleButton.setIconSize(qt.QSize(20, 20)) self.exampleButton.setStyleSheet("font-weight:bold; font-size:12px") self.exampleButton.setFixedWidth(200) self.mainAreaLayout.addWidget(self.exampleButton) # Connections self.exampleButton.connect('clicked()', self.onApplyButton)
def setup(self, moduleName="", labelmapNodeNameExtensions=defaultLabelmapNodeNameExtensions, volumesFileExtensions=defaultVolumesFileExtensions, iconsPath=None): """Setup the widget with the desride options. Defaults: - moduleName = "" --> used just to set the settings (for instance the last directory that was opened in the module). - labelmapNodeNameExtensions = ["_partialLung", "_bodyComposition"] --> node names that will be used to identify a label map - volumesFileExtensions = [".nhdr", ".nrrd"] --> extensions of the files that will be allowed to be loaded. The first item will be used to save new label maps """ settings = slicer.app.settings() try: self.IsDevelopment = settings.value( 'Developer/DeveloperMode').lower() == 'true' except: self.IsDevelopment = False self.setParameters(moduleName, labelmapNodeNameExtensions, volumesFileExtensions) if not iconsPath: iconsPath = SlicerUtil.CIP_ICON_DIR #print("Imported " + iconsPath) # ctkCollapsibleButton+frame that wrap everything self.loadSaveFilesCollapsibleButton = ctk.ctkCollapsibleButton() self.loadSaveFilesCollapsibleButton.text = "Quick Load / Save data (nrrd format)" self.layout.addWidget(self.loadSaveFilesCollapsibleButton) loadSaveFilesLayout = qt.QVBoxLayout( self.loadSaveFilesCollapsibleButton) self.buttonsFrame = qt.QFrame(self.parent) self.buttonsFrame.setLayout(qt.QHBoxLayout()) # Buttons self.btnLoad = ctk.ctkPushButton() self.btnLoad.text = "Load cases" self.btnLoad.toolTip = "Load one or more cases and their bodyComposition label maps" self.btnLoad.setIcon(qt.QIcon("{0}/Load.png".format(iconsPath))) self.btnLoad.setIconSize(qt.QSize(32, 32)) self.btnSave = ctk.ctkPushButton() self.btnSave.text = "Save labelmap" self.btnSave.toolTip = "Save the current bodyComposition labelmap" self.btnSave.setIcon(qt.QIcon("{0}/Save.png".format(iconsPath))) self.btnSave.setIconSize(qt.QSize(32, 32)) self.btnSaveAll = ctk.ctkPushButton() self.btnSaveAll.text = "Save all labelmaps" self.btnSaveAll.toolTip = "Save all the opened bodyComposition labelmaps" self.btnSaveAll.setIcon(qt.QIcon("{0}/SaveAll.png".format(iconsPath))) self.btnSaveAll.setIconSize(qt.QSize(32, 32)) self.buttonsFrame.layout().addWidget(self.btnLoad) self.buttonsFrame.layout().addWidget(self.btnSave) self.buttonsFrame.layout().addWidget(self.btnSaveAll) loadSaveFilesLayout.addWidget(self.buttonsFrame) # Additional parameters # additionalParamsCollapsibleButton = ctk.ctkCollapsibleButton() # self.op = qt.QStyleOptionButton() # additionalParamsCollapsibleButton.initStyleOptions(self.op) # additionalParamsCollapsibleButton.text = "Other params" # self.layout.addWidget(additionalParamsCollapsibleButton) # aditionalParamsLayout = qt.QFormLayout(additionalParamsCollapsibleButton) # # # Chest regions combo box # self.cbFileType = qt.QComboBox(additionalParamsCollapsibleButton) # self.cbFileType.addItem("My item") # self.cbFileType.setItemData(0, "My key") # # index=0 # # for key, item in self.logic.regionTypes.iteritems(): # # self.regionComboBox.addItem(item[1]) # Add label description # # self.regionComboBox.setItemData(index, key) # Add string code # # index += 1 # aditionalParamsLayout.addRow("Select the file type ", self.cbFileType) # Connections self.btnLoad.connect('clicked()', self.onBtnLoadClicked) self.btnSave.connect('clicked()', self.onBtnSaveClicked) self.btnSaveAll.connect('clicked()', self.onBtnSaveAllClicked)
def setup(self, moduleName = "", labelmapNodeNameExtensions=defaultLabelmapNodeNameExtensions, volumesFileExtensions=defaultVolumesFileExtensions, iconsPath=None): """Setup the widget with the desride options. Defaults: - moduleName = "" --> used just to set the settings (for instance the last directory that was opened in the module). - labelmapNodeNameExtensions = ["_partialLung", "_bodyComposition"] --> node names that will be used to identify a label map - volumesFileExtensions = [".nhdr", ".nrrd"] --> extensions of the files that will be allowed to be loaded. The first item will be used to save new label maps """ settings = slicer.app.settings() try: self.IsDevelopment = settings.value('Developer/DeveloperMode').lower() == 'true' except: self.IsDevelopment = False self.setParameters(moduleName, labelmapNodeNameExtensions, volumesFileExtensions) if not iconsPath: iconsPath = SlicerUtil.CIP_ICON_DIR #print("Imported " + iconsPath) # ctkCollapsibleButton+frame that wrap everything self.loadSaveFilesCollapsibleButton = ctk.ctkCollapsibleButton() self.loadSaveFilesCollapsibleButton.text = "Quick Load / Save data (nrrd format)" self.layout.addWidget(self.loadSaveFilesCollapsibleButton) loadSaveFilesLayout = qt.QVBoxLayout(self.loadSaveFilesCollapsibleButton) self.buttonsFrame = qt.QFrame(self.parent) self.buttonsFrame.setLayout(qt.QHBoxLayout()) # Buttons self.btnLoad = ctk.ctkPushButton() self.btnLoad.text = "Load cases" self.btnLoad.toolTip = "Load one or more cases and their bodyComposition label maps" self.btnLoad.setIcon(qt.QIcon("{0}/Load.png".format(iconsPath))) self.btnLoad.setIconSize(qt.QSize(32,32)) self.btnSave = ctk.ctkPushButton() self.btnSave.text = "Save labelmap" self.btnSave.toolTip = "Save the current bodyComposition labelmap" self.btnSave.setIcon(qt.QIcon("{0}/Save.png".format(iconsPath))) self.btnSave.setIconSize(qt.QSize(32,32)) self.btnSaveAll = ctk.ctkPushButton() self.btnSaveAll.text = "Save all labelmaps" self.btnSaveAll.toolTip = "Save all the opened bodyComposition labelmaps" self.btnSaveAll.setIcon(qt.QIcon("{0}/SaveAll.png".format(iconsPath))) self.btnSaveAll.setIconSize(qt.QSize(32,32)) self.buttonsFrame.layout().addWidget(self.btnLoad) self.buttonsFrame.layout().addWidget(self.btnSave) self.buttonsFrame.layout().addWidget(self.btnSaveAll) loadSaveFilesLayout.addWidget(self.buttonsFrame) # Additional parameters # additionalParamsCollapsibleButton = ctk.ctkCollapsibleButton() # self.op = qt.QStyleOptionButton() # additionalParamsCollapsibleButton.initStyleOptions(self.op) # additionalParamsCollapsibleButton.text = "Other params" # self.layout.addWidget(additionalParamsCollapsibleButton) # aditionalParamsLayout = qt.QFormLayout(additionalParamsCollapsibleButton) # # # Chest regions combo box # self.cbFileType = qt.QComboBox(additionalParamsCollapsibleButton) # self.cbFileType.addItem("My item") # self.cbFileType.setItemData(0, "My key") # # index=0 # # for key, item in self.logic.regionTypes.iteritems(): # # self.cbRegion.addItem(item[1]) # Add label description # # self.cbRegion.setItemData(index, key) # Add string code # # index += 1 # aditionalParamsLayout.addRow("Select the file type ", self.cbFileType) # Connections self.btnLoad.connect('clicked()', self.onBtnLoadClicked) self.btnSave.connect('clicked()', self.onBtnSaveClicked) self.btnSaveAll.connect('clicked()', self.onBtnSaveAllClicked)
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", "") # DEPRECATED. Now there is a new vtkMRMLLabelMapNode #self.volumeSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", "0" ) # No labelmaps 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.label2 = qt.QLabel("Select the slice") # self.label2.setStyleSheet("margin:0px 0 20px 7px; padding-top:20px") # self.mainAreaLayout.addWidget(self.label2, 1, 0) self.placeDefaultRulersButton = ctk.ctkPushButton() self.placeDefaultRulersButton.text = "Place default rulers" # self.placeDefaultRulersSliceButton.toolTip = "Navigate to the best estimated slice to place the rulers" self.placeDefaultRulersButton.setIcon( qt.QIcon("{0}/next.png".format(SlicerUtil.CIP_ICON_DIR))) self.placeDefaultRulersButton.setIconSize(qt.QSize(20, 20)) self.placeDefaultRulersButton.setStyleSheet("font-weight: bold;") # self.placeDefaultRulersButton.setFixedWidth(140) self.mainAreaLayout.addWidget(self.placeDefaultRulersButton, 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.checked = True self.structuresButtonGroup.addButton(btn, 0) self.groupboxLayout.addWidget(btn) btn = qt.QRadioButton("Pulmonary Arterial") self.structuresButtonGroup.addButton(btn, 1) self.groupboxLayout.addWidget(btn) btn = qt.QRadioButton("Aorta") 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.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.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", "paDiameter_mm", "aortaDiameter_mm", "pa1r", "pa1a", "pa1s", "pa2r", "pa2a", "pa2s", "a1r", "a1a", "a1s", "a2r", "a2a", "a2s" ] self.reportsWidget = CaseReportsWidget( "CIP_PAARatio", columnNames=self.storedColumnNames, parentWidget=self.reportsCollapsibleButton) self.reportsWidget.setup() 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.__addSceneObservables__() self.volumeSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.onVolumeSelectorChanged) self.placeDefaultRulersButton.connect('clicked()', self.oPlaceDefaultRulersClicked) 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)
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", "") # DEPRECATED. Now there is a new vtkMRMLLabelMapNode # self.volumeSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", "0" ) # No labelmaps 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.label2 = qt.QLabel("Select the slice") # self.label2.setStyleSheet("margin:0px 0 20px 7px; padding-top:20px") # self.mainAreaLayout.addWidget(self.label2, 1, 0) self.placeDefaultRulersButton = ctk.ctkPushButton() self.placeDefaultRulersButton.text = "Place default rulers" # self.placeDefaultRulersSliceButton.toolTip = "Navigate to the best estimated slice to place the rulers" self.placeDefaultRulersButton.setIcon(qt.QIcon("{0}/next.png".format(SlicerUtil.CIP_ICON_DIR))) self.placeDefaultRulersButton.setIconSize(qt.QSize(20, 20)) self.placeDefaultRulersButton.setStyleSheet("font-weight: bold;") # self.placeDefaultRulersButton.setFixedWidth(140) self.mainAreaLayout.addWidget(self.placeDefaultRulersButton, 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.checked = True self.structuresButtonGroup.addButton(btn, 0) self.groupboxLayout.addWidget(btn) btn = qt.QRadioButton("Pulmonary Arterial") self.structuresButtonGroup.addButton(btn, 1) self.groupboxLayout.addWidget(btn) btn = qt.QRadioButton("Aorta") 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.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.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", "paDiameter_mm", "aortaDiameter_mm", "pa1r", "pa1a", "pa1s", "pa2r", "pa2a", "pa2s", "a1r", "a1a", "a1s", "a2r", "a2a", "a2s", ] self.reportsWidget = CaseReportsWidget( "CIP_PAARatio", columnNames=self.storedColumnNames, parentWidget=self.reportsCollapsibleButton ) self.reportsWidget.setup() 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.__addSceneObservables__() self.volumeSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onVolumeSelectorChanged) self.placeDefaultRulersButton.connect("clicked()", self.oPlaceDefaultRulersClicked) 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)
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 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 volume #self.caseNavigatorWidget.addObservable(self.caseNavigatorWidget.EVENT_VOLUME_LOADED, self.onNewVolumeLoaded) 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 (str)", 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__))