def populateStats(self): if not self.logic: return displayNode = self.labelNode.GetDisplayNode() colorNode = displayNode.GetColorNode() lut = colorNode.GetLookupTable() self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 for i in self.logic.labelStats["Labels"]: color = qt.QColor() rgb = lut.GetTableValue(i) color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, qt.Qt.DecorationRole) item.setToolTip(colorNode.GetColorName(i)) self.model.setItem(row, 0, item) self.items.append(item) col = 1 for k in self.logic.keys: item = qt.QStandardItem() # set data as float with Qt::DisplayRole item.setData(float(self.logic.labelStats[i, k]), qt.Qt.DisplayRole) item.setToolTip(colorNode.GetColorName(i)) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 self.view.setColumnWidth(0, 30) self.model.setHeaderData(0, 1, " ") col = 1 for k in self.logic.keys: self.view.setColumnWidth(col, 15 * len(k)) self.model.setHeaderData(col, 1, k) col += 1
def populateStats(self): if not self.logic: return #displayNode = self.labelNode.GetNthDataNode(0).GetDisplayNode() #colorNode = displayNode.GetColorNode() #lut = colorNode.GetLookupTable() self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 for i in self.logic.labelStats["Labels"]: color = qt.QColor() # rgb = lut.GetTableValue(i) color.setRgb(255, 0, 0) item = qt.QStandardItem() item.setData(color, 1) # item.setToolTip(colorNode.GetColorName(i)) self.model.setItem(row, 0, item) self.items.append(item) col = 1 for k in self.logic.keys: item = qt.QStandardItem() item.setText(str(self.logic.labelStats[i, k])) # item.setToolTip(colorNode.GetColorName(i)) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 self.view.setColumnWidth(0, 30) self.model.setHeaderData(0, 1, " ") col = 1 for k in self.logic.keys: self.view.setColumnWidth(col, 15 * len(k)) self.model.setHeaderData(col, 1, k) col += 1
def populateStatistics(self, FeatureVectors): if not (FeatureVectors): return self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 col = 0 wholeNumberKeys = ['Voxel Count', 'Gray Levels', 'Minimum Intensity', 'Maximum Intensity', 'Median Intensity', 'Range'] precisionOnlyKeys = ['Entropy', 'Volume mm^3', 'Volume cc', 'Mean Intensity', 'Mean Deviation', 'Root Mean Square', 'Standard Deviation', 'Surface Area mm^3'] for featureVector in FeatureVectors: col = 0 for feature in featureVector: item = qt.QStandardItem() value = featureVector[feature] featureFormatted = value # add formatting here item.setText(str(featureFormatted)) item.setToolTip(feature) self.model.setItem(row,col,item) self.items.append(item) col += 1 row += 1 self.view.setColumnWidth(0,30) self.model.setHeaderData(0,1," ") # set table headers col = 0 for feature in FeatureVectors[0]: self.view.setColumnWidth(col,15*len(feature)) self.model.setHeaderData(col,1,feature) col += 1
def updateTable(self): self.portsTableModel = qt.QStandardItemModel() self.portsTable.setModel(self.portsTableModel) self.transformSliders.reset() self.removePortButton.enabled = False self.transformSliders.setMRMLTransformNode(None) node = self.logic.markupsNode if node is None: return self.itemPortIdxMap = {} for i in range(node.GetNumberOfFiducials()): item = qt.QStandardItem() item.setText(self.logic.getPortName(i)) self.portsTableModel.setItem(i, 0, item) self.itemPortIdxMap[item] = i item = qt.QStandardItem() item.setText('Visible') item.setCheckable(True) if self.logic.isToolVisible(i): checkState = 2 # checked enum else: checkState = 0 # unchecked enum item.setCheckState(checkState) self.portsTableModel.setItem(i, 1, item) self.itemPortIdxMap[item] = i self.portsTableModel.setHeaderData(0, 1, "Port Fiducial Name") self.portsTableModel.setHeaderData(1, 1, " ") self.portsTable.setColumnWidth(0, 15 * len("Port Fiducial Name")) self.portsTableModel.itemChanged.connect(self.onTableItemChanged) self.portsTable.selectionModel().currentRowChanged.connect( self.onCurrentToolChanged)
def setup(self): # Instantiate and connect widgets ... # # # # Reload and Test area # # # reloadCollapsibleButton = ctk.ctkCollapsibleButton() # reloadCollapsibleButton.text = "Reload && Test" # self.layout.addWidget(reloadCollapsibleButton) # reloadFormLayout = qt.QFormLayout(reloadCollapsibleButton) # # reload button # # (use this during development, but remove it when delivering # # your module to users) # self.reloadButton = qt.QPushButton("Reload") # self.reloadButton.toolTip = "Reload this module." # self.reloadButton.name = "PortPlacement Reload" # reloadFormLayout.addWidget(self.reloadButton) # self.reloadButton.connect('clicked()', self.onReload) # # reload and test button # # (use this during development, but remove it when delivering # # your module to users) # self.reloadAndTestButton = qt.QPushButton("Reload and Test") # self.reloadAndTestButton.toolTip = "Reload this module and then run the self tests." # reloadFormLayout.addWidget(self.reloadAndTestButton) # self.reloadAndTestButton.connect('clicked()', self.onReloadAndTest) # # Ports Area # portsCollapsibleButton = ctk.ctkCollapsibleButton() portsCollapsibleButton.text = "Surgical Ports" self.layout.addWidget(portsCollapsibleButton) portsFormLayout = qt.QFormLayout(portsCollapsibleButton) # # port fiducial list selector # self.portListSelector = slicer.qMRMLNodeComboBox() self.portListSelector.nodeTypes = ["vtkMRMLMarkupsFiducialNode"] self.portListSelector.addEnabled = False self.portListSelector.removeEnabled = False self.portListSelector.noneEnabled = True self.portListSelector.setMRMLScene(slicer.mrmlScene) self.portListSelector.setToolTip("Add surgical ports from a markups node.") portsFormLayout.addRow("Markups node of surgical ports", self.portListSelector) # # Add Port List button # self.addPortListButton = qt.QPushButton("Set Port Markups Node") self.addPortListButton.enabled = False portsFormLayout.addRow(self.addPortListButton) # # Port table # self.portsTable = qt.QTableView() self.portsTableModel = qt.QStandardItemModel() self.portsTable.setModel(self.portsTableModel) portsFormLayout.addRow(self.portsTable) # # Remove Port button # self.removePortButton = qt.QPushButton("Remove Selected Port") self.removePortButton.enabled = False portsFormLayout.addRow(self.removePortButton) # # Target area # targetCollapsibleButton = ctk.ctkCollapsibleButton() targetCollapsibleButton.text = "Surgical Target" self.layout.addWidget(targetCollapsibleButton) targetFormLayout = qt.QFormLayout(targetCollapsibleButton) # # target selector # self.targetSelector = slicer.qMRMLNodeComboBox() self.targetSelector.nodeTypes = ["vtkMRMLMarkupsFiducialNode"] self.targetSelector.addEnabled = False self.targetSelector.removeEnabled = False self.targetSelector.noneEnabled = True self.targetSelector.setMRMLScene(slicer.mrmlScene) self.targetSelector.setToolTip("Pick the surgical target that the tools should face.") targetFormLayout.addRow("Surgical Target Fiducial", self.targetSelector) # # Retarget button # self.retargetButton = qt.QPushButton("Aim Tools at Target") self.retargetButton.toolTip = "Reset tool orientations to face target fiducial" self.retargetButton.enabled = False targetFormLayout.addRow(self.retargetButton) # # Port Tool Display Options # toolsCollapsibleButton = ctk.ctkCollapsibleButton() toolsCollapsibleButton.text = "Port Tool Display Options" self.layout.addWidget(toolsCollapsibleButton) toolsFormLayout = qt.QFormLayout(toolsCollapsibleButton) # # Transform sliders # self.transformSliders = slicer.qMRMLTransformSliders() self.transformSliders.TypeOfTransform = slicer.qMRMLTransformSliders.ROTATION self.transformSliders.CoordinateReference = slicer.qMRMLTransformSliders.LOCAL self.transformSliders.Title = 'Tool Orientation' self.transformSliders.minMaxVisible = False toolsFormLayout.addRow(self.transformSliders) # # radius spin box # self.radiusSpinBox = qt.QDoubleSpinBox() self.radiusSpinBox.setMinimum(0.0) self.radiusSpinBox.setMaximum(10.0) self.radiusSpinBox.setValue(2.0) toolsFormLayout.addRow("Tool radius", self.radiusSpinBox) # # length spin box # self.lengthSpinBox = qt.QDoubleSpinBox() self.lengthSpinBox.setMinimum(0.0) self.lengthSpinBox.setMaximum(250.0) self.lengthSpinBox.setValue(150.0) toolsFormLayout.addRow("Tool length", self.lengthSpinBox) # connections self.portListSelector.connect('currentNodeChanged(bool)', self.onPortListSelectorChanged) self.targetSelector.connect('currentNodeChanged(bool)', self.onTargetSelectorChanged) self.addPortListButton.connect('clicked(bool)', self.onAddPortListButton) self.removePortButton.connect('clicked(bool)', self.onRemovePortButton) self.retargetButton.connect('clicked(bool)', self.onRetargetButton) self.radiusSpinBox.connect('valueChanged(double)', self.onToolShapeChanged) self.lengthSpinBox.connect('valueChanged(double)', self.onToolShapeChanged) # Add vertical spacer self.layout.addStretch(1) # Add observer to scene for removal of fiducial nodes self.sceneObserverTag = slicer.mrmlScene.AddObserver(slicer.mrmlScene.NodeRemovedEvent, self.onNodeRemoved) # instantiate port placement module logic self.logic = PortPlacementLogic() self.currentMarkupsNode = None self.onMarkupAddedTag = None
def updateStructures(self, caller=None, event=None): """re-build the Structures frame - optional caller and event ignored (for use as vtk observer callback) """ if self.setMergeButton.destroyed(): """ TODO: here the python class still exists but the Qt widgets are gone - need to figure out when to remove observers and free python code - probably the destroyed() signal. """ self.cleanup() return self.setMergeButton.setDisabled(not self.master) # reset to a fresh model self.brushes = [] self.items = [] self.structures = qt.QStandardItemModel() self.structuresView.setModel(self.structures) # if no merge volume exists, disable everything - else enable merge = self.mergeVolume() self.addStructureButton.setDisabled(not merge) self.deleteStructuresButton.setDisabled(not merge) self.mergeButton.setDisabled(not merge) self.splitButton.setDisabled(not merge) self.mergeAndBuildButton.setDisabled(not merge) self.replaceModels.setDisabled(not merge) if self.mergeValidCommand: # will be passed current self.mergeValidCommand(merge) if not merge: return colorNode = merge.GetDisplayNode().GetColorNode() lut = colorNode.GetLookupTable() masterName = self.master.GetName() slicer.mrmlScene.InitTraversal() vNode = slicer.mrmlScene.GetNextNodeByClass("vtkMRMLScalarVolumeNode") self.row = 0 while vNode: vName = vNode.GetName() # match something like "CT-lung-label1" regexp = "%s-.*-label" % masterName if re.match(regexp, vName): # figure out what name it is # - account for the fact that sometimes a number will be added to the end of the name start = 1 + len(masterName) end = vName.rfind("-label") structureName = vName[start:end] structureIndex = colorNode.GetColorIndexByName(structureName) structureColor = lut.GetTableValue(structureIndex)[0:3] brush = qt.QBrush() self.brushes.append(brush) color = qt.QColor() color.setRgb(structureColor[0] * 255, structureColor[1] * 255, structureColor[2] * 255) brush.setColor(color) # label index item = qt.QStandardItem() item.setEditable(False) item.setText(str(structureIndex)) self.structures.setItem(self.row, 0, item) self.items.append(item) # label color item = qt.QStandardItem() item.setEditable(False) item.setData(color, 1) self.structures.setItem(self.row, 1, item) self.items.append(item) # structure name item = qt.QStandardItem() item.setEditable(False) item.setText(structureName) self.structures.setItem(self.row, 2, item) self.items.append(item) # volumeName name item = qt.QStandardItem() item.setEditable(False) item.setText(vName) self.structures.setItem(self.row, 3, item) self.items.append(item) # sort order item = qt.QStandardItem() item.setEditable(True) item.setText("") self.structures.setItem(self.row, 4, item) self.items.append(item) self.row += 1 vNode = slicer.mrmlScene.GetNextNodeByClass( "vtkMRMLScalarVolumeNode") self.structuresView.setColumnWidth(0, 70) self.structuresView.setColumnWidth(1, 50) self.structuresView.setColumnWidth(2, 60) self.structuresView.setColumnWidth(3, 100) self.structuresView.setColumnWidth(4, 10) self.structures.setHeaderData(0, 1, "Number") self.structures.setHeaderData(1, 1, "Color") self.structures.setHeaderData(2, 1, "Name") self.structures.setHeaderData(3, 1, "Label Volume") self.structures.setHeaderData(4, 1, "Order") self.structuresView.setModel(self.structures)
def updateStructures(self,caller=None, event=None): """re-build the Structures frame - optional caller and event ignored (for use as vtk observer callback) """ if slicer.mrmlScene.IsBatchProcessing(): return if self.setMergeButton.destroyed(): """ TODO: here the python class still exists but the Qt widgets are gone - need to figure out when to remove observers and free python code - probably the destroyed() signal. """ self.cleanup() return self.setMergeButton.setDisabled(not self.master) # reset to a fresh model self.brushes = [] self.items = [] self.structures = qt.QStandardItemModel() self.structuresView.setModel(self.structures) # if no merge volume exists, disable everything - else enable merge = self.mergeVolume() self.addStructureButton.setDisabled(not merge) self.deleteStructuresButton.setDisabled(not merge) self.mergeButton.setDisabled(not merge) self.splitButton.setDisabled(not merge) self.mergeAndBuildButton.setDisabled(not merge) self.replaceModels.setDisabled(not merge) if self.mergeValidCommand: # will be passed current self.mergeValidCommand(merge) if not merge: return colorNode = merge.GetDisplayNode().GetColorNode() lut = colorNode.GetLookupTable() masterName = self.master.GetName() volumeNodes = self.structureVolumes() for vNode in volumeNodes: vName = vNode.GetName() # figure out what name it is # - account for the fact that sometimes a number will be added to the end of the name start = 1+len(masterName) end = vName.rfind("-label") structureName = vName[start:end] structureIndex = colorNode.GetColorIndexByName( structureName ) structureColor = lut.GetTableValue(structureIndex)[0:3] brush = qt.QBrush() self.brushes.append(brush) color = qt.QColor() color.setRgb(structureColor[0]*255,structureColor[1]*255,structureColor[2]*255) brush.setColor(color) # label index item = qt.QStandardItem() item.setEditable(False) item.setText( "%03d"%int(structureIndex) ) self.structures.setItem(self.row,0,item) self.items.append(item) # label color item = qt.QStandardItem() item.setEditable(False) item.setData(color,1) self.structures.setItem(self.row,1,item) self.items.append(item) # structure name item = qt.QStandardItem() item.setEditable(False) item.setText(structureName) self.structures.setItem(self.row,2,item) self.items.append(item) # volumeName name item = qt.QStandardItem() item.setEditable(False) item.setText(vName) self.structures.setItem(self.row,3,item) self.items.append(item) # sort order item = qt.QStandardItem() item.setEditable(True) item.setText("") self.structures.setItem(self.row,4,item) self.items.append(item) self.row += 1 for i in range(5): self.structuresView.resizeColumnToContents(i) self.structures.setHeaderData(0,1,"Number") self.structures.setHeaderData(1,1,"Color") self.structures.setHeaderData(2,1,"Name") self.structures.setHeaderData(3,1,"Label Volume") self.structures.setHeaderData(4,1,"Order") self.structuresView.setModel(self.structures) self.structuresView.connect("activated(QModelIndex)", self.onStructuresClicked) self.structuresView.setProperty('SH_ItemView_ActivateItemOnSingleClick', 1) self.structureLabelNames = [] rows = self.structures.rowCount() for row in xrange(rows): self.structureLabelNames.append(self.structures.item(row,2).text())
def populateStats(self): if not self.logic: return displayNode = self.insplabelNode.GetDisplayNode() colorNode = displayNode.GetColorNode() lut = colorNode.GetLookupTable() self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 cycle = ['insp'] for i in cycle: for regionTag, regionValue in zip(self.logic.regionTags, self.logic.regionValues): color = qt.QColor() rgb = lut.GetTableValue(regionValue[0]) color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, 1) item.setText(str(regionTag)) item.setData(regionTag, 1) item.setToolTip(regionTag) self.model.setItem(row, 0, item) self.items.append(item) col = 1 for k in self.logic.keys: item = qt.QStandardItem() item.setText("%.3f" % self.logic.labelStats[i, k, regionTag]) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 self.view.setColumnWidth(0, 30) self.model.setHeaderData(0, 1, "INSP") col = 1 for k in self.logic.keys: self.view.setColumnWidth(col, 15 * len(k)) self.model.setHeaderData(col, 1, k) col += 1 self.itemsexp = [] self.modelexp = qt.QStandardItemModel() self.viewexp.setModel(self.modelexp) self.viewexp.verticalHeader().visible = False row = 0 cycle = ['exp'] for i in cycle: for regionTag, regionValue in zip(self.logic.regionTags, self.logic.regionValues): color = qt.QColor() rgb = lut.GetTableValue(regionValue[0]) color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, 1) item.setText(str(regionTag)) item.setData(regionTag, 1) item.setToolTip(regionTag) self.modelexp.setItem(row, 0, item) self.itemsexp.append(item) col = 1 for k in self.logic.keys: item = qt.QStandardItem() item.setText("%.3f" % self.logic.labelStats[i, k, regionTag]) self.modelexp.setItem(row, col, item) self.itemsexp.append(item) col += 1 row += 1 self.viewexp.setColumnWidth(0, 30) self.modelexp.setHeaderData(0, 1, "EXP") col = 1 for k in self.logic.keys: self.viewexp.setColumnWidth(col, 15 * len(k)) self.modelexp.setHeaderData(col, 1, k) col += 1
def setup(self): # # Reload and Test area # reloadCollapsibleButton = ctk.ctkCollapsibleButton() reloadCollapsibleButton.text = "Reload && Test" self.layout.addWidget(reloadCollapsibleButton) reloadFormLayout = qt.QFormLayout(reloadCollapsibleButton) # reload button # (use this during development, but remove it when delivering # your module to users) self.reloadButton = qt.QPushButton("Reload") self.reloadButton.toolTip = "Reload this module." self.reloadButton.name = "Radiomics Reload" reloadFormLayout.addWidget(self.reloadButton) self.reloadButton.connect('clicked()', self.onReload) # reload and test button # (use this during development, but remove it when delivering # your module to users) self.reloadAndTestButton = qt.QPushButton("Reload and Test") self.reloadAndTestButton.toolTip = "Reload this module and then run the self tests." reloadFormLayout.addWidget(self.reloadAndTestButton) # self.reloadAndTestButton.connect('clicked()', self.onReloadAndTest) reloadCollapsibleButton.collapsed = True #--------------------------------------------------------- # # Compute Radiomics area # self.computeRadiomicsCollapsibleButton = ctk.ctkCollapsibleButton() self.computeRadiomicsCollapsibleButton.text = "Slicer Radiomics Platform" self.layout.addWidget(self.computeRadiomicsCollapsibleButton) self.computeRadiomicsFormLayout = qt.QFormLayout( self.computeRadiomicsCollapsibleButton) # # Universal Advanced Settings Collapsible Button # self.AdvancedSettingsCollapsibleButton = ctk.ctkCollapsibleButton() self.AdvancedSettingsCollapsibleButton.text = "Advanced Settings" self.AdvancedSettingsCollapsibleButtonLayout = qt.QHBoxLayout() self.AdvancedSettingsCollapsibleButton.setLayout(qt.QHBoxLayout()) self.computeRadiomicsFormLayout.addWidget( self.AdvancedSettingsCollapsibleButton) self.AdvancedSettingsCollapsibleButton.collapsed = True self.AdvancedSettingsFrame = qt.QFrame( self.AdvancedSettingsCollapsibleButton) self.AdvancedSettingsFrameLayout = qt.QFormLayout() self.AdvancedSettingsFrame.setLayout(self.AdvancedSettingsFrameLayout) self.AdvancedSettingsCollapsibleButton.layout().addWidget( self.AdvancedSettingsFrame) # Label Values self.inputLabelValues = qt.QLabel("Label Values:", self.AdvancedSettingsFrame) self.inputLabelValuesField = qt.QLineEdit("1", self.AdvancedSettingsFrame) self.AdvancedSettingsFrameLayout.addRow(self.inputLabelValues, self.inputLabelValuesField) # Interpolation Settings self.settingsRadioButtonFrame = qt.QFrame(self.AdvancedSettingsFrame) self.settingsRadioButtonFrame.setLayout(qt.QHBoxLayout()) self.interpolationsGroup = qt.QButtonGroup( self.settingsRadioButtonFrame) self.ipRawButton = qt.QRadioButton("Raw") self.ip1x1x1Button = qt.QRadioButton("(1,1,1)") self.ip2x2x2Button = qt.QRadioButton("(2,2,2)") self.ip3x3x3Button = qt.QRadioButton("(3,3,3)") self.ipRawButton.checked = True self.interpolationsGroup.addButton(self.ipRawButton) self.interpolationsGroup.addButton(self.ip1x1x1Button) self.interpolationsGroup.addButton(self.ip2x2x2Button) self.interpolationsGroup.addButton(self.ip3x3x3Button) self.settingsRadioButtonFrame.layout().addWidget(self.ipRawButton) self.settingsRadioButtonFrame.layout().addWidget(self.ip1x1x1Button) self.settingsRadioButtonFrame.layout().addWidget(self.ip2x2x2Button) self.settingsRadioButtonFrame.layout().addWidget(self.ip3x3x3Button) self.interpHeader = qt.QLabel("Interpolation:") self.AdvancedSettingsFrameLayout.addRow(self.interpHeader, self.settingsRadioButtonFrame) # Bin Width self.inputBinWidth = qt.QLabel("Bin Width:", self.AdvancedSettingsFrame) self.inputBinWidthField = qt.QLineEdit("25", self.AdvancedSettingsFrame) self.AdvancedSettingsFrameLayout.addRow(self.inputBinWidth, self.inputBinWidthField) # Modality Radio Buttons Frame self.ModalityRadioButtonFrame = qt.QFrame(self.AdvancedSettingsFrame) self.ModalityRadioButtonFrame.setLayout(qt.QHBoxLayout()) self.ModalityFileFormatGroup = qt.QButtonGroup( self.ModalityRadioButtonFrame) self.CTButton = qt.QRadioButton("CT") self.CTButton.checked = True self.MRIButton = qt.QRadioButton("MRI") self.PETButton = qt.QRadioButton("PET") self.ModalityFileFormatGroup.addButton(self.CTButton) self.ModalityFileFormatGroup.addButton(self.MRIButton) self.ModalityFileFormatGroup.addButton(self.PETButton) self.ModalityRadioButtonFrame.layout().addWidget(self.CTButton) self.ModalityRadioButtonFrame.layout().addWidget(self.MRIButton) self.ModalityRadioButtonFrame.layout().addWidget(self.PETButton) self.ModalityInputLabel = qt.QLabel("Image Modality:", self.AdvancedSettingsFrame) self.AdvancedSettingsFrameLayout.addRow(self.ModalityInputLabel, self.ModalityRadioButtonFrame) # # End Universal Advanced Settings Collapsible Button # # Parent Tab Widget self.computeRadiomicsTabWidget = qt.QTabWidget() self.computeRadiomicsFormLayout.addWidget( self.computeRadiomicsTabWidget) # Radiomics Current Mode self.tabComputeRadiomicsCurr = qt.QWidget() self.singleCaseInputFormLayout = qt.QFormLayout() self.tabComputeRadiomicsCurr.setLayout(self.singleCaseInputFormLayout) self.tabComputeRadiomicsCurrName = "Single Case Mode" self.computeRadiomicsTabWidget.addTab(self.tabComputeRadiomicsCurr, self.tabComputeRadiomicsCurrName) # Input 1: Input Image self.input1Frame = qt.QFrame(self.tabComputeRadiomicsCurr) self.input1Frame.setLayout(qt.QHBoxLayout()) self.singleCaseInputFormLayout.addWidget(self.input1Frame) self.input1Selector = qt.QLabel("Input Image: ", self.input1Frame) self.input1Frame.layout().addWidget(self.input1Selector) self.input1Selector = slicer.qMRMLNodeComboBox(self.input1Frame) self.input1Selector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "") self.input1Selector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap", 0) self.input1Selector.addEnabled = False self.input1Selector.removeEnabled = False self.input1Selector.setMRMLScene(slicer.mrmlScene) self.input1Frame.layout().addWidget(self.input1Selector) # Input 2: Input Segmentation self.input2Frame = qt.QFrame(self.tabComputeRadiomicsCurr) self.input2Frame.setLayout(qt.QHBoxLayout()) self.singleCaseInputFormLayout.addWidget(self.input2Frame) self.input2Selector = qt.QLabel("Input Label: ", self.input2Frame) self.input2Frame.layout().addWidget(self.input2Selector) self.input2Selector = slicer.qMRMLNodeComboBox(self.input2Frame) self.input2Selector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "") self.input2Selector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap", 1) self.input2Selector.addEnabled = False self.input2Selector.removeEnabled = False self.input2Selector.setMRMLScene(slicer.mrmlScene) self.input2Frame.layout().addWidget(self.input2Selector) # Settings Collapsible Button self.SettingsCollapsibleButtonCurr = ctk.ctkCollapsibleButton() self.SettingsCollapsibleButtonCurr.text = "Settings" self.SettingsCollapsibleButtonCurrLayout = qt.QHBoxLayout() self.SettingsCollapsibleButtonCurr.setLayout( self.SettingsCollapsibleButtonCurrLayout) self.singleCaseInputFormLayout.addWidget( self.SettingsCollapsibleButtonCurr) self.SettingsCollapsibleButtonCurr.collapsed = False self.SettingsFrameCurr = qt.QFrame(self.SettingsCollapsibleButtonCurr) self.SettingsFrameCurr.setLayout(qt.QFormLayout()) self.SettingsCollapsibleButtonCurrLayout.addWidget( self.SettingsFrameCurr) # Settings self.para2curr = qt.QCheckBox("Use MatlabBridge", self.tabComputeRadiomicsCurr) self.para2curr.toolTip = "When checked: Matlab features extracted" self.para2curr.checked = False self.SettingsFrameCurr.layout().addRow(self.para2curr) # Apply Radiomics button self.RadiomicCurrButtonsFrame = qt.QFrame(self.tabComputeRadiomicsCurr) self.RadiomicCurrButtonsFrame.setLayout(qt.QHBoxLayout()) self.singleCaseInputFormLayout.addWidget(self.RadiomicCurrButtonsFrame) self.radiomicsCurrButton = qt.QPushButton( "Compute Radiomics Features (Single Case)", self.RadiomicCurrButtonsFrame) self.radiomicsCurrButton.enabled = True self.radiomicsCurrButton.toolTip = "Run the feature extraction for a single case." self.RadiomicCurrButtonsFrame.layout().addWidget( self.radiomicsCurrButton) # Chart self.RadiomicsTableFrame = qt.QFrame(self.tabComputeRadiomicsCurr) self.RadiomicsTableFrameLayout = qt.QHBoxLayout() self.RadiomicsTableFrame.setLayout(self.RadiomicsTableFrameLayout) self.singleCaseInputFormLayout.addWidget(self.RadiomicsTableFrame) self.RadiomicsTableView = qt.QTableView(self.RadiomicsTableFrame) self.RadiomicsTableView.sortingEnabled = True self.RadiomicsTableView.minimumHeight = 175 self.RadiomicsTableView.verticalHeader().visible = False self.RadiomicsTableView.setColumnWidth(0, 30) self.RadiomicsTableFrameLayout.addWidget(self.RadiomicsTableView) self.RadiomicsTableModel = qt.QStandardItemModel() # Save Table Button self.saveButton = qt.QPushButton("Save Table to CSV File", self.RadiomicCurrButtonsFrame) self.saveButton.toolTip = "Save Radiomics Feature from table to CSV file" self.saveButton.enabled = False self.singleCaseInputFormLayout.layout().addWidget(self.saveButton) """ # # The interface we use for batch mode (not part of this module) # #--------------------------------------------------------- # Radiomics Batch self.tabComputeRadiomicsBatch = qt.QWidget() self.RadiomicsFormLayout = qt.QFormLayout() self.tabComputeRadiomicsBatch.setLayout(self.RadiomicsFormLayout) self.tabComputeRadiomicsBatchName = "Batch Mode" self.computeRadiomicsTabWidget.addTab(self.tabComputeRadiomicsBatch, self.tabComputeRadiomicsBatchName) # Input 3: Database selection self.input3Frame = qt.QFrame(self.tabComputeRadiomicsBatch) self.input3Frame.setLayout(qt.QHBoxLayout()) self.RadiomicsFormLayout.addWidget(self.input3Frame) self.DatabaseButton = qt.QPushButton("Set Root Patient Directory") self.DatabaseButton.toolTip = "Set the main Patient Data location" self.DatabaseButton.enabled = True self.input3Frame.layout().addWidget(self.DatabaseButton) self.PatientSelector = qt.QComboBox() self.PatientSelector.enabled = False self.input3Frame.layout().addWidget(self.PatientSelector) # Settings Collapsible Button self.SettingsCollapsibleButton = ctk.ctkCollapsibleButton() self.SettingsCollapsibleButton.text = "Settings" self.SettingsCollapsibleButtonLayout = qt.QHBoxLayout() self.SettingsCollapsibleButton.setLayout(self.SettingsCollapsibleButtonLayout) self.RadiomicsFormLayout.addWidget(self.SettingsCollapsibleButton) self.SettingsCollapsibleButton.collapsed = False self.SettingsFrame = qt.QFrame(self.SettingsCollapsibleButton) self.SettingsFrame.setLayout(qt.QFormLayout()) self.SettingsCollapsibleButtonLayout.addWidget(self.SettingsFrame) # Settings self.para2 = qt.QCheckBox("Use MatlabBridge", self.SettingsFrame) self.para2.toolTip = "When checked: Matlab features extracted" self.para2.checked = True self.SettingsFrame.layout().addRow(self.para2) self.para3 = qt.QCheckBox("Clear Database", self.SettingsFrame) self.para3.toolTip = "When checked: old database is cleared" self.para3.checked = True self.SettingsFrame.layout().addRow(self.para3) # Keywords Collapsible Button self.KeywordsCollapsibleButton = ctk.ctkCollapsibleButton() self.KeywordsCollapsibleButton.text = "Keyword Matching" self.KeywordsCollapsibleButtonLayout = qt.QHBoxLayout() self.KeywordsCollapsibleButton.setLayout(self.KeywordsCollapsibleButtonLayout) self.SettingsFrame.layout().addRow(self.KeywordsCollapsibleButton) self.KeywordsCollapsibleButton.collapsed = True self.keywordsFrame = qt.QFrame(self.KeywordsCollapsibleButton) self.keywordsFrame.setLayout(qt.QFormLayout()) self.KeywordsCollapsibleButtonLayout.addWidget(self.keywordsFrame) self.keywordsHeader = qt.QLabel("Keyword Matching:", self.keywordsFrame) self.keywordsFrame.layout().addRow(self.keywordsHeader) # File Type Radio Buttons Frame self.radioButtonFrame = qt.QFrame(self.keywordsFrame) self.radioButtonFrame.setLayout(qt.QFormLayout()) self.fileFormatGroup = qt.QButtonGroup(self.radioButtonFrame) self.nrrdButton = qt.QRadioButton("NRRD") self.nrrdButton.checked = True self.niftiButton = qt.QRadioButton("NIFTI") self.fileFormatGroup.addButton(self.nrrdButton) self.fileFormatGroup.addButton(self.niftiButton) self.radioButtonFrame.layout().addRow(self.nrrdButton, self.niftiButton) self.inputMaskHeader = qt.QLabel("Input Image File Type:", self.keywordsFrame) self.keywordsFrame.layout().addRow(self.inputMaskHeader, self.radioButtonFrame) # Keywords Frame self.inputImageKeywords = qt.QLabel("Input Image Keywords:", self.keywordsFrame) self.inputImageKeywordsField = qt.QLineEdit("",self.keywordsFrame) self.keywordsFrame.layout().addRow(self.inputImageKeywords, self.inputImageKeywordsField ) self.inputImageExclusionKeywords = qt.QLabel("Input Image Exclusion Keywords:", self.keywordsFrame) self.inputImageExclusionKeywordsField = qt.QLineEdit("",self.keywordsFrame) self.keywordsFrame.layout().addRow(self.inputImageExclusionKeywords, self.inputImageExclusionKeywordsField ) self.inputLabelKeywords = qt.QLabel("Input Label Keywords:", self.keywordsFrame) self.inputLabelKeywordsField = qt.QLineEdit("",self.keywordsFrame) self.keywordsFrame.layout().addRow(self.inputLabelKeywords, self.inputLabelKeywordsField ) self.inputLabelExclusionKeywords = qt.QLabel("Input Label Exclusion Keywords:", self.keywordsFrame) self.inputLabelExclusionKeywordsField = qt.QLineEdit("",self.keywordsFrame) self.keywordsFrame.layout().addRow(self.inputLabelExclusionKeywords, self.inputLabelExclusionKeywordsField ) # Radiomic Mode Buttons self.RadiomicButtonsFrame = qt.QFrame(self.tabComputeRadiomicsBatch) self.RadiomicButtonsFrame.setLayout(qt.QHBoxLayout()) self.RadiomicsFormLayout.addWidget(self.RadiomicButtonsFrame) self.radiomicsBatchButton = qt.QPushButton("Compute Radiomics Features (Batch Mode)") self.radiomicsBatchButton.toolTip = "Run the feature extraction for database batch." self.radiomicsBatchButton.enabled = True self.RadiomicButtonsFrame.layout().addWidget(self.radiomicsBatchButton) self.RadiomicButtonsFrame.enabled = True """ #--------------------------------------------------------- # Connections #self.DatabaseButton.connect('clicked(bool)', self.onDatabaseButton) self.radiomicsCurrButton.connect('clicked(bool)', self.onRadiomicsCurr) #self.radiomicsBatchButton.connect('clicked(bool)', self.onRadiomicsBatch) self.saveButton.connect('clicked()', self.onSave) self.layout.addStretch(1) # Add vertical spacer