def createRegFrame(self): # # Parameters Area # regCollapsibleButton = ctk.ctkCollapsibleButton() regCollapsibleButton.text = "Group Registration" self.layout.addWidget(regCollapsibleButton) # Layout within the dummy collapsible button regFormLayout = qt.QFormLayout(regCollapsibleButton) # # target volume selector # self.regTargetSelector = slicer.qMRMLNodeComboBox() self.regTargetSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" ) self.regTargetSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", 0 ) self.set_selector_options(self.regTargetSelector) self.regTargetSelector.setToolTip( "Pick the input to the algorithm." ) regFormLayout.addRow("Target Volume: ", self.regTargetSelector) # # moving volume selector # self.regVolumesSelector = slicer.qMRMLCheckableNodeComboBox() self.regVolumesSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" ) self.regVolumesSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", 0 ) self.set_selector_options(self.regVolumesSelector) self.regVolumesSelector.setToolTip( "Pick the input to the algorithm." ) regFormLayout.addRow("Moving Volumes: ", self.regVolumesSelector) # # Apply Button # self.registerButton = qt.QPushButton("Register") self.registerButton.toolTip = "Register Images" self.registerButton.enabled = False regFormLayout.addRow(self.registerButton) # Connections before scene self.registerButton.connect('clicked(bool)', self.onRegisterButton) self.regTargetSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onTargetSelected) # Set MRML scenes self.regVolumesSelector.setMRMLScene( slicer.mrmlScene ) self.regTargetSelector.setMRMLScene( slicer.mrmlScene )
def setup(self): # Instantiate and connect widgets ... # Status text statusCollapsibleButton = ctk.ctkCollapsibleButton() statusCollapsibleButton.text = "Status" self.layout.addWidget(statusCollapsibleButton) self.statusFormLayout = qt.QFormLayout(statusCollapsibleButton) self.overallStatus = qt.QLabel() self.overallStatus.text = "Idle" self.statusFormLayout.addRow("New Process:", self.overallStatus) self.processes = list() # # Volumes # self.inputImagesCollapsibleButton = ctk.ctkCollapsibleButton() self.inputImagesCollapsibleButton.text = "Input Images" self.layout.addWidget(self.inputImagesCollapsibleButton) # Layout within the collapsible button inputImagesFormLayout = qt.QFormLayout(self.inputImagesCollapsibleButton) # input volume selector self.fixedVolumeSelector = slicer.qMRMLNodeComboBox() self.fixedVolumeSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "") self.fixedVolumeSelector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap", 0) self.fixedVolumeSelector.selectNodeUponCreation = True self.fixedVolumeSelector.addEnabled = True self.fixedVolumeSelector.removeEnabled = True self.fixedVolumeSelector.noneEnabled = False self.fixedVolumeSelector.showHidden = False self.fixedVolumeSelector.showChildNodeTypes = False self.fixedVolumeSelector.setMRMLScene(slicer.mrmlScene) self.fixedVolumeSelector.setToolTip("Pick the fixed input to the algorithm.") inputImagesFormLayout.addRow("Fixed Image Volume: ", self.fixedVolumeSelector) # Moving volume selector self.movingVolumeSelector = slicer.qMRMLCheckableNodeComboBox() # self.movingVolumeSelector = slicer.qMRMLNodeComboBox() self.movingVolumeSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "") self.movingVolumeSelector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap", 0) self.movingVolumeSelector.selectNodeUponCreation = True self.movingVolumeSelector.addEnabled = True self.movingVolumeSelector.removeEnabled = True self.movingVolumeSelector.noneEnabled = False self.movingVolumeSelector.showHidden = False self.movingVolumeSelector.showChildNodeTypes = False self.movingVolumeSelector.setMRMLScene(slicer.mrmlScene) self.movingVolumeSelector.setToolTip("Pick the moving volume to the algorithm.") inputImagesFormLayout.addRow("Moving Volume: ", self.movingVolumeSelector) # # Crop parameters # self.cropParametersCollapsibleButton = ctk.ctkCollapsibleButton() self.cropParametersCollapsibleButton.text = "Crop Parameters" self.layout.addWidget(self.cropParametersCollapsibleButton) cropParametersFormLayout = qt.QFormLayout(self.cropParametersCollapsibleButton) cropParametersFormLayout # Input ROI self.annotationROISelector = slicer.qMRMLNodeComboBox() self.annotationROISelector.nodeTypes = (("vtkMRMLAnnotationROINode"), "") self.annotationROISelector.editEnabled = True self.annotationROISelector.renameEnabled = True self.annotationROISelector.setMRMLScene(slicer.mrmlScene) self.annotationROISelector.setToolTip("Pick the fixed input to the algorithm.") cropParametersFormLayout.addRow("Input ROI: ", self.annotationROISelector) # ROI Visibility self.ROIVisibilityButton = qt.QToolButton() visibilityIcon = qt.QIcon() visibilityIcon.addPixmap(qt.QPixmap(":/Icons/VisibleOff.png"), qt.QIcon().Normal, qt.QIcon().Off) visibilityIcon.addPixmap(qt.QPixmap(":/Icons/VisibleOn.png"), qt.QIcon().Normal, qt.QIcon().On) self.ROIVisibilityButton.setIcon(visibilityIcon) self.ROIVisibilityButton.setCheckable(True) cropParametersFormLayout.addRow("Visibility ROI:", self.ROIVisibilityButton) # Cropping technique croppingTechniqueLayout = qt.QHBoxLayout() self.interpolationButton = qt.QRadioButton("Interpolated cropping") self.interpolationButton.setChecked(True) self.voxelBasedButton = qt.QRadioButton("Voxel based cropping") croppingTechniqueLayout.addWidget(self.interpolationButton) croppingTechniqueLayout.addWidget(self.voxelBasedButton) cropParametersFormLayout.addRow("Technique: ", croppingTechniqueLayout) # Interpolation options self.interpolationOptionsCollapsibleGroupBox = ctk.ctkCollapsibleGroupBox() self.interpolationOptionsCollapsibleGroupBox.title = "Interpolation options" cropParametersFormLayout.addRow("", self.interpolationOptionsCollapsibleGroupBox) interpolationOptionsLayout = qt.QFormLayout(self.interpolationOptionsCollapsibleGroupBox) interpolationOptionsLayout.setFieldGrowthPolicy(qt.QFormLayout().ExpandingFieldsGrow) interpolationOptionsLayout.setRowWrapPolicy(qt.QFormLayout().WrapLongRows) # Isotropic self.isotropicCheckBox = qt.QCheckBox() self.isotropicCheckBox.checked = True interpolationOptionsLayout.addRow("Isotropic output voxel", self.isotropicCheckBox) # Input spacing scaling constant self.inputSpacingScaling = qt.QDoubleSpinBox() self.inputSpacingScaling.setToolTip( "In not equal to 1, this will result in upsampling (<1) or downlsampling (>1) relative to the voxel spacing of the input volume." ) self.inputSpacingScaling.value = 1.000000 interpolationOptionsLayout.addRow("Input spacing scaling constant: ", self.inputSpacingScaling) # Interpolator technique interpolatorWidget = qt.QWidget() sizep = qt.QSizePolicy() sizep.setHorizontalPolicy(qt.QSizePolicy().Expanding) sizep.setVerticalPolicy(qt.QSizePolicy().Preferred) sizep.setHorizontalStretch(0) sizep.setVerticalStretch(0) interpolatorWidget.setSizePolicy(sizep) interpolatorLayout = qt.QGridLayout(interpolatorWidget) interpolationOptionsLayout.addRow("Technique: ", interpolatorWidget) self.iNNButton = qt.QRadioButton("Nearest Neighbor") self.iLinearButton = qt.QRadioButton("Linear") self.iWindowedSincButton = qt.QRadioButton("WindowedSinc") self.iBSplineButton = qt.QRadioButton("B-spline") self.iNNButton.setSizePolicy(qt.QSizePolicy().Minimum, qt.QSizePolicy().Preferred) self.iLinearButton.setSizePolicy(qt.QSizePolicy().MinimumExpanding, qt.QSizePolicy().Preferred) self.iWindowedSincButton.setSizePolicy(qt.QSizePolicy().Minimum, qt.QSizePolicy().Preferred) self.iBSplineButton.setSizePolicy(qt.QSizePolicy().MinimumExpanding, qt.QSizePolicy().Preferred) self.iLinearButton.setChecked(True) interpolatorLayout.addWidget(self.iNNButton, 0, 0) interpolatorLayout.addWidget(self.iLinearButton, 0, 1) interpolatorLayout.addWidget(self.iWindowedSincButton, 1, 0) interpolatorLayout.addWidget(self.iBSplineButton, 1, 1) # # Crop Button # self.cropButton = qt.QPushButton("Crop") self.cropButton.toolTip = "Crop the fixed volume." self.cropButton.enabled = False self.layout.addWidget(self.cropButton) # Align and crop self.alignAndCropButton = qt.QPushButton("Align and Crop") self.alignAndCropButton.toolTip = "Align moving volumes with fixed volume and crop all the images" self.alignAndCropButton.enabled = False self.layout.addWidget(self.alignAndCropButton) self.layout.addStretch(1) self.cropParametersNode = slicer.modulemrml.vtkMRMLCropVolumeParametersNode() self.onFixedVolumeSelect() self.onMovingVolumeSelect() self.onAnnotationROIChanged() self.onROIVisibilityChanged() # connections self.cropButton.connect("clicked(bool)", self.onCrop) self.alignAndCropButton.connect("clicked(bool)", self.onAlignAndCrop) self.fixedVolumeSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onFixedVolumeSelect) self.movingVolumeSelector.connect("checkedNodesChanged(void)", self.onMovingVolumeSelect) self.annotationROISelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onAnnotationROIChanged) self.ROIVisibilityButton.connect("toggled(bool)", self.onROIVisibilityChanged) self.voxelBasedButton.connect("clicked(bool)", self.onVoxelBasedButtonClicked) self.interpolationButton.connect("clicked(bool)", self.onInterpolationButtonClicked) # Display current fixed node self.displayFixedVolume() self.updateCropParameters() self.outputNodes = dict() self.nreg_completed = 0
def setup(self): ScriptedLoadableModuleWidget.setup(self) # ------------------------------------------------------------------------------------- self.modelList = list() self.fieldList = list() self.ROIList = list() self.ROIDict = dict() # Key = Name of ROI # Value = Dictionary of Fields (key = Name of Field # Value = dictionary of shapes # key = name of shapes # value = Statistics store() self.logic = MeshStatisticsLogic() # ------------------------------------------------------------------------------------ # SHAPES INPUT # ------------------------------------------------------------------------------------ self.inputComboBox = slicer.qMRMLCheckableNodeComboBox() self.inputComboBox.nodeTypes = ['vtkMRMLModelNode'] self.inputComboBox.setMRMLScene(slicer.mrmlScene) inputLayout = qt.QFormLayout() inputLayout.addRow(' Models: ', self.inputComboBox) self.layout.addLayout(inputLayout) self.inputComboBox.connect('checkedNodesChanged()', self.onInputComboBoxCheckedNodesChanged) # ------------------------------------------------------------------------------------ # ROI TABLE # ------------------------------------------------------------------------------------ self.ROIComboBox = ctk.ctkComboBox() self.ROIComboBox.adjustSize() self.ROICheckBox = qt.QCheckBox('All') ROILayout = qt.QHBoxLayout() ROILayout_0 = qt.QFormLayout() ROILayout_0.addRow(' Region considered: ', self.ROIComboBox) ROILayout.addLayout(ROILayout_0) ROILayout.addWidget(self.ROICheckBox) self.layout.addLayout(ROILayout) self.ROICheckBox.connect('stateChanged(int)', self.onROICheckBoxStateChanged) # ------------------------------------------------------------------------------------ # FIELD TABLE # ------------------------------------------------------------------------------------ self.tableField = qt.QTableWidget() self.tableField.setColumnCount(2) self.tableField.setMinimumHeight(250) self.tableField.setHorizontalHeaderLabels([' ', ' Field Name ']) self.tableField.setColumnWidth(0, 20) self.tableField.setColumnWidth(1, 260) self.tableField.setSizePolicy(qt.QSizePolicy().Expanding, qt.QSizePolicy().Expanding) label = qt.QLabel(' Select a Field to compute statistics on:') self.fieldLayout = qt.QVBoxLayout() self.fieldLayout.addWidget(label) self.fieldLayout.addWidget(self.tableField) self.layout.addLayout(self.fieldLayout) # ------------------------------------------------------------------------------------ # RUN # ------------------------------------------------------------------------------------ self.runButton = qt.QPushButton(' Run ') self.runButton.enabled = False roiLayout = qt.QHBoxLayout() roiLayout.addWidget(self.runButton) self.layout.addLayout(roiLayout) self.runButton.connect('clicked()', self.onRunButton) # ------------------------------------------------------------------------------------ # Statistics Table - Export # ------------------------------------------------------------------------------------ self.tabROI = qt.QTabWidget() self.tabROI.setTabPosition(0) self.tabROI.adjustSize() # ---------------------------- Directory - Export Button ----------------------------- self.directoryExport = ctk.ctkDirectoryButton() self.exportCheckBox = qt.QCheckBox('Separate Files') self.exportCheckBox.setChecked(True) self.exportButton = qt.QPushButton(' Export ') self.exportButton.enabled = True self.exportPointValueCheckBox = qt.QCheckBox('Export Value on Each Point') self.exportLayout = qt.QVBoxLayout() self.directoryAndExportLayout = qt.QHBoxLayout() self.directoryAndExportLayout.addWidget(self.directoryExport) self.directoryAndExportLayout.addWidget(self.exportCheckBox) self.directoryAndExportLayout.addWidget(self.exportPointValueCheckBox) self.exportButtonsLayout = qt.QHBoxLayout() self.exportButtonsLayout.addWidget(self.exportButton) self.exportLayout.addLayout(self.directoryAndExportLayout) self.exportLayout.addLayout(self.exportButtonsLayout) self.layout.addStretch(1) self.logic.updateInterface(self.tableField, self.ROIComboBox, self.ROIList, self.modelList, self.layout) # ------------------------------------------------------------------------------------ # OBSERVERS # ------------------------------------------------------------------------------------ def onCloseScene(obj, event): # initialize Parameters globals()['MeshStatistics'] = slicer.util.reloadScriptedModule('MeshStatistics') slicer.mrmlScene.AddObserver(slicer.mrmlScene.EndCloseEvent, onCloseScene)
def createMaskFrame(self): # # Parameters Area # parametersCollapsibleButton = ctk.ctkCollapsibleButton() parametersCollapsibleButton.text = "Parameters" self.layout.addWidget(parametersCollapsibleButton) # Layout within the dummy collapsible button parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton) # # input volume selector # self.nodeSelector = slicer.qMRMLCheckableNodeComboBox() self.nodeSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" ) self.nodeSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", 0 ) self.set_selector_options(self.nodeSelector) self.nodeSelector.setMRMLScene( slicer.mrmlScene ) self.nodeSelector.setToolTip( "Pick the input to the algorithm." ) parametersFormLayout.addRow("Input Volumes: ", self.nodeSelector) # # annotation ROI selector # self.roiSelector = slicer.qMRMLNodeComboBox() self.roiSelector.nodeTypes = ( ("vtkMRMLAnnotationROINode"), "" ) #self.roiSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", 0 ) self.set_selector_options(self.roiSelector) self.roiSelector.setMRMLScene( slicer.mrmlScene ) self.roiSelector.setToolTip( "Pick the ROI for the masking." ) parametersFormLayout.addRow("Mask ROI: ", self.roiSelector) # # check box to trigger taking screen shots for later use in tutorials # self.inPlaceCheckBox = qt.QCheckBox() self.inPlaceCheckBox.checked = 0 self.inPlaceCheckBox.setToolTip("If checked, will operate in-place.") # TODO: make option to duplicate nodes parametersFormLayout.addRow("Mask in-place", self.inPlaceCheckBox) # # Apply Button # self.applyButton = qt.QPushButton("Apply") self.applyButton.toolTip = "Run the algorithm." self.applyButton.enabled = False parametersFormLayout.addRow(self.applyButton) # connections self.applyButton.connect('clicked(bool)', self.onApplyButton) self.nodeSelector.connect("checkedNodesChanged()", self.onSelect) # # Helper Area # helperCollapsibleButton = ctk.ctkCollapsibleButton() helperCollapsibleButton.text = "Utilities" self.layout.addWidget(helperCollapsibleButton) # Layout within the dummy collapsible button helperFormLayout = qt.QFormLayout(helperCollapsibleButton) # # Clear Unmasked Images Button # self.clearImagesButton = qt.QPushButton("Remove Unmasked Images From Scene") self.clearImagesButton.toolTip = "Remove unmasked from scene." helperFormLayout.addRow(self.clearImagesButton) self.clearImagesButton.connect('clicked(bool)', self.onClearUnmaskedButton) # # Clear Masked Images Button # self.clearImagesButton = qt.QPushButton("Remove Masked Images From Scene") self.clearImagesButton.toolTip = "Remove masked from scene." helperFormLayout.addRow(self.clearImagesButton) self.clearImagesButton.connect('clicked(bool)', self.onClearMaskedButton)