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