Ejemplo n.º 1
0
  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 )
Ejemplo n.º 2
0
    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)
Ejemplo n.º 4
0
  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)