Пример #1
0
    def setup(self):
        self.tableAreaWidget = qt.QWidget()
        self.layout.addWidget(self.tableAreaWidget)
        self.tableLayout = qt.QVBoxLayout(self.tableAreaWidget)
        label = qt.QLabel('Clinical Data')
        #self.tableLayout.addWidget(label)
        self.clinicalDataTableWidget = qt.QTableWidget()
        self.tableLayout.addWidget(self.clinicalDataTableWidget)
        verticalheader = self.clinicalDataTableWidget.verticalHeader()
        verticalheader.setDefaultSectionSize(20)

        self.buttonsWidget = qt.QWidget()
        self.buttonsLayout = qt.QHBoxLayout(self.buttonsWidget)
        self.layout.addWidget(self.buttonsWidget)

        self.accessLabel = qt.QLabel('')
        self.buttonsLayout.addWidget(self.accessLabel)
        self.buttonsLayout.addStretch(1)
        self.updateButton = qt.QPushButton('Update Cache')
        self.updateButton.toolTip = 'Connect to cBioPortal and update the data'
        self.buttonsLayout.addWidget(self.updateButton)

        self.closeButton = qt.QPushButton('Close')
        self.buttonsLayout.addWidget(self.closeButton)

        # Connections
        self.updateButton.connect('clicked(bool)', self.onUpdateButton)
        self.closeButton.connect('clicked(bool)', self.onCloseButton)
Пример #2
0
 def displaySearchResults( self, searchResults ): # look into highlighting query rows or another option to remove session numbers
   # Add a table with all the search results
   searchResultsTable = qt.QTableWidget()
   searchResultsTable.setWindowTitle( "Sessions" )
   searchResultsTable.resize( 6 * SEARCH_TABLE_ID_COLUMN_WIDTH, 4 * SEARCH_TABLE_ID_COLUMN_WIDTH )
   
   searchResultsTable.setRowCount( len( searchResults ) )
   searchResultsTable.setColumnCount( SEARCH_TABLE_NUMBER_OF_COLUMNS )
   searchResultsTable.setHorizontalHeaderItem( 0, qt.QTableWidgetItem( "User ID" ) )
   searchResultsTable.setColumnWidth( 0, SEARCH_TABLE_ID_COLUMN_WIDTH )
   searchResultsTable.setHorizontalHeaderItem( 1, qt.QTableWidgetItem( "Study ID" ) )
   searchResultsTable.setColumnWidth( 1, SEARCH_TABLE_ID_COLUMN_WIDTH )
   searchResultsTable.setHorizontalHeaderItem( 2, qt.QTableWidgetItem( "Trial ID" ) )
   searchResultsTable.setColumnWidth( 2, SEARCH_TABLE_ID_COLUMN_WIDTH )
   searchResultsTable.setHorizontalHeaderItem( 3, qt.QTableWidgetItem( "Skill Level" ) )
   searchResultsTable.setColumnWidth( 3, SEARCH_TABLE_ID_COLUMN_WIDTH )
   searchResultsTable.setHorizontalHeaderItem( 4, qt.QTableWidgetItem( "Date" ) )
   searchResultsTable.setColumnWidth( 4, 2 * SEARCH_TABLE_ID_COLUMN_WIDTH )
   
   for row in range( len( searchResults ) ):
     for col in range( SEARCH_TABLE_NUMBER_OF_COLUMNS ):
       searchResultsTable.setItem( row, col, qt.QTableWidgetItem( searchResults[ row ][ col ] ) )
   
   searchResultsTable.show() 
   
   searchResultsTable.connect( "cellDoubleClicked(int,int)", partial( self.onLoadSession, searchResultsTable, searchResults ) )           
Пример #3
0
 def addTableWidget(self):
     self.tableWidgetBox = qt.QGroupBox()
     layout = qt.QHBoxLayout()
     self.tableWidgetBox.setLayout(layout)
     self.tableWidgetBox.setStyleSheet('QGroupBox{border:0;}')
     self.tableWidget = qt.QTableWidget()
     self.tableWidget.setStyleSheet('QGroupBox{border:0;}')
     self.tableWidget.horizontalScrollBar().setEnabled(True)
     self.tableWidget.setHorizontalScrollBarPolicy(1)
     self.tableWidget.setVerticalScrollBarPolicy(1)
     #layout.setColumnMinimumWidth(0,340)
     #layout.setRowMinimumHeight(0,100)
     #layout.setGeometry (qt.QRect(0, 0, 340, 100))
     layout.addWidget(self.tableWidget)
     #self.tableWidget.setGeometry (qt.QRect(0, 0, 400, 200))
     #self.tableWidget.setMinimumHeight(200)
     #self.tableWidget.setMinimumWidth(300)
     self.tableWidget.setObjectName('tableWidget')
     self.tableWidget.setColumnCount(2)
     self.tableWidget.setRowCount(2)
     #self.tableWidget.resizeRowsToContents()
     #self.tableWidget.resizeColumnsToContents()
     self.tableWidget.setHorizontalHeaderLabels(
         "Venous;Ventricle".split(";"))
     self.tableWidget.setVerticalHeaderLabels("Serial1;Serial2".split(";"))
Пример #4
0
 def setupTargetTable(self):
   self.table = qt.QTableWidget(0, 2)
   self.table.setSelectionBehavior(qt.QAbstractItemView.SelectRows)
   self.table.setSelectionMode(qt.QAbstractItemView.SingleSelection)
   self.table.setMaximumHeight(200)
   self.table.horizontalHeader().setStretchLastSection(True)
   self.resetTable()
   self.layout().addWidget(self.table)
Пример #5
0
 def __init__(self,parent, width=350,height=100):
   self.widget = qt.QTableWidget(parent)
   self.widget.setMinimumHeight(height)
   self.widget.setMinimumWidth(width)
   self.width = width
   self.height = height
   self.items = []
   self.loadables = {}
   self.setLoadables([])
    def build_process_setup(self):
        self.processTable = qt.QTableWidget(0, 1)
        self.processTable.setEditTriggers(qt.QAbstractItemView.NoEditTriggers)
        self.processTable.setSelectionBehavior(qt.QAbstractItemView.SelectRows)
        self.processTable.horizontalHeader().hide()
        self.processTable.horizontalHeader().setSectionResizeMode(
            0, qt.QHeaderView.Stretch)
        self.processTable.setSizePolicy(qt.QSizePolicy.Minimum,
                                        qt.QSizePolicy.Minimum)
        self.processTable.setMaximumHeight(70)

        self.processTools = qt.QFrame()
        box = qt.QHBoxLayout(self.processTools)
        box.addWidget(
            InterfaceTools.build_button(
                'Add Custom Elastix', lambda: self.click_add_registration_step(
                    RegistrationType.CUSTOM_ELASTIX)))
        box.addWidget(
            InterfaceTools.build_button(
                'Add Custom BRAINS',
                lambda: self.click_add_registration_step(RegistrationType.
                                                         CUSTOM_BRAINS),
                tooltip='transformType         : Rigid' + '\n' +
                'samplingPercentage    : 1.0' + '\n' +
                'initialTransformMode  : off' + '\n' +
                'maskProcessingMode    : NOMASK' + '\n' +
                'costMetric            : NC' + '\n' +
                'numberOfIterations    : 1000' + '\n' +
                'minimumStepLength	   : 0.0000001' + '\n' +
                'maximumStepLength     : 0.001' + '\n' +
                'skewScale             : 1.0' + '\n' +
                'reproportionScale     : 1.0' + '\n' +
                'relaxationFactor      : 0.5' + '\n' +
                'translationScale      : 1.0'))
        b = InterfaceTools.build_button('Clear',
                                        self.click_clear_registration_step)
        b.setFixedWidth(73)
        box.addWidget(b)
        box.setContentsMargins(0, 0, 0, 0)

        layout = qt.QFormLayout()
        layout.addRow("Registration Steps:", self.processTable)
        layout.addWidget(self.processTools)
        layout.setMargin(10)
        return layout
 def build_volume_pair_table(self):
     self.volumeTable = qt.QTableWidget(0, 3)
     self.volumeTable.setEditTriggers(qt.QAbstractItemView.NoEditTriggers)
     self.volumeTable.setHorizontalHeaderLabels(
         ["Fixed Volume", "Moving Volume", "Status"])
     self.volumeTable.verticalHeader().setFixedWidth(30)
     self.volumeTable.verticalHeader().setSectionResizeMode(
         qt.QHeaderView.Fixed)
     self.volumeTable.horizontalHeader().setSectionResizeMode(
         0, qt.QHeaderView.Stretch)
     self.volumeTable.horizontalHeader().setSectionResizeMode(
         1, qt.QHeaderView.Stretch)
     self.volumeTable.setColumnWidth(2, 70)
     self.volumeTable.setSelectionBehavior(qt.QAbstractItemView.SelectRows)
     self.volumeTable.connect('itemSelectionChanged()',
                              self.update_selection)
     layout = qt.QVBoxLayout()
     layout.addWidget(self.volumeTable)
     layout.setMargin(10)
     return layout
Пример #8
0
    def setup(self):
        # Instantiate and connect widgets ...
        ScriptedLoadableModuleWidget.setup(self)

        #self.logic = CIP_CalciumScoringLogic()

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

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

        #
        # target volume selector
        #
        self.inputSelector = slicer.qMRMLNodeComboBox()
        self.inputSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" )
        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("Target Volume: ", self.inputSelector)
        self.inputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onVolumeChanged)
        self.volumeNode = self.inputSelector.currentNode()
        
        #
        # calcification type
        #
#        self.calcificationTypeBox = qt.QComboBox()
#        self.calcificationTypeBox.addItem("Heart")
#        self.calcificationTypeBox.addItem("Aorta")
#        parametersFormLayout.addRow("Region", self.calcificationTypeBox)
#        self.calcificationTypeBox.connect("currentIndexChanged(int)", self.onTypeChanged)

        self.ThresholdRange = ctk.ctkRangeWidget()
        self.ThresholdRange.minimum = 0
        self.ThresholdRange.maximum = 2000
        self.ThresholdRange.setMinimumValue(self.ThresholdMin)
        self.ThresholdRange.setMaximumValue(self.ThresholdMax)
        self.ThresholdRange.connect("minimumValueChanged(double)", self.onThresholdMinChanged)
        self.ThresholdRange.connect("maximumValueChanged(double)", self.onThresholdMaxChanged)
        parametersFormLayout.addRow("Threshold Value", self.ThresholdRange)
        self.ThresholdRange.setMinimumValue(self.ThresholdMin)
        self.ThresholdRange.setMaximumValue(self.ThresholdMax)

        self.LesionSizeRange= ctk.ctkRangeWidget()
        self.LesionSizeRange.minimum = 0.5
        self.LesionSizeRange.maximum = 1000
        self.LesionSizeRange.setMinimumValue(self.MinimumLesionSize)
        self.LesionSizeRange.setMaximumValue(self.MaximumLesionSize)
        self.LesionSizeRange.connect("minimumValueChanged(double)", self.onMinSizeChanged)
        self.LesionSizeRange.connect("maximumValueChanged(double)", self.onMaxSizeChanged)
        parametersFormLayout.addRow("Lesion Size (mm^3)", self.LesionSizeRange)
        self.LesionSizeRange.setMinimumValue(self.MinimumLesionSize)
        self.LesionSizeRange.setMaximumValue(self.MaximumLesionSize)

        self.scoreField=dict()
        for sr in self.summary_reports:
          self.scoreField[sr] = qt.QLineEdit()
          self.scoreField[sr].setText(0)
          parametersFormLayout.addRow("Total "+sr, self.scoreField[sr])
        
        
        #
        # Update button and Select Table
        #
        
        self.updateButton = qt.QPushButton("Update")
        self.updateButton.toolTip = "Update calcium score computation"
        self.updateButton.enabled = True
        self.updateButton.setFixedSize(100, 50)
        #parametersFormLayout.addRow("", self.updateButton)
        
        self.updateButton.connect('clicked()', self.onUpdate)
        
        #
        # Select table
        #
        self.selectLabels = qt.QTableWidget()
        #self.selectLabels.horizontalHeader().hide()
        self.selectLabels.verticalHeader().hide()
        self.selectLabels.setColumnCount(6)
        self.selectLabels.itemClicked.connect(self.handleItemClicked)
        
        #Add row with columns name
        col_names=["","Agatston Score","Mass Score","Volume (mm^3)","Mean HU","Max HU"]
        self.selectLabels.setHorizontalHeaderLabels(col_names)
        
        parametersFormLayout.addRow(self.updateButton, self.selectLabels)


        #
        # Save Widget Area
        #

        #self.saveCollapsibleButton = ctk.ctkCollapsibleButton()
        #self.saveCollapsibleButton.text = "Saving"
        #self.layout.addWidget(self.saveCollapsibleButton)

        self.reportsWidget = CaseReportsWidget(self.moduleName, self.columnsDict, parentWidget=self.parent)
        self.reportsWidget.setup()
        self.reportsWidget.showPrintButton(False)
        
        self.reportsWidget.addObservable(self.reportsWidget.EVENT_SAVE_BUTTON_CLICKED, self.onSaveReport)

        #
        # ROI Area
        #
        self.roiCollapsibleButton = ctk.ctkCollapsibleButton()
        self.roiCollapsibleButton.text = "ROI"
        self.roiCollapsibleButton.setChecked(False)
        self.layout.addWidget(self.roiCollapsibleButton)

        # Layout within the dummy collapsible button
        roiFormLayout = qt.QFormLayout(self.roiCollapsibleButton)

        #
        # ROI
        #
        self.ROIWidget = slicer.qMRMLAnnotationROIWidget()
        self.roiNode = slicer.vtkMRMLAnnotationROINode()
        slicer.mrmlScene.AddNode(self.roiNode)
        self.ROIWidget.setMRMLAnnotationROINode(self.roiNode)
        roiFormLayout.addRow("", self.ROIWidget)
        #self.roiNode.AddObserver("ModifiedEvent", self.onROIChangedEvent, 1)

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

        # Add temp nodes
        self.croppedNode=slicer.vtkMRMLScalarVolumeNode()
        self.croppedNode.SetHideFromEditors(1)
        slicer.mrmlScene.AddNode(self.croppedNode)
        self.labelsNode=slicer.vtkMRMLLabelMapVolumeNode()
        slicer.mrmlScene.AddNode(self.labelsNode)
        
        if self.inputSelector.currentNode():
            self.onVolumeChanged(self.inputSelector.currentNode())
Пример #9
0
 def __init__(self,parent):
   self.widget = qt.QTableWidget(parent,width=350,height=300)
   self.items = []
   self.setHeader(None)
Пример #10
0
  def setup(self):
    # this is the function that implements all GUI 
    ScriptedLoadableModuleWidget.setup(self)

    # This sets the view being used to the red view only 
    slicer.app.layoutManager().setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutOneUpRedSliceView)

    l = slicer.modules.createmodels.logic()
    self.needleModel = l.CreateNeedle(150, 0.4, 0, False)
    #This code block creates a collapsible button 
    #This defines which type of button you are using 
    self.usContainer = ctk.ctkCollapsibleButton()
    #This is what the button will say 
    self.usContainer.text = "Ultrasound Information"
    #Thiss actually creates that button
    self.layout.addWidget(self.usContainer)
    #This creates a variable that describes layout within this collapsible button 
    self.usLayout = qt.QFormLayout(self.usContainer)

    #This descirbes the type of widget 
    self.inputIPLineEdit = qt.QLineEdit()
    #This sets a placehoder example of what should be inputted to the line edit 
    self.inputIPLineEdit.setPlaceholderText("127.0.0.1")
    #This is the help tooltip 
    self.inputIPLineEdit.toolTip = "Put the IP address of your ultrasound device here"
    #This is the text that is input inot the line 
    self.IPLabel = qt.QLabel("Server IP:")
    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      self.usLayout.addRow(self.IPLabel, self.inputIPLineEdit)

    #This code block is the exact same as the one above only it asks for the server port 
    self.layout.addWidget(self.usContainer)
    self.inputPortLineEdit = qt.QLineEdit()
    self.inputPortLineEdit.setPlaceholderText("18944")
    self.inputPortLineEdit.setValidator(qt.QIntValidator())
    self.inputPortLineEdit.toolTip = "Put the Port of your ultrasound device here"
    self.portLabel = qt.QLabel("Sever Port:")
    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      self.usLayout.addRow(self.portLabel, self.inputPortLineEdit)

    #This is a push button 
    self.connectButton = qt.QPushButton()
    self.connectButton.setDefault(False)
    #This button says connect 
    self.connectButton.text = "Connect"
    #help tooltip that explains the funciton 
    self.connectButton.toolTip = "Connects to Ultrasound"
    #adds the widget to the layout 
    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      self.usLayout.addWidget(self.connectButton)

    # Combobox for image selection
    self.imageSelector = slicer.qMRMLNodeComboBox()
    self.imageSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
    self.imageSelector.selectNodeUponCreation = True
    self.imageSelector.addEnabled = False
    self.imageSelector.removeEnabled = False
    self.imageSelector.noneEnabled = True
    self.imageSelector.showHidden = False
    self.imageSelector.showChildNodeTypes = False
    self.imageSelector.setMRMLScene( slicer.mrmlScene )
    self.imageSelector.setToolTip( "Pick the image to be used." )
    self.usLayout.addRow("US Volume: ", self.imageSelector)
    
    #add combo box for linear transform node 
    self.TransformSelector = slicer.qMRMLNodeComboBox()
    self.TransformSelector.nodeTypes = ["vtkMRMLLinearTransformNode"]
    self.TransformSelector.selectNodeUponCreation = True
    self.TransformSelector.addEnabled = False
    self.TransformSelector.removeEnabled = False
    self.TransformSelector.noneEnabled = True
    self.TransformSelector.showHidden = False
    self.TransformSelector.showChildNodeTypes = False
    self.TransformSelector.setMRMLScene( slicer.mrmlScene )
    self.TransformSelector.setToolTip( "Pick the transform representing the straw line." )
    self.usLayout.addRow("Tip to Probe: ", self.TransformSelector)
    
    self.calibrationContainer = ctk.ctkCollapsibleButton()
    #This is what the button will say 
    self.calibrationContainer.text = "Calibration Parameters"
    #Thiss actually creates that button
    self.layout.addWidget(self.calibrationContainer)
    #This creates a variable that describes layout within this collapsible button 
    self.calibrationLayout = qt.QFormLayout(self.calibrationContainer)
    
    self.segLabel = qt.QLabel()
    self.calibrationLayout.addRow(qt.QLabel("Type of segmentation:"), self.segLabel)
    
    self.recordContainer = ctk.ctkCollapsibleButton()
    #This is what the button will say 
    self.recordContainer.text = "Recording Options"
    #Thiss actually creates that button
    #This creates a variable that describes layout within this collapsible button 
    self.recordLayout = qt.QFormLayout(self.recordContainer)
    
    self.RecordButton = qt.QPushButton() 
    self.RecordButton.text = "Start Recording" 
    self.recordLayout.addWidget(self.RecordButton)
    
    self.StopRecordButton = qt.QPushButton() 
    self.StopRecordButton.text = "Stop Recording" 
    self.recordLayout.addWidget(self.StopRecordButton)
    
    self.pathInput = qt.QLineEdit()
    self.pathInput.setPlaceholderText("Enter the path to save files to")
    self.pathText = qt.QLabel("File Path:")
    self.recordLayout.addRow(self.pathText, self.pathInput)
    
    self.SaveRecordButton = qt.QPushButton() 
    self.SaveRecordButton.text = "Save Recording" 
    self.recordLayout.addWidget(self.SaveRecordButton)
    
    # This creates another collapsible button
    self.fiducialContainer = ctk.ctkCollapsibleButton()
    self.fiducialContainer.text = "Registration"

    self.fiducialLayout = qt.QFormLayout(self.fiducialContainer)

    #This is the exact same as the code block below but it freezes the US to capture a screenshot 
    self.freezeButton = qt.QPushButton()
    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      self.freezeButton.text = "Freeze"
    else:
      self.freezeButton.text = "Place Fiducial"
    self.freezeButton.toolTip = "Freeze the ultrasound image for fiducial placement"
    self.fiducialLayout.addRow(self.freezeButton)
    self.shortcut = qt.QShortcut(qt.QKeySequence('f'), slicer.util.mainWindow())
    
    self.numFidLabel = qt.QLabel()
    self.fiducialLayout.addRow(qt.QLabel("Fiducials collected:"), self.numFidLabel)

    self.transformTable = qt.QTableWidget() 
    self.transTableItem = qt.QTableWidgetItem()
    self.fidError = qt.QLabel()
    self.transformTable.setRowCount(4)
    self.transformTable.setColumnCount(4)
    self.transformTable.horizontalHeader().hide()
    self.transformTable.verticalHeader().hide()
    self.transformTable.setItem(0,0, qt.QTableWidgetItem("1"))
    self.transformTable.setItem(0,1, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(0,2, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(0,3, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(1,0, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(1,1, qt.QTableWidgetItem("1"))
    self.transformTable.setItem(1,2, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(1,3, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(2,0, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(2,1, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(2,2, qt.QTableWidgetItem("1"))
    self.transformTable.setItem(2,3, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(3,0, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(3,1, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(3,2, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(3,3, qt.QTableWidgetItem("1"))
    self.transformTable.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.MinimumExpanding)
    self.copyIcon =qt.QIcon(":Icons/Medium/SlicerEditCopy.png")
    self.copyButton = qt.QPushButton()
    self.copyButton.setIcon(self.copyIcon)
    self.copyButton.toolTip = "Copy" 
    self.copyButton.setMaximumWidth(64)
    self.copyHbox = qt.QHBoxLayout()
    self.copyHbox.addWidget(self.copyButton)
    
    self.copyButton.enabled = False 
    if self.numFidLabel >= 2: 
      self.copyButton.enabled = True 
      
    self.fiducialLayout.addRow(qt.QLabel("Image to probe transform:"))
    self.fiducialLayout.addRow(self.transformTable)
         # Add vertical spacer
    self.layout.addStretch(1)
    
         # Add vertical spacer
    self.layout.addStretch(1)
    
    self.fiducialLayout.addRow("Copy:", self.copyHbox)
 

    self.validationContainer = ctk.ctkCollapsibleButton()
    self.validationContainer.text = "Validation"
    self.validationLayout = qt.QFormLayout(self.validationContainer)

    self.visualizeButton = qt.QPushButton('Show 3D Scene')
    self.visualizeButton.toolTip = "This button enables the 3D view for visual validation"
    self.validationLayout.addRow(self.visualizeButton)
    self.visualizeButton.connect('clicked(bool)', self.onVisualizeButtonClicked)


    self.resetButton = qt.QPushButton('Reset')
    self.resetButton.setDefault(False)
    self.resetButton.toolTip = "This Button Resets the Module"
    self.validationLayout.addRow(self.resetButton)

    # Add the containers to the parent
    self.layout.addWidget(self.usContainer)
    self.layout.addWidget(self.calibrationContainer)
    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      self.layout.addWidget(self.recordContainer)
    self.layout.addWidget(self.fiducialContainer)

    #self.layout.addWidget(self.transformContainer)
    self.layout.addWidget(self.validationContainer)

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

    # Connections
    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      self.connectButton.connect('clicked(bool)', self.onConnectButtonClicked)
      self.freezeButton.connect('clicked(bool)', self.onConnectButtonClicked)
      self.shortcut.connect('activated()', self.onConnectButtonClicked)
    else: 
      self.shortcut.connect('activated()', self.onFiducialClicked)
      self.freezeButton.connect('clicked(bool)', self.onFiducialClicked)
    self.RecordButton.connect('clicked(bool)', self.onRecordButtonClicked)
    self.StopRecordButton.connect('clicked(bool)', self.onStopRecordButtonClicked)
    self.SaveRecordButton.connect('clicked(bool)', self.onSaveRecordButtonClicked)
    self.copyButton.connect('clicked(bool)', self.onCopyButtonClicked)
    self.inputIPLineEdit.connect('textChanged(QString)', self.onInputChanged)
    self.inputPortLineEdit.connect('textChanged(QString)', self.onInputChanged)
    self.imageSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.onImageChanged)
    self.TransformSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.onTransformChanged)
    self.resetButton.connect('clicked(bool)', self.onResetButtonClicked)
    # Disable buttons until conditions are met
    self.connectButton.setEnabled(True) 
    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      self.freezeButton.setEnabled(False) 
    self.StopRecordButton.setEnabled(False)
    
    self.sceneObserverTag = slicer.mrmlScene.AddObserver(slicer.mrmlScene.NodeAddedEvent, self.onNodeAdded)
Пример #11
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)
        self.logic = CNN_Image_ClassifierLogic()
        self.moduleDir = os.path.dirname(
            slicer.modules.collect_training_images.path)

        # 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)

        self.modelSelector = qt.QComboBox()
        self.modelSelector.addItems(["Select model"])
        modelDirectoryContents = os.listdir(
            os.path.join(self.moduleDir, os.pardir, "Models/retrainContainer"))
        modelNames = [
            dir for dir in modelDirectoryContents
            if dir.find(".") == -1 and dir != "Dockerfile"
        ]
        self.modelSelector.addItems(["Create new model"])
        self.modelSelector.addItems(modelNames)
        parametersFormLayout.addRow(self.modelSelector)

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

        #
        # Object table
        #
        self.objectTable = qt.QTableWidget()
        self.objectTable.setColumnCount(3)
        self.objectTable.setHorizontalHeaderLabels(
            ["Name", "Found", "Confidence"])
        parametersFormLayout.addRow(self.objectTable)

        #
        # Adjust Confidence Thresholds
        #
        confidenceThresholdsCollapsibleButton = ctk.ctkCollapsibleButton()
        confidenceThresholdsCollapsibleButton.text = "Confidence Thresholds"
        self.layout.addWidget(confidenceThresholdsCollapsibleButton)

        confidenceFormLayout = qt.QFormLayout(
            confidenceThresholdsCollapsibleButton)

        self.confidenceSlider = qt.QSlider(0x1)  #horizontal slider
        self.confidenceSlider.setRange(0, 100)
        self.confidenceSlider.setTickInterval(5)
        self.confidenceSlider.setTickPosition(2)  #Ticks appear below slider
        self.confidenceSlider.setSliderPosition(80)
        self.confidenceSlider.setToolTip(
            "Set the minimum degree of confidence that must be met for an object to be considered found"
        )
        confidenceFormLayout.addRow("Confidence: ", self.confidenceSlider)
        self.confidenceLabel = qt.QLabel("80%")
        confidenceFormLayout.addRow(self.confidenceLabel)

        # connections
        self.applyButton.connect('clicked(bool)', self.onApplyButton)
        self.modelSelector.connect('currentIndexChanged(int)',
                                   self.onModelSelected)
        self.confidenceSlider.connect('sliderMoved(int)',
                                      self.onConfidenceChanged)

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

        # Refresh Apply button state
        self.onSelect()

        self.webcamReference = slicer.util.getNode('Webcam_Reference')
        if not self.webcamReference:
            imageSpacing = [0.2, 0.2, 0.2]
            imageData = vtk.vtkImageData()
            imageData.SetDimensions(640, 480, 1)
            imageData.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 1)
            thresholder = vtk.vtkImageThreshold()
            thresholder.SetInputData(imageData)
            thresholder.SetInValue(0)
            thresholder.SetOutValue(0)
            # Create volume node
            self.webcamReference = slicer.vtkMRMLVectorVolumeNode()
            self.webcamReference.SetName('Webcam_Reference')
            self.webcamReference.SetSpacing(imageSpacing)
            self.webcamReference.SetImageDataConnection(
                thresholder.GetOutputPort())
            # Add volume to scene
            slicer.mrmlScene.AddNode(self.webcamReference)
            displayNode = slicer.vtkMRMLVectorVolumeDisplayNode()
            slicer.mrmlScene.AddNode(displayNode)
            self.webcamReference.SetAndObserveDisplayNodeID(
                displayNode.GetID())

        self.webcamConnectorNode = self.createWebcamPlusConnector()
        self.webcamConnectorNode.Start()
        self.setupWebcamResliceDriver()
Пример #12
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        # Instantiate and connect widgets ...

        ####################
        # For debugging
        #
        # Reload and Test area
        reloadCollapsibleButton = ctk.ctkCollapsibleButton()
        reloadCollapsibleButton.text = "Reload && Test"
        reloadCollapsibleButton.collapsed = True
        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 = "PathCollisionAnalysis Reload"
        reloadFormLayout.addWidget(self.reloadButton)
        self.reloadButton.connect('clicked()', self.onReload)
        #
        ####################
        #
        # Main area
        #
        mainCollapsibleButton = ctk.ctkCollapsibleButton()
        mainCollapsibleButton.text = "Collision Analysis"
        mainCollapsibleButton.collapsed = False
        self.layout.addWidget(mainCollapsibleButton)
        mainFormLayout = qt.QFormLayout(mainCollapsibleButton)

        # - input fiducials (trajectory) selector
        self.inputFiducialSelector = slicer.qMRMLNodeComboBox()
        self.inputFiducialSelector.nodeTypes = ["vtkMRMLMarkupsFiducialNode"]
        self.inputFiducialSelector.selectNodeUponCreation = True
        self.inputFiducialSelector.addEnabled = True
        self.inputFiducialSelector.removeEnabled = True
        self.inputFiducialSelector.noneEnabled = False
        self.inputFiducialSelector.showHidden = False
        self.inputFiducialSelector.showChildNodeTypes = False
        self.inputFiducialSelector.setMRMLScene(slicer.mrmlScene)
        self.inputFiducialSelector.setToolTip("Pick the trajectory.")
        mainFormLayout.addRow("Trajectory: ", self.inputFiducialSelector)

        #  - Model selector
        self.inputModelHierarchySelector = slicer.qMRMLNodeComboBox()
        self.inputModelHierarchySelector.nodeTypes = [
            "vtkMRMLModelHierarchyNode"
        ]
        self.inputModelHierarchySelector.selectNodeUponCreation = True
        self.inputModelHierarchySelector.addEnabled = True
        self.inputModelHierarchySelector.removeEnabled = True
        self.inputModelHierarchySelector.noneEnabled = False
        self.inputModelHierarchySelector.showHidden = False
        self.inputModelHierarchySelector.showChildNodeTypes = False
        self.inputModelHierarchySelector.setMRMLScene(slicer.mrmlScene)
        self.inputModelHierarchySelector.setToolTip("Select a 3D Model")
        mainFormLayout.addRow("Model:", self.inputModelHierarchySelector)

        self.modelNode = None
        #self.inputModelHierarchySelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onModelSelected)

        self.intersectionTable = qt.QTableWidget(1, 6)
        self.intersectionTable.setSelectionBehavior(
            qt.QAbstractItemView.SelectRows)
        self.intersectionTable.setSelectionMode(
            qt.QAbstractItemView.SingleSelection)
        self.intersectionTableHeader = [
            "Model", "Entry 1", "Entry 2", "Length", "Curvature 1",
            "Curvature 2"
        ]
        self.intersectionTable.setHorizontalHeaderLabels(
            self.intersectionTableHeader)
        self.intersectionTable.horizontalHeader().setStretchLastSection(True)
        mainFormLayout.addWidget(self.intersectionTable)

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

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

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

        # Refresh Apply button state
        self.onSelect()

        # variables
        self.objectIDs = None
        self.objectNames = None
        self.normalVectors = None
        self.entryAngles = None
        self.totalLengthInObject = None
        self.curvatures = None
        self.radiusNormals = None
Пример #13
0
  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)

    #
    # 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)

    # 
    # Spawn table view for common DICOM tags and their values
    # 
    self.taglist = {
      "Patient ID" : "N/A",
      "Patient Name" : "N/A",
      "Patient Birth Date" : "N/A",
      "Patient Sex" : "N/A",
      "Study ID" : "N/A",
      "Study Date" : "N/A",
      "Study Description" : "N/A",
      "Study Instance UID" : "N/A",
      "Series Number" : "N/A",
      "Modality" : "N/A",
      "Series Date" : "N/A",
      "Series Description" : "N/A",
      "Protocol Name" : "N/A",
      "Body Part Examined" : "N/A",
      "Patient Position" : "N/A",
      "Columns" : "N/A",
      "Rows" : "N/A",
      "Number of Slices" : "N/A",
      "Pixel Spacing" : "N/A",
      "Slice Thickness" : "N/A",
      "Spacing Between Slices" : "N/A",
      "Voxel Size" : "N/A",
      "Field of View" : "N/A",
      "Series Instance UID" : "N/A",
    }
    self.table = qt.QTableWidget(parametersCollapsibleButton)
    self.table.setColumnCount(2)
    #self.table.setRowCount(24)
    self.table.setRowCount(len(self.taglist))
    self.table.setHorizontalHeaderLabels(["Attribute", "Value"]) # This must follow table resize

    i = 0
    for key, value in self.taglist.iteritems():
      self.table.setItem(i, 0, qt.QTableWidgetItem(key))
      self.table.setItem(i, 1, qt.QTableWidgetItem(value))
      i = i + 1
    #for i in range(25):
    #  self.table.setItem(i, 1, qt.QTableWidgetItem("N/A"))

    self.table.resizeColumnsToContents()
    self.table.resizeRowsToContents()
    self.table.setAlternatingRowColors(True)
    self.table.setShowGrid(False)
    self.table.verticalHeader().hide()
    parametersFormLayout.addRow("Volume Info:", self.table)

    # connections
    self.inputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect)

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

    # Refresh Table view state
    self.onSelect(self.inputSelector.currentNode())
Пример #14
0
  def setup(self):
    ScriptedLoadableModuleWidget.setup(self)
    
    # Instantiate and connect widgets ...
    self.pbucLogic = PointerBasedUSCalibrationLogic() # Have reference to an instance of the logic
    
    #
    # Tracked ultrasound playback toolbox
    #
    self.playToolBox = qt.QToolBox()
    self.layout.addWidget( self.playToolBox )
    
    #
    # Real-time playback
    #
    self.realTimeFrame = qt.QFrame( self.playToolBox )
    self.realTimeLayout = qt.QVBoxLayout( self.realTimeFrame )
    
    self.connectorNodeSelector = slicer.qMRMLNodeComboBox()
    self.connectorNodeSelector.nodeTypes = [ "vtkMRMLIGTLConnectorNode" ]
    self.connectorNodeSelector.addEnabled = False
    self.connectorNodeSelector.removeEnabled = False
    self.connectorNodeSelector.noneEnabled = False
    self.connectorNodeSelector.showHidden = False
    self.connectorNodeSelector.showChildNodeTypes = False
    self.connectorNodeSelector.setMRMLScene( slicer.mrmlScene )
    self.connectorNodeSelector.setToolTip( "Select the connector node for playback." )
    self.realTimeLayout.addWidget( self.connectorNodeSelector )
    
    self.freezeButton = qt.QPushButton( "Freeze" )
    self.freezeButton.setToolTip( "Freeze the connection." )
    self.realTimeLayout.addWidget( self.freezeButton )
    
    #
    # Recorded sequence playback
    #
    self.sequenceFrame = qt.QFrame( self.playToolBox )
    self.sequenceLayout = qt.QVBoxLayout( self.sequenceFrame )
    
    self.sequenceBrowserNodeSelector = slicer.qMRMLNodeComboBox()
    self.sequenceBrowserNodeSelector.nodeTypes = [ "vtkMRMLSequenceBrowserNode" ]
    self.sequenceBrowserNodeSelector.addEnabled = False
    self.sequenceBrowserNodeSelector.removeEnabled = False
    self.sequenceBrowserNodeSelector.noneEnabled = False
    self.sequenceBrowserNodeSelector.showHidden = False
    self.sequenceBrowserNodeSelector.showChildNodeTypes = False
    self.sequenceBrowserNodeSelector.setMRMLScene( slicer.mrmlScene )
    self.sequenceBrowserNodeSelector.setToolTip( "Select the sequence browser node for playback." )
    self.sequenceLayout.addWidget( self.sequenceBrowserNodeSelector )
    
    self.sequenceBrowserPlayWidget = slicer.qMRMLSequenceBrowserPlayWidget() # TODO: Somehow disable the recording button without changing sequences' recording states
    self.sequenceBrowserPlayWidget.setMRMLSequenceBrowserNode( self.sequenceBrowserNodeSelector.currentNode() )
    self.sequenceLayout.addWidget( self.sequenceBrowserPlayWidget )
    
    self.sequenceBrowserSeekWidget = slicer.qMRMLSequenceBrowserSeekWidget()
    self.sequenceBrowserSeekWidget.setMRMLSequenceBrowserNode( self.sequenceBrowserNodeSelector.currentNode() )
    self.sequenceLayout.addWidget( self.sequenceBrowserSeekWidget )    
    
    
    # Add the playback modes to the tool box
    self.playToolBox.addItem( self.realTimeFrame, "Real-time" )
    self.playToolBox.addItem( self.sequenceFrame, "Sequence" )
    
    #
    # Points group box
    #
    self.pointGroupBox = qt.QGroupBox()
    self.pointGroupBox.setTitle( "Points" )
    self.layout.addWidget( self.pointGroupBox )
    # Layout within the group box
    self.pointGroupBoxLayout = qt.QHBoxLayout( self.pointGroupBox )
    
    # Mark point
    self.markPointButton = qt.QPushButton( "Mark Point" )
    self.markPointButton.setIcon( qt.QIcon( ":/Icons/MarkupsMouseModePlace.png" ) )
    self.markPointButton.setToolTip( "Start placing a point on the ultrasound image." )
    self.pointGroupBoxLayout.addWidget( self.markPointButton )
    
    # Undo
    self.undoPointsButton = qt.QPushButton( "" )
    self.undoPointsButton.setIcon( qt.QIcon( ":/Icons/Small/SlicerUndo.png" ) )
    self.undoPointsButton.setSizePolicy( qt.QSizePolicy.Fixed, qt.QSizePolicy.Fixed )
    self.undoPointsButton.setToolTip( "Remove the most recently placed point." )
    self.pointGroupBoxLayout.addWidget( self.undoPointsButton )
    
    # Reset
    self.resetPointsButton = qt.QPushButton( "" )
    self.resetPointsButton.setIcon( qt.QApplication.style().standardIcon( qt.QStyle.SP_DialogResetButton ) )
    self.resetPointsButton.setSizePolicy( qt.QSizePolicy.Fixed, qt.QSizePolicy.Fixed )
    self.resetPointsButton.setToolTip( "Clear all points." )
    self.pointGroupBoxLayout.addWidget( self.resetPointsButton )
    
    #
    # Result label
    #
    self.calibrationResultLabel = qt.QLabel()
    self.calibrationResultLabel.setText( "No calibration parameters selected." )
    self.calibrationResultLabel.setToolTip( "Output from the calibration." )
    self.layout.addWidget( self.calibrationResultLabel )
    
    
    #
    # Advanced area
    #
    self.advancedCollapsibleButton = ctk.ctkCollapsibleButton()
    self.advancedCollapsibleButton.setText( "Advanced" )
    self.advancedCollapsibleButton.collapsed = True
    self.layout.addWidget( self.advancedCollapsibleButton )
    # Layout within the collapsible button
    self.advancedLayout = qt.QFormLayout( self.advancedCollapsibleButton )
    
    # Mark point
    self.applyButton = qt.QPushButton( "Apply" )
    self.applyButton.setToolTip( "Apply the ImageToProbe transform to the ultrasound image." )
    self.advancedLayout.addWidget( self.applyButton )
    
    
    #
    # Results area
    #
    self.resultsCollapsibleButton = ctk.ctkCollapsibleButton()
    self.resultsCollapsibleButton.setText( "Results" )
    self.resultsCollapsibleButton.collapsed = True
    self.advancedLayout.addWidget( self.resultsCollapsibleButton )
    # Layout within the collapsible button
    self.resultsLayout = qt.QFormLayout( self.resultsCollapsibleButton )
    
    # Results table
    self.resultsTable = qt.QTableWidget( self.resultsCollapsibleButton )
    self.resultsTable.setColumnCount( self.RESULTS_NUM_INDICES )
    self.resultsTable.setHorizontalHeaderLabels( [ "Image Points", "Probe Points", "Error", "Delete" ] )
    self.resultsTable.horizontalHeader().setResizeMode( qt.QHeaderView.Stretch )
    self.resultsTable.horizontalHeader().setResizeMode( self.RESULTS_DELETE_INDEX, qt.QHeaderView.Fixed )
    self.resultsLayout.addRow( self.resultsTable )
    

    #
    # Parameters area
    #
    self.parametersCollapsibleButton = ctk.ctkCollapsibleButton()
    self.parametersCollapsibleButton.setText( "Parameters" )
    self.parametersCollapsibleButton.collapsed = True
    self.advancedLayout.addWidget( self.parametersCollapsibleButton )
    # Layout within the collapsible button
    self.parametersLayout = qt.QVBoxLayout( self.parametersCollapsibleButton )
    
    # Parameters node
    self.frwNodeSelector = slicer.qMRMLNodeComboBox()
    self.frwNodeSelector.nodeTypes = [ "vtkMRMLFiducialRegistrationWizardNode" ]
    self.frwNodeSelector.addEnabled = True
    self.frwNodeSelector.removeEnabled = True
    self.frwNodeSelector.noneEnabled = False
    self.frwNodeSelector.showHidden = False
    self.frwNodeSelector.showChildNodeTypes = False
    self.frwNodeSelector.baseName = "UltrasoundCalibration"
    self.frwNodeSelector.setMRMLScene( slicer.mrmlScene )
    self.frwNodeSelector.setToolTip( "Select the ultrasound calibration parameters node." )
    self.parametersLayout.addWidget( self.frwNodeSelector )
    
    #
    # Input group box
    #
    self.inputGroupBox = qt.QGroupBox( self.parametersCollapsibleButton )
    self.inputGroupBox.setTitle( "Input" )
    self.parametersLayout.addWidget( self.inputGroupBox )
    # Layout within the group box
    self.inputGroupBoxLayout = qt.QFormLayout( self.inputGroupBox )   
    
    # US image selector
    self.usImageNodeSelector = slicer.qMRMLNodeComboBox()
    self.usImageNodeSelector.nodeTypes = [ "vtkMRMLVolumeNode" ]
    self.usImageNodeSelector.addEnabled = False
    self.usImageNodeSelector.removeEnabled = False
    self.usImageNodeSelector.noneEnabled = True
    self.usImageNodeSelector.showHidden = False
    self.usImageNodeSelector.showChildNodeTypes = True
    self.usImageNodeSelector.setMRMLScene( slicer.mrmlScene )
    self.usImageNodeSelector.setToolTip( "Select the ultrasound image node." )
    self.inputGroupBoxLayout.addRow( "Ultrasound image ", self.usImageNodeSelector )
    
    # StylusTipToProbe selector
    self.stylusTipToProbeNodeSelector = slicer.qMRMLNodeComboBox()
    self.stylusTipToProbeNodeSelector.nodeTypes = [ "vtkMRMLLinearTransformNode" ]
    self.stylusTipToProbeNodeSelector.addEnabled = False
    self.stylusTipToProbeNodeSelector.removeEnabled = False
    self.stylusTipToProbeNodeSelector.noneEnabled = True
    self.stylusTipToProbeNodeSelector.showHidden = False
    self.stylusTipToProbeNodeSelector.showChildNodeTypes = True
    self.stylusTipToProbeNodeSelector.setMRMLScene( slicer.mrmlScene )
    self.stylusTipToProbeNodeSelector.setToolTip( "Select the StylusTipToProbe node (parent transforms will be applied)." )
    self.inputGroupBoxLayout.addRow( "StylusTipToProbe ", self.stylusTipToProbeNodeSelector )
    

    #
    # Output group box
    #
    self.outputGroupBox = qt.QGroupBox( self.parametersCollapsibleButton )
    self.outputGroupBox.setTitle( "Output" )
    self.parametersLayout.addWidget( self.outputGroupBox )
    # Layout within the group box
    self.outputGroupBoxLayout = qt.QFormLayout( self.outputGroupBox )
    
    # ImageToProbe selector
    self.imageToProbeNodeSelector = slicer.qMRMLNodeComboBox()
    self.imageToProbeNodeSelector.nodeTypes = [ "vtkMRMLLinearTransformNode" ]
    self.imageToProbeNodeSelector.addEnabled = True
    self.imageToProbeNodeSelector.removeEnabled = False
    self.imageToProbeNodeSelector.noneEnabled = True
    self.imageToProbeNodeSelector.renameEnabled = True
    self.imageToProbeNodeSelector.showHidden = False
    self.imageToProbeNodeSelector.showChildNodeTypes = True
    self.imageToProbeNodeSelector.setMRMLScene( slicer.mrmlScene )
    self.imageToProbeNodeSelector.setToolTip( "Select the ImageToProbe output node (stores the result of the calibration)." )
    self.outputGroupBoxLayout.addRow( "ImageToProbe ", self.imageToProbeNodeSelector )
    


    #
    # Set up connections
    #
    self.freezeButton.connect( "clicked(bool)", self.onFreezeButtonClicked )
    self.sequenceBrowserNodeSelector.connect( "currentNodeChanged(vtkMRMLNode*)", self.onSequenceBrowserNodeChanged )
    
    self.frwNodeSelector.connect( "currentNodeChanged(vtkMRMLNode*)", self.onCalibrationNodeChanged )
    self.usImageNodeSelector.connect( "currentNodeChanged(vtkMRMLNode*)", self.onUSImageNodeChanged )
    self.stylusTipToProbeNodeSelector.connect( "currentNodeChanged(vtkMRMLNode*)", self.onStylusTipToProbeNodeChanged )
    
    self.markPointButton.connect( "clicked(bool)", self.onMarkPointButtonClicked )
    self.undoPointsButton.connect( "clicked(bool)", self.onUndoPointsButtonClicked )
    self.resetPointsButton.connect( "clicked(bool)", self.onResetPointsButtonClicked )

    self.imageToProbeNodeSelector.connect( "currentNodeChanged(vtkMRMLNode*)", self.onImageToProbeNodeChanged )
    
    self.applyButton.connect( "clicked(bool)", self.onApplyOutputTransformToImageClicked )
    
    
    #
    # Create a parameters node by default
    #
    defaultFRWNode = slicer.vtkMRMLFiducialRegistrationWizardNode()
    defaultFRWNode.SetName( "UltrasoundCalibration" )
    defaultFRWNode.SetScene( slicer.mrmlScene )
    slicer.mrmlScene.AddNode( defaultFRWNode )    
    self.frwNodeSelector.setCurrentNodeID( defaultFRWNode.GetID() )

    
    
    # Add vertical spacer
    self.layout.addStretch(1)
Пример #15
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        self.logic = VisualizationLogic()
        self.watchDog = None
        self.trackedToolTipTransform = None

        # Instantiate and connect widgets ...

        #
        # Parameters Area
        #

        # watch dog stuff

        watchDogCollapsibleButton = ctk.ctkCollapsibleButton()
        watchDogCollapsibleButton.text = "Tracked Instruments"
        watchDogCollapsibleButton.collapsed = True
        self.layout.addWidget(watchDogCollapsibleButton)
        watchDogCollapsibleButton.connect("clicked(bool)",
                                          self.onWatchDogCollapsibleButton)
        watchDogFormLayout = qt.QFormLayout(watchDogCollapsibleButton)

        self.table = qt.QTableWidget()
        self.table.setColumnCount(2)
        header = ['Name', 'Status']
        self.table.setHorizontalHeaderLabels(header)
        watchDogFormLayout.addWidget(self.table)

        visualizationCollapsibleButton = ctk.ctkCollapsibleButton()
        visualizationCollapsibleButton.text = "Visualization Tools"
        visualizationCollapsibleButton.collapsed = True
        self.layout.addWidget(visualizationCollapsibleButton)
        visualizationFormLayout = qt.QFormLayout(
            visualizationCollapsibleButton)

        # input tool model selector
        #
        self.inputSelector = slicer.qMRMLNodeComboBox()
        self.inputSelector.nodeTypes = ["vtkMRMLModelNode"]
        self.inputSelector.selectNodeUponCreation = False
        self.inputSelector.addEnabled = False
        self.inputSelector.removeEnabled = False
        self.inputSelector.noneEnabled = True
        self.inputSelector.showHidden = False
        self.inputSelector.showChildNodeTypes = False
        self.inputSelector.renameEnabled = False
        self.inputSelector.setMRMLScene(slicer.mrmlScene)
        self.inputSelector.setToolTip("The currently navigated tool")
        visualizationFormLayout.addRow("Tracking Tool: ", self.inputSelector)
        # connection
        self.inputSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                   self.onToolNavigated)

        self.toolViewCheckBox = qt.QCheckBox()
        self.toolViewCheckBox.checked = 0
        self.toolViewCheckBox.setToolTip(
            "If checked, the views will track the tip of the tool selected")
        self.toolViewCheckBox.connect('stateChanged(int)',
                                      self.onToolViewCheckBox)
        visualizationFormLayout.addRow("Attach views to tool tip",
                                       self.toolViewCheckBox)

        self.toolErrorCheckBox = qt.QCheckBox()
        self.toolErrorCheckBox.checked = 0
        self.toolErrorCheckBox.setToolTip("If checked, the show error cone")
        self.toolErrorCheckBox.connect('stateChanged(int)',
                                       self.onToolErrorCheckBox)
        visualizationFormLayout.addRow("Show the Error cone",
                                       self.toolErrorCheckBox)

        #
        self.screenShotButton = qt.QPushButton("Take Screenshot")
        self.screenShotButton.toolTip = "Takes screenshot of the procedure display and saves the image in the ?? folder."
        self.screenShotButton.enabled = True
        visualizationFormLayout.addRow(self.screenShotButton)

        # connections
        self.screenShotButton.connect('clicked(bool)', self.onScreenShotButton)

        parametersCollapsibleButton = ctk.ctkCollapsibleButton()
        parametersCollapsibleButton.text = "RFA Generator Parameters"
        parametersCollapsibleButton.collapsed = True
        self.layout.addWidget(parametersCollapsibleButton)

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

        #
        # input time
        self.rfaTime = qt.QSpinBox()
        self.rfaTime.minimum = 0
        self.rfaTime.maximum = 900
        self.rfaTime.suffix = 's'
        self.rfaTime.setValue(900)
        parametersFormLayout.addRow("Input Ablation Time: ", self.rfaTime)

        #
        # output volume selector
        #
        self.rfaPower = qt.QSpinBox()
        self.rfaPower.minimum = -1
        self.rfaPower.maximum = 15
        self.rfaPower.suffix = 'W'
        self.rfaPower.setValue(5)
        parametersFormLayout.addRow("RFA Power: ", self.rfaPower)

        self.ablationButton = qt.QPushButton("Start Ablation")
        self.ablationButton.toolTip = "Ablation timer countdown"
        self.ablationButton.enabled = True
        parametersFormLayout.addRow(self.ablationButton)

        # connections
        self.ablationButton.connect('clicked(bool)', self.onStartAblation)

        self.qLabel = qt.QLabel('')
        self.layout.addWidget(self.qLabel)

        # Add vertical spacer
        self.layout.addStretch(1)
Пример #16
0
    def setup(self):
        # Instantiate and connect widgets ...
        ScriptedLoadableModuleWidget.setup(self)

        #self.logic = CIP_CalciumScoringLogic()

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

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

        #
        # target volume selector
        #
        self.inputSelector = slicer.qMRMLNodeComboBox()
        self.inputSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" )
        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("Target Volume: ", self.inputSelector)
        self.inputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onVolumeChanged)
        self.volumeNode = self.inputSelector.currentNode()
        
        #
        # Calcination type
        #
        self.calcinationTypeBox = qt.QComboBox()
        self.calcinationTypeBox.addItem("Heart")
        self.calcinationTypeBox.addItem("Aorta")
        parametersFormLayout.addRow("Calcination Region", self.calcinationTypeBox)
        self.calcinationTypeBox.connect("currentIndexChanged(int)", self.onTypeChanged)

        self.ThresholdRange = ctk.ctkRangeWidget()
        self.ThresholdRange.minimum = 0
        self.ThresholdRange.maximum = 3000
        self.ThresholdRange.setMinimumValue(self.ThresholdMin)
        self.ThresholdRange.setMaximumValue(self.ThresholdMax)
        self.ThresholdRange.connect("minimumValueChanged(double)", self.onThresholdMinChanged)
        self.ThresholdRange.connect("maximumValueChanged(double)", self.onThresholdMaxChanged)
        parametersFormLayout.addRow("Threshold Value", self.ThresholdRange)
        self.ThresholdRange.setMinimumValue(self.ThresholdMin)
        self.ThresholdRange.setMaximumValue(self.ThresholdMax)

        self.LesionSizeRange= ctk.ctkRangeWidget()
        self.LesionSizeRange.minimum = 1
        self.LesionSizeRange.maximum = 1000
        self.LesionSizeRange.setMinimumValue(self.MinimumLesionSize)
        self.LesionSizeRange.setMaximumValue(self.MaximumLesionSize)
        self.LesionSizeRange.connect("minimumValueChanged(double)", self.onMinSizeChanged)
        self.LesionSizeRange.connect("maximumValueChanged(double)", self.onMaxSizeChanged)
        parametersFormLayout.addRow("Lesion Size (mm^3)", self.LesionSizeRange)
        self.LesionSizeRange.setMinimumValue(self.MinimumLesionSize)
        self.LesionSizeRange.setMaximumValue(self.MaximumLesionSize)

        self.scoreField = qt.QLineEdit()
        self.scoreField.setText(self.totalScore)
        parametersFormLayout.addRow("Total Score", self.scoreField)
        
        #
        # Select table
        #
        self.selectLabels = qt.QTableWidget()
        self.selectLabels.horizontalHeader().hide()
        self.selectLabels.verticalHeader().hide()
        self.selectLabels.setColumnCount(2)
        self.selectLabels.itemClicked.connect(self.handleItemClicked)
        parametersFormLayout.addRow("", self.selectLabels)

        #
        # ROI Area
        #
        self.roiCollapsibleButton = ctk.ctkCollapsibleButton()
        self.roiCollapsibleButton.text = "Heart ROI"
        self.roiCollapsibleButton.setChecked(False)
        self.layout.addWidget(self.roiCollapsibleButton)

        # Layout within the dummy collapsible button
        roiFormLayout = qt.QFormLayout(self.roiCollapsibleButton)

        #
        # ROI
        #
        self.ROIWidget = slicer.qMRMLAnnotationROIWidget()
        self.roiNode = slicer.vtkMRMLAnnotationROINode()
        slicer.mrmlScene.AddNode(self.roiNode)
        self.ROIWidget.setMRMLAnnotationROINode(self.roiNode)
        roiFormLayout.addRow("", self.ROIWidget)
        self.roiNode.AddObserver("ModifiedEvent", self.onROIChangedEvent, 1)

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

        # Add temp nodes
        self.croppedNode=slicer.vtkMRMLScalarVolumeNode()
        self.croppedNode.SetHideFromEditors(1)
        slicer.mrmlScene.AddNode(self.croppedNode)
        self.labelsNode=slicer.vtkMRMLLabelMapVolumeNode()
        slicer.mrmlScene.AddNode(self.labelsNode)
        
        if self.inputSelector.currentNode():
            self.onVolumeChanged(self.inputSelector.currentNode())
            self.createModels()
Пример #17
0
    def __init__(self, logic, applyButton, buttonsList):
        super(ILSVisualizationWidget, self).__init__()
        self.logic = logic
        self.applyButton = applyButton
        self.fiducialButtonsList = buttonsList

        self.widget = qt.QWidget()
        self.layout = qt.QFormLayout(self.widget)
        self.boxHolder = qt.QWidget()
        self.boxHolder.setLayout(qt.QVBoxLayout())
        self.layout.addRow(self.boxHolder)

        self.groupBox = qt.QFrame()
        self.groupBox.setLayout(qt.QHBoxLayout())

        self.fiducialsCollapsibleButton = ctk.ctkCollapsibleButton()
        self.fiducialsCollapsibleButton.text = "Show Fiducials"
        self.fiducialsCollapsibleButton.hide()
        self.fiducialsFormLayout = qt.QFormLayout(
            self.fiducialsCollapsibleButton)

        # Table Widget Definition
        self.tableWidget = qt.QTableWidget()
        self.tableWidget.sortingEnabled = False
        self.tableWidget.hide()
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setColumnWidth(0, 190)
        self.tableWidget.setColumnWidth(1, 190)
        self.tableWidget.setColumnWidth(2, 190)
        self.tableWidget.setMaximumWidth(590)
        horizontalBar = self.tableWidget.horizontalScrollBar()
        horizontalBar.setDisabled(True)
        horizontalBar.hide()
        self.tableWidget.setHorizontalHeaderLabels([
            "Left Oblique Fiducials", "Right Oblique Fiducials",
            "Right Horizontal Fiducials"
        ])
        behavior = qt.QAbstractItemView()
        self.tableWidget.setSelectionBehavior(behavior.SelectItems)
        self.tableWidget.setSelectionMode(behavior.SingleSelection)
        self.tableWidget.setContextMenuPolicy(3)
        self.tableWidget.customContextMenuRequested.connect(self.onRightClick)

        self.groupBox.layout().addWidget(self.tableWidget)

        self.fiducialsFormLayout.addWidget(self.groupBox)
        self.boxHolder.layout().addWidget(self.fiducialsCollapsibleButton)

        self.pendingUpdate = False
        self.updatingFiducials = False
        self.observerTags = []

        self.leftRow = 0
        self.rightObliqueRow = 0
        self.rightHorizontalRow = 0

        self.tableItems = []

        self.deletionGroupBox = qt.QFrame()
        self.deletionGroupBox.setLayout(qt.QHBoxLayout())
        self.fiducialsFormLayout.addWidget(self.deletionGroupBox)

        #
        # Delete Selected Fiducials Button
        #
        self.deleteButton = qt.QPushButton("Delete Selected Fiducial")
        self.deleteButton.toolTip = "Select a fiducial from the table and push this button to delete the selected fiducial from the scene."
        self.deleteButton.enabled = True
        selectedIcon = qt.QIcon(":/Icons/MarkupsDelete.png")
        self.deleteButton.setIcon(selectedIcon)
        self.deleteButton.setFixedSize(220, 30)
        self.deletionGroupBox.layout().addWidget(self.deleteButton)
        self.deleteButton.connect('clicked(bool)',
                                  self.onDeleteOneFiducialButton)

        #
        # Delete All Fiducials Button
        #
        self.deleteAllButton = qt.QPushButton("Delete All Fiducials")
        self.deleteAllButton.toolTip = "Delete all fiducials in the scene."
        self.deleteAllButton.enabled = True
        allIcon = qt.QIcon(":/Icons/MarkupsDeleteAllRows.png")
        self.deleteAllButton.setIcon(allIcon)
        self.deleteAllButton.setFixedSize(220, 30)
        self.deletionGroupBox.layout().addWidget(self.deleteAllButton)
        # self.fiducialsFormLayout.addRow(self.deleteAllButton)
        self.deleteAllButton.connect('clicked(bool)', self.dialogBoxFunction)
Пример #18
0
  def setup(self):
    ScriptedLoadableModuleWidget.setup(self)
    # layoutLogic = slicer.app.layoutManager.layoutLogic()
    slicer.app.layoutManager().setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutSideBySideView)    
    l = slicer.modules.createmodels.logic()
    self.needleModel = l.CreateNeedle(150, 0.4, 0, False)
    self.redWidget = slicer.app.layoutManager().sliceWidget('Red')
    self.yellowWidget = slicer.app.layoutManager().sliceWidget('Yellow')    
    self.usContainer = ctk.ctkCollapsibleButton()
    #This is what the button will say 
    self.usContainer.text = "Connection Information"
    #Thiss actually creates that button
    #This creates a variable that describes layout within this collapsible button 
    self.usLayout = qt.QFormLayout(self.usContainer)

    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      #This is a push button 
      self.connectButton = qt.QPushButton()
      self.connectButton.setDefault(False)
      #This button says connect 
      self.connectButton.text = "Connect"
      #help tooltip that explains the funciton 
      self.connectButton.toolTip = "Connects to ultrasound"
      #adds the widget to the layout      
      self.usLayout.addWidget(self.connectButton)
    
    # self.normalImageButton = qt.QCheckBox() 
    # self.normalImageButton.text = "Select if performing a 2D Calibration"
    # self.usLayout.addRow(self.normalImageButton)
    
    self.imageSelector = slicer.qMRMLNodeComboBox()
    self.imageSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
    self.imageSelector.selectNodeUponCreation = True
    self.imageSelector.addEnabled = False
    self.imageSelector.removeEnabled = False
    self.imageSelector.noneEnabled = True
    self.imageSelector.showHidden = False
    self.imageSelector.showChildNodeTypes = False
    self.imageSelector.setMRMLScene( slicer.mrmlScene )
    self.imageSelector.setToolTip( "Pick the image to be used." )
    self.usLayout.addRow("Left view volume: ", self.imageSelector)
    
    
    self.imageSelector2 = slicer.qMRMLNodeComboBox()
    self.imageSelector2.nodeTypes = ["vtkMRMLScalarVolumeNode"]
    self.imageSelector2.selectNodeUponCreation = True
    self.imageSelector2.addEnabled = False
    self.imageSelector2.removeEnabled = False
    self.imageSelector2.noneEnabled = True
    self.imageSelector2.showHidden = False
    self.imageSelector2.showChildNodeTypes = False
    self.imageSelector2.setMRMLScene( slicer.mrmlScene )
    self.imageSelector2.setToolTip( "Pick the image to be used." )
    self.usLayout.addRow("Right view volume: ", self.imageSelector2)
    
        #add combo box for linear transform node 
    self.TransformSelector = slicer.qMRMLNodeComboBox()
    self.TransformSelector.nodeTypes = ["vtkMRMLLinearTransformNode"]
    self.TransformSelector.selectNodeUponCreation = True
    self.TransformSelector.addEnabled = False
    self.TransformSelector.removeEnabled = False
    self.TransformSelector.noneEnabled = True
    self.TransformSelector.showHidden = False
    self.TransformSelector.showChildNodeTypes = False
    self.TransformSelector.setMRMLScene( slicer.mrmlScene )
    self.TransformSelector.setToolTip( "Pick the transform representing the straw line." )
    self.usLayout.addRow("Tip to Probe: ", self.TransformSelector)
    
    self.recordContainer = ctk.ctkCollapsibleButton()
    #This is what the button will say 
    self.recordContainer.text = "Recording Options"
    #Thiss actually creates that button
    #This creates a variable that describes layout within this collapsible button 
    self.recordLayout = qt.QFormLayout(self.recordContainer)
    
    self.RecordButton = qt.QPushButton() 
    self.RecordButton.text = "Start Recording" 
    self.recordLayout.addWidget(self.RecordButton)
    
    self.StopRecordButton = qt.QPushButton() 
    self.StopRecordButton.text = "Stop Recording" 
    self.recordLayout.addWidget(self.StopRecordButton)
    
    self.pathInput = qt.QLineEdit()
    self.pathInput.setPlaceholderText("Enter the path to save files to")
    self.pathText = qt.QLabel("File Path:")
    self.recordLayout.addRow(self.pathText, self.pathInput)

    self.SaveRecordButton = qt.QPushButton() 
    self.SaveRecordButton.text = "Save Recording" 
    self.recordLayout.addWidget(self.SaveRecordButton)
    
    # This creates another collapsible button
    self.fiducialContainer = ctk.ctkCollapsibleButton()
    self.fiducialContainer.text = "Registration"

    self.fiducialLayout = qt.QFormLayout(self.fiducialContainer)

    self.freezeButton = qt.QPushButton()
    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      self.freezeButton.text = "Freeze"
    else:
      self.freezeButton.text = "Place Fiducial"
    self.freezeButton.toolTip = "Freeze the ultrasound image for fiducial placement"
    self.fiducialLayout.addRow(self.freezeButton)
    self.shortcut = qt.QShortcut(qt.QKeySequence('f'), slicer.util.mainWindow())
    
    self.numFidLabel = qt.QLabel()
    self.fiducialLayout.addRow(qt.QLabel("Fiducials collected:"), self.numFidLabel)

    self.transformTable = qt.QTableWidget() 
    self.transTableItem = qt.QTableWidgetItem()
    self.fidError = qt.QLabel()
    self.transformTable.setRowCount(4)
    self.transformTable.setColumnCount(4)
    self.transformTable.horizontalHeader().hide()
    self.transformTable.verticalHeader().hide()
    self.transformTable.setItem(0,0, qt.QTableWidgetItem("1"))
    self.transformTable.setItem(0,1, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(0,2, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(0,3, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(1,0, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(1,1, qt.QTableWidgetItem("1"))
    self.transformTable.setItem(1,2, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(1,3, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(2,0, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(2,1, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(2,2, qt.QTableWidgetItem("1"))
    self.transformTable.setItem(2,3, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(3,0, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(3,1, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(3,2, qt.QTableWidgetItem("0"))
    self.transformTable.setItem(3,3, qt.QTableWidgetItem("1"))
    self.transformTable.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.MinimumExpanding)
    self.copyIcon =qt.QIcon(":Icons/Medium/SlicerEditCopy.png")
    self.copyButton = qt.QPushButton()
    self.copyButton.setIcon(self.copyIcon)
    self.copyButton.setMaximumWidth(64)
    self.copyButton.enabled = False 
    if self.numFidLabel >= 2: 
      self.copyButton.enabled = True 
      
    self.fiducialLayout.addRow(qt.QLabel("Image to probe transform:"))
    self.fiducialLayout.addRow(self.transformTable)
    self.fiducialLayout.addRow("Copy:", self.copyButton)
    
    self.validationContainer = ctk.ctkCollapsibleButton()
    self.validationContainer.text = "Validation"
    self.validationLayout = qt.QFormLayout(self.validationContainer)

    self.visualizeButton = qt.QPushButton('Show 3D Scene')
    self.visualizeButton.toolTip = "This button enables the 3D view for visual validation"
    self.validationLayout.addRow(self.visualizeButton)
    self.visualizeButton.connect('clicked(bool)', self.onVisualizeButtonClicked)
    
    self.layout.addWidget(self.usContainer)
    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      self.layout.addWidget(self.recordContainer)
    self.layout.addWidget(self.fiducialContainer)
    self.layout.addWidget(self.validationContainer)
    
    if slicer.mrmlScene.GetNodesByClass("vtkMRMLSequenceNode").GetNumberOfItems() == 0:
      self.connectButton.connect('clicked(bool)', self.onConnectButtonClicked)
      self.freezeButton.connect('clicked(bool)', self.onConnectButtonClicked)
      self.shortcut.connect('activated()', self.onConnectButtonClicked)
      self.RecordButton.connect('clicked(bool)', self.onRecordButtonClicked)
      self.StopRecordButton.connect('clicked(bool)', self.onStopButtonClicked)
      self.SaveRecordButton.connect('clicked(bool)', self.onSaveButtonClicked)
    else: 
      self.shortcut.connect('activated()', self.onFiducialClicked)
      self.freezeButton.connect('clicked(bool)', self.onFiducialClicked)
    self.imageSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.onImageChanged)
    self.imageSelector2.connect('currentNodeChanged(vtkMRMLNode*)', self.onImageChanged2)
    self.TransformSelector.connect('currentNodeChanged(vtkMRMLNode*)',self.onTransformChanged)
    self.copyButton.connect('clicked(bool)', self.onCopyButtonClicked)
    
    self.layout.addStretch(1)
  
    self.sceneObserverTag = slicer.mrmlScene.AddObserver(slicer.mrmlScene.NodeAddedEvent, self.onNodeAdded)
Пример #19
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        # Instantiate and connect widgets ...

        #
        # Ultrasonic motors Area
        #
        ultrasonicMotorsCollapsibleButton = ctk.ctkCollapsibleButton()
        ultrasonicMotorsCollapsibleButton.text = "Shinsei motors"
        self.layout.addWidget(ultrasonicMotorsCollapsibleButton)
        ultrasonicFormLayout = qt.QFormLayout(
            ultrasonicMotorsCollapsibleButton)
        # Apply Button
        self.applyButton = qt.QPushButton("Homing Shinsei")
        self.applyButton.toolTip = "Run the algorithm."
        self.applyButton.enabled = True
        ultrasonicFormLayout.addRow(self.applyButton)
        # connections
        self.applyButton.connect('clicked(bool)', self.onApplyButton)
        # Add vertical spacer
        self.layout.addStretch(1)

        #
        # Piezo motors Area
        #
        piezoMotorsCollapsibleButton = ctk.ctkCollapsibleButton()
        piezoMotorsCollapsibleButton.text = "Piezo motors"
        self.layout.addWidget(piezoMotorsCollapsibleButton)
        piezoFormLayout = qt.QFormLayout(piezoMotorsCollapsibleButton)

        #
        # Add target table
        #
        self.positionTable = qt.QTableWidget()
        self.positionTable.setRowCount(3)
        self.positionTable.setColumnCount(3)
        self.positionTable.setHorizontalHeaderLabels(['1', '2', '3'])

        self.cbh = qt.QComboBox()
        self.cbh.addItem("Left")
        self.cbh.addItem("Center")
        self.cbh.addItem("Right")
        self.cbh.currentIndexChanged.connect(self.onSelectionChange)

        piezoFormLayout.addRow("Horizontal:", self.cbh)

        self.cbv = qt.QComboBox()
        self.cbv.addItems([str('Top'), str('Center'), str('Bottom')])
        self.cbv.currentIndexChanged.connect(self.onSelectionChange)

        piezoFormLayout.addRow("Vertical:", self.cbv)

        self.label = qt.QLabel()
        pixmap = qt.QPixmap('/Resources/CB.png')
        self.label.setPixmap(pixmap)

        piezoFormLayout.addRow(self.label)

        # Apply Button
        self.piezoHomingButton = qt.QPushButton("Homing Piezo")
        self.piezoHomingButton.toolTip = "Run the algorithm."
        self.piezoHomingButton.enabled = True
        piezoFormLayout.addRow(self.piezoHomingButton)
        # connections
        self.piezoHomingButton.connect('clicked(bool)',
                                       self.onPiezoHomingButton)
        # Add vertical spacer

        # Apply Button
        self.doneHomingButton = qt.QPushButton("Done Homing")
        self.doneHomingButton.toolTip = "Run the algorithm."
        self.doneHomingButton.enabled = True
        piezoFormLayout.addRow(self.doneHomingButton)
        # connections
        self.doneHomingButton.connect('clicked(bool)', self.onDoneHoming)
    def setupWindow(self):
        self.setWindowTitle("lapdMouse Data Archive Browser")
        self.resize(1000, 600)

        if 'lapdMouseDBBrowser' in slicer.util.moduleNames():
            self.modulePath = slicer.modules.lapdmousedbbrowser.path.replace(
                "lapdMouseDBBrowser.py", "")
        else:
            self.modulePath = '.'
        self.downloadIcon = qt.QIcon(
            os.path.join(self.modulePath, 'Resources', 'Icons',
                         'download.png'))
        self.storedIcon = qt.QIcon(
            os.path.join(self.modulePath, 'Resources', 'Icons', 'stored.png'))
        self.logo = qt.QPixmap(
            os.path.join(self.modulePath, 'Resources', 'Icons',
                         'lapdMouseDBBrowser.png'))

        self.banner = qt.QFrame()
        self.banner.setLayout(qt.QGridLayout())
        logo = qt.QLabel()
        logo.setPixmap(self.logo)
        self.banner.layout().addWidget(logo, 0, 0)
        self.bannerTextBrowser = qt.QTextBrowser()
        self.bannerTextBrowser.setOpenExternalLinks(True)
        self.bannerTextBrowser.setMaximumHeight(120)
        text = "<h1>lapdMouse Data Archive Browser</h1>"
        text += "The lapdMouse data archive contains anatomically derived lung models and aerosol deposition measurements of mice for modeling and computational toxicology in mice."
        text += " For more details about available datasets, data representation, other software, and support, please visit the <a href=\"https://doi.org/10.25820/9arg-9w56\">lapdMouse archive</a>"
        text += "<br />This work was supported in part by NIH project R01ES023863."
        self.bannerTextBrowser.html = text
        self.banner.layout().addWidget(self.bannerTextBrowser, 0, 1)

        self.table = qt.QTableWidget(self)
        self.table.setRowCount(0)
        self.table.setColumnCount(1)
        self.table.setSizePolicy(qt.QSizePolicy.Expanding,
                                 qt.QSizePolicy.Expanding)
        self.table.setHorizontalHeaderLabels(["Dataset name"
                                              ])  #,"Status","Comment"])
        self.table.setSelectionBehavior(qt.QAbstractItemView.SelectRows)
        self.table.setSelectionMode(qt.QAbstractItemView.SingleSelection)
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.connect("itemSelectionChanged()", self.onDatasetChanged)

        self.customForm = qt.QFrame()
        self.customForm.setLayout(qt.QFormLayout())
        self.customFormName = qt.QLineEdit("", self.customForm)
        self.customFormName.readOnly = True
        self.customForm.layout().addRow("Name", self.customFormName)
        self.customFormDatasetInfo = qt.QLabel('<a href=\"' + self.projectURL +
                                               '\">info</a>')
        self.customFormDatasetInfo.setTextFormat(1)
        self.customFormDatasetInfo.setOpenExternalLinks(True)
        self.customForm.layout().addRow("Info", self.customFormDatasetInfo)
        self.customFormAction = qt.QFrame(self.customForm)
        self.customFormAction.setLayout(qt.QHBoxLayout())
        self.customFormAction.layout().setSpacing(0)
        self.customFormAction.layout().setMargin(0)
        self.customFormDownloadButton = qt.QPushButton(
            "download standard file selection", self.customFormAction)
        self.customFormAction.layout().addWidget(self.customFormDownloadButton)
        self.customFormDownloadButton.connect("clicked()",
                                              self.onDownloadDataset)
        self.customFormLoadButton = qt.QPushButton(
            "load standard file selection in Slicer", self.customFormAction)
        self.customFormAction.layout().addWidget(self.customFormLoadButton)
        self.customFormLoadButton.connect("clicked()", self.onLoadDataset)
        self.customForm.layout().addRow("Quick actions", self.customFormAction)
        self.customFormFiles = qt.QTableWidget(self.customForm)
        self.customFormFiles.setRowCount(0)
        self.customFormFiles.setColumnCount(3)
        self.customFormFiles.setHorizontalHeaderLabels(
            ["Status", "Filename", "Size"])
        self.customFormFiles.horizontalHeader().setSectionResizeMode(
            1, qt.QHeaderView.Stretch)
        self.customFormFiles.setSelectionBehavior(
            qt.QAbstractItemView.SelectRows)
        self.customFormFiles.setMinimumHeight(400)
        self.customForm.layout().addRow("Files", self.customFormFiles)

        self.customFormAction2 = qt.QFrame(self.customForm)
        self.customFormAction2.setLayout(qt.QHBoxLayout())
        self.customFormAction2.layout().setSpacing(0)
        self.customFormAction2.layout().setMargin(0)
        self.customFormDownloadButton2 = qt.QPushButton(
            "download selected files", self.customFormAction2)
        self.customFormAction2.layout().addWidget(
            self.customFormDownloadButton2)
        self.customFormDownloadButton2.connect("clicked()",
                                               self.onDownloadSelectedDataset)
        self.customFormDeleteButton2 = qt.QPushButton("delete selected files",
                                                      self.customFormAction2)
        self.customFormAction2.layout().addWidget(self.customFormDeleteButton2)
        self.customFormDeleteButton2.connect("clicked()",
                                             self.onDeleteSelectedDataset)
        self.customFormLoadButton2 = qt.QPushButton(
            "load selected files in Slicer", self.customFormAction2)
        self.customFormAction2.layout().addWidget(self.customFormLoadButton2)
        self.customFormLoadButton2.connect("clicked()",
                                           self.onLoadSelectedDataset)
        self.customForm.layout().addRow("", self.customFormAction2)

        splitView = qt.QSplitter(self)
        splitView.addWidget(self.table)
        splitView.addWidget(self.customForm)
        splitView.setSizes([200, 800])

        self.updateTable()
        self.onDatasetChanged()
        self.setMenuWidget(self.banner)
        self.setCentralWidget(splitView)
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)
        slicer.app.layoutManager().setLayout(
            slicer.vtkMRMLLayoutNode.SlicerLayoutOneUp3DView)
        l = slicer.modules.createmodels.logic()
        self.needleModel = l.CreateNeedle(150, 1, 2.5, False)

        # self.array1 = np.array([29, 24.37, 160.992])
        # self.array2 = np.array([28, 1.630, 69.785])
        # self.array3 = np.array([29,-7.321, 33.884])
        # self.array4 = np.array([-26, 24.129, 160.022])
        # self.array5 = np.array([-28, 11.065, 107.626])
        # self.array6 = np.array([-30.387, -7.394, 33.589])

        self.jigArray = np.array([[29, 24.37, 160.992], [28, 1.630, 69.785],
                                  [29, -7.321, 33.884], [-26, 24.129, 160.022],
                                  [-28, 11.065, 107.626],
                                  [-30.387, -7.394, 33.589]])
        self.collectedArray = np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0],
                                        [0, 0, 0], [0, 0, 0], [0, 0, 0]])
        self.points = vtk.vtkPoints()
        self.points.SetNumberOfPoints(6)
        self.points.SetPoint(0, self.jigArray[0])
        self.points.SetPoint(1, self.jigArray[1])
        self.points.SetPoint(2, self.jigArray[2])
        self.points.SetPoint(3, self.jigArray[3])
        self.points.SetPoint(4, self.jigArray[4])
        self.points.SetPoint(5, self.jigArray[5])

        self.collectedPoints = vtk.vtkPoints()
        self.collectedPoints.SetNumberOfPoints(6)
        self.DN = self.markupsNode.GetDisplayNode()
        self.DN.SetSelectedColor(0, 0, 1)
        self.DN.SetTextScale(0)
        self.markupsNode.AddFiducialFromArray(self.jigArray[0])
        self.markupsNode.AddFiducialFromArray(self.jigArray[1])
        self.markupsNode.AddFiducialFromArray(self.jigArray[2])
        self.markupsNode.AddFiducialFromArray(self.jigArray[3])
        self.markupsNode.AddFiducialFromArray(self.jigArray[4])
        self.markupsNode.AddFiducialFromArray(self.jigArray[5])

        slicer.app.layoutManager().setLayout(
            slicer.vtkMRMLLayoutNode.SlicerLayoutOneUpRedSliceView)
        self.parametersCollapsibleButton = ctk.ctkCollapsibleButton()
        self.parametersCollapsibleButton.text = "Parameters"
        self.layout.addWidget(self.parametersCollapsibleButton)

        self.parametersFormLayout = qt.QFormLayout(
            self.parametersCollapsibleButton)

        self.connectButton = qt.QPushButton()
        self.connectButton.setDefault(False)
        self.connectButton.text = "Connect"
        self.parametersFormLayout.addWidget(self.connectButton)

        self.TransformSelector = slicer.qMRMLNodeComboBox()
        self.TransformSelector.nodeTypes = ["vtkMRMLLinearTransformNode"]
        self.TransformSelector.selectNodeUponCreation = True
        self.TransformSelector.addEnabled = False
        self.TransformSelector.removeEnabled = False
        self.TransformSelector.noneEnabled = True
        self.TransformSelector.showHidden = False
        self.TransformSelector.showChildNodeTypes = False
        self.TransformSelector.setMRMLScene(slicer.mrmlScene)
        self.TransformSelector.setToolTip(
            "Pick the transform representing the straw line.")
        self.parametersFormLayout.addRow("Tip to Probe: ",
                                         self.TransformSelector)

        self.collectButton = qt.QPushButton()
        self.collectButton.setDefault(False)
        self.collectButton.text = "Collect Fiducial"
        self.parametersFormLayout.addWidget(self.collectButton)
        self.shortcut = qt.QShortcut(qt.QKeySequence('c'),
                                     slicer.util.mainWindow())
        self.deleteButton = qt.QPushButton()
        self.deleteButton.setDefault(False)
        self.deleteButton.text = "Delete Last Fiducial"
        self.parametersFormLayout.addWidget(self.deleteButton)

        self.calculateButton = qt.QPushButton()
        self.calculateButton.setDefault(False)
        self.calculateButton.text = "Calculate Transformation Matrix"
        self.parametersFormLayout.addWidget(self.calculateButton)

        self.transformTable = qt.QTableWidget()
        self.transTableItem = qt.QTableWidgetItem()
        self.fidError = qt.QLabel()
        self.transformTable.setRowCount(4)
        self.transformTable.setColumnCount(4)
        self.transformTable.horizontalHeader().hide()
        self.transformTable.verticalHeader().hide()
        self.transformTable.setItem(0, 0, qt.QTableWidgetItem("1"))
        self.transformTable.setItem(0, 1, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(0, 2, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(0, 3, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(1, 0, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(1, 1, qt.QTableWidgetItem("1"))
        self.transformTable.setItem(1, 2, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(1, 3, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(2, 0, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(2, 1, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(2, 2, qt.QTableWidgetItem("1"))
        self.transformTable.setItem(2, 3, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(3, 0, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(3, 1, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(3, 2, qt.QTableWidgetItem("0"))
        self.transformTable.setItem(3, 3, qt.QTableWidgetItem("1"))
        self.transformTable.resizeColumnToContents(0)
        self.transformTable.resizeColumnToContents(1)
        self.transformTable.resizeColumnToContents(2)
        self.transformTable.resizeColumnToContents(3)
        self.transformTable.setSizePolicy(qt.QSizePolicy.Minimum,
                                          qt.QSizePolicy.MinimumExpanding)
        # self.copyIcon =qt.QIcon(":Icons/Medium/SlicerEditCopy.png")
        # self.copyButton = qt.QPushButton()
        # self.copyButton.setIcon(self.copyIcon)
        # self.copyButton.toolTip = "Copy"
        # self.copyButton.setMaximumWidth(64)
        # self.copyHbox = qt.QHBoxLayout()
        # self.copyHbox.addWidget(self.copyButton)
        self.parametersFormLayout.addRow(qt.QLabel("Transformation Matrix:"))
        self.parametersFormLayout.addRow(self.transformTable)
        self.copyButton = qt.QPushButton()
        self.copyButton.setDefault(False)
        self.copyButton.text = "Copy Transform"
        self.parametersFormLayout.addWidget(self.copyButton)

        self.errorString = qt.QLabel()
        self.errorString.text = "RMSE: " + str(self.error)
        self.parametersFormLayout.addRow(self.errorString)

        self.connectButton.connect('clicked(bool)',
                                   self.onConnectButtonClicked)
        self.TransformSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                       self.onTransformChanged)
        self.collectButton.connect('clicked(bool)',
                                   self.onCollectButtonClicked)
        self.shortcut.connect('activated()', self.onCollectButtonClicked)
        self.deleteButton.connect('clicked(bool)', self.onDeleteButtonClicked)
        self.calculateButton.connect('clicked(bool)',
                                     self.onCalculateButtonClicked)
        self.copyButton.connect('clicked(bool)', self.onCopyButtonClicked)
        self.layout.addStretch(1)
        slicer.app.layoutManager().setLayout(
            slicer.vtkMRMLLayoutNode.SlicerLayoutOneUp3DView)
Пример #22
0
  def setup(self):
    ScriptedLoadableModuleWidget.setup(self)

    # Metadata Area
    metadataCollapsibleButton = ctk.ctkCollapsibleButton()
    metadataCollapsibleButton.text = "Metadata"
    self.layout.addWidget(metadataCollapsibleButton)

    # Layout within the dummy collapsible button
    metadataFormLayout = qt.QFormLayout(metadataCollapsibleButton)

    # userID input
    self.userIDField = qt.QLineEdit()
    metadataFormLayout.addRow("UserID: ", self.userIDField)

    # studyID input
    self.studyIDField = qt.QLineEdit()
    metadataFormLayout.addRow("StudyID: ", self.studyIDField)

    # trialID input
    self.trialIDField = qt.QLineEdit()
    metadataFormLayout.addRow("TrialID: ", self.trialIDField)

    # skill level selector
    self.skillOptions = ("Novice", "Trainee", "Expert")
    self.skillSelector = qt.QComboBox()
    self.skillSelector.addItems(self.skillOptions)
    metadataFormLayout.addRow("Select skill level: ", self.skillSelector)

    # session completed selector
    self.sessionCompletionOptions = ("Complete", "Incomplete")
    self.sessionCompletionSelector = qt.QComboBox()
    self.sessionCompletionSelector.addItems(self.sessionCompletionOptions)
    metadataFormLayout.addRow("Session status: ", self.sessionCompletionSelector)

    # Save Button
    self.saveButton = qt.QPushButton("Save session")
    self.saveButton.toolTip = "Uploading data to database."
    self.saveButton.enabled = True
    metadataFormLayout.addRow(self.saveButton)


     # Load Scene Area
    loadSceneCollapsibleButton = ctk.ctkCollapsibleButton()
    loadSceneCollapsibleButton.text = "Search For Session"
    self.layout.addWidget(loadSceneCollapsibleButton)

    # Layout within the dummy collapsible button
    loadSceneFormLayout = qt.QFormLayout(loadSceneCollapsibleButton)

    # search fields text
    self.searchText = qt.QLabel()
    self.searchText.text = "Search by fields:"
    loadSceneFormLayout.addRow(self.searchText)

    # Search user ID field
    self.searchUserID = qt.QLineEdit()
    loadSceneFormLayout.addRow("UserID: ", self.searchUserID)

    # Search study ID field
    self.searchStudyID = qt.QLineEdit()
    loadSceneFormLayout.addRow("StudyID: ", self.searchStudyID)

    # Search trial ID field
    self.searchTrialID = qt.QLineEdit()
    loadSceneFormLayout.addRow("TrialID: ", self.searchTrialID)

    # Search skill level field
    self.skillOptions = ("All", "Novice", "Trainee", "Expert")
    self.searchSkill = qt.QComboBox()
    self.searchSkill.addItems(self.skillOptions)
    loadSceneFormLayout.addRow("Select skill level: ", self.searchSkill)

    # Search Button
    self.searchButton = qt.QPushButton("Search for session")
    self.searchButton.enabled = True
    loadSceneFormLayout.addRow(self.searchButton)

    # Query Results Area
    self.queryResultsCollapsibleButton = ctk.ctkCollapsibleButton()
    self.queryResultsCollapsibleButton.text = "Query Results"
    self.queryResultsCollapsibleButton.setVisible(False)
    self.layout.addWidget(self.queryResultsCollapsibleButton)

    self.queryResultsLayout = qt.QFormLayout(self.queryResultsCollapsibleButton)
    self.table = qt.QTableWidget(1, 5)
    self.queryResultsLayout.addRow(self.table)

    #load session button
    self.loadButton = qt.QPushButton("Load Session")
    self.queryResultsLayout.addWidget(self.loadButton)

    # Connections
    self.saveButton.connect('clicked(bool)', self.onSaveButton)
    self.searchButton.connect('clicked(bool)', self.onSearchButton)
    self.loadButton.connect('clicked(bool)', self.onLoadButton)
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        # Instantiate and connect widgets ...

        #
        # Data Area
        #
        dataGroupBox = ctk.ctkCollapsibleGroupBox()
        dataGroupBox.setTitle('Data')
        self.layout.addWidget(dataGroupBox)

        dataGridLayout = qt.QGridLayout(dataGroupBox)
        self.dirButton = ctk.ctkDirectoryButton()
        dirButtonLabel = qt.QLabel('DICOM Directory: ')
        dataGridLayout.addWidget(dirButtonLabel, 1, 1, 1, 1)
        dataGridLayout.addWidget(self.dirButton, 1, 2, 1, 3)
        self.dirButton.setMaximumWidth(500)
        orLabel = qt.QLabel('        - or - ')
        dataGridLayout.addWidget(orLabel, 2, 1, 1, 1)
        collectionsComboBoxLabel = qt.QLabel('TCIA Collection: ')
        dataGridLayout.addWidget(collectionsComboBoxLabel, 3, 1, 1, 1)

        try:
            m = slicer.modules.tciabrowser
            self.tcia = slicer.modules.tciabrowser.widgetRepresentation().self(
            )
            self.connectTCIAButton = qt.QPushButton('Connect')
            self.connectTCIAButton.toolTip = "Connect to TCIA Server."
            dataGridLayout.addWidget(self.connectTCIAButton, 3, 2, 1, 1)
            self.collectionsComboBox = qt.QComboBox()
            dataGridLayout.addWidget(self.collectionsComboBox, 3, 3, 1, 2)
            # connections
            self.connectTCIAButton.connect('clicked(bool)',
                                           self.getTCIACollectionValues)
            # TODO disable scrolling event for collectionsComboBox
            self.collectionsComboBox.connect('currentIndexChanged(QString)',
                                             self.onTCIACollectionChanged)
        except AttributeError:
            # TODO add button to open Extensions Manager
            noConnectionLabel = qt.QLabel('TCIA Browser not installed.')
            dataGridLayout.addWidget(noConnectionLabel, 3, 2, 1, 1)

        #
        # Patient Table Area
        #
        self.patientGroupBox = ctk.ctkCollapsibleGroupBox()
        self.patientGroupBox.setTitle('Patient Selection')
        self.layout.addWidget(self.patientGroupBox)
        self.patientGroupBoxLayout = qt.QGridLayout(self.patientGroupBox)

        self.patientsTable = qt.QTableWidget()
        self.patientsTableHeaderLabels = [
            'ID', 'Name', 'BirthDate', 'Sex', 'Modalities'
        ]
        self.patientsTable.setColumnCount(5)
        self.patientsTable.sortingEnabled = True
        self.patientsTable.setHorizontalHeaderLabels(
            self.patientsTableHeaderLabels)
        self.patientsTableHeader = self.patientsTable.horizontalHeader()
        self.patientsTableHeader.setStretchLastSection(True)
        self.patientGroupBoxLayout.addWidget(self.patientsTable, 1, 1, 1, 5)
        abstractItemView = qt.QAbstractItemView()
        self.patientsTable.setSelectionBehavior(abstractItemView.SelectRows)

        self.examinePatientButton = qt.QPushButton('Examine')
        self.examinePatientButton.setEnabled(False)
        self.patientGroupBoxLayout.addWidget(self.examinePatientButton, 2, 4,
                                             1, 2)

        #
        # Other Connections
        #
        self.dirButton.connect('directoryChanged(const QString &)',
                               self.onDICOMDirectoryChanged)