def setupIntraopSeriesSelector(self):
   self.intraopSeriesSelector = qt.QComboBox()
   self.intraopSeriesSelector.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum)
   self.intraopSeriesSelector.setMinimumContentsLength(20)
   self.intraopSeriesSelector.setSizeAdjustPolicy(qt.QComboBox().AdjustToMinimumContentsLength)
   self._seriesModel = qt.QStandardItemModel()
   self.intraopSeriesSelector.setModel(self._seriesModel)
Esempio n. 2
0
    def onMismatchErrorApply(self):
        print "apply button\n"
        myWLIO = self.logic.RunMismatchError(self.WLIO)
        self.averageError.setText(myWLIO.average)
        self.Variance.setText(myWLIO.variance)
        self.stDev.setText(myWLIO.stdev)
        print "ready to draw table:"
        for dist in myWLIO.landm_distance:
            print dist

    # the table.. - separate into a function?
        self.items = []
        self.model = qt.QStandardItemModel()
        self.view.setModel(self.model)
        self.view.verticalHeader().visible = False
        row = 0
        landmarkcounter = 0
        for dist in myWLIO.landm_distance:
            # 1st column (row,0)
            item = qt.QStandardItem()
            landmarkcounter += 1
            item.setText(landmarkcounter)
            self.model.setItem(row, 0, item)
            self.items.append(item)
            # 2nd column (row,1)
            item = qt.QStandardItem()
            item.setText(dist)
            self.model.setItem(row, 1, item)
            self.items.append(item)
            row += 1
        #done!
        #self.view.setColumnWidth(0,30)
        self.model.setHeaderData(0, 1, "Landmark")
        self.model.setHeaderData(1, 1, "dist, mm")
Esempio n. 3
0
 def populateColors(self):
     self.brushes = []
     self.items = []
     self.model = qt.QStandardItemModel()
     self.view.setModel(self.model)
     pattern = self.search.text
     self.row = 0
     for c in self.recents:
         self.addRow(c)
     if self.recents:
         item = qt.QStandardItem()
         item.setText("--")
         self.model.setItem(self.row, 0, item)
         self.model.setItem(self.row, 1, item)
         self.model.setItem(self.row, 2, item)
         self.items.append(item)
         self.row += 1
     for c in range(self.colorNode.GetNumberOfColors()):
         name = self.colorNode.GetColorName(c)
         if name != "(none)" and name.lower().find(pattern.lower()) >= 0:
             self.addRow(c)
     self.view.setColumnWidth(0, 75)
     self.view.setColumnWidth(1, 50)
     self.view.setColumnWidth(2, 150)
     self.model.setHeaderData(0, 1, "Number")
     self.model.setHeaderData(1, 1, "Color")
     self.model.setHeaderData(2, 1, "Name")
Esempio n. 4
0
    def populateDistances(self):
        if not self.logic:
            return
        self.items = []
        self.model = qt.QStandardItemModel()
        self.view.setModel(self.model)
        self.view.verticalHeader().visible = False
        row = 0
        for i in self.logic.landmarkPairs["Landmarks"]:
            item = qt.QStandardItem()
            item.setData(points[fixed])
            #item.setToolTip(colorNode.GetColorName(i))
            self.model.setItem(row, 0, item)
            self.items.append(item)
            col = 1
            for k in self.logic.keys:
                item = qt.QStandardItem()
                item.setText(str(self.logic.landmarkPairs[i, k]))
                #item.setToolTip(colorNode.GetColorName(i))
                self.model.setItem(row, col, item)
                self.items.append(item)
                col += 1
            row += 1

        self.view.setColumnWidth(0, 30)
        self.model.setHeaderData(0, 1, " ")
        col = 1
        for k in self.logic.keys:
            self.view.setColumnWidth(col, 15 * len(k))
            self.model.setHeaderData(col, 1, k)
            col += 1
Esempio n. 5
0
 def setupIntraopSeriesSelector(self):
     self.intraopSeriesSelector = qt.QComboBox()
     self.intraopSeriesSelector.setSizePolicy(qt.QSizePolicy.Expanding,
                                              qt.QSizePolicy.Minimum)
     self._seriesModel = qt.QStandardItemModel()
     self.intraopSeriesSelector.setModel(self._seriesModel)
     self.intraopSeriesSelector.setToolTip(
         constants.IntraopSeriesSelectorToolTip)
Esempio n. 6
0
 def _createListView(self, name, headerLabels):
     view = qt.QListView()
     view.setObjectName(name)
     view.setSpacing(3)
     model = qt.QStandardItemModel()
     model.setHorizontalHeaderLabels(headerLabels)
     view.setModel(model)
     view.setEditTriggers(qt.QAbstractItemView.NoEditTriggers)
     return view, model
 def _configureStudiesTable(self):
     self._studiesTable = self.ui.findChild(qt.QTableView,
                                            "studiesTableView")
     self._studiesTableModel = qt.QStandardItemModel()
     self._studiesTableModel.setHorizontalHeaderLabels(
         ["Study Instance UID", "Date"])
     self._studiesTable.setModel(self._studiesTableModel)
     self._studiesTable.setEditTriggers(qt.QAbstractItemView.NoEditTriggers)
     self._studiesTable.horizontalHeader().setSectionResizeMode(
         0, qt.QHeaderView.Stretch)
     self._studiesTable.horizontalHeader().setSectionResizeMode(
         1, qt.QHeaderView.ResizeToContents)
Esempio n. 8
0
    def populateStats(self):
        if not self.logic:
            return
        displayNode = self.labelNode.GetDisplayNode()
        colorNode = displayNode.GetColorNode()
        lut = colorNode.GetLookupTable()
        self.items = []
        self.model = qt.QStandardItemModel()
        self.view.setModel(self.model)
        self.view.verticalHeader().visible = False
        row = 0
        for i in self.logic.labelStats["Labels"]:
            col = 0

            color = qt.QColor()
            rgb = lut.GetTableValue(i)
            color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255)
            item = qt.QStandardItem()
            item.setData(color, qt.Qt.DecorationRole)
            item.setToolTip(colorNode.GetColorName(i))
            item.setEditable(False)
            self.model.setItem(row, col, item)
            self.items.append(item)
            col += 1

            item = qt.QStandardItem()
            item.setData(colorNode.GetColorName(i), qt.Qt.DisplayRole)
            item.setEditable(False)
            self.model.setItem(row, col, item)
            self.items.append(item)
            col += 1

            for k in self.logic.keys:
                item = qt.QStandardItem()
                # set data as float with Qt::DisplayRole
                item.setData(float(self.logic.labelStats[i, k]),
                             qt.Qt.DisplayRole)
                item.setToolTip(colorNode.GetColorName(i))
                item.setEditable(False)
                self.model.setItem(row, col, item)
                self.items.append(item)
                col += 1
            row += 1

        self.view.setColumnWidth(0, 30)
        self.model.setHeaderData(0, 1, " ")
        self.model.setHeaderData(1, 1, "Type")
        col = 2
        for k in self.logic.keys:
            self.view.setColumnWidth(col, 15 * len(k))
            self.model.setHeaderData(col, 1, k)
            col += 1
Esempio n. 9
0
    def __init__(self, columnNames):
        super().__init__()

        self.addButton = qt.QPushButton('+')
        self.addButton.clicked.connect(self.onAddButton)

        self.removeButton = qt.QPushButton('-')
        self.removeButton.clicked.connect(self.onRemoveButton)

        self.linkStagesPushButton = qt.QPushButton('Link Across Stages')
        self.linkStagesPushButton.toolTip = 'When checked, settings will be the same for all stages.'
        self.linkStagesPushButton.checkable = True

        self.buttonsFrame = qt.QFrame()
        self.buttonsFrame.setSizePolicy(qt.QSizePolicy.Preferred,
                                        qt.QSizePolicy.Minimum)
        self.buttonsFrame.setLayout(qt.QHBoxLayout())
        self.buttonsFrame.layout().addWidget(self.addButton)
        self.buttonsFrame.layout().addWidget(self.removeButton)
        self.buttonsFrame.layout().addWidget(self.linkStagesPushButton)

        self.model = qt.QStandardItemModel(1, len(columnNames))
        for i, columnName in enumerate(columnNames):
            self.model.setHeaderData(i, qt.Qt.Horizontal, columnName)

        self.view = qt.QTableView()
        self.view.setEditTriggers(self.view.CurrentChanged +
                                  self.view.DoubleClicked +
                                  self.view.SelectedClicked)
        self.view.setSelectionMode(self.view.SingleSelection)
        self.view.setSelectionBehavior(self.view.SelectRows)
        self.view.horizontalHeader().setStretchLastSection(True)
        self.view.setHorizontalScrollMode(self.view.ScrollPerPixel)
        self.view.verticalHeader().setMaximumSectionSize(self.RowHeight)
        self.view.verticalHeader().setMinimumSectionSize(self.RowHeight)
        self.view.verticalHeader().setDefaultSectionSize(self.RowHeight)
        self.view.setFixedHeight(65)
        self.view.setModel(self.model)
        self.view.setCurrentIndex(self.model.index(0, 0))

        self.view.selectionModel().selectionChanged.connect(
            self.onSelectionChanged)

        layout = qt.QVBoxLayout(self)
        layout.addWidget(self.buttonsFrame)
        layout.addWidget(self.view)

        return layout
Esempio n. 10
0
    def PopulateTableStats(self):
        """ Creates the Qt table with the statistics"""

        NewOrderKeys = [
            'Segment', 'Scalar Volume', 'Mean', 'Standard Deviation',
            'Minimum', 'Maximum', 'Median', 'Number of voxels [voxels]',
            'Surface area [mm2]', 'Volume [mm3]', 'Volume [mm3]'
        ]
        self.items = []
        self.model = qt.QStandardItemModel()
        self.table.setModel(self.model)
        self.table.verticalHeader().visible = False
        segmentationNode = self.segmentationSelector.currentNode()
        row = 0
        NofSegments = len(self.statistics['SegmentIDs'])
        I = np.concatenate((np.arange(NofSegments), np.arange(NofSegments)))

        for i in range(len(list(self.stats.values())[0])):
            col = 0
            color = qt.QColor()
            segment = segmentationNode.GetSegmentation().GetSegment(
                self.statistics['SegmentIDs'][I[i]])
            rgb = segment.GetColor()
            color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255)
            item = qt.QStandardItem()
            item.setData(color, qt.Qt.DecorationRole)
            item.setEditable(False)
            self.model.setItem(row, col, item)
            self.items.append(item)
            col += 1
            for k in NewOrderKeys:
                item = qt.QStandardItem()
                item.setData(self.stats[k][i], qt.Qt.DisplayRole)
                item.setEditable(False)
                self.model.setItem(row, col, item)
                self.items.append(item)
                col += 1
            row += 1

        col = 0
        self.table.setColumnWidth(0, 30)
        self.model.setHeaderData(0, 1, " ")
        col += 1

        for k in NewOrderKeys:
            self.table.setColumnWidth(col, 16 * len(k))
            self.model.setHeaderData(col, 1, k)
            col += 1
Esempio n. 11
0
    def populateStats(self):
        if not self.logic:
            return
        displayNode = self.labelNode.GetDisplayNode()
        colorNode = displayNode.GetColorNode()
        lut = colorNode.GetLookupTable()
        self.items = []
        self.model = qt.QStandardItemModel()
        self.view.setModel(self.model)
        self.view.verticalHeader().visible = False
        row = 0

        for regionTag, regionValue in zip(self.logic.regionTags,
                                          self.logic.regionValues):
            color = qt.QColor()
            rgb = lut.GetTableValue(regionValue[0])
            color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255)
            item = qt.QStandardItem()
            item.setData(color, 1)
            item.setText(str(regionTag))
            item.setData(regionTag, 1)
            item.setToolTip(regionTag)
            item.setTextAlignment(1)
            self.model.setItem(row, 0, item)
            self.items.append(item)
            col = 1
            for k in self.logic.keys:
                item = qt.QStandardItem()
                item.setText("%.3f" % self.logic.labelStats[k, regionTag])
                item.setTextAlignment(4)
                self.view.setColumnWidth(col, 15 * len(item.text()))
                self.model.setItem(row, col, item)
                self.items.append(item)
                col += 1
            row += 1

        self.view.setColumnWidth(0, 15 * len('Region'))
        self.model.setHeaderData(0, 1, "Region")
        col = 1
        for k in self.logic.keys:
            # self.view.setColumnWidth(col,15*len(k))
            self.model.setHeaderData(col, 1, k)
            col += 1
 def _configureSeriesTable(self):
     self._seriesTable = self.ui.findChild(qt.QTableView, "seriesTableView")
     self._seriesTableModel = qt.QStandardItemModel()
     self._seriesTableModel.setHorizontalHeaderLabels([
         "UID", "Series Number", "Series Date", "Modality",
         "Series Description"
     ])
     self._seriesTable.setModel(self._seriesTableModel)
     self._seriesTable.setEditTriggers(qt.QAbstractItemView.NoEditTriggers)
     self._seriesTable.setColumnHidden(0, True)
     # self._seriesTable.horizontalHeader().setSectionResizeMode(0, qt.QHeaderView.Stretch)
     self._seriesTable.horizontalHeader().setSectionResizeMode(
         1, qt.QHeaderView.ResizeToContents)
     self._seriesTable.horizontalHeader().setSectionResizeMode(
         2, qt.QHeaderView.ResizeToContents)
     self._seriesTable.horizontalHeader().setSectionResizeMode(
         3, qt.QHeaderView.ResizeToContents)
     self._seriesTable.horizontalHeader().setSectionResizeMode(
         4, qt.QHeaderView.Stretch)
     self._seriesTable.setSelectionBehavior(qt.QTableView.SelectRows)
     self._seriesTable.verticalHeader().hide()
Esempio n. 13
0
    def __init__(self, *args, **kwargs):
        qt.QWidget.__init__(self, *args, **kwargs)
        self.create()

        # mrml volume node instances
        self._master = None
        self._merge = None

        # pseudo signals
        # - python callable that gets True or False
        self.mergeValidCommand = None

        # string
        self.mergeVolumePostfix = "-label"

        # instance of a ColorBox
        self.colorBox = None

        # qt model/view classes to track per-structure volumes
        self.structures = qt.QStandardItemModel()

        # mrml node for invoking command line modules
        self.CLINode = None

        # slicer helper class
        self.volumesLogic = slicer.modules.volumes.logic()

        # buttons pressed
        self.addStructureButton.connect("clicked()", self.addStructure)
        self.deleteStructuresButton.connect("clicked()", self.deleteStructures)
        self.deleteSelectedStructureButton.connect(
            "clicked()", self.deleteSelectedStructure)
        # selection changed event
        # invoked event
        self.splitButton.connect("clicked()", self.split)
        self.mergeButton.connect("clicked()", self.mergeStructures)
        self.mergeAndBuildButton.connect("clicked()", self.onMergeAndBuild)
        self.exportButton.connect("clicked()", self.export)
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)
        # Instantiate and connect widgets ...
        #
        # Input/Export Area
        #
        IOCollapsibleButton = ctk.ctkCollapsibleButton()
        IOCollapsibleButton.text = "Input and Export"
        self.layout.addWidget(IOCollapsibleButton)

        # Layout within the dummy collapsible button
        #IOFormLayout = qt.QFormLayout(IOCollapsibleButton)
        IOFormLayout = qt.QFormLayout(IOCollapsibleButton)

        #
        # Username input
        #
        self.userNameInput = qt.QLineEdit()
        self.userNameInput.setText(slicer.userNameDefault)
        self.userNameInput.setToolTip("Input MorphoSource account username")
        IOFormLayout.addRow("MorphSource Username: "******"Input MorphoSource account password")
        IOFormLayout.addRow("MorphSource Password: "******"Log in")
        self.loginButton.toolTip = "Log into the Morphosource database"
        self.loginButton.enabled = False
        IOFormLayout.addRow(self.loginButton)

        #
        # Query parameter area
        #
        parametersCollapsibleButton = ctk.ctkCollapsibleButton()
        parametersCollapsibleButton.text = "Query parameters"
        self.layout.addWidget(parametersCollapsibleButton)

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

        #
        # Username input
        #
        self.orderInput = qt.QLineEdit()
        self.orderInput.setToolTip(
            "Input the the specimen order, eg: 'Euprimates' ")
        parametersFormLayout.addRow("Query order: ", self.orderInput)

        #
        # Username input
        #
        self.elementInput = qt.QLineEdit()
        self.elementInput.setToolTip(
            "Input the speciment element, eg: 'Cranuim' ")
        parametersFormLayout.addRow("Query element: ", self.elementInput)

        #

        # Submit query Button
        #
        self.submitQueryButton = qt.QPushButton("Submit query")
        self.submitQueryButton.toolTip = "Query the MorphoSource database for 3D models. This may take a few minutes."
        self.submitQueryButton.enabled = False
        parametersFormLayout.addRow(self.submitQueryButton)

        #
        # Query results area
        #
        resultsCollapsibleButton = ctk.ctkCollapsibleButton()
        resultsCollapsibleButton.text = "Query results:"
        resultsCollapsibleButton.collapsed = False
        self.layout.addWidget(resultsCollapsibleButton)
        resultsFormLayout = qt.QFormLayout(resultsCollapsibleButton)

        self.resultsModel = qt.QStandardItemModel()
        self.resultsTable = qt.QTableView()
        self.resultsTable.horizontalHeader().stretchLastSection = True
        self.resultsTable.horizontalHeader().visible = False
        self.resultsTable.verticalHeader().visible = False
        self.resultsTable.setSelectionBehavior(
            qt.QAbstractItemView().SelectRows)
        self.resultsTable.setModel(self.resultsModel)
        resultsFormLayout.addRow(self.resultsTable)

        self.loadResultsButton = qt.QPushButton("Load selected models")
        self.loadResultsButton.toolTip = "Load the selected models into the scene."
        self.loadResultsButton.enabled = False
        resultsFormLayout.addRow(self.loadResultsButton)

        # connections
        self.loginButton.connect('clicked(bool)', self.onLogin)
        self.userNameInput.connect('textChanged(const QString &)',
                                   self.onLoginStringChanged)
        self.passwordInput.connect('textChanged(const QString &)',
                                   self.onLoginStringChanged)
        self.orderInput.connect('textChanged(const QString &)',
                                self.onQueryStringChanged)
        self.elementInput.connect('textChanged(const QString &)',
                                  self.onQueryStringChanged)
        self.submitQueryButton.connect('clicked(bool)', self.onSubmitQuery)
        self.loadResultsButton.connect('clicked(bool)', self.onLoadResults)

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

        # Refresh Apply button state
        self.onLoginStringChanged()
        self.onQueryStringChanged()
Esempio n. 15
0
    def updateStructures(self, caller=None, event=None):
        """re-build the Structures frame
    - optional caller and event ignored (for use as vtk observer callback)
    """

        if slicer.mrmlScene.IsBatchProcessing():
            return

        if self.mergeButton.destroyed():
            """ TODO: here the python class still exists but the
      Qt widgets are gone - need to figure out when to remove observers
      and free python code - probably the destroyed() signal.
      """
            self.cleanup()
            return

        #self.mergeSelector.setDisabled(not self.master)

        # reset to a fresh model
        self.structures = qt.QStandardItemModel()
        self.structuresView.setModel(self.structures)

        # if no merge volume exists, disable everything - else enable
        merge = self.merge

        self.addStructureButton.setDisabled(not merge)
        self.deleteStructuresButton.setDisabled(not merge)
        self.deleteSelectedStructureButton.setDisabled(not merge)
        self.mergeButton.setDisabled(not merge)
        self.splitButton.setDisabled(not merge)
        self.mergeAndBuildButton.setDisabled(not merge)
        self.replaceModels.setDisabled(not merge)
        if self.mergeValidCommand:
            # will be passed current
            self.mergeValidCommand(merge)

        if not merge:
            return

        colorNode = merge.GetDisplayNode().GetColorNode()
        lut = colorNode.GetLookupTable()

        masterName = self.master.GetName()
        volumeNodes = self.structureVolumes()
        for vNode in volumeNodes:
            vName = vNode.GetName()
            # figure out what name it is
            # - account for the fact that sometimes a number will be added to the end of the name
            start = 1 + len(masterName)
            end = vName.rfind(self.mergeVolumePostfix)
            structureName = vName[start:end]
            structureIndex = colorNode.GetColorIndexByName(structureName)
            structureColor = lut.GetTableValue(structureIndex)[0:3]
            color = qt.QColor()
            color.setRgb(structureColor[0] * 255, structureColor[1] * 255,
                         structureColor[2] * 255)

            # label index
            item = qt.QStandardItem()
            item.setEditable(False)
            item.setText("%03d" % int(structureIndex))
            self.structures.setItem(self.row, 0, item)

            # label color
            item = qt.QStandardItem()
            item.setEditable(False)
            item.setData(color, 1)
            self.structures.setItem(self.row, 1, item)

            # structure name
            item = qt.QStandardItem()
            item.setEditable(False)
            item.setText(structureName)
            self.structures.setItem(self.row, 2, item)

            # volumeName name
            item = qt.QStandardItem()
            item.setEditable(False)
            item.setText(vName)
            self.structures.setItem(self.row, 3, item)

            # sort order
            item = qt.QStandardItem()
            item.setEditable(True)
            item.setText("")
            self.structures.setItem(self.row, 4, item)

            self.row += 1

        for i in range(5):
            self.structuresView.resizeColumnToContents(i)

        self.structures.setHeaderData(0, 1, "Number")
        self.structures.setHeaderData(1, 1, "Color")
        self.structures.setHeaderData(2, 1, "Name")
        self.structures.setHeaderData(3, 1, "Label Volume")
        self.structures.setHeaderData(4, 1, "Order")
        self.structuresView.setModel(self.structures)
        self.structuresView.connect("activated(QModelIndex)",
                                    self.onStructuresClicked)
        self.structuresView.setProperty(
            'SH_ItemView_ActivateItemOnSingleClick', 1)

        self.structureLabelNames = []
        rows = self.structures.rowCount()
        for row in xrange(rows):
            self.structureLabelNames.append(
                self.structures.item(row, 2).text())
Esempio n. 16
0
  def setup(self):
    ScriptedLoadableModuleWidget.setup(self)

    # Instantiate and connect widgets ...


    #
    # File area
    #
    filesCollapsibleButton = ctk.ctkCollapsibleButton()
    filesCollapsibleButton.text = "Files"
    filesCollapsibleButton.collapsed = False
    self.layout.addWidget(filesCollapsibleButton)
    # Layout within the files collapsible button
    filesFormLayout = qt.QFormLayout(filesCollapsibleButton)

    self.fileModel = qt.QStandardItemModel()
    self.fileTable = qt.QTableView()
    self.fileTable.horizontalHeader().stretchLastSection = True
    self.fileTable.horizontalHeader().visible = False
    self.fileTable.setModel(self.fileModel)
    filesFormLayout.addRow(self.fileTable)

    buttonLayout = qt.QHBoxLayout()
    self.addByBrowsingButton = qt.QPushButton("Browse for files")
    self.clearFilesButton = qt.QPushButton("Clear files")
    buttonLayout.addWidget(self.addByBrowsingButton)
    buttonLayout.addWidget(self.clearFilesButton)
    filesFormLayout.addRow(buttonLayout)

    #
    # output area
    #
    outputCollapsibleButton = ctk.ctkCollapsibleButton()
    outputCollapsibleButton.text = "Output"
    outputCollapsibleButton.collapsed = False
    self.layout.addWidget(outputCollapsibleButton)
    outputFormLayout = qt.QFormLayout(outputCollapsibleButton)

    #
    # output volume selector
    #
    #self.outputSelector = slicer.qMRMLSubjectHierarchyComboBox()
    self.outputSelector = slicer.qMRMLNodeComboBox()

    self.outputSelector.nodeTypes = ["vtkMRMLScalarVolumeNode",]
    #self.outputSelector.setNodeTypes(["vtkMRMLScalarVolumeNode",]) ; TODO: make nodeTypes property for SH box


    """
    TODO: which are supported and needed for SubjectHierarchy combo box.
    TODO: can we delete/rename/create as with SH
    self.outputSelector.defaultText = "Create new volume." ; # TODO any way to reset value?
    """
    self.outputSelector.showChildNodeTypes = False
    self.outputSelector.showHidden = False
    self.outputSelector.showChildNodeTypes = False
    self.outputSelector.selectNodeUponCreation = False
    self.outputSelector.noneEnabled = True
    self.outputSelector.removeEnabled = True
    self.outputSelector.renameEnabled = True
    self.outputSelector.addEnabled = True
    self.outputSelector.setMRMLScene( slicer.mrmlScene )
    self.outputSelector.setToolTip( "Pick the output volume to populate or None to autogenerate." )
    outputFormLayout.addRow("Output Volume: ", self.outputSelector)

    self.spacing = ctk.ctkCoordinatesWidget()
    self.spacing.coordinates = "1,1,1"
    self.spacing.toolTip = "Set the colunm, row, slice spacing in mm"
    outputFormLayout.addRow("Spacing: ", self.spacing)


    self.loadButton = qt.QPushButton("Load files")
    outputFormLayout.addRow(self.loadButton)

    #
    # Add by name area
    #
    addByNameCollapsibleButton = ctk.ctkCollapsibleButton()
    addByNameCollapsibleButton.text = "Add files by name"
    addByNameCollapsibleButton.collapsed = True
    addByNameFormLayout = qt.QFormLayout(addByNameCollapsibleButton)
    # Don't enable Add by name for now - let's see if it's actually needed
    # self.layout.addWidget(addByNameCollapsibleButton)

    forExample = """
    directoryPath = '/Volumes/SSD2T/data/SlicerMorph/Sample_for_steve/1326_Rec'
    pathFormat = '%s/1326__rec%04d.png'
    start, end =  (50, 621)
    """

    self.archetypePathEdit = ctk.ctkPathLineEdit()
    addByNameFormLayout.addRow("Archetype file", self.archetypePathEdit)

    self.archetypeFormat = qt.QLineEdit()
    addByNameFormLayout.addRow("Name format", self.archetypeFormat)

    self.indexRange = ctk.ctkRangeWidget()
    self.indexRange.decimals = 0
    self.indexRange.maximum = 0
    addByNameFormLayout.addRow("Index range", self.indexRange)

    self.generateNamesButton = qt.QPushButton("Apply")
    self.generateNamesButton.toolTip = "Run the algorithm."
    self.generateNamesButton.enabled = False
    addByNameFormLayout.addRow(self.generateNamesButton)

    # connections
    self.addByBrowsingButton.connect('clicked()', self.addByBrowsing)
    self.clearFilesButton.connect('clicked()', self.fileTable.model().clear)
    self.archetypePathEdit.connect('currentPathChanged(QString)', self.validateInput)
    self.archetypePathEdit.connect('currentPathChanged(QString)', self.updateGUIFromArchetype)
    self.archetypeFormat.connect('textChanged(QString)', self.validateInput)
    self.generateNamesButton.connect('clicked()', self.onGenerateNames)
    # self.outputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.validateInput) # TODO - this is missing
    self.loadButton.connect('clicked()', self.onLoadButton)

    # refill last selection
    self.archetypePathEdit.currentPath = slicer.util.settingsValue("ImageStacks/lastArchetypePath", "")


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

    # Refresh Apply button state
    self.validateInput()
Esempio n. 17
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        # Instantiate and connect widgets ...

        #
        # File area
        #
        filesCollapsibleButton = ctk.ctkCollapsibleButton()
        filesCollapsibleButton.text = "Files"
        filesCollapsibleButton.collapsed = False
        self.layout.addWidget(filesCollapsibleButton)
        # Layout within the files collapsible button
        filesFormLayout = qt.QFormLayout(filesCollapsibleButton)

        self.fileModel = qt.QStandardItemModel()
        self.fileTable = qt.QTableView()
        self.fileTable.horizontalHeader().stretchLastSection = True
        self.fileTable.horizontalHeader().visible = False
        self.fileTable.setModel(self.fileModel)
        filesFormLayout.addRow(self.fileTable)

        buttonLayout = qt.QHBoxLayout()
        self.addByBrowsingButton = qt.QPushButton("Browse for files")
        self.clearFilesButton = qt.QPushButton("Clear files")
        buttonLayout.addWidget(self.addByBrowsingButton)
        buttonLayout.addWidget(self.clearFilesButton)
        filesFormLayout.addRow(buttonLayout)

        self.propertiesLabel = qt.QLabel()
        filesFormLayout.addRow(self.propertiesLabel)

        #
        # output area
        #
        outputCollapsibleButton = ctk.ctkCollapsibleButton()
        outputCollapsibleButton.text = "Output"
        outputCollapsibleButton.collapsed = False
        self.layout.addWidget(outputCollapsibleButton)
        outputFormLayout = qt.QFormLayout(outputCollapsibleButton)

        #
        # output volume selector
        #
        self.outputSelector = slicer.qMRMLNodeComboBox()

        self.outputSelector.nodeTypes = [
            "vtkMRMLScalarVolumeNode",
        ]

        self.outputSelector.showChildNodeTypes = False
        self.outputSelector.showHidden = False
        self.outputSelector.showChildNodeTypes = False
        self.outputSelector.selectNodeUponCreation = True
        self.outputSelector.noneEnabled = True
        self.outputSelector.removeEnabled = True
        self.outputSelector.renameEnabled = True
        self.outputSelector.addEnabled = True
        self.outputSelector.setMRMLScene(slicer.mrmlScene)
        self.outputSelector.setToolTip(
            "Pick the output volume to populate or None to autogenerate.")
        outputFormLayout.addRow("Output Volume: ", self.outputSelector)

        self.spacing = ctk.ctkCoordinatesWidget()
        self.spacing.decimals = 8
        self.spacing.coordinates = "1,1,1"
        self.spacing.toolTip = "Set the colunm, row, slice spacing in mm; original spacing not including downsample"
        outputFormLayout.addRow("Spacing: ", self.spacing)

        self.downsample = qt.QCheckBox()
        self.downsample.toolTip = "Reduces data size by half in each dimension by skipping every other pixel and slice (uses about 1/8 memory)"
        outputFormLayout.addRow("Downsample: ", self.downsample)

        self.reverse = qt.QCheckBox()
        self.reverse.toolTip = "Read the images in reverse order"
        outputFormLayout.addRow("Reverse: ", self.reverse)

        self.sliceSkip = ctk.ctkDoubleSpinBox()
        self.sliceSkip.decimals = 0
        self.sliceSkip.minimum = 0
        self.sliceSkip.toolTip = "Skips the selected number of slices (use, for example, on long thin samples with more slices than in-plane resolution)"
        outputFormLayout.addRow("Slice skip: ", self.sliceSkip)

        self.loadButton = qt.QPushButton("Load files")
        outputFormLayout.addRow(self.loadButton)

        #
        # Add by name area
        #
        addByNameCollapsibleButton = ctk.ctkCollapsibleButton()
        addByNameCollapsibleButton.text = "Add files by name"
        addByNameCollapsibleButton.collapsed = True
        addByNameFormLayout = qt.QFormLayout(addByNameCollapsibleButton)
        # Don't enable Add by name for now - let's see if it's actually needed
        # self.layout.addWidget(addByNameCollapsibleButton)

        forExample = """
    directoryPath = '/Volumes/SSD2T/data/SlicerMorph/Sample_for_steve/1326_Rec'
    pathFormat = '%s/1326__rec%04d.png'
    start, end =  (50, 621)
    """

        self.archetypePathEdit = ctk.ctkPathLineEdit()
        addByNameFormLayout.addRow("Archetype file", self.archetypePathEdit)

        self.archetypeFormat = qt.QLineEdit()
        addByNameFormLayout.addRow("Name format", self.archetypeFormat)

        self.indexRange = ctk.ctkRangeWidget()
        self.indexRange.decimals = 0
        self.indexRange.maximum = 0
        addByNameFormLayout.addRow("Index range", self.indexRange)

        self.generateNamesButton = qt.QPushButton("Apply")
        self.generateNamesButton.toolTip = "Run the algorithm."
        self.generateNamesButton.enabled = False
        addByNameFormLayout.addRow(self.generateNamesButton)

        # connections
        self.addByBrowsingButton.connect('clicked()', self.addByBrowsing)
        self.clearFilesButton.connect('clicked()', self.onClearFiles)
        self.archetypePathEdit.connect('currentPathChanged(QString)',
                                       self.validateInput)
        self.archetypePathEdit.connect('currentPathChanged(QString)',
                                       self.updateGUIFromArchetype)
        self.archetypeFormat.connect('textChanged(QString)',
                                     self.validateInput)
        self.generateNamesButton.connect('clicked()', self.onGenerateNames)
        # self.outputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.validateInput) # TODO - this is missing
        self.loadButton.connect('clicked()', self.onLoadButton)

        # refill last selection
        self.archetypePathEdit.currentPath = slicer.util.settingsValue(
            "ImageStacks/lastArchetypePath", "")

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

        # Refresh Apply button state
        self.validateInput()
Esempio n. 18
0
    """Create and execute an explorer dialog."""
    dialog = ExplorerDialog(widget)
    dialog.exec_()


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('class_name',
                        help='Create a widget of this class to explore.')
    parser.add_argument('--model',
                        metavar='COLUMNS',
                        type=int,
                        help='Create a model for the widget.')
    args = parser.parse_args()

    app = qt.QApplication([])

    w = getattr(qt, args.class_name)()

    if args.model:
        model = qt.QStandardItemModel(0, args.model)
        for s in ['foo', 'bar', 'baz']:
            row = [
                qt.QStandardItem(c)
                for c in [s] + list(map(str, range(args.model - 1)))
            ]
            model.appendRow(row)
        print(w, model)
        w.setModel(model)
    explore(w)
Esempio n. 19
0
    def createSmall(self):
        """Make the internals of the widget to display in the
    Data Probe frame (lower left of slicer main window by default)"""
        # top row - things about the viewer itself
        self.viewerFrame = qt.QFrame(self.frame)
        self.viewerFrame.setLayout(qt.QHBoxLayout())
        self.frame.layout().addWidget(self.viewerFrame)
        self.viewerColor = qt.QLabel(self.viewerFrame)
        self.viewerFrame.layout().addWidget(self.viewerColor)
        self.viewerName = qt.QLabel(self.viewerFrame)
        self.viewerFrame.layout().addWidget(self.viewerName)
        self.viewerRAS = qt.QLabel()
        self.viewerFrame.layout().addWidget(self.viewerRAS)
        self.viewerOrient = qt.QLabel()
        self.viewerFrame.layout().addWidget(self.viewerOrient)
        self.viewerSpacing = qt.QLabel()
        self.viewerFrame.layout().addWidget(self.viewerSpacing)
        self.viewerFrame.layout().addStretch(1)

        # the grid - things about the layers
        if True:
            # this method makes labels
            self.layerGrid = qt.QFrame(self.frame)
            self.layerGrid.setLayout(qt.QGridLayout())
            self.frame.layout().addWidget(self.layerGrid)
            layers = ('L', 'F', 'B')
            self.layerNames = {}
            self.layerIJKs = {}
            self.layerValues = {}
            row = 0
            for layer in layers:
                col = 0
                self.layerGrid.layout().addWidget(qt.QLabel(layer), row, col)
                col += 1
                self.layerNames[layer] = qt.QLabel()
                self.layerGrid.layout().addWidget(self.layerNames[layer], row,
                                                  col)
                col += 1
                self.layerIJKs[layer] = qt.QLabel()
                self.layerGrid.layout().addWidget(self.layerIJKs[layer], row,
                                                  col)
                col += 1
                self.layerValues[layer] = qt.QLabel()
                self.layerGrid.layout().addWidget(self.layerValues[layer], row,
                                                  col)
                self.layerGrid.layout().setColumnStretch(col, 100)
                col += 1
                row += 1
        else:
            # this method use a model/view
            self.layerView = qt.QTableView(self.frame)
            self.layerView.verticalHeader().hide()
            self.frame.layout().addWidget(self.layerView)
            self.layerModel = qt.QStandardItemModel()
            self.layerView.setModel(self.layerModel)
            layers = ('L', 'F', 'B')
            self.layerNames = {}
            self.layerIJKs = {}
            self.layerValues = {}
            self.items = []
            row = 0
            for layer in layers:
                col = 0
                item = qt.QStandardItem()
                item.setText(layer)
                self.layerModel.setItem(row, col, item)
                self.items.append(item)
                col += 1
                self.layerNames[layer] = qt.QStandardItem()
                self.layerModel.setItem(row, col, self.layerNames[layer])
                col += 1
                self.layerIJKs[layer] = qt.QStandardItem()
                self.layerModel.setItem(row, col, self.layerIJKs[layer])
                col += 1
                self.layerValues[layer] = qt.QStandardItem()
                self.layerModel.setItem(row, col, self.layerValues[layer])
                col += 1
                row += 1
            self.layerView.setColumnWidth(0, 15)
            self.layerView.setColumnWidth(1, 80)
            self.layerView.setColumnWidth(2, 65)
            self.layerView.setColumnWidth(3, 55)
            self.layerModel.setHeaderData(0, 1, "")
            self.layerModel.setHeaderData(1, 1, "Volume")
            self.layerModel.setHeaderData(2, 1, "IJK")
            self.layerModel.setHeaderData(3, 1, "Value")

        # goto module button
        self.goToModule = qt.QPushButton('->', self.frame)
        self.goToModule.setToolTip(
            'Go to the DataProbe module for more information and options')
        self.frame.layout().addWidget(self.goToModule)
        self.goToModule.connect("clicked()", self.onGoToModule)
        # hide this for now - there's not much to see in the module itself
        self.goToModule.hide()