예제 #1
0
  def setup(self):
    QCLib.genericPanel.setup(self)

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

    parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton)

    #
    # ROI volume selector
    #
    self.ROISelector = slicer.qMRMLNodeComboBox()
    # self.ROISelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" )
    # self.ROISelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", 1 )
    self.ROISelector.nodeTypes = ["vtkMRMLLabelMapVolumeNode"]
    self.ROISelector.selectNodeUponCreation = False
    self.ROISelector.addEnabled = False
    self.ROISelector.removeEnabled = False
    self.ROISelector.noneEnabled = True
    self.ROISelector.showHidden = False
    self.ROISelector.showChildNodeTypes = False
    self.ROISelector.setMRMLScene( slicer.mrmlScene )
    self.ROISelector.setToolTip( "ROI for analysis" )
    parametersFormLayout.addRow("Rectangular ROI: ", self.ROISelector)

    #object type selector
    self.typeSel = ctk.ctkComboBox()
    types=["Edge","Line (Not Implemented)","Point","Droedge (Not Implemented)"]
    self.typeSel.addItems(types)
    self.typeSel.editable=False
    self.typeSel.setCurrentIndex(0)
    parametersFormLayout.addRow("Type of Analysis", self.typeSel)

    # #edge algorithm selector
    # self.algorithmSel = ctk.ctkComboBox()
    # algorithms=["Canny","Sobel","Zero Crossing Based"]
    # self.algorithmSel.addItems(algorithms)
    # #self.algorithmSel.enabled=False
    # self.algorithmSel.editable=False
    # self.algorithmSel.setCurrentIndex(0)
    # parametersFormLayout.addRow("Edge Detection Algorithm", self.algorithmSel)

    # #distance transform algorithm selector
    # self.distalgorithmSel = ctk.ctkComboBox()
    # distalgorithms=["Maurer Signed","Approximate Signed","Danielsson Signed","VTK Unsigned"]
    # self.distalgorithmSel.addItems(distalgorithms)
    # self.distalgorithmSel.editable=False
    # self.distalgorithmSel.setCurrentIndex(0)
    # parametersFormLayout.addRow("Distance Transform Algorithm", self.distalgorithmSel)

    #save intermediate
    self.intermediateCB = ctk.ctkCheckBox()
    self.intermediateCB.setChecked(False)
    parametersFormLayout.addRow("Save intermediate images and curves",self.intermediateCB)

    #options
    optionsCollapsibleButton = ctk.ctkCollapsibleButton()
    optionsCollapsibleButton.text = "Options"
    self.framelayout.addWidget(optionsCollapsibleButton)

    optionsFormLayout = qt.QFormLayout(optionsCollapsibleButton)

    self.edgeoptionframe=qt.QFrame()
    self.edgeoptionframe.enabled=False
    edgeoptionFormLayout = qt.QFormLayout(self.edgeoptionframe)
    self.pointoptionframe=qt.QFrame()
    self.pointoptionframe.enabled=False
    pointoptionFormLayout = qt.QFormLayout(self.pointoptionframe)

    optionsCollapsibleButton.layout().addWidget(self.edgeoptionframe)
    optionsCollapsibleButton.layout().addWidget(self.pointoptionframe)
    
    #edge options
    
    #symmetrize LSF
    self.symmetrizeCB = ctk.ctkCheckBox()
    self.symmetrizeCB.setChecked(True)
    self.symmetrizeCB.enabled=True
    edgeoptionFormLayout.addRow("Symmetrize LSF",self.symmetrizeCB)

    #point options

    #detection point criteria
    self.pointCB = ctk.ctkCheckBox()
    self.pointCB.setChecked(True)
    self.pointCB.enabled=True
    pointoptionFormLayout.addRow("Point object BRIGHTER than background",self.pointCB)

    # self.objradSB=ctk.ctkDoubleSpinBox()
    # self.objradSB.minimum=0
    # self.objradSB.maximum=10
    # self.objradSB.value=0.5
    # pointoptionFormLayout.addRow("Radius of object point(mm)",self.objradSB)

    self.setOptions()

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

    arrayValCollapsibleButton = ctk.ctkCollapsibleButton()
    arrayValCollapsibleButton.text = "Array Value"
    self.framelayout.addWidget(arrayValCollapsibleButton)

    # Layout within the dummy collapsible button
    arrayValFormLayout = qt.QFormLayout(arrayValCollapsibleButton)

    #
    # Array selector
    #
    self.ArraySelector = slicer.qMRMLNodeComboBox()
    self.ArraySelector.nodeTypes = ( ("vtkMRMLDoubleArrayNode"), "" )
    self.ArraySelector.selectNodeUponCreation = False
    self.ArraySelector.addEnabled = False
    self.ArraySelector.removeEnabled = False
    self.ArraySelector.noneEnabled = True
    self.ArraySelector.showHidden = False
    self.ArraySelector.showChildNodeTypes = False
    self.ArraySelector.setMRMLScene( slicer.mrmlScene )
    self.ArraySelector.setToolTip( "Array for analysis" )
    arrayValFormLayout.addRow("Function to interpolate: ", self.ArraySelector)

    self.abscissaSB=ctk.ctkDoubleSpinBox()
    self.abscissaSB.minimum=0
    self.abscissaSB.maximum=0
    self.abscissaSB.value=0
    self.abscissaSB.enabled=False
    arrayValFormLayout.addRow("Abscissa Value: ",self.abscissaSB)

    self.ordinateVal=qt.QLineEdit()
    self.ordinateVal.readOnly=True
    self.ordinateVal.text=""
    arrayValFormLayout.addRow("Value: ",self.ordinateVal)

    # connections
    self.applyButton.connect('clicked(bool)', self.onApplyButton)
    self.masterSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)
    self.ROISelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)
    self.ArraySelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelectArray)
    self.abscissaSB.connect("valueChanged(double)",self.getOrdinate)
    self.typeSel.connect("currentIndexChanged(int)",self.setOptions)
    # Add vertical spacer
    self.layout.addStretch(1)
예제 #2
0
파일: WandEffect.py 프로젝트: dstoup/Slicer
  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 = ctk.ctkDoubleSpinBox(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 = ctk.ctkDoubleSpinBox(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)

    self.fillModeFrame = qt.QFrame(self.frame)
    self.fillModeFrame.setLayout(qt.QHBoxLayout())
    self.frame.layout().addWidget(self.fillModeFrame)
    self.widgets.append(self.fillModeFrame)
    self.fillModeCheckBox = qt.QCheckBox(self.fillModeFrame)
    self.fillModeCheckBox.text = "Fill Volume"
    self.fillModeCheckBox.setToolTip("Fill in 3D when checked, else fill plane")
    self.fillModeFrame.layout().addWidget(self.fillModeCheckBox)
    self.widgets.append(self.fillModeCheckBox)

    EditorLib.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) )
    self.connections.append(
        (self.fillModeCheckBox, 'clicked()', self.onFillModeClicked) )

    # Add vertical spacer
    self.frame.layout().addStretch(1)
    def setup(self):
        self.imagesDirectory = "D:/w/data/DepthNetworkData/5/"
        self.initializeButton = qt.QPushButton("Initialize")
        self.initializeButton.clicked.connect(self.Initialize)
        self.layout.addWidget(self.initializeButton)

        imagesCollapseButton = ctk.ctkCollapsibleButton()
        imagesCollapseButton.text = "Images"
        self.layout.addWidget(imagesCollapseButton)
        imagesLayout = qt.QHBoxLayout(imagesCollapseButton)

        self.depthMapImageView = qt.QLabel()
        self.RGBImageView = qt.QLabel()
        self.depthMapImageView.resize(200, 200)
        self.RGBImageView.resize(200, 200)
        imagesLayout.addWidget(self.depthMapImageView)
        imagesLayout.addWidget(self.RGBImageView)
        self.RGBImageView.setSizePolicy(qt.QSizePolicy.MinimumExpanding,
                                        qt.QSizePolicy.MinimumExpanding)
        self.depthMapImageView.setSizePolicy(qt.QSizePolicy.MinimumExpanding,
                                             qt.QSizePolicy.MinimumExpanding)

        self.imageNumber = qt.QLabel("-")
        self.layout.addWidget(self.imageNumber)

        controlsWidget = qt.QWidget()
        self.layout.addWidget(controlsWidget)
        forwardsBackwardsLayout = qt.QHBoxLayout(controlsWidget)

        self.backwardsButton = qt.QPushButton("<")
        self.backwardsButton.clicked.connect(self.Backwards)
        forwardsBackwardsLayout.addWidget(self.backwardsButton)
        self.forwardsButton = qt.QPushButton(">")
        self.forwardsButton.clicked.connect(self.Forwards)
        forwardsBackwardsLayout.addWidget(self.forwardsButton)

        self.focalLengthBox = ctk.ctkDoubleSpinBox()
        self.focalLengthBox.maximum = 100000.0
        self.focalLengthBox.minimum = 0.0
        self.focalLengthBox.setValue(200.0)
        self.layout.addWidget(self.focalLengthBox)

        self.depthDividerBox = ctk.ctkDoubleSpinBox()
        self.depthDividerBox.setValue(2.5)
        self.depthDividerBox.maximum = 100000.0
        self.depthDividerBox.minimum = 0.0
        self.layout.addWidget(self.depthDividerBox)

        self.pointCloudButton = qt.QPushButton("Create and render point cloud")
        self.pointCloudButton.clicked.connect(self.OnConvertToPointCloud)
        self.layout.addWidget(self.pointCloudButton)

        inputsWidget = qt.QWidget()
        self.layout.addWidget(inputsWidget)
        inputsLayout = qt.QFormLayout(inputsWidget)

        self.baseModelSelector = slicer.qMRMLNodeComboBox()
        self.baseModelSelector.nodeTypes = (("vtkMRMLModelNode"), "")
        self.baseModelSelector.selectNodeUponCreation = False
        self.baseModelSelector.addEnabled = False
        self.baseModelSelector.removeEnabled = True
        self.baseModelSelector.renameEnabled = True
        self.baseModelSelector.noneEnabled = False
        self.baseModelSelector.showHidden = False
        self.baseModelSelector.showChildNodeTypes = False
        self.baseModelSelector.setMRMLScene(slicer.mrmlScene)
        inputsLayout.addRow("Base Model: ", self.baseModelSelector)

        self.pointCloudSelector = slicer.qMRMLNodeComboBox()
        self.pointCloudSelector.nodeTypes = (("vtkMRMLModelNode"), "")
        self.pointCloudSelector.selectNodeUponCreation = True
        self.pointCloudSelector.addEnabled = True
        self.pointCloudSelector.removeEnabled = True
        self.pointCloudSelector.renameEnabled = True
        self.pointCloudSelector.noneEnabled = False
        self.pointCloudSelector.showHidden = False
        self.pointCloudSelector.showChildNodeTypes = False
        self.pointCloudSelector.setMRMLScene(slicer.mrmlScene)
        inputsLayout.addRow("Point Cloud Model: ", self.pointCloudSelector)

        self.booleanModelSelector = slicer.qMRMLNodeComboBox()
        self.booleanModelSelector.nodeTypes = (("vtkMRMLModelNode"), "")
        self.booleanModelSelector.selectNodeUponCreation = True
        self.booleanModelSelector.addEnabled = True
        self.booleanModelSelector.removeEnabled = True
        self.booleanModelSelector.renameEnabled = True
        self.booleanModelSelector.noneEnabled = False
        self.booleanModelSelector.showHidden = False
        self.booleanModelSelector.showChildNodeTypes = False
        self.booleanModelSelector.setMRMLScene(slicer.mrmlScene)
        inputsLayout.addRow("Boolean Model: ", self.booleanModelSelector)

        self.transientModelSelector = slicer.qMRMLNodeComboBox()
        self.transientModelSelector.nodeTypes = (("vtkMRMLModelNode"), "")
        self.transientModelSelector.selectNodeUponCreation = True
        self.transientModelSelector.addEnabled = True
        self.transientModelSelector.removeEnabled = True
        self.transientModelSelector.renameEnabled = True
        self.transientModelSelector.noneEnabled = False
        self.transientModelSelector.showHidden = False
        self.transientModelSelector.showChildNodeTypes = False
        self.transientModelSelector.setMRMLScene(slicer.mrmlScene)
        inputsLayout.addRow("Transient Model: ", self.transientModelSelector)

        self.transientTransformSelector = slicer.qMRMLNodeComboBox()
        self.transientTransformSelector.nodeTypes = ((
            "vtkMRMLLinearTransformNode"), "")
        self.transientTransformSelector.selectNodeUponCreation = True
        self.transientTransformSelector.addEnabled = True
        self.transientTransformSelector.removeEnabled = True
        self.transientTransformSelector.renameEnabled = True
        self.transientTransformSelector.noneEnabled = False
        self.transientTransformSelector.showHidden = False
        self.transientTransformSelector.showChildNodeTypes = False
        self.transientTransformSelector.setMRMLScene(slicer.mrmlScene)
        inputsLayout.addRow("Transient Transform Node: ",
                            self.transientTransformSelector)

        self.transformSelector = slicer.qMRMLNodeComboBox()
        self.transformSelector.nodeTypes = (("vtkMRMLLinearTransformNode"), "")
        self.transformSelector.selectNodeUponCreation = True
        self.transformSelector.addEnabled = True
        self.transformSelector.removeEnabled = True
        self.transformSelector.renameEnabled = True
        self.transformSelector.noneEnabled = False
        self.transformSelector.showHidden = False
        self.transformSelector.showChildNodeTypes = False
        self.transformSelector.setMRMLScene(slicer.mrmlScene)
        inputsLayout.addRow("Transform Node: ", self.transformSelector)

        self.iterationsSpinBox = qt.QSpinBox()
        self.iterationsSpinBox.setMaximum(50000)
        self.iterationsSpinBox.setMinimum(100)
        self.iterationsSpinBox.value = 1000
        inputsLayout.addRow("Iterations: ", self.iterationsSpinBox)

        self.landmarksSpinBox = qt.QSpinBox()
        self.landmarksSpinBox.setMaximum(50000)
        self.landmarksSpinBox.setMinimum(100)
        self.landmarksSpinBox.value = 1000
        inputsLayout.addRow("Landmarks: ", self.landmarksSpinBox)

        self.booleanCheckBox = qt.QCheckBox()
        self.booleanCheckBox.setChecked(False)
        inputsLayout.addRow("Use boolean: ", self.booleanCheckBox)

        self.registerButton = qt.QPushButton(
            "Create, render, and register point cloud")
        self.registerButton.clicked.connect(self.OnRegister)
        self.layout.addWidget(self.registerButton)

        spacer = qt.QSpacerItem(1, 14, qt.QSizePolicy.Expanding,
                                qt.QSizePolicy.Expanding)
예제 #4
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        self.logic = BitmapGeneratorLogic()

        # Instantiate and connect widgets ...

        #
        # Printer parameters Area
        #
        printerParametersCollapsibleButton = ctk.ctkCollapsibleButton()
        printerParametersCollapsibleButton.text = "Printer parameters"
        self.layout.addWidget(printerParametersCollapsibleButton)

        # Layout within the dummy collapsible button
        printerParametersFormLayout = qt.QFormLayout(
            printerParametersCollapsibleButton)

        self.xResolutionDpiSpinBox = ctk.ctkDoubleSpinBox()
        self.xResolutionDpiSpinBox.setToolTip(
            "Resolution of exported images along X axis.")
        self.xResolutionDpiSpinBox.decimals = 0
        self.xResolutionDpiSpinBox.minimum = 60
        self.xResolutionDpiSpinBox.maximum = 2400
        self.xResolutionDpiSpinBox.suffix = "DPI"
        self.xResolutionDpiSpinBox.value = self.logic.xResolutionDpi
        self.xResolutionDpiSpinBox.singleStep = 100
        printerParametersFormLayout.addRow("X resolution: ",
                                           self.xResolutionDpiSpinBox)

        self.yResolutionDpiSpinBox = ctk.ctkDoubleSpinBox()
        self.yResolutionDpiSpinBox.setToolTip(
            "Resolution of exported images along Y axis.")
        self.yResolutionDpiSpinBox.decimals = 0
        self.yResolutionDpiSpinBox.minimum = 60
        self.yResolutionDpiSpinBox.maximum = 2400
        self.yResolutionDpiSpinBox.suffix = "DPI"
        self.yResolutionDpiSpinBox.value = self.logic.yResolutionDpi
        self.yResolutionDpiSpinBox.singleStep = 100
        printerParametersFormLayout.addRow("Y resolution: ",
                                           self.yResolutionDpiSpinBox)

        self.layerThicknessMmSpinBox = ctk.ctkDoubleSpinBox()
        self.layerThicknessMmSpinBox.setToolTip(
            "Distance between extracted image slices.")
        self.layerThicknessMmSpinBox.decimals = 4
        self.layerThicknessMmSpinBox.minimum = 0.0001
        self.layerThicknessMmSpinBox.maximum = 50.0
        self.layerThicknessMmSpinBox.suffix = "mm"
        self.layerThicknessMmSpinBox.value = self.logic.slabSpacingMm
        self.layerThicknessMmSpinBox.singleStep = 0.1
        printerParametersFormLayout.addRow("Layer thickness: ",
                                           self.layerThicknessMmSpinBox)

        #
        # Output parameters Area
        #
        outputParametersCollapsibleButton = ctk.ctkCollapsibleButton()
        outputParametersCollapsibleButton.text = "Output parameters"
        self.layout.addWidget(outputParametersCollapsibleButton)

        # Layout within the dummy collapsible button
        outputParametersFormLayout = qt.QFormLayout(
            outputParametersCollapsibleButton)

        self.printScaleSpinBox = ctk.ctkDoubleSpinBox()
        self.printScaleSpinBox.setToolTip(
            "Scale of print size relative to real life size. 1.0 means printing in real life size, <1.0 means printed objects are smaller than in real life."
        )
        self.printScaleSpinBox.decimals = 3
        self.printScaleSpinBox.minimum = 0.01
        self.printScaleSpinBox.maximum = 100.0
        self.printScaleSpinBox.suffix = "x"
        self.printScaleSpinBox.value = self.logic.printScale
        self.printScaleSpinBox.singleStep = 0.1
        outputParametersFormLayout.addRow("Scale: ", self.printScaleSpinBox)

        #
        # Path
        #
        self.dirPath = ctk.ctkPathLineEdit()
        self.dirPath.filters = ctk.ctkPathLineEdit.Dirs
        self.dirPath.settingKey = 'BitmapGeneratorOutputFolder'
        #self.dirPath.currentPath = "/tmp"
        outputParametersFormLayout.addRow("Output folder: ", self.dirPath)

        #
        # Apply Button
        #
        self.applyButtonLabelGenerate = "Generate bitmaps"
        self.applyButtonLabelCancel = "Cancel"
        self.applyButton = qt.QPushButton(self.applyButtonLabelGenerate)
        self.applyButton.toolTip = "Start/cancel bitmap generation"
        outputParametersFormLayout.addRow(self.applyButton)

        # connections
        self.applyButton.connect('clicked(bool)', self.onApplyButton)

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

    # Instantiate and connect widgets ...

    #
    # Common Area
    #
    commonCollapsibleButton = ctk.ctkCollapsibleButton()
    commonCollapsibleButton.text = "Common"
    self.layout.addWidget(commonCollapsibleButton)
    commonFormLayout = qt.QFormLayout(commonCollapsibleButton)

    # ROI selector
    self.roiSelectorLabel = qt.QLabel()
    self.roiSelectorLabel.setText( "Region of interest: " )
    self.exportRoiSelector = slicer.qMRMLNodeComboBox()
    self.exportRoiSelector.nodeTypes = ( "vtkMRMLAnnotationROINode", "" )
    self.exportRoiSelector.noneEnabled = False
    self.exportRoiSelector.addEnabled = False
    self.exportRoiSelector.removeEnabled = True
    self.exportRoiSelector.setMRMLScene( slicer.mrmlScene )
    self.exportRoiSelector.setToolTip( "Pick the input region of interest for comparison" )
    commonFormLayout.addRow(self.roiSelectorLabel, self.exportRoiSelector)

    # Spacing
    self.compareVolumeSpacingLabel = qt.QLabel()
    self.compareVolumeSpacingLabel.setText( "Comparison volume spacing: " )
    self.compareVolumeSpacing = ctk.ctkDoubleSpinBox()
    self.compareVolumeSpacing.minimum = 0.01
    self.compareVolumeSpacing.maximum = 30
    self.compareVolumeSpacing.suffix = 'mm'
    self.compareVolumeSpacing.singleStep = 0.5
    self.compareVolumeSpacing.value = 3
    self.compareVolumeSpacing.setToolTip( "Resolution for comparison. Smaller values mean higher accuracy but more computation time." )
    commonFormLayout.addRow(self.compareVolumeSpacingLabel, self.compareVolumeSpacing)

    #
    # Average Area
    #
    averageCollapsibleButton = ctk.ctkCollapsibleButton()
    averageCollapsibleButton.text = "Average"
    self.layout.addWidget(averageCollapsibleButton)
    averageFormLayout = qt.QFormLayout(averageCollapsibleButton)

    # ground truth field selector
    self.maxNumberOfInputFieldsForAveraging = 10
    self.averageInputFieldSelectors = []
    for averageInputFieldIndex in xrange(0, self.maxNumberOfInputFieldsForAveraging):
      averageInputFieldSelectorLabel = qt.QLabel()
      averageInputFieldSelectorLabel.setText( 'Field {0}: '.format(averageInputFieldIndex+1) )
      averageInputFieldSelector = slicer.qMRMLNodeComboBox()
      averageInputFieldSelector.nodeTypes = ( "vtkMRMLVectorVolumeNode", "" )
      averageInputFieldSelector.noneEnabled = True
      averageInputFieldSelector.addEnabled = False
      averageInputFieldSelector.removeEnabled = True
      averageInputFieldSelector.setMRMLScene( slicer.mrmlScene )
      averageInputFieldSelector.setToolTip( "Pick the field that will be include in the average computation" )
      averageFormLayout.addRow(averageInputFieldSelectorLabel, averageInputFieldSelector)
      self.averageInputFieldSelectors.append(averageInputFieldSelector)

    self.averageOutputFieldLabel = qt.QLabel()
    self.averageOutputFieldLabel.setText( 'Output field mean:')
    self.averageOutputFieldSelector = slicer.qMRMLNodeComboBox()
    self.averageOutputFieldSelector.nodeTypes = ( "vtkMRMLVectorVolumeNode", "" )
    self.averageOutputFieldSelector.noneEnabled = True
    self.averageOutputFieldSelector.addEnabled = True
    self.averageOutputFieldSelector.removeEnabled = True
    self.averageOutputFieldSelector.renameEnabled = True
    self.averageOutputFieldSelector.baseName = 'Mean'
    self.averageOutputFieldSelector.setMRMLScene( slicer.mrmlScene )
    self.averageOutputFieldSelector.setToolTip( "Computed mean of the displacement fields" )
    averageFormLayout.addRow(self.averageOutputFieldLabel, self.averageOutputFieldSelector)

    self.varianceOutputFieldLabel = qt.QLabel()
    self.varianceOutputFieldLabel.setText( 'Output field mean error:')
    self.varianceOutputFieldSelector = slicer.qMRMLNodeComboBox()
    self.varianceOutputFieldSelector.nodeTypes = ( "vtkMRMLScalarVolumeNode", "" )
    self.varianceOutputFieldSelector.noneEnabled = True
    self.varianceOutputFieldSelector.addEnabled = True
    self.varianceOutputFieldSelector.removeEnabled = True
    self.varianceOutputFieldSelector.renameEnabled = True
    self.varianceOutputFieldSelector.showChildNodeTypes = False
    self.varianceOutputFieldSelector.baseName = 'MeanError'
    self.varianceOutputFieldSelector.setMRMLScene( slicer.mrmlScene )
    self.varianceOutputFieldSelector.setToolTip( "Computed variance of the displacement fields" )
    averageFormLayout.addRow(self.varianceOutputFieldLabel, self.varianceOutputFieldSelector)

    # Compute button
    self.averageComputeButton = qt.QPushButton("Compute")
    self.averageComputeButton.toolTip = "Compute average and standard deviation"
    self.averageComputeButton.enabled = True
    averageFormLayout.addRow(self.averageComputeButton)
    self.averageComputeButton.connect('clicked(bool)', self.computeAverage)


    #
    # Difference Area
    #
    differenceCollapsibleButton = ctk.ctkCollapsibleButton()
    differenceCollapsibleButton.text = "Difference"
    self.layout.addWidget(differenceCollapsibleButton)
    differenceFormLayout = qt.QFormLayout(differenceCollapsibleButton)

    self.differenceInputFieldALabel = qt.QLabel()
    self.differenceInputFieldALabel.setText( 'Displacement field A')
    self.differenceInputFieldASelector = slicer.qMRMLNodeComboBox()
    self.differenceInputFieldASelector.nodeTypes = ( "vtkMRMLVectorVolumeNode", "" )
    self.differenceInputFieldASelector.noneEnabled = False
    self.differenceInputFieldASelector.addEnabled = False
    self.differenceInputFieldASelector.removeEnabled = True
    self.differenceInputFieldASelector.setMRMLScene( slicer.mrmlScene )
    self.differenceInputFieldASelector.setToolTip( "Pick the field that the other will be subtracted from" )
    differenceFormLayout.addRow(self.differenceInputFieldALabel, self.differenceInputFieldASelector)

    self.differenceInputFieldBLabel = qt.QLabel()
    self.differenceInputFieldBLabel.setText( 'Displacement field B' )
    self.differenceInputFieldBSelector = slicer.qMRMLNodeComboBox()
    self.differenceInputFieldBSelector.nodeTypes = ( "vtkMRMLVectorVolumeNode", "" )
    self.differenceInputFieldBSelector.noneEnabled = False
    self.differenceInputFieldBSelector.addEnabled = False
    self.differenceInputFieldBSelector.removeEnabled = True
    self.differenceInputFieldBSelector.setMRMLScene( slicer.mrmlScene )
    self.differenceInputFieldBSelector.setToolTip( "Pick the field to subtract from the other" )
    differenceFormLayout.addRow(self.differenceInputFieldBLabel, self.differenceInputFieldBSelector)

    self.differenceOutputFieldLabel = qt.QLabel()
    self.differenceOutputFieldLabel.setText( 'Output difference:')
    self.differenceOutputFieldSelector = slicer.qMRMLNodeComboBox()
    self.differenceOutputFieldSelector.nodeTypes = ( "vtkMRMLVectorVolumeNode", "" )
    self.differenceOutputFieldSelector.noneEnabled = True
    self.differenceOutputFieldSelector.addEnabled = True
    self.differenceOutputFieldSelector.removeEnabled = True
    self.differenceOutputFieldSelector.renameEnabled = True
    self.differenceOutputFieldSelector.baseName = 'Difference'
    self.differenceOutputFieldSelector.setMRMLScene( slicer.mrmlScene )
    self.differenceOutputFieldSelector.setToolTip( "Computed difference of the displacement fields" )
    differenceFormLayout.addRow(self.differenceOutputFieldLabel, self.differenceOutputFieldSelector)

    # Compute button
    self.differenceComputeButton = qt.QPushButton("Compute")
    self.differenceComputeButton.toolTip = "Compute difference between fields (FieldA-FieldB)"
    self.differenceComputeButton.enabled = True
    differenceFormLayout.addRow(self.differenceComputeButton)
    self.differenceComputeButton.connect('clicked(bool)', self.computeDifference)

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

        self.__layout = self.__parent.createUserInterface()
        ''' 
      # Input fiducials node selector
      #self.inputFiducialsNodeSelector = slicer.qMRMLNodeComboBox()
      self.inputFiducialsNodeSelector.toolTip = "Select a fiducial to define an insertion point for a screw."
      self.inputFiducialsNodeSelector.nodeTypes = (("vtkMRMLMarkupsFiducialNode"), "")
      self.inputFiducialsNodeSelector.addEnabled = False
      self.inputFiducialsNodeSelector.removeEnabled = False
      self.inputFiducialsNodeSelector.setMRMLScene( slicer.mrmlScene ) 
      self.inputFiducialsNodeSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.fidChanged)
      self.__layout.addRow("Select Insertion Point:", self.inputFiducialsNodeSelector)
      self.fid = self.inputFiducialsNodeSelector.currentNode()
      self.sliceChange()
      '''
        '''
      # Input model selector
      self.inputScrewSelector = ctk.ctkComboBox()
      self.inputScrewSelector.toolTip = "Select a screw to insert."
      screwList = ['Select a screw','475x30', '475x35', '475x45', '550x30', '550x40', '550x45', '625x35', '625x40', '625x45', '625x50', '700x35', '700x40', '700x45', '700x50']
      self.inputScrewSelector.addItems(screwList)
      self.connect(self.inputScrewSelector, PythonQt.QtCore.SIGNAL('activated(QString)'), self.combo_chosen)
      self.__layout.addRow("Choose Screw:", self.inputScrewSelector)
      
       vText = qt.QLabel("1st Instrumented Level:")
       iText = qt.QLabel("# to Instrument:")
       aText = qt.QLabel("Approach Direction:")
       self.vSelector = qt.QComboBox()
       self.vSelector.setMaximumWidth(120)
       self.levels = ("C1","C2","C3","C4","C5","C6","C7","T1","T2","T3","T4","T5","T6","T7","T8","T9","T10","T11","T12","L1", "L2", "L3", "L4", "L5","S1")
       self.vSelector.addItems(self.levels)
       self.iSelector = qt.QComboBox()
       self.iSelector.setMaximumWidth(120)
       self.iSelector.addItems(['1','2','3','4','5','6','7','8','9','10','11','12'])
       self.aSelector = qt.QComboBox()
       self.aSelector.setMaximumWidth(120)
       self.aSelector.addItems(['Posterior','Anterior','Left','Right'])
       blank = qt.QLabel("  ")
       blank.setMaximumWidth(30)
       #self.__layout.addWidget(vText)
       #self.__layout.addWidget(self.vSelector)
       #self.__layout.addWidget(iText)
       #self.__layout.addWidget(self.iSelector)
    
       self.vertebraeGridBox = qt.QGridLayout()
       self.vertebraeGridBox.addWidget(vText,0,0)
       self.vertebraeGridBox.addWidget(self.vSelector,1,0)
       self.vertebraeGridBox.addWidget(blank,0,1)
       self.vertebraeGridBox.addWidget(iText,0,2)
       self.vertebraeGridBox.addWidget(blank,1,1)
       self.vertebraeGridBox.addWidget(self.iSelector,1,2)
       self.vertebraeGridBox.addWidget(blank,0,3)
       self.vertebraeGridBox.addWidget(aText,0,4)
       self.vertebraeGridBox.addWidget(blank,1,3)
       self.vertebraeGridBox.addWidget(self.aSelector,1,4)
       self.__layout.addRow(self.vertebraeGridBox)
      '''

        self.fiducial = ctk.ctkComboBox()
        self.fiducial.toolTip = "Select an insertion site."
        self.fiducial.addItems(self.fiduciallist)
        self.connect(self.fiducial,
                     PythonQt.QtCore.SIGNAL('activated(QString)'),
                     self.fiducial_chosen)

        #self.screwGridLayout.addWidget(self.fiducial,0,0)

        self.__layout.addRow("Insertion Site:", self.fiducial)
        self.__fiducial = ''
        measuredText1 = qt.QLabel("     Measured:")
        measuredText2 = qt.QLabel("     Measured:")
        lengthText = qt.QLabel("Screw Length:   ")
        widthText = qt.QLabel("Screw Width:    ")
        self.length = ctk.ctkComboBox()
        self.length.toolTip = "Select a screw to insert."
        screwList = ['Select a length (mm)', '475', '550', '625', '700']
        self.length.addItems(screwList)
        self.connect(self.length, PythonQt.QtCore.SIGNAL('activated(QString)'),
                     self.length_chosen)
        self.lengthMeasure = qt.QLineEdit()
        #self.__layout.addRow("Screw Length:", self.length)
        #self.__layout.addRow("Measured Pedicle Length:", self.lengthMeasure)
        self.__length = ''

        self.QHBox1 = qt.QHBoxLayout()
        self.QHBox1.addWidget(lengthText)
        self.QHBox1.addWidget(self.length)
        self.QHBox1.addWidget(measuredText1)
        self.QHBox1.addWidget(self.lengthMeasure)
        self.__layout.addRow(self.QHBox1)

        self.diameter = ctk.ctkComboBox()
        self.diameter.toolTip = "Select a screw to insert."
        screwList = ['Select a diameter (mm)', '30', '35', '45', '50']
        self.diameter.addItems(screwList)
        self.widthMeasure = qt.QLineEdit()
        self.connect(self.diameter,
                     PythonQt.QtCore.SIGNAL('activated(QString)'),
                     self.diameter_chosen)
        #self.__layout.addRow("Screw Diameter:", self.diameter)
        #self.__layout.addRow("Measured Pedicle Width:", self.widthMeasure)
        self.__diameter = ''

        self.QHBox2 = qt.QHBoxLayout()
        self.QHBox2.addWidget(widthText)
        self.QHBox2.addWidget(self.diameter)
        self.QHBox2.addWidget(measuredText2)
        self.QHBox2.addWidget(self.widthMeasure)
        self.__layout.addRow(self.QHBox2)

        # Load Screw Button
        self.__loadScrewButton = qt.QPushButton("Load Screw")
        self.__loadScrewButton.enabled = False
        #self.__layout.addWidget(self.__loadScrewButton)
        self.__loadScrewButton.connect('clicked(bool)', self.loadScrew)

        # Delete Screw Button
        self.__delScrewButton = qt.QPushButton("Delete Screw")
        self.__delScrewButton.enabled = True
        #self.__layout.addWidget(self.__delScrewButton)
        self.__delScrewButton.connect('clicked(bool)', self.delScrew)

        self.QHBox3 = qt.QHBoxLayout()
        self.QHBox3.addWidget(self.__loadScrewButton)
        self.QHBox3.addWidget(self.__delScrewButton)
        self.__layout.addRow(self.QHBox3)

        # Input model node selector
        self.modelNodeSelector = slicer.qMRMLNodeComboBox()
        self.modelNodeSelector.toolTip = "."
        self.modelNodeSelector.nodeTypes = (("vtkMRMLModelNode"), "")
        self.modelNodeSelector.addEnabled = False
        self.modelNodeSelector.removeEnabled = False
        self.modelNodeSelector.setMRMLScene(slicer.mrmlScene)
        #self.__layout.addRow("Current Screws:", self.modelNodeSelector)

        self.transformGrid = qt.QGridLayout()
        vText = qt.QLabel("Vertical Adjustment:")
        iText = qt.QLabel("Horizontal Adjustment:")
        self.transformGrid.addWidget(vText, 0, 0)
        self.transformGrid.addWidget(iText, 0, 2)

        self.b = ctk.ctkDoubleSpinBox()
        self.b.minimum = -45
        self.b.maximum = 45

        self.transformGrid.addWidget(self.b, 1, 0)

        # Transform Sliders
        self.transformSlider1 = ctk.ctkDoubleSlider()
        self.transformSlider1.minimum = -45
        self.transformSlider1.maximum = 45
        self.transformSlider1.connect('valueChanged(double)',
                                      self.transformSlider1ValueChanged)
        self.transformSlider1.connect('valueChanged(double)', self.b.setValue)
        self.transformSlider1.setMinimumHeight(120)
        #self.__layout.addRow("Rotate IS", self.transformSlider1)
        self.transformGrid.addWidget(self.transformSlider1, 1, 1)

        self.b.connect('valueChanged(double)', self.transformSlider1.setValue)

        # Transform Sliders
        self.transformSlider2 = ctk.ctkSliderWidget()
        self.transformSlider2.minimum = -45
        self.transformSlider2.maximum = 45
        self.transformSlider2.connect('valueChanged(double)',
                                      self.transformSlider2ValueChanged)
        self.transformSlider2.setMaximumWidth(200)
        #self.__layout.addRow("Rotate LR", self.transformSlider2)
        self.transformGrid.addWidget(self.transformSlider2, 1, 2)
        self.__layout.addRow(self.transformGrid)
        '''
      # Transfors Sliders
      self.transformSlider3 = ctk.ctkSliderWidget()
      self.transformSlider3.minimum = 0
      self.transformSlider3.maximum = 100
      self.transformSlider3.connect('valueChanged(double)', self.transformSlider3ValueChanged)
      self.__layout.addRow("Drive Screw", self.transformSlider3)
      '''
        # Insert Screw Button
        self.insertScrewButton = qt.QPushButton("Insert Screw")
        self.insertScrewButton.enabled = True
        #self.__layout.addWidget(self.__loadScrewButton)
        self.insertScrewButton.connect('clicked(bool)', self.insertScrew)

        # Backout Screw Button
        self.backoutScrewButton = qt.QPushButton("Backout Screw")
        self.backoutScrewButton.enabled = False
        #self.__layout.addWidget(self.__delScrewButton)
        self.backoutScrewButton.connect('clicked(bool)', self.backoutScrew)

        # Reset Screw Button
        self.resetScrewButton = qt.QPushButton("Reset Screw")
        self.resetScrewButton.enabled = True
        #self.__layout.addWidget(self.__delScrewButton)
        self.resetScrewButton.connect('clicked(bool)', self.resetScrew)

        self.QHBox4 = qt.QHBoxLayout()
        self.QHBox4.addWidget(self.insertScrewButton)
        self.QHBox4.addWidget(self.backoutScrewButton)
        self.QHBox4.addWidget(self.resetScrewButton)
        self.__layout.addRow(self.QHBox4)

        # Hide ROI Details
        #measurementsTable = ctk.ctkCollapsibleButton()
        #measurementsTable.text = "Measurements Table"
        #self.__layout.addWidget(measurementsTable)
        #measurementsTable.collapsed = True
        '''
      self.view = qt.QTableView()
      self.model = qt.QStandardItemModel()
      self.view.setModel(self.model)
      item = qt.QStandardItem()
      item.setText("item")
      self.model.setItem(0,0,item)
      self.__layout.addWidget(self.view)
      '''
        #self.__layout.addRow(self.screwGridLayout)
        # self.updateWidgetFromParameters(self.parameterNode())
        qt.QTimer.singleShot(0, self.killButton)
        self.currentFidIndex = self.fiducial.currentIndex
        self.currentFidLabel = self.fiducial.currentText
        self.fidNode.GetNthFiducialPosition(self.currentFidIndex, self.coords)
        logging.debug("Coords: {0}".format(self.coords))
        self.updateMeasurements()
        self.cameraFocus(self.coords)
예제 #7
0
    def populate_advanced_tab(self):
        jsonUIInfo = self.logic.getJsonInfo4UI(self.inputJsonFn.currentPath)

        self.advancedOptions = []
        for el in jsonUIInfo:
            #print(el)

            self.idxSlide = ctk.ctkDoubleSpinBox()
            self.advancedFormLayout.addRow("Idx:", self.idxSlide)
            self.idxSlide.setValue(int(el[1]))
            self.idxSlide.setEnabled(False)

            self.rgbPath = ctk.ctkPathLineEdit()
            self.advancedFormLayout.addRow("    Rgb Image:", self.rgbPath)
            self.rgbPath.setCurrentPath(el[2])

            self.doFlip = ctk.ctkCheckBox()
            self.advancedFormLayout.addRow("    Flip:", self.doFlip)
            if (not el[4] == None) and el[4] == 1:
                self.doFlip.setChecked(True)
            else:
                self.doFlip.setChecked(False)

            self.doRotate = ctk.ctkDoubleSpinBox()
            self.advancedFormLayout.addRow("    Rotation angle:",
                                           self.doRotate)
            self.doRotate.minimum = 0.0
            self.doRotate.maximum = 360.0
            self.doRotate.singleStep = 90.0
            if el[5]:
                self.doRotate.setValue(int(el[5]))

            for maskEl in el[3]:
                print(maskEl)
                self.idxMask2 = ctk.ctkDoubleSpinBox()
                self.advancedFormLayout.addRow("        Mask Idx:",
                                               self.idxMask2)
                self.idxMask2.setValue(int(maskEl[0]))
                self.idxMask2.setEnabled(False)

                self.maskPath = ctk.ctkPathLineEdit()
                self.advancedFormLayout.addRow("        Mask Image:",
                                               self.maskPath)
                self.maskPath.setCurrentPath(maskEl[1])

                self.idxMask2.connect(
                    'valueChanged(double)',
                    lambda value, idxSlice=el[0], idxMask=int(maskEl[
                        0]): self.onMaskIdxChange(value, idxSlice, idxMask))

                self.maskPath.connect(
                    'currentPathChanged(QString)',
                    lambda value, idxSlice=el[0], idxMask=int(maskEl[
                        0]): self.onMaskFileChange(value, idxSlice, idxMask))

            Separador = qt.QFrame()
            Separador.setFrameShape(qt.QFrame.HLine)
            Separador.setLineWidth(1)
            self.advancedFormLayout.addRow(Separador)

            self.idxSlide.connect(
                'valueChanged(double)',
                lambda value, idx=el[0]: self.onSliceIdxChange(value, idx))

            self.rgbPath.connect('currentPathChanged(QString)',
                                 lambda value, idx=el[0]: self.
                                 onSliceJsonFileChange(value, idx))

            self.doFlip.connect(
                'stateChanged(int)',
                lambda value, idx=el[0]: self.onSliceFlipChange(value, idx))

            self.doRotate.connect('valueChanged(double)',
                                  lambda value, idx=el[0]: self.
                                  onSliceDoRotateChange(value, idx))

            advancedUIEl = [
                el[0], self.idxSlide, self.rgbPath, self.doRotate,
                self.doRotate
            ]
            self.advancedOptions.append(advancedUIEl)
예제 #8
0
    def createUserInterface( self ):

      self.__layout = self.__parent.createUserInterface() 
      ''' 
      # Input fiducials node selector
      #self.inputFiducialsNodeSelector = slicer.qMRMLNodeComboBox()
      self.inputFiducialsNodeSelector.toolTip = "Select a fiducial to define an insertion point for a screw."
      self.inputFiducialsNodeSelector.nodeTypes = (("vtkMRMLMarkupsFiducialNode"), "")
      self.inputFiducialsNodeSelector.addEnabled = False
      self.inputFiducialsNodeSelector.removeEnabled = False
      self.inputFiducialsNodeSelector.setMRMLScene( slicer.mrmlScene ) 
      self.inputFiducialsNodeSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.fidChanged)
      self.__layout.addRow("Select Insertion Point:", self.inputFiducialsNodeSelector)
      self.fid = self.inputFiducialsNodeSelector.currentNode()
      self.sliceChange()
      '''
      
      '''
      # Input model selector
      self.inputScrewSelector = ctk.ctkComboBox()
      self.inputScrewSelector.toolTip = "Select a screw to insert."
      screwList = ['Select a screw','475x30', '475x35', '475x45', '550x30', '550x40', '550x45', '625x35', '625x40', '625x45', '625x50', '700x35', '700x40', '700x45', '700x50']
      self.inputScrewSelector.addItems(screwList)
      self.connect(self.inputScrewSelector, PythonQt.QtCore.SIGNAL('activated(QString)'), self.combo_chosen)
      self.__layout.addRow("Choose Screw:", self.inputScrewSelector)
      
       vText = qt.QLabel("1st Instrumented Level:")
       iText = qt.QLabel("# to Instrument:")
       aText = qt.QLabel("Approach Direction:")
       self.vSelector = qt.QComboBox()
       self.vSelector.setMaximumWidth(120)
       self.levels = ("C1","C2","C3","C4","C5","C6","C7","T1","T2","T3","T4","T5","T6","T7","T8","T9","T10","T11","T12","L1", "L2", "L3", "L4", "L5","S1")
       self.vSelector.addItems(self.levels)
       self.iSelector = qt.QComboBox()
       self.iSelector.setMaximumWidth(120)
       self.iSelector.addItems(['1','2','3','4','5','6','7','8','9','10','11','12'])
       self.aSelector = qt.QComboBox()
       self.aSelector.setMaximumWidth(120)
       self.aSelector.addItems(['Posterior','Anterior','Left','Right'])
       blank = qt.QLabel("  ")
       blank.setMaximumWidth(30)
       #self.__layout.addWidget(vText)
       #self.__layout.addWidget(self.vSelector)
       #self.__layout.addWidget(iText)
       #self.__layout.addWidget(self.iSelector)
    
       self.vertebraeGridBox = qt.QGridLayout()
       self.vertebraeGridBox.addWidget(vText,0,0)
       self.vertebraeGridBox.addWidget(self.vSelector,1,0)
       self.vertebraeGridBox.addWidget(blank,0,1)
       self.vertebraeGridBox.addWidget(iText,0,2)
       self.vertebraeGridBox.addWidget(blank,1,1)
       self.vertebraeGridBox.addWidget(self.iSelector,1,2)
       self.vertebraeGridBox.addWidget(blank,0,3)
       self.vertebraeGridBox.addWidget(aText,0,4)
       self.vertebraeGridBox.addWidget(blank,1,3)
       self.vertebraeGridBox.addWidget(self.aSelector,1,4)
       self.__layout.addRow(self.vertebraeGridBox)
      '''
      
      self.fiducial = ctk.ctkComboBox()
      self.fiducial.toolTip = "Select an insertion site."
      #fiducialList = ['Select an insertion landmark', self.fiduciallist]
      #print self.fiduciallist
      #print fiducialList
      #self.fiducial.addItem("Select an insertion site, no really")
      #self.fiducial.addItem("Select an insertion site.")
      self.fiducial.addItems(self.fiduciallist)
      self.connect(self.fiducial, PythonQt.QtCore.SIGNAL('activated(QString)'), self.fiducial_chosen)
      #self.connect(self.fiducial, PythonQt.QtCore.SIGNAL('activated(QString)'), self.fidChanged)
      
      #self.screwGridLayout.addWidget(self.fiducial,0,0)
      
      self.__layout.addRow("Insertion Site:", self.fiducial)
      self.__fiducial = ''
      measuredText1 = qt.QLabel("     Measured:")
      measuredText2 = qt.QLabel("     Measured:")
      lengthText = qt.QLabel("Screw Length:   ") 
      widthText = qt.QLabel("Screw Width:    ")            
      self.length = ctk.ctkComboBox()
      self.length.toolTip = "Select a screw to insert."
      screwList = ['Select a length (mm)','475', '550','625','700']
      self.length.addItems(screwList)
      self.connect(self.length, PythonQt.QtCore.SIGNAL('activated(QString)'), self.length_chosen)
      self.lengthMeasure = qt.QLineEdit()
      #self.__layout.addRow("Screw Length:", self.length)
      #self.__layout.addRow("Measured Pedicle Length:", self.lengthMeasure)
      self.__length = ''
      
      self.QHBox1 = qt.QHBoxLayout()
      self.QHBox1.addWidget(lengthText)
      self.QHBox1.addWidget(self.length)
      self.QHBox1.addWidget(measuredText1)
      self.QHBox1.addWidget(self.lengthMeasure)
      self.__layout.addRow(self.QHBox1)
      
      self.diameter = ctk.ctkComboBox()
      self.diameter.toolTip = "Select a screw to insert."
      screwList = ['Select a diameter (mm)','30', '35', '45', '50']
      self.diameter.addItems(screwList)
      self.widthMeasure = qt.QLineEdit()
      self.connect(self.diameter, PythonQt.QtCore.SIGNAL('activated(QString)'), self.diameter_chosen)
      #self.__layout.addRow("Screw Diameter:", self.diameter)
      #self.__layout.addRow("Measured Pedicle Width:", self.widthMeasure)
      self.__diameter = ''
      
      self.QHBox2 = qt.QHBoxLayout()
      self.QHBox2.addWidget(widthText)
      self.QHBox2.addWidget(self.diameter)
      self.QHBox2.addWidget(measuredText2)
      self.QHBox2.addWidget(self.widthMeasure)
      self.__layout.addRow(self.QHBox2)
      
      # Load Screw Button
      self.__loadScrewButton = qt.QPushButton("Load Screw")
      self.__loadScrewButton.enabled = False
      #self.__layout.addWidget(self.__loadScrewButton)
      self.__loadScrewButton.connect('clicked(bool)', self.loadScrew)
      
      # Delete Screw Button
      self.__delScrewButton = qt.QPushButton("Delete Screw")
      self.__delScrewButton.enabled = True
      #self.__layout.addWidget(self.__delScrewButton)
      self.__delScrewButton.connect('clicked(bool)', self.delScrew)
      
      self.QHBox3 = qt.QHBoxLayout()
      self.QHBox3.addWidget(self.__loadScrewButton)
      self.QHBox3.addWidget(self.__delScrewButton)
      self.__layout.addRow(self.QHBox3)
      
      # Input model node selector
      self.modelNodeSelector = slicer.qMRMLNodeComboBox()
      self.modelNodeSelector.toolTip = "."
      self.modelNodeSelector.nodeTypes = (("vtkMRMLModelNode"), "")
      self.modelNodeSelector.addEnabled = False
      self.modelNodeSelector.removeEnabled = False
      self.modelNodeSelector.setMRMLScene( slicer.mrmlScene ) 
      #self.__layout.addRow("Current Screws:", self.modelNodeSelector)
      
      self.transformGrid = qt.QGridLayout()
      vText = qt.QLabel("Vertical Adjustment:")
      iText = qt.QLabel("Horizontal Adjustment:")
      self.transformGrid.addWidget(vText, 0,0)
      self.transformGrid.addWidget(iText, 0,2)
      
      self.b = ctk.ctkDoubleSpinBox()
      self.b.minimum = -45
      self.b.maximum = 45
      
      self.transformGrid.addWidget(self.b, 1,0)
      
      # Transform Sliders
      self.transformSlider1 = ctk.ctkDoubleSlider()
      self.transformSlider1.minimum = -45
      self.transformSlider1.maximum = 45
      self.transformSlider1.connect('valueChanged(double)', self.transformSlider1ValueChanged)
      self.transformSlider1.connect('valueChanged(double)', self.b.setValue)
      self.transformSlider1.setMinimumHeight(120)
      #self.__layout.addRow("Rotate IS", self.transformSlider1)
      self.transformGrid.addWidget(self.transformSlider1, 1,1)
      
      self.b.connect('valueChanged(double)', self.transformSlider1.setValue)
      
      # Transform Sliders
      self.transformSlider2 = ctk.ctkSliderWidget()
      self.transformSlider2.minimum = -45
      self.transformSlider2.maximum = 45
      self.transformSlider2.connect('valueChanged(double)', self.transformSlider2ValueChanged)
      self.transformSlider2.setMaximumWidth(200)
      #self.__layout.addRow("Rotate LR", self.transformSlider2)
      self.transformGrid.addWidget(self.transformSlider2, 1,2)
      self.__layout.addRow(self.transformGrid)
      '''
      # Transfors Sliders
      self.transformSlider3 = ctk.ctkSliderWidget()
      self.transformSlider3.minimum = 0
      self.transformSlider3.maximum = 100
      self.transformSlider3.connect('valueChanged(double)', self.transformSlider3ValueChanged)
      self.__layout.addRow("Drive Screw", self.transformSlider3)
      '''
      # Insert Screw Button
      self.insertScrewButton = qt.QPushButton("Insert Screw")
      self.insertScrewButton.enabled = True
      #self.__layout.addWidget(self.__loadScrewButton)
      self.insertScrewButton.connect('clicked(bool)', self.insertScrew)
      
      # Backout Screw Button
      self.backoutScrewButton = qt.QPushButton("Backout Screw")
      self.backoutScrewButton.enabled = False
      #self.__layout.addWidget(self.__delScrewButton)
      self.backoutScrewButton.connect('clicked(bool)', self.backoutScrew)
      
      # Reset Screw Button
      self.resetScrewButton = qt.QPushButton("Reset Screw")
      self.resetScrewButton.enabled = True
      #self.__layout.addWidget(self.__delScrewButton)
      self.resetScrewButton.connect('clicked(bool)', self.resetScrew)
      
      self.QHBox4 = qt.QHBoxLayout()
      self.QHBox4.addWidget(self.insertScrewButton)
      self.QHBox4.addWidget(self.backoutScrewButton)
      self.QHBox4.addWidget(self.resetScrewButton)
      self.__layout.addRow(self.QHBox4)

      # Hide ROI Details
      #measurementsTable = ctk.ctkCollapsibleButton()
      #measurementsTable.text = "Measurements Table"
      #self.__layout.addWidget(measurementsTable)
      #measurementsTable.collapsed = True
      
      '''
      self.view = qt.QTableView()
      self.model = qt.QStandardItemModel()
      self.view.setModel(self.model)
      item = qt.QStandardItem()
      item.setText("item")
      self.model.setItem(0,0,item)
      self.__layout.addWidget(self.view)
      '''
      #self.__layout.addRow(self.screwGridLayout)
      # self.updateWidgetFromParameters(self.parameterNode())
      qt.QTimer.singleShot(0, self.killButton)
      self.currentFidIndex = self.fiducial.currentIndex
      self.currentFidLabel = self.fiducial.currentText
      self.fidNode.GetNthFiducialPosition(self.currentFidIndex,self.coords)
      print self.coords
      self.updateMeasurements()
      self.cameraFocus(self.coords)
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        # Instantiate and connect widgets ...

        #
        # Common Area
        #
        commonCollapsibleButton = ctk.ctkCollapsibleButton()
        commonCollapsibleButton.text = "Common"
        self.layout.addWidget(commonCollapsibleButton)
        commonFormLayout = qt.QFormLayout(commonCollapsibleButton)

        # ROI selector
        self.roiSelectorLabel = qt.QLabel()
        self.roiSelectorLabel.setText("Region of interest: ")
        self.exportRoiSelector = slicer.qMRMLNodeComboBox()
        self.exportRoiSelector.nodeTypes = ("vtkMRMLAnnotationROINode", "")
        self.exportRoiSelector.noneEnabled = False
        self.exportRoiSelector.addEnabled = False
        self.exportRoiSelector.removeEnabled = True
        self.exportRoiSelector.setMRMLScene(slicer.mrmlScene)
        self.exportRoiSelector.setToolTip(
            "Pick the input region of interest for comparison")
        commonFormLayout.addRow(self.roiSelectorLabel, self.exportRoiSelector)

        # Spacing
        self.compareVolumeSpacingLabel = qt.QLabel()
        self.compareVolumeSpacingLabel.setText("Comparison volume spacing: ")
        self.compareVolumeSpacing = ctk.ctkDoubleSpinBox()
        self.compareVolumeSpacing.minimum = 0.01
        self.compareVolumeSpacing.maximum = 30
        self.compareVolumeSpacing.suffix = 'mm'
        self.compareVolumeSpacing.singleStep = 0.5
        self.compareVolumeSpacing.value = 3
        self.compareVolumeSpacing.setToolTip(
            "Resolution for comparison. Smaller values mean higher accuracy but more computation time."
        )
        commonFormLayout.addRow(self.compareVolumeSpacingLabel,
                                self.compareVolumeSpacing)

        #
        # Average Area
        #
        averageCollapsibleButton = ctk.ctkCollapsibleButton()
        averageCollapsibleButton.text = "Average"
        self.layout.addWidget(averageCollapsibleButton)
        averageFormLayout = qt.QFormLayout(averageCollapsibleButton)

        # ground truth field selector
        self.maxNumberOfInputFieldsForAveraging = 10
        self.averageInputFieldSelectors = []
        for averageInputFieldIndex in xrange(
                0, self.maxNumberOfInputFieldsForAveraging):
            averageInputFieldSelectorLabel = qt.QLabel()
            averageInputFieldSelectorLabel.setText(
                'Field {0}: '.format(averageInputFieldIndex + 1))
            averageInputFieldSelector = slicer.qMRMLNodeComboBox()
            averageInputFieldSelector.nodeTypes = ("vtkMRMLVectorVolumeNode",
                                                   "")
            averageInputFieldSelector.noneEnabled = True
            averageInputFieldSelector.addEnabled = False
            averageInputFieldSelector.removeEnabled = True
            averageInputFieldSelector.setMRMLScene(slicer.mrmlScene)
            averageInputFieldSelector.setToolTip(
                "Pick the field that will be include in the average computation"
            )
            averageFormLayout.addRow(averageInputFieldSelectorLabel,
                                     averageInputFieldSelector)
            self.averageInputFieldSelectors.append(averageInputFieldSelector)

        self.averageOutputFieldLabel = qt.QLabel()
        self.averageOutputFieldLabel.setText('Output field mean:')
        self.averageOutputFieldSelector = slicer.qMRMLNodeComboBox()
        self.averageOutputFieldSelector.nodeTypes = ("vtkMRMLVectorVolumeNode",
                                                     "")
        self.averageOutputFieldSelector.noneEnabled = True
        self.averageOutputFieldSelector.addEnabled = True
        self.averageOutputFieldSelector.removeEnabled = True
        self.averageOutputFieldSelector.renameEnabled = True
        self.averageOutputFieldSelector.baseName = 'Mean'
        self.averageOutputFieldSelector.setMRMLScene(slicer.mrmlScene)
        self.averageOutputFieldSelector.setToolTip(
            "Computed mean of the displacement fields")
        averageFormLayout.addRow(self.averageOutputFieldLabel,
                                 self.averageOutputFieldSelector)

        self.varianceOutputFieldLabel = qt.QLabel()
        self.varianceOutputFieldLabel.setText('Output field mean error:')
        self.varianceOutputFieldSelector = slicer.qMRMLNodeComboBox()
        self.varianceOutputFieldSelector.nodeTypes = (
            "vtkMRMLScalarVolumeNode", "")
        self.varianceOutputFieldSelector.noneEnabled = True
        self.varianceOutputFieldSelector.addEnabled = True
        self.varianceOutputFieldSelector.removeEnabled = True
        self.varianceOutputFieldSelector.renameEnabled = True
        self.varianceOutputFieldSelector.showChildNodeTypes = False
        self.varianceOutputFieldSelector.baseName = 'MeanError'
        self.varianceOutputFieldSelector.setMRMLScene(slicer.mrmlScene)
        self.varianceOutputFieldSelector.setToolTip(
            "Computed variance of the displacement fields")
        averageFormLayout.addRow(self.varianceOutputFieldLabel,
                                 self.varianceOutputFieldSelector)

        # Compute button
        self.averageComputeButton = qt.QPushButton("Compute")
        self.averageComputeButton.toolTip = "Compute average and standard deviation"
        self.averageComputeButton.enabled = True
        averageFormLayout.addRow(self.averageComputeButton)
        self.averageComputeButton.connect('clicked(bool)', self.computeAverage)

        #
        # Difference Area
        #
        differenceCollapsibleButton = ctk.ctkCollapsibleButton()
        differenceCollapsibleButton.text = "Difference"
        self.layout.addWidget(differenceCollapsibleButton)
        differenceFormLayout = qt.QFormLayout(differenceCollapsibleButton)

        self.differenceInputFieldALabel = qt.QLabel()
        self.differenceInputFieldALabel.setText('Displacement field A')
        self.differenceInputFieldASelector = slicer.qMRMLNodeComboBox()
        self.differenceInputFieldASelector.nodeTypes = (
            "vtkMRMLVectorVolumeNode", "")
        self.differenceInputFieldASelector.noneEnabled = False
        self.differenceInputFieldASelector.addEnabled = False
        self.differenceInputFieldASelector.removeEnabled = True
        self.differenceInputFieldASelector.setMRMLScene(slicer.mrmlScene)
        self.differenceInputFieldASelector.setToolTip(
            "Pick the field that the other will be subtracted from")
        differenceFormLayout.addRow(self.differenceInputFieldALabel,
                                    self.differenceInputFieldASelector)

        self.differenceInputFieldBLabel = qt.QLabel()
        self.differenceInputFieldBLabel.setText('Displacement field B')
        self.differenceInputFieldBSelector = slicer.qMRMLNodeComboBox()
        self.differenceInputFieldBSelector.nodeTypes = (
            "vtkMRMLVectorVolumeNode", "")
        self.differenceInputFieldBSelector.noneEnabled = False
        self.differenceInputFieldBSelector.addEnabled = False
        self.differenceInputFieldBSelector.removeEnabled = True
        self.differenceInputFieldBSelector.setMRMLScene(slicer.mrmlScene)
        self.differenceInputFieldBSelector.setToolTip(
            "Pick the field to subtract from the other")
        differenceFormLayout.addRow(self.differenceInputFieldBLabel,
                                    self.differenceInputFieldBSelector)

        self.differenceOutputFieldLabel = qt.QLabel()
        self.differenceOutputFieldLabel.setText('Output difference:')
        self.differenceOutputFieldSelector = slicer.qMRMLNodeComboBox()
        self.differenceOutputFieldSelector.nodeTypes = (
            "vtkMRMLVectorVolumeNode", "")
        self.differenceOutputFieldSelector.noneEnabled = True
        self.differenceOutputFieldSelector.addEnabled = True
        self.differenceOutputFieldSelector.removeEnabled = True
        self.differenceOutputFieldSelector.renameEnabled = True
        self.differenceOutputFieldSelector.baseName = 'Difference'
        self.differenceOutputFieldSelector.setMRMLScene(slicer.mrmlScene)
        self.differenceOutputFieldSelector.setToolTip(
            "Computed difference of the displacement fields")
        differenceFormLayout.addRow(self.differenceOutputFieldLabel,
                                    self.differenceOutputFieldSelector)

        # Compute button
        self.differenceComputeButton = qt.QPushButton("Compute")
        self.differenceComputeButton.toolTip = "Compute difference between fields (FieldA-FieldB)"
        self.differenceComputeButton.enabled = True
        differenceFormLayout.addRow(self.differenceComputeButton)
        self.differenceComputeButton.connect('clicked(bool)',
                                             self.computeDifference)

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

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

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

    #
    # ROI volume selector
    #
    self.ROISelector = slicer.qMRMLNodeComboBox()
    # self.ROISelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" )
    # self.ROISelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", 1 )
    self.ROISelector.nodeTypes = ["vtkMRMLLabelMapVolumeNode"]
    self.ROISelector.selectNodeUponCreation = False
    self.ROISelector.addEnabled = False
    self.ROISelector.removeEnabled = False
    self.ROISelector.noneEnabled = True
    self.ROISelector.showHidden = False
    self.ROISelector.showChildNodeTypes = False
    self.ROISelector.setMRMLScene( slicer.mrmlScene )
    self.ROISelector.setToolTip( "ROI for analysis" )
    parametersFormLayout.addRow("Rectangular ROI: ", self.ROISelector)

    #object type selector
    self.typeSel = ctk.ctkComboBox()
    types=["Wedge","Ramp"]
    self.typeSel.addItems(types)
    self.typeSel.editable=False
    self.typeSel.setCurrentIndex(0)
    parametersFormLayout.addRow("Type of Analysis", self.typeSel)

    self.angleSB=ctk.ctkDoubleSpinBox()
    self.angleSB.minimum=0
    self.angleSB.maximum=360
    self.angleSB.value=11.3
    self.angleSB.enabled=True
    parametersFormLayout.addRow("Angle Value: ",self.angleSB)

    #direction selector
    self.directionSel = ctk.ctkComboBox()
    directions=["x vs y","y vs x","z vs x"]#todo: add all directions
    self.directionSel.addItems(directions)
    self.directionSel.editable=False
    self.directionSel.setCurrentIndex(0)
    parametersFormLayout.addRow("Direction: ", self.directionSel)

    #
    # Apply Button
    #
    self.applyButton = qt.QPushButton("Apply")
    self.applyButton.toolTip = "Calculate FWHM."
    self.applyButton.enabled = False
    parametersFormLayout.addRow(self.applyButton)

    resultCollapsibleButton = ctk.ctkCollapsibleButton()
    resultCollapsibleButton.text = "Results"
    self.framelayout.addWidget(resultCollapsibleButton)

    # Layout within the dummy collapsible button
    resultFormLayout = qt.QFormLayout(resultCollapsibleButton)

    #
    # Array selector
    #
    self.ArraySelector = slicer.qMRMLNodeComboBox()
    self.ArraySelector.nodeTypes = ( ("vtkMRMLDoubleArrayNode"), "" )
    self.ArraySelector.selectNodeUponCreation = False
    self.ArraySelector.addEnabled = False
    self.ArraySelector.removeEnabled = False
    self.ArraySelector.noneEnabled = True
    self.ArraySelector.showHidden = False
    self.ArraySelector.showChildNodeTypes = False
    self.ArraySelector.setMRMLScene( slicer.mrmlScene )
    self.ArraySelector.setToolTip( "Ramp profile" )
    resultFormLayout.addRow("Ramp profile: ", self.ArraySelector)

    self.FWHMVal=qt.QLineEdit()
    self.FWHMVal.readOnly=True
    self.FWHMVal.text=""
    resultFormLayout.addRow("FWHM: ",self.FWHMVal)

    self.SliceThkVal=qt.QLineEdit()
    self.SliceThkVal.readOnly=True
    self.SliceThkVal.text=""
    resultFormLayout.addRow("SliceThk: ",self.SliceThkVal)

    # connections
    self.applyButton.connect('clicked(bool)', self.onApplyButton)
    self.masterSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)
    self.ROISelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)
    self.ArraySelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelectArray)

    # Add vertical spacer
    self.layout.addStretch(1)
  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 = "FiducialToImageRegistration 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.volumeSelector = slicer.qMRMLNodeComboBox()
    self.volumeSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" )
    self.volumeSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", 0 )
    self.volumeSelector.selectNodeUponCreation = True
    self.volumeSelector.addEnabled = False
    self.volumeSelector.removeEnabled = False
    self.volumeSelector.noneEnabled = False
    self.volumeSelector.showHidden = False
    self.volumeSelector.showChildNodeTypes = False
    self.volumeSelector.setMRMLScene( slicer.mrmlScene )
    self.volumeSelector.setToolTip( "Pick the input to the algorithm." )
    parametersFormLayout.addRow("Input Volume: ", self.volumeSelector)

    #
    # input fiducial list
    #
    self.fiducialSelector = slicer.qMRMLNodeComboBox()
    self.fiducialSelector.nodeTypes = ( ("vtkMRMLMarkupsFiducialNode"), "" )
    self.fiducialSelector.selectNodeUponCreation = False
    self.fiducialSelector.addEnabled = False
    self.fiducialSelector.removeEnabled = False
    self.fiducialSelector.noneEnabled = False
    self.fiducialSelector.showHidden = False
    self.fiducialSelector.showChildNodeTypes = False
    self.fiducialSelector.setMRMLScene( slicer.mrmlScene )
    self.fiducialSelector.setToolTip( "Pick the input to the algorithm." )
    parametersFormLayout.addRow("Input Fiducials: ", self.fiducialSelector)

    #
    # output transform selector
    #
    self.transformSelector = slicer.qMRMLNodeComboBox()
    self.transformSelector.nodeTypes = ( ("vtkMRMLLinearTransformNode"), "" )
    self.transformSelector.selectNodeUponCreation = True
    self.transformSelector.addEnabled = True
    self.transformSelector.removeEnabled = True
    self.transformSelector.renameEnabled = True
    self.transformSelector.noneEnabled = False
    self.transformSelector.showHidden = False
    self.transformSelector.showChildNodeTypes = False
    self.transformSelector.setMRMLScene( slicer.mrmlScene )
    self.transformSelector.setToolTip( "Pick the output to the algorithm." )
    parametersFormLayout.addRow("Output Transform: ", self.transformSelector)

    #
    # registration error
    #
    self.registrationError = ctk.ctkDoubleSpinBox()
    self.registrationError.setToolTip("Registration Error")
    self.registrationError.minimum = 0
    self.registrationError.maximum = 1000
    parametersFormLayout.addRow("Registration Error: ", self.registrationError)

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

    # connections
    self.applyButton.connect('clicked(bool)', self.onApplyButton)
    self.volumeSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)
    self.fiducialSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)
    self.transformSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)

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