Exemple #1
0
  def create(self):
    super(WandEffectOptions,self).create()

    self.toleranceFrame = qt.QFrame(self.frame)
    self.toleranceFrame.setLayout(qt.QHBoxLayout())
    self.frame.layout().addWidget(self.toleranceFrame)
    self.widgets.append(self.toleranceFrame)
    self.toleranceLabel = qt.QLabel("Tolerance:", self.toleranceFrame)
    self.toleranceLabel.setToolTip("Set the tolerance of the wand in terms of background pixel values")
    self.toleranceFrame.layout().addWidget(self.toleranceLabel)
    self.widgets.append(self.toleranceLabel)
    self.toleranceSpinBox = qt.QDoubleSpinBox(self.toleranceFrame)
    self.toleranceSpinBox.setToolTip("Set the tolerance of the wand in terms of background pixel values")
    self.toleranceSpinBox.minimum = 0
    self.toleranceSpinBox.maximum = 1000
    self.toleranceSpinBox.suffix = ""
    self.toleranceFrame.layout().addWidget(self.toleranceSpinBox)
    self.widgets.append(self.toleranceSpinBox)

    self.maxPixelsFrame = qt.QFrame(self.frame)
    self.maxPixelsFrame.setLayout(qt.QHBoxLayout())
    self.frame.layout().addWidget(self.maxPixelsFrame)
    self.widgets.append(self.maxPixelsFrame)
    self.maxPixelsLabel = qt.QLabel("Max Pixels per click:", self.maxPixelsFrame)
    self.maxPixelsLabel.setToolTip("Set the maxPixels for each click")
    self.maxPixelsFrame.layout().addWidget(self.maxPixelsLabel)
    self.widgets.append(self.maxPixelsLabel)
    self.maxPixelsSpinBox = qt.QDoubleSpinBox(self.maxPixelsFrame)
    self.maxPixelsSpinBox.setToolTip("Set the maxPixels for each click")
    self.maxPixelsSpinBox.minimum = 1
    self.maxPixelsSpinBox.maximum = 100000
    self.maxPixelsSpinBox.suffix = ""
    self.maxPixelsFrame.layout().addWidget(self.maxPixelsSpinBox)
    self.widgets.append(self.maxPixelsSpinBox)

    HelpButton(self.frame, "Use this tool to label all voxels that are within a tolerance of where you click")

    # don't connect the signals and slots directly - instead, add these
    # to the list of connections so that gui callbacks can be cleanly 
    # disabled while the gui is being updated.  This allows several gui
    # elements to be interlinked with signal/slots but still get updated
    # as a unit to the new value of the mrml node.
    self.connections.append( 
        (self.toleranceSpinBox, 'valueChanged(double)', self.onToleranceSpinBoxChanged) )
    self.connections.append( 
        (self.maxPixelsSpinBox, 'valueChanged(double)', self.onMaxPixelsSpinBoxChanged) )

    # Add vertical spacer
    self.frame.layout().addStretch(1)
    def setup(self):

        frame = qt.QFrame()
        layout = qt.QFormLayout()
        frame.setLayout(layout)
        self.parent.layout().addWidget(frame)

        # Dose Volume selector
        self.referenceDoseVolumeSelectorLabel = qt.QLabel()
        self.referenceDoseVolumeSelectorLabel.setText(
            "Reference Dose Volume : ")
        self.referenceDoseVolumeSelector = slicer.qMRMLNodeComboBox()
        self.referenceDoseVolumeSelector.nodeTypes = (
            "vtkMRMLScalarVolumeNode", "")
        self.referenceDoseVolumeSelector.noneEnabled = False
        self.referenceDoseVolumeSelector.addEnabled = False
        self.referenceDoseVolumeSelector.removeEnabled = False
        self.referenceDoseVolumeSelector.selectNodeUponCreation = True
        self.referenceDoseVolumeSelector.setMRMLScene(slicer.mrmlScene)
        self.referenceDoseVolumeSelector.setToolTip(
            "Set the reference dose volume")
        layout.addRow(self.referenceDoseVolumeSelectorLabel,
                      self.referenceDoseVolumeSelector)

        # Dose Volume selector
        self.secondaryDoseVolumeSelectorLabel = qt.QLabel()
        self.secondaryDoseVolumeSelectorLabel.setText(
            "Secondary Dose Volume: ")
        self.secondaryDoseVolumeSelector = slicer.qMRMLNodeComboBox()
        self.secondaryDoseVolumeSelector.nodeTypes = (
            "vtkMRMLScalarVolumeNode", "")
        self.secondaryDoseVolumeSelector.noneEnabled = False
        self.secondaryDoseVolumeSelector.addEnabled = False
        self.secondaryDoseVolumeSelector.removeEnabled = False
        self.secondaryDoseVolumeSelector.selectNodeUponCreation = True
        self.secondaryDoseVolumeSelector.setMRMLScene(slicer.mrmlScene)
        self.secondaryDoseVolumeSelector.setToolTip(
            "Set the secondary dose volume")
        layout.addRow(self.secondaryDoseVolumeSelectorLabel,
                      self.secondaryDoseVolumeSelector)

        # kernel SD value editor
        self.volumeSimilarityValueLabel = qt.QLabel('Similarity value:')
        self.volumeSimilarityValueEdit = qt.QDoubleSpinBox()
        self.volumeSimilarityValueEdit.value = 0
        layout.addRow(self.volumeSimilarityValueLabel,
                      self.volumeSimilarityValueEdit)

        # Apply button
        self.applyButton = qt.QPushButton("Apply")
        self.applyButton.toolTip = "Compare Dose"
        layout.addWidget(self.applyButton)
        self.UpdateApplyButtonState()

        # connections
        self.applyButton.connect('clicked()', self.onApply)
        self.referenceDoseVolumeSelector.connect(
            'currentNodeChanged(vtkMRMLNode*)', self.onDoseVolumeSelect)
        self.secondaryDoseVolumeSelector.connect(
            'currentNodeChanged(vtkMRMLNode*)', self.onDoseVolumeSelect)
Exemple #3
0
    def setup(self):
        # Instantiate and connect widgets ...

        #PARCHEE"
        w = qt.QWidget()
        layout = qt.QGridLayout()
        w.setLayout(layout)
        self.layout.addWidget(w)
        w.show()
        self.layout = layout

        # INPUT MENU
        self.inputFrame = ctk.ctkCollapsibleButton()
        self.inputFrame.text = "Input"
        self.inputFrame.collapsed = 0
        inputFrameLayout = qt.QFormLayout(self.inputFrame)
        self.layout.addWidget(self.inputFrame)

        #Descubriendo que seria esto#
        self.__mvNode = None

        #Entrada multivolume
        label = qt.QLabel('Input multivolume')
        self.mvSelector = slicer.qMRMLNodeComboBox()
        self.mvSelector.nodeTypes = ['vtkMRMLMultiVolumeNode']
        self.mvSelector.setMRMLScene(slicer.mrmlScene)
        self.mvSelector.addEnabled = 0
        self.mvSelector.noneEnabled = 1
        inputFrameLayout.addRow(label, self.mvSelector)

        #Entrada frame a mostrar
        label = qt.QLabel('Frame a mostrar')
        self.__veInitial = qt.QDoubleSpinBox()
        self.__veInitial.value = 0
        inputFrameLayout.addRow(label, self.__veInitial)

        ###PARTE HELLO WORLD## BUTTON DE ACTIVACION

        # Collapsible button
        sampleCollapsibleButton = ctk.ctkCollapsibleButton()
        sampleCollapsibleButton.text = "A collapsible button"
        self.layout.addWidget(sampleCollapsibleButton)

        # Layout within the sample collapsible button
        sampleFormLayout = qt.QFormLayout(sampleCollapsibleButton)
        helloWorldButton = qt.QPushButton("Hello World")
        helloWorldButton.toolTip = "Print 'Hello World' in standard output."
        sampleFormLayout.addWidget(helloWorldButton)
        helloWorldButton.connect('clicked(bool)',
                                 self.onHelloWorldButtonClicked)

        # Set local var as instance attribute
        self.helloWorldButton = helloWorldButton
Exemple #4
0
    def setup(self):
        # Point Distance
        controlCollapseButton = ctk.ctkCollapsibleButton()
        controlCollapseButton.text = "Control"
        self.layout.addWidget(controlCollapseButton)

        controlLayout = qt.QFormLayout(controlCollapseButton)

        self.nodeSelector = slicer.qMRMLNodeComboBox()
        self.nodeSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
        self.nodeSelector.selectNodeUponCreation = False
        self.nodeSelector.noneEnabled = False
        self.nodeSelector.addEnabled = False
        self.nodeSelector.showHidden = False
        self.nodeSelector.setMRMLScene(slicer.mrmlScene)
        self.nodeSelector.setToolTip("Pick Continuous Label Map")
        controlLayout.addRow("LabelMap Node:", self.nodeSelector)

        self.newNodeSelector = slicer.qMRMLNodeComboBox()
        self.newNodeSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
        self.newNodeSelector.selectNodeUponCreation = True
        self.newNodeSelector.noneEnabled = False
        self.newNodeSelector.addEnabled = True
        self.newNodeSelector.showHidden = False
        self.newNodeSelector.setMRMLScene(slicer.mrmlScene)
        self.newNodeSelector.setToolTip("Pick Node for Binned Label Map")
        controlLayout.addRow("New Node:", self.newNodeSelector)

        self.lowLabelSpinBox = qt.QSpinBox()
        self.lowLabelSpinBox.setSingleStep(1)
        self.lowLabelSpinBox.setValue(1)
        controlLayout.addRow("Label under threshold value:",
                             self.lowLabelSpinBox)

        self.thresholdSpinBox = qt.QDoubleSpinBox()
        self.thresholdSpinBox.setMaximum(1.0)
        self.thresholdSpinBox.setMinimum(-1.0)
        self.thresholdSpinBox.setDecimals(5)
        self.thresholdSpinBox.setSingleStep(0.0001)
        self.thresholdSpinBox.setValue(0.7)
        controlLayout.addRow("Threshold value:", self.thresholdSpinBox)

        self.highLabelSpinBox = qt.QSpinBox()
        self.highLabelSpinBox.setSingleStep(1)
        self.highLabelSpinBox.setValue(0)
        controlLayout.addRow("Label over threshold value:",
                             self.highLabelSpinBox)

        self.applyButton = qt.QPushButton("Apply")
        controlLayout.addRow(self.applyButton)
        self.applyButton.connect('clicked(bool)', self.onApply)
    def createDoubleWidget(self, name):

        w = qt.QDoubleSpinBox()
        self.widgets.append(w)

        w.setRange(-3.40282e+038, 3.40282e+038)
        w.decimals = 5

        w.setValue(self._getParameterValue(name))
        w.connect("valueChanged(double)",
                  lambda val, name=name: self.onScalarChanged(name, val))
        self.widgetConnections.append((w, "valueChanged(double)"))

        return w
Exemple #6
0
def numericInputFrame(parent, label, tooltip, minimum, maximum, step, decimals):
    inputFrame = qt.QFrame(parent)
    inputFrame.setLayout(qt.QHBoxLayout())
    inputLabel = qt.QLabel(label, inputFrame)
    inputLabel.setToolTip(tooltip)
    inputFrame.layout().addWidget(inputLabel)
    inputSpinBox = qt.QDoubleSpinBox(inputFrame)
    inputSpinBox.setToolTip(tooltip)
    inputSpinBox.minimum = minimum
    inputSpinBox.maximum = maximum
    inputSpinBox.singleStep = step
    inputSpinBox.decimals = decimals
    inputFrame.layout().addWidget(inputSpinBox)
    return inputFrame, inputSpinBox
    def createDoubleWidget(self, name):
        exec('default = self.filter.Get{0}()'.format(name)
             ) in globals(), locals()
        w = qt.QDoubleSpinBox()
        self.widgets.append(w)

        w.setRange(-3.40282e+038, 3.40282e+038)
        w.decimals = 5

        w.setValue(default)
        w.connect("valueChanged(double)",
                  lambda val, name=name: self.onScalarChanged(name, val))

        return w
Exemple #8
0
    def create(self):
        super(PaintEffectOptions, self).create()

        self.radiusFrame = qt.QFrame(self.frame)
        self.radiusFrame.setLayout(qt.QHBoxLayout())
        self.frame.layout().addWidget(self.radiusFrame)
        self.widgets.append(self.radiusFrame)
        self.radiusLabel = qt.QLabel("Radius:", self.radiusFrame)
        self.radiusLabel.setToolTip(
            "Set the radius of the paint brush in millimeters")
        self.radiusFrame.layout().addWidget(self.radiusLabel)
        self.widgets.append(self.radiusLabel)
        self.radiusSpinBox = qt.QDoubleSpinBox(self.radiusFrame)
        self.radiusSpinBox.setToolTip(
            "Set the radius of the paint brush in millimeters")
        self.radiusSpinBox.minimum = 0.01
        self.radiusSpinBox.maximum = 100
        self.radiusSpinBox.suffix = "mm"
        self.radiusFrame.layout().addWidget(self.radiusSpinBox)
        self.widgets.append(self.radiusSpinBox)

        self.radius = ctk.ctkDoubleSlider(self.frame)
        self.radius.minimum = 0.01
        self.radius.maximum = 100
        self.radius.orientation = 1
        self.radius.singleStep = 0.01
        self.frame.layout().addWidget(self.radius)
        self.widgets.append(self.radius)

        self.smudge = qt.QCheckBox("Smudge", self.frame)
        self.smudge.setToolTip(
            "Set the label number automatically by sampling the pixel location where the brush stroke starts."
        )
        self.frame.layout().addWidget(self.smudge)
        self.widgets.append(self.smudge)

        HelpButton(
            self.frame,
            "Use this tool to paint with a round brush of the selected radius")

        self.smudge.connect('clicked()', self.updateMRMLFromGUI)
        self.radius.connect('valueChanged(double)', self.onRadiusValueChanged)
        self.radiusSpinBox.connect('valueChanged(double)',
                                   self.onRadiusSpinBoxChanged)

        # Add vertical spacer
        self.frame.layout().addStretch(1)
Exemple #9
0
    def setup(self):
        controlCollapseButton = ctk.ctkCollapsibleButton()
        controlCollapseButton.text = "Control"
        self.layout.addWidget(controlCollapseButton)

        controlLayout = qt.QFormLayout(controlCollapseButton)

        self.nodeSelector = slicer.qMRMLNodeComboBox()
        self.nodeSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
        self.nodeSelector.selectNodeUponCreation = False
        self.nodeSelector.noneEnabled = False
        self.nodeSelector.addEnabled = False
        self.nodeSelector.showHidden = False
        self.nodeSelector.setMRMLScene(slicer.mrmlScene)
        self.nodeSelector.setToolTip("Pick Volume")
        controlLayout.addRow("Volume Node:", self.nodeSelector)

        self.marginBox = qt.QDoubleSpinBox()
        self.marginBox.setValue(3.5)
        controlLayout.addRow("Margin:", self.marginBox)

        self.labelmapSelector = slicer.qMRMLNodeComboBox()
        self.labelmapSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
        self.labelmapSelector.selectNodeUponCreation = False
        self.labelmapSelector.noneEnabled = False
        self.labelmapSelector.addEnabled = False
        self.labelmapSelector.showHidden = False
        self.labelmapSelector.setMRMLScene(slicer.mrmlScene)
        self.labelmapSelector.setToolTip("Pick Labelmap")
        controlLayout.addRow("Labelmap Node:", self.labelmapSelector)

        self.labelmapCheckBox = qt.QCheckBox()
        self.labelmapCheckBox.setChecked(True)
        controlLayout.addRow("Also mask labelmap? ", self.labelmapCheckBox)

        self.applyButton = qt.QPushButton("Apply")
        controlLayout.addRow(self.applyButton)
        self.applyButton.connect('clicked(bool)', self.onApply)
Exemple #10
0
    def setup(self):
        # reload button
        self.reloadButton = qt.QPushButton("Reload")
        self.reloadButton.toolTip = "Reload this module."
        self.reloadButton.name = "HeterogeneityCAD Reload"
        self.layout.addWidget(self.reloadButton)
        self.reloadButton.connect('clicked()', self.onReload)

        # Tumor Segmentation Collapsible Button
        self.TumorSegmentationCollapsibleButton = ctk.ctkCollapsibleButton()
        self.TumorSegmentationCollapsibleButton.text = "SegmentCAD Segmentation"
        self.layout.addWidget(self.TumorSegmentationCollapsibleButton)
        self.TumorSegmentationLayout = qt.QFormLayout(
            self.TumorSegmentationCollapsibleButton)

        # Select Volumes Collapsible Button
        self.selectionsCollapsibleButton = ctk.ctkCollapsibleButton()
        self.selectionsCollapsibleButton.text = "Select DCE-MRI Volumes for Segmentation"
        self.TumorSegmentationLayout.addWidget(
            self.selectionsCollapsibleButton)
        # Layout within the collapsible button
        self.volumesLayout = qt.QFormLayout(self.selectionsCollapsibleButton)

        # Use Multivolume Node as input
        self.enableMultiVolume = qt.QCheckBox(self.selectionsCollapsibleButton)
        self.enableMultiVolume.setText('Input Multi-Volume Node')
        self.enableMultiVolume.checked = True
        self.enableMultiVolume.setToolTip(
            'Use Multi-Volume Node, with volumes imported in the correct order'
        )
        self.inputSelectorMultiVolume = slicer.qMRMLNodeComboBox(
            self.selectionsCollapsibleButton)
        self.inputSelectorMultiVolume.nodeTypes = (("vtkMRMLMultiVolumeNode"),
                                                   "")
        self.inputSelectorMultiVolume.selectNodeUponCreation = False
        self.inputSelectorMultiVolume.renameEnabled = True
        self.inputSelectorMultiVolume.removeEnabled = False
        self.inputSelectorMultiVolume.noneEnabled = True
        self.inputSelectorMultiVolume.addEnabled = False
        self.inputSelectorMultiVolume.setMRMLScene(slicer.mrmlScene)
        self.inputSelectorMultiVolume.setToolTip(
            'Use Multi-Volume Node, with volumes imported in the correct order'
        )

        self.volumesLayout.addRow(self.enableMultiVolume,
                                  self.inputSelectorMultiVolume)

        self.nodeInputFrame = ctk.ctkCollapsibleGroupBox(
            self.selectionsCollapsibleButton)
        self.nodeInputFrame.title = "Input Scalar Volume Nodes"
        self.nodeInputFrame.collapsed = True
        self.nodeInputFrame.enabled = False
        self.nodeInputFrame.setLayout(qt.QFormLayout())
        self.volumesLayout.addRow(self.nodeInputFrame)

        # Select Pre Node
        self.inputPre = qt.QLabel("Pre-contrast Volume", self.nodeInputFrame)
        self.inputPre.setToolTip(
            'Select the initial pre-contrast volume node.')
        self.inputSelectorPre = slicer.qMRMLNodeComboBox(self.nodeInputFrame)
        self.inputSelectorPre.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.inputSelectorPre.selectNodeUponCreation = False
        self.inputSelectorPre.addEnabled = False
        self.inputSelectorPre.removeEnabled = False
        self.inputSelectorPre.noneEnabled = True
        self.inputSelectorPre.noneDisplay = 'Please Select Volume'
        self.inputSelectorPre.setMRMLScene(slicer.mrmlScene)
        self.inputSelectorPre.setToolTip(
            'Select the initial pre-contrast volume node.')
        #self.volumesLayout.addRow(self.inputPre, self.inputSelectorPre)
        self.nodeInputFrame.layout().addRow(self.inputPre,
                                            self.inputSelectorPre)

        # Select First Node
        self.inputFirst = qt.QLabel("First Post-contrast Volume",
                                    self.nodeInputFrame)
        self.inputFirst.setToolTip(
            'Select the first post-contrast volume node to calculate intitial enhancement and curve type.'
        )
        self.inputSelectorFirst = slicer.qMRMLNodeComboBox(self.nodeInputFrame)
        self.inputSelectorFirst.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.inputSelectorFirst.selectNodeUponCreation = False
        self.inputSelectorFirst.addEnabled = False
        self.inputSelectorFirst.removeEnabled = False
        self.inputSelectorFirst.noneEnabled = True
        self.inputSelectorFirst.noneDisplay = 'Please Select Volume'
        self.inputSelectorFirst.setMRMLScene(slicer.mrmlScene)
        self.inputSelectorFirst.setToolTip(
            'Select the first post-contrast volume node to calculate intitial enhancement and curve type.'
        )
        #self.volumesLayout.addRow(self.inputFirst, self.inputSelectorFirst)
        self.nodeInputFrame.layout().addRow(self.inputFirst,
                                            self.inputSelectorFirst)

        # Select Second Node
        self.inputSecond = qt.QLabel("Second Post-contrast Volume",
                                     self.nodeInputFrame)
        self.inputSecond.setToolTip(
            'Select a second post-contrast volume node (not required).')
        self.inputSelectorSecond = slicer.qMRMLNodeComboBox(
            self.nodeInputFrame)
        self.inputSelectorSecond.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.inputSelectorSecond.selectNodeUponCreation = False
        self.inputSelectorSecond.addEnabled = False
        self.inputSelectorSecond.removeEnabled = False
        self.inputSelectorSecond.noneEnabled = True
        self.inputSelectorSecond.noneDisplay = 'Please Select Volume'
        self.inputSelectorSecond.setMRMLScene(slicer.mrmlScene)
        self.inputSelectorSecond.setToolTip(
            'Select a second post-contrast volume node (not required).')
        #self.volumesLayout.addRow(self.inputSecond, self.inputSelectorSecond)
        self.nodeInputFrame.layout().addRow(self.inputSecond,
                                            self.inputSelectorSecond)

        # Select Third Node
        self.inputThird = qt.QLabel("Third Post-contrast Volume",
                                    self.nodeInputFrame)
        self.inputThird.setToolTip(
            'Select a third post-contrast volume node (not required).')
        self.inputSelectorThird = slicer.qMRMLNodeComboBox(self.nodeInputFrame)
        self.inputSelectorThird.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.inputSelectorThird.selectNodeUponCreation = False
        self.inputSelectorThird.addEnabled = False
        self.inputSelectorThird.removeEnabled = False
        self.inputSelectorThird.noneEnabled = True
        self.inputSelectorThird.noneDisplay = 'Please Select Volume'
        self.inputSelectorThird.setMRMLScene(slicer.mrmlScene)
        self.inputSelectorThird.setToolTip(
            'Select a third post-contrast volume node (not required).')
        #self.volumesLayout.addRow(self.inputThird, self.inputSelectorThird)
        self.nodeInputFrame.layout().addRow(self.inputThird,
                                            self.inputSelectorThird)

        # Select Fourth Node
        self.inputFourth = qt.QLabel("Fourth Post-contrast Volume",
                                     self.nodeInputFrame)
        self.inputFourth.setToolTip(
            'Select the fourth or final post-contrast volume node to calculate curve type based on the delayed curve slope.'
        )
        self.inputSelectorFourth = slicer.qMRMLNodeComboBox(
            self.nodeInputFrame)
        self.inputSelectorFourth.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.inputSelectorFourth.selectNodeUponCreation = False
        self.inputSelectorFourth.addEnabled = False
        self.inputSelectorFourth.removeEnabled = False
        self.inputSelectorFourth.noneEnabled = True
        self.inputSelectorFourth.noneDisplay = 'Please Select Volume'
        self.inputSelectorFourth.setMRMLScene(slicer.mrmlScene)
        self.inputSelectorFourth.setToolTip(
            'Select the fourth or final post-contrast volume node to calculate curve type based on the delayed curve slope.'
        )
        #self.volumesLayout.addRow(self.inputFourth, self.inputSelectorFourth)
        self.nodeInputFrame.layout().addRow(self.inputFourth,
                                            self.inputSelectorFourth)

        # Enable and Select Input Label Map as ROI
        self.enableLabel = qt.QCheckBox(self.selectionsCollapsibleButton)
        self.enableLabel.setText('Use Label Map as ROI')
        self.enableLabel.checked = True
        self.enableLabel.setToolTip(
            'Select and identify a custom label map node to define an ROI over the input volumes for faster segmentation.'
        )
        self.inputSelectorLabel = slicer.qMRMLNodeComboBox(
            self.selectionsCollapsibleButton)
        self.inputSelectorLabel.nodeTypes = (("vtkMRMLLabelMapVolumeNode"), "")
        self.inputSelectorLabel.selectNodeUponCreation = False
        self.inputSelectorLabel.renameEnabled = True
        self.inputSelectorLabel.removeEnabled = False
        self.inputSelectorLabel.noneEnabled = True
        self.inputSelectorLabel.addEnabled = False
        self.inputSelectorLabel.setMRMLScene(slicer.mrmlScene)
        self.inputSelectorLabel.setToolTip(
            'Select and identify a custom label map node to define an ROI over the input volumes for faster segmentation.'
        )
        self.volumesLayout.addRow(self.enableLabel, self.inputSelectorLabel)

        # Select output SegmentCAD Label collapsible button
        self.outlabelCollapsibleButton = ctk.ctkCollapsibleButton()
        self.outlabelCollapsibleButton.text = "Select or Create Output SegmentCAD Label Map"
        self.TumorSegmentationLayout.addWidget(self.outlabelCollapsibleButton)
        # Layout within the collapsible button
        self.outlabelLayout = qt.QFormLayout(self.outlabelCollapsibleButton)
        # Select or create output SegmentCAD Label Map
        self.outputLabel = qt.QLabel("Output SegmentCAD Label Map",
                                     self.outlabelCollapsibleButton)
        self.outputLabel.setToolTip(
            'Select or create a label map volume node as the SegmentCAD segmentation output.'
        )
        self.outputSelectorLabel = slicer.qMRMLNodeComboBox(
            self.outlabelCollapsibleButton)
        self.outputSelectorLabel.nodeTypes = (("vtkMRMLLabelMapVolumeNode"),
                                              "")
        self.outputSelectorLabel.baseName = "SegmentCAD Label Map"
        self.outputSelectorLabel.selectNodeUponCreation = True
        self.outputSelectorLabel.renameEnabled = True
        self.outputSelectorLabel.removeEnabled = True
        self.outputSelectorLabel.noneEnabled = False
        self.outputSelectorLabel.addEnabled = True
        self.outputSelectorLabel.setMRMLScene(slicer.mrmlScene)
        self.outputSelectorLabel.setToolTip(
            'Select or create a label map volume node as the SegmentCAD segmentation output.'
        )
        self.outlabelLayout.addRow(self.outputLabel, self.outputSelectorLabel)
        # SegmentCAD Label Map Legend
        self.outputLegend = qt.QLabel(
            "| Type I Persistent: Blue | Type II Plateau: Yellow | Type III Washout: Red |",
            self.outlabelCollapsibleButton)
        self.outputLegend.setToolTip(
            'SegmentCAD Label Map Legend  | Blue: Type I Persistent curve  |  Yellow: Type II Plateau curve  |  Red: Type III Washout curve  |'
        )
        self.outlabelLayout.addRow(self.outputLegend)
        # Enable Volume Rendering of the SegmentCAD label map
        self.enableVolumeRendering = qt.QCheckBox(
            self.selectionsCollapsibleButton)
        self.enableVolumeRendering.setText('Display Volume Rendering')
        self.enableVolumeRendering.checked = True
        self.enableVolumeRendering.setToolTip(
            'Display volume rendering of the SegmentCAD Label Map in the 3D View'
        )
        self.outlabelLayout.addRow(self.enableVolumeRendering)
        # Enable Label Statistics Table and Data
        self.enableStats = qt.QCheckBox(self.selectionsCollapsibleButton)
        self.enableStats.setText('Calculate SegmentCAD Label statistics')
        self.enableStats.checked = False
        self.enableStats.setToolTip(
            'Use logic from Label Statistics Module to calculate statistics for first post-contrast voxels within the SegmentCAD Label Map.'
        )
        self.outlabelLayout.addRow(self.enableStats)

        # Set Advanced Parameters Collapsible Button
        self.parametersCollapsibleButton = ctk.ctkCollapsibleButton()
        self.parametersCollapsibleButton.text = "Set Advanced Segmentation Parameters"
        self.TumorSegmentationLayout.addWidget(
            self.parametersCollapsibleButton)
        self.parametersCollapsibleButton.collapsed = True
        # Layout within the collapsible button
        self.parametersLayout = qt.QFormLayout(
            self.parametersCollapsibleButton)
        # Set Minimum Threshold of Percentage Increase to First Post-Contrast Image
        self.inputMinimumThreshold = qt.QLabel(
            "Minimum Threshold of Increase", self.parametersCollapsibleButton)
        self.inputMinimumThreshold.setToolTip(
            'Minimum Threshold of Percentage Increase (Pre- to First Post-contrast (Range: 10% to 150%)'
        )
        self.inputSelectorMinimumThreshold = qt.QDoubleSpinBox(
            self.parametersCollapsibleButton)
        self.inputSelectorMinimumThreshold.setSuffix("%")
        self.inputSelectorMinimumThreshold.singleStep = (1)
        self.inputSelectorMinimumThreshold.minimum = (10)
        self.inputSelectorMinimumThreshold.maximum = (150)
        self.inputSelectorMinimumThreshold.value = (75)
        self.inputSelectorMinimumThreshold.setToolTip(
            'Minimum Threshold of Percentage Increase (Pre- to First Post-contrast (Range: 10% to 150%)'
        )
        self.parametersLayout.addRow(self.inputMinimumThreshold,
                                     self.inputSelectorMinimumThreshold)
        # Curve 1 Type Parameters (Slopes from First to Fourth Post-Contrast Images)
        self.inputCurve1 = qt.QLabel("Type 1 (Persistent) Curve Minimum Slope",
                                     self.parametersCollapsibleButton)
        self.inputCurve1.setToolTip(
            'Minimum Slope of Delayed Curve to classify as Persistent (Range: 0.02 to 0.3)'
        )
        self.inputSelectorCurve1 = qt.QDoubleSpinBox(
            self.parametersCollapsibleButton)
        self.inputSelectorCurve1.singleStep = (0.02)
        self.inputSelectorCurve1.minimum = (0.02)
        self.inputSelectorCurve1.maximum = (0.3)
        self.inputSelectorCurve1.value = (0.20)
        self.inputSelectorCurve1.setToolTip(
            'Minimum Slope of Delayed Curve to classify as Persistent (Range: 0.02 to 0.3)'
        )
        self.parametersLayout.addRow(self.inputCurve1,
                                     self.inputSelectorCurve1)
        # Curve 3 Type Parameters (Slopes from First to Fourth Post-Contrast Images)
        self.inputCurve3 = qt.QLabel("Type 3 (Washout) Curve Maximum Slope",
                                     self.parametersCollapsibleButton)
        self.inputCurve3.setToolTip(
            'Maximum Slope of Delayed Curve to classify as Washout (Range: -0.02 to -0.3)'
        )
        self.inputSelectorCurve3 = qt.QDoubleSpinBox(
            self.parametersCollapsibleButton)
        self.inputSelectorCurve3.singleStep = (0.02)
        self.inputSelectorCurve3.setPrefix("-")
        self.inputSelectorCurve3.minimum = (0.02)
        self.inputSelectorCurve3.maximum = (0.30)
        self.inputSelectorCurve3.value = (0.20)
        self.inputSelectorCurve3.setToolTip(
            'Maximum Slope of Delayed Curve to classify as Washout (Range: -0.02 to -0.3)'
        )
        self.parametersLayout.addRow(self.inputCurve3,
                                     self.inputSelectorCurve3)
        # Apply Tumor Adaptive Segmentation button
        self.SegmentCADButton = qt.QPushButton("Apply SegmentCAD")
        self.SegmentCADButton.toolTip = "Apply SegmentCAD segmentation to selected volumes."
        self.TumorSegmentationLayout.addWidget(self.SegmentCADButton)

        # LabelStatistics Table Collapsible Button
        self.labelstatisticsCollapsibleButton = ctk.ctkCollapsibleButton()
        self.labelstatisticsCollapsibleButton.text = "SegmentCAD Label Statistics"
        self.layout.addWidget(self.labelstatisticsCollapsibleButton)
        self.labelstatisticsCollapsibleButton.collapsed = True
        # Layout within the collapsible button
        self.labelstatisticsLayout = qt.QFormLayout(
            self.labelstatisticsCollapsibleButton)
        # Table View to display Label statistics
        self.labelStatisticsTableView = qt.QTableView()
        self.labelStatisticsTableView.sortingEnabled = True
        self.labelstatisticsLayout.addWidget(self.labelStatisticsTableView)
        self.labelStatisticsTableView.minimumHeight = 200
        # Charting Statistics Button
        self.chartOptions = ("Volume", "Curve Type", "Voxel Count",
                             "Volume mm^3", "Volume cc", "Minimum Intensity",
                             "Maximum Intensity", "Mean Intensity",
                             "Standard Deviation")
        self.chartFrame = qt.QFrame()
        self.chartFrame.setLayout(qt.QHBoxLayout())
        self.labelstatisticsLayout.addWidget(self.chartFrame)
        self.chartButton = qt.QPushButton(
            "Chart Statistics", self.labelstatisticsCollapsibleButton)
        self.chartButton.toolTip = "Make a chart from the current statistics."
        self.chartFrame.layout().addWidget(self.chartButton)
        self.chartOption = qt.QComboBox(self.labelstatisticsCollapsibleButton)
        self.chartOption.addItems(self.chartOptions)
        self.chartFrame.layout().addWidget(self.chartOption)
        self.chartIgnoreZero = qt.QCheckBox(
            self.labelstatisticsCollapsibleButton)
        self.chartIgnoreZero.setText('Ignore Zero Label')
        self.chartIgnoreZero.checked = False
        self.chartIgnoreZero.setToolTip(
            'Do not include the zero index in the chart to avoid dwarfing other bars'
        )
        self.chartFrame.layout().addWidget(self.chartIgnoreZero)
        self.chartButton.enabled = False

        # Interactive Charting Settings Collapsible Button
        self.iChartingCollapsibleButton = ctk.ctkCollapsibleButton()
        self.iChartingCollapsibleButton.text = "Interactive Charting Settings"
        self.iChartingCollapsibleButton.collapsed = True
        self.layout.addWidget(self.iChartingCollapsibleButton)
        # Layout within the collapsible button
        self.iChartingLayout = qt.QFormLayout(self.iChartingCollapsibleButton)
        # iCharting toggle button
        self.iCharting = qt.QPushButton("Enable Interactive Charting")
        self.iCharting.checkable = True
        self.iCharting.setChecked(False)
        self.iCharting.enabled = False
        self.iCharting.toolTip = "Toggle the real-time charting of the %increase from baseline of the selected voxel from each input volume."
        self.iChartingLayout.addRow(self.iCharting)

        # Initialize slice observers (from DataProbe.py)
        # Keep list of pairs: [observee,tag] so they can be removed easily
        self.styleObserverTags = []
        # Keep a map of interactor styles to sliceWidgets so we can easily get sliceLogic
        self.sliceWidgetsPerStyle = {}
        self.refreshObservers()

        # Connections
        self.SegmentCADButton.connect('clicked()',
                                      self.onSegmentCADButtonClicked)
        self.enableLabel.connect('stateChanged(int)', self.onEnableLabel)
        self.enableMultiVolume.connect('stateChanged(int)',
                                       self.onEnableMultiVolume)
        self.chartButton.connect('clicked()', self.onChart)
        self.iCharting.connect('toggled(bool)',
                               self.onInteractiveChartingChanged)
Exemple #11
0
  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 createUserInterface(self):
        '''
    '''
        self.__layout = super(EMSegmentEditNodeBasedParametersStep,
                              self).createUserInterface()

        self.__top = qt.QWidget()
        self.__topLayout = qt.QHBoxLayout(self.__top)

        # the anatomical tree
        self.__anatomicalTreeGroupBox = qt.QGroupBox()
        self.__anatomicalTreeGroupBox.setTitle('Anatomical Tree')
        self.__topLayout.addWidget(self.__anatomicalTreeGroupBox)

        self.__anatomicalTreeGroupBoxLayout = qt.QFormLayout(
            self.__anatomicalTreeGroupBox)

        self.__anatomicalTree = slicer.modulewidget.qSlicerEMSegmentAnatomicalTreeWidget(
        )
        self.__anatomicalTree.structureNameEditable = False
        self.__anatomicalTree.labelColumnVisible = False
        self.__anatomicalTree.probabilityMapColumnVisible = False
        self.__anatomicalTree.classWeightColumnVisible = False
        self.__anatomicalTree.updateClassWeightColumnVisible = False
        self.__anatomicalTree.atlasWeightColumnVisible = False
        self.__anatomicalTree.alphaColumnVisible = False
        self.__anatomicalTree.displayAlphaCheckBoxVisible = False
        self.__anatomicalTree.connect('currentTreeNodeChanged(vtkMRMLNode*)',
                                      self.onTreeSelectionChanged)
        self.__anatomicalTree.setSizePolicy(qt.QSizePolicy.Expanding,
                                            qt.QSizePolicy.Expanding)
        self.__anatomicalTree.toolTip = 'Select an anatomical structure to configure the probablity in relation to other structures on the same level.'
        self.__anatomicalTree.setMinimumHeight(200)
        self.__anatomicalTreeGroupBoxLayout.addWidget(self.__anatomicalTree)

        #
        # overview of class weights panel
        #
        self.__overviewBox = qt.QGroupBox()
        self.__overviewBox.title = 'Overview of Class Weights'
        self.__overviewBox.toolTip = 'These are your guesses of probability relations between structures. Which structure takes how much percentage of the volume?'
        self.__overviewBoxLayout = qt.QVBoxLayout(self.__overviewBox)
        self.__topLayout.addWidget(self.__overviewBox)

        self.__layout.addWidget(self.__top)

        self.__tabWidget = qt.QTabWidget()
        self.__layout.addWidget(self.__tabWidget)

        #
        # basicPage
        #
        self.__basicPage = qt.QWidget()
        self.__basicPageLayout = qt.QHBoxLayout(self.__basicPage)

        self.__basicPageLeft = qt.QWidget()
        self.__basicPageRight = qt.QWidget()
        self.__basicPageLayoutLeft = qt.QFormLayout(self.__basicPageLeft)
        self.__basicPageLayoutRight = qt.QFormLayout(self.__basicPageRight)

        self.__basicPageLayout.addWidget(self.__basicPageLeft)
        self.__basicPageLayout.addWidget(self.__basicPageRight)

        self.__classLabel = qt.QLabel("XX")
        self.__basicPageLayoutLeft.addRow("Class:", self.__classLabel)

        self.__classWeightSpinBox = qt.QDoubleSpinBox()
        self.__classWeightSpinBox.minimum = 0
        self.__classWeightSpinBox.maximum = 1
        self.__classWeightSpinBox.singleStep = 0.01
        self.__classWeightSpinBox.toolTip = 'Configure the class weight for the selected structure.'
        self.__basicPageLayoutLeft.addRow("Class Weight:",
                                          self.__classWeightSpinBox)
        self.__classWeightSpinBox.connect('valueChanged(double)',
                                          self.propagateToMRML)

        self.__atlasWeightSpinBox = qt.QDoubleSpinBox()
        self.__atlasWeightSpinBox.minimum = 0
        self.__atlasWeightSpinBox.maximum = 1
        self.__atlasWeightSpinBox.singleStep = 0.01
        self.__atlasWeightSpinBox.toolTip = 'Configure the atlas weight for the selected structure.'
        self.__basicPageLayoutLeft.addRow("Atlas Weight:",
                                          self.__atlasWeightSpinBox)
        self.__atlasWeightSpinBox.connect('valueChanged(double)',
                                          self.propagateToMRML)

        self.__mfaWeightSpinBox = qt.QDoubleSpinBox()
        self.__mfaWeightSpinBox.minimum = 0
        self.__mfaWeightSpinBox.maximum = 1
        self.__mfaWeightSpinBox.singleStep = 0.01
        self.__mfaWeightSpinBox.toolTip = 'Configure the MFA weight for the selected class.'
        self.__basicPageLayoutLeft.addRow("MFA Weight:",
                                          self.__mfaWeightSpinBox)
        self.__mfaWeightSpinBox.connect('valueChanged(double)',
                                        self.propagateToMRML)

        self.__dummyLabel6 = qt.QLabel("  ")
        self.__basicPageLayoutRight.addRow("  ", self.__dummyLabel6)

        self.__dummyLabel9 = qt.QLabel("  ")
        self.__basicPageLayoutRight.addRow("  ", self.__dummyLabel9)

        self.__inputChannelWeightsBox = qt.QGroupBox()
        self.__inputChannelWeightsBox.title = 'Dataset Channel Weights'
        self.__inputChannelWeightsBox.toolTip = 'Configure different weights for each input dataset.'
        self.__inputChannelWeightsBoxLayout = qt.QFormLayout(
            self.__inputChannelWeightsBox)
        self.__basicPageLayoutRight.addWidget(self.__inputChannelWeightsBox)

        #
        # stoppingConditionsPage
        #
        self.__stoppingConditionsPage = qt.QWidget()
        self.__stoppingConditionsPageLayout = qt.QHBoxLayout(
            self.__stoppingConditionsPage)

        self.__stoppingConditionsPageLeft = qt.QWidget()
        self.__stoppingConditionsPageRight = qt.QWidget()
        self.__stoppingConditionsPageLayoutLeft = qt.QFormLayout(
            self.__stoppingConditionsPageLeft)
        self.__stoppingConditionsPageLayoutRight = qt.QFormLayout(
            self.__stoppingConditionsPageRight)

        self.__stoppingConditionsPageLayout.addWidget(
            self.__stoppingConditionsPageLeft)
        self.__stoppingConditionsPageLayout.addWidget(
            self.__stoppingConditionsPageRight)

        self.__classLabel2 = qt.QLabel("XX")
        self.__stoppingConditionsPageLayoutLeft.addRow("Class:",
                                                       self.__classLabel2)

        self.__emComboBox = qt.QComboBox()
        self.__emComboBox.addItems(Helper.GetStoppingConditionTypes())
        self.__emComboBox.toolTip = 'Configure the EM Stopping Condition for the selected class.'
        self.__stoppingConditionsPageLayoutLeft.addRow('EM:',
                                                       self.__emComboBox)
        self.__emComboBox.connect('currentIndexChanged(int)',
                                  self.propagateToMRML)

        self.__mfaComboBox = qt.QComboBox()
        self.__mfaComboBox.addItems(Helper.GetStoppingConditionTypes())
        self.__mfaComboBox.toolTip = 'Configure the MFA Stopping Condition for the selected class.'
        self.__stoppingConditionsPageLayoutLeft.addRow('MFA:',
                                                       self.__mfaComboBox)
        self.__mfaComboBox.connect('currentIndexChanged(int)',
                                   self.propagateToMRML)

        self.__dummyLabel = qt.QLabel("  ")
        self.__stoppingConditionsPageLayoutRight.addRow(
            "  ", self.__dummyLabel)

        self.__emValueSpinBox = qt.QSpinBox()
        self.__emValueSpinBox.minimum = 0
        self.__emValueSpinBox.singleStep = 1
        self.__emValueSpinBox.toolTip = 'Configure the value for the EM stopping condition.'
        self.__stoppingConditionsPageLayoutRight.addRow(
            'Iterations:', self.__emValueSpinBox)
        self.__emValueSpinBox.connect('valueChanged(int)',
                                      self.propagateToMRML)

        self.__mfaValueSpinBox = qt.QSpinBox()
        self.__mfaValueSpinBox.minimum = 0
        self.__mfaValueSpinBox.singleStep = 1
        self.__mfaValueSpinBox.toolTip = 'Configure the MFA stopping condition. More iterations result in more smoothing.'
        self.__stoppingConditionsPageLayoutRight.addRow(
            'Iterations:', self.__mfaValueSpinBox)
        self.__mfaValueSpinBox.connect('valueChanged(int)',
                                       self.propagateToMRML)

        self.__biasSpinBox = qt.QSpinBox()
        self.__biasSpinBox.minimum = -1
        self.__biasSpinBox.singleStep = 1
        self.__biasSpinBox.toolTip = 'Enable Bias Correction: -1, turn it off: 0.'
        self.__stoppingConditionsPageLayoutRight.addRow(
            'Bias Iterations:', self.__biasSpinBox)
        self.__biasSpinBox.connect('valueChanged(int)', self.propagateToMRML)

        #
        # printPage
        #
        self.__printPage = qt.QWidget()
        self.__printPageLayout = qt.QHBoxLayout(self.__printPage)

        self.__printPageLeft = qt.QWidget()
        self.__printPageRight = qt.QWidget()
        self.__printPageLayoutLeft = qt.QFormLayout(self.__printPageLeft)
        self.__printPageLayoutRight = qt.QFormLayout(self.__printPageRight)

        self.__printPageLayout.addWidget(self.__printPageLeft)
        self.__printPageLayout.addWidget(self.__printPageRight)

        self.__classLabel3 = qt.QLabel("XX")
        self.__printPageLayoutLeft.addRow("Class:", self.__classLabel3)

        self.__weightCheckBox = qt.QCheckBox()
        self.__printPageLayoutLeft.addRow("Weight:", self.__weightCheckBox)
        self.__weightCheckBox.toolTip = 'Toggle to print the weights.'
        self.__weightCheckBox.connect('stateChanged(int)',
                                      self.propagateToMRML)

        self.__qualityCheckBox = qt.QCheckBox()
        self.__printPageLayoutLeft.addRow("Quality:", self.__qualityCheckBox)
        self.__qualityCheckBox.toolTip = 'Toggle to print the quality.'
        self.__qualityCheckBox.connect('stateChanged(int)',
                                       self.propagateToMRML)

        self.__frequencySpinBox = qt.QSpinBox()
        self.__frequencySpinBox.minimum = 0
        self.__frequencySpinBox.maximum = 20
        self.__frequencySpinBox.toolTip = 'Configure the print frequency.'
        self.__printPageLayoutLeft.addRow("Frequency:",
                                          self.__frequencySpinBox)
        self.__frequencySpinBox.connect('valueChanged(int)',
                                        self.propagateToMRML)

        self.__biasCheckBox = qt.QCheckBox()
        self.__biasCheckBox.toolTip = 'Toggle to print the bias.'
        self.__printPageLayoutLeft.addRow("Bias:", self.__biasCheckBox)
        self.__biasCheckBox.connect('stateChanged(int)', self.propagateToMRML)

        self.__labelMapCheckBox = qt.QCheckBox()
        self.__labelMapCheckBox.toolTip = 'Toggle to print the label map.'
        self.__printPageLayoutLeft.addRow("Label Map:",
                                          self.__labelMapCheckBox)
        self.__labelMapCheckBox.connect('stateChanged(int)',
                                        self.propagateToMRML)

        self.__dummyLabel2 = qt.QLabel("  ")
        self.__printPageLayoutRight.addRow("  ", self.__dummyLabel2)

        self.__dummyLabel3 = qt.QLabel("  ")
        self.__printPageLayoutRight.addRow("  ", self.__dummyLabel3)

        self.__convergenceBox = qt.QGroupBox()
        self.__convergenceBox.title = 'Convergence'
        self.__convergenceBoxLayout = qt.QFormLayout(self.__convergenceBox)
        self.__printPageLayoutRight.addWidget(self.__convergenceBox)

        self.__convEMLabelMapCheckBox = qt.QCheckBox()
        self.__convEMLabelMapCheckBox.toolTip = 'Toggle to print the EM Label Map convergence.'
        self.__convergenceBoxLayout.addRow("EM Label Map:",
                                           self.__convEMLabelMapCheckBox)
        self.__convEMLabelMapCheckBox.connect('stateChanged(int)',
                                              self.propagateToMRML)

        self.__convEMWeightsCheckBox = qt.QCheckBox()
        self.__convEMWeightsCheckBox.toolTip = 'Toggle to print the EM Weights convergence.'
        self.__convergenceBoxLayout.addRow("EM Weights:",
                                           self.__convEMWeightsCheckBox)
        self.__convEMWeightsCheckBox.connect('stateChanged(int)',
                                             self.propagateToMRML)

        self.__convMFALabelMapCheckBox = qt.QCheckBox()
        self.__convEMWeightsCheckBox.toolTip = 'Toggle to print the MFA Label Map convergence.'
        self.__convergenceBoxLayout.addRow("MFA Label Map:",
                                           self.__convMFALabelMapCheckBox)
        self.__convMFALabelMapCheckBox.connect('stateChanged(int)',
                                               self.propagateToMRML)

        self.__convMFAWeightsCheckBox = qt.QCheckBox()
        self.__convMFAWeightsCheckBox.toolTip = 'Toggle to print the MFA Weights convergence.'
        self.__convergenceBoxLayout.addRow("MFA Weights:",
                                           self.__convMFAWeightsCheckBox)
        self.__convMFAWeightsCheckBox.connect('stateChanged(int)',
                                              self.propagateToMRML)

        #
        # advancedPage
        #
        self.__advancedPage = qt.QWidget()
        self.__advancedPageLayout = qt.QFormLayout(self.__advancedPage)

        self.__dummyLabel14 = qt.QLabel("  ")
        self.__advancedPageLayout.addWidget(self.__dummyLabel14)

        self.__classLabel4 = qt.QLabel("Class: XX")
        self.__advancedPageLayout.addWidget(self.__classLabel4)

        #    self.__pcaParametersBox = qt.QGroupBox()
        #    self.__pcaParametersBox.title = 'PCA Parameters'
        #    self.__pcaParametersBoxLayout = qt.QFormLayout( self.__pcaParametersBox )
        #    self.__advancedPageLayout.addWidget( self.__pcaParametersBox )
        #
        #    self.__registrationParametersBox = qt.QGroupBox()
        #    self.__registrationParametersBox.title = 'Registration Parameters'
        #    self.__registrationParametersBoxLayout = qt.QFormLayout( self.__registrationParametersBox )
        #    self.__advancedPageLayout.addWidget( self.__registrationParametersBox )

        self.__miscParametersBox = qt.QGroupBox()
        self.__miscParametersBox.title = 'Miscellaneous Parameters'
        self.__miscParametersBoxLayout = qt.QFormLayout(
            self.__miscParametersBox)
        self.__advancedPageLayout.addWidget(self.__miscParametersBox)

        self.__excludeFromEStepCheckBox = qt.QCheckBox()
        self.__excludeFromEStepCheckBox.toolTip = 'Toggle to exclude from Incomplete EStep.'
        self.__miscParametersBoxLayout.addRow("Exclude From Incomplete EStep:",
                                              self.__excludeFromEStepCheckBox)
        self.__excludeFromEStepCheckBox.connect('stateChanged(int)',
                                                self.propagateToMRML)

        self.__genBackgroundProbCheckBox = qt.QCheckBox()
        self.__genBackgroundProbCheckBox.toolTip = 'Toggle to detect the background value.'
        self.__miscParametersBoxLayout.addRow(
            "Generate Background Probability:",
            self.__genBackgroundProbCheckBox)
        self.__genBackgroundProbCheckBox.connect('stateChanged(int)',
                                                 self.propagateToMRML)

        self.__meanFieldParametersBox = qt.QGroupBox()
        self.__meanFieldParametersBox.title = 'Mean Field Parameters'
        self.__meanFieldParametersBoxLayout = qt.QFormLayout(
            self.__meanFieldParametersBox)
        self.__advancedPageLayout.addWidget(self.__meanFieldParametersBox)

        self.__twoDNeighborhoodCheckBox = qt.QCheckBox()
        self.__twoDNeighborhoodCheckBox.toolTip = 'Toggle to use 2D Neighborhood.'
        self.__meanFieldParametersBoxLayout.addRow(
            "2D Neighborhood:", self.__twoDNeighborhoodCheckBox)
        self.__twoDNeighborhoodCheckBox.connect('stateChanged(int)',
                                                self.propagateToMRML)

        #    self.__inhomogeneityParametersBox = qt.QGroupBox()
        #    self.__inhomogeneityParametersBox.title = 'Inhomogeneity Parameters'
        #    self.__inhomogeneityParametersBoxLayout = qt.QFormLayout( self.__inhomogeneityParametersBox )
        #    self.__advancedPageLayout.addWidget( self.__inhomogeneityParametersBox )

        #
        ### add all tabs to the tabWidget
        #
        self.__tabWidget.addTab(self.__basicPage, "Basic")
        self.__tabWidget.addTab(self.__stoppingConditionsPage,
                                "Stopping Conditions")
        self.__tabWidget.addTab(self.__printPage, "Print")
        self.__tabWidget.addTab(self.__advancedPage, "Advanced")
    def loadFromMRML(self, mrmlNode=None):
        '''
    '''
        if not self.__updating:

            self.__updating = 1

            self.resetPanel()

            if mrmlNode:

                # adjust the panel to the given mrmlNode
                vtkId = self.mrmlManager().MapMRMLNodeIDToVTKNodeID(
                    mrmlNode.GetID())

                globalNode = self.mrmlManager().GetGlobalParametersNode()
                if not globalNode:
                    Helper.Error('No global node!')
                    return

                # check if we have a leaf
                isLeaf = self.mrmlManager().GetTreeNodeIsLeaf(vtkId)

                # re-enable the widgets
                self.resetPanel(True)

                self.__classLabel.setText(mrmlNode.GetName())
                self.__classLabel2.setText(mrmlNode.GetName())
                self.__classLabel3.setText(mrmlNode.GetName())
                self.__classLabel4.setText("Class: " + mrmlNode.GetName())

                #
                # basic panel
                #
                self.__classWeightSpinBox.value = self.mrmlManager(
                ).GetTreeNodeClassProbability(vtkId)
                self.__atlasWeightSpinBox.value = self.mrmlManager(
                ).GetTreeNodeSpatialPriorWeight(vtkId)
                if not isLeaf:
                    self.__mfaWeightSpinBox.setEnabled(True)
                    self.__mfaWeightSpinBox.value = self.mrmlManager(
                    ).GetTreeNodeAlpha(vtkId)
                else:
                    self.__mfaWeightSpinBox.value = 0
                    self.__mfaWeightSpinBox.setEnabled(False)

                ## input channel weights
                # 1. clear all
                for i in self.__inputChannelWeights:
                    l = self.__inputChannelWeightsBoxLayout.labelForField(i)
                    self.__inputChannelWeightsBoxLayout.removeWidget(l)
                    l.deleteLater()
                    l.setParent(None)
                    l = None
                    self.__inputChannelWeightsBoxLayout.removeWidget(i)
                    i.deleteLater()
                    i.setParent(None)
                    i = None
                self.__inputChannelWeights = []
                # 2. re-create all
                numberOfVolumes = self.mrmlManager(
                ).GetTargetNumberOfSelectedVolumes()
                for i in range(numberOfVolumes):
                    # create new spinbox
                    currentSpinBox = qt.QDoubleSpinBox()
                    currentSpinBox.minimum = 0
                    currentSpinBox.maximum = 1
                    currentSpinBox.singleStep = 0.01
                    currentSpinBox.value = self.mrmlManager(
                    ).GetTreeNodeInputChannelWeight(vtkId, i)
                    self.__inputChannelWeights.append(currentSpinBox)
                    self.__inputChannelWeights[-1].connect(
                        'valueChanged(double)', self.propagateToMRML)
                    self.__inputChannelWeightsBoxLayout.addRow(
                        globalNode.GetNthTargetInputChannelName(i),
                        self.__inputChannelWeights[-1])

                #
                # stopping conditions panel
                #
                if isLeaf:
                    self.__tabWidget.setTabEnabled(1, False)
                else:
                    # only show if we did not select a leaf
                    self.__tabWidget.setTabEnabled(1, True)

                    self.__emComboBox.setCurrentIndex(
                        self.mrmlManager().GetTreeNodeStoppingConditionEMType(
                            vtkId))
                    if self.__emComboBox.currentIndex == 0:
                        # iteration selected
                        self.__stoppingConditionsPageLayoutRight.labelForField(
                            self.__emValueSpinBox).setText('Iterations:')
                        self.__emValueSpinBox.value = self.mrmlManager(
                        ).GetTreeNodeStoppingConditionEMIterations(vtkId)
                    elif self.__emComboBox.currentIndex >= 1:
                        # labelMap or value selected
                        self.__stoppingConditionsPageLayoutRight.labelForField(
                            self.__emValueSpinBox).setText('Value:')
                        self.__emValueSpinBox.value = self.mrmlManager(
                        ).GetTreeNodeStoppingConditionEMValue(vtkId)

                    self.__mfaComboBox.setCurrentIndex(
                        self.mrmlManager().GetTreeNodeStoppingConditionMFAType(
                            vtkId))
                    if self.__mfaComboBox.currentIndex == 0:
                        # iteration selected
                        self.__stoppingConditionsPageLayoutRight.labelForField(
                            self.__mfaValueSpinBox).setText('Iterations:')
                        self.__mfaValueSpinBox.value = self.mrmlManager(
                        ).GetTreeNodeStoppingConditionMFAIterations(vtkId)
                    elif self.__mfaComboBox.currentIndex >= 1:
                        # labelMap or value selected
                        self.__stoppingConditionsPageLayoutRight.labelForField(
                            self.__mfaValueSpinBox).setText('Value:')
                        self.__mfaValueSpinBox.value = self.mrmlManager(
                        ).GetTreeNodeStoppingConditionMFAValue(vtkId)

                    self.__biasSpinBox.value = self.mrmlManager(
                    ).GetTreeNodeBiasCalculationMaxIterations(vtkId)

                #
                # print panel
                #
                if isLeaf:

                    self.__weightCheckBox.show()
                    self.__printPageLayoutLeft.labelForField(
                        self.__qualityCheckBox).show()
                    self.__qualityCheckBox.show()
                    self.__printPageLayoutLeft.labelForField(
                        self.__frequencySpinBox).hide()
                    self.__frequencySpinBox.hide()
                    self.__printPageLayoutLeft.labelForField(
                        self.__biasCheckBox).hide()
                    self.__biasCheckBox.hide()
                    self.__printPageLayoutLeft.labelForField(
                        self.__labelMapCheckBox).hide()
                    self.__labelMapCheckBox.hide()
                    self.__convergenceBox.hide()

                    self.__weightCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodePrintWeight(vtkId)
                    self.__qualityCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodePrintQuality(vtkId)

                else:
                    self.__weightCheckBox.show()
                    self.__printPageLayoutLeft.labelForField(
                        self.__qualityCheckBox).hide()
                    self.__qualityCheckBox.hide()
                    self.__printPageLayoutLeft.labelForField(
                        self.__frequencySpinBox).show()
                    self.__frequencySpinBox.show()
                    self.__printPageLayoutLeft.labelForField(
                        self.__biasCheckBox).show()
                    self.__biasCheckBox.show()
                    self.__printPageLayoutLeft.labelForField(
                        self.__labelMapCheckBox).show()
                    self.__labelMapCheckBox.show()
                    self.__convergenceBox.show()

                    self.__weightCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodePrintWeight(vtkId)
                    self.__frequencySpinBox.value = self.mrmlManager(
                    ).GetTreeNodePrintFrequency(vtkId)
                    self.__biasCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodePrintBias(vtkId)
                    self.__labelMapCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodePrintLabelMap(vtkId)

                    self.__convEMLabelMapCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodePrintEMLabelMapConvergence(vtkId)
                    self.__convEMWeightsCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodePrintEMWeightsConvergence(vtkId)
                    self.__convMFALabelMapCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodePrintMFALabelMapConvergence(vtkId)
                    self.__convMFAWeightsCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodePrintMFAWeightsConvergence(vtkId)

                #
                # Advanced panel
                #
                if isLeaf:
                    self.__tabWidget.setTabEnabled(3, False)
                    self.__miscParametersBoxLayout.labelForField(
                        self.__excludeFromEStepCheckBox).hide()
                    self.__excludeFromEStepCheckBox.hide()
                    self.__miscParametersBoxLayout.labelForField(
                        self.__genBackgroundProbCheckBox).hide()
                    self.__genBackgroundProbCheckBox.hide()
                    self.__meanFieldParametersBoxLayout.labelForField(
                        self.__twoDNeighborhoodCheckBox).hide()
                    self.__twoDNeighborhoodCheckBox.hide()
                else:
                    self.__tabWidget.setTabEnabled(3, True)
                    self.__miscParametersBoxLayout.labelForField(
                        self.__excludeFromEStepCheckBox).show()
                    self.__excludeFromEStepCheckBox.show()
                    self.__miscParametersBoxLayout.labelForField(
                        self.__genBackgroundProbCheckBox).show()
                    self.__genBackgroundProbCheckBox.show()
                    self.__meanFieldParametersBoxLayout.labelForField(
                        self.__twoDNeighborhoodCheckBox).show()
                    self.__twoDNeighborhoodCheckBox.show()

                    self.__excludeFromEStepCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodeExcludeFromIncompleteEStep(vtkId)
                    self.__genBackgroundProbCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodeGenerateBackgroundProbability(vtkId)
                    self.__twoDNeighborhoodCheckBox.checked = self.mrmlManager(
                    ).GetTreeNodeInteractionMatrices2DFlag(vtkId)

                #
                # overview panel
                #

                # first, clear it all
                for i in self.__classWeights:
                    self.__overviewBoxLayout.removeWidget(i)
                    i.deleteLater()
                    i.setParent(None)
                    i = None

                self.__classWeights = []
                self.__classWeightLayouts = []
                self.__classWeightLabels = []
                self.__classWeightSpinBoxes = []
                self.__classWeightCheckBoxes = []

                # fill it again
                if vtkId != self.mrmlManager().GetTreeRootNodeID():
                    # other node than root selected
                    parent = self.mrmlManager().GetTreeNodeParentNodeID(vtkId)
                    numberOfChildren = self.mrmlManager(
                    ).GetTreeNodeNumberOfChildren(parent)
                    for i in range(numberOfChildren):
                        child = self.mrmlManager().GetTreeNodeChildNodeID(
                            parent, i)
                        name = self.mrmlManager().GetTreeNodeName(child)
                        probability = self.mrmlManager(
                        ).GetTreeNodeClassProbability(child)

                        label = qt.QLabel(name + ":")

                        spinBox = qt.QDoubleSpinBox()
                        spinBox.minimum = 0
                        spinBox.maximum = 1
                        spinBox.singleStep = 0.01
                        spinBox.value = probability

                        checkBox = qt.QCheckBox("  ")
                        checkBox.toolTip = 'Toggle for auto-update when changing other weights.'

                        self.__classWeightLabels.append(label)
                        self.__classWeightSpinBoxes.append(spinBox)
                        self.__classWeightCheckBoxes.append(checkBox)

                        self.__classWeightSpinBoxes[-1].connect(
                            'valueChanged(double)', self.updateClassWeights)
                        self.__classWeightCheckBoxes[-1].connect(
                            'stateChanged(int)', self.updateClassWeights)

                        weightRow = qt.QWidget()
                        weightRowLayout = qt.QHBoxLayout(weightRow)
                        weightRowLayout.addWidget(self.__classWeightLabels[-1])
                        weightRowLayout.addWidget(
                            self.__classWeightSpinBoxes[-1])
                        weightRowLayout.addWidget(
                            self.__classWeightCheckBoxes[-1])

                        self.__classWeights.append(weightRow)
                        self.__classWeightLayouts.append(weightRowLayout)

                        self.__overviewBoxLayout.addWidget(
                            self.__classWeights[-1], 0, 2)

            self.__updating = 0
Exemple #14
0
    def create(self):

        super(BinaryWatershedEffectOptions, self).create()

        if not HAVE_SIMPLEITK:
            self.warningLabel = qt.QLabel()
            self.warningLabel.text = "BinaryWatershed is not available because\nSimpleITK is not available in this build"
            self.widgets.append(self.warningLabel)
            self.frame.layout().addWidget(self.warningLabel)
            return

        self.splitSizeFrame = qt.QFrame(self.frame)
        self.splitSizeFrame.setLayout(qt.QHBoxLayout())
        self.frame.layout().addWidget(self.splitSizeFrame)
        self.widgets.append(self.splitSizeFrame)

        tip = "Sets the a minimum size for labels which will be split into multiple objects."
        self.splitSizeLabel = qt.QLabel("Split Size:", self.frame)
        self.splitSizeLabel.setToolTip(tip)
        self.splitSizeFrame.layout().addWidget(self.splitSizeLabel)
        self.widgets.append(self.splitSizeLabel)

        self.minimumSplitSize = 0
        self.maximumSplitSize = 100

        self.splitSizeSlider = qt.QSlider(qt.Qt.Horizontal, self.frame)
        self.splitSizeSlider.setValue(1)
        self.splitSizeFrame.layout().addWidget(self.splitSizeSlider)
        self.splitSizeFrame.setToolTip(tip)
        self.widgets.append(self.splitSizeSlider)

        self.splitSizeSpinBox = qt.QDoubleSpinBox(self.frame)
        self.splitSizeSpinBox.setToolTip(tip)
        self.splitSizeSpinBox.setValue(1)
        self.splitSizeSpinBox.suffix = "mm"

        self.splitSizeFrame.layout().addWidget(self.splitSizeSpinBox)
        self.widgets.append(self.splitSizeSpinBox)

        self.splitSizeSpinBox.minimum = self.minimumSplitSize
        self.splitSizeSlider.minimum = self.minimumSplitSize
        self.splitSizeSpinBox.maximum = self.maximumSplitSize
        self.splitSizeSlider.maximum = self.maximumSplitSize

        self.apply = qt.QPushButton("Apply", self.frame)
        self.apply.setToolTip("Apply the binary watershed operation")
        self.frame.layout().addWidget(self.apply)
        self.widgets.append(self.apply)

        helpDoc = """Split selected label into separate objects based at minimum size the objects."""
        HelpButton(self.frame, helpDoc)

        self.apply.connect('clicked()', self.onApply)

        self.splitSizeSlider.connect('valueChanged(int)',
                                     self.splitSizeSpinBox.setValue)
        self.splitSizeSpinBox.connect('valueChanged(double)',
                                      self.splitSizeSlider.setValue)

        # if either widget is changed both should change and this should be triggered
        self.connections.append((self.splitSizeSpinBox, 'valueChanged(double)',
                                 self.onSplitSizeValueChanged))

        # Add vertical spacer
        self.frame.layout().addStretch(1)
Exemple #15
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)
        # Instantiate and connect widgets ...

        #--------------------------------------------------
        # For debugging
        #
        # Reload and Test area
        reloadCollapsibleButton = ctk.ctkCollapsibleButton()
        reloadCollapsibleButton.text = "Reload && Test"
        self.layout.addWidget(reloadCollapsibleButton)
        reloadFormLayout = qt.QFormLayout(reloadCollapsibleButton)

        reloadCollapsibleButton.collapsed = True

        # 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 = "NeedleGuideTemlpate Reload"
        reloadFormLayout.addWidget(self.reloadButton)
        self.reloadButton.connect('clicked()', self.onReload)
        #
        #--------------------------------------------------

        #
        # Fiducial Node
        #
        fiducialsCollapsibleButton = ctk.ctkCollapsibleButton()
        fiducialsCollapsibleButton.text = "Fiducials"
        self.layout.addWidget(fiducialsCollapsibleButton)

        # Layout within the dummy collapsible button
        fiducialsFormLayout = qt.QFormLayout(fiducialsCollapsibleButton)

        #
        # Fiducial node selector
        #
        self.fiducialSelector = slicer.qMRMLNodeComboBox()
        self.fiducialSelector.nodeTypes = (("vtkMRMLMarkupsFiducialNode"), "")
        self.fiducialSelector.selectNodeUponCreation = True
        self.fiducialSelector.addEnabled = True
        self.fiducialSelector.removeEnabled = True
        self.fiducialSelector.noneEnabled = False
        self.fiducialSelector.renameEnabled = True
        self.fiducialSelector.showHidden = False
        self.fiducialSelector.showChildNodeTypes = False
        self.fiducialSelector.setMRMLScene(slicer.mrmlScene)
        self.fiducialSelector.setToolTip("Pick the input to the algorithm.")
        fiducialsFormLayout.addRow("Input Volume: ", self.fiducialSelector)

        #
        # Reconfigure Button
        #
        self.radiusEdit = qt.QDoubleSpinBox()
        self.radiusEdit.setMinimum(0.0)
        self.radiusEdit.setMaximum(500.0)
        self.radiusEdit.setSingleStep(0.5)
        self.radiusEdit.setValue(50)

        self.numFiducialsEdit = qt.QSpinBox()
        self.numFiducialsEdit.setMinimum(0)
        self.numFiducialsEdit.setMaximum(100)
        self.numFiducialsEdit.setSingleStep(1)
        self.numFiducialsEdit.setValue(5)

        fiducialsFormLayout.addRow("Radius (mm):", self.radiusEdit)
        fiducialsFormLayout.addRow("# of fiducials:", self.numFiducialsEdit)

        self.reconfigureButton = qt.QPushButton("Reconfigure Fiducials")
        self.reconfigureButton.toolTip = "Reconfigure fiducial frame"
        self.reconfigureButton.enabled = False
        fiducialsFormLayout.addRow(self.reconfigureButton)

        #
        # Test Area
        #
        testCollapsibleButton = ctk.ctkCollapsibleButton()
        testCollapsibleButton.text = "Test"
        self.layout.addWidget(testCollapsibleButton)

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

        #
        # input volume selector
        #
        self.inputSelector = slicer.qMRMLNodeComboBox()
        self.inputSelector.nodeTypes = (("vtkMRMLMarkupsFiducialNode"), "")
        self.inputSelector.selectNodeUponCreation = True
        self.inputSelector.addEnabled = False
        self.inputSelector.removeEnabled = False
        self.inputSelector.noneEnabled = False
        self.inputSelector.showHidden = False
        self.inputSelector.showChildNodeTypes = False
        self.inputSelector.setMRMLScene(slicer.mrmlScene)
        self.inputSelector.setToolTip("Pick the input to the algorithm.")
        parametersFormLayout.addRow("Input Fiducial: ", self.inputSelector)

        #
        # reference volume selector
        #
        self.referenceSelector = slicer.qMRMLNodeComboBox()
        self.referenceSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.referenceSelector.selectNodeUponCreation = False
        self.referenceSelector.addEnabled = True
        self.referenceSelector.removeEnabled = True
        self.referenceSelector.noneEnabled = False
        self.referenceSelector.showHidden = False
        self.referenceSelector.showChildNodeTypes = False
        self.referenceSelector.setMRMLScene(slicer.mrmlScene)
        self.referenceSelector.setToolTip(
            "Pick the reference to the algorithm.")
        parametersFormLayout.addRow("Reference Volume: ",
                                    self.referenceSelector)

        logFileLayout = qt.QHBoxLayout()
        self.logFileLineEdit = qt.QLineEdit()
        self.logFileLineEdit.text = ''
        self.logFileLineEdit.readOnly = True
        self.logFileLineEdit.frame = True
        self.logFileLineEdit.styleSheet = "QLineEdit { background:transparent; }"
        self.logFileLineEdit.cursor = qt.QCursor(qt.Qt.IBeamCursor)
        logFileLayout.addWidget(self.logFileLineEdit)

        self.logFileButton = qt.QPushButton("Choose File...")
        self.logFileButton.toolTip = "Choose log file from dialog box"
        logFileLayout.addWidget(self.logFileButton)

        parametersFormLayout.addRow("Log file:", logFileLayout)

        #
        # Apply Button
        #
        self.applyButton = qt.QPushButton("Apply")
        self.applyButton.toolTip = "Run the algorithm."
        self.applyButton.enabled = False
        parametersFormLayout.addRow(self.applyButton)

        # connections
        self.fiducialSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                      self.onFiducialSelect)
        self.reconfigureButton.connect('clicked(bool)',
                                       self.onReconfigureButton)
        self.logFileButton.connect('clicked(bool)', self.onLogFileButton)
        self.applyButton.connect('clicked(bool)', self.onApplyButton)
        self.inputSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                   self.onSelect)
        self.referenceSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                       self.onSelect)

        # Add vertical spacer
        self.layout.addStretch(1)

        # Create logic
        self.logic = FiducialRegistrationTestLogic(None)

        # Enable buttons, if nodes are selected
        self.onSelect()
        self.onFiducialSelect()
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)
        # Instantiate and connect widgets ...

        if not NUMPY_AVAILABLE:
            label = qt.QLabel(
                'The module is not available due to missing Numpy package.')
            self.layout.addWidget(label)
            label = qt.QLabel(
                'You can seek help by contacting 3D Slicer user list: [email protected]'
            )
            self.layout.addWidget(label)

            # Add vertical spacer
            self.layout.addStretch(1)
            return

        # Collapsible button
        dummyCollapsibleButton = ctk.ctkCollapsibleButton()
        dummyCollapsibleButton.text = "Basic settings"
        self.layout.addWidget(dummyCollapsibleButton)
        dummyFormLayout = qt.QFormLayout(dummyCollapsibleButton)

        # add input directory selector
        label = qt.QLabel('Input directory:')
        self.__fDialog = ctk.ctkDirectoryButton()
        self.__fDialog.caption = 'Input directory'
        dummyFormLayout.addRow(label, self.__fDialog)

        label = qt.QLabel('Output node:')
        self.__mvSelector = slicer.qMRMLNodeComboBox()
        self.__mvSelector.nodeTypes = ['vtkMRMLMultiVolumeNode']
        self.__mvSelector.setMRMLScene(slicer.mrmlScene)
        self.__mvSelector.connect('mrmlSceneChanged(vtkMRMLScene*)',
                                  self.onMRMLSceneChanged)
        self.__mvSelector.addEnabled = 1
        dummyFormLayout.addRow(label, self.__mvSelector)

        # Collapsible button
        dummyCollapsibleButton = ctk.ctkCollapsibleButton()
        dummyCollapsibleButton.text = "Advanced settings"
        dummyCollapsibleButton.collapsed = 1
        self.layout.addWidget(dummyCollapsibleButton)
        dummyFormLayout = qt.QFormLayout(dummyCollapsibleButton)
        self.__advancedFrame = dummyCollapsibleButton

        label = qt.QLabel('Frame identifying DICOM tag (if known):')
        self.__dicomTag = qt.QLineEdit()
        self.__dicomTag.text = 'NA'
        dummyFormLayout.addRow(label, self.__dicomTag)

        label = qt.QLabel('Frame identifying units:')
        self.__veLabel = qt.QLineEdit()
        self.__veLabel.text = 'na'
        dummyFormLayout.addRow(label, self.__veLabel)

        label = qt.QLabel('Initial value:')
        self.__veInitial = qt.QDoubleSpinBox()
        self.__veInitial.value = 0
        dummyFormLayout.addRow(label, self.__veInitial)

        label = qt.QLabel('Step:')
        self.__veStep = qt.QDoubleSpinBox()
        self.__veStep.value = 1
        dummyFormLayout.addRow(label, self.__veStep)

        label = qt.QLabel('EchoTime:')
        self.__te = qt.QDoubleSpinBox()
        self.__te.value = 1
        dummyFormLayout.addRow(label, self.__te)

        label = qt.QLabel('RepetitionTime:')
        self.__tr = qt.QDoubleSpinBox()
        self.__tr.value = 1
        dummyFormLayout.addRow(label, self.__tr)

        label = qt.QLabel('FlipAngle:')
        self.__fa = qt.QDoubleSpinBox()
        self.__fa.value = 1
        dummyFormLayout.addRow(label, self.__fa)

        importButton = qt.QPushButton("Import")
        importButton.toolTip = "Import the contents of the directory as a MultiVolume"
        self.layout.addWidget(importButton)
        importButton.connect('clicked(bool)', self.onImportButtonClicked)

        self.__status = qt.QLabel('Status: Idle')
        self.layout.addWidget(self.__status)

        # Add vertical spacer
        self.layout.addStretch(1)
    def loadFromMRML(self, mrmlNode=None):
        '''
    '''
        if not self.__updating:

            self.__updating = 1

            self.resetPanel()

            if mrmlNode:
                # adjust the panel to the given mrmlNode
                vtkId = self.mrmlManager().MapMRMLNodeIDToVTKNodeID(
                    mrmlNode.GetID())

                # number of volumes
                numberOfVolumes = self.mrmlManager(
                ).GetTargetNumberOfSelectedVolumes()

                # re-enable the widgets
                self.resetPanel(True)

                self.__classLabel2.setText("Class: " + mrmlNode.GetName())

                self.setupManualSampleTable(mrmlNode)

                for c in range(numberOfVolumes):

                    value = self.mrmlManager(
                    ).GetTreeNodeDistributionMeanWithCorrection(vtkId, c)

                for r in range(numberOfVolumes):
                    for c in range(numberOfVolumes):
                        value = self.mrmlManager(
                        ).GetTreeNodeDistributionLogCovarianceWithCorrection(
                            vtkId, r, c)

                #
                # overview panel
                #

                # first, clear it all
                for i in self.__classWeights:
                    self.__overviewBoxLayout.removeWidget(i)
                    i.deleteLater()
                    i.setParent(None)
                    i = None

                self.__classWeights = []
                self.__classWeightLayouts = []
                self.__classWeightLabels = []
                self.__classWeightSpinBoxes = []
                self.__classWeightCheckBoxes = []

                # fill it again
                if vtkId != self.mrmlManager().GetTreeRootNodeID():
                    # other node than root selected
                    parent = self.mrmlManager().GetTreeNodeParentNodeID(vtkId)
                    numberOfChildren = self.mrmlManager(
                    ).GetTreeNodeNumberOfChildren(parent)
                    for i in range(numberOfChildren):
                        child = self.mrmlManager().GetTreeNodeChildNodeID(
                            parent, i)
                        name = self.mrmlManager().GetTreeNodeName(child)
                        probability = self.mrmlManager(
                        ).GetTreeNodeClassProbability(child)

                        label = qt.QLabel(name + ":")

                        spinBox = qt.QDoubleSpinBox()
                        spinBox.minimum = 0
                        spinBox.maximum = 1
                        spinBox.singleStep = 0.01
                        spinBox.value = probability

                        checkBox = qt.QCheckBox("  ")
                        checkBox.toolTip = 'Toggle for auto-update when changing other weights.'

                        self.__classWeightLabels.append(label)
                        self.__classWeightSpinBoxes.append(spinBox)
                        self.__classWeightCheckBoxes.append(checkBox)

                        self.__classWeightSpinBoxes[-1].connect(
                            'valueChanged(double)', self.updateClassWeights)
                        self.__classWeightCheckBoxes[-1].connect(
                            'stateChanged(int)', self.updateClassWeights)

                        weightRow = qt.QWidget()
                        weightRowLayout = qt.QHBoxLayout(weightRow)
                        weightRowLayout.addWidget(self.__classWeightLabels[-1])
                        weightRowLayout.addWidget(
                            self.__classWeightSpinBoxes[-1])
                        weightRowLayout.addWidget(
                            self.__classWeightCheckBoxes[-1])

                        self.__classWeights.append(weightRow)
                        self.__classWeightLayouts.append(weightRowLayout)

                        self.__overviewBoxLayout.addWidget(
                            self.__classWeights[-1], 0, 2)

            self.__updating = 0
Exemple #18
0
    def create(self):
        super(InteractiveConnectedComponentsUsingParzenPDFsOptions,
              self).create()

        ioCollapsibleButton = ctk.ctkCollapsibleGroupBox()
        ioCollapsibleButton.title = "IO"
        ioCollapsibleButton.collapsed = 0
        self.frame.layout().addWidget(ioCollapsibleButton)

        # Layout within the io collapsible button
        ioFormLayout = qt.QFormLayout(ioCollapsibleButton)
        self.additionalInputNodeSelectors = []
        for i in range(0, 2):
            self.additionalInputNodeSelectors.append(
                self.addInputNodeSelector(i, ioFormLayout))
        self.additionalInputNodeSelectors[
            0].toolTip = "Select the 1st additional input volume to be segmented"
        self.additionalInputNodeSelectors[
            1].toolTip = "Select the 2nd additional input volume to be segmented"

        # Objects
        objectCollapsibleGroupBox = ctk.ctkCollapsibleGroupBox()
        objectCollapsibleGroupBox.title = "Objects"
        self.frame.layout().addWidget(objectCollapsibleGroupBox)

        # Layout within the io collapsible button
        objectFormLayout = qt.QFormLayout(objectCollapsibleGroupBox)
        foregroundLayout = qt.QHBoxLayout()
        foregroundLabel = slicer.qMRMLLabelComboBox()
        foregroundLabel.objectName = 'Foreground label'
        foregroundLabel.setMRMLScene(slicer.mrmlScene)
        foregroundLabel.setMRMLColorNode(self.editUtil.getColorNode())
        foregroundLabel.labelValueVisible = True
        foregroundLabel.currentColor = 1
        self.foregroundLabel = foregroundLabel
        self.connections.append(
            (self.foregroundLabel, 'currentColorChanged(int)',
             self.updateMRMLFromGUI))
        foregroundWeightSpinBox = qt.QDoubleSpinBox(foregroundLabel)
        self.foregroundWeightSpinBox = foregroundWeightSpinBox
        foregroundWeightSpinBox.setRange(0.0, 1.0)
        foregroundWeightSpinBox.setSingleStep(0.1)
        foregroundWeightSpinBox.value = 1.0
        foregroundPopup = ctk.ctkPopupWidget(foregroundWeightSpinBox)
        foregroundPopupLayout = qt.QHBoxLayout(foregroundPopup)
        foregroundPopupSlider = ctk.ctkDoubleSlider(foregroundPopup)
        self.foregroundPopupSlider = foregroundPopupSlider
        foregroundPopupSlider.maximum = 1.0
        foregroundPopupSlider.minimum = 0.0
        foregroundPopupSlider.singleStep = 0.1
        foregroundPopupSlider.connect('valueChanged(double)',
                                      self.foregroundWeightSpinBox.setValue)
        foregroundWeightSpinBox.connect('valueChanged(double)',
                                        self.foregroundPopupSlider.setValue)
        self.connections.append(
            (self.foregroundWeightSpinBox, 'valueChanged(double)',
             self.updateMRMLFromGUI))
        foregroundLayout.addWidget(foregroundLabel)
        foregroundLayout.addWidget(foregroundWeightSpinBox)
        foregroundPopupLayout.addWidget(foregroundPopupSlider)
        objectFormLayout.addRow("Foreground Label:", foregroundLayout)
        self.objectLabel = foregroundLabel
        # http://qt-project.org/doc/qt-4.7/qt.html
        foregroundPopup.alignment = 0x0082  # Qt::AlignVCenter | Qt::AlignRight
        foregroundPopup.horizontalDirection = 0  # Qt::LeftToRight
        foregroundPopup.verticalDirection = 0  # Qt::TopToBottom
        foregroundPopup.animationEffect = 1  # Qt::ScrollEffect

        backgroundLayout = qt.QHBoxLayout()
        backgroundLabel = slicer.qMRMLLabelComboBox()
        backgroundLabel.objectName = 'Background label'
        backgroundLabel.setMRMLScene(slicer.mrmlScene)
        backgroundLabel.setMRMLColorNode(self.editUtil.getColorNode())
        backgroundLabel.labelValueVisible = True
        backgroundLabel.currentColor = 2
        self.backgroundLabel = backgroundLabel
        self.connections.append(
            (self.backgroundLabel, 'currentColorChanged(int)',
             self.updateMRMLFromGUI))
        backgroundWeightSpinBox = qt.QDoubleSpinBox(backgroundLabel)
        self.backgroundWeightSpinBox = backgroundWeightSpinBox
        backgroundWeightSpinBox.setRange(0.0, 1.0)
        backgroundWeightSpinBox.setSingleStep(0.1)
        backgroundWeightSpinBox.value = 1.0
        backgroundPopup = ctk.ctkPopupWidget(backgroundWeightSpinBox)
        backgroundPopupLayout = qt.QHBoxLayout(backgroundPopup)
        backgroundPopupSlider = ctk.ctkDoubleSlider(backgroundPopup)
        self.backgroundPopupSlider = backgroundPopupSlider
        backgroundPopupSlider.maximum = 1.0
        backgroundPopupSlider.minimum = 0.0
        backgroundPopupSlider.singleStep = 0.1
        backgroundPopupSlider.connect('valueChanged(double)',
                                      self.backgroundWeightSpinBox.setValue)
        backgroundWeightSpinBox.connect('valueChanged(double)',
                                        self.backgroundPopupSlider.setValue)
        self.connections.append(
            (self.backgroundWeightSpinBox, 'valueChanged(double)',
             self.updateMRMLFromGUI))
        backgroundLayout.addWidget(backgroundLabel)
        backgroundLayout.addWidget(backgroundWeightSpinBox)
        backgroundPopupLayout.addWidget(backgroundPopupSlider)
        objectFormLayout.addRow("Background Label:", backgroundLayout)
        self.backgroundLabel = backgroundLabel
        # http://qt-project.org/doc/qt-4.7/qt.html
        backgroundPopup.alignment = 0x0082  # Qt::AlignVCenter | Qt::AlignRight
        backgroundPopup.horizontalDirection = 0  # Qt::LeftToRight
        backgroundPopup.verticalDirection = 0  # Qt::TopToBottom
        backgroundPopup.animationEffect = 1  # Qt::ScrollEffect

        # Presets
        # Placeholder
        presetsCollapsibleGroupBox = ctk.ctkCollapsibleGroupBox()
        presetsCollapsibleGroupBox.title = "Preset"
        self.frame.layout().addWidget(presetsCollapsibleGroupBox)
        presetComboBox = slicer.qSlicerPresetComboBox()

        # Advanced Parameters
        paramsCollapsibleGroupBox = ctk.ctkCollapsibleGroupBox()
        paramsCollapsibleGroupBox.title = "Advanced Parameters"
        paramsCollapsibleGroupBox.collapsed = 1
        self.frame.layout().addWidget(paramsCollapsibleGroupBox)

        # Layout within the io collapsible button
        paramsFormLayout = qt.QFormLayout(paramsCollapsibleGroupBox)

        erosionSpinBox = qt.QSpinBox()
        erosionSpinBox.objectName = 'erosionSpinBox'
        erosionSpinBox.toolTip = "Set the erosion radius."
        erosionSpinBox.setMinimum(0)
        erosionSpinBox.setValue(5)  # Default
        paramsFormLayout.addRow("Erosion Radius:", erosionSpinBox)
        self.erosionSpinBox = erosionSpinBox
        self.connections.append(
            (self.erosionSpinBox, "valueChanged(int)", self.updateMRMLFromGUI))

        holeFillSpinBox = qt.QSpinBox()
        holeFillSpinBox.objectName = 'holeFillSpinBox'
        holeFillSpinBox.toolTip = "Set the hole fill iterations."
        holeFillSpinBox.setMinimum(0)
        holeFillSpinBox.setValue(5)  #Default
        paramsFormLayout.addRow("Hole Fill Iterations:", holeFillSpinBox)
        self.holeFillSpinBox = holeFillSpinBox
        self.connections.append((self.holeFillSpinBox, "valueChanged(int)",
                                 self.updateMRMLFromGUI))

        # probabilitySmoothingStandardDeviation spin box
        probabilitySmoothingStdDevSpinBox = qt.QDoubleSpinBox()
        probabilitySmoothingStdDevSpinBox.objectName = 'probabilitySmoothingStdDevSpinBox'
        probabilitySmoothingStdDevSpinBox.toolTip = "Standard deviation of blur applied to probability images prior to computing maximum likelihood of each class at each pixel."
        probabilitySmoothingStdDevSpinBox.setMinimum(0.0)
        probabilitySmoothingStdDevSpinBox.setValue(1.0)  # Default
        probabilitySmoothingStdDevSpinBox.setSingleStep(0.5)
        paramsFormLayout.addRow("Probability Smoothing Standard Deviation:",
                                probabilitySmoothingStdDevSpinBox)
        self.probabilitySmoothingStdDevSpinBox = probabilitySmoothingStdDevSpinBox
        self.connections.append(
            (self.probabilitySmoothingStdDevSpinBox, "valueChanged(double)",
             self.updateMRMLFromGUI))

        # histogramSmoothingStandardDeviation spin box
        histogramSmoothingStdDevSpinBox = qt.QDoubleSpinBox()
        histogramSmoothingStdDevSpinBox.objectName = 'histogramSmoothingStdDevSpinBox'
        histogramSmoothingStdDevSpinBox.toolTip = "Standard deviation of blur applied to histograms to convert them to probability density function estimates."
        histogramSmoothingStdDevSpinBox.setMinimum(0.0)
        histogramSmoothingStdDevSpinBox.setValue(5.0)  # Default
        histogramSmoothingStdDevSpinBox.setSingleStep(0.5)
        paramsFormLayout.addRow("Probability Smoothing Standard Deviation:",
                                histogramSmoothingStdDevSpinBox)
        self.histogramSmoothingStdDevSpinBox = histogramSmoothingStdDevSpinBox
        self.connections.append(
            (self.histogramSmoothingStdDevSpinBox, "valueChanged(double)",
             self.updateMRMLFromGUI))

        # draft check box
        draftCheckBox = qt.QCheckBox()
        draftCheckBox.objectName = 'draftCheckBox'
        draftCheckBox.toolTip = "Downsamples results by a factor of 4."
        paramsFormLayout.addRow("Draft Mode:", draftCheckBox)
        self.draftCheckBox = draftCheckBox
        self.connections.append(
            (self.draftCheckBox, "stateChanged(int)", self.updateMRMLFromGUI))

        # force classification check box
        forceClassificationCheckBox = qt.QCheckBox()
        forceClassificationCheckBox.objectName = 'forceClassificationCheckBox'
        forceClassificationCheckBox.toolTip = "Perform the classification of all voxels?"
        forceClassificationCheckBox.setChecked(False)
        paramsFormLayout.addRow("Classify all voxels: ",
                                forceClassificationCheckBox)
        self.forceClassificationCheckBox = forceClassificationCheckBox
        self.connections.append((self.forceClassificationCheckBox,
                                 "stateChanged(int)", self.updateMRMLFromGUI))

        # dilate first check box
        dilateFirstCheckBox = qt.QCheckBox()
        dilateFirstCheckBox.objectName = 'dilateFirstCheckBox'
        dilateFirstCheckBox.toolTip = "Dilate and then erode so as to fill-in holes?"
        dilateFirstCheckBox.setChecked(False)
        paramsFormLayout.addRow("Dilate First: ", dilateFirstCheckBox)
        self.dilateFirstCheckBox = dilateFirstCheckBox
        self.connections.append((self.dilateFirstCheckBox, "stateChanged(int)",
                                 self.updateMRMLFromGUI))

        self.helpLabel = qt.QLabel(
            "Run the PDF Segmentation on the current label map.", self.frame)
        self.frame.layout().addWidget(self.helpLabel)

        self.apply = qt.QPushButton("Apply", self.frame)
        self.apply.setToolTip(
            "Apply to run segmentation.\nCreates a new label volume using the current volume as input"
        )
        self.frame.layout().addWidget(self.apply)
        self.widgets.append(self.apply)

        EditorLib.HelpButton(
            self.frame,
            "Use this tool to apply segmentation using Parzen windowed PDFs.\n\n Select different label colors and paint on the foreground or background voxels using the paint effect.\nTo run segmentation correctly, you need to supply a minimum or two class labels."
        )

        self.connections.append((self.apply, 'clicked()', self.onApply))
    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 buttonino
        # (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 = "PectoralisSegmentation 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)

        #
        # 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.inputSelector = slicer.qMRMLNodeComboBox()
        self.inputSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.inputSelector.selectNodeUponCreation = True
        self.inputSelector.addEnabled = False
        self.inputSelector.removeEnabled = False
        self.inputSelector.noneEnabled = False
        self.inputSelector.showHidden = False
        self.inputSelector.showChildNodeTypes = False
        self.inputSelector.setMRMLScene(slicer.mrmlScene)
        self.inputSelector.setToolTip("Pick the input to the algorithm.")
        parametersFormLayout.addRow("Input Volume: ", self.inputSelector)

        #
        # output segmentation selector
        #
        self.outputSelector = slicer.qMRMLNodeComboBox()
        self.outputSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.outputSelector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap",
                                         0)
        self.outputSelector.selectNodeUponCreation = False
        self.outputSelector.addEnabled = True
        self.outputSelector.removeEnabled = True
        self.outputSelector.noneEnabled = False
        self.outputSelector.showHidden = False
        self.outputSelector.showChildNodeTypes = False
        self.outputSelector.setMRMLScene(slicer.mrmlScene)
        self.outputSelector.setToolTip("Pick the output to the algorithm.")
        parametersFormLayout.addRow("Output Volume: ", self.outputSelector)

        #text file with all the labelmaps
        #self.labelMapFileSelector = qt.QFileDialog()
        #label_file = self.labelMapFileSelector.getOpenFileNames(
        #                            self.labelMapFileSelector,
        #                            "Select files to open",
        #                            "/home",
        #                            "text (*.txt)");
        #text = str(combobox1.currentText())

        #parametersFormLayout.addRow("Text file with labelmap names: ", self.labelMapFileSelector)

        self.descriptionEdit = qt.QLineEdit(
            "/Users/rolaharmouche/Documents/Caselists/INSP_STD_PECS_training_atlas_filename.txt"
        )
        parametersFormLayout.addRow("Training Labelmaps file name:",
                                    self.descriptionEdit)
        #Add parameters:

        self.similarityThreshold = qt.QDoubleSpinBox()
        self.similarityThreshold.setRange(0, 1)
        self.similarityThreshold.setSingleStep(0.1)
        self.similarityThreshold.setValue(1)
        self.similarityThreshold.setToolTip(
            "Maximum NCC similarity value to include.")
        parametersFormLayout.addRow(
            "Maximum NCC similarity value to include: ",
            self.similarityThreshold)

        self.numTrainingLabels = qt.QSpinBox()
        self.numTrainingLabels.setRange(1, 100)
        self.numTrainingLabels.setValue(10)
        self.numTrainingLabels.setToolTip(
            "Specify the number of training labels used to build the atlas.")
        parametersFormLayout.addRow("Number of labels for atlas generation: ",
                                    self.numTrainingLabels)

        #
        # Apply Button
        #
        self.applyButton = qt.QPushButton("Segment")
        self.applyButton.toolTip = "Run the segmentation algorithm."
        self.applyButton.enabled = False
        parametersFormLayout.addRow(self.applyButton)

        # connections
        self.applyButton.connect('clicked(bool)', self.onApplyButton)
        self.inputSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                   self.onSelect)
        self.outputSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                    self.onSelect)

        # Add vertical spacer
        self.layout.addStretch(1)
  def setup(self):
    ScriptedLoadableModuleWidget.setup(self)
    self.dbpath = None
    self.dbcsvpath = None
    self.flirttemplate = '/usr/share/fsl/5.0/data/standard/MNI152_T1_2mm_brain.nii.gz' 

    #
    # Reload and Test area
    #
    reloadCollapsibleButton       = ctk.ctkCollapsibleButton()
    reloadCollapsibleButton.text  = "Reload && Test"
    self.layout.addWidget(reloadCollapsibleButton)
    reloadFormLayout              = qt.QFormLayout(reloadCollapsibleButton) 

    self.clearButton              = qt.QPushButton("Clear Scene")
    self.clearButton.toolTip      = "Clear all the volumes and models in 3D views"
    self.clearButton.name         = "AdniDemonsDatabase Clear"
    reloadFormLayout.addWidget(self.clearButton)
    self.clearButton.connect('clicked()', self.onClear)

    # reload button
    # (use this during development, but remove it when delivering
    #  your module to users)
    self.reloadButton             = qt.QPushButton("Reload")
    self.reloadButton.toolTip     = "Reload AdniDemonsDatabase"
    self.reloadButton.name        = "AdniDemonsDatabase Reload"
    reloadFormLayout.addWidget(self.reloadButton)
    self.reloadButton.connect('clicked()', self.onReload)

    # Get the test methods create a button for each of them
    testklsdir = dir(AdniDemonsDatabaseTest)
    # reload and test button
    # (use this during development, but remove it when delivering your module to users)
    # reload and run specific tests
    # scenarios                     = ('All', 'Model', 'Volume', 'SceneView_Simple', 'SceneView_Complex')
    scenarios = [n for n in testklsdir if n.startswith('test_')]

    for scenario in scenarios:
        button                      = qt.QPushButton("Reload and Test %s" % scenario)
        button.toolTip              = "Reload this module and then run the self test on %s." % scenario
        reloadFormLayout.addWidget(button)
        button.connect('clicked()', lambda s = scenario: self.onReloadAndTest(scenario = s))

    #
    # Test All Button
    #
    self.testallButton             = qt.QPushButton("Test All")
    self.testallButton.toolTip     = "Run all the logic tests"
    self.testallButton.name        = "Reload & Test All"
    reloadFormLayout.addWidget(self.testallButton)
    self.testallButton.connect('clicked()', self.onTestAll)

    #
    # Settings Area
    #
    settingCollapsibleButton      = ctk.ctkCollapsibleButton()
    settingCollapsibleButton.text = "ADNI Demons Database Generation"
    self.layout.addWidget(settingCollapsibleButton)
    settingFormLayout             = qt.QGridLayout(settingCollapsibleButton) 

    #
    # DB Directory Selection Button
    #
    self.dbButton                 = qt.QPushButton("Set ADNI Database Directory")
    self.dbButton.toolTip         = "Set ANDI Database Directory"
    self.dbButton.enabled         = True 
    settingFormLayout.addWidget(self.dbButton, 0, 0)
    self.dblabel = qt.QLabel(self.dbpath if self.dbpath != None else 'Empty')
    settingFormLayout.addWidget(self.dblabel, 0, 1)

    #
    # DB csv file Selection Button
    #
    csvbtntxt = "Set *.csv File For DB Record"
    self.dbcsvpath = '' if self.dbButton.text.find(':') == -1 else join(self.dbpath, 'db.csv')
    self.csvButton                 = qt.QPushButton(csvbtntxt if len(self.dbcsvpath) == 0 else csvbtntxt + ' : ' + self.dbcsvpath)
    self.csvButton.toolTip         = "Set ANDI Database csv file path, which can be downloaded in the data collection"
    self.csvButton.enabled         = True 
    settingFormLayout.addWidget(self.csvButton, 1, 0)
    self.csvlabel = qt.QLabel(self.dbcsvpath if self.dbcsvpath != None and self.dbpath != None else 'Empty')
    settingFormLayout.addWidget(self.csvlabel, 1, 1)

    #
    # Flirt Template Selection Button
    #
    self.betflirt_templatebutton                 = qt.QPushButton("Select Flirt Template")
    self.betflirt_templatebutton.toolTip         = "Select Flirt Template"
    self.betflirt_templatebutton.enabled         = True 
    settingFormLayout.addWidget(self.betflirt_templatebutton, 2, 0)
    self.flirtlabel = qt.QLabel(self.flirttemplate if self.flirttemplate != None else 'Empty')
    settingFormLayout.addWidget(self.flirtlabel, 2, 1)

    # They should be connected afterwards their initiation
    self.dbButton.connect('clicked(bool)', lambda: self.onFileButton('db'))
    self.csvButton.connect('clicked(bool)', lambda: self.onFileButton('csv'))
    self.betflirt_templatebutton.connect('clicked(bool)', lambda: self.onFileButton('flirt'))

    #
    # Bet & Flirt Threshold
    #
    self.betflirtspin = qt.QDoubleSpinBox()
    self.betflirtspin.setRange(0.0, 1.0)
    self.betflirtspin.setSingleStep(0.05)
    self.betflirtspin.setValue(0.2)
    settingFormLayout.addWidget(qt.QLabel("Bet Threashold"), 3 ,0)
    settingFormLayout.addWidget(self.betflirtspin, 3, 1)

    #
    # Checkbox for Bet & Flirt
    #
    self.betflirtcheck = qt.QCheckBox("Run Bet + Flirt")
    self.betflirtcheck.setToolTip("Only the image IDs listed in the csv file will be processed. flirted images will be saved in path/to/db/flirted")
    self.betflirtcheck.checked = 0
    settingFormLayout.addWidget(self.betflirtcheck, 4, 0)

    #
    # Checkbox for Running Demons Registration 
    #
    self.demonscheck = qt.QCheckBox("Run Demons")
    self.demonscheck.setToolTip("Only the image IDs listed in the csv file will be processed. Image sources will only be retrieved from path/to/db/flirted")
    self.demonscheck.checked = 0
    self.demonscheck.enabled = True 
    settingFormLayout.addWidget(self.demonscheck, 4, 1)

    #
    # Interval Selection : 6m | 12m
    #
    self.intervalCombo = qt.QComboBox()
    self.intervalCombo.addItem("6 Month")
    self.intervalCombo.addItem("12 Month")
    settingFormLayout.addWidget(qt.QLabel("Extract Interval"), 5 ,0)
    settingFormLayout.addWidget(self.intervalCombo, 5, 1)

    #
    # Sequence Label Selection: All, Stable: NL, Stable: MCI, Stable: AD, NL2MCI, MCI2AD 
    #
    self.seqCombo = qt.QComboBox()
    self.seqCombo.enabled = False 
    self.seqCombo.addItems(["All", "Stable: NL", "Stable: MCI", "Stable: AD", "NL2MCI", "MCI2AD"])
    settingFormLayout.addWidget(qt.QLabel("Sequence Type"), 6 ,0)
    settingFormLayout.addWidget(self.seqCombo, 6, 1)

    actionCollapsibleButton       = ctk.ctkCollapsibleButton()
    actionCollapsibleButton.text  = "Database Generation Actions"
    self.layout.addWidget(actionCollapsibleButton)
    actionFormLayout              = qt.QFormLayout(actionCollapsibleButton) 

    #
    # Generate Database csv
    #
    self.dbgenButton = qt.QPushButton("Generate Database Sequence csv")
    self.dbgenButton.toolTip = "Generate A csv with required fields by merging the image collection csv and the dxsum. To make this button functional, pls make sure R language is installed in your system and \'RScript\' is in the $PATH. \'dbgen.csv\' will be generated in the database directory"
    self.dbgenButton.enabled = False 
    actionFormLayout.addRow(self.dbgenButton)
    self.dbgenButton.connect('clicked(bool)', self.onDbgenButton)

    #
    # Validate Database see if all the images exist 
    #
    self.validateDbButton = qt.QPushButton("Validate Database")
    self.validateDbButton.toolTip = "Check if all the image ids in the dbgen.csv exist in the data folder"
    self.validateDbButton.enabled = False 
    actionFormLayout.addRow(self.validateDbButton)
    self.validateDbButton.connect('clicked(bool)', self.onValidateDbButton)

    #
    # Validate Bet and Flirt see if all the images were flirted and betted successfully 
    #
    self.validateBetAndFlirtButton = qt.QPushButton("Validate Bet&Flirt")
    self.validateBetAndFlirtButton.toolTip = "Check if all the image were successfully betted and flirted"
    self.validateBetAndFlirtButton.enabled = True 
    actionFormLayout.addRow(self.validateBetAndFlirtButton)
    self.validateBetAndFlirtButton.connect('clicked(bool)', self.onValidateBetAndFlirtButton)

    #
    # Apply Button
    #
    self.applyButton = qt.QPushButton("Apply")
    self.applyButton.toolTip = "Run the algorithm."
    self.applyButton.enabled = True 
    actionFormLayout.addRow(self.applyButton)
    self.applyButton.connect('clicked(bool)', self.onApplyButton)

    #
    # Flirt Clear Button
    #
    self.clearFlirtButton = qt.QPushButton("Clear Flirt")
    self.clearFlirtButton.toolTip = "Clear the files created by flirt."
    self.clearFlirtButton.enabled = False
    actionFormLayout.addRow(self.clearFlirtButton)
    self.clearFlirtButton.connect('clicked(bool)', self.onFlirtClear)

    #
    # Evaluate DB Area
    #
    evaluateCollapsibleButton      = ctk.ctkCollapsibleButton()
    evaluateCollapsibleButton.text = "Evaluate DB"
    self.layout.addWidget(evaluateCollapsibleButton)
    evaluateFormLayout             = qt.QGridLayout(evaluateCollapsibleButton) 

    #
    # MAP setting
    #
    self.kmapspin = qt.QDoubleSpinBox()
    self.kmapspin.setRange(0.0, 10.0)
    self.kmapspin.setSingleStep(1.0)
    self.kmapspin.setValue(5)
    evaluateFormLayout.addWidget(qt.QLabel("K value for MAP"), 1 ,0)
    evaluateFormLayout.addWidget(self.kmapspin, 1, 1)

    #
    # DB Evaluate Button
    #
    self.evaluateDbButton = qt.QPushButton('Evaluate DB')
    self.evaluateDbButton.toolTip = "Set ANDI Database Directory. Assume in this folder, you have already generated a database with ADNI Demons DB Creator"
    self.evaluateDbButton.enabled = True 
    evaluateFormLayout.addWidget(self.evaluateDbButton, 2, 0)
    self.evaluateDbButton.connect('clicked(bool)', self.onEvaluateDbButton)

    #
    # Regenerate DB matrix check
    #
    self.regenMatCheck = qt.QCheckBox('Regenerate Dissimilarity Matrix')
    self.regenMatCheck.checked = False
    self.regenMatCheck.enabled = True
    evaluateFormLayout.addWidget(self.regenMatCheck, 2, 1)

    #
    # Testing Ariea
    #
    statusCollapsibleButton = ctk.ctkCollapsibleButton()
    statusCollapsibleButton.text  = "Console"
    self.layout.addWidget(statusCollapsibleButton)
    self.statusLayout              = qt.QFormLayout(statusCollapsibleButton) 

    #
    # Show a Return Message
    #
    self.returnMsg = qt.QLabel("Ready") 
    self.statusLayout.addRow(self.returnMsg)

    # Add vertical spacer
    self.layout.addStretch(1)
    def setup(self):

        w = qt.QWidget()
        layout = qt.QGridLayout()
        w.setLayout(layout)
        self.layout.addWidget(w)
        w.show()
        self.layout = layout

        ####################IMPORTAR VOLUMEN 4D#################################################3

        ### Se crea la sección para cargar el volumen 4D en una pestaña desplegable
        importDataCollapsibleButton = ctk.ctkCollapsibleButton()
        importDataCollapsibleButton.text = "Import Data"
        self.layout.addWidget(importDataCollapsibleButton)

        importDataFormLayout = qt.QFormLayout(importDataCollapsibleButton)

        #### Crear desplegable para seleccionar dirección del volumen
        self.__fDialog = ctk.ctkDirectoryButton()
        self.__fDialog.caption = 'Input directory'
        importDataFormLayout.addRow('Input directory:', self.__fDialog)

        ###Selector de volumen donde se guardara el volumen de la direccion
        self.outputSelector = slicer.qMRMLNodeComboBox()
        self.outputSelector.nodeTypes = ['vtkMRMLMultiVolumeNode']
        self.outputSelector.addEnabled = True  # Se habilita la posibildad al usuario de crear un nuevo nodo con este widget
        self.outputSelector.removeEnabled = False  # Se le quita al usuario la posibilidad de eliminar el nodo seleccionado en ese momento
        self.outputSelector.setMRMLScene(slicer.mrmlScene)
        importDataFormLayout.addRow("Output node:", self.outputSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.outputSelector, 'setMRMLScene(vtkMRMLScene*)')

        ### Parametros avanzados

        self.__dicomTag = qt.QLineEdit()
        self.__dicomTag.text = 'NA'
        importDataFormLayout.addRow('Frame identifying DICOM tag:',
                                    self.__dicomTag)

        self.__veLabel = qt.QLineEdit()
        self.__veLabel.text = 'na'
        importDataFormLayout.addRow('Frame identifying units:', self.__veLabel)

        self.__veInitial = qt.QDoubleSpinBox()
        self.__veInitial.value = 0
        importDataFormLayout.addRow('Initial value:', self.__veInitial)

        self.__veStep = qt.QDoubleSpinBox()
        self.__veStep.value = 1
        importDataFormLayout.addRow('Step:', self.__veStep)

        self.__te = qt.QDoubleSpinBox()
        self.__te.value = 1
        importDataFormLayout.addRow('EchoTime:', self.__te)

        self.__tr = qt.QDoubleSpinBox()
        self.__tr.value = 1
        importDataFormLayout.addRow('RepetitionTime:', self.__tr)

        self.__fa = qt.QDoubleSpinBox()
        self.__fa.value = 1
        importDataFormLayout.addRow('FlipAngle:', self.__fa)

        # Botón de importar

        self.buttonImport = qt.QPushButton("Import")
        self.buttonImport.toolTip = "Run the algorithm."
        ##self.buttonImport.enabled = True
        importDataFormLayout.addRow("                                       ",
                                    self.buttonImport)

        self.buttonImport.connect('clicked(bool)', self.importFunction)
        ##self.inputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)

        ###########################REGISTRO##########################################

        ##    # Se crea una sección de parámetros en una pestaña desplegable
        registerCollapsibleButton = ctk.ctkCollapsibleButton()
        registerCollapsibleButton.text = "Register"
        self.layout.addWidget(registerCollapsibleButton)

        registerFormLayout = qt.QFormLayout(registerCollapsibleButton)

        #Se crea una ventana desplegable en la cual se ingresa el volumen 4D de
        #entrada que se quiere registrar, este volumen debe ser de tipo
        #"vtkMRMLMultiVolumeNode", además si se tienen varios multivolumenes cargados
        #se puede elegir entre ellos el que se desea registrar
        self.inputRegSelector = slicer.qMRMLNodeComboBox()
        self.inputRegSelector.nodeTypes = ["vtkMRMLMultiVolumeNode"]
        self.inputRegSelector.selectNodeUponCreation = True
        self.inputRegSelector.addEnabled = True
        self.inputRegSelector.removeEnabled = False
        self.inputRegSelector.noneEnabled = True
        self.inputRegSelector.showHidden = False
        self.inputRegSelector.showChildNodeTypes = False
        self.inputRegSelector.setMRMLScene(slicer.mrmlScene)
        self.inputRegSelector.setToolTip("Pick the input to the algorithm.")
        registerFormLayout.addRow("Volumen 4D: ", self.inputRegSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.inputRegSelector,
                            'setMRMLScene(vtkMRMLScene*)')

        ###Selector de volumen donde se guardara el volumen de la direccion
        self.outputRegSelector = slicer.qMRMLNodeComboBox()
        self.outputRegSelector.nodeTypes = ['vtkMRMLMultiVolumeNode']
        self.outputRegSelector.addEnabled = True  # Se habilita la posibildad al usuario de crear un nuevo nodo con este widget
        self.outputRegSelector.removeEnabled = False  # Se le quita al usuario la posibilidad de eliminar el nodo seleccionado en ese momento
        self.outputRegSelector.setMRMLScene(slicer.mrmlScene)
        registerFormLayout.addRow("Output node:", self.outputRegSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.outputRegSelector,
                            'setMRMLScene(vtkMRMLScene*)')

        # Botón de Registro
        #Este botón solo se activa si el multivolumen ha sido seleccionado en la
        #ventana desplegable de Volumen 4D. Al presionarlo, el algoritmo
        #realiza el registro de los diferentes volumenes en el volumen 4D
        self.applyButton = qt.QPushButton("Registrar")
        self.applyButton.toolTip = "Run the algorithm."
        self.applyButton.enabled = True
        registerFormLayout.addRow(self.applyButton)

        # Conexiones necesarias para el algoritmo
        #entrega al algoritmo el volumen 4D de entrada y conecta la función del botón
        #con la ejecución del registro
        self.applyButton.connect('clicked(bool)', self.registrarButton)
Exemple #22
0
  def create(self):
    super(GooCutOptions,self).create()

    self.botButton = qt.QPushButton(self.frame)
    self.botButton.text = "Start Bot"
    self.frame.layout().addWidget(self.botButton)

    self.toleranceFrame = qt.QFrame(self.frame)
    self.toleranceFrame.setLayout(qt.QHBoxLayout())
    self.frame.layout().addWidget(self.toleranceFrame)
    self.widgets.append(self.toleranceFrame)
    self.toleranceLabel = qt.QLabel("Tolerance:", self.toleranceFrame)
    self.toleranceLabel.setToolTip("Set the tolerance of the wand in terms of background pixel values")
    self.toleranceFrame.layout().addWidget(self.toleranceLabel)
    self.widgets.append(self.toleranceLabel)
    self.toleranceSpinBox = qt.QDoubleSpinBox(self.toleranceFrame)
    self.toleranceSpinBox.setToolTip("Set the tolerance of the wand in terms of background pixel values")
    self.toleranceSpinBox.minimum = 0
    self.toleranceSpinBox.maximum = 1000
    self.toleranceSpinBox.suffix = ""
    self.toleranceFrame.layout().addWidget(self.toleranceSpinBox)
    self.widgets.append(self.toleranceSpinBox)

    self.maxPixelsFrame = qt.QFrame(self.frame)
    self.maxPixelsFrame.setLayout(qt.QHBoxLayout())
    self.frame.layout().addWidget(self.maxPixelsFrame)
    self.widgets.append(self.maxPixelsFrame)
    self.maxPixelsLabel = qt.QLabel("Max Pixels per click:", self.maxPixelsFrame)
    self.maxPixelsLabel.setToolTip("Set the maxPixels for each click")
    self.maxPixelsFrame.layout().addWidget(self.maxPixelsLabel)
    self.widgets.append(self.maxPixelsLabel)
    self.maxPixelsSpinBox = qt.QDoubleSpinBox(self.maxPixelsFrame)
    self.maxPixelsSpinBox.setToolTip("Set the maxPixels for each click")
    self.maxPixelsSpinBox.minimum = 1
    self.maxPixelsSpinBox.maximum = 1000
    self.maxPixelsSpinBox.suffix = ""
    self.maxPixelsFrame.layout().addWidget(self.maxPixelsSpinBox)
    self.widgets.append(self.maxPixelsSpinBox)

    HelpButton(self.frame, "Use this tool to label all voxels that are within a tolerance of where you click")

    self.botButton.connect('clicked()', self.onStartBot)
    self.toleranceSpinBox.connect('valueChanged(double)', self.onToleranceSpinBoxChanged)
    self.maxPixelsSpinBox.connect('valueChanged(double)', self.onMaxPixelsSpinBoxChanged)

    # Add vertical spacer
    self.frame.layout().addStretch(1)

    # TODO: the functionality for the steered volume should migrate to
    # the edit helper class when functionality is finalized.
    backgroundVolume = self.editUtil.getBackgroundVolume()
    labelVolume = self.editUtil.getLabelVolume()
    steeredName = backgroundVolume.GetName() + '-steered'
    steeredVolume = slicer.util.getNode(steeredName)
    if not steeredVolume:
      volumesLogic = slicer.modules.volumes.logic()
      steeredVolume = volumesLogic.CloneVolume(
                           slicer.mrmlScene, labelVolume, steeredName)
    compositeNodes = slicer.util.getNodes('vtkMRMLSliceCompositeNode*')
    for compositeNode in compositeNodes.values():
      compositeNode.SetForegroundVolumeID(steeredVolume.GetID())
      compositeNode.SetForegroundOpacity(0.5)
    def setup(self):
        # Instantiate and connect widgets ...

        # Reload button
        self.reloadButton = qt.QPushButton("Reload")
        self.reloadButton.toolTip = "Reload this module."
        self.reloadButton.name = "CMRToolkitRegistrationBRAINSFit Reload"
        self.layout.addWidget(self.reloadButton)
        self.reloadButton.connect('clicked()', self.onReload)

        # Register Volume collapsible button
        registerVol = ctk.ctkCollapsibleButton()
        registerVol.text = "Register Volume"
        self.layout.addWidget(registerVol)

        # Layout within the Register Volume collapsible button
        formLayout = qt.QFormLayout(registerVol)

        # The image volume selectors
        self.fixedFrame = qt.QFrame(registerVol)
        self.fixedFrame.setLayout(qt.QHBoxLayout())
        formLayout.addWidget(self.fixedFrame)
        self.fixedSelector = qt.QLabel("Image Volume One (Fixed): ",
                                       self.fixedFrame)
        self.fixedFrame.layout().addWidget(self.fixedSelector)
        self.fixedSelector = slicer.qMRMLNodeComboBox(self.fixedFrame)
        self.fixedSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.fixedSelector.addEnabled = False
        self.fixedSelector.removeEnabled = False
        self.fixedSelector.renameEnabled = True
        self.fixedSelector.setMRMLScene(slicer.mrmlScene)
        self.fixedFrame.layout().addWidget(self.fixedSelector)

        self.movingFrame = qt.QFrame(registerVol)
        self.movingFrame.setLayout(qt.QHBoxLayout())
        formLayout.addWidget(self.movingFrame)
        self.movingSelector = qt.QLabel("Image Volume Two (Moving): ",
                                        self.movingFrame)
        self.movingFrame.layout().addWidget(self.movingSelector)
        self.movingSelector = slicer.qMRMLNodeComboBox(self.movingFrame)
        self.movingSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.movingSelector.addEnabled = False
        self.movingSelector.removeEnabled = False
        self.movingSelector.renameEnabled = True
        self.movingSelector.setMRMLScene(slicer.mrmlScene)
        self.movingFrame.layout().addWidget(self.movingSelector)

        self.outputFrame = qt.QFrame(registerVol)
        self.outputFrame.setLayout(qt.QHBoxLayout())
        formLayout.addWidget(self.outputFrame)
        self.outputSelector = qt.QLabel("Output Image Volume: ",
                                        self.outputFrame)
        self.outputFrame.layout().addWidget(self.outputSelector)
        self.outputSelector = slicer.qMRMLNodeComboBox(self.outputFrame)
        self.outputSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.outputSelector.setMRMLScene(slicer.mrmlScene)
        self.outputSelector.addEnabled = True
        self.outputSelector.renameEnabled = True
        self.outputSelector.baseName = "Registered Volume"
        self.outputFrame.layout().addWidget(self.outputSelector)

        # Imaging Modality selection
        self.presetFrame = qt.QFrame(registerVol)
        self.presetFrame.setLayout(qt.QHBoxLayout())
        formLayout.addWidget(self.presetFrame)
        self.presetSelector = qt.QLabel("Imaging Modality: ", self.presetFrame)
        self.presetFrame.layout().addWidget(self.presetSelector)
        self.presetComboBox = qt.QComboBox()
        self.presetComboBox.addItem("LGE-MRI to LGE-MRI")
        self.presetComboBox.addItem("MRA to LGE-MRI")
        self.presetComboBox.addItem("MRA to MRA")
        self.presetComboBox.addItem("CT to LGE-MRI")
        self.presetComboBox.addItem("Acute Scar to LGE-MRI")
        self.presetComboBox.setCurrentIndex(-1)
        self.presetFrame.layout().addWidget(self.presetComboBox)

        # Connect Imaging Modality widget to parameters widgets
        self.presetComboBox.connect('currentIndexChanged(QString)',
                                    self.setParameters)

        # Check box
        self.cropCheckBox = qt.QCheckBox(
            "Images are cropped to area around LA", registerVol)
        self.cropCheckBox.toolTip = "For best registration, indicate whether the volumes have been cropped to the Left Atrium ROI"
        formLayout.addWidget(self.cropCheckBox)

        # Connect check box to registration parameters
        self.cropCheckBox.connect('stateChanged(int)',
                                  self.croppedImagesParameters)

        # Register Volume button
        registerButton = qt.QPushButton("Apply Registration (BRAINSFit)")
        registerButton.toolTip = "Register Volume Two (Moving) onto Volume One (Fixed)."
        formLayout.addWidget(registerButton)
        registerButton.connect('clicked(bool)', self.onRegisterButtonClicked)

        # Initialization of Registration collapsible button
        #initOfRegn = ctk.ctkCollapsibleButton()
        #initOfRegn.text = "Initialization of Registration"
        #self.layout.addWidget(initOfRegn)

        # Layout within the Initialization of Registration collapsible button
        #formLayout2 = qt.QFormLayout(initOfRegn)

        # Registration Parameters collapsible button
        regnParameters = ctk.ctkCollapsibleButton()
        regnParameters.text = "Registration Parameters"
        regnParameters.collapsedHeight = 350
        regnParameters.collapsed = True
        self.layout.addWidget(regnParameters)

        # Layout within the Registration Parameters collapsible button
        formLayout3 = qt.QFormLayout(regnParameters)

        self.initOfRegnFrame = qt.QFrame(regnParameters)
        self.initOfRegnFrame.setLayout(qt.QHBoxLayout())
        formLayout3.addWidget(self.initOfRegnFrame)
        self.initOfRegnSelector = qt.QLabel(
            "Select the Type of Initialization: ", self.initOfRegnFrame)
        self.initOfRegnFrame.layout().addWidget(self.initOfRegnSelector)
        self.initOfRegnComboBox = qt.QComboBox()
        self.initOfRegnComboBox.addItem("useMomentsAlign")
        self.initOfRegnComboBox.addItem("useGeometryAlign")
        #self.initOfRegnComboBox.addItem("useCenterOfROIAlign")
        self.initOfRegnComboBox.toolTip = "GeometryAlign assumes that the center of the voxel lattice of the images represent similar structures. MomentsAlign assumes that the center of mass of the images represent similar structures."
        self.initOfRegnComboBox.setCurrentIndex(-1)
        self.initOfRegnFrame.layout().addWidget(self.initOfRegnComboBox)

        # Registration parameters
        self.regnFrame = qt.QFrame(regnParameters)
        self.regnFrame.setLayout(qt.QHBoxLayout())
        formLayout3.addWidget(self.regnFrame)
        self.regnSelector = qt.QLabel("Select the Type of Registration: ",
                                      self.regnFrame)
        self.regnFrame.layout().addWidget(self.regnSelector)
        self.regnComboBox = qt.QComboBox()
        self.regnComboBox.addItem("Rigid")
        self.regnComboBox.addItem("Affine")
        self.regnComboBox.addItem("BSpline")
        self.regnComboBox.setCurrentIndex(-1)
        self.regnFrame.layout().addWidget(self.regnComboBox)

        # Maximum number of iterations
        self.iterFrame = qt.QFrame(regnParameters)
        self.iterFrame.setLayout(qt.QHBoxLayout())
        formLayout3.addWidget(self.iterFrame)
        self.iterEditSelector = qt.QLabel(
            "Enter the Maximum Number of Iterations: ", self.iterFrame)
        self.iterFrame.layout().addWidget(self.iterEditSelector)
        self.iterSpinBox = qt.QSpinBox()
        self.iterSpinBox.setLayout(qt.QHBoxLayout())
        self.iterSpinBox.setMinimum(1)
        self.iterSpinBox.setMaximum(2000)
        self.iterSpinBox.setValue(0)
        self.iterSpinBox.toolTip = "The maximum number of iterations to try before failing to converge."
        self.iterFrame.layout().addWidget(self.iterSpinBox)

        # Number of samples
        self.sampFrame = qt.QFrame(regnParameters)
        self.sampFrame.setLayout(qt.QHBoxLayout())
        formLayout3.addWidget(self.sampFrame)
        self.sampSelector = qt.QLabel("Enter the Number of Samples: ",
                                      self.sampFrame)
        self.sampFrame.layout().addWidget(self.sampSelector)
        self.sampSpinBox = qt.QSpinBox()
        self.sampSpinBox.setLayout(qt.QHBoxLayout())
        self.sampSpinBox.setMinimum(0)
        self.sampSpinBox.setMaximum(5000000)
        self.sampSpinBox.setValue(0)
        self.sampSpinBox.toolTip = "The number of voxels sampled for mutual information computation. Increase this for a slower, more careful fit."
        self.sampFrame.layout().addWidget(self.sampSpinBox)

        # Minimum Step Length
        self.stepFrame = qt.QFrame(regnParameters)
        self.stepFrame.setLayout(qt.QHBoxLayout())
        formLayout3.addWidget(self.stepFrame)
        self.stepSelector = qt.QLabel("Enter the Minimum Step Length: ",
                                      self.stepFrame)
        self.stepFrame.layout().addWidget(self.stepSelector)
        self.stepSpinBox = qt.QDoubleSpinBox()
        self.stepSpinBox.setLayout(qt.QHBoxLayout())
        self.stepSpinBox.setMinimum(0)
        self.stepSpinBox.setMaximum(10)
        self.stepSpinBox.setDecimals(3)
        self.stepSpinBox.setValue(0.005)
        self.stepSpinBox.toolTip = "Each step in the optimization takes steps at least this big. When none are possible, registration is complete."
        self.stepFrame.layout().addWidget(self.stepSpinBox)

        # Transform Scale
        self.transFrame = qt.QFrame(regnParameters)
        self.transFrame.setLayout(qt.QHBoxLayout())
        formLayout3.addWidget(self.transFrame)
        self.transSelector = qt.QLabel("Enter the Transform Scale: ",
                                       self.transFrame)
        self.transFrame.layout().addWidget(self.transSelector)
        self.transSpinBox = qt.QDoubleSpinBox()
        self.transSpinBox.setLayout(qt.QHBoxLayout())
        self.transSpinBox.setMinimum(0)
        self.transSpinBox.setMaximum(5000)
        self.transSpinBox.setValue(1000)
        self.transSpinBox.toolTip = "How much to scale up changes in position compared to unit rotational changes in radians. Decrease this to put more rotation in the search pattern."
        self.transFrame.layout().addWidget(self.transSpinBox)

        # Reproportion Scale
        self.repropFrame = qt.QFrame(regnParameters)
        self.repropFrame.setLayout(qt.QHBoxLayout())
        formLayout3.addWidget(self.repropFrame)
        self.repropSelector = qt.QLabel("Enter the Reproportion Scale: ",
                                        self.repropFrame)
        self.repropFrame.layout().addWidget(self.repropSelector)
        self.repropSpinBox = qt.QDoubleSpinBox()
        self.repropSpinBox.setLayout(qt.QHBoxLayout())
        self.repropSpinBox.setMinimum(0)
        self.repropSpinBox.setMaximum(100)
        self.repropSpinBox.setValue(1.0)
        self.repropSpinBox.toolTip = "ScaleVersor3D 'Scale' compensation factor. Increase this to put more rescaling in a ScaleVersor3D or ScaleSkewVersor3D search pattern. 1.0 works well with a Translation Scale of 1000.0"
        self.repropFrame.layout().addWidget(self.repropSpinBox)

        # Skew Scale
        self.skewFrame = qt.QFrame(regnParameters)
        self.skewFrame.setLayout(qt.QHBoxLayout())
        formLayout3.addWidget(self.skewFrame)
        self.skewSelector = qt.QLabel("Enter the Skew Scale: ",
                                      self.repropFrame)
        self.skewFrame.layout().addWidget(self.skewSelector)
        self.skewSpinBox = qt.QDoubleSpinBox()
        self.skewSpinBox.setLayout(qt.QHBoxLayout())
        self.skewSpinBox.setMinimum(0)
        self.skewSpinBox.setMaximum(100)
        self.skewSpinBox.setValue(1.0)
        self.skewSpinBox.toolTip = "ScaleSkewVersor3D Skew compensation factor. Increase this to put more skew in a ScaleSkewVersor3D search pattern. 1.0 works well with a translationScale of 1000.0"
        self.skewFrame.layout().addWidget(self.skewSpinBox)

        # Interpolation options
        self.interpFrame = qt.QFrame(regnParameters)
        self.interpFrame.setLayout(qt.QHBoxLayout())
        formLayout3.addWidget(self.interpFrame)
        self.interpSelector = qt.QLabel("Select the Type of Interpolation: ",
                                        self.interpFrame)
        self.interpFrame.layout().addWidget(self.interpSelector)
        self.interpComboBox = qt.QComboBox()
        self.interpComboBox.setLayout(qt.QHBoxLayout())
        self.interpComboBox.addItem("NearestNeighbor")
        self.interpComboBox.addItem("Linear")
        self.interpComboBox.addItem("BSpline")
        self.interpComboBox.addItem("WindowedSinc")
        self.interpComboBox.addItem("RigidInPlace")
        self.interpComboBox.setCurrentIndex(-1)
        self.interpComboBox.toolTip = "Type of interpolation to be used when applying transform to moving volume."
        self.interpFrame.layout().addWidget(self.interpComboBox)

        # Metric Options
        self.metFrame = qt.QFrame(regnParameters)
        self.metFrame.setLayout(qt.QHBoxLayout())
        formLayout3.addWidget(self.metFrame)
        self.metSelector = qt.QLabel("Select the Type of Metric: ",
                                     self.metFrame)
        self.metFrame.layout().addWidget(self.metSelector)
        self.metComboBox = qt.QComboBox()
        self.metComboBox.setLayout(qt.QHBoxLayout())
        self.metComboBox.addItem("MMI")
        self.metComboBox.addItem("NC")
        self.metComboBox.addItem("MSE")
        self.metComboBox.addItem("MC")
        self.metComboBox.setCurrentIndex(-1)
        self.metComboBox.toolTip = "The cost metric to be used during fitting: MMI (Mattes Mutual Information), MSE (Mean Square Error), NC (Normalized Correlation) or MC (Match Cardinality for binary images)"
        self.metFrame.layout().addWidget(self.metComboBox)
Exemple #24
0
  def createUserInterface( self ):
    '''
    '''
    self.__layout = self.__parent.createUserInterface()

    self.__top = qt.QWidget()
    self.__topLayout = qt.QHBoxLayout( self.__top )

    # the anatomical tree
    self.__anatomicalTreeGroupBox = qt.QGroupBox()
    self.__anatomicalTreeGroupBox.setTitle( 'Anatomical Tree' )
    self.__topLayout.addWidget( self.__anatomicalTreeGroupBox )

    self.__anatomicalTreeGroupBoxLayout = qt.QFormLayout( self.__anatomicalTreeGroupBox )

    self.__anatomicalTree = PythonQt.qSlicerEMSegmentModuleWidgets.qSlicerEMSegmentAnatomicalTreeWidget()
    self.__anatomicalTree.structureNameEditable = False
    self.__anatomicalTree.labelColumnVisible = False
    self.__anatomicalTree.probabilityMapColumnVisible = False
    self.__anatomicalTree.classWeightColumnVisible = False
    self.__anatomicalTree.updateClassWeightColumnVisible = False
    self.__anatomicalTree.atlasWeightColumnVisible = False
    self.__anatomicalTree.alphaColumnVisible = False
    self.__anatomicalTree.displayAlphaCheckBoxVisible = False
    self.__anatomicalTree.connect( 'currentTreeNodeChanged(vtkMRMLNode*)', self.onTreeSelectionChanged )
    self.__anatomicalTree.setSizePolicy( qt.QSizePolicy.Expanding, qt.QSizePolicy.Expanding )
    self.__anatomicalTreeGroupBoxLayout.addWidget( self.__anatomicalTree )

    #
    # overview of class weights panel
    #
    self.__overviewBox = qt.QGroupBox()
    self.__overviewBox.title = 'Overview of Class Weights'
    self.__overviewBoxLayout = qt.QVBoxLayout( self.__overviewBox )
    self.__topLayout.addWidget( self.__overviewBox )



    self.__layout.addWidget( self.__top )

    self.__tabWidget = qt.QTabWidget()
    self.__layout.addWidget( self.__tabWidget )

    #
    # basicPage
    #
    self.__basicPage = qt.QWidget()
    self.__basicPageLayout = qt.QHBoxLayout( self.__basicPage )

    self.__basicPageLeft = qt.QWidget()
    self.__basicPageRight = qt.QWidget()
    self.__basicPageLayoutLeft = qt.QFormLayout( self.__basicPageLeft )
    self.__basicPageLayoutRight = qt.QFormLayout( self.__basicPageRight )

    self.__basicPageLayout.addWidget( self.__basicPageLeft )
    self.__basicPageLayout.addWidget( self.__basicPageRight )

    self.__classLabel = qt.QLabel( "XX" )
    self.__basicPageLayoutLeft.addRow( "Class:", self.__classLabel )

    self.__classWeightSpinBox = qt.QDoubleSpinBox()
    self.__classWeightSpinBox.minimum = 0
    self.__classWeightSpinBox.maximum = 1
    self.__classWeightSpinBox.singleStep = 0.01
    self.__basicPageLayoutLeft.addRow( "Class Weight:", self.__classWeightSpinBox )
    self.__classWeightSpinBox.connect( 'valueChanged(double)', self.propagateToMRML )

    self.__atlasWeightSpinBox = qt.QDoubleSpinBox()
    self.__atlasWeightSpinBox.minimum = 0
    self.__atlasWeightSpinBox.maximum = 1
    self.__atlasWeightSpinBox.singleStep = 0.01
    self.__basicPageLayoutLeft.addRow( "Atlas Weight:", self.__atlasWeightSpinBox )
    self.__atlasWeightSpinBox.connect( 'valueChanged(double)', self.propagateToMRML )

    self.__mfaWeightSpinBox = qt.QDoubleSpinBox()
    self.__mfaWeightSpinBox.minimum = 0
    self.__mfaWeightSpinBox.maximum = 1
    self.__mfaWeightSpinBox.singleStep = 0.01
    self.__basicPageLayoutLeft.addRow( "MFA Weight:", self.__mfaWeightSpinBox )
    self.__mfaWeightSpinBox.connect( 'valueChanged(double)', self.propagateToMRML )

    self.__dummyLabel6 = qt.QLabel( "  " )
    self.__basicPageLayoutRight.addRow( "  ", self.__dummyLabel6 )

    self.__dummyLabel9 = qt.QLabel( "  " )
    self.__basicPageLayoutRight.addRow( "  ", self.__dummyLabel9 )

    self.__inputChannelWeightsBox = qt.QGroupBox()
    self.__inputChannelWeightsBox.title = 'Input Channel Weights'
    self.__inputChannelWeightsBoxLayout = qt.QFormLayout( self.__inputChannelWeightsBox )
    self.__basicPageLayoutRight.addWidget( self.__inputChannelWeightsBox )

    #
    # stoppingConditionsPage
    #
    self.__stoppingConditionsPage = qt.QWidget()
    self.__stoppingConditionsPageLayout = qt.QHBoxLayout( self.__stoppingConditionsPage )

    self.__stoppingConditionsPageLeft = qt.QWidget()
    self.__stoppingConditionsPageRight = qt.QWidget()
    self.__stoppingConditionsPageLayoutLeft = qt.QFormLayout( self.__stoppingConditionsPageLeft )
    self.__stoppingConditionsPageLayoutRight = qt.QFormLayout( self.__stoppingConditionsPageRight )

    self.__stoppingConditionsPageLayout.addWidget( self.__stoppingConditionsPageLeft )
    self.__stoppingConditionsPageLayout.addWidget( self.__stoppingConditionsPageRight )

    self.__classLabel2 = qt.QLabel( "XX" )
    self.__stoppingConditionsPageLayoutLeft.addRow( "Class:", self.__classLabel2 )

    self.__emComboBox = qt.QComboBox()
    self.__emComboBox.addItems( Helper.GetStoppingConditionTypes() )
    self.__stoppingConditionsPageLayoutLeft.addRow( 'EM:', self.__emComboBox )
    self.__emComboBox.connect( 'currentIndexChanged(int)', self.propagateToMRML )

    self.__mfaComboBox = qt.QComboBox()
    self.__mfaComboBox.addItems( Helper.GetStoppingConditionTypes() )
    self.__stoppingConditionsPageLayoutLeft.addRow( 'MFA:', self.__mfaComboBox )
    self.__mfaComboBox.connect( 'currentIndexChanged(int)', self.propagateToMRML )

    self.__dummyLabel = qt.QLabel( "  " )
    self.__stoppingConditionsPageLayoutRight.addRow( "  ", self.__dummyLabel )

    self.__dummyLabel8 = qt.QLabel( "  " )
    self.__stoppingConditionsPageLayoutRight.addRow( "  ", self.__dummyLabel8 )

    self.__emValueSpinBox = qt.QSpinBox()
    self.__emValueSpinBox.minimum = 0
    self.__emValueSpinBox.singleStep = 1
    self.__stoppingConditionsPageLayoutRight.addRow( 'Iterations:', self.__emValueSpinBox )
    self.__emValueSpinBox.connect( 'valueChanged(int)', self.propagateToMRML )

    self.__mfaValueSpinBox = qt.QSpinBox()
    self.__mfaValueSpinBox.minimum = 0
    self.__mfaValueSpinBox.singleStep = 1
    self.__stoppingConditionsPageLayoutRight.addRow( 'Iterations:', self.__mfaValueSpinBox )
    self.__mfaValueSpinBox.connect( 'valueChanged(int)', self.propagateToMRML )

    self.__biasSpinBox = qt.QSpinBox()
    self.__biasSpinBox.minimum = -1
    self.__biasSpinBox.singleStep = 1
    self.__stoppingConditionsPageLayoutRight.addRow( 'Bias Iterations:', self.__biasSpinBox )
    self.__biasSpinBox.connect( 'valueChanged(int)', self.propagateToMRML )


    #
    # printPage
    #
    self.__printPage = qt.QWidget()
    self.__printPageLayout = qt.QHBoxLayout( self.__printPage )

    self.__printPageLeft = qt.QWidget()
    self.__printPageRight = qt.QWidget()
    self.__printPageLayoutLeft = qt.QFormLayout( self.__printPageLeft )
    self.__printPageLayoutRight = qt.QFormLayout( self.__printPageRight )

    self.__printPageLayout.addWidget( self.__printPageLeft )
    self.__printPageLayout.addWidget( self.__printPageRight )

    self.__classLabel3 = qt.QLabel( "XX" )
    self.__printPageLayoutLeft.addRow( "Class:", self.__classLabel3 )

    self.__weightCheckBox = qt.QCheckBox()
    self.__printPageLayoutLeft.addRow( "Weight:", self.__weightCheckBox )
    self.__weightCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )

    self.__qualityCheckBox = qt.QCheckBox()
    self.__printPageLayoutLeft.addRow( "Quality:", self.__qualityCheckBox )
    self.__qualityCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )

    self.__frequencySpinBox = qt.QSpinBox()
    self.__frequencySpinBox.minimum = 0
    self.__frequencySpinBox.maximum = 20
    self.__printPageLayoutLeft.addRow( "Frequency:", self.__frequencySpinBox )
    self.__frequencySpinBox.connect( 'valueChanged(int)', self.propagateToMRML )

    self.__biasCheckBox = qt.QCheckBox()
    self.__printPageLayoutLeft.addRow( "Bias:", self.__biasCheckBox )
    self.__biasCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )

    self.__labelMapCheckBox = qt.QCheckBox()
    self.__printPageLayoutLeft.addRow( "Label Map:", self.__labelMapCheckBox )
    self.__labelMapCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )

    self.__dummyLabel2 = qt.QLabel( "  " )
    self.__printPageLayoutRight.addRow( "  ", self.__dummyLabel2 )

    self.__dummyLabel3 = qt.QLabel( "  " )
    self.__printPageLayoutRight.addRow( "  ", self.__dummyLabel3 )

    self.__convergenceBox = qt.QGroupBox()
    self.__convergenceBox.title = 'Convergence'
    self.__convergenceBoxLayout = qt.QFormLayout( self.__convergenceBox )
    self.__printPageLayoutRight.addWidget( self.__convergenceBox )

    self.__convEMLabelMapCheckBox = qt.QCheckBox()
    self.__convergenceBoxLayout.addRow( "EM Label Map:", self.__convEMLabelMapCheckBox )
    self.__convEMLabelMapCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )

    self.__convEMWeightsCheckBox = qt.QCheckBox()
    self.__convergenceBoxLayout.addRow( "EM Weights:", self.__convEMWeightsCheckBox )
    self.__convEMWeightsCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )

    self.__convMFALabelMapCheckBox = qt.QCheckBox()
    self.__convergenceBoxLayout.addRow( "MFA Label Map:", self.__convMFALabelMapCheckBox )
    self.__convMFALabelMapCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )

    self.__convMFAWeightsCheckBox = qt.QCheckBox()
    self.__convergenceBoxLayout.addRow( "MFA Weights:", self.__convMFAWeightsCheckBox )
    self.__convMFAWeightsCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )


    #
    # advancedPage
    #
    self.__advancedPage = qt.QWidget()
    self.__advancedPageLayout = qt.QFormLayout( self.__advancedPage )

    self.__dummyLabel14 = qt.QLabel( "  " )
    self.__advancedPageLayout.addWidget( self.__dummyLabel14 )

    self.__classLabel4 = qt.QLabel( "Class: XX" )
    self.__advancedPageLayout.addWidget( self.__classLabel4 )

#    self.__pcaParametersBox = qt.QGroupBox()
#    self.__pcaParametersBox.title = 'PCA Parameters'
#    self.__pcaParametersBoxLayout = qt.QFormLayout( self.__pcaParametersBox )
#    self.__advancedPageLayout.addWidget( self.__pcaParametersBox )
#
#    self.__registrationParametersBox = qt.QGroupBox()
#    self.__registrationParametersBox.title = 'Registration Parameters'
#    self.__registrationParametersBoxLayout = qt.QFormLayout( self.__registrationParametersBox )
#    self.__advancedPageLayout.addWidget( self.__registrationParametersBox )

    self.__miscParametersBox = qt.QGroupBox()
    self.__miscParametersBox.title = 'Miscellaneous Parameters'
    self.__miscParametersBoxLayout = qt.QFormLayout( self.__miscParametersBox )
    self.__advancedPageLayout.addWidget( self.__miscParametersBox )

    self.__excludeFromEStepCheckBox = qt.QCheckBox()
    self.__miscParametersBoxLayout.addRow( "Exclude From Incomplete EStep:", self.__excludeFromEStepCheckBox )
    self.__excludeFromEStepCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )

    self.__genBackgroundProbCheckBox = qt.QCheckBox()
    self.__miscParametersBoxLayout.addRow( "Generate Background Probability:", self.__genBackgroundProbCheckBox )
    self.__genBackgroundProbCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )

    self.__meanFieldParametersBox = qt.QGroupBox()
    self.__meanFieldParametersBox.title = 'Mean Field Parameters'
    self.__meanFieldParametersBoxLayout = qt.QFormLayout( self.__meanFieldParametersBox )
    self.__advancedPageLayout.addWidget( self.__meanFieldParametersBox )

    self.__twoDNeighborhoodCheckBox = qt.QCheckBox()
    self.__meanFieldParametersBoxLayout.addRow( "2D Neighborhood:", self.__twoDNeighborhoodCheckBox )
    self.__twoDNeighborhoodCheckBox.connect( 'stateChanged(int)', self.propagateToMRML )

#    self.__inhomogeneityParametersBox = qt.QGroupBox()
#    self.__inhomogeneityParametersBox.title = 'Inhomogeneity Parameters'
#    self.__inhomogeneityParametersBoxLayout = qt.QFormLayout( self.__inhomogeneityParametersBox )
#    self.__advancedPageLayout.addWidget( self.__inhomogeneityParametersBox )


    #
    ### add all tabs to the tabWidget
    #
    self.__tabWidget.addTab( self.__basicPage, "Basic" )
    self.__tabWidget.addTab( self.__stoppingConditionsPage, "Stopping Conditions" )
    self.__tabWidget.addTab( self.__printPage, "Print" )
    self.__tabWidget.addTab( self.__advancedPage, "Advanced" )
Exemple #25
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        self.markupsNodeObservations = []

        # Instantiate and connect widgets ...

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

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

        #
        # slice role selector
        #

        self.axialSliceSelector = slicer.qMRMLNodeComboBox()
        self.axialSliceSelector.nodeTypes = (("vtkMRMLSliceNode"), "")
        self.axialSliceSelector.selectNodeUponCreation = False
        self.axialSliceSelector.addEnabled = False
        self.axialSliceSelector.removeEnabled = False
        self.axialSliceSelector.noneEnabled = True
        self.axialSliceSelector.showHidden = False
        self.axialSliceSelector.showChildNodeTypes = False
        self.axialSliceSelector.setMRMLScene(slicer.mrmlScene)
        self.axialSliceSelector.setToolTip(
            "Pick the slice that will show the transverse view.")
        parametersFormLayout.addRow("Axial view: ", self.axialSliceSelector)
        self.axialSliceSelector.setCurrentNode(
            slicer.mrmlScene.GetNodeByID('vtkMRMLSliceNodeRed'))

        self.orthogonalSlice1Selector = slicer.qMRMLNodeComboBox()
        self.orthogonalSlice1Selector.nodeTypes = (("vtkMRMLSliceNode"), "")
        self.orthogonalSlice1Selector.selectNodeUponCreation = False
        self.orthogonalSlice1Selector.addEnabled = False
        self.orthogonalSlice1Selector.removeEnabled = False
        self.orthogonalSlice1Selector.noneEnabled = True
        self.orthogonalSlice1Selector.showHidden = False
        self.orthogonalSlice1Selector.showChildNodeTypes = False
        self.orthogonalSlice1Selector.setMRMLScene(slicer.mrmlScene)
        self.orthogonalSlice1Selector.setToolTip(
            "Pick the slice that will show a plane orthogonal to the axial slice."
        )
        parametersFormLayout.addRow("Orthogonal view 1: ",
                                    self.orthogonalSlice1Selector)
        self.orthogonalSlice1Selector.setCurrentNode(
            slicer.mrmlScene.GetNodeByID('vtkMRMLSliceNodeYellow'))

        self.orthogonalSlice2Selector = slicer.qMRMLNodeComboBox()
        self.orthogonalSlice2Selector.nodeTypes = (("vtkMRMLSliceNode"), "")
        self.orthogonalSlice2Selector.selectNodeUponCreation = False
        self.orthogonalSlice2Selector.addEnabled = False
        self.orthogonalSlice2Selector.removeEnabled = False
        self.orthogonalSlice2Selector.noneEnabled = True
        self.orthogonalSlice1Selector.showHidden = False
        self.orthogonalSlice2Selector.showChildNodeTypes = False
        self.orthogonalSlice2Selector.setMRMLScene(slicer.mrmlScene)
        self.orthogonalSlice2Selector.setToolTip(
            "Pick the slice that will show a plane orthogonal to the two other slices."
        )
        parametersFormLayout.addRow("Orthogonal view 2: ",
                                    self.orthogonalSlice2Selector)
        self.orthogonalSlice2Selector.setCurrentNode(
            slicer.mrmlScene.GetNodeByID('vtkMRMLSliceNodeGreen'))

        #
        # Orthogonal slice rotation
        #

        self.lastOrthogonalSlicerRotationVale = 0

        self.orthogonalSlicerRotationSliderWidget = ctk.ctkSliderWidget()
        self.orthogonalSlicerRotationSliderWidget.singleStep = 1
        self.orthogonalSlicerRotationSliderWidget.minimum = -360
        self.orthogonalSlicerRotationSliderWidget.maximum = 360
        self.orthogonalSlicerRotationSliderWidget.value = self.lastOrthogonalSlicerRotationVale
        self.orthogonalSlicerRotationSliderWidget.setToolTip(
            "Rotation angle of the orthogonal views")
        parametersFormLayout.addRow("Rotation angle",
                                    self.orthogonalSlicerRotationSliderWidget)

        orthogonalSlicerRotationBox = qt.QHBoxLayout()

        self.orthogonalSlicerRotationStepSizeSpinBox = qt.QDoubleSpinBox()
        self.orthogonalSlicerRotationStepSizeSpinBox.setToolTip(
            "Increment value by that a single button press changes the orthogonal view angle"
        )
        self.orthogonalSlicerRotationStepSizeSpinBox.value = 20
        self.orthogonalSlicerRotationStepSizeSpinBox.minimum = 0.1
        self.orthogonalSlicerRotationStepSizeSpinBox.maximum = 90
        self.orthogonalSlicerRotationStepSizeSpinBox.singleStep = 5
        self.orthogonalSlicerRotationStepSizeSpinBox.decimals = 1
        orthogonalSlicerRotationBox.addWidget(
            self.orthogonalSlicerRotationStepSizeSpinBox)

        self.orthogonalSliceRotationAngleDecButton = qt.QPushButton()
        self.orthogonalSliceRotationAngleDecButton.text = "<"
        orthogonalSlicerRotationBox.addWidget(
            self.orthogonalSliceRotationAngleDecButton)

        self.orthogonalSliceRotationAngleIncButton = qt.QPushButton()
        self.orthogonalSliceRotationAngleIncButton.text = ">"
        orthogonalSlicerRotationBox.addWidget(
            self.orthogonalSliceRotationAngleIncButton)

        parametersFormLayout.addRow("", orthogonalSlicerRotationBox)

        #
        # Parameters Area
        #
        autoRotateCollapsibleButton = ctk.ctkCollapsibleButton()
        autoRotateCollapsibleButton.text = "Auto-rotate"
        autoRotateFormLayout = qt.QFormLayout(autoRotateCollapsibleButton)
        self.layout.addWidget(autoRotateCollapsibleButton)

        self.markupsNodeSelector = slicer.qMRMLNodeComboBox()
        self.markupsNodeSelector.nodeTypes = ["vtkMRMLMarkupsClosedCurveNode"]
        self.markupsNodeSelector.addEnabled = False
        self.markupsNodeSelector.removeEnabled = True
        self.markupsNodeSelector.noneEnabled = True
        self.markupsNodeSelector.setMRMLScene(slicer.mrmlScene)
        self.markupsNodeSelector.setToolTip(
            "Pick a closed curve node that should make the rotation advance automatically upon point placement."
        )
        autoRotateFormLayout.addRow("Closed curve node: ",
                                    self.markupsNodeSelector)

        # connections
        self.orthogonalSliceRotationAngleDecButton.connect(
            'clicked(bool)', self.onOrthogonalSlicerRotationAngleDec)
        self.orthogonalSliceRotationAngleIncButton.connect(
            'clicked(bool)', self.onOrthogonalSlicerRotationAngleInc)
        self.orthogonalSlicerRotationSliderWidget.connect(
            'valueChanged(double)',
            self.onOrthogonalSlicerRotationAngleChanged)
        self.markupsNodeSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                         self.onMarkupsNodeSelectionChanged)

        # Add vertical spacer
        self.layout.addStretch(1)

        # Refresh Apply button state
        self.onSelect()
Exemple #26
0
    def create(self):
        super(PaintEffectOptions, self).create()

        labelVolume = self.editUtil.getLabelVolume()
        if labelVolume and labelVolume.GetImageData():
            spacing = labelVolume.GetSpacing()
            dimensions = labelVolume.GetImageData().GetDimensions()
            self.minimumRadius = 0.5 * min(spacing)
            bounds = [a * b for a, b in zip(spacing, dimensions)]
            self.maximumRadius = 0.5 * max(bounds)
        else:
            self.minimumRadius = 0.01
            self.maximumRadius = 100

        self.radiusFrame = qt.QFrame(self.frame)
        self.radiusFrame.setLayout(qt.QHBoxLayout())
        self.frame.layout().addWidget(self.radiusFrame)
        self.widgets.append(self.radiusFrame)
        self.radiusLabel = qt.QLabel("Radius:", self.radiusFrame)
        self.radiusLabel.setToolTip(
            "Set the radius of the paint brush in millimeters")
        self.radiusFrame.layout().addWidget(self.radiusLabel)
        self.widgets.append(self.radiusLabel)
        self.radiusSpinBox = qt.QDoubleSpinBox(self.radiusFrame)
        self.radiusSpinBox.setToolTip(
            "Set the radius of the paint brush in millimeters")
        self.radiusSpinBox.minimum = self.minimumRadius
        self.radiusSpinBox.maximum = self.maximumRadius
        self.radiusSpinBox.suffix = "mm"
        from math import log, floor
        decimals = floor(log(self.minimumRadius, 10))
        if decimals < 0:
            self.radiusSpinBox.decimals = -decimals + 2
        self.radiusFrame.layout().addWidget(self.radiusSpinBox)
        self.widgets.append(self.radiusSpinBox)
        self.radiusUnitsToggle = qt.QPushButton("px:")
        self.radiusUnitsToggle.setToolTip(
            "Toggle radius quick set buttons between mm and label volume pixel size units"
        )
        self.radiusUnitsToggle.setFixedWidth(35)
        self.radiusFrame.layout().addWidget(self.radiusUnitsToggle)
        self.radiusUnitsToggle.connect('clicked()', self.onRadiusUnitsToggle)
        self.radiusQuickies = {}
        quickies = ((2, self.onQuickie2Clicked), (3, self.onQuickie3Clicked),
                    (4, self.onQuickie4Clicked), (5, self.onQuickie5Clicked),
                    (10, self.onQuickie10Clicked), (20,
                                                    self.onQuickie20Clicked))
        for rad, callback in quickies:
            self.radiusQuickies[rad] = qt.QPushButton(str(rad))
            self.radiusFrame.layout().addWidget(self.radiusQuickies[rad])
            self.radiusQuickies[rad].setFixedWidth(25)
            self.radiusQuickies[rad].connect('clicked()', callback)
            self.radiusQuickies[rad].setToolTip(
                "Set radius based on mm or label voxel size units depending on toggle value"
            )

        self.radius = ctk.ctkDoubleSlider(self.frame)
        self.radius.minimum = self.minimumRadius
        self.radius.maximum = self.maximumRadius
        self.radius.orientation = 1
        self.radius.singleStep = self.minimumRadius
        self.frame.layout().addWidget(self.radius)
        self.widgets.append(self.radius)

        self.smudge = qt.QCheckBox("Smudge", self.frame)
        self.smudge.setToolTip(
            "Set the label number automatically by sampling the pixel location where the brush stroke starts."
        )
        self.frame.layout().addWidget(self.smudge)
        self.widgets.append(self.smudge)

        EditorLib.HelpButton(
            self.frame,
            "Use this tool to paint with a round brush of the selected radius")

        self.connections.append(
            (self.smudge, 'clicked()', self.updateMRMLFromGUI))
        self.connections.append(
            (self.radius, 'valueChanged(double)', self.onRadiusValueChanged))
        self.connections.append((self.radiusSpinBox, 'valueChanged(double)',
                                 self.onRadiusSpinBoxChanged))

        # Add vertical spacer
        self.frame.layout().addStretch(1)

        # set the node parameters that are dependent on the input data
        self.parameterNode.SetParameter("PaintEffect,radius",
                                        str(self.minimumRadius * 10))
Exemple #27
0
  def create(self):
    super(WatershedFromMarkerEffectOptions,self).create()

    if not HAVE_SIMPLEITK:
      self.warningLabel = qt.QLabel()
      self.warningLabel.text = "WatershedFromMarker is not available because\nSimpleITK is not available in this build"
      self.widgets.append(self.warningLabel)
      self.frame.layout().addWidget(self.warningLabel)
      return

    labelVolume = self.editUtil.getLabelVolume()
    if labelVolume and labelVolume.GetImageData():
      spacing = labelVolume.GetSpacing()
      self.minimumSigma = 0.1 * min(spacing)
      self.maximumSigma = 100 * self.minimumSigma
    else:
      self.minimumSigma = 0.1
      self.maximumSigma = 10


    self.sigmaFrame = qt.QFrame(self.frame)
    self.sigmaFrame.setLayout(qt.QHBoxLayout())
    self.frame.layout().addWidget(self.sigmaFrame)
    self.widgets.append(self.sigmaFrame)

    tip = "Increasing this value smooths the segmentation and reduces leaks. This is the sigma used for edge detection."
    self.sigmaLabel = qt.QLabel("Object Scale: ", self.frame)
    self.sigmaLabel.setToolTip(tip)
    self.sigmaFrame.layout().addWidget(self.sigmaLabel)
    self.widgets.append(self.sigmaLabel)

    self.sigmaSlider = qt.QSlider( qt.Qt.Horizontal, self.frame )
    self.sigmaFrame.layout().addWidget(self.sigmaSlider)
    self.sigmaFrame.setToolTip(tip)
    self.widgets.append(self.sigmaSlider)

    self.sigmaSpinBox = qt.QDoubleSpinBox(self.frame)
    self.sigmaSpinBox.setToolTip(tip)
    self.sigmaSpinBox.suffix = "mm"

    self.sigmaFrame.layout().addWidget(self.sigmaSpinBox)
    self.widgets.append(self.sigmaSpinBox)

    self.sigmaSpinBox.minimum = self.minimumSigma
    self.sigmaSlider.minimum = self.minimumSigma
    self.sigmaSpinBox.maximum = self.maximumSigma
    self.sigmaSlider.maximum = self.maximumSigma

    decimals = math.floor(math.log(self.minimumSigma,10))
    if decimals < 0:
      self.sigmaSpinBox.decimals = -decimals + 2


    self.apply = qt.QPushButton("Apply", self.frame)
    self.apply.setToolTip("Apply the extension operation")

    self.frame.layout().addWidget(self.apply)
    self.widgets.append(self.apply)

    helpDoc = \
        """Use this effect to apply the watershed from markers segmentation from multiple initial labels.

The input to this filter is current labelmap image which is expected to contain multiple labels as initial markss. The marks or labels are grown to fill the image and with edges defining the bondaries between. To segment a single object, mark the object, and then it is suggested to surround the object with a negative label on each axis.

The "Object Scale" parameter is use to adjust the smoothness of the output image and prevent leakage. It is used internally for the sigma of the gradient magnitude.
    """
    HelpButton(self.frame, helpDoc)



    self.sigmaSlider.connect( 'valueChanged(int)', self.sigmaSpinBox.setValue )
    self.sigmaSpinBox.connect( 'valueChanged(double)', self.sigmaSlider.setValue )

    # if either widget is changed both should change and this should be triggered
    self.connections.append( ( self.sigmaSpinBox, 'valueChanged(double)', self.onSigmaValueChanged ) )

    self.connections.append( (self.apply, 'clicked()', self.onApply) )

    # Add vertical spacer
    self.frame.layout().addStretch(1)
Exemple #28
0
    def setup(self):

        w = qt.QWidget()
        layout = qt.QGridLayout()
        w.setLayout(layout)
        self.layout.addWidget(w)
        w.show()
        self.layout = layout

        ####################IMPORTAR VOLUMEN 4D#################################################3

        ### Se crea la sección para cargar el volumen 4D en una pestaña desplegable
        importDataCollapsibleButton = ctk.ctkCollapsibleButton()
        importDataCollapsibleButton.text = "Import Data"
        self.layout.addWidget(importDataCollapsibleButton)

        importDataFormLayout = qt.QFormLayout(importDataCollapsibleButton)

        #### Crear desplegable para seleccionar dirección del volumen
        self.__fDialog = ctk.ctkDirectoryButton()
        self.__fDialog.caption = 'Input directory'
        importDataFormLayout.addRow('Input directory:', self.__fDialog)

        ###Selector de volumen donde se guardara el volumen de la direccion
        self.outputSelector = slicer.qMRMLNodeComboBox()
        self.outputSelector.nodeTypes = ['vtkMRMLMultiVolumeNode']
        self.outputSelector.addEnabled = True  # Se habilita la posibildad al usuario de crear un nuevo nodo con este widget
        self.outputSelector.removeEnabled = False  # Se le quita al usuario la posibilidad de eliminar el nodo seleccionado en ese momento
        self.outputSelector.setMRMLScene(slicer.mrmlScene)
        importDataFormLayout.addRow("Output node:", self.outputSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            self.outputSelector, 'setMRMLScene(vtkMRMLScene*)')

        ### Parametros avanzados

        self.__dicomTag = qt.QLineEdit()
        self.__dicomTag.text = 'NA'
        importDataFormLayout.addRow('Frame identifying DICOM tag:',
                                    self.__dicomTag)

        self.__veLabel = qt.QLineEdit()
        self.__veLabel.text = 'na'
        importDataFormLayout.addRow('Frame identifying units:', self.__veLabel)

        self.__veInitial = qt.QDoubleSpinBox()
        self.__veInitial.value = 0
        importDataFormLayout.addRow('Initial value:', self.__veInitial)

        self.__veStep = qt.QDoubleSpinBox()
        self.__veStep.value = 1
        importDataFormLayout.addRow('Step:', self.__veStep)

        self.__te = qt.QDoubleSpinBox()
        self.__te.value = 1
        importDataFormLayout.addRow('EchoTime:', self.__te)

        self.__tr = qt.QDoubleSpinBox()
        self.__tr.value = 1
        importDataFormLayout.addRow('RepetitionTime:', self.__tr)

        self.__fa = qt.QDoubleSpinBox()
        self.__fa.value = 1
        importDataFormLayout.addRow('FlipAngle:', self.__fa)

        # Botón de importar

        self.buttonImport = qt.QPushButton("Import")
        self.buttonImport.toolTip = "Run the algorithm."
        ##self.buttonImport.enabled = True
        importDataFormLayout.addRow("                                       ",
                                    self.buttonImport)

        self.buttonImport.connect('clicked(bool)', self.importFunction)
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        # Instantiate and connect widgets ...

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

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

        # Volume selector
        self.inputVolumeSelectorLabel = qt.QLabel()
        self.inputVolumeSelectorLabel.setText("Input volume: ")
        self.inputVolumeSelector = slicer.qMRMLNodeComboBox()
        self.inputVolumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "")
        self.inputVolumeSelector.noneEnabled = False
        self.inputVolumeSelector.addEnabled = False
        self.inputVolumeSelector.removeEnabled = False
        self.inputVolumeSelector.setMRMLScene(slicer.mrmlScene)
        self.inputVolumeSelector.setToolTip("Pick the volume to clip")
        parametersFormLayout.addRow(self.inputVolumeSelectorLabel,
                                    self.inputVolumeSelector)

        # ROI selector
        self.clippingRoiSelectorLabel = qt.QLabel()
        self.clippingRoiSelectorLabel.setText("Clipping ROI: ")
        self.clippingRoiSelector = slicer.qMRMLNodeComboBox()
        self.clippingRoiSelector.nodeTypes = ("vtkMRMLAnnotationROINode", "")
        self.clippingRoiSelector.noneEnabled = False
        self.clippingRoiSelector.selectNodeUponCreation = True
        self.clippingRoiSelector.setMRMLScene(slicer.mrmlScene)
        self.clippingRoiSelector.setToolTip(
            "Pick the clipping region of interest (ROI)")
        parametersFormLayout.addRow(self.clippingRoiSelectorLabel,
                                    self.clippingRoiSelector)

        #
        # clip inside/outside the surface
        #
        self.clipOutsideSurfaceCheckBox = qt.QCheckBox()
        self.clipOutsideSurfaceCheckBox.checked = False
        self.clipOutsideSurfaceCheckBox.setToolTip(
            "If checked, voxel values will be filled outside the clipping ROI."
        )
        parametersFormLayout.addRow("Clip outside: ",
                                    self.clipOutsideSurfaceCheckBox)

        # Fill value editor
        self.fillValueLabel = qt.QLabel("Fill value:")
        self.fillValueEdit = qt.QDoubleSpinBox()
        self.fillValueEdit.minimum = -32768
        self.fillValueEdit.maximum = 65535
        parametersFormLayout.addRow(self.fillValueLabel, self.fillValueEdit)

        #
        # output volume selector
        #
        self.outputVolumeSelector = slicer.qMRMLNodeComboBox()
        self.outputVolumeSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "")
        self.outputVolumeSelector.selectNodeUponCreation = True
        self.outputVolumeSelector.addEnabled = True
        self.outputVolumeSelector.removeEnabled = True
        self.outputVolumeSelector.noneEnabled = False
        self.outputVolumeSelector.showHidden = False
        self.outputVolumeSelector.setMRMLScene(slicer.mrmlScene)
        self.outputVolumeSelector.setToolTip(
            "Clipped output volume. It may be the same as the input volume for cumulative clipping."
        )
        parametersFormLayout.addRow("Output Volume: ",
                                    self.outputVolumeSelector)

        # Apply button
        self.applyButton = qt.QPushButton("Apply")
        self.applyButton.toolTip = "Clip volume with ROI"
        parametersFormLayout.addWidget(self.applyButton)
        self.updateApplyButtonState()

        # connections
        self.applyButton.connect("clicked()", self.onApply)

        self.inputVolumeSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                         self.onInputVolumeSelect)
        self.clippingRoiSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                         self.onClippingRoiSelect)
        self.outputVolumeSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                          self.onOutputVolumeSelect)

        # Define list of widgets for updateGUIFromParameterNode, updateParameterNodeFromGUI, and addGUIObservers
        self.valueEditWidgets = {
            "ClipOutsideSurface": self.clipOutsideSurfaceCheckBox,
            "FillValue": self.fillValueEdit
        }
        self.nodeSelectorWidgets = {
            "InputVolume": self.inputVolumeSelector,
            "ClippingRoi": self.clippingRoiSelector,
            "OutputVolume": self.outputVolumeSelector
        }

        # Use singleton parameter node (it is created if does not exist yet)
        parameterNode = self.logic.getParameterNode()
        # Set parameter node (widget will observe it and also updates GUI)
        self.setAndObserveParameterNode(parameterNode)

        self.addGUIObservers()

        # Add vertical spacer
        self.layout.addStretch(1)
Exemple #30
0
  def setup(self):

    w = qt.QWidget();
    layout = qt.QGridLayout();
    w.setLayout(layout);
    self.layout.addWidget(w);
    w.show();
    self.layout = layout;

####################IMPORTAR VOLUMEN 4D#################################################3

### Se crea la sección para cargar el volumen 4D en una pestaña desplegable
    importDataCollapsibleButton = ctk.ctkCollapsibleButton()
    importDataCollapsibleButton.text = "Import Data"
    self.layout.addWidget(importDataCollapsibleButton)

    importDataFormLayout = qt.QFormLayout(importDataCollapsibleButton)


#### Crear desplegable para seleccionar dirección del volumen
    self.__fDialog = ctk.ctkDirectoryButton()
    self.__fDialog.caption = 'Input directory'
    importDataFormLayout.addRow('Input directory:', self.__fDialog)


 ###Selector de volumen donde se guardara el volumen de la direccion
    self.outputSelector = slicer.qMRMLNodeComboBox()
    self.outputSelector.nodeTypes = ['vtkMRMLMultiVolumeNode']
    self.outputSelector.addEnabled = True  # Se habilita la posibildad al usuario de crear un nuevo nodo con este widget
    self.outputSelector.removeEnabled = False  # Se le quita al usuario la posibilidad de eliminar el nodo seleccionado en ese momento
    self.outputSelector.setMRMLScene(slicer.mrmlScene)
    importDataFormLayout.addRow("Output node:", self.outputSelector)
    self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.outputSelector, 'setMRMLScene(vtkMRMLScene*)')  


### Parametros avanzados
    
    self.__dicomTag = qt.QLineEdit()
    self.__dicomTag.text = 'NA'
    importDataFormLayout.addRow('Frame identifying DICOM tag:', self.__dicomTag)

    self.__veLabel = qt.QLineEdit()
    self.__veLabel.text = 'na'
    importDataFormLayout.addRow('Frame identifying units:', self.__veLabel)

    self.__veInitial = qt.QDoubleSpinBox()
    self.__veInitial.value = 0
    importDataFormLayout.addRow('Initial value:', self.__veInitial)

    self.__veStep = qt.QDoubleSpinBox()
    self.__veStep.value = 1
    importDataFormLayout.addRow('Step:', self.__veStep)

  
    self.__te = qt.QDoubleSpinBox()
    self.__te.value = 1
    importDataFormLayout.addRow('EchoTime:', self.__te)

    
    self.__tr = qt.QDoubleSpinBox()
    self.__tr.value = 1
    importDataFormLayout.addRow('RepetitionTime:', self.__tr)

    self.__fa = qt.QDoubleSpinBox()
    self.__fa.value = 1
    importDataFormLayout.addRow('FlipAngle:', self.__fa)


    # Botón de importar

    self.buttonImport = qt.QPushButton("Import")
    self.buttonImport.toolTip = "Run the algorithm."
    ##self.buttonImport.enabled = True
    importDataFormLayout.addRow("                                       ", self.buttonImport)

    self.buttonImport.connect('clicked(bool)', self.importFunction)
    ##self.inputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)

################################### PARÁMETROS DE PROCESAMIENTO#################################################
##    # Se crea la sección para seleccionar parámetros el volumen 4D en una pestaña desplegable
    parametersCollapsibleButton = ctk.ctkCollapsibleButton()
    parametersCollapsibleButton.text = "Parameters"
    self.layout.addWidget(parametersCollapsibleButton)

    parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton)

    self.inputSelector = slicer.qMRMLNodeComboBox()
    self.inputSelector.nodeTypes = ["vtkMRMLMultiVolumeNode"]
    self.inputSelector.selectNodeUponCreation = True
    self.inputSelector.addEnabled = True
    self.inputSelector.removeEnabled = False
    self.inputSelector.noneEnabled = True
    self.inputSelector.showHidden = False
    self.inputSelector.showChildNodeTypes = False
    self.inputSelector.setMRMLScene( slicer.mrmlScene )
    self.inputSelector.setToolTip( "Pick the input to the algorithm." )
    parametersFormLayout.addRow("Volumen 4D: ", self.inputSelector)
    self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.inputSelector, 'setMRMLScene(vtkMRMLScene*)')


##########################PROCESAMIENTO##########################################################################

##    # Se crea la sección para seleccionar procesamiento del volumen 4D en una pestaña desplegable
    processingCollapsibleButton = ctk.ctkCollapsibleButton()
    processingCollapsibleButton.text = "Processing"
    self.layout.addWidget(processingCollapsibleButton)

    processingFormLayout = qt.QFormLayout(processingCollapsibleButton)

        # Botón de Segmentación
    #Este botón solo se activa si el multivolumen ha sido seleccionado en la
    #ventana desplegable de Volumen 4D. Al presionarlo, el algoritmo
    #realiza el registro de los diferentes volumenes en el volumen 4D

    self.buttonSegmentation = qt.QPushButton("Segmentation")
    self.buttonSegmentation.toolTip = "Run the algorithm."
    self.buttonSegmentation.enabled = True
    processingFormLayout.addRow("                                       ", self.buttonSegmentation)


    # Botón de modelo 3D
    #Este botón solo se activa si el multivolumen ha sido seleccionado en la
    #ventana desplegable de Volumen 4D. Al presionarlo, el algoritmo
    #realiza el registro de los diferentes volumenes en el volumen 4D
    self.buttonModel = qt.QPushButton("Show 3D model")
    self.buttonModel.toolTip = "Run the algorithm."
    self.buttonModel.enabled = True
    processingFormLayout.addRow("                                       ",self.buttonModel)



########################################CURVAS#######################################################

    
##    # Se crea la sección para seleccionar curvas del volumen 4D en una pestaña desplegable
    curvesCollapsibleButton = ctk.ctkCollapsibleButton()
    curvesCollapsibleButton.text = "Curves"
    self.layout.addWidget(curvesCollapsibleButton)

    curvesFormLayout = qt.QFormLayout(curvesCollapsibleButton)

# Botón de generación de curvas
    #Este botón solo se activa si el multivolumen ha sido seleccionado en la
    #ventana desplegable de Volumen 4D. Al presionarlo, el algoritmo
    #realiza el registro de los diferentes volumenes en el volumen 4D
    self.buttonCurves = qt.QPushButton("Generate curves")
    self.buttonCurves.toolTip = "Run the algorithm."
    self.buttonCurves.enabled = True
    curvesFormLayout.addRow("                                       ",self.buttonCurves)