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
Exemple #4
0
    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()
Exemple #5
0
    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()
Exemple #6
0
    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__))
Exemple #7
0
    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_()
Exemple #8
0
    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()
Exemple #9
0
  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)