Example #1
0
  def setupMeasurementsArea(self):
    self.measurementsGroupBox = qt.QGroupBox("Measurements")
    self.measurementsGroupBox.setLayout(qt.QGridLayout())
    self.tableView = slicer.qMRMLTableView()
    self.tableView.setMinimumHeight(150)
    self.tableView.setMaximumHeight(150)
    self.tableView.setSelectionBehavior(qt.QTableView.SelectRows)

    if ModuleWidgetMixin.isQtVersionOlder():
      self.tableView.horizontalHeader().setResizeMode(qt.QHeaderView.Stretch)
    else:
      self.tableView.horizontalHeader().setSectionResizeMode(qt.QHeaderView.Stretch)

    self.fourUpTableView = None
    self.segmentStatisticsConfigButton = self.createButton("Segment Statistics Parameters")

    self.calculateMeasurementsButton = self.createButton("Calculate Measurements", enabled=False)
    self.calculateAutomaticallyCheckbox = qt.QCheckBox("Auto Update")
    self.calculateAutomaticallyCheckbox.checked = True

    self.measurementsGroupBox.layout().addWidget(self.tableView, 0, 0, 1, 2)
    self.measurementsGroupBox.layout().addWidget(self.segmentStatisticsConfigButton, 1, 0, 1, 2)
    self.measurementsGroupBox.layout().addWidget(self.calculateMeasurementsButton, 2, 0)
    self.measurementsGroupBox.layout().addWidget(self.calculateAutomaticallyCheckbox, 2, 1)

    self.mainModuleWidgetLayout.addWidget(self.measurementsGroupBox)
Example #2
0
  def setupMeasurementsArea(self):
    self.measurementsGroupBox = qt.QGroupBox("Measurements")
    self.measurementsGroupBox.setLayout(qt.QGridLayout())
    self.tableView = slicer.qMRMLTableView()
    self.tableView.setMinimumHeight(150)
    self.tableView.setMaximumHeight(150)
    self.tableView.setSelectionBehavior(qt.QTableView.SelectRows)

    if ModuleWidgetMixin.isQtVersionOlder():
      self.tableView.horizontalHeader().setResizeMode(qt.QHeaderView.Stretch)
    else:
      self.tableView.horizontalHeader().setSectionResizeMode(qt.QHeaderView.Stretch)

    self.fourUpTableView = None
    self.segmentStatisticsConfigButton = self.createButton("Segment Statistics Parameters")

    self.calculateMeasurementsButton = self.createButton("Calculate Measurements", enabled=False)
    self.calculateAutomaticallyCheckbox = qt.QCheckBox("Auto Update")
    self.calculateAutomaticallyCheckbox.checked = True

    self.measurementsGroupBox.layout().addWidget(self.tableView, 0, 0, 1, 2)
    self.measurementsGroupBox.layout().addWidget(self.segmentStatisticsConfigButton, 1, 0, 1, 2)
    self.measurementsGroupBox.layout().addWidget(self.calculateMeasurementsButton, 2, 0)
    self.measurementsGroupBox.layout().addWidget(self.calculateAutomaticallyCheckbox, 2, 1)

    self.mainModuleWidgetLayout.addWidget(self.measurementsGroupBox)
Example #3
0
    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):
    self.CsvInputGroupBox = qt.QGroupBox('CSV input for local files')

    CsvInputLayout = qt.QFormLayout(self.CsvInputGroupBox)

    #
    # Input CSV Path
    #
    self.batchTableSelector = slicer.qMRMLNodeComboBox()
    self.batchTableSelector.nodeTypes = ['vtkMRMLTableNode']
    self.batchTableSelector.addEnabled = True
    self.batchTableSelector.selectNodeUponCreation = True
    self.batchTableSelector.renameEnabled = True
    self.batchTableSelector.removeEnabled = True
    self.batchTableSelector.noneEnabled = False
    self.batchTableSelector.setMRMLScene(slicer.mrmlScene)
    self.batchTableSelector.toolTip = 'Select the table representing the cases to process.'
    CsvInputLayout.addRow(self.batchTableSelector)

    self.batchTableView = slicer.qMRMLTableView()
    CsvInputLayout.addRow(self.batchTableView)
    self.batchTableView.show()

    #
    # Parameters Area
    #
    self.parametersCollapsibleButton = ctk.ctkCollapsibleButton()
    self.parametersCollapsibleButton.text = 'Parameters'
    CsvInputLayout.addWidget(self.parametersCollapsibleButton)

    # Layout within the dummy collapsible button
    parametersFormLayout = qt.QFormLayout(self.parametersCollapsibleButton)

    #
    # Input parameters GroupBox
    #

    self.inputParametersGroupBox = qt.QGroupBox('Input parameters')
    parametersFormLayout.addRow(self.inputParametersGroupBox)

    inputParametersFormLayout = qt.QFormLayout(self.inputParametersGroupBox)

    #
    # Root Path
    #
    self.rootSelector = qt.QLineEdit()
    self.rootSelector.text = 'path'
    self.rootSelector.toolTip = 'Location of the root directory to load from, or the column name specifying said ' \
                                'directory in the input CSV'
    inputParametersFormLayout.addRow('Root Column', self.rootSelector)

    #
    # Image Path
    #
    self.imageSelector = qt.QLineEdit()
    self.imageSelector.text = 'image'
    self.imageSelector.toolTip = 'Name of the column specifying main image files in input CSV'
    inputParametersFormLayout.addRow('Image Column', self.imageSelector)

    #
    # Mask Path
    #
    self.maskSelector = qt.QLineEdit()
    self.maskSelector.text = 'mask'
    self.maskSelector.toolTip = 'Name of the column specifying main mask files in input CSV'
    inputParametersFormLayout.addRow('Mask Column', self.maskSelector)

    #
    # Additional images
    #
    self.addImsSelector = qt.QLineEdit()
    self.addImsSelector.text = ''
    self.addImsSelector.toolTip = 'Comma separated names of the columns specifying additional image files in input CSV'
    inputParametersFormLayout.addRow('Additional images Column', self.addImsSelector)

    #
    # Additional masks
    #
    self.addMasksSelector = qt.QLineEdit()
    self.addMasksSelector.text = ''
    self.addMasksSelector.toolTip = 'Comma separated names of the columns specifying additional mask files in input CSV'
    inputParametersFormLayout.addRow('Additional masks Column', self.addMasksSelector)

    #
    # Connect Event Handlers
    #

    self.batchTableSelector.connect('nodeActivated(vtkMRMLNode*)', self.onChangeTable)
    self.imageSelector.connect('textEdited(QString)', self.onChangeImageColumn)

    return self.CsvInputGroupBox
  def setup(self):
    self.CsvInputGroupBox = qt.QGroupBox('CSV input for local files')

    CsvInputLayout = qt.QFormLayout(self.CsvInputGroupBox)

    #
    # Input CSV Path
    #
    self.batchTableSelector = slicer.qMRMLNodeComboBox()
    self.batchTableSelector.nodeTypes = ['vtkMRMLTableNode']
    self.batchTableSelector.addEnabled = True
    self.batchTableSelector.selectNodeUponCreation = True
    self.batchTableSelector.renameEnabled = True
    self.batchTableSelector.removeEnabled = True
    self.batchTableSelector.noneEnabled = False
    self.batchTableSelector.setMRMLScene(slicer.mrmlScene)
    self.batchTableSelector.toolTip = 'Select the table representing the cases to process.'
    CsvInputLayout.addRow(self.batchTableSelector)

    self.batchTableView = slicer.qMRMLTableView()
    CsvInputLayout.addRow(self.batchTableView)
    self.batchTableView.show()

    #
    # Parameters Area
    #
    self.parametersCollapsibleButton = ctk.ctkCollapsibleButton()
    self.parametersCollapsibleButton.text = 'Parameters'
    CsvInputLayout.addWidget(self.parametersCollapsibleButton)

    # Layout within the dummy collapsible button
    parametersFormLayout = qt.QFormLayout(self.parametersCollapsibleButton)

    #
    # Input parameters GroupBox
    #

    self.inputParametersGroupBox = qt.QGroupBox('Input parameters')
    parametersFormLayout.addRow(self.inputParametersGroupBox)

    inputParametersFormLayout = qt.QFormLayout(self.inputParametersGroupBox)

    #
    # Root Path
    #
    self.rootSelector = qt.QLineEdit()
    self.rootSelector.text = 'path'
    self.rootSelector.toolTip = 'Location of the root directory to load from, or the column name specifying said ' \
                                'directory in the input CSV'
    inputParametersFormLayout.addRow('Root Column', self.rootSelector)

    #
    # Image Path
    #
    self.imageSelector = qt.QLineEdit()
    self.imageSelector.text = 'image'
    self.imageSelector.toolTip = 'Name of the column specifying main image files in input CSV'
    inputParametersFormLayout.addRow('Image Column', self.imageSelector)

    #
    # Mask Path
    #
    self.maskSelector = qt.QLineEdit()
    self.maskSelector.text = 'mask'
    self.maskSelector.toolTip = 'Name of the column specifying main mask files in input CSV'
    inputParametersFormLayout.addRow('Mask Column', self.maskSelector)

    #
    # Additional images
    #
    self.addImsSelector = qt.QLineEdit()
    self.addImsSelector.text = ''
    self.addImsSelector.toolTip = 'Comma separated names of the columns specifying additional image files in input CSV'
    inputParametersFormLayout.addRow('Additional images Column(s)', self.addImsSelector)

    #
    # Additional masks
    #
    self.addMasksSelector = qt.QLineEdit()
    self.addMasksSelector.text = ''
    self.addMasksSelector.toolTip = 'Comma separated names of the columns specifying additional mask files in input CSV'
    inputParametersFormLayout.addRow('Additional masks Column(s)', self.addMasksSelector)

    #
    # Connect Event Handlers
    #
    self.batchTableSelector.connect('nodeActivated(vtkMRMLNode*)', self.onChangeTable)
    self.imageSelector.connect('textEdited(QString)', self.onChangeImageColumn)

    self.segmentationParametersGroupBox = qt.QGroupBox('Mask interaction parameters')
    parametersFormLayout.addRow(self.segmentationParametersGroupBox)

    segmentationParametersFormLayout = qt.QFormLayout(self.segmentationParametersGroupBox)

    #
    # Auto-redirect to SegmentEditor
    #
    self.chkAutoRedirect = qt.QCheckBox()
    self.chkAutoRedirect.checked = False
    self.chkAutoRedirect.toolTip = 'Automatically switch module to "SegmentEditor" when each case is loaded'
    segmentationParametersFormLayout.addRow('Go to Segment Editor', self.chkAutoRedirect)

    #
    # Save masks
    #
    self.chkSaveMasks = qt.QCheckBox()
    self.chkSaveMasks.checked = False
    self.chkSaveMasks.toolTip = 'save all initially loaded masks when proceeding to next case'
    segmentationParametersFormLayout.addRow('Save loaded masks', self.chkSaveMasks)

    #
    # Save new masks
    #
    self.chkSaveNewMasks = qt.QCheckBox()
    self.chkSaveNewMasks.checked = True
    self.chkSaveNewMasks.toolTip = 'save all newly generated masks when proceeding to next case'
    segmentationParametersFormLayout.addRow('Save new masks', self.chkSaveNewMasks)

    return self.CsvInputGroupBox
  def setup(self):
    self.CsvInputGroupBox = qt.QGroupBox('CSV input for local files')

    CsvInputLayout = qt.QFormLayout(self.CsvInputGroupBox)

    #
    # Input CSV Path
    #
    self.batchTableSelector = slicer.qMRMLNodeComboBox()
    self.batchTableSelector.nodeTypes = ['vtkMRMLTableNode']
    self.batchTableSelector.addEnabled = True
    self.batchTableSelector.selectNodeUponCreation = True
    self.batchTableSelector.renameEnabled = True
    self.batchTableSelector.removeEnabled = True
    self.batchTableSelector.noneEnabled = False
    self.batchTableSelector.setMRMLScene(slicer.mrmlScene)
    self.batchTableSelector.toolTip = 'Select the table representing the cases to process.'
    CsvInputLayout.addRow(self.batchTableSelector)

    #
    # Parameters Area
    #
    self.parametersCollapsibleButton = ctk.ctkCollapsibleButton()
    self.parametersCollapsibleButton.text = 'Table view and attribute properties'
    CsvInputLayout.addWidget(self.parametersCollapsibleButton)

    # Layout within the dummy collapsible button
    parametersFormLayout = qt.QFormLayout(self.parametersCollapsibleButton)

    self.batchTableView = slicer.qMRMLTableView()
    parametersFormLayout.addRow(self.batchTableView)
    self.batchTableView.show()

    #
    # Input parameters GroupBox
    #
    self.inputParametersGroupBox = qt.QGroupBox('Input parameters')
    parametersFormLayout.addRow(self.inputParametersGroupBox)

    inputParametersFormLayout = qt.QFormLayout(self.inputParametersGroupBox)

    #
    # Root Path
    #
    self.rootSelector = qt.QLineEdit()
    self.rootSelector.text = 'path'
    self.rootSelector.toolTip = 'Location of the root directory to load from, or the column name specifying said ' \
                                'directory in the input CSV'
    inputParametersFormLayout.addRow('Root Column', self.rootSelector)

    #
    # Image Path
    #
    self.imageSelector = qt.QLineEdit()
    self.imageSelector.text = 'image'
    self.imageSelector.toolTip = 'Name of the column specifying main image files in input CSV'
    inputParametersFormLayout.addRow('Image Column', self.imageSelector)

    #
    # GroundTruth masks
    #
    self.inputGTMaskColumnNames = qt.QLineEdit()
    self.inputGTMaskColumnNames.text = 'gt_0,gt_1,gt_2'
    self.inputGTMaskColumnNames.toolTip = 'Comma separated names of the columns specifying groundtruth mask files in input CSV'
    inputParametersFormLayout.addRow('Groundtruth masks Column(s)', self.inputGTMaskColumnNames)

    #
    # Predicted masks
    #
    self.inputPredMaskColumnNames = qt.QLineEdit()
    self.inputPredMaskColumnNames.text = 'pred_0,pred_1,pred_2'
    self.inputPredMaskColumnNames.toolTip = 'Comma separated names of the columns specifying predicted mask files in input CSV'
    inputParametersFormLayout.addRow('Predicted masks Column(s)', self.inputPredMaskColumnNames)

    self.iterationParametersGroupBox = qt.QGroupBox('Iteration parameters')
    parametersFormLayout.addRow(self.iterationParametersGroupBox)

    iterationParametersFormLayout = qt.QFormLayout(self.iterationParametersGroupBox)

    #
    # Cache Cases
    #
    self.cacheCases = qt.QCheckBox()
    self.cacheCases.checked = True
    self.cacheCases.toolTip = 'Cache cases for faster reload'
    iterationParametersFormLayout.addRow('Cache cases', self.cacheCases)

    #
    # Preload Cases
    #
    self.preloadCases = qt.QCheckBox()
    self.preloadCases.checked = False
    self.preloadCases.toolTip = 'Preloading all cases'
    iterationParametersFormLayout.addRow('Preload cases', self.preloadCases)

    #
    # Output Case Table Directory
    #
    self.tableOutputDirectory = ctk.ctkPathLineEdit()
    self.tableOutputDirectory.filters = ctk.ctkPathLineEdit.Dirs
    iterationParametersFormLayout.addRow('Case tables output dir', self.tableOutputDirectory)

    #
    # Progressbar
    #
    self.progressBar = qt.QProgressBar()
    self.progressBar.setFormat("%v/%m")
    self.progressBar.visible = False
    iterationParametersFormLayout.addWidget(self.progressBar)

    #
    # Connect Event Handlers
    #
    self.batchTableSelector.connect('nodeActivated(vtkMRMLNode*)', self.onChangeTable)
    self.imageSelector.connect('textEdited(QString)', self.onChangeImageColumn)
    self.preloadCases.stateChanged.connect(self.onPreloadCasesChanged)

    return self.CsvInputGroupBox
Example #7
0
  def setup(self):
    ScriptedLoadableModuleWidget.setup(self)

    #
    # Parameter Combobox
    #
    self.parameterSelector = slicer.qMRMLNodeComboBox()
    self.parameterLabel = qt.QLabel("  Parameter set: ")
    self.parameterSelector.nodeTypes = ["vtkMRMLScriptedModuleNode"]
    self.parameterSelector.removeEnabled = False
    self.parameterSelector.showHidden = True
    self.parameterSelector.setMRMLScene( slicer.mrmlScene )
    self.parameterLayout = qt.QHBoxLayout()
    self.parameterLayout.addWidget(self.parameterLabel)
    self.parameterLayout.addWidget(self.parameterSelector)
    self.layout.addLayout(self.parameterLayout)

    #
    # Input Area
    #
    inputCollapsibleButton = ctk.ctkCollapsibleButton()
    inputCollapsibleButton.text = "Input"
    self.layout.addWidget(inputCollapsibleButton)

    # Layout within the dummy collapsible button
    inputFormLayout = qt.QFormLayout(inputCollapsibleButton)

    #
    # Input first DVH selector
    #
    self.dvh1Selector = slicer.qMRMLNodeComboBox()
    self.dvh1Selector.nodeTypes = ["vtkMRMLTableNode"]
    self.dvh1Selector.addAttribute("vtkMRMLTableNode", "DoseVolumeHistogram.DVH")
    self.dvh1Selector.removeEnabled = False
    self.dvh1Selector.setMRMLScene( slicer.mrmlScene )
    inputFormLayout.addRow("DVH 1: ", self.dvh1Selector)

    #
    # Input second DVH selector
    #
    self.dvh2Selector = slicer.qMRMLNodeComboBox()
    self.dvh2Selector.nodeTypes = ["vtkMRMLTableNode"]
    self.dvh1Selector.addAttribute("vtkMRMLTableNode", "DoseVolumeHistogram.DVH")
    self.dvh2Selector.removeEnabled = False
    self.dvh2Selector.setMRMLScene( slicer.mrmlScene )
    inputFormLayout.addRow("DVH 2: ", self.dvh2Selector)

    #
    # Input the dose volume
    #
    self.doseVolumeSelector = slicer.qMRMLNodeComboBox()
    self.doseVolumeSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
    self.doseVolumeSelector.addAttribute("vtkMRMLScalarVolumeNode", "DicomRtImport.DoseVolume")
    self.doseVolumeSelector.removeEnabled = False
    self.doseVolumeSelector.setMRMLScene( slicer.mrmlScene )
    inputFormLayout.addRow("Dose Volume: ", self.doseVolumeSelector)

    #
    # Dose volume only check box
    #
    self.showDoseVolumeOnlyCheckbox = qt.QCheckBox("Show dose volume only")
    self.showDoseVolumeOnlyCheckbox.setChecked(2)
    inputFormLayout.addWidget(self.showDoseVolumeOnlyCheckbox)

    #
    # Volume difference criterion spin box
    #
    self.volumeDifferenceSpinbox = qt.QDoubleSpinBox()
    self.volumeDifferenceSpinbox.setValue(1.0)
    self.volumeDifferenceSpinbox.setDecimals(1)
    self.volumeDifferenceSpinbox.setSingleStep(0.1)
    inputFormLayout.addRow("Volume difference criterion: ", self.volumeDifferenceSpinbox)

    #
    # Dose to agreement criterion spin box
    #
    self.doseToAgreementSpinbox = qt.QDoubleSpinBox()
    self.doseToAgreementSpinbox.setValue(1.0)
    self.doseToAgreementSpinbox.setDecimals(1)
    self.doseToAgreementSpinbox.setSingleStep(0.1)
    inputFormLayout.addRow("Dose to agreement criterion: ", self.doseToAgreementSpinbox)

    #
    # Compute button
    #
    self.computeButton = qt.QPushButton("Compute")
    self.computeButtonLayout = qt.QVBoxLayout()
    self.computeButtonLayout.addStrut(100)
    self.computeButtonLayout.setAlignment(2)
    self.computeButtonLayout.addWidget(self.computeButton)
    self.computeButtonFont = qt.QFont()
    self.computeButtonFont.setBold(True)
    self.computeButton.setFont(self.computeButtonFont)
    inputFormLayout.addRow(self.computeButtonLayout)

    #
    # Output Area
    #
    outputCollapsibleButton = ctk.ctkCollapsibleButton()
    outputCollapsibleButton.text = "Output"
    self.layout.addWidget(outputCollapsibleButton)

    # Layout within the dummy collapsible button
    outputFormLayout = qt.QFormLayout(outputCollapsibleButton)

    self.agreementAcceptanceOutput = qt.QLineEdit()
    self.agreementAcceptanceOutput.setReadOnly(True)
    outputFormLayout.addRow("Agreement acceptance %: ", self.agreementAcceptanceOutput)

    #
    # Visualize Area
    #
    visualizeCollapsibleButton = ctk.ctkCollapsibleButton()
    visualizeCollapsibleButton.text = "Visualize"
    sizePolicy = qt.QSizePolicy()
    sizePolicy.setHorizontalPolicy(qt.QSizePolicy.Preferred)
    sizePolicy.setVerticalPolicy(qt.QSizePolicy.Expanding)
    visualizeCollapsibleButton.setSizePolicy(sizePolicy)
    self.layout.addWidget(visualizeCollapsibleButton)

    # Layout within the dummy collapsible button
    visualizeLayout = qt.QVBoxLayout(visualizeCollapsibleButton)

    #
    # DVH Table
    #
    self.dvhTable = slicer.qMRMLTableView()
    self.dvhTable.setMRMLScene(slicer.mrmlScene)
    self.dvhTable.setSelectionMode(qt.QAbstractItemView.NoSelection)
    self.dvhTable.setSizePolicy(sizePolicy)
    visualizeLayout.addWidget(self.dvhTable)

    # Connections
    self.parameterSelector.connect('nodeAddedByUser(vtkMRMLNode*)', self.parameterNodeCreated)
    self.parameterSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.updateWidgetFromMRML)

    self.showDoseVolumeOnlyCheckbox.connect('stateChanged(int)', self.showDoseVolumesOnlyCheckboxChanged)

    self.dvh1Selector.connect("currentNodeChanged(vtkMRMLNode*)", self.dvh1SelectorChanged)
    self.dvh2Selector.connect("currentNodeChanged(vtkMRMLNode*)", self.dvh2SelectorChanged)
    self.doseVolumeSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.doseVolumeSelectorChanged)

    self.volumeDifferenceSpinbox.connect("valueChanged(double)", self.volumeDifferenceSpinboxChanged)
    self.doseToAgreementSpinbox.connect("valueChanged(double)", self.doseToAgreementSpinboxChanged)

    self.computeButton.connect('clicked(bool)', self.onComputeButton)

    self.updateWidgetFromMRML()
Example #8
0
  def setup(self):
    ScriptedLoadableModuleWidget.setup(self)

    #
    # Parameter Combobox
    #
    self.parameterSelector = slicer.qMRMLNodeComboBox()
    self.parameterLabel = qt.QLabel("  Parameter set: ")
    self.parameterSelector.nodeTypes = ["vtkMRMLScriptedModuleNode"]
    self.parameterSelector.removeEnabled = False
    self.parameterSelector.showHidden = True
    self.parameterSelector.setMRMLScene( slicer.mrmlScene )
    self.parameterLayout = qt.QHBoxLayout()
    self.parameterLayout.addWidget(self.parameterLabel)
    self.parameterLayout.addWidget(self.parameterSelector)
    self.layout.addLayout(self.parameterLayout)

    #
    # Input Area
    #
    inputCollapsibleButton = ctk.ctkCollapsibleButton()
    inputCollapsibleButton.text = "Input"
    self.layout.addWidget(inputCollapsibleButton)

    # Layout within the dummy collapsible button
    inputFormLayout = qt.QFormLayout(inputCollapsibleButton)

    #
    # Input first DVH selector
    #
    self.dvh1Selector = slicer.qMRMLNodeComboBox()
    self.dvh1Selector.nodeTypes = ["vtkMRMLDoubleArrayNode"]
    self.dvh1Selector.removeEnabled = False
    self.dvh1Selector.setMRMLScene( slicer.mrmlScene )
    inputFormLayout.addRow("DVH 1: ", self.dvh1Selector)

    #
    # Input second DVH selector
    #
    self.dvh2Selector = slicer.qMRMLNodeComboBox()
    self.dvh2Selector.nodeTypes = ["vtkMRMLDoubleArrayNode"]
    self.dvh2Selector.removeEnabled = False
    self.dvh2Selector.setMRMLScene( slicer.mrmlScene )
    inputFormLayout.addRow("DVH 2: ", self.dvh2Selector)

    #
    # Input the dose volume
    #
    self.doseVolumeSelector = slicer.qMRMLNodeComboBox()
    self.doseVolumeSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
    self.doseVolumeSelector.addAttribute("vtkMRMLScalarVolumeNode", "DicomRtImport.DoseVolume")
    self.doseVolumeSelector.removeEnabled = False
    self.doseVolumeSelector.setMRMLScene( slicer.mrmlScene )
    inputFormLayout.addRow("Dose Volume: ", self.doseVolumeSelector)

    #
    # Dose volume only check box
    #
    self.showDoseVolumeOnlyCheckbox = qt.QCheckBox("Show dose volume only")
    self.showDoseVolumeOnlyCheckbox.setChecked(2)
    inputFormLayout.addWidget(self.showDoseVolumeOnlyCheckbox)	

    #
    # Volume difference criterion spin box
    #
    self.volumeDifferenceSpinbox = qt.QDoubleSpinBox()
    self.volumeDifferenceSpinbox.setValue(1.0)
    self.volumeDifferenceSpinbox.setDecimals(1)
    self.volumeDifferenceSpinbox.setSingleStep(0.1)
    inputFormLayout.addRow("Volume difference criterion: ", self.volumeDifferenceSpinbox)

    #
    # Dose to agreement criterion spin box
    #
    self.doseToAgreementSpinbox = qt.QDoubleSpinBox()
    self.doseToAgreementSpinbox.setValue(1.0)
    self.doseToAgreementSpinbox.setDecimals(1)
    self.doseToAgreementSpinbox.setSingleStep(0.1)
    inputFormLayout.addRow("Dose to agreement criterion: ", self.doseToAgreementSpinbox)

    #
    # Compute button
    #
    self.computeButton = qt.QPushButton("Compute")
    self.computeButtonLayout = qt.QVBoxLayout()
    self.computeButtonLayout.addStrut(100)
    self.computeButtonLayout.setAlignment(2)
    self.computeButtonLayout.addWidget(self.computeButton)
    self.computeButtonFont = qt.QFont()
    self.computeButtonFont.setBold(True)
    self.computeButton.setFont(self.computeButtonFont)
    inputFormLayout.addRow(self.computeButtonLayout)

    #
    # Output Area
    #
    outputCollapsibleButton = ctk.ctkCollapsibleButton()
    outputCollapsibleButton.text = "Output"
    self.layout.addWidget(outputCollapsibleButton)

    # Layout within the dummy collapsible button
    outputFormLayout = qt.QFormLayout(outputCollapsibleButton)

    self.agreementAcceptanceOutput = qt.QLineEdit()
    self.agreementAcceptanceOutput.setReadOnly(True)
    outputFormLayout.addRow("Agreement acceptance %: ", self.agreementAcceptanceOutput)

    #
    # Visualize Area
    #
    visualizeCollapsibleButton = ctk.ctkCollapsibleButton()
    visualizeCollapsibleButton.text = "Visualize"
    sizePolicy = qt.QSizePolicy()
    sizePolicy.setHorizontalPolicy(qt.QSizePolicy.Preferred)
    sizePolicy.setVerticalPolicy(qt.QSizePolicy.Expanding)
    visualizeCollapsibleButton.setSizePolicy(sizePolicy)
    self.layout.addWidget(visualizeCollapsibleButton)

    # Layout within the dummy collapsible button
    visualizeLayout = qt.QVBoxLayout(visualizeCollapsibleButton)

    #
    # DVH Table
    #
    self.dvhTable = slicer.qMRMLTableView()
    self.dvhTable.setMRMLScene(slicer.mrmlScene)
    self.dvhTable.setSelectionMode(qt.QAbstractItemView.NoSelection)
    self.dvhTable.setSizePolicy(sizePolicy)
    visualizeLayout.addWidget(self.dvhTable)

    # Connections
    self.parameterSelector.connect('nodeAddedByUser(vtkMRMLNode*)', self.parameterNodeCreated)
    self.parameterSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.updateWidgetFromMRML)

    self.showDoseVolumeOnlyCheckbox.connect('stateChanged(int)', self.showDoseVolumesOnlyCheckboxChanged)
    
    self.dvh1Selector.connect("currentNodeChanged(vtkMRMLNode*)", self.dvh1SelectorChanged)
    self.dvh2Selector.connect("currentNodeChanged(vtkMRMLNode*)", self.dvh2SelectorChanged)
    self.doseVolumeSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.doseVolumeSelectorChanged)
    
    self.volumeDifferenceSpinbox.connect("valueChanged(double)", self.volumeDifferenceSpinboxChanged)
    self.doseToAgreementSpinbox.connect("valueChanged(double)", self.doseToAgreementSpinboxChanged)

    self.computeButton.connect('clicked(bool)', self.onComputeButton)

    self.updateWidgetFromMRML()
  def setup(self):
    ScriptedLoadableModuleWidget.setup(self)

    self.logic = ExtensionStatsLogic()
    self.logic.setStatusCallback(self.setStatusText)

    self.queryInProgress = False

    # Instantiate and connect widgets ...

    #
    # Parameters Area
    #
    parametersCollapsibleButton = ctk.ctkCollapsibleButton()
    parametersCollapsibleButton.text = "Parameters"
    self.layout.addWidget(parametersCollapsibleButton)

    parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton)

    extensionNameBox = qt.QHBoxLayout()

    self.extensionNameEdit = qt.QLineEdit()
    self.extensionNameEdit.setText('')
    extensionNameBox.addWidget(self.extensionNameEdit)

    self.extensionNameAllButton = qt.QPushButton()
    self.extensionNameAllButton.text = "all"
    self.extensionNameAllButton.toolTip = "Get statistics for all extensions"
    extensionNameBox.addWidget(self.extensionNameAllButton)
    self.populateExtensionNameEdit()

    parametersFormLayout.addRow("Extension name: ", extensionNameBox)

    self.applyButton = qt.QPushButton("Get download statistics")
    self.applyButton.toolTip = "Get download statistics"
    parametersFormLayout.addRow(self.applyButton)

    self.statusText = qt.QLabel()
    parametersFormLayout.addRow("Status:", self.statusText)

    # Stats table
    self.statsTableWidget = slicer.qMRMLTableView()
    self.statsTableWidget.setMRMLScene(slicer.mrmlScene)
    parametersFormLayout.addRow("Statistics:", self.statsTableWidget)
    policy = qt.QSizePolicy()
    policy.setVerticalStretch(1)
    policy.setHorizontalPolicy(qt.QSizePolicy.Expanding)
    policy.setVerticalPolicy(qt.QSizePolicy.Expanding)
    self.statsTableWidget.setSizePolicy(policy)

    self.statsTableNode = slicer.vtkMRMLTableNode()
    self.statsTableNode.SetName('ExtensionStats')
    self.statsTableNode.SetUseColumnNameAsColumnHeader(True)
    self.statsTableNode.SetUseFirstColumnAsRowHeader(True)
    slicer.mrmlScene.AddNode(self.statsTableNode)
    self.statsTableWidget.setMRMLTableNode(self.statsTableNode)

    # Copy to clipboard button
    self.copyToClipboardButton = qt.QPushButton("Copy table to clipboard")
    parametersFormLayout.addRow('', self.copyToClipboardButton)

    # connections
    self.extensionNameAllButton.connect('clicked()', self.populateExtensionNameEdit)
    self.applyButton.connect('clicked(bool)', self.onApplyButton)
    self.copyToClipboardButton.connect('clicked()', self.copyTableToClipboard)
Example #10
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        #Set Two Over Two View

        layoutManagerApp = slicer.app.layoutManager()
        layoutManagerApp.setLayout(
            slicer.vtkMRMLLayoutNode.SlicerLayoutTwoOverTwoView)

        # Setup a logger for the extension log messages
        self.logger = logging.getLogger('SlicerCaseIterator')

        # Instantiate some variables used during iteration
        self.csv_dir = None  # Directory containing the file specifying the cases, needed when using relative paths
        self.tableNode = None
        self.caseColumns = None  # Dictionary holding the specified (and found) columns from the batchTable
        self.currentCase = None  # Represents the currently loaded case
        self.caseCount = 0  # Counter equalling the total number of cases
        self.currentIdx = -1  # Current case index (starts at 0 for fist case, -1 means nothing loaded)

        # These variables hold connections to other parts of Slicer, such as registered keyboard shortcuts and
        # Event observers
        self.shortcuts = []
        self.observers = []

        # Instantiate and connect widgets ...

        #
        # Select and Load input data section
        #

        self.inputDataCollapsibleButton = ctk.ctkCollapsibleButton()
        self.inputDataCollapsibleButton.text = 'Select and Load case data'
        self.layout.addWidget(self.inputDataCollapsibleButton)

        inputDataFormLayout = qt.QFormLayout(self.inputDataCollapsibleButton)

        #
        # Input CSV Path
        #
        self.inputPathSelector = ctk.ctkPathLineEdit()
        self.inputPathSelector.toolTip = 'Location of the CSV file containing the cases to process'
        inputDataFormLayout.addRow('Input CSV path', self.inputPathSelector)

        self.loadBatchButton = qt.QPushButton('Load Input Data')
        self.loadBatchButton.enabled = False
        self.loadBatchButton.toolTip = 'Load the select file into the input Table'
        inputDataFormLayout.addRow(self.loadBatchButton)

        self.batchTableSelector = slicer.qMRMLNodeComboBox()
        self.batchTableSelector.nodeTypes = ['vtkMRMLTableNode']
        self.batchTableSelector.addEnabled = True
        self.batchTableSelector.selectNodeUponCreation = True
        self.batchTableSelector.renameEnabled = True
        self.batchTableSelector.removeEnabled = True
        self.batchTableSelector.noneEnabled = False
        self.batchTableSelector.setMRMLScene(slicer.mrmlScene)
        self.batchTableSelector.toolTip = 'Select the table representing the cases to process.'
        inputDataFormLayout.addRow(self.batchTableSelector)

        self.batchTableView = slicer.qMRMLTableView()
        inputDataFormLayout.addRow(self.batchTableView)
        self.batchTableView.show()

        #
        # Parameters Area
        #
        self.parametersCollapsibleButton = ctk.ctkCollapsibleButton()
        self.parametersCollapsibleButton.text = 'Parameters'
        self.layout.addWidget(self.parametersCollapsibleButton)

        # Layout within the dummy collapsible button
        parametersFormLayout = qt.QFormLayout(self.parametersCollapsibleButton)

        #
        # Input parameters GroupBox
        #

        self.inputParametersGroupBox = qt.QGroupBox('Input parameters')
        parametersFormLayout.addRow(self.inputParametersGroupBox)

        inputParametersFormLayout = qt.QFormLayout(
            self.inputParametersGroupBox)

        #
        # Start position
        #
        self.npStart = qt.QSpinBox()
        self.npStart.minimum = 1
        self.npStart.maximum = 999999
        self.npStart.value = 1
        self.npStart.toolTip = 'Start position in the CSV file (1 = first patient)'
        inputParametersFormLayout.addRow('Start position', self.npStart)

        #
        # Root Path
        #
        self.rootSelector = qt.QLineEdit()
        self.rootSelector.text = 'path'
        self.rootSelector.toolTip = 'Location of the root directory to load from, or the column name specifying said ' \
                                    'directory in the input CSV'
        inputParametersFormLayout.addRow('Root Column', self.rootSelector)

        #
        # Image Path
        #
        self.imageSelector = qt.QLineEdit()
        self.imageSelector.text = 'image'
        self.imageSelector.toolTip = 'Name of the column specifying main image files in input CSV'
        inputParametersFormLayout.addRow('Image Column', self.imageSelector)

        #
        # Mask Path
        #
        self.maskSelector = qt.QLineEdit()
        self.maskSelector.text = 'mask'
        self.maskSelector.toolTip = 'Name of the column specifying main mask files in input CSV'
        inputParametersFormLayout.addRow('Mask Column', self.maskSelector)

        #
        # Additional images
        #
        self.addImsSelector = qt.QLineEdit()
        self.addImsSelector.text = ''
        self.addImsSelector.toolTip = 'Comma separated names of the columns specifying additional image files in input CSV'
        inputParametersFormLayout.addRow('Additional images Column',
                                         self.addImsSelector)

        #
        # Additional masks
        #
        self.addMasksSelector = qt.QLineEdit()
        self.addMasksSelector.text = ''
        self.addMasksSelector.toolTip = 'Comma separated names of the columns specifying additional mask files in input CSV'
        inputParametersFormLayout.addRow('Additional masks Column',
                                         self.addMasksSelector)

        #
        # Output parameters GroupBox
        #

        self.outputParametersGroupBox = qt.QGroupBox('Output parameters')
        parametersFormLayout.addRow(self.outputParametersGroupBox)

        outputParametersFormLayout = qt.QFormLayout(
            self.outputParametersGroupBox)

        #
        # Reader Name
        #
        self.txtReaderName = qt.QLineEdit()
        self.txtReaderName.text = ''
        self.txtReaderName.toolTip = 'Name of the current reader; if not empty, this name will be added to the filename ' \
                                     'of saved masks'
        outputParametersFormLayout.addRow('Reader name', self.txtReaderName)

        #
        # Auto-redirect to SegmentEditor
        #

        self.chkAutoRedirect = qt.QCheckBox()
        self.chkAutoRedirect.checked = 1
        self.chkAutoRedirect.toolTip = 'Automatically switch module to "SegmentEditor" when each case is loaded'
        outputParametersFormLayout.addRow('Go to Segment Editor',
                                          self.chkAutoRedirect)

        #
        # Save masks
        #
        self.chkSaveMasks = qt.QCheckBox()
        self.chkSaveMasks.checked = 1
        self.chkSaveMasks.toolTip = 'save all initially loaded masks when proceeding to next case'
        outputParametersFormLayout.addRow('Save loaded masks',
                                          self.chkSaveMasks)

        #
        # Save masks
        #
        self.chkSaveNewMasks = qt.QCheckBox()
        self.chkSaveNewMasks.checked = 1
        self.chkSaveNewMasks.toolTip = 'save all newly generated masks when proceeding to next case'
        outputParametersFormLayout.addRow('Save new masks',
                                          self.chkSaveNewMasks)

        #
        # Previous Case
        #

        self.previousButton = qt.QPushButton('Previous Case')
        self.previousButton.enabled = False
        self.previousButton.toolTip = '(Ctrl+P) Press this button to go to the previous case, previous new masks are not reloaded'
        self.layout.addWidget(self.previousButton)

        #
        # Load CSV / Next Case
        #
        self.nextButton = qt.QPushButton('Next Case')
        self.nextButton.enabled = False
        self.nextButton.toolTip = '(Ctrl+N) Press this button to go to the next case'
        self.layout.addWidget(self.nextButton)

        #
        # Reset
        #
        self.resetButton = qt.QPushButton('Start Batch')
        self.resetButton.enabled = False
        self.layout.addWidget(self.resetButton)

        self.layout.addStretch(1)

        #
        # Connect buttons to functions
        #

        self.batchTableSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                        self.onChangeTable)

        self.loadBatchButton.connect('clicked(bool)', self.onLoadBatch)
        self.previousButton.connect('clicked(bool)', self.onPrevious)
        self.nextButton.connect('clicked(bool)', self.onNext)
        self.resetButton.connect('clicked(bool)', self.onReset)

        self._setGUIstate(csv_loaded=False)