コード例 #1
0
    def create(self, registrationState):
        """Make the plugin-specific user interface"""
        super(LocalBRAINSFitPlugin, self).create(registrationState)

        self.LocalBRAINSFitMode = "Small"
        self.VerboseMode = "Quiet"

        #
        # Local Refinment Pane - initially hidden
        # - interface options for linear registration
        #
        localBRAINSFitCollapsibleButton = ctk.ctkCollapsibleButton()
        localBRAINSFitCollapsibleButton.text = "Local BRAINSFit"
        localBRAINSFitFormLayout = qt.QFormLayout()
        localBRAINSFitCollapsibleButton.setLayout(localBRAINSFitFormLayout)
        self.widgets.append(localBRAINSFitCollapsibleButton)

        buttonGroup = qt.QButtonGroup()
        self.widgets.append(buttonGroup)
        buttonLayout = qt.QVBoxLayout()
        localBRAINSFitModeButtons = {}
        self.LocalBRAINSFitModes = ("Small", "Large")
        for mode in self.LocalBRAINSFitModes:
            localBRAINSFitModeButtons[mode] = qt.QRadioButton()
            localBRAINSFitModeButtons[mode].text = mode
            localBRAINSFitModeButtons[mode].setToolTip(
                "Run the refinement in a %s local region." % mode.lower())
            buttonLayout.addWidget(localBRAINSFitModeButtons[mode])
            buttonGroup.addButton(localBRAINSFitModeButtons[mode])
            self.widgets.append(localBRAINSFitModeButtons[mode])
            localBRAINSFitModeButtons[mode].connect(
                'clicked()', lambda m=mode: self.onLocalBRAINSFitMode(m))
        localBRAINSFitModeButtons[self.LocalBRAINSFitMode].checked = True
        localBRAINSFitFormLayout.addRow("Local BRAINSFit Mode ", buttonLayout)

        buttonGroup = qt.QButtonGroup()
        self.widgets.append(buttonGroup)
        buttonLayout = qt.QVBoxLayout()
        verboseModeButtons = {}
        self.VerboseModes = ("Quiet", "Verbose")
        for mode in self.VerboseModes:
            verboseModeButtons[mode] = qt.QRadioButton()
            verboseModeButtons[mode].text = mode
            verboseModeButtons[mode].setToolTip(
                "Run the refinement in %s mode." % mode.lower())
            buttonLayout.addWidget(verboseModeButtons[mode])
            buttonGroup.addButton(verboseModeButtons[mode])
            self.widgets.append(verboseModeButtons[mode])
            verboseModeButtons[mode].connect(
                'clicked()', lambda m=mode: self.onVerboseMode(m))
        verboseModeButtons[self.VerboseMode].checked = True
        localBRAINSFitFormLayout.addRow("Verbose Mode ", buttonLayout)

        self.parent.layout().addWidget(localBRAINSFitCollapsibleButton)
コード例 #2
0
  def setup(self):
    """ Setup all UI elements and prepare data """
    # TODO: following line is only for the purpose of testing
    self._loadedVolumeNodes = OrderedDict({volume.GetID: volume for volume
                                           in slicer.util.getNodesByClass('vtkMRMLScalarVolumeNode')})
    ScriptedLoadableModuleWidget.setup(self)
    self._setupPatientWatchBox()
    self._setupViewSettingGroupBox()
    self._setupCollapsibleLayoutButton()
    self._patientAssessmentWidget = AssessmentWidget(forms=self.getSetting("Patient_Assessment_Forms"),
                                                   title="Patient Level Assessment")
    self._studyAssessmentWidget = AssessmentWidget(forms=self.getSetting("Study_Assessment_Forms"),
                                                   title="Study Level Assessment")
    self._prostateMeasurementsWidget = ProstateWidget()

    self._findingsWidget = FindingsWidget(maximumNumber=4)
    self._exportToHTMLButton = UICreationHelpers.createButton("Export to HTML")
    self.layout.addWidget(self._collapsibleLayoutButton)
    self._setupCollapsibleMultiVolumeExplorerButton()
    self.layout.addWidget(self._collapsibleMultiVolumeButton)
    self.layout.addWidget(self._patientAssessmentWidget)
    self.layout.addWidget(self._studyAssessmentWidget)
    self.layout.addWidget(self._prostateMeasurementsWidget)
    self.layout.addWidget(self._findingsWidget)
    self.layout.addWidget(self._exportToHTMLButton)
    self._stepButtonGroup = qt.QButtonGroup()
    self._stepButtonGroup.addButton(self._patientAssessmentWidget, 1)
    self._stepButtonGroup.addButton(self._studyAssessmentWidget, 2)
    self._stepButtonGroup.addButton(self._prostateMeasurementsWidget, 3)
    self._stepButtonGroup.addButton(self._findingsWidget, 4)
    self.layout.addStretch(1)
    self._setupConnections()
    self.updateGUIFromData()
コード例 #3
0
    def setup(self):
        self.setLayout(qt.QGridLayout())
        self.statusLabel = qt.QLabel("Status:")
        self.textLabel = qt.QLabel()
        self.layout().addWidget(self.statusLabel, 0, 0)
        self.layout().addWidget(self.textLabel, 0, 1, 1, 2)

        self.progress = qt.QProgressBar()
        self.progress.maximum = 0
        self.progress.setAlignment(qt.Qt.AlignCenter)

        self.layout().addWidget(self.progress, 1, 0, 1, qt.QSizePolicy.Maximum)

        self.buttonGroup = qt.QButtonGroup()
        self.skipButton = self.createButton(self.skipButtonText)
        self.cancelButton = self.createButton(self.cancelButtonText)
        self.directoryImportButton = self.createDirectoryButton(
            text="Import from directory",
            caption="Choose directory to import DICOM data from")

        self.buttonGroup.addButton(self.skipButton)
        self.buttonGroup.addButton(self.cancelButton)
        self.layout().addWidget(self.skipButton, 2, 0)
        self.layout().addWidget(self.cancelButton, 2, 1)
        self.layout().addWidget(self.directoryImportButton, 2, 2)

        buttonHeight = 30
        for b in [
                self.skipButton, self.cancelButton, self.directoryImportButton
        ]:
            b.minimumHeight = buttonHeight

        self.setupConnections()
コード例 #4
0
ファイル: wrap_pyqt.py プロジェクト: moneytech/pyvm
 def open_radio(self, cmd=None, title=None, name=None):
     self.group.append([
         qt.QButtonGroup(1, qt.QGroupBox.Horizontal, title,
                         self.group[-1][0]), -1
     ])
     self.mode.append('v')
     self.transistors.append(___qttransistor___(cmd))
     if name:
         setattr(self, name, self.transistors[-1])
コード例 #5
0
  def setupRegistrationResultButtons(self):
    self.rigidResultButton = self.createButton('Rigid', checkable=True, name='rigid')
    self.affineResultButton = self.createButton('Affine', checkable=True, name='affine')
    self.bSplineResultButton = self.createButton('BSpline', checkable=True, name='bSpline')
    self.registrationButtonGroup = qt.QButtonGroup()
    self.registrationButtonGroup.addButton(self.rigidResultButton, 1)
    self.registrationButtonGroup.addButton(self.affineResultButton, 2)
    self.registrationButtonGroup.addButton(self.bSplineResultButton, 3)

    self.registrationTypesGroupBox = qt.QGroupBox("Type")
    self.registrationTypesGroupBoxLayout = qt.QFormLayout(self.registrationTypesGroupBox)
    self.registrationTypesGroupBoxLayout.addWidget(self.createVLayout([self.rigidResultButton,
                                                                       self.affineResultButton,
                                                                       self.bSplineResultButton]))
コード例 #6
0
  def setup(self):
    self.setLayout(qt.QVBoxLayout())

    self.deviceButtonGroup = qt.QButtonGroup()
    self.deviceButtonGroup.setExclusive(True)

    vBoxDeviceButtonGroup = qt.QWidget()
    vBoxDeviceButtonGroup.setLayout(qt.QGridLayout())
    numberOfColumns = 4 if len(self.registeredDeviceClasses) < 5 or len(self.registeredDeviceClasses) > 6 else 3
    for currentWidgetIndex, deviceClass in enumerate(self.registeredDeviceClasses):
      deviceWidgetButton = self.createDeviceButton(deviceClass)
      self.deviceWidgetFrames[deviceClass.ID] = DeviceImplantWidget(deviceClass)
      self.deviceButtonGroup.addButton(deviceWidgetButton)
      vBoxDeviceButtonGroup.layout().addWidget(deviceWidgetButton,
        int(currentWidgetIndex/numberOfColumns), currentWidgetIndex % numberOfColumns)

    self.deviceButtonGroup.connect('buttonClicked(QAbstractButton*)', self.onSwitchDevice)
    self.layout().addWidget(vBoxDeviceButtonGroup)
コード例 #7
0
ファイル: channels.py プロジェクト: pombreda/smart
    def show(self):
        for item in self._mpvbox.children():
            if isinstance(item, qt.QWidget):
                self._mpvbox.removeChild(item)
                del item
        self._mp = None

        group = qt.QButtonGroup(None, "mp")
        n = 0
        for media in iface.getControl().getMediaSet():
            mp = media.getMountPoint()
            if not self._mp:
                self._mp = mp
            qt.QObject.connect(radio, qt.SIGNAL("clicked()"), self.ok)
            radio = qt.QRadioButton(mp, self._mpvbox)
            group.insert(radio)
            act = RadioAction(radio, mp)
            act.connect(self, "_mp", mp)
            radio.show()
            n += 1

        if n == 0:
            iface.error(_("No local media found!"))
            return None
        elif n == 1:
            return self._mp

        self._window.show()
        self._window.raiseW()

        mp = None
        while True:
            self._result = self._window.exec_loop()
            if self._result == qt.QDialog.Accepted:
                mp = self._mp
                break
            mp = None
            break

        self._window.hide()

        return mp
コード例 #8
0
    def setup(self):
        """
    Called when the user opens the module the first time and the widget is initialized.
    """
        ScriptedLoadableModuleWidget.setup(self)

        # Load widget from .ui file (created by Qt Designer)
        uiWidget = slicer.util.loadUI(
            self.resourcePath('UI/RegistrationBasedCorrespondence.ui'))
        self.layout.addWidget(uiWidget)
        self.ui = slicer.util.childWidgetVariables(uiWidget)

        self.methodButtonGroup = qt.QButtonGroup()
        self.methodButtonGroup.setExclusive(True)
        self.methodButtonGroup.addButton(self.ui.DiffeoButton)
        self.methodButtonGroup.addButton(self.ui.BSplineButton)

        self.logic = RegistrationBasedCorrespondenceLogic()

        self.ui.ApplyButton.connect('clicked(bool)', self.onApplyButton)
コード例 #9
0
    def setup(self):
        """This is called one time when the module GUI is initialized
        """
        CIP_ParenchymaSubtypeTrainingWidget.setup(self)
        self.volumeSelectionLayout.addRow("Slice size:", None)

        self.sliceSelectionRadioButtonGroup = qt.QButtonGroup()
        for id in range(len(self.sliceMeasurements)):
            button = qt.QRadioButton("{} mm".format(
                self.sliceMeasurements[id]))
            self.sliceSelectionRadioButtonGroup.addButton(button, id)
            self.volumeSelectionLayout.addRow("", button)

        # Add button for reslicing
        self.resliceButton = qt.QPushButton("Reslice")
        self.volumeSelectionLayout.addRow("", self.resliceButton)
        self.resliceButton.connect('clicked()',
                                   self.__onResliceButtonClicked__)

        # Select by default the airway type
        self.typesRadioButtonGroup.buttons()[2].setChecked(True)
        self.updateState()
コード例 #10
0
    def setupElements(self):
        self.layout().addWidget(qt.QLabel(self.text), 0, 0)
        self.ratingButtonGroup = qt.QButtonGroup()
        for rateValue in range(1, self.maximumValue + 1):
            attributeName = "button" + str(rateValue)
            setattr(self, attributeName,
                    self.createButton('', icon=self.unfilledStarIcon))
            self.ratingButtonGroup.addButton(getattr(self, attributeName),
                                             rateValue)

        for button in list(self.ratingButtonGroup.buttons()):
            button.setCursor(qt.Qt.PointingHandCursor)

        self.ratingLabel = self.createLabel("")
        row = self.createHLayout(
            list(self.ratingButtonGroup.buttons()) + [self.ratingLabel])
        self.layout().addWidget(row, 1, 0)

        self.disableWidgetCheckbox = qt.QCheckBox(
            "Don't display this window again")
        self.disableWidgetCheckbox.checked = False
        self.layout().addWidget(self.disableWidgetCheckbox, 2, 0)
コード例 #11
0
    def setupOptionsFrame(self):

        # Load widget from .ui file. This .ui file can be edited using Qt Designer
        # (Edit / Application Settings / Developer / Qt Designer -> launch).
        uiWidget = slicer.util.loadUI(
            os.path.join(os.path.dirname(__file__), "SegmentEditorEffect.ui"))
        self.scriptedEffect.addOptionsWidget(uiWidget)
        self.ui = slicer.util.childWidgetVariables(uiWidget)

        # Set scene in MRML widgets. Make sure that in Qt designer
        # "mrmlSceneChanged(vtkMRMLScene*)" signal in is connected to each MRML widget's.
        # "setMRMLScene(vtkMRMLScene*)" slot.
        uiWidget.setMRMLScene(slicer.mrmlScene)

        # Order of buttons in the buttongroup must be the same order as the corresponding
        # options in ARG_OPTIONS[].

        self.ui.regionGroup = qt.QButtonGroup()
        self.ui.regionGroup.addButton(self.ui.regionOuterSurfaceRadioButton)
        self.ui.regionGroup.addButton(self.ui.regionLargestCavityRadioButton)
        self.ui.regionGroup.addButton(self.ui.regionSegmentRadioButton)

        self.ui.shellOffsetDirectionGroup = qt.QButtonGroup()
        self.ui.shellOffsetDirectionGroup.addButton(
            self.ui.shellOffsetInsideRadioButton)
        self.ui.shellOffsetDirectionGroup.addButton(
            self.ui.shellOffsetOutsideRadioButton)

        self.ui.outputTypeGroup = qt.QButtonGroup()
        self.ui.outputTypeGroup.addButton(self.ui.outputSegmentRadioButton)
        self.ui.outputTypeGroup.addButton(self.ui.outputNewSegmentRadioButton)
        self.ui.outputTypeGroup.addButton(self.ui.outputModelRadioButton)

        # Widget to arguments mapping
        self.valueEditWidgets = {
            ARG_REGION: self.ui.regionGroup,
            ARG_REGION_SEGMENT_ID: self.ui.regionSegmentSelector,
            ARG_CARVE_HOLES_IN_OUTER_SURFACE:
            self.ui.carveHolesInOuterSurfaceCheckBox,
            ARG_CARVE_HOLES_IN_OUTER_SURFACE_DIAMETER:
            self.ui.carveHolesInOuterSurfaceDiameterSlider,
            ARG_SPLIT_CAVITIES: self.ui.splitCavitiesCheckBox,
            ARG_SPLIT_CAVITIES_DIAMETER: self.ui.splitCavitiesDiameterSlider,
            ARG_CREATE_SHELL: self.ui.createShellCheckBox,
            ARG_SHELL_THICKNESS: self.ui.shellThicknessSlider,
            ARG_SHELL_OFFSET_DIRECTION: self.ui.shellOffsetDirectionGroup,
            ARG_SHELL_PRESERVE_CRACKS: self.ui.shellPreserveCracksCheckBox,
            ARG_OUTPUT_TYPE: self.ui.outputTypeGroup,
            ARG_OUTPUT_MODEL_NODE: self.ui.outputModelNodeSelector,
            ARG_SMOOTHING_FACTOR: self.ui.smoothingFactorSlider,
            ARG_REMESH_OVERSAMPLING: self.ui.remeshOversamplingSlider,
            ARG_SHRINKWRAP_ITERATIONS: self.ui.iterationsSlider,
            ARG_SAVE_INTERMEDIATE_RESULTS:
            self.ui.saveIntermediateResultsCheckBox
        }

        # Add connections

        for argName, widget in self.valueEditWidgets.items():
            widgetClassName = widget.metaObject().getClassName()
            if widgetClassName == "qMRMLSliderWidget" or widgetClassName == "ctkSliderWidget":
                widget.connect("valueChanged(double)", self.updateMRMLFromGUI)
            elif widgetClassName == "QCheckBox":
                widget.connect("stateChanged(int)", self.updateMRMLFromGUI)
            elif widgetClassName == "qMRMLNodeComboBox":
                widget.connect("currentNodeChanged(vtkMRMLNode*)",
                               self.updateMRMLFromGUI)
            elif widgetClassName == "QButtonGroup":
                widget.connect("buttonClicked(int)", self.updateMRMLFromGUI)
            elif widgetClassName == "qMRMLSegmentSelectorWidget":
                widget.connect("currentSegmentChanged(QString)",
                               self.updateMRMLFromGUI)
            else:
                raise Exception(
                    "Unexpected widget class: {0}".format(widgetClassName))

        self.ui.applyButton.connect('clicked()', self.onApply)
コード例 #12
0
ファイル: QReads.py プロジェクト: Lxw06/SlicerQReads
    def setup(self):
        """
    Called when the user opens the module the first time and the widget is initialized.
    """
        ScriptedLoadableModuleWidget.setup(self)

        # Load widget from .ui file (created by Qt Designer).
        # Additional widgets can be instantiated manually and added to self.layout.
        uiWidget = slicer.util.loadUI(self.resourcePath('UI/QReads.ui'))
        self.layout.addWidget(uiWidget)
        self.ui = slicer.util.childWidgetVariables(uiWidget)
        self.slabModeButtonGroup = qt.QButtonGroup()
        self.slabModeButtonGroup.addButton(self.ui.SlabModeMaxRadioButton,
                                           vtk.VTK_IMAGE_SLAB_MAX)
        self.slabModeButtonGroup.addButton(self.ui.SlabModeMeanRadioButton,
                                           vtk.VTK_IMAGE_SLAB_MEAN)
        self.slabModeButtonGroup.addButton(self.ui.SlabModeMinRadioButton,
                                           vtk.VTK_IMAGE_SLAB_MIN)
        self.ui.ZoomComboBox.addItems(self.ZOOM_ACTIONS)

        # Set scene in MRML widgets. Make sure that in Qt designer the top-level qMRMLWidget's
        # "mrmlSceneChanged(vtkMRMLScene*)" signal in is connected to each MRML widget's.
        # "setMRMLScene(vtkMRMLScene*)" slot.
        #uiWidget.setMRMLScene(slicer.mrmlScene)

        # Create logic class. Logic implements all computations that should be possible to run
        # in batch mode, without a graphical user interface.
        self.logic = QReadsLogic()

        # Connections

        # These connections ensure that we update parameter node when scene is closed
        self.addObserver(slicer.mrmlScene, slicer.mrmlScene.StartCloseEvent,
                         self.onSceneStartClose)
        self.addObserver(slicer.mrmlScene, slicer.mrmlScene.EndCloseEvent,
                         self.onSceneEndClose)
        self.addObserver(slicer.mrmlScene, slicer.mrmlScene.NodeAddedEvent,
                         self.onNodeAdded)

        # These connections ensure that whenever user changes some settings on the GUI, that is saved in the MRML scene
        # (in the selected parameter node).
        self.ui.ShowReferenceMarkersButton.connect(
            "clicked()", self.updateParameterNodeFromGUI)
        self.ui.ResetReferenceMarkersButton.connect(
            "clicked()", QReadsLogic.resetReferenceMarkers)
        self.ui.SlabButton.connect("clicked()",
                                   self.updateParameterNodeFromGUI)
        self.slabModeButtonGroup.connect("buttonClicked(int)",
                                         self.updateParameterNodeFromGUI)
        self.ui.SlabThicknessSliderWidget.connect(
            "valueChanged(double)", self.updateParameterNodeFromGUI)
        self.ui.InverseGrayButton.connect("clicked(bool)",
                                          self.updateParameterNodeFromGUI)

        # Increasing the level will make the image darker, whereas decreasing the level value will make the image brighter
        self.ui.BrightnessUpButton.connect(
            "clicked()",
            lambda step=-self.BRIGHTNESS_STEP: QReadsLogic.updateWindowLevel(
                levelStep=step))
        self.ui.BrightnessDownButton.connect(
            "clicked()",
            lambda step=self.BRIGHTNESS_STEP: QReadsLogic.updateWindowLevel(
                levelStep=step))

        # Increasing window will reduce display contrast, whereas decreasing the window increases the brightness
        self.ui.ContrastUpButton.connect(
            "clicked()",
            lambda step=-self.CONTRAST_STEP: QReadsLogic.updateWindowLevel(
                windowStep=step))
        self.ui.ContrastDownButton.connect(
            "clicked()",
            lambda step=self.CONTRAST_STEP: QReadsLogic.updateWindowLevel(
                windowStep=step))

        self.ui.CTBodySoftTissueWLPresetButton.connect(
            "clicked()",
            lambda presetName="CT-BodySoftTissue": self.logic.
            setWindowLevelPreset(presetName))
        self.ui.CTBoneWLPresetButton.connect(
            "clicked()",
            lambda presetName="CT-Bone": self.logic.setWindowLevelPreset(
                presetName))
        self.ui.CTBrainWLPresetButton.connect(
            "clicked()",
            lambda presetName="CT-Head": self.logic.setWindowLevelPreset(
                presetName))
        self.ui.CTLungWLPresetButton.connect(
            "clicked()",
            lambda presetName="CT-Lung": self.logic.setWindowLevelPreset(
                presetName))

        self.ui.ZoomComboBox.connect("currentTextChanged(QString)",
                                     self.updateParameterNodeFromGUI)

        self.ui.CloseApplicationPushButton.connect("clicked()",
                                                   slicer.util.quit)

        # Make sure parameter node is initialized (needed for module reload)
        self.initializeParameterNode()

        # Hide main window components
        slicer.util.setApplicationLogoVisible(False)
        slicer.util.setMenuBarsVisible(False)
        slicer.util.setModuleHelpSectionVisible(False)
        slicer.util.setModulePanelTitleVisible(False)
        slicer.util.setToolbarsVisible(False)

        # Layout
        slicer.app.layoutManager().setLayout(self.logic.registerCustomLayout())

        for viewName, viewColor in QReadsLogic.SLICEVIEW_BACKGROUND_COLORS.items(
        ):
            sliceWidget = slicer.app.layoutManager().sliceWidget(viewName)
            sliceWidget.sliceView().setBackgroundColor(qt.QColor(viewColor))
            sliceNode = sliceWidget.mrmlSliceNode()
            sliceNode.SetOrientationMarkerType(
                slicer.vtkMRMLAbstractViewNode.OrientationMarkerTypeAxes)
            sliceNode.SetSliceVisible(True)

        for viewName, viewColor in QReadsLogic.THREEDVIEW_BACKGROUND_COLORS.items(
        ):
            with NodeModify(slicer.util.getNode("vtkMRMLViewNode%s" %
                                                viewName)) as viewNode:
                viewNode.SetBackgroundColor(0., 0., 0.)
                viewNode.SetBackgroundColor2(0., 0., 0.)
                viewNode.SetBoxVisible(False)
                viewNode.SetAxisLabelsVisible(False)
                viewNode.SetOrientationMarkerType(
                    slicer.vtkMRMLAbstractViewNode.OrientationMarkerTypeAxes)
コード例 #13
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        self.caseInfoCollapsibleButton = ctk.ctkCollapsibleButton()
        self.caseInfoCollapsibleButton.text = "Case information"
        self.caseInfoCollapsibleButton.collapsed = False
        self.layout.addWidget(self.caseInfoCollapsibleButton)
        self.caseAreaLayout = qt.QGridLayout(self.caseInfoCollapsibleButton)
        # Select case
        row = 0
        self.loadCaseButton = ctk.ctkPushButton()
        self.loadCaseButton.text = "Load case"
        self.loadCaseButton.toolTip = "Load a case folder"
        self.caseAreaLayout.addWidget(self.loadCaseButton, row, 0)

        # Reset button
        self.resetButton = ctk.ctkPushButton()
        self.resetButton.text = "Close case"
        self.resetButton.toolTip = "Close the current case"
        self.caseAreaLayout.addWidget(self.resetButton, row, 1)

        # Case info
        row += 1
        self.caseInfoFrame = qt.QFrame()
        self.caseInfoFrame.setFrameStyle(0x0002 | 0x0010)
        self.caseInfoFrame.lineWidth = 2
        self.caseInfoFrame.setStyleSheet(
            "background-color: #EEEEEE; margin: 10px")
        self.caseAreaLayout.addWidget(self.caseInfoFrame, row, 0, 1, 2)

        self.caseInfoFrameLayout = qt.QGridLayout()
        self.caseInfoFrame.setLayout(self.caseInfoFrameLayout)

        self.caseIdLabel = qt.QLabel("Case id: ")
        self.caseIdLabel.setStyleSheet("font-weight: bold")
        self.caseInfoFrameLayout.addWidget(self.caseIdLabel, 0, 0)

        self.showEnhancementCheckboxGroup = qt.QButtonGroup()
        self.showJustOriginalButton = qt.QRadioButton("Original only")
        self.showJustOriginalButton.setChecked(True)
        self.showEnhancementCheckboxGroup.addButton(
            self.showJustOriginalButton, 0)
        self.caseInfoFrameLayout.addWidget(self.showJustOriginalButton, 1, 0)

        self.showOriginalPlusEnhancedButton = qt.QRadioButton(
            "Original and enhanced")
        self.showEnhancementCheckboxGroup.addButton(
            self.showOriginalPlusEnhancedButton, 1)
        self.caseInfoFrameLayout.addWidget(self.showOriginalPlusEnhancedButton,
                                           2, 0)

        self.showJustEnhancedButton = qt.QRadioButton("Enhanced only")
        self.showEnhancementCheckboxGroup.addButton(
            self.showJustEnhancedButton, 2)
        self.caseInfoFrameLayout.addWidget(self.showJustEnhancedButton, 3, 0)

        # Center Volumes button
        self.centerVolumesButton = ctk.ctkPushButton()
        self.centerVolumesButton.text = "Center image/s"
        self.centerVolumesButton.toolTip = "Center all the current visible images"
        self.centerVolumesButton.setFixedWidth(200)
        # self.centerVolumesButton.toolTip = "Load a case folder"
        self.caseInfoFrameLayout.addWidget(self.centerVolumesButton, 4, 0)

        # Enhancement fine tuning
        self.vascularFactorLabel = qt.QLabel("Vascular factor")
        self.vascularFactorLabel.setStyleSheet("font-weight: bold")
        self.caseInfoFrameLayout.addWidget(self.vascularFactorLabel, 0, 1)
        self.vascularFactorSlider = qt.QSlider()
        self.vascularFactorSlider.orientation = 2  # Vertical
        self.vascularFactorSlider.value = 5
        self.vascularFactorSlider.minimum = 0
        self.vascularFactorSlider.maximum = 10
        # self.vascularFactorSlider.setStyleSheet("margin-top:10px;padding-top:20px")
        # self.vascularFactorSlider.setToolTip("Move the slider for a fine tuning segmentation")
        self.caseInfoFrameLayout.addWidget(self.vascularFactorSlider, 1, 1, 4,
                                           1, 0x0004)

        self.enhancementFactorLabel = qt.QLabel("Enhancement factor")
        self.enhancementFactorLabel.setStyleSheet("font-weight: bold")
        self.caseInfoFrameLayout.addWidget(self.enhancementFactorLabel, 0, 2)
        self.enhancementFactorSlider = qt.QSlider()
        self.enhancementFactorSlider.orientation = 2  # Vertical
        self.enhancementFactorSlider.minimum = 0
        self.enhancementFactorSlider.maximum = 10
        self.enhancementFactorSlider.value = 5
        # self.vascularFactorSlider.setStyleSheet("margin-top:10px;padding-top:20px")
        # self.vascularFactorSlider.setToolTip("Move the slider for a fine tuning segmentation")
        self.caseInfoFrameLayout.addWidget(self.enhancementFactorSlider, 1, 2,
                                           4, 1, 0x0004)

        # Editor
        row += 1
        self.editorWidget = ui.CustomEditorWidget(self.parent)
        self.editorWidget.setup()
        self.editorCollapsibleButton = self.editorWidget.editLabelMapsFrame
        self.editorCollapsibleButton.text = "Edit the current eye image"
        self.editorCollapsibleButton.collapsed = False
        self.editorWidget.toolsColor.terminologyCollapsibleButton.setVisible(
            False)
        self.layout.addWidget(self.editorCollapsibleButton)

        ### DIAGNOSIS
        self.diagnosisCollapsibleButton = ctk.ctkCollapsibleButton()
        self.diagnosisCollapsibleButton.text = "Diagnosis"
        self.diagnosisCollapsibleButton.collapsed = False
        self.layout.addWidget(self.diagnosisCollapsibleButton)
        self.diagnosisAreaLayout = qt.QVBoxLayout(
            self.diagnosisCollapsibleButton)

        # Visual Acuity
        label = qt.QLabel("Visual acuity (VA): ")
        label.setStyleSheet("margin: 10px 0 0 10px; font-weight: bold")
        self.diagnosisAreaLayout.addWidget(label)
        self.vaFrame = qt.QFrame()
        self.vaFrame.setFrameStyle(0x0002 | 0x0010)
        self.vaFrame.lineWidth = 2
        self.vaFrame.setStyleSheet("background-color: #EEEEEE; margin: 10px")
        self.vaFrame.setFixedWidth(240)
        self.diagnosisAreaLayout.addWidget(self.vaFrame)

        self.vaFrameLayout = qt.QGridLayout(self.vaFrame)
        self.vaFrameLayout.addWidget(qt.QLabel("OS"), 0, 0)
        self.osLineEdit = qt.QLineEdit()
        self.osLineEdit.setFixedWidth(80)
        self.osLineEdit.setStyleSheet("background-color: white")
        self.vaFrameLayout.addWidget(self.osLineEdit, 0, 1)

        self.vaFrameLayout.addWidget(qt.QLabel("OD"), 1, 0)
        self.odLineEdit = qt.QLineEdit()
        self.odLineEdit.setFixedWidth(80)
        self.odLineEdit.setStyleSheet("background-color: white")
        self.vaFrameLayout.addWidget(self.odLineEdit, 1, 1)

        self.vaModalityButtonGroup = qt.QButtonGroup()
        self.scvaRadioButton = qt.QRadioButton()
        self.scvaRadioButton.setText("SCVA")
        self.vaFrameLayout.addWidget(self.scvaRadioButton, 0, 2)
        self.vaModalityButtonGroup.addButton(self.scvaRadioButton)

        self.bcvaRadioButton = qt.QRadioButton()
        self.bcvaRadioButton.setText("BCVA")
        self.vaFrameLayout.addWidget(self.bcvaRadioButton, 1, 2)
        self.vaModalityButtonGroup.addButton(self.bcvaRadioButton)

        self.ucvaRadioButton = qt.QRadioButton()
        self.ucvaRadioButton.setText("UCVA")
        self.vaFrameLayout.addWidget(self.ucvaRadioButton, 2, 2)
        self.vaModalityButtonGroup.addButton(self.ucvaRadioButton)

        # Problems detected
        label = qt.QLabel("Problems detected: ")
        label.setStyleSheet("margin: 10px 0 0 10px; font-weight: bold")
        self.diagnosisAreaLayout.addWidget(label)

        self.problemsFrame = qt.QFrame()
        self.problemsFrame.setFrameStyle(0x0002 | 0x0010)
        self.problemsFrame.lineWidth = 2
        self.problemsFrame.setStyleSheet(
            "background-color: #EEEEEE; margin: 10px")
        self.diagnosisAreaLayout.addWidget(self.problemsFrame)

        self.problemsFrameLayout = qt.QGridLayout()
        self.problemsFrame.setLayout(self.problemsFrameLayout)
        self.problemsButtons = []

        self.microaneurysmsCheckbox = qt.QCheckBox()
        self.microaneurysmsCheckbox.setText("Microaneurysms")
        self.problemsFrameLayout.addWidget(self.microaneurysmsCheckbox, 0, 0)
        self.problemsButtons.append(self.microaneurysmsCheckbox)

        self.exudatesCheckbox = qt.QCheckBox()
        self.exudatesCheckbox.setText("Exudates")
        self.problemsFrameLayout.addWidget(self.exudatesCheckbox, 0, 1)
        self.problemsButtons.append(self.exudatesCheckbox)

        self.haemorrhagesCheckbox = qt.QCheckBox()
        self.haemorrhagesCheckbox.setText("Haemorrhages")
        self.problemsFrameLayout.addWidget(self.haemorrhagesCheckbox, 0, 2)
        self.problemsButtons.append(self.haemorrhagesCheckbox)

        self.cottonWoolSpotsCheckbox = qt.QCheckBox()
        self.cottonWoolSpotsCheckbox.setText("Cotton wool spots")
        self.problemsFrameLayout.addWidget(self.cottonWoolSpotsCheckbox, 1, 0)
        self.problemsButtons.append(self.cottonWoolSpotsCheckbox)

        self.NeovascularisationCheckbox = qt.QCheckBox()
        self.NeovascularisationCheckbox.setText("Neovascularisation")
        self.problemsFrameLayout.addWidget(self.NeovascularisationCheckbox, 1,
                                           1)
        self.problemsButtons.append(self.NeovascularisationCheckbox)

        label = qt.QLabel("Diabetic retinopathy diagnosis: ")
        label.setStyleSheet("margin: 10px 0 0 10px; font-weight: bold")
        self.diagnosisAreaLayout.addWidget(label)

        # Diabetic Retinopathy diagnosis
        self.diabeticRetinopathyDiagnosisFrame = qt.QFrame()
        self.diabeticRetinopathyDiagnosisFrame.setFrameStyle(0x0002 | 0x0010)
        self.diabeticRetinopathyDiagnosisFrame.lineWidth = 2
        self.diabeticRetinopathyDiagnosisFrame.setStyleSheet(
            "background-color: #EEEEEE; margin: 10px")
        self.diagnosisAreaLayout.addWidget(
            self.diabeticRetinopathyDiagnosisFrame)

        self.diabeticRetinopathyDiagnosisFrameLayout = qt.QHBoxLayout()
        self.diabeticRetinopathyDiagnosisFrame.setLayout(
            self.diabeticRetinopathyDiagnosisFrameLayout)

        self.diagnosisRadioButtonGroup = qt.QButtonGroup()
        for i in range(5):
            rb = qt.QRadioButton(str(i))
            self.diagnosisRadioButtonGroup.addButton(rb, i)
            self.diabeticRetinopathyDiagnosisFrameLayout.addWidget(rb)
        self.diagnosisRadioButtonGroup.buttons()[0].setChecked(True)

        # Additional comments
        label = qt.QLabel("Additional comments:")
        label.setStyleSheet("margin: 10px 0 0 10px; font-weight: bold")
        self.diagnosisAreaLayout.addWidget(label)
        row += 1

        self.additionalCommentsText = qt.QTextEdit()
        self.additionalCommentsText.setStyleSheet("margin: 10px")
        self.diagnosisAreaLayout.addWidget(self.additionalCommentsText)

        self.saveReportButton = ctk.ctkPushButton()
        self.saveReportButton.text = "Save report"
        self.saveReportButton.setFixedWidth(300)
        self.diagnosisAreaLayout.addWidget(self.saveReportButton)

        self.printReportButton = ctk.ctkPushButton()
        self.printReportButton.text = "Save and generate PDF"
        self.printReportButton.setFixedWidth(300)
        self.diagnosisAreaLayout.addWidget(self.printReportButton)

        self.expertModeCollapsibleButton = ctk.ctkCollapsibleButton()
        self.expertModeCollapsibleButton.text = "Expert mode"
        self.expertModeCollapsibleButton.collapsed = True
        self.layout.addWidget(self.expertModeCollapsibleButton)
        self.expertModeLayout = qt.QVBoxLayout(
            self.expertModeCollapsibleButton)
        self.expertModeCheckbox = qt.QCheckBox("Activate expert mode")
        self.expertModeCheckbox.checked = False
        self.expertModeLayout.addWidget(self.expertModeCheckbox)
        self.layout.addStretch(1)

        # Connections
        self.loadCaseButton.connect('clicked()', self.__onLoadCaseClicked__)
        # self.loadReportButton.connect('clicked()', self.__onLoadReportClicked__)
        self.showEnhancementCheckboxGroup.connect(
            "buttonClicked (int)", self.__onEnhancementButtonGroupClicked__)
        self.centerVolumesButton.connect('clicked()',
                                         SlicerUtil.centerAllVolumes)
        self.vascularFactorSlider.connect('sliderReleased()',
                                          self.__onEnhancementFineTuning__)
        self.enhancementFactorSlider.connect('sliderReleased()',
                                             self.__onEnhancementFineTuning__)
        self.saveReportButton.connect('clicked()',
                                      self.__onSaveReportClicked__)
        self.printReportButton.connect('clicked()',
                                       self.__onPrintReportClicked__)
        self.resetButton.connect('clicked()', self.reset)
        self.expertModeCheckbox.connect("stateChanged(int)",
                                        self.__onExpertModeStateChanged__)
        slicer.mrmlScene.AddObserver(slicer.vtkMRMLScene.EndCloseEvent,
                                     self.__onSceneClosed__)

        # Set default layout Red
        SlicerUtil.changeLayoutRedSingle()

        self.refreshUI()
コード例 #14
0
ファイル: CIP_PAARatio.py プロジェクト: yangyunbing/SlicerCIP
    def setup(self):
        """This is called one time when the module GUI is initialized
        """
        ScriptedLoadableModuleWidget.setup(self)

        # Create objects that can be used anywhere in the module. Example: in most cases there should be just one
        # object of the logic class
        self.logic = CIP_PAARatioLogic()

        #
        # Create all the widgets. Example Area
        mainAreaCollapsibleButton = ctk.ctkCollapsibleButton()
        mainAreaCollapsibleButton.text = "Main parameters"
        self.layout.addWidget(mainAreaCollapsibleButton)
        self.mainAreaLayout = qt.QGridLayout(mainAreaCollapsibleButton)

        self.label = qt.QLabel("Select the volume")
        self.label.setStyleSheet("margin:10px 0 20px 7px")
        self.mainAreaLayout.addWidget(self.label, 0, 0)

        self.volumeSelector = slicer.qMRMLNodeComboBox()
        self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "")
        self.volumeSelector.name = "paa_volumeSelector"
        self.volumeSelector.selectNodeUponCreation = True
        self.volumeSelector.autoFillBackground = True
        self.volumeSelector.addEnabled = True
        self.volumeSelector.noneEnabled = False
        self.volumeSelector.removeEnabled = False
        self.volumeSelector.showHidden = False
        self.volumeSelector.showChildNodeTypes = False
        self.volumeSelector.setMRMLScene(slicer.mrmlScene)
        self.volumeSelector.setStyleSheet(
            "margin:0px 0 0px 0; padding:2px 0 2px 5px")
        self.mainAreaLayout.addWidget(self.volumeSelector, 0, 1)

        self.jumptToTemptativeSliceButton = ctk.ctkPushButton()
        self.jumptToTemptativeSliceButton.name = "jumptToTemptativeSliceButton"
        self.jumptToTemptativeSliceButton.text = "Jump to temptative slice"
        self.jumptToTemptativeSliceButton.toolTip = "Jump to the best estimated slice to place the rulers"
        self.jumptToTemptativeSliceButton.setIcon(
            qt.QIcon("{0}/ruler.png".format(SlicerUtil.CIP_ICON_DIR)))
        self.jumptToTemptativeSliceButton.setIconSize(qt.QSize(20, 20))
        self.jumptToTemptativeSliceButton.setStyleSheet("font-weight: bold;")
        # self.jumptToTemptativeSliceButton.setFixedWidth(140)
        self.mainAreaLayout.addWidget(self.jumptToTemptativeSliceButton, 1, 1)

        ### Structure Selector
        self.structuresGroupbox = qt.QGroupBox("Select the structure")
        self.groupboxLayout = qt.QVBoxLayout()
        self.structuresGroupbox.setLayout(self.groupboxLayout)
        self.mainAreaLayout.addWidget(self.structuresGroupbox, 2, 0)

        self.structuresButtonGroup = qt.QButtonGroup()
        # btn = qt.QRadioButton("None")
        # btn.visible = False
        # self.structuresButtonGroup.addButton(btn)
        # self.groupboxLayout.addWidget(btn)

        btn = qt.QRadioButton("Both")
        btn.name = "paaButton"
        btn.checked = True

        self.structuresButtonGroup.addButton(btn, 0)
        self.groupboxLayout.addWidget(btn)

        btn = qt.QRadioButton("Pulmonary Arterial")
        btn.name = "paRadioButton"
        self.structuresButtonGroup.addButton(btn, 1)
        self.groupboxLayout.addWidget(btn)

        btn = qt.QRadioButton("Aorta")
        btn.name = "aortaRadioButton"
        self.structuresButtonGroup.addButton(btn, 2)
        self.groupboxLayout.addWidget(btn)

        ### Buttons toolbox
        self.buttonsToolboxFrame = qt.QFrame()
        self.buttonsToolboxLayout = qt.QGridLayout()
        self.buttonsToolboxFrame.setLayout(self.buttonsToolboxLayout)
        self.mainAreaLayout.addWidget(self.buttonsToolboxFrame, 2, 1)

        self.placeRulersButton = ctk.ctkPushButton()
        self.placeRulersButton.text = "Place ruler/s"
        self.placeRulersButton.name = "placeRulersButton"
        self.placeRulersButton.toolTip = "Place the ruler/s for the selected structure/s in the current slice"
        self.placeRulersButton.setIcon(
            qt.QIcon("{0}/ruler.png".format(SlicerUtil.CIP_ICON_DIR)))
        self.placeRulersButton.setIconSize(qt.QSize(20, 20))
        self.placeRulersButton.setFixedWidth(105)
        self.placeRulersButton.setStyleSheet("font-weight:bold")
        self.buttonsToolboxLayout.addWidget(self.placeRulersButton, 0, 0)

        self.moveUpButton = ctk.ctkPushButton()
        self.moveUpButton.text = "Move up"
        self.moveUpButton.toolTip = "Move the selected ruler/s one slice up"
        self.moveUpButton.setIcon(
            qt.QIcon("{0}/move_up.png".format(SlicerUtil.CIP_ICON_DIR)))
        self.moveUpButton.setIconSize(qt.QSize(20, 20))
        self.moveUpButton.setFixedWidth(95)
        self.buttonsToolboxLayout.addWidget(self.moveUpButton, 0, 1)

        self.moveDownButton = ctk.ctkPushButton()
        self.moveDownButton.text = "Move down"
        self.moveDownButton.toolTip = "Move the selected ruler/s one slice down"
        self.moveDownButton.setIcon(
            qt.QIcon("{0}/move_down.png".format(SlicerUtil.CIP_ICON_DIR)))
        self.moveDownButton.setIconSize(qt.QSize(20, 20))
        self.moveDownButton.setFixedWidth(95)
        self.buttonsToolboxLayout.addWidget(self.moveDownButton, 0, 2)

        self.removeButton = ctk.ctkPushButton()
        self.removeButton.text = "Remove ALL rulers"
        self.removeButton.toolTip = "Remove all the rulers for this volume"
        self.removeButton.setIcon(
            qt.QIcon("{0}/delete.png".format(SlicerUtil.CIP_ICON_DIR)))
        self.removeButton.setIconSize(qt.QSize(20, 20))
        self.buttonsToolboxLayout.addWidget(self.removeButton, 1, 1, 1, 2, 2)

        ### Textboxes
        self.textboxesFrame = qt.QFrame()
        self.textboxesLayout = qt.QFormLayout()
        self.textboxesFrame.setLayout(self.textboxesLayout)
        self.textboxesFrame.setFixedWidth(190)
        self.mainAreaLayout.addWidget(self.textboxesFrame, 3, 0)

        self.paTextBox = qt.QLineEdit()
        self.paTextBox.setReadOnly(True)
        self.textboxesLayout.addRow("PA (mm):  ", self.paTextBox)

        self.aortaTextBox = qt.QLineEdit()
        self.aortaTextBox.setReadOnly(True)
        self.textboxesLayout.addRow("Aorta (mm):  ", self.aortaTextBox)

        self.ratioTextBox = qt.QLineEdit()
        self.ratioTextBox.name = "ratioTextBox"
        self.ratioTextBox.setReadOnly(True)
        self.textboxesLayout.addRow("Ratio PA/A: ", self.ratioTextBox)

        # Save case data
        self.reportsCollapsibleButton = ctk.ctkCollapsibleButton()
        self.reportsCollapsibleButton.text = "Reporting"
        self.layout.addWidget(self.reportsCollapsibleButton)
        self.reportsLayout = qt.QHBoxLayout(self.reportsCollapsibleButton)

        self.storedColumnNames = [
            "caseId", "paDiameterMm", "aortaDiameterMm", "pa1r", "pa1a",
            "pa1s", "pa2r", "pa2a", "pa2s", "a1r", "a1a", "a1s", "a2r", "a2a",
            "a2s"
        ]
        columns = CaseReportsWidget.getColumnKeysNormalizedDictionary(
            self.storedColumnNames)
        self.reportsWidget = CaseReportsWidget(
            self.moduleName,
            columns,
            parentWidget=self.reportsCollapsibleButton)
        self.reportsWidget.setup()

        # Init state
        self.resetModuleState()

        self.preventSavingState = False
        self.saveStateBeforeEnteringModule()
        self.preventSavingState = True

        self.switchToRedView()

        #####
        # Case navigator
        if SlicerUtil.isSlicerACILLoaded():
            caseNavigatorAreaCollapsibleButton = ctk.ctkCollapsibleButton()
            caseNavigatorAreaCollapsibleButton.text = "Case navigator"
            self.layout.addWidget(caseNavigatorAreaCollapsibleButton, 0x0020)
            # caseNavigatorLayout = qt.QVBoxLayout(caseNavigatorAreaCollapsibleButton)

            # Add a case list navigator
            from ACIL.ui import CaseNavigatorWidget
            self.caseNavigatorWidget = CaseNavigatorWidget(
                self.moduleName, caseNavigatorAreaCollapsibleButton)
            self.caseNavigatorWidget.setup()

        self.layout.addStretch()

        # Connections
        self.observers = []

        self.volumeSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                    self.onVolumeSelectorChanged)
        self.jumptToTemptativeSliceButton.connect(
            'clicked()', self.onJumpToTemptativeSliceButtonClicked)
        self.placeRulersButton.connect('clicked()', self.onPlaceRulersClicked)
        self.moveUpButton.connect('clicked()', self.onMoveUpRulerClicked)
        self.moveDownButton.connect('clicked()', self.onMoveDownRulerClicked)
        self.removeButton.connect('clicked()', self.onRemoveRulerClicked)

        self.reportsWidget.addObservable(
            self.reportsWidget.EVENT_SAVE_BUTTON_CLICKED, self.onSaveReport)

        # Init state
        self.resetModuleState()

        self.preventSavingState = False
        self.saveStateBeforeEnteringModule()
        self.preventSavingState = True
コード例 #15
0
    def setup(self):
        """Init the widget """
        # self.firstLoad = True
        ScriptedLoadableModuleWidget.setup(self)

        # Create objects that can be used anywhere in the module. Example: in most cases there should be just one
        # object of the logic class
        self._initLogic_()

        ##########
        # Main area
        self.mainAreaCollapsibleButton = ctk.ctkCollapsibleButton()
        self.mainAreaCollapsibleButton.text = "Main area"
        self.layout.addWidget(self.mainAreaCollapsibleButton,
                              SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.mainLayout = qt.QGridLayout(self.mainAreaCollapsibleButton)

        # Node selector
        volumeLabel = qt.QLabel("Active volume: ")
        volumeLabel.setStyleSheet("margin-left:5px")
        self.mainLayout.addWidget(volumeLabel, 0, 0)
        self.volumeSelector = slicer.qMRMLNodeComboBox()
        self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "")
        self.volumeSelector.selectNodeUponCreation = True
        self.volumeSelector.autoFillBackground = True
        self.volumeSelector.addEnabled = False
        self.volumeSelector.noneEnabled = False
        self.volumeSelector.removeEnabled = False
        self.volumeSelector.showHidden = False
        self.volumeSelector.showChildNodeTypes = False
        self.volumeSelector.setMRMLScene(slicer.mrmlScene)
        self.volumeSelector.setMinimumWidth(150)
        self.volumeSelector.setStyleSheet("margin: 15px 0")
        # self.volumeSelector.selectNodeUponCreation = False
        self.mainLayout.addWidget(self.volumeSelector, 0, 1, 1, 2)
        self.volumeSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                    self._onMainVolumeChanged_)

        ### Radio buttons frame
        self.radioButtonsFrame = qt.QFrame()
        self.radioButtonsLayout = qt.QHBoxLayout(self.radioButtonsFrame)
        self.typesFrame = qt.QFrame()
        self.radioButtonsLayout.addWidget(self.typesFrame)
        self.typesLayout = qt.QVBoxLayout(self.typesFrame)

        labelsStyle = "font-weight: bold; margin: 0 0 10px 0px;"
        # Types Radio Buttons
        typesLabel = qt.QLabel("Select type")
        typesLabel.setStyleSheet(labelsStyle)
        self.typesLayout.addWidget(typesLabel)
        self.typesRadioButtonGroup = qt.QButtonGroup()
        for key in self.logic.params.mainTypes.keys():
            rbitem = qt.QRadioButton(self.logic.params.getMainTypeLabel(key))
            self.typesRadioButtonGroup.addButton(rbitem, key)
            self.typesLayout.addWidget(rbitem)
        self.typesRadioButtonGroup.buttons()[0].setChecked(True)

        # Subtypes Radio buttons
        # The content will be loaded dynamically every time the main type is modified
        self.subtypesFrame = qt.QFrame()
        self.radioButtonsLayout.addWidget(self.subtypesFrame)
        self.subtypesLayout = qt.QVBoxLayout(self.subtypesFrame)
        subtypesLabel = qt.QLabel("Select subtype")
        subtypesLabel.setStyleSheet(labelsStyle)
        self.subtypesLayout.addWidget(subtypesLabel)
        self.subtypesLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.subtypesRadioButtonGroup = qt.QButtonGroup()
        # Add all the subtypes (we will filter later in "updateState" function)
        for key in self.logic.params.subtypes.keys():
            # Build the description
            rbitem = qt.QRadioButton(self.logic.params.getSubtypeLabel(key))
            self.subtypesRadioButtonGroup.addButton(rbitem, key)
            self.subtypesLayout.addWidget(rbitem,
                                          SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.subtypesLayout.addStretch()

        # Region radio buttons
        self.regionsFrame = qt.QFrame()
        self.radioButtonsLayout.addWidget(self.regionsFrame)
        self.regionsLayout = qt.QVBoxLayout(self.regionsFrame)
        regionsLabel = qt.QLabel("Select region")
        regionsLabel.setStyleSheet(labelsStyle)
        self.regionsLayout.addWidget(regionsLabel)
        self.regionsLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.regionsLayout.setStretch(0, 0)
        self.regionsRadioButtonGroup = qt.QButtonGroup()
        self.regionsFrame = qt.QFrame()
        # Add all the regions
        for key in self.logic.params.regions.keys():
            # Build the description
            rbitem = qt.QRadioButton(self.logic.params.getRegionLabel(key))
            self.regionsRadioButtonGroup.addButton(rbitem, key)
            self.regionsLayout.addWidget(rbitem,
                                         SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.regionsLayout.addStretch()
        self.regionsRadioButtonGroup.buttons()[0].setChecked(True)

        # Artifact radio buttons (Add them to the same layout as the type)
        # self.separatorLabel = qt.QLabel("------------")
        # labelsStyle = "margin: 5px 0 5px 0;"
        # self.separatorLabel.setStyleSheet(labelsStyle)
        # self.typesLayout.addWidget(self.separatorLabel)
        # self.artifactsLabel = qt.QLabel("Select artifact")
        # labelsStyle = "font-weight: bold; margin: 15px 0 10px 0;"
        # self.artifactsLabel.setStyleSheet(labelsStyle)
        # self.typesLayout.addWidget(self.artifactsLabel)
        # self.artifactsRadioButtonGroup = qt.QButtonGroup()
        # for artifactId in self.logic.params.artifacts.iterkeys():
        #     rbitem = qt.QRadioButton(self.logic.params.getArtifactLabel(artifactId))
        #     self.artifactsRadioButtonGroup.addButton(rbitem, artifactId)
        #     self.typesLayout.addWidget(rbitem)
        # self.artifactsRadioButtonGroup.buttons()[0].setChecked(True)
        #
        self.typesLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.typesLayout.addStretch()

        # Connections
        self.typesRadioButtonGroup.connect("buttonClicked (QAbstractButton*)",
                                           self.__onTypesRadioButtonClicked__)
        self.subtypesRadioButtonGroup.connect(
            "buttonClicked (QAbstractButton*)",
            self.__onSecondaryRadioButtonClicked__)
        self.regionsRadioButtonGroup.connect(
            "buttonClicked (QAbstractButton*)",
            self.__onSecondaryRadioButtonClicked__)
        # self.artifactsRadioButtonGroup.connect("buttonClicked (QAbstractButton*)", self.__onTypesRadioButtonClicked__)

        self.mainLayout.addWidget(self.radioButtonsFrame, 2, 0, 1, 3,
                                  SlicerUtil.ALIGNMENT_VERTICAL_TOP)

        # Save results button
        self.saveResultsButton = ctk.ctkPushButton()
        self.saveResultsButton.setText("Save results")
        self.saveResultsButton.toolTip = "Save the results labelmap in the specified directory"
        self.saveResultsButton.setIcon(
            qt.QIcon("{0}/Save.png".format(SlicerUtil.CIP_ICON_DIR)))
        self.saveResultsButton.setIconSize(qt.QSize(20, 20))
        self.saveResultsButton.setFixedWidth(135)
        self.mainLayout.addWidget(self.saveResultsButton, 4, 0)
        self.saveResultsButton.connect('clicked()',
                                       self._onSaveResultsButtonClicked_)

        # Save results directory button
        defaultPath = os.path.join(
            SlicerUtil.getSettingsDataFolder(self.moduleName),
            "results")  # Assign a default path for the results
        path = SlicerUtil.settingGetOrSetDefault(self.moduleName,
                                                 "SaveResultsDirectory",
                                                 defaultPath)
        self.saveResultsDirectoryButton = ctk.ctkDirectoryButton()
        self.saveResultsDirectoryButton.directory = path
        self.saveResultsDirectoryButton.setMaximumWidth(440)
        self.mainLayout.addWidget(self.saveResultsDirectoryButton, 4, 1, 1, 2)
        self.saveResultsDirectoryButton.connect(
            "directoryChanged (QString)", self._onSaveResultsDirectoryChanged_)

        self._createSegmentEditorWidget_()

        # MIP viewer (by default it will be hidden)
        self.mipCollapsibleButton = ctk.ctkCollapsibleButton()
        self.mipCollapsibleButton.text = "MIP viewer"
        mipLayout = qt.QVBoxLayout(self.mipCollapsibleButton)
        self.mainLayout.addWidget(self.mipCollapsibleButton)
        self.mipViewer = CIPUI.MIPViewerWidget(mipLayout)
        self.mipCollapsibleButton.setVisible(False)
        self.mipViewer.setup()
        self.mipViewer.isCrosshairEnabled = False
        self.mipCollapsibleButton.collapsed = True

        #####
        # Case navigator
        self.caseNavigatorWidget = None
        if SlicerUtil.isSlicerACILLoaded():
            caseNavigatorAreaCollapsibleButton = ctk.ctkCollapsibleButton()
            caseNavigatorAreaCollapsibleButton.text = "Case navigator"
            self.layout.addWidget(caseNavigatorAreaCollapsibleButton, 0x0020)
            # caseNavigatorLayout = qt.QVBoxLayout(caseNavigatorAreaCollapsibleButton)

            # Add a case list navigator
            from ACIL.ui import CaseNavigatorWidget
            self.caseNavigatorWidget = CaseNavigatorWidget(
                self.moduleName, caseNavigatorAreaCollapsibleButton)
            self.caseNavigatorWidget.setup()
            # Listen for event in order to save the current labelmap before moving to the next case
            self.caseNavigatorWidget.addObservable(
                self.caseNavigatorWidget.EVENT_PRE_NEXT,
                self._checkSaveChanges_)
            self.caseNavigatorWidget.addObservable(
                self.caseNavigatorWidget.EVENT_PRE_PREVIOUS,
                self._checkSaveChanges_)
            self.caseNavigatorWidget.addObservable(
                self.caseNavigatorWidget.EVENT_PRE_LABELMAP_LOAD,
                self._onPreNavigatorLabelmapLoaded_)
            self.caseNavigatorWidget.addObservable(
                self.caseNavigatorWidget.EVENT_LABELMAP_LOADED,
                self._onNavigatorLabelmapLoaded_)

        self.layout.addStretch()

        # Extra Connections
        self._createSceneObservers_()

        self.disableEvents = False
        self.setMainTypeGUIProperties()
コード例 #16
0
  def _addCustomizationSection(self):
    customizationCollapsibleButton = ctk.ctkCollapsibleButton()
    customizationCollapsibleButton.text = 'Extraction Customization'
    customizationCollapsibleButton.collapsed = True
    self.layout.addWidget(customizationCollapsibleButton)

    customizationFormLayout = qt.QFormLayout(customizationCollapsibleButton)

    #
    # Radiobuttons to select customization Type
    #

    self.manualCustomizationRadioButton = qt.QRadioButton()
    self.manualCustomizationRadioButton.text = 'Manual Customization'
    self.manualCustomizationRadioButton.checked = True
    customizationFormLayout.layout().addWidget(self.manualCustomizationRadioButton)

    self.parameterFileCustomizationRadioButton = qt.QRadioButton()
    self.parameterFileCustomizationRadioButton.text = 'Parameter File Customization'
    self.parameterFileCustomizationRadioButton.checked = False
    customizationFormLayout.layout().addWidget(self.parameterFileCustomizationRadioButton)

    #
    # Manual Customization
    #
    self.manualCustomizationGroupBox = qt.QGroupBox('Manual Customization')
    self.manualCustomizationGroupBox.visible = True
    # self.manualCustomizationGroupBox.checkable = True
    customizationFormLayout.addWidget(self.manualCustomizationGroupBox)

    manualCustomizationFormLayout = qt.QFormLayout(self.manualCustomizationGroupBox)

    # Feature Class section
    featureClassCollapsibleButton = ctk.ctkCollapsibleButton()
    featureClassCollapsibleButton.text = 'Feature Classes'
    featureClassCollapsibleButton.collapsed = False
    manualCustomizationFormLayout.addWidget(featureClassCollapsibleButton)

    featureClassLayout = qt.QFormLayout(featureClassCollapsibleButton)

    self.featuresLayout = qt.QHBoxLayout()
    featureClassLayout.addRow('Features:', self.featuresLayout)

    self.featuresButtonGroup = qt.QButtonGroup(self.featuresLayout)
    self.featuresButtonGroup.exclusive = False

    # Get the feature classes dynamically
    self.features = list(getFeatureClasses().keys())
    # Create a checkbox for each feature
    featureButtons = {}
    for feature in self.features:
      featureButtons[feature] = qt.QCheckBox(feature)
      # TODO: decide which features to enable by default
      featureButtons[feature].checked = False
      if feature == 'firstorder':
        featureButtons[feature].checked = True
      self.featuresButtonGroup.addButton(featureButtons[feature])
      self.featuresLayout.layout().addWidget(featureButtons[feature])
      # set the ID to be the index of this feature in the list
      self.featuresButtonGroup.setId(featureButtons[feature], self.features.index(feature))

    # Add buttons to select all or none
    self.buttonsLayout = qt.QHBoxLayout()
    featureClassLayout.addRow('Toggle Features:', self.buttonsLayout)

    self.calculateAllFeaturesButton = qt.QPushButton('All Features')
    self.calculateAllFeaturesButton.toolTip = 'Calculate all feature classes.'
    self.calculateAllFeaturesButton.enabled = True
    self.buttonsLayout.addWidget(self.calculateAllFeaturesButton)
    self.calculateNoFeaturesButton = qt.QPushButton('No Features')
    self.calculateNoFeaturesButton.toolTip = 'Calculate no feature classes.'
    self.calculateNoFeaturesButton.enabled = True
    self.buttonsLayout.addWidget(self.calculateNoFeaturesButton)

    # Resampling and Filtering
    filteringCollapsibleButton = ctk.ctkCollapsibleButton()
    filteringCollapsibleButton.text = 'Resampling and Filtering'
    filteringCollapsibleButton.collapsed = False
    manualCustomizationFormLayout.addRow(filteringCollapsibleButton)
    # Layout within the dummy collapsible button
    filteringFormLayout = qt.QFormLayout(filteringCollapsibleButton)

    # Resampling
    self.resampledVoxelSize = qt.QLineEdit()
    self.resampledVoxelSize.toolTip = 'Three floating-point numbers separated by comma defining the resampled pixel ' \
                                      'size (mm).'
    filteringFormLayout.addRow('Resampled voxel size', self.resampledVoxelSize)

    # LoG kernel sizes. default to 5 (?)
    self.logKernelSizes = qt.QLineEdit()
    self.logKernelSizes.toolTip = 'Laplacian of Gaussian filter kernel sizes (mm), separated by comma. ' \
                                  'If empty, no LoG filtering will be applied.'
    filteringFormLayout.addRow('LoG kernel sizes', self.logKernelSizes)

    # Wavelet
    self.waveletCheckBox = qt.QCheckBox()
    self.waveletCheckBox.checked = 0
    self.waveletCheckBox.toolTip = 'If checked, PyRadiomics will calculate features on the image after applying ' \
                                   'wavelet transformation'
    filteringFormLayout.addRow('Wavelet-based features', self.waveletCheckBox)

    #
    # Feature calculation settings
    #
    settingsCollapsibleButton = ctk.ctkCollapsibleButton()
    settingsCollapsibleButton.text = 'Settings'
    settingsCollapsibleButton.collapsed = False
    manualCustomizationFormLayout.addWidget(settingsCollapsibleButton)

    # Layout within the dummy collapsible button
    settingsFormLayout = qt.QFormLayout(settingsCollapsibleButton)

    # bin width, defaults to 25
    self.binWidthSliderWidget = ctk.ctkSliderWidget()
    self.binWidthSliderWidget.singleStep = 1
    self.binWidthSliderWidget.decimals = 2
    self.binWidthSliderWidget.minimum = 0.01
    self.binWidthSliderWidget.maximum = 100
    self.binWidthSliderWidget.value = 25
    self.binWidthSliderWidget.toolTip = 'Set the bin width'
    settingsFormLayout.addRow('Bin Width', self.binWidthSliderWidget)

    # symmetricalGLCM flag, defaults to false
    self.symmetricalGLCMCheckBox = qt.QCheckBox()
    self.symmetricalGLCMCheckBox.checked = 1
    self.symmetricalGLCMCheckBox.toolTip = 'Use a symmetrical GLCM matrix'
    settingsFormLayout.addRow('Enforce Symmetrical GLCM', self.symmetricalGLCMCheckBox)

    #
    # Parameter File Customization
    #

    self.parameterCustomizationGroupBox = qt.QGroupBox('Parameter File Customization')
    self.parameterCustomizationGroupBox.visible = False
    # self.parameterCustomizationGroupBox.checkable = True
    customizationFormLayout.addWidget(self.parameterCustomizationGroupBox)

    parameterCustomizationFormLayout = qt.QFormLayout(self.parameterCustomizationGroupBox)

    # Path edit to select parameter file
    self.parameterFilePathLineEdit = ctk.ctkPathLineEdit()
    parameterCustomizationFormLayout.addRow("Parameter File", self.parameterFilePathLineEdit)
コード例 #17
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        self.setupViewSettingsArea()

        # Setup a logger for the extension log messages
        self.logger = logging.getLogger('SlicerCaseIterator')

        self.logic = None

        # These variables hold connections to other parts of Slicer, such as registered keyboard shortcuts and
        # Event observers
        self.shortcuts = []
        self.observers = []

        # Instantiate and connect widgets ...

        #
        # ComboBox for mode selection
        #
        self.modeGroup = qt.QGroupBox("Mode Selection")
        self.modeGroup.setLayout(qt.QFormLayout())
        self.layout.addWidget(self.modeGroup)

        modes = IteratorFactory.getImplementationNames()
        self.modeComboBox = qt.QComboBox()
        self.modeComboBox.addItems([""] + modes)
        self.modeGroup.layout().addWidget(self.modeComboBox)

        #
        # Select and Load input data section
        #
        self.inputDataCollapsibleButton = ctk.ctkCollapsibleButton()
        self.inputDataCollapsibleButton.text = 'Select and Load case data'
        self.layout.addWidget(self.inputDataCollapsibleButton)

        #
        # Parameters Area
        #
        self.parametersCollapsibleButton = ctk.ctkCollapsibleButton()
        self.parametersCollapsibleButton.text = 'Case iteration parameters'
        self.layout.addWidget(self.parametersCollapsibleButton)

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

        #
        # Reader Name
        #
        self.txtReaderName = qt.QLineEdit()
        self.txtReaderName.text = ''
        self.txtReaderName.toolTip = 'Name of the current reader; if not empty, this name will be added to the filename ' \
                                     'of saved masks'
        parametersFormLayout.addRow('Reader name', self.txtReaderName)

        #
        # Start position
        #
        self.npStart = qt.QSpinBox()
        self.npStart.minimum = 1
        self.npStart.maximum = 999999
        self.npStart.value = 1
        self.npStart.toolTip = 'Start position in the CSV file (1 = first patient)'
        parametersFormLayout.addRow('Start position', self.npStart)

        #
        # Visualization Properties
        #
        self.visualizationPropertiesCollapsibleButton = ctk.ctkCollapsibleButton(
        )
        self.visualizationPropertiesCollapsibleButton.text = 'Visualization properties'
        self.layout.addWidget(self.visualizationPropertiesCollapsibleButton)

        visualizationPropertiesFormLayout = qt.QVBoxLayout(
            self.visualizationPropertiesCollapsibleButton)

        #
        # Mask Groupbox
        #
        self.maskGroup = qt.QGroupBox("Mask")
        self.maskGroup.setLayout(qt.QFormLayout())
        visualizationPropertiesFormLayout.addWidget(self.maskGroup)

        self.sliceFill2DSlider = slicer.qMRMLSliderWidget()
        self.sliceFill2DSlider.minimum = 0.0
        self.sliceFill2DSlider.maximum = 1.0
        self.sliceFill2DSlider.singleStep = 0.1
        self.maskGroup.layout().addRow("Slice 2D fill:",
                                       self.sliceFill2DSlider)

        self.sliceOutline2DSlider = slicer.qMRMLSliderWidget()
        self.sliceOutline2DSlider.minimum = 0.0
        self.sliceOutline2DSlider.maximum = 1.0
        self.sliceOutline2DSlider.singleStep = 0.1
        self.sliceOutline2DSlider.value = 1.0
        self.maskGroup.layout().addRow("Slice 2D outline:",
                                       self.sliceOutline2DSlider)

        #
        # Progressbar
        #
        self.progressBar = qt.QProgressBar()
        self.progressBar.setFormat("%v/%m")
        self.progressBar.visible = False
        self.layout.addWidget(self.progressBar)

        #
        # Case Button Row
        #
        self.caseButtonWidget = qt.QWidget()
        self.caseButtonWidget.setLayout(qt.QHBoxLayout())
        self.layout.addWidget(self.caseButtonWidget)

        #
        # Reset
        #
        self.resetButton = qt.QPushButton('Start Batch')
        self.resetButton.enabled = False
        self.caseButtonWidget.layout().addWidget(self.resetButton)

        #
        # Previous Case
        #
        self.previousButton = qt.QPushButton('Previous Case')
        self.previousButton.enabled = False
        self.previousButton.toolTip = '(Ctrl+P) Press this button to go to the previous case, previous new masks are not reloaded'
        self.caseButtonWidget.layout().addWidget(self.previousButton)

        #
        # Load CSV / Next Case
        #
        self.nextButton = qt.QPushButton('Next Case')
        self.nextButton.enabled = False
        self.nextButton.toolTip = '(Ctrl+N) Press this button to go to the next case'
        self.caseButtonWidget.layout().addWidget(self.nextButton)

        #
        # Collapsible Button group for enabling only one at a time
        #
        self.collapsibleButtonGroup = qt.QButtonGroup()
        self.collapsibleButtonGroup.setExclusive(True)
        self.collapsibleButtonGroup.addButton(self.inputDataCollapsibleButton)
        self.collapsibleButtonGroup.addButton(self.parametersCollapsibleButton)
        self.collapsibleButtonGroup.addButton(
            self.visualizationPropertiesCollapsibleButton)

        self.layout.addStretch(1)

        #
        # Connect buttons to functions
        #
        self.modeComboBox.currentTextChanged.connect(self.onModeSelected)
        self.previousButton.connect('clicked(bool)', self.onPrevious)
        self.nextButton.connect('clicked(bool)', self.onNext)
        self.resetButton.connect('clicked(bool)', self.onReset)
        self.sliceFill2DSlider.valueChanged.connect(
            lambda value: self.updateSegmentationProperties())
        self.sliceOutline2DSlider.valueChanged.connect(
            lambda value: self.updateSegmentationProperties())

        if len(modes) == 1:
            self.modeComboBox.hide()
            self.onModeSelected(modes[1])

        self._setGUIstate(csv_loaded=False)
コード例 #18
0
    def create(self, registrationState):
        """Make the plugin-specific user interface"""
        super(LocalSimpleITKPlugin, self).create(registrationState)

        # To avoid the overhead of importing SimpleITK during application
        # startup, the import of SimpleITK is delayed until it is needed.
        global sitk
        import SimpleITK as sitk
        global sitkUtils
        import sitkUtils
        print("LocalSimpleITKPlugin.create")

        self.LocalSimpleITKMode = "Small"
        self.VerboseMode = "Quiet"

        #
        # Local Refinment Pane - initially hidden
        # - interface options for linear registration
        #
        localSimpleITKCollapsibleButton = ctk.ctkCollapsibleButton()
        localSimpleITKCollapsibleButton.text = "Local SimpleITK"
        localSimpleITKFormLayout = qt.QFormLayout()
        localSimpleITKCollapsibleButton.setLayout(localSimpleITKFormLayout)
        self.widgets.append(localSimpleITKCollapsibleButton)

        buttonGroup = qt.QButtonGroup()
        self.widgets.append(buttonGroup)
        buttonLayout = qt.QVBoxLayout()
        localSimpleITKModeButtons = {}
        self.LocalSimpleITKModes = ("Small", "Large")
        for mode in self.LocalSimpleITKModes:
            localSimpleITKModeButtons[mode] = qt.QRadioButton()
            localSimpleITKModeButtons[mode].text = mode
            localSimpleITKModeButtons[mode].setToolTip(
                "Run the refinement in a %s local region." % mode.lower())
            buttonLayout.addWidget(localSimpleITKModeButtons[mode])
            buttonGroup.addButton(localSimpleITKModeButtons[mode])
            self.widgets.append(localSimpleITKModeButtons[mode])
            localSimpleITKModeButtons[mode].connect(
                'clicked()', lambda m=mode: self.onLocalSimpleITKMode(m))
        localSimpleITKModeButtons[self.LocalSimpleITKMode].checked = True
        localSimpleITKFormLayout.addRow("Local SimpleITK Mode ", buttonLayout)

        buttonGroup = qt.QButtonGroup()
        self.widgets.append(buttonGroup)
        buttonLayout = qt.QVBoxLayout()
        verboseModeButtons = {}
        self.VerboseModes = ("Quiet", "Verbose", "Full Verbose")
        for mode in self.VerboseModes:
            verboseModeButtons[mode] = qt.QRadioButton()
            verboseModeButtons[mode].text = mode
            verboseModeButtons[mode].setToolTip(
                "Run the refinement in %s mode." % mode.lower())
            buttonLayout.addWidget(verboseModeButtons[mode])
            buttonGroup.addButton(verboseModeButtons[mode])
            self.widgets.append(verboseModeButtons[mode])
            verboseModeButtons[mode].connect(
                'clicked()', lambda m=mode: self.onVerboseMode(m))
        verboseModeButtons[self.VerboseMode].checked = True
        localSimpleITKFormLayout.addRow("Verbose Mode ", buttonLayout)

        self.parent.layout().addWidget(localSimpleITKCollapsibleButton)
コード例 #19
0
    def setup(self):

        #->> TODO could also specify with Qt Designer instead in future (QtUiTools)

        # IO COLLAPSIBLE BUTTON
        ioCollapsibleButton = ctk.ctkCollapsibleButton()
        ioCollapsibleButton.text = "IO"
        self.layout.addWidget(ioCollapsibleButton)

        # Layout within the io collapsible button
        ioFormLayout = qt.QFormLayout(ioCollapsibleButton)

        # inputVolume node selector 1
        inputNodeSelector1 = slicer.qMRMLNodeComboBox()
        inputNodeSelector1.objectName = 'inputNodeSelector1'
        inputNodeSelector1.toolTip = "Select the 1st input volume to be segmented."
        inputNodeSelector1.nodeTypes = ['vtkMRMLScalarVolumeNode']
        inputNodeSelector1.noneEnabled = False
        inputNodeSelector1.addEnabled = False
        inputNodeSelector1.removeEnabled = False
        inputNodeSelector1.editEnabled = True
        inputNodeSelector1.connect('currentNodeChanged(vtkMRMLNode*)',
                                   self.setInputNode1)
        ioFormLayout.addRow("Input Volume 1:", inputNodeSelector1)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            inputNodeSelector1, 'setMRMLScene(vtkMRMLScene*)')
        self.inputNodeSelector1 = inputNodeSelector1

        #->> TODO for all parameters, provide slots to set them, and use internal values to eventually pass them into the PDF segmenter - for using the interactive PDF segmenter somewhere else, ex in editor module

        # inputVolume node selector 2
        inputNodeSelector2 = slicer.qMRMLNodeComboBox()
        inputNodeSelector2.objectName = 'inputNodeSelector2'
        inputNodeSelector2.toolTip = "Select the 2nd input volume to be segmented."
        inputNodeSelector2.nodeTypes = ['vtkMRMLScalarVolumeNode']
        inputNodeSelector2.noneEnabled = True
        inputNodeSelector2.addEnabled = False
        inputNodeSelector2.removeEnabled = False
        inputNodeSelector2.editEnabled = True
        inputNodeSelector2.connect('currentNodeChanged(vtkMRMLNode*)',
                                   self.setInputNode2)
        ioFormLayout.addRow("Input Volume 2 (optional):", inputNodeSelector2)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            inputNodeSelector2, 'setMRMLScene(vtkMRMLScene*)')
        self.inputNodeSelector2 = inputNodeSelector2

        # inputVolume node selector 3
        inputNodeSelector3 = slicer.qMRMLNodeComboBox()
        inputNodeSelector3.objectName = 'inputNodeSelector3'
        inputNodeSelector3.toolTip = "Select the 3rd input volume to be segmented."
        inputNodeSelector3.nodeTypes = ['vtkMRMLScalarVolumeNode']
        inputNodeSelector3.noneEnabled = True
        inputNodeSelector3.addEnabled = False
        inputNodeSelector3.removeEnabled = False
        inputNodeSelector3.editEnabled = True
        inputNodeSelector3.connect('currentNodeChanged(vtkMRMLNode*)',
                                   self.setInputNode3)
        ioFormLayout.addRow("Input Volume 3 (optional):", inputNodeSelector3)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            inputNodeSelector3, 'setMRMLScene(vtkMRMLScene*)')
        self.inputNodeSelector3 = inputNodeSelector3

        # outputVolume node selector
        outputNodeSelector = slicer.qMRMLNodeComboBox()
        outputNodeSelector.objectName = 'outputNodeSelector'
        outputNodeSelector.toolTip = "Select the output volume to be segmented."
        outputNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode']
        outputNodeSelector.noneEnabled = False
        outputNodeSelector.addEnabled = True
        outputNodeSelector.removeEnabled = False
        outputNodeSelector.editEnabled = True
        outputNodeSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                   self.setOutputNode)
        ioFormLayout.addRow("Output Volume:", outputNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            outputNodeSelector, 'setMRMLScene(vtkMRMLScene*)')
        self.outputNodeSelector = outputNodeSelector

        # LABEL MAP COLLAPSIBLE BUTTON

        labelMapCollapsibleButton = ctk.ctkCollapsibleButton()
        labelMapCollapsibleButton.text = "Label Maps"
        self.layout.addWidget(labelMapCollapsibleButton)

        # Layout within the labelMap collapsible button
        labelMapFormLayout = qt.QFormLayout(labelMapCollapsibleButton)

        # labelMap node selector
        labelMapNodeSelector = slicer.qMRMLNodeComboBox()
        labelMapNodeSelector.objectName = 'labelMapNodeSelector'
        labelMapNodeSelector.toolTip = "Select the label map roughly outlining the structure to be segmented and its background."
        labelMapNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode']
        labelMapNodeSelector.addAttribute("vtkMRMLScalarVolumeNode",
                                          "LabelMap", True)
        labelMapNodeSelector.noneEnabled = False
        labelMapNodeSelector.addEnabled = True
        labelMapNodeSelector.removeEnabled = False
        labelMapNodeSelector.editEnabled = True
        labelMapNodeSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                     self.setLabelMapNode)
        labelMapFormLayout.addRow("Label Map:", labelMapNodeSelector)
        self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
                            labelMapNodeSelector,
                            'setMRMLScene(vtkMRMLScene*)')
        self.labelMapNodeSelector = labelMapNodeSelector

        # Create frame editor widget
        editorFrame = qt.QFrame()
        editorFrame.setLayout(qt.QVBoxLayout())
        palette = editorFrame.palette
        bgColor = 240
        palette.setColor(qt.QPalette.Background,
                         qt.QColor(bgColor, bgColor, bgColor))
        editorFrame.setPalette(palette)
        editorFrame.setAutoFillBackground(True)
        labelMapFormLayout.addRow(editorFrame)
        self.editorFrame = editorFrame

        # initialize editor widget: using parent frame, embedded is true and list of effects
        self.editorWidget = __main__.EditorWidget(
            parent=self.editorFrame,
            embedded=True,
            suppliedEffects=self.editorEffects,
            showVolumesFrame=False)

        # voidLabel selector
        # The voidLabel selector selects which label corresponds to the void label
        # All other labels in the label map will be extracted and set to object labels
        voidLabelSpinBox = qt.QSpinBox()
        voidLabelSpinBox.objectName = 'voidLabelSpinBox'
        voidLabelSpinBox.toolTip = "Value that represents nothing in the label map.  All other labels represent objects."
        voidLabelSpinBox.setMinimum(0)
        voidLabelSpinBox.setMaximum(255)  # temporary value to start
        voidLabelSpinBox.enabled = False
        labelMapFormLayout.addRow("Void Id:", voidLabelSpinBox)
        self.voidLabelSpinBox = voidLabelSpinBox

        #->> TODO: later on, would like a label combo box that shows only those labels
        # that are included in the label map
        # The following code starts in that direction, but does not work

        # BEGIN hacking
        ##  voidLabelSelector = slicer.qMRMLLabelComboBox()
        ##  voidLabelSelector.maximumColorCount = 256 #->> TODO
        ##  labelMapFormLayout.addRow("Void Label:", voidLabelSelector)
        ##  self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)',
        ##                      voidLabelSelector, 'setMRMLScene(vtkMRMLScene*)')
        ##  # create a new vtkMRMLColorTableNode to hold the labels in the label map
        ##  colorLogic = slicer.vtkSlicerColorLogic()
        ##  defaultID = colorLogic.GetDefaultEditorColorNodeID()
        ##  defaultNode = slicer.mrmlScene.GetNodeByID(defaultID)
        ##  if defaultNode:
        ##    # create the node based on the default editor color node
        ##    self.labelsColorNode = slicer.vtkMRMLColorTableNode()
        ##    self.labelsColorNode.Copy(defaultNode)
        ##    # substitute in a new lookup table that we will manipulate
        ##    lookupTable = vtk.vtkLookupTable()
        ##    lookupTable.DeepCopy(defaultNode.GetLookupTable())
        ##    defaultLookupTable = defaultNode.GetLookupTable()
        ##    list = [3,5,7,9]
        ##    lookupTable.SetNumberOfTableValues(len(list))
        ##    for i in range(0, len(list)):
        ##      orig = []
        ##      defaultLookupTable.GetTableValue(list[i], orig)
        ##      lookupTable.SetTableValue(i, defaultNode.GetLookupTable().
        ##    self.labelsColorNode.SetLookupTable(lookupTable)
        ##    # set the new color node to the selector
        ##    # voidLabelSelector.setMRMLColorNode(self.labelsColorNode)
        ##    print "lut:", self.labelsColorNode.GetLookupTable()
        ## self.voidLabelSelector = voidLabelSelector
        # END hacking

        #->> TODO: another alternative is to use an EditColor - but it is heavily coupled
        # to the editor logic, using an editor parameter node that ties it with the editor
        # widget's EditColor
        # Create a frame to give the EditColor a suitable parent
        ## voidLabelFrame = qt.QFrame()
        ## voidLabelFrame.setLayout(qt.QHBoxLayout())
        ## voidLabelFrame.toolTip = "Value that represents nothing in the label map.  All labels not equal to the void id represent objects."
        ## voidLabelSelector = EditorLib.EditColor(parent=voidLabelFrame)
        ## labelMapFormLayout.addRow("Void Id", voidLabelFrame)
        ## self.voidLabelSelector = voidLabelSelector

        # SEGMENTATION PARAMETERS COLLAPSIBLE BUTTON
        segmentationCollapsibleButton = ctk.ctkCollapsibleButton()
        segmentationCollapsibleButton.text = "Segmentation Parameters"
        self.layout.addWidget(segmentationCollapsibleButton)

        # Layout within the parameters collapsible button
        segmentationFormLayout = qt.QFormLayout(segmentationCollapsibleButton)

        # segmentation "goal" buttons
        self.goalButtonList = []
        goalButtonGroup = qt.QButtonGroup()
        goalGroupBox = qt.QGroupBox()
        goalGroupBox.objectName = 'goalGroupBox'
        goalGroupBox.toolTip = "Select what the goal segmentation looks like"
        goalGroupBoxLayout = qt.QHBoxLayout()

        for i in range(0, len(self.goalButtonTexts)):
            button = qt.QToolButton()
            button.setText(self.goalButtonTexts[i])
            button.setCheckable(True)
            goalButtonGroup.addButton(button, i)
            goalGroupBoxLayout.addWidget(button)
            self.goalButtonList.append(button)

        self.goalButtonList[self.goalButtonDefault].setChecked(True)

        goalButtonGroup.setExclusive(True)
        goalButtonGroup.connect('buttonClicked(int)',
                                self.setGoalSegmentationType)
        goalGroupBox.setLayout(goalGroupBoxLayout)
        goalGroupBox.setFlat(True)

        segmentationFormLayout.addRow("Goal Segmentation:", goalGroupBox)
        self.goalButtonGroup = goalButtonGroup

        # ADVANCED PARAMETERS COLLAPSIBLE BUTTON
        advancedCollapsibleButton = ctk.ctkCollapsibleButton()
        advancedCollapsibleButton.text = "Advanced Parameters"
        self.layout.addWidget(advancedCollapsibleButton)

        # Layout within the parameters collapsible button
        advancedFormLayout = qt.QFormLayout(advancedCollapsibleButton)

        # Erosion radius spin box
        erosionSpinBox = qt.QSpinBox()
        erosionSpinBox.objectName = 'erosionSpinBox'
        erosionSpinBox.toolTip = "Set the erosion radius."
        erosionSpinBox.setMinimum(0)
        erosionSpinBox.connect('valueChanged(int)', self.setErosionRadius)
        advancedFormLayout.addRow("Erosion Radius:", erosionSpinBox)
        self.erosionSpinBox = erosionSpinBox

        # Hole fill iterations spin box
        holeFillSpinBox = qt.QSpinBox()
        holeFillSpinBox.objectName = 'holeFillSpinBox'
        holeFillSpinBox.toolTip = "Set the number of hole filling iterations."
        holeFillSpinBox.setMinimum(0)
        holeFillSpinBox.connect('valueChanged(int)',
                                self.setHoleFillIterations)
        advancedFormLayout.addRow("Hole Fill Iterations:", holeFillSpinBox)
        self.holeFillSpinBox = holeFillSpinBox

        # falsePositiveRatio spin box
        falsePositiveRatioSpinBox = qt.QDoubleSpinBox()
        falsePositiveRatioSpinBox.objectName = 'falsePositiveRatioSpinBox'
        falsePositiveRatioSpinBox.toolTip = "Relative Cost of False Positive vs. false negative."
        falsePositiveRatioSpinBox.setMinimum(0.0)
        falsePositiveRatioSpinBox.setValue(1.0)  # Default
        falsePositiveRatioSpinBox.setSingleStep(0.1)
        advancedFormLayout.addRow("False Positive Ratio:",
                                  falsePositiveRatioSpinBox)
        self.falsePositiveRatioSpinBox = falsePositiveRatioSpinBox

        # probabilitySmoothingStandardDeviation spin box
        probabilitySmoothingStdDevSpinBox = qt.QDoubleSpinBox()
        probabilitySmoothingStdDevSpinBox.objectName = 'probabilitySmoothingStdDevSpinBox'
        probabilitySmoothingStdDevSpinBox.toolTip = "Standard deviation of blur applied to probability images prior to computing maximum likelihood of each class at each pixel."
        probabilitySmoothingStdDevSpinBox.setMinimum(0.0)
        probabilitySmoothingStdDevSpinBox.setValue(3.0)  # Default
        probabilitySmoothingStdDevSpinBox.setSingleStep(0.1)
        advancedFormLayout.addRow("Probability Smoothing Standard Deviation:",
                                  probabilitySmoothingStdDevSpinBox)
        self.probabilitySmoothingStdDevSpinBox = probabilitySmoothingStdDevSpinBox

        # draft check box
        draftCheckBox = qt.QCheckBox()
        draftCheckBox.objectName = 'draftCheckBox'
        draftCheckBox.toolTip = "Generate draft results?"
        advancedFormLayout.addRow("Draft Mode:", draftCheckBox)
        self.draftCheckBox = draftCheckBox

        # reclassifyObjectMask check box
        reclassifyObjectMaskCheckBox = qt.QCheckBox()
        reclassifyObjectMaskCheckBox.objectName = 'reclassifyObjectMaskCheckBox'
        reclassifyObjectMaskCheckBox.toolTip = "Perform classification on voxels within the object mask?"
        reclassifyObjectMaskCheckBox.setChecked(True)
        advancedFormLayout.addRow("Reclassify Object Mask:",
                                  reclassifyObjectMaskCheckBox)
        self.reclassifyObjectMaskCheckBox = reclassifyObjectMaskCheckBox

        # reclassifyNotObjectMask check box
        reclassifyNotObjectMaskCheckBox = qt.QCheckBox()
        reclassifyNotObjectMaskCheckBox.objectName = 'reclassifyNotObjectMaskCheckBox'
        reclassifyNotObjectMaskCheckBox.toolTip = "Perform classification on all non-void voxels?"
        reclassifyNotObjectMaskCheckBox.setChecked(True)
        advancedFormLayout.addRow("Reclassify Not Object Mask:",
                                  reclassifyNotObjectMaskCheckBox)
        self.reclassifyNotObjectMaskCheckBox = reclassifyNotObjectMaskCheckBox

        # SEGMENTATION BUTTON
        segmentCollapsibleButton = ctk.ctkCollapsibleButton()
        segmentCollapsibleButton.text = "Run Segmentation"
        self.layout.addWidget(segmentCollapsibleButton)

        # Layout within the parameters collapsible button
        segmentFormLayout = qt.QFormLayout(segmentCollapsibleButton)

        # segmentation button
        segmentationButton = qt.QPushButton("Segment")
        segmentationButton.toolTip = "Perform PDF Segmentation."
        segmentFormLayout.addRow(segmentationButton)
        segmentationButton.connect('clicked()',
                                   self.onSegmentationButtonClicked)

        # Now that we've created all UI elements, apply the default goal segmentation type
        self.setGoalSegmentationType(self.goalButtonDefault)
コード例 #20
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        # Inputs
        inputsCollapsibleButton = ctk.ctkCollapsibleButton()
        inputsCollapsibleButton.text = "Inputs"
        self.layout.addWidget(inputsCollapsibleButton)
        inputsFormLayout = qt.QFormLayout(inputsCollapsibleButton)

        self.modelPointsSelector = slicer.qMRMLNodeComboBox()
        self.modelPointsSelector.nodeTypes = ["vtkMRMLMarkupsFiducialNode"]
        self.modelPointsSelector.selectNodeUponCreation = True
        self.modelPointsSelector.addEnabled = True
        self.modelPointsSelector.removeEnabled = True
        self.modelPointsSelector.noneEnabled = True
        self.modelPointsSelector.showHidden = False
        self.modelPointsSelector.showChildNodeTypes = False
        self.modelPointsSelector.setMRMLScene(slicer.mrmlScene)
        self.modelPointsSelector.setToolTip(
            "Pick the fiducials that define the cylinder top, bottom, and sphere centre."
        )
        inputsFormLayout.addRow("Model Fiducials: ", self.modelPointsSelector)
        self.modelPointsSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                         self.onModelPointsSelected)

        self.qSlider_SphereRadius = ctk.ctkSliderWidget()
        self.qSlider_SphereRadius.singleStep = 0.1
        self.qSlider_SphereRadius.minimum = 0
        self.qSlider_SphereRadius.maximum = 20
        self.qSlider_SphereRadius.value = 10
        self.qSlider_SphereRadius.setToolTip("Set sphere radius.")
        self.qSlider_SphereRadius.valueChanged.connect(self.onSliderChange)
        inputsFormLayout.addRow("Sphere Radius: ", self.qSlider_SphereRadius)

        self.qSlider_CylinderRadius = ctk.ctkSliderWidget()
        self.qSlider_CylinderRadius.singleStep = 0.1
        self.qSlider_CylinderRadius.minimum = 0
        self.qSlider_CylinderRadius.maximum = 20
        self.qSlider_CylinderRadius.value = 7.5
        self.qSlider_CylinderRadius.setToolTip("Set cylinder radius.")
        self.qSlider_CylinderRadius.valueChanged.connect(self.onSliderChange)
        inputsFormLayout.addRow("Cylinder Radius: ",
                                self.qSlider_CylinderRadius)

        self.qSlider_CylinderHeight = ctk.ctkSliderWidget()
        self.qSlider_CylinderHeight.singleStep = 0.1
        self.qSlider_CylinderHeight.minimum = 5
        self.qSlider_CylinderHeight.maximum = 120
        self.qSlider_CylinderHeight.value = 30
        self.qSlider_CylinderHeight.setToolTip("Set cylinder height.")
        self.qSlider_CylinderHeight.valueChanged.connect(self.onSliderChange)
        inputsFormLayout.addRow("Cylinder Height", self.qSlider_CylinderHeight)

        self.updateFibersButton = qt.QPushButton("Update the fibers")
        self.updateFibersButton.toolTip = "Recalculate the fibers."
        inputsFormLayout.addRow("Fiber and Grey Matter:",
                                self.updateFibersButton)
        self.updateFibersButton.stateChanged.connect(
            self.onUpdateFibersClicked)

        self.writeScoresButton = qt.QPushButton("Save the scores")
        self.writeScoresButton.toolTip = "Write the functional scores to disk."
        inputsFormLayout.addRow("Calculate and save scores:",
                                self.writeScoresButton)
        self.writeScoresButton.connect("clicked(bool)",
                                       self.onSaveScoresClicked)

        self.labeledAtlasVolumeSelector = slicer.qMRMLNodeComboBox()
        self.labeledAtlasVolumeSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
        self.labeledAtlasVolumeSelector.selectNodeUponCreation = True
        self.labeledAtlasVolumeSelector.addEnabled = False
        self.labeledAtlasVolumeSelector.removeEnabled = False
        self.labeledAtlasVolumeSelector.noneEnabled = True
        self.labeledAtlasVolumeSelector.showHidden = False
        self.labeledAtlasVolumeSelector.showChildNodeTypes = False
        self.labeledAtlasVolumeSelector.setMRMLScene(slicer.mrmlScene)
        self.labeledAtlasVolumeSelector.setToolTip(
            "Pick the Atlas-based Segmented Brain Volume.")
        inputsFormLayout.addRow("Labeled Atlas Volume: ",
                                self.labeledAtlasVolumeSelector)
        self.labeledAtlasVolumeSelector.connect(
            "currentNodeChanged(vtkMRMLNode*)",
            self.onLabeledAtlasVolumeChanged)

        # Generate a rectangular Box for Score Guidance
        self.Rec_Box = slicer.qMRMLNodeComboBox()
        self.Rec_Box.nodeTypes = ["vtkMRMLScalarVolumeNode"]
        self.Rec_Box.selectNodeUponCreation = True
        self.Rec_Box.addEnabled = True
        self.Rec_Box.removeEnabled = True
        self.Rec_Box.noneEnabled = True
        self.Rec_Box.showHidden = False
        self.Rec_Box.showChildNodeTypes = False
        self.Rec_Box.setMRMLScene(slicer.mrmlScene)
        self.Rec_Box.setToolTip("Pick the Atlas-based Segmented Brain Volume.")
        inputsFormLayout.addRow("Generate the Score Box: ", self.Rec_Box)
        self.Rec_Box.connect(
            "currentNodeChanged(vtkMRMLNode*)",
            self.OnSelect_Rec_Box)  # missing self.OnSelect_label function

        self.skullMaskVolumeSelector = slicer.qMRMLNodeComboBox()
        self.skullMaskVolumeSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
        self.skullMaskVolumeSelector.selectNodeUponCreation = False
        self.skullMaskVolumeSelector.addEnabled = False
        self.skullMaskVolumeSelector.removeEnabled = False
        self.skullMaskVolumeSelector.noneEnabled = True
        self.skullMaskVolumeSelector.showHidden = False
        self.skullMaskVolumeSelector.showChildNodeTypes = False
        self.skullMaskVolumeSelector.setMRMLScene(slicer.mrmlScene)
        self.skullMaskVolumeSelector.setToolTip("Pick the skull mask volume.")
        inputsFormLayout.addRow("Skull Mask Volume: ",
                                self.skullMaskVolumeSelector)
        self.skullMaskVolumeSelector.connect(
            "currentNodeChanged(vtkMRMLNode*)", self.onSkullMaskChanged)

        self.tractographyFibreBundleSelector = slicer.qMRMLNodeComboBox()
        self.tractographyFibreBundleSelector.nodeTypes = [
            "vtkMRMLFiberBundleNode"
        ]
        self.tractographyFibreBundleSelector.selectNodeUponCreation = True
        self.tractographyFibreBundleSelector.addEnabled = False
        self.tractographyFibreBundleSelector.removeEnabled = False
        self.tractographyFibreBundleSelector.noneEnabled = True
        self.tractographyFibreBundleSelector.showHidden = False
        self.tractographyFibreBundleSelector.showChildNodeTypes = False
        self.tractographyFibreBundleSelector.setMRMLScene(slicer.mrmlScene)
        self.tractographyFibreBundleSelector.setToolTip(
            "Pick the full-brain Tractography file.")
        inputsFormLayout.addRow("Tractography Fiber Bundle: ",
                                self.tractographyFibreBundleSelector)
        self.tractographyFibreBundleSelector.connect(
            "currentNodeChanged(vtkMRMLNode*)", self.onFiberBundleChanged)

        self.roiSelector = slicer.qMRMLNodeComboBox()
        self.roiSelector.nodeTypes = ["vtkMRMLAnnotationROINode"]
        self.roiSelector.selectNodeUponCreation = True
        self.roiSelector.addEnabled = True
        self.roiSelector.removeEnabled = True
        self.roiSelector.noneEnabled = True
        self.roiSelector.showHidden = False
        self.roiSelector.showChildNodeTypes = False
        self.roiSelector.setMRMLScene(slicer.mrmlScene)
        self.roiSelector.setToolTip(
            "Pick the ROI to define the region for labeling of fibers.")
        inputsFormLayout.addRow("Labeling ROI: ", self.roiSelector)
        self.roiSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                 self.onRoiChanged)

        self.saveArrayButton = qt.QPushButton("Generate and Save Arrays")
        self.saveArrayButton.toolTip = "Run the algorithm!"
        inputsFormLayout.addRow(self.saveArrayButton)
        self.saveArrayButton.connect('clicked(bool)', self.onSaveArrayClicked)

        self.loadArrayButton = qt.QPushButton("Load Saved Array")
        self.loadArrayButton.toolTip = "Run the algorithm!"
        inputsFormLayout.addRow(self.loadArrayButton)
        self.loadArrayButton.connect('clicked(bool)', self.onLoadArrayClicked)

        # output fiberbundle generator
        self.fiberOutputSelector = slicer.qMRMLNodeComboBox()
        self.fiberOutputSelector.nodeTypes = ["vtkMRMLFiberBundleNode"]
        self.fiberOutputSelector.selectNodeUponCreation = True
        self.fiberOutputSelector.addEnabled = True
        self.fiberOutputSelector.removeEnabled = True
        self.fiberOutputSelector.noneEnabled = True
        self.fiberOutputSelector.showHidden = False
        self.fiberOutputSelector.showChildNodeTypes = False
        self.fiberOutputSelector.setMRMLScene(slicer.mrmlScene)
        self.fiberOutputSelector.setToolTip(
            "Create or pick the output fiber bundle node.")
        inputsFormLayout.addRow("Output fiber bundle: ",
                                self.fiberOutputSelector)
        self.fiberOutputSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                         self.onOutputFiberChanged)

        # Input the Models Hierarchy Node
        self.brainSurfaceModelSelector = slicer.qMRMLNodeComboBox()
        self.brainSurfaceModelSelector.nodeTypes = [
            "vtkMRMLModelHierarchyNode"
        ]
        self.brainSurfaceModelSelector.selectNodeUponCreation = True
        self.brainSurfaceModelSelector.addEnabled = False
        self.brainSurfaceModelSelector.removeEnabled = False
        self.brainSurfaceModelSelector.noneEnabled = True
        self.brainSurfaceModelSelector.showHidden = False
        self.brainSurfaceModelSelector.showChildNodeTypes = False
        self.brainSurfaceModelSelector.setMRMLScene(slicer.mrmlScene)
        self.brainSurfaceModelSelector.setToolTip(
            "Pick the Hierarchy of Brain Surface Models.")
        inputsFormLayout.addRow("Brain surface models: ",
                                self.brainSurfaceModelSelector)
        self.brainSurfaceModelSelector.connect(
            "currentNodeChanged(vtkMRMLNode*)", self.brainSurfaceModelChanged)

        # Apply Button
        radioLayout = qt.QHBoxLayout()
        buttonGroup = qt.QButtonGroup()
        self.radioButtons = []
        self.radioButtons.append(qt.QRadioButton('FC_GM'))
        self.radioButtons.append(qt.QRadioButton('SC_GM'))
        self.radioButtons.append(qt.QRadioButton('Opacity_reset'))
        buttonGroup.addButton(self.radisButtons[0], 0)
        buttonGroup.addButton(self.radioButtons[1], 1)
        buttonGroup.addButton(self.radioButtons[2], 2)
        radioLayout.addWidget(self.radioButtons[0])
        radioLayout.addWidget(self.radioButtons[1])
        radioLayout.addWidget(self.radioButtons[2])
        inputsFormLayout.addRow("Select the Grey Matter Score to paint: ",
                                radioLayout)
        self.radioButtons[0].connect(
            'clicked()', self.functionConnectivityGreyMatterClicked)
        self.radioButtons[1].connect(
            'clicked()', self.structuralConnectivityGreyMatterClicked)
        self.radioButtons[2].connect('clicked()', self.resetModelOpacities)

        self.runOptimizationButton = qt.QPushButton("Run the Optimization")
        self.runOptimizationButton.toolTip = "Run the algorithm!"
        inputsFormLayout.addRow("Run optimization: ",
                                self.runOptimizationButton)
        self.runOptimizationButton.connect("clicked(bool)",
                                           self.onRunOptimizationClicked)
コード例 #21
0
  def buildGUI(self, parent):

    registrationLayout = qt.QFormLayout(parent)

    # From/To Catheters
    
    self.fromCatheterComboBox = QComboBoxCatheter()
    self.fromCatheterComboBox.setCatheterCollection(self.catheters)
    self.fromCatheterComboBox.currentIndexChanged.connect(self.onFromCatheterSelected)
    
    registrationLayout.addRow("Catheter (From): ", self.fromCatheterComboBox)

    self.toCatheterComboBox = QComboBoxCatheter()
    self.toCatheterComboBox.setCatheterCollection(self.catheters)
    self.toCatheterComboBox.currentIndexChanged.connect(self.onToCatheterSelected)
    
    registrationLayout.addRow("Catheter (To): ", self.toCatheterComboBox)

    # Registration Fiducials
    
    self.fromFiducialsSelector = slicer.qMRMLNodeComboBox()
    self.fromFiducialsSelector.nodeTypes = ( ("vtkMRMLMarkupsFiducialNode"), "" )
    self.fromFiducialsSelector.selectNodeUponCreation = False
    self.fromFiducialsSelector.addEnabled = True
    self.fromFiducialsSelector.removeEnabled = False
    self.fromFiducialsSelector.noneEnabled = True
    self.fromFiducialsSelector.showHidden = True
    self.fromFiducialsSelector.showChildNodeTypes = False
    self.fromFiducialsSelector.setMRMLScene( slicer.mrmlScene )
    self.fromFiducialsSelector.setToolTip( "Registration fiducials obtained by the 'To' catheter." )
    registrationLayout.addRow("Fiducials (From): ", self.fromFiducialsSelector)

    self.toFiducialsSelector = slicer.qMRMLNodeComboBox()
    self.toFiducialsSelector.nodeTypes = ( ("vtkMRMLMarkupsFiducialNode"), "" )
    self.toFiducialsSelector.selectNodeUponCreation = False
    self.toFiducialsSelector.addEnabled = True
    self.toFiducialsSelector.removeEnabled = False
    self.toFiducialsSelector.noneEnabled = True
    self.toFiducialsSelector.showHidden = True
    self.toFiducialsSelector.showChildNodeTypes = False
    self.toFiducialsSelector.setMRMLScene( slicer.mrmlScene )
    self.toFiducialsSelector.setToolTip( "Registration fiducials obtained by the 'From' catheter." )
    registrationLayout.addRow("Fiducials (To): ", self.toFiducialsSelector)

    
    # #
    # # Fiducial points used (either "tip only" or "all"
    # #
    # 
    # pointBoxLayout = qt.QHBoxLayout()
    # self.pointGroup = qt.QButtonGroup()
    # 
    # self.useTipRadioButton = qt.QRadioButton("Tip")
    # self.useAllRadioButton = qt.QRadioButton("All ")
    # self.useAllRadioButton.checked = 1
    # pointBoxLayout.addWidget(self.useTipRadioButton)
    # self.pointGroup.addButton(self.useTipRadioButton)
    # pointBoxLayout.addWidget(self.useAllRadioButton)
    # self.pointGroup.addButton(self.useAllRadioButton)
    # 
    # registrationLayout.addRow("Points: ", pointBoxLayout)
    #
    
    #
    # Fiducial points visibility
    #
    
    visibilityBoxLayout = qt.QHBoxLayout()
    self.visibilityGroup = qt.QButtonGroup()
    self.visibilityOnRadioButton = qt.QRadioButton("ON")
    self.visibilityOffRadioButton = qt.QRadioButton("Off")
    self.visibilityOffRadioButton.checked = 1
    visibilityBoxLayout.addWidget(self.visibilityOnRadioButton)
    self.visibilityGroup.addButton(self.visibilityOnRadioButton)
    visibilityBoxLayout.addWidget(self.visibilityOffRadioButton)
    self.visibilityGroup.addButton(self.visibilityOffRadioButton)

    registrationLayout.addRow("Visibility: ", visibilityBoxLayout)

    #
    # Transform Type
    #
    
    transTypeBoxLayout = qt.QHBoxLayout()
    self.transTypeGroup = qt.QButtonGroup()
    self.rigidTypeRadioButton = qt.QRadioButton("Rigid")
    self.affineTypeRadioButton = qt.QRadioButton("Affine")
    self.splineTypeRadioButton = qt.QRadioButton("Thin Plate Spline")
    self.rigidTypeRadioButton.checked = 1
    transTypeBoxLayout.addWidget(self.rigidTypeRadioButton)
    self.transTypeGroup.addButton(self.rigidTypeRadioButton)
    transTypeBoxLayout.addWidget(self.affineTypeRadioButton)
    self.transTypeGroup.addButton(self.affineTypeRadioButton)
    transTypeBoxLayout.addWidget(self.splineTypeRadioButton)
    self.transTypeGroup.addButton(self.splineTypeRadioButton)

    registrationLayout.addRow("Transform Type: ", transTypeBoxLayout)

    #
    # Automatic Update
    #
    
    autoUpdateBoxLayout = qt.QHBoxLayout()
    self.autoUpdateGroup = qt.QButtonGroup()
    self.autoUpdateOnRadioButton = qt.QRadioButton("ON")
    self.autoUpdateOffRadioButton = qt.QRadioButton("OFF")
    self.autoUpdateOffRadioButton.checked = 1
    autoUpdateBoxLayout.addWidget(self.autoUpdateOnRadioButton)
    self.autoUpdateGroup.addButton(self.autoUpdateOnRadioButton)
    autoUpdateBoxLayout.addWidget(self.autoUpdateOffRadioButton)
    self.autoUpdateGroup.addButton(self.autoUpdateOffRadioButton)

    registrationLayout.addRow("Automatic Update: ", autoUpdateBoxLayout)

    #
    # Overwrite Transform
    #
    
    overwriteTransformBoxLayout = qt.QHBoxLayout()
    self.overwriteTransformGroup = qt.QButtonGroup()
    self.overwriteTransformOnRadioButton = qt.QRadioButton("ON")
    self.overwriteTransformOffRadioButton = qt.QRadioButton("OFF")
    self.overwriteTransformOffRadioButton.checked = 1
    overwriteTransformBoxLayout.addWidget(self.overwriteTransformOnRadioButton)
    self.overwriteTransformGroup.addButton(self.overwriteTransformOnRadioButton)
    overwriteTransformBoxLayout.addWidget(self.overwriteTransformOffRadioButton)
    self.overwriteTransformGroup.addButton(self.overwriteTransformOffRadioButton)

    registrationLayout.addRow("Overwrite Transform: ", overwriteTransformBoxLayout)
    
    #
    # Parameters for point selections
    #

    # Maximum time difference between the corresponding points from the two trackers.
    
    self.maxTimeDifferenceSliderWidget = ctk.ctkSliderWidget()
    self.maxTimeDifferenceSliderWidget.singleStep = 10.0
    self.maxTimeDifferenceSliderWidget.minimum = 0.0
    self.maxTimeDifferenceSliderWidget.maximum = 10000.0
    self.maxTimeDifferenceSliderWidget.value = self.maxTimeDifference * 1000.0
    #self.maxTimeDifferenceSliderWidget.setToolTip("")
    registrationLayout.addRow("Max. Time Diff (ms): ",  self.maxTimeDifferenceSliderWidget)

    # Minimum interval between two consecutive registrations
    self.minIntervalSliderWidget = ctk.ctkSliderWidget()
    self.minIntervalSliderWidget.singleStep = 10.0
    self.minIntervalSliderWidget.minimum = 0.0
    self.minIntervalSliderWidget.maximum = 10000.0
    self.minIntervalSliderWidget.value = self.minInterval * 1000.0
    #self.minIntervalSliderWidget.setToolTip("")
    registrationLayout.addRow("Min. Registration Interval (ms): ",  self.minIntervalSliderWidget)

    # Minimum interval between two consecutive registrations
    self.pointExpirationSliderWidget = ctk.ctkSliderWidget()
    self.pointExpirationSliderWidget.singleStep = 5.0
    self.pointExpirationSliderWidget.minimum = 0.0
    self.pointExpirationSliderWidget.maximum = 1000.0
    self.pointExpirationSliderWidget.value = self.pointExpiration
    #self.minIntervalSliderWidget.setToolTip("")
    registrationLayout.addRow("Point Exp. (s): ",  self.pointExpirationSliderWidget)
    
    #
    # Collect/Clear button
    #
    
    buttonBoxLayout = qt.QHBoxLayout()    

    self.collectButton = qt.QPushButton()
    self.collectButton.setCheckable(False)
    self.collectButton.text = 'Collect'
    self.collectButton.setToolTip("Collect points from the catheters.")
    buttonBoxLayout.addWidget(self.collectButton)
    
    self.clearButton = qt.QPushButton()
    self.clearButton.setCheckable(False)
    self.clearButton.text = 'Clear'
    self.clearButton.setToolTip("Clear the collected points from the list.")
    buttonBoxLayout.addWidget(self.clearButton)
    
    registrationLayout.addRow("", buttonBoxLayout)

    #
    # Registration button
    #
    
    #runBoxLayout = qt.QHBoxLayout()    
    self.runButton = qt.QPushButton()
    self.runButton.setCheckable(False)
    self.runButton.text = 'Run Registration'
    self.runButton.setToolTip("Run fiducial registration.")
    #buttonBoxLayout.addWidget(self.runButton)
    registrationLayout.addRow("", self.runButton)

    #
    # Apply transform
    #
    
    applyTransformBoxLayout = qt.QHBoxLayout()
    self.applyTransformGroup = qt.QButtonGroup()
    self.applyTransformOnRadioButton = qt.QRadioButton("ON")
    self.applyTransformOffRadioButton = qt.QRadioButton("Off")
    self.applyTransformOffRadioButton.checked = 1
    applyTransformBoxLayout.addWidget(self.applyTransformOnRadioButton)
    self.applyTransformGroup.addButton(self.applyTransformOnRadioButton)
    applyTransformBoxLayout.addWidget(self.applyTransformOffRadioButton)
    self.applyTransformGroup.addButton(self.applyTransformOffRadioButton)

    registrationLayout.addRow("Apply Transform: ", applyTransformBoxLayout)

    #
    # Fiducial Registration Error
    #
    self.freLineEdit = qt.QLineEdit()
    self.freLineEdit.text = '--'
    self.freLineEdit.readOnly = True
    self.freLineEdit.frame = True
    self.freLineEdit.styleSheet = "QLineEdit { background:transparent; }"
    
    registrationLayout.addRow("FRE (mm): ", self.freLineEdit)

    #
    # Combined tracking
    #

    self.trackingDataSelector = slicer.qMRMLNodeComboBox()
    self.trackingDataSelector.nodeTypes = ( ("vtkMRMLIGTLTrackingDataBundleNode"), "" )
    self.trackingDataSelector.selectNodeUponCreation = True
    self.trackingDataSelector.addEnabled = True
    self.trackingDataSelector.removeEnabled = False
    self.trackingDataSelector.noneEnabled = True
    self.trackingDataSelector.showHidden = True
    self.trackingDataSelector.showChildNodeTypes = False
    self.trackingDataSelector.setMRMLScene( slicer.mrmlScene )
    self.trackingDataSelector.setToolTip( "Combine tracking data from two sources. The combined data can be used to visualize them as a single catheter." )
    registrationLayout.addRow("Combined Tracking: ", self.trackingDataSelector)

    
    #
    # Connect signals and slots
    #
    self.fromFiducialsSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onFromFiducialsSelected)
    self.toFiducialsSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onToFiducialsSelected)
    self.collectButton.connect(qt.SIGNAL("clicked()"), self.onCollectPoints)
    self.clearButton.connect(qt.SIGNAL("clicked()"), self.onClearPoints)
    self.runButton.connect(qt.SIGNAL("clicked()"), self.onRunRegistration)
    self.visibilityOnRadioButton.connect("clicked(bool)", self.onVisibilityChanged)
    self.visibilityOffRadioButton.connect("clicked(bool)", self.onVisibilityChanged)
    self.applyTransformOnRadioButton.connect("clicked(bool)", self.onApplyTransformChanged)
    self.applyTransformOffRadioButton.connect("clicked(bool)", self.onApplyTransformChanged)
    self.autoUpdateOnRadioButton.connect("clicked(bool)", self.onAutoUpdateChanged)
    self.autoUpdateOffRadioButton.connect("clicked(bool)", self.onAutoUpdateChanged)
    self.maxTimeDifferenceSliderWidget.connect("valueChanged(double)", self.onPointSelectionParametersChanged)
    self.minIntervalSliderWidget.connect("valueChanged(double)", self.onPointSelectionParametersChanged)
    self.pointExpirationSliderWidget.connect("valueChanged(double)", self.onPointSelectionParametersChanged)
    self.trackingDataSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onTrackingDataSelected)
コード例 #22
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        # Setup a logger for the extension log messages (child logger of pyradiomics)
        self.logger = logging.getLogger(radiomics.logger.name + '.slicer')

        # 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.inputVolumeSelector = slicer.qMRMLNodeComboBox()
        self.inputVolumeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode']
        self.inputVolumeSelector.selectNodeUponCreation = True
        self.inputVolumeSelector.addEnabled = False
        self.inputVolumeSelector.removeEnabled = False
        self.inputVolumeSelector.noneEnabled = False
        self.inputVolumeSelector.showHidden = False
        self.inputVolumeSelector.showChildNodeTypes = False
        self.inputVolumeSelector.setMRMLScene(slicer.mrmlScene)
        self.inputVolumeSelector.setToolTip(
            'Pick the input image for the feature calculation.')
        parametersFormLayout.addRow('Input Image Volume: ',
                                    self.inputVolumeSelector)

        #
        # input mask volume selector
        #
        self.inputMaskSelector = slicer.qMRMLNodeComboBox()
        self.inputMaskSelector.nodeTypes = ['vtkMRMLLabelMapVolumeNode']
        self.inputMaskSelector.selectNodeUponCreation = True
        self.inputMaskSelector.addEnabled = False
        self.inputMaskSelector.removeEnabled = False
        self.inputMaskSelector.noneEnabled = True
        self.inputMaskSelector.showHidden = False
        self.inputMaskSelector.showChildNodeTypes = False
        self.inputMaskSelector.setMRMLScene(slicer.mrmlScene)
        self.inputMaskSelector.setToolTip(
            'Pick the input mask for the feature calculation.')
        parametersFormLayout.addRow('Input LabelMap: ', self.inputMaskSelector)

        #
        # input segmentation selector
        #
        self.inputSegmentationSelector = slicer.qMRMLNodeComboBox()
        self.inputSegmentationSelector.nodeTypes = ['vtkMRMLSegmentationNode']
        self.inputSegmentationSelector.selectNodeUponCreation = True
        self.inputSegmentationSelector.addEnabled = False
        self.inputSegmentationSelector.removeEnabled = False
        self.inputSegmentationSelector.noneEnabled = True
        self.inputSegmentationSelector.showHidden = False
        self.inputSegmentationSelector.showChildNodeTypes = False
        self.inputSegmentationSelector.setMRMLScene(slicer.mrmlScene)
        self.inputSegmentationSelector.setToolTip(
            'Pick the input segmentation for the feature calculation.')
        parametersFormLayout.addRow('Input Segmentation: ',
                                    self.inputSegmentationSelector)

        #
        # Feature class selection
        #
        self.featuresLayout = qt.QHBoxLayout()
        parametersFormLayout.addRow('Features:', self.featuresLayout)

        self.featuresButtonGroup = qt.QButtonGroup(self.featuresLayout)
        self.featuresButtonGroup.exclusive = False

        # Get the feature classes dynamically
        self.features = getFeatureClasses().keys()
        # Create a checkbox for each feature
        featureButtons = {}
        for feature in self.features:
            featureButtons[feature] = qt.QCheckBox(feature)
            # TODO: decide which features to enable by default
            featureButtons[feature].checked = False
            if feature == 'firstorder':
                featureButtons[feature].checked = True
            self.featuresButtonGroup.addButton(featureButtons[feature])
            self.featuresLayout.layout().addWidget(featureButtons[feature])
            # set the ID to be the index of this feature in the list
            self.featuresButtonGroup.setId(featureButtons[feature],
                                           self.features.index(feature))

        # Add buttons to select all or none
        self.buttonsLayout = qt.QHBoxLayout()
        parametersFormLayout.addRow('Toggle Features:', self.buttonsLayout)

        self.calculateAllFeaturesButton = qt.QPushButton('All Features')
        self.calculateAllFeaturesButton.toolTip = 'Calculate all feature classes.'
        self.calculateAllFeaturesButton.enabled = True
        self.buttonsLayout.addWidget(self.calculateAllFeaturesButton)
        self.calculateNoFeaturesButton = qt.QPushButton('No Features')
        self.calculateNoFeaturesButton.toolTip = 'Calculate no feature classes.'
        self.calculateNoFeaturesButton.enabled = True
        self.buttonsLayout.addWidget(self.calculateNoFeaturesButton)

        #
        # Feature calculation options
        #
        optionsCollapsibleButton = ctk.ctkCollapsibleButton()
        optionsCollapsibleButton.text = 'Options'
        optionsCollapsibleButton.collapsed = True
        self.layout.addWidget(optionsCollapsibleButton)

        # Layout within the dummy collapsible button
        optionsFormLayout = qt.QFormLayout(optionsCollapsibleButton)

        # bin width, defaults to 25
        self.binWidthSliderWidget = ctk.ctkSliderWidget()
        self.binWidthSliderWidget.singleStep = 1
        self.binWidthSliderWidget.decimals = 0
        self.binWidthSliderWidget.minimum = 1
        self.binWidthSliderWidget.maximum = 100
        self.binWidthSliderWidget.value = 25
        self.binWidthSliderWidget.toolTip = 'Set the bin width'
        optionsFormLayout.addRow('Bin Width', self.binWidthSliderWidget)

        # symmetricalGLCM flag, defaults to false
        self.symmetricalGLCMCheckBox = qt.QCheckBox()
        self.symmetricalGLCMCheckBox.checked = 1
        self.symmetricalGLCMCheckBox.toolTip = 'Use a symmetrical GLCM matrix'
        optionsFormLayout.addRow('Enforce Symmetrical GLCM',
                                 self.symmetricalGLCMCheckBox)

        # label for the mask, defaults to 1
        self.labelSliderWidget = ctk.ctkSliderWidget()
        self.labelSliderWidget.singleStep = 1
        self.labelSliderWidget.decimals = 0
        self.labelSliderWidget.minimum = 0
        self.labelSliderWidget.maximum = 255
        self.labelSliderWidget.value = 1
        self.labelSliderWidget.toolTip = 'Set the label to use for masking the image'
        # optionsFormLayout.addRow('Label', self.labelSliderWidget)

        # debug logging flag, defaults to false
        self.debuggingCheckBox = qt.QCheckBox()
        self.debuggingCheckBox.checked = 0
        self.debuggingCheckBox.toolTip = \
          'If checked, PyRadiomics log messages from level DEBUG and higher will be added to the slicer log'
        optionsFormLayout.addRow('Store debug log', self.debuggingCheckBox)

        #
        # Output table
        #
        outputCollapsibleButton = ctk.ctkCollapsibleButton()
        outputCollapsibleButton.text = 'Output'
        self.layout.addWidget(outputCollapsibleButton)
        outputFormLayout = qt.QFormLayout(outputCollapsibleButton)

        self.outputTableSelector = slicer.qMRMLNodeComboBox()
        self.outputTableSelector.nodeTypes = ['vtkMRMLTableNode']
        self.outputTableSelector.addEnabled = True
        self.outputTableSelector.selectNodeUponCreation = True
        self.outputTableSelector.renameEnabled = True
        self.outputTableSelector.removeEnabled = True
        self.outputTableSelector.noneEnabled = False
        self.outputTableSelector.setMRMLScene(slicer.mrmlScene)
        self.outputTableSelector.toolTip = \
          'Select the table where features will be saved, resets feature values on each run.'
        outputFormLayout.addRow('Output table:', self.outputTableSelector)

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

        # connections
        self.calculateAllFeaturesButton.connect(
            'clicked(bool)', self.onCalculateAllFeaturesButton)
        self.calculateNoFeaturesButton.connect(
            'clicked(bool)', self.onCalculateNoFeaturesButton)
        self.applyButton.connect('clicked(bool)', self.onApplyButton)
        self.inputVolumeSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                         self.onSelect)
        self.inputMaskSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                       self.onSelect)
        self.inputSegmentationSelector.connect(
            'currentNodeChanged(vtkMRMLNode*)', self.onSelect)

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

        # Refresh Apply button state
        self.onSelect()
コード例 #23
0
    def setup(self):
        """This is called one time when the module GUI is initialized
        """
        ScriptedLoadableModuleWidget.setup(self)

        # Create objects that can be used anywhere in the module. Example: in most cases there should be just one
        # object of the logic class
        self.logic = CIP_ParenchymaSubtypeTrainingLogic()
        self.currentVolumeLoaded = None
        self.blockNodeEvents = False

        ##########
        # Main area
        self.mainAreaCollapsibleButton = ctk.ctkCollapsibleButton()
        self.mainAreaCollapsibleButton.text = "Main area"
        self.layout.addWidget(self.mainAreaCollapsibleButton,
                              SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.mainLayout = qt.QGridLayout(self.mainAreaCollapsibleButton)

        # Node selector
        volumeLabel = qt.QLabel("Active volume: ")
        volumeLabel.setStyleSheet("margin-left:5px")
        self.mainLayout.addWidget(volumeLabel, 0, 0)
        self.volumeSelector = slicer.qMRMLNodeComboBox()
        self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "")
        self.volumeSelector.selectNodeUponCreation = True
        self.volumeSelector.autoFillBackground = True
        self.volumeSelector.addEnabled = False
        self.volumeSelector.noneEnabled = False
        self.volumeSelector.removeEnabled = False
        self.volumeSelector.showHidden = False
        self.volumeSelector.showChildNodeTypes = False
        self.volumeSelector.setMRMLScene(slicer.mrmlScene)
        self.volumeSelector.setFixedWidth(250)
        self.volumeSelector.setStyleSheet("margin: 15px 0")
        #self.volumeSelector.selectNodeUponCreation = False
        self.mainLayout.addWidget(self.volumeSelector, 0, 1, 1, 3)

        labelsStyle = "font-weight: bold; margin: 0 0 5px 5px;"
        # Types Radio Buttons
        typesLabel = qt.QLabel("Select the type")
        typesLabel.setStyleSheet(labelsStyle)
        typesLabel.setFixedHeight(15)
        self.mainLayout.addWidget(typesLabel, 1, 0)
        self.typesFrame = qt.QFrame()
        self.typesLayout = qt.QVBoxLayout(self.typesFrame)
        self.mainLayout.addWidget(self.typesFrame, 2, 0,
                                  SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.typesRadioButtonGroup = qt.QButtonGroup()
        for key in self.logic.params.mainTypes.iterkeys():
            rbitem = qt.QRadioButton(self.logic.params.getMainTypeLabel(key))
            self.typesRadioButtonGroup.addButton(rbitem, key)
            self.typesLayout.addWidget(rbitem)
        self.typesRadioButtonGroup.buttons()[0].setChecked(True)

        # Subtypes Radio buttons
        subtypesLabel = qt.QLabel("Select the subtype")
        subtypesLabel.setStyleSheet(labelsStyle)
        subtypesLabel.setFixedHeight(15)
        self.mainLayout.addWidget(subtypesLabel, 1, 1)
        self.subtypesRadioButtonGroup = qt.QButtonGroup()
        self.subtypesFrame = qt.QFrame()
        self.subtypesFrame.setMinimumHeight(275)
        self.subtypesLayout = qt.QVBoxLayout(self.subtypesFrame)
        self.subtypesLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.subtypesLayout.setStretch(0, 0)
        self.mainLayout.addWidget(
            self.subtypesFrame, 2, 1,
            SlicerUtil.ALIGNMENT_VERTICAL_TOP)  # Put the frame in the top
        # The content will be loaded dynamically every time the main type is modified

        # Artifact radio buttons
        self.artifactsLabel = qt.QLabel("Artifact")
        self.artifactsLabel.setStyleSheet(labelsStyle)
        self.artifactsLabel.setFixedHeight(15)
        self.mainLayout.addWidget(self.artifactsLabel, 1, 2)
        #self.mainLayout.addWidget(qt.QLabel("Select the artifact"), 1, 1)
        self.artifactsRadioButtonGroup = qt.QButtonGroup()
        self.artifactsFrame = qt.QFrame()
        self.artifactsLayout = qt.QVBoxLayout(self.artifactsFrame)
        self.mainLayout.addWidget(self.artifactsFrame, 2, 2,
                                  SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.artifactsRadioButtonGroup = qt.QButtonGroup()
        for artifactId in self.logic.params.artifacts.iterkeys():
            rbitem = qt.QRadioButton(
                self.logic.params.getArtifactLabel(artifactId))
            self.artifactsRadioButtonGroup.addButton(rbitem, artifactId)
            self.artifactsLayout.addWidget(rbitem)
        self.artifactsRadioButtonGroup.buttons()[0].setChecked(True)

        # Load caselist button
        self.loadButton = ctk.ctkPushButton()
        self.loadButton.text = "Load fiducials file"
        self.loadButton.setIcon(
            qt.QIcon("{0}/open_file.png".format(SlicerUtil.CIP_ICON_DIR)))
        self.loadButton.setIconSize(qt.QSize(20, 20))
        self.loadButton.setFixedWidth(135)
        self.mainLayout.addWidget(self.loadButton, 3, 0)

        # Remove fiducial button
        self.removeLastFiducialButton = ctk.ctkPushButton()
        self.removeLastFiducialButton.text = "Remove last fiducial"
        self.removeLastFiducialButton.toolTip = "Remove the last fiducial added"
        self.removeLastFiducialButton.setIcon(
            qt.QIcon("{0}/delete.png".format(SlicerUtil.CIP_ICON_DIR)))
        self.removeLastFiducialButton.setIconSize(qt.QSize(20, 20))
        self.removeLastFiducialButton.setFixedWidth(200)
        self.mainLayout.addWidget(self.removeLastFiducialButton, 3, 1)

        # Save results button
        self.saveResultsButton = ctk.ctkPushButton()
        self.saveResultsButton.setText("Save markups")
        self.saveResultsButton.toolTip = "Save the markups in the specified directory"
        self.saveResultsButton.setIcon(
            qt.QIcon("{0}/Save.png".format(SlicerUtil.CIP_ICON_DIR)))
        self.saveResultsButton.setIconSize(qt.QSize(20, 20))
        self.mainLayout.addWidget(self.saveResultsButton, 4, 0)

        # Save results directory button
        defaultPath = os.path.join(
            SlicerUtil.getSettingsDataFolder(self.moduleName),
            "results")  # Assign a default path for the results
        path = SlicerUtil.settingGetOrSetDefault(self.moduleName,
                                                 "SaveResultsDirectory",
                                                 defaultPath)
        self.saveResultsDirectoryButton = ctk.ctkDirectoryButton()
        self.saveResultsDirectoryButton.directory = path
        self.saveResultsDirectoryButton.setMaximumWidth(375)
        self.mainLayout.addWidget(self.saveResultsDirectoryButton, 4, 1, 1, 2)

        #####
        # Case navigator
        self.caseNavigatorWidget = None
        if SlicerUtil.isSlicerACILLoaded():
            caseNavigatorAreaCollapsibleButton = ctk.ctkCollapsibleButton()
            caseNavigatorAreaCollapsibleButton.text = "Case navigator"
            self.layout.addWidget(caseNavigatorAreaCollapsibleButton, 0x0020)
            # caseNavigatorLayout = qt.QVBoxLayout(caseNavigatorAreaCollapsibleButton)

            # Add a case list navigator
            from ACIL.ui import CaseNavigatorWidget
            self.caseNavigatorWidget = CaseNavigatorWidget(
                self.moduleName, caseNavigatorAreaCollapsibleButton)
            self.caseNavigatorWidget.setup()
            # Listen for the event of loading a new labelmap
            self.caseNavigatorWidget.addObservable(
                self.caseNavigatorWidget.EVENT_LABELMAP_LOADED,
                self.__onNewILDClassificationLabelmapLoaded__)

        self.layout.addStretch()

        self.updateState()

        # Connections
        self.typesRadioButtonGroup.connect("buttonClicked (QAbstractButton*)",
                                           self.__onTypesRadioButtonClicked__)
        self.subtypesRadioButtonGroup.connect(
            "buttonClicked (QAbstractButton*)",
            self.__onSubtypesRadioButtonClicked__)
        self.artifactsRadioButtonGroup.connect(
            "buttonClicked (QAbstractButton*)",
            self.__onSubtypesRadioButtonClicked__)

        self.volumeSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                    self.__onCurrentNodeChanged__)
        self.loadButton.connect('clicked()', self.openFiducialsFile)
        self.removeLastFiducialButton.connect(
            'clicked()', self.__onRemoveLastFiducialButtonClicked__)
        # self.saveResultsOpenDirectoryDialogButton.connect('clicked()', self.onOpenDirectoryDialogButtonClicked)
        self.saveResultsDirectoryButton.connect(
            "directoryChanged (QString)",
            self.__onSaveResultsDirectoryChanged__)
        self.saveResultsButton.connect('clicked()',
                                       self.__onSaveResultsButtonClicked__)

        self.observers = []
        self.observers.append(
            slicer.mrmlScene.AddObserver(slicer.vtkMRMLScene.NodeAddedEvent,
                                         self.__onNodeAddedObserver__))
        self.observers.append(
            slicer.mrmlScene.AddObserver(slicer.vtkMRMLScene.EndCloseEvent,
                                         self.__onSceneClosed__))
コード例 #24
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        self.logic = NeuroSegmentLogic()

        uiWidget = slicer.util.loadUI(self.resourcePath('UI/NeuroSegment.ui'))
        self.layout.addWidget(uiWidget)
        self.ui = slicer.util.childWidgetVariables(uiWidget)
        self.ui.segmentEditorWidget.connect(
            "masterVolumeNodeChanged (vtkMRMLVolumeNode *)",
            self.onMasterVolumeNodeChanged)
        self.ui.undockSliceViewButton.connect('clicked()',
                                              self.toggleSliceViews)
        self.ui.infoExpandableWidget.setVisible(False)

        self.segmentationNodeComboBox = self.ui.segmentEditorWidget.findChild(
            slicer.qMRMLNodeComboBox, "SegmentationNodeComboBox")
        self.segmentationNodeComboBox.nodeAddedByUser.connect(
            self.onNodeAddedByUser)

        self.neuroSegHistogramMethodButtonGroup = qt.QButtonGroup()
        self.neuroSegHistogramMethodButtonGroup.setExclusive(True)

        thresholdEffects = [
            self.ui.segmentEditorWidget.effectByName("Threshold"),
            self.ui.segmentEditorWidget.effectByName("LocalThreshold")
        ]
        for thresholdEffect in thresholdEffects:
            if thresholdEffect is None:
                continue

            lowerLayout = thresholdEffect.self(
            ).histogramLowerThresholdAverageButton.parentWidget().layout()
            upperLayout = thresholdEffect.self(
            ).histogramUpperThresholdAverageButton.parentWidget().layout()

            thresholdEffect.self().histogramLowerThresholdAverageButton.hide()
            thresholdEffect.self().histogramLowerThresholdLowerButton.hide()
            thresholdEffect.self().histogramLowerThresholdMinimumButton.hide()
            thresholdEffect.self().histogramUpperThresholdAverageButton.hide()
            thresholdEffect.self().histogramUpperThresholdUpperButton.hide()
            thresholdEffect.self().histogramUpperThresholdMaximumButton.hide()

            self.histogramMinAverageThresholdButton = qt.QPushButton()
            self.histogramMinAverageThresholdButton.setText(
                "Minimum to average")
            self.histogramMinAverageThresholdButton.setCheckable(True)
            self.histogramMinAverageThresholdButton.clicked.connect(
                self.updateHistogram)
            self.histogramMinAverageThresholdButton.checked = True
            lowerLayout.addWidget(self.histogramMinAverageThresholdButton)
            self.neuroSegHistogramMethodButtonGroup.addButton(
                self.histogramMinAverageThresholdButton)

            self.histogramAverageMaxThresholdButton = qt.QPushButton()
            self.histogramAverageMaxThresholdButton.setText(
                "Average to maximum")
            self.histogramAverageMaxThresholdButton.setCheckable(True)
            self.histogramAverageMaxThresholdButton.clicked.connect(
                self.updateHistogram)
            self.histogramMinAverageThresholdButton.checked = False
            upperLayout.addWidget(self.histogramAverageMaxThresholdButton)
            self.neuroSegHistogramMethodButtonGroup.addButton(
                self.histogramAverageMaxThresholdButton)

        self.selectSegmentEditorParameterNode()
        uiWidget.setMRMLScene(slicer.mrmlScene)

        self.mainViewWidget3DButton = qt.QPushButton("3D")
        self.mainViewWidget3DButton.setCheckable(True)
        self.mainViewWidget3DButton.connect('clicked()', self.updateMainView)

        self.mainSliceViewName = "Main"
        self.main3DViewName = "ViewM"
        self.secondarySliceViewNames = ["Red2", "Green2", "Yellow2"]
        self.allSliceViewNames = [self.mainSliceViewName
                                  ] + self.secondarySliceViewNames

        self.sliceViewWidget = None
        self.setupLayout()

        layoutManager = slicer.app.layoutManager()
        layoutManager.connect('layoutChanged(int)', self.onLayoutChanged)
        self.previousLayout = layoutManager.layout
        if self.previousLayout == NeuroSegmentWidget.NEURO_SEGMENT_WIDGET_LAYOUT_ID:
            self.previousLayout = 0

        self.addObserver(slicer.mrmlScene, slicer.mrmlScene.StartCloseEvent,
                         self.onSceneStartClose)
        self.addObserver(slicer.mrmlScene, slicer.mrmlScene.EndCloseEvent,
                         self.onSceneEndClose)
        self.addObserver(slicer.mrmlScene, slicer.mrmlScene.EndImportEvent,
                         self.onSceneEndImport)

        self.clickedView = None
        self.clickTimer = qt.QTimer()
        self.clickTimer.setInterval(300)
        self.clickTimer.setSingleShot(True)
        self.clickTimer.timeout.connect(self.switchMainView)
        self.clickNonResponsive = False
        self.clickNonResponseTimer = qt.QTimer()
        self.clickNonResponseTimer.setInterval(200)
        self.clickNonResponseTimer.setSingleShot(True)
        self.clickNonResponseTimer.timeout.connect(self.clickNonResponseOff)
        self.sliceViewClickObservers = []

        self.defaultSegmentationFileName = self.getPath(
        ) + "/Resources/Segmentations/DefaultSegmentation.seg.nrrd"
コード例 #25
0
    def setup(self):
        """Init the widget """
        # self.firstLoad = True
        ScriptedLoadableModuleWidget.setup(self)
        self.disableEvents = False


        # Create objects that can be used anywhere in the module. Example: in most cases there should be just one
        # object of the logic class
        self._initLogic_()

        ##########
        # Main area
        self.mainAreaCollapsibleButton = ctk.ctkCollapsibleButton()
        self.mainAreaCollapsibleButton.text = "Main area"
        self.layout.addWidget(self.mainAreaCollapsibleButton, SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        # self.layout.addWidget(self.mainAreaCollapsibleButton)
        # self.mainLayout = qt.QGridLayout(self.mainAreaCollapsibleButton)
        self.mainLayout = qt.QFormLayout(self.mainAreaCollapsibleButton)
        row = 0

        # Node selector
        volumeLabel = qt.QLabel("Active volume: ")
        volumeLabel.setStyleSheet("margin-left:5px")
        # self.mainLayout.addWidget(volumeLabel, row, 0)

        self.volumeSelector = slicer.qMRMLNodeComboBox()
        self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "")
        self.volumeSelector.selectNodeUponCreation = True
        self.volumeSelector.autoFillBackground = True
        self.volumeSelector.addEnabled = False
        self.volumeSelector.noneEnabled = False
        self.volumeSelector.removeEnabled = False
        self.volumeSelector.showHidden = False
        self.volumeSelector.showChildNodeTypes = False
        self.volumeSelector.setMRMLScene(slicer.mrmlScene)
        self.volumeSelector.setMinimumWidth(150)
        # self.volumeSelector.setStyleSheet("margin: 15px 0")
        # self.volumeSelector.selectNodeUponCreation = False
        #self.mainLayout.addWidget(self.volumeSelector, row, 1)
        self.mainLayout.addRow(volumeLabel, self.volumeSelector)
        self.volumeSelector.connect('currentNodeChanged(vtkMRMLNode*)', self._onMainVolumeChanged_)

        row += 1
        lb = qt.QLabel("Click to select the calibration type and, if needed, modify the HU value expected for that area")
        lb.setStyleSheet("margin:10px 0 10px 5px")
        self.mainLayout.addRow(lb)
        #self.mainLayout.addWidget(lb, row, 0, 1, 2)

        self.typeRadioButtonGroup = qt.QButtonGroup()
        self.typeRadioButtonGroup.connect("buttonClicked (QAbstractButton*)", self.__onTypeRadioButtonClicked__)
        row += 1
        self.rbAir = qt.QRadioButton("Air")
        self.rbAir.setStyleSheet("margin-left:10px; margin-top: 5px")
        self.typeRadioButtonGroup.addButton(self.rbAir, 1)
        # self.mainLayout.addWidget(self.rbAir, row, 0)

        self.txtAir = qt.QLineEdit()
        self.txtAir.setText("-1000")
        self.txtAir.setFixedWidth(80)
        self.txtAir.setValidator(qt.QIntValidator())
        self.mainLayout.addRow(self.rbAir, self.txtAir)


        row += 1
        self.rbBlood = qt.QRadioButton("Blood")
        self.rbBlood.setStyleSheet("margin-left:10px; margin-top: 5px")
        self.typeRadioButtonGroup.addButton(self.rbBlood, 2)
        # self.mainLayout.addWidget(self.rbBlood, row, 0)

        self.txtBlood = qt.QLineEdit()
        self.txtBlood.setText("50")
        self.txtBlood.setFixedWidth(80)
        self.txtBlood.setValidator(qt.QIntValidator())
        # self.mainLayout.addWidget(self.txtBlood, row, 1)
        self.mainLayout.addRow(self.rbBlood, self.txtBlood)
        row += 1

        # Calibrate button
        self.calibrateButton = ctk.ctkPushButton()
        self.calibrateButton.setText("Calibrate")
        self.calibrateButton.toolTip = "Run the calibration"
        self.calibrateButton.setIcon(qt.QIcon("{0}/scale.png".format(SlicerUtil.CIP_ICON_DIR)))
        self.calibrateButton.setIconSize(qt.QSize(20, 20))
        self.calibrateButton.setFixedWidth(135)
        self.mainLayout.addRow(None, self.calibrateButton)
        self.calibrateButton.connect('clicked()', self._onCalibrateButtonClicked_)

        self._createEditorWidget_()
        self.setEditorValues()
コード例 #26
0
    def buildGUI(self, parent):

        #resliceGroupBox = ctk.ctkCollapsibleGroupBox()
        #resliceGroupBox.title = self.label
        #parent.addWidget(resliceGroupBox)
        resliceLayout = qt.QFormLayout(parent)

        # Tracking node selector
        self.resliceTrackingDataSelector = slicer.qMRMLNodeComboBox()
        self.resliceTrackingDataSelector.nodeTypes = ((
            "vtkMRMLIGTLTrackingDataBundleNode"), "")
        self.resliceTrackingDataSelector.selectNodeUponCreation = True
        self.resliceTrackingDataSelector.addEnabled = True
        self.resliceTrackingDataSelector.removeEnabled = False
        self.resliceTrackingDataSelector.noneEnabled = False
        self.resliceTrackingDataSelector.showHidden = True
        self.resliceTrackingDataSelector.showChildNodeTypes = False
        self.resliceTrackingDataSelector.setMRMLScene(slicer.mrmlScene)
        self.resliceTrackingDataSelector.setToolTip(
            "Tracking Data for Reslicing")
        resliceLayout.addRow("Tracking Data: ",
                             self.resliceTrackingDataSelector)

        self.resliceCathRadioButton = [None] * self.nCath
        self.resliceCathBoxLayout = qt.QHBoxLayout()
        self.resliceCathGroup = qt.QButtonGroup()
        for cath in range(self.nCath):
            self.resliceCathRadioButton[cath] = qt.QRadioButton("Cath %d" %
                                                                cath)
            if cath == self.resliceCath:
                self.resliceCathRadioButton[cath].checked = 0
            self.resliceCathBoxLayout.addWidget(
                self.resliceCathRadioButton[cath])
            self.resliceCathGroup.addButton(self.resliceCathRadioButton[cath])

        resliceLayout.addRow("Catheter:", self.resliceCathBoxLayout)

        self.resliceAxCheckBox = qt.QCheckBox()
        self.resliceAxCheckBox.checked = 0
        self.resliceAxCheckBox.text = "AX"
        self.resliceSagCheckBox = qt.QCheckBox()
        self.resliceSagCheckBox.checked = 0
        self.resliceSagCheckBox.text = "SAG"
        self.resliceCorCheckBox = qt.QCheckBox()
        self.resliceCorCheckBox.checked = 0
        self.resliceCorCheckBox.text = "COR"

        self.resliceBoxLayout = qt.QHBoxLayout()
        self.resliceBoxLayout.addWidget(self.resliceAxCheckBox)
        self.resliceBoxLayout.addWidget(self.resliceSagCheckBox)
        self.resliceBoxLayout.addWidget(self.resliceCorCheckBox)
        resliceLayout.addRow("Plane:", self.resliceBoxLayout)

        self.resliceTrackingDataSelector.connect(
            "currentNodeChanged(vtkMRMLNode*)", self.onTrackingDataSelected)
        self.resliceAxCheckBox.connect('toggled(bool)', self.onResliceChecked)
        self.resliceSagCheckBox.connect('toggled(bool)', self.onResliceChecked)
        self.resliceCorCheckBox.connect('toggled(bool)', self.onResliceChecked)

        for cath in range(self.nCath):
            self.resliceCathRadioButton[cath].connect('clicked(bool)',
                                                      self.onSelectResliceCath)
コード例 #27
0
    def buildGUI(self, parent):

        registrationLayout = qt.QFormLayout(parent)

        self.fromTrackingDataSelector = slicer.qMRMLNodeComboBox()
        self.fromTrackingDataSelector.nodeTypes = ((
            "vtkMRMLIGTLTrackingDataBundleNode"), "")
        self.fromTrackingDataSelector.selectNodeUponCreation = True
        self.fromTrackingDataSelector.addEnabled = True
        self.fromTrackingDataSelector.removeEnabled = False
        self.fromTrackingDataSelector.noneEnabled = False
        self.fromTrackingDataSelector.showHidden = True
        self.fromTrackingDataSelector.showChildNodeTypes = False
        self.fromTrackingDataSelector.setMRMLScene(slicer.mrmlScene)
        self.fromTrackingDataSelector.setToolTip("Tracking Data (From)")
        registrationLayout.addRow("TrackingData (From): ",
                                  self.fromTrackingDataSelector)

        self.toTrackingDataSelector = slicer.qMRMLNodeComboBox()
        self.toTrackingDataSelector.nodeTypes = ((
            "vtkMRMLIGTLTrackingDataBundleNode"), "")
        self.toTrackingDataSelector.selectNodeUponCreation = True
        self.toTrackingDataSelector.addEnabled = True
        self.toTrackingDataSelector.removeEnabled = False
        self.toTrackingDataSelector.noneEnabled = False
        self.toTrackingDataSelector.showHidden = True
        self.toTrackingDataSelector.showChildNodeTypes = False
        self.toTrackingDataSelector.setMRMLScene(slicer.mrmlScene)
        self.toTrackingDataSelector.setToolTip("Tracking data (To)")
        registrationLayout.addRow("TrackingData (To): ",
                                  self.toTrackingDataSelector)

        pointBoxLayout = qt.QHBoxLayout()
        self.pointGroup = qt.QButtonGroup()

        self.useTipRadioButton = qt.QRadioButton("Tip")
        self.useAllRadioButton = qt.QRadioButton("All ")
        self.useTipRadioButton.checked = 1
        pointBoxLayout.addWidget(self.useTipRadioButton)
        self.pointGroup.addButton(self.useTipRadioButton)
        pointBoxLayout.addWidget(self.useAllRadioButton)
        self.pointGroup.addButton(self.useAllRadioButton)

        registrationLayout.addRow("Points: ", pointBoxLayout)

        #
        # Fiducial points visibility
        #

        visibilityBoxLayout = qt.QHBoxLayout()
        self.visibilityGroup = qt.QButtonGroup()
        self.visibilityOnRadioButton = qt.QRadioButton("ON")
        self.visibilityOffRadioButton = qt.QRadioButton("Off")
        self.visibilityOnRadioButton.checked = 1
        visibilityBoxLayout.addWidget(self.visibilityOnRadioButton)
        self.visibilityGroup.addButton(self.visibilityOnRadioButton)
        visibilityBoxLayout.addWidget(self.visibilityOffRadioButton)
        self.visibilityGroup.addButton(self.visibilityOffRadioButton)

        registrationLayout.addRow("Visibility: ", visibilityBoxLayout)

        #
        # Collect/Clear button
        #

        buttonBoxLayout = qt.QHBoxLayout()

        self.collectButton = qt.QPushButton()
        self.collectButton.setCheckable(False)
        self.collectButton.text = 'Collect'
        self.collectButton.setToolTip("Collect points from the catheters.")
        buttonBoxLayout.addWidget(self.collectButton)

        self.clearButton = qt.QPushButton()
        self.clearButton.setCheckable(False)
        self.clearButton.text = 'Clear'
        self.clearButton.setToolTip(
            "Clear the collected points from the list.")
        buttonBoxLayout.addWidget(self.clearButton)

        registrationLayout.addRow("", buttonBoxLayout)

        #
        # Registration button
        #

        #runBoxLayout = qt.QHBoxLayout()
        self.runButton = qt.QPushButton()
        self.runButton.setCheckable(False)
        self.runButton.text = 'Run Registration'
        self.runButton.setToolTip("Run fiducial registration.")
        #buttonBoxLayout.addWidget(self.runButton)
        registrationLayout.addRow("", self.runButton)

        #
        # Connect signals and slots
        #
        self.fromTrackingDataSelector.connect(
            "currentNodeChanged(vtkMRMLNode*)",
            self.onTrackingDataFromSelected)
        self.toTrackingDataSelector.connect("currentNodeChanged(vtkMRMLNode*)",
                                            self.onTrackingDataToSelected)
        self.collectButton.connect(qt.SIGNAL("clicked()"),
                                   self.onCollectPoints)
        self.clearButton.connect(qt.SIGNAL("clicked()"), self.onClearPoints)
        self.runButton.connect(qt.SIGNAL("clicked()"), self.onRunRegistration)
        self.visibilityOnRadioButton.connect("clicked(bool)",
                                             self.onVisibilityChanged)
        self.visibilityOffRadioButton.connect("clicked(bool)",
                                              self.onVisibilityChanged)
コード例 #28
0
ファイル: interactive.py プロジェクト: bluelightning/smart
    def __init__(self, ctrl, argv=None):
        QtInterface.__init__(self, ctrl, argv)

        self._changeset = None

        self._window = qt.QMainWindow()
        self._window.setCaption("Smart Package Manager %s" % VERSION)
        centerWindow(self._window)
        self._window.setMinimumSize(640, 480)
        app.connect(app, qt.SIGNAL('lastWindowClosed()'), app, qt.SLOT('quit()'))

        self._undo = []
        self._redo = []

        globals = {"self": self, "qt": qt}
        group = qt.QActionGroup(self._window, "Actions")
        self._actions = compileActions(group, ACTIONS, globals)

        class ToggleAction(qt.QAction):
        
            def __init__(self, group, name, label):
                qt.QAction.__init__(self, group, name)
                self.setToggleAction(True)
                self.setMenuText(label.replace("&","&&"))
                self._name = name
            
            def connect(self, signal, callback, userdata):
                self._callback = callback
                self._userdata = userdata
                qt.QObject.connect(self, qt.SIGNAL(signal), self.slot)
            
            def slot(self):
                self._callback(self._userdata)
         
        self._filters = {}
        for name, label in [("hide-non-upgrades", _("Hide Non-upgrades")),
                            ("hide-installed", _("Hide Installed")),
                            ("hide-uninstalled", _("Hide Uninstalled")),
                            ("hide-unmarked", _("Hide Unmarked")),
                            ("hide-unlocked", _("Hide Unlocked")),
                            ("hide-requested", _("Hide Requested")),
                            ("hide-old", _("Hide Old"))]:
            act = ToggleAction(None, name, label)
            act.connect("activated()", self.toggleFilter, name)
            self._actions[name] = act

        treestyle = sysconf.get("package-tree")
        for name, label in [("groups", _("Groups")),
                            ("channels", _("Channels")),
                            ("channels-groups", _("Channels & Groups")),
                            ("none", _("None"))]:
            act = ToggleAction(group, "tree-style-"+name, label)
            if name == treestyle:
                act.setOn(True)
            act.connect("activated()", self.setTreeStyle, name)
            self._actions["tree-style-"+name] = act

        self._menubar = self._window.menuBar()
        for MENU in MENUBAR:
             def insertmenu(menubar, menu):
                item = menu[0]
                action = self._actions[item]
                m = qt.QPopupMenu(menubar)
                text = action.menuText()
                menubar.insertItem(text, m)
                for item in menu[1]:
                    if isinstance(item, tuple):
                        insertmenu(m, item)
                    elif item:
                        action = self._actions[item]
                        #i = qt.QPopupMenu(m)
                        #text = action.menuText()
                        #m.insertItem(text, i)
                        action.addTo(m)
                    else:
                        m.insertSeparator()
             insertmenu(self._menubar, MENU)

        self._toolbar = qt.QToolBar(self._window)
        for TOOL in TOOLBAR:
            def inserttool(toolbar, tool):
                if tool:
                    action = self._actions[tool]
                    #b = qt.QToolButton(toolbar, TOOL)
                    #b.setTextLabel(action.toolTip())
                    pixmap = getPixmap(TOOLBARICONS[tool])
                    #b.setIconSet(qt.QIconSet(pixmap))
                    action.setIconSet(qt.QIconSet(pixmap))
                    action.addTo(toolbar)
                else:
                    toolbar.addSeparator()
            inserttool(self._toolbar, TOOL)

        #self._window.add_accel_group(self._ui.get_accel_group())

        self._actions["exec-changes"].setAccel(qt.QKeySequence("Ctrl+C"))
        self._actions["find"].setAccel(qt.QKeySequence("Ctrl+F"))
        self._actions["expand-all"].setAccel(qt.QKeySequence("Ctrl+O"))
        self._actions["collapse-all"].setAccel(qt.QKeySequence("Ctrl+W"))
        self._actions["summary-window"].setAccel(qt.QKeySequence("Ctrl+S"))

        self._actions["exec-changes"].setEnabled(False)
        self._actions["clear-changes"].setEnabled(False)
        self._actions["undo"].setEnabled(False)
        self._actions["redo"].setEnabled(False)

        # Search bar

        self._searchbar = qt.QToolBar(self._window)
        self._searchbar.hide()
       
        label = qt.QLabel(_("Search:"), self._searchbar)
        label.show()

        self._searchentry = qt.QLineEdit(self._searchbar)
        qt.QObject.connect(self._searchentry, qt.SIGNAL("returnPressed()"), self.refreshPackages)
        self._searchentry.show()

        button = qt.QPushButton(self._searchbar)
        qt.QObject.connect(button, qt.SIGNAL("clicked()"), self.refreshPackages)
        pixmap = getPixmap("crystal-search")
        button.setIconSet(qt.QIconSet(pixmap))
        button.show()

        buttongroup = qt.QButtonGroup(self._searchbar)
        buttongroup.hide()
        
        self._searchname = qt.QRadioButton(_("Automatic"), self._searchbar)
        self._searchname.setChecked(True)
        qt.QObject.connect(self._searchname, qt.SIGNAL("clicked()"), self.refreshPackages)
        buttongroup.insert(self._searchname)
        self._searchname.show()
        self._searchdesc = qt.QRadioButton(_("Description"), self._searchbar)
        self._searchdesc.setChecked(False)
        qt.QObject.connect(self._searchdesc, qt.SIGNAL("clicked()"), self.refreshPackages)
        self._searchdesc.show()
        buttongroup.insert(self._searchdesc)

        # Packages and information

        self._splitter = qt.QSplitter(qt.Qt.Vertical, self._window)
        self._window.setCentralWidget(self._splitter)
        
        self._pv = QtPackageView(self._splitter)
        self._pv.show()

        self._pi = QtPackageInfo(self._splitter)
        self._pi.show()
        qt.QObject.connect(self._pv, qt.PYSIGNAL("packageSelected"), self._pi.setPackage)
        qt.QObject.connect(self._pv, qt.PYSIGNAL("packageActivated"), self.actOnPackages)
        qt.QObject.connect(self._pv, qt.PYSIGNAL("packagePopup"), self.packagePopup)

        self._status = self._window.statusBar()
        self._status.show()
        
        self._legend = QtLegend(self._window)
コード例 #29
0
    def setup(self):
        """This is called one time when the module GUI is initialized
        """
        CIP_PointsLabellingWidget.setup(self)

        # Part of the GUI will be inherited. We just fill the radio buttons area
        # Radio buttons frame
        self.radioButtonsLayout = qt.QHBoxLayout(self.radioButtonsFrame)
        self.typesFrame = qt.QFrame()
        self.radioButtonsLayout.addWidget(self.typesFrame)
        self.typesLayout = qt.QVBoxLayout(self.typesFrame)

        labelsStyle = "font-weight: bold; margin: 0 0 10px 0px;"
        # Types Radio Buttons
        typesLabel = qt.QLabel("Select type")
        typesLabel.setStyleSheet(labelsStyle)
        self.typesLayout.addWidget(typesLabel)
        self.typesRadioButtonGroup = qt.QButtonGroup()
        for key in self.logic.params.mainTypes.iterkeys():
            rbitem = qt.QRadioButton(self.logic.params.getMainTypeLabel(key))
            self.typesRadioButtonGroup.addButton(rbitem, key)
            self.typesLayout.addWidget(rbitem)
        self.typesRadioButtonGroup.buttons()[0].setChecked(True)

        # Subtypes Radio buttons
        # The content will be loaded dynamically every time the main type is modified
        self.subtypesFrame = qt.QFrame()
        self.radioButtonsLayout.addWidget(self.subtypesFrame)
        self.subtypesLayout = qt.QVBoxLayout(self.subtypesFrame)
        subtypesLabel = qt.QLabel("Select subtype")
        subtypesLabel.setStyleSheet(labelsStyle)
        self.subtypesLayout.addWidget(subtypesLabel)
        self.subtypesLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.subtypesRadioButtonGroup = qt.QButtonGroup()
        # Add all the subtypes (we will filter later in "updateState" function)
        for key in self.logic.params.subtypes.iterkeys():
            # Build the description
            rbitem = qt.QRadioButton(self.logic.params.getSubtypeLabel(key))
            self.subtypesRadioButtonGroup.addButton(rbitem, key)
            self.subtypesLayout.addWidget(rbitem, SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.subtypesLayout.addStretch()

        # Region radio buttons
        self.regionsFrame = qt.QFrame()
        self.radioButtonsLayout.addWidget(self.regionsFrame)
        self.regionsLayout = qt.QVBoxLayout(self.regionsFrame)
        regionsLabel = qt.QLabel("Select region")
        regionsLabel.setStyleSheet(labelsStyle)
        self.regionsLayout.addWidget(regionsLabel)
        self.regionsLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.regionsLayout.setStretch(0, 0)
        self.regionsRadioButtonGroup = qt.QButtonGroup()
        self.regionsFrame = qt.QFrame()
        # Add all the regions
        for key in self.logic.params.regions.iterkeys():
            # Build the description
            rbitem = qt.QRadioButton(self.logic.params.getRegionLabel(key))
            self.regionsRadioButtonGroup.addButton(rbitem, key)
            self.regionsLayout.addWidget(rbitem, SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.regionsLayout.addStretch()
        self.regionsRadioButtonGroup.buttons()[0].setChecked(True)

        # Artifact radio buttons (Add them to the same layout as the type)
        self.separatorLabel = qt.QLabel("------------")
        labelsStyle = "margin: 5px 0 5px 0;"
        self.separatorLabel.setStyleSheet(labelsStyle)
        self.typesLayout.addWidget(self.separatorLabel)
        self.artifactsLabel = qt.QLabel("Select artifact")
        labelsStyle = "font-weight: bold; margin: 15px 0 10px 0;"
        self.artifactsLabel.setStyleSheet(labelsStyle)
        self.typesLayout.addWidget(self.artifactsLabel)
        self.artifactsRadioButtonGroup = qt.QButtonGroup()
        for artifactId in self.logic.params.artifacts.iterkeys():
            rbitem = qt.QRadioButton(self.logic.params.getArtifactLabel(artifactId))
            self.artifactsRadioButtonGroup.addButton(rbitem, artifactId)
            self.typesLayout.addWidget(rbitem)
        self.artifactsRadioButtonGroup.buttons()[0].setChecked(True)

        self.typesLayout.setAlignment(SlicerUtil.ALIGNMENT_VERTICAL_TOP)
        self.typesLayout.addStretch()

        # Connections
        self.typesRadioButtonGroup.connect("buttonClicked (QAbstractButton*)", self.__onTypesRadioButtonClicked__)
        self.subtypesRadioButtonGroup.connect("buttonClicked (QAbstractButton*)",
                                              self.__onSecondaryRadioButtonClicked__)
        self.regionsRadioButtonGroup.connect("buttonClicked (QAbstractButton*)", self.__onSecondaryRadioButtonClicked__)
        self.artifactsRadioButtonGroup.connect("buttonClicked (QAbstractButton*)",
                                               self.__onSecondaryRadioButtonClicked__)

        self.updateState()
コード例 #30
0
ファイル: TraceAndSelect.py プロジェクト: FastSlice/Extension
    def create(self):
        super(TraceAndSelectOptions, self).create()

        ## Custom threshold box
        # Note: This is needed because other tools can disable, hide, or manipulate the default threshold box
        # We need one unique to our tool
        self.threshLabel = qt.QLabel("Threshold", self.frame)
        self.threshLabel.setToolTip(
            "In threshold mode, the label will only be set if the background value is within this range."
        )
        self.frame.layout().addWidget(self.threshLabel)
        self.widgets.append(self.threshLabel)
        self.thresh = ctk.ctkRangeWidget(self.frame)
        self.thresh.spinBoxAlignment = 0xff  # put enties on top
        self.thresh.singleStep = 0.01
        self.setRangeWidgetToBackgroundRange(self.thresh)
        self.frame.layout().addWidget(self.thresh)
        self.widgets.append(self.thresh)
        ## End custom threshold box

        ## Preview checkbox
        self.preview = qt.QCheckBox("Preview outlines", self.frame)
        self.preview.setToolTip(
            "Preview the outline of a selection with right-click.")
        self.frame.layout().addWidget(self.preview)
        ## End preview checkbox

        self.modeButtons = qt.QButtonGroup(self.frame)
        self.tissueRadioButton = qt.QRadioButton("Tissue Mode", self.frame)
        self.boneRadioButton = qt.QRadioButton("Bone/Nerve Mode", self.frame)
        self.hbox = qt.QHBoxLayout()
        self.hbox.addWidget(self.boneRadioButton)
        self.hbox.addWidget(self.tissueRadioButton)
        self.frame.layout().addLayout(self.hbox)
        self.modeButtons.addButton(self.boneRadioButton)
        self.modeButtons.addButton(self.tissueRadioButton)

        self.widgets.append(self.tissueRadioButton)
        self.widgets.append(self.boneRadioButton)

        ## ERROR MESSAGE FRAME
        self.errorMessageFrame = qt.QTextEdit(self.frame)
        self.frame.layout().addWidget(self.errorMessageFrame)
        #self.errorMessageFrame.setLayout(qt.QHBoxLayout)
        self.errorMessageFrame.setFixedWidth(280)
        self.errorMessageFrame.setReadOnly(True)
        self.errorMessageFrame.setText('No Error Detected')
        self.errorMessageFrame.setStyleSheet("QTextEdit {color:green}")
        self.widgets.append(self.errorMessageFrame)
        ## END ERROR MESSAGE FRAME

        ## For the offset value selection process
        self.offsetvalueFrame = qt.QFrame(self.frame)
        self.offsetvalueFrame.setLayout(qt.QHBoxLayout())
        self.frame.layout().addWidget(self.offsetvalueFrame)
        self.widgets.append(self.offsetvalueFrame)
        self.offsetvalueLabel = qt.QLabel("Offset Value:",
                                          self.offsetvalueFrame)
        self.offsetvalueLabel.setToolTip(
            "Set the offset value shift upon an action")
        self.offsetvalueFrame.layout().addWidget(self.offsetvalueLabel)
        self.widgets.append(self.offsetvalueLabel)
        self.offsetvalueSpinBox = qt.QDoubleSpinBox(self.offsetvalueFrame)
        self.offsetvalueSpinBox.setToolTip(
            "Set the offset value shift upon an action")
        self.offsetvalueSpinBox.minimum = -1000
        self.offsetvalueSpinBox.maximum = 1000
        self.offsetvalueSpinBox.suffix = ""
        self.offsetvalueFrame.layout().addWidget(self.offsetvalueSpinBox)
        self.widgets.append(self.offsetvalueSpinBox)
        ## End offset value selection

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

        # Help Browser
        self.helpBrowser = qt.QPushButton("Visit the Webpage")

        # End Help Browser
        self.frame.layout().addWidget(self.helpBrowser)

        HelpButton(
            self.frame,
            "Use this tool to help you label all voxels enclosed in an area bounded by the the largest path of pixels within the specified threshold."
        )

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

        self.connections.append(
            (self.tissueRadioButton, "clicked()", self.onTissueButtonChanged))
        self.connections.append(
            (self.boneRadioButton, "clicked()", self.onBoneButtonChanged))

        self.connections.append(
            (self.offsetvalueSpinBox, 'valueChanged(double)',
             self.onOffsetValueSpinBoxChanged))
        self.connections.append((self.thresh, "valuesChanged(double,double)",
                                 self.onThreshValuesChange))

        self.connections.append(
            (self.helpBrowser, "clicked()", self.onHelpBrowserPressed))

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