def setupOptionsFrame(self): # Autoscroll range slider self.autoscrollRangeSlider = slicer.qMRMLSliderWidget() self.autoscrollRangeSlider.setMRMLScene(slicer.mrmlScene) self.autoscrollRangeSlider.minimum = 0 self.autoscrollRangeSlider.maximum = 10 self.autoscrollRangeSlider.value = 5 self.autoscrollRangeSlider.setToolTip( 'How many slices you would like to autoscroll up and down') self.scriptedEffect.addLabeledOptionsWidget("Slice range:", self.autoscrollRangeSlider) # Autoscroll speed slider self.autoscrollSpeedSlider = slicer.qMRMLSliderWidget() self.autoscrollSpeedSlider.setMRMLScene(slicer.mrmlScene) self.autoscrollSpeedSlider.minimum = 1 self.autoscrollSpeedSlider.maximum = 100 self.autoscrollSpeedSlider.value = 20 self.autoscrollSpeedSlider.setToolTip( 'How many slices you want to autoscroll per second') self.scriptedEffect.addLabeledOptionsWidget("Slice speed:", self.autoscrollSpeedSlider) # Input view selector self.sliceNodeSelector = qt.QComboBox() self.sliceNodeSelector.setToolTip( "This slice will be excluded during autoscrolling.") self.scriptedEffect.addLabeledOptionsWidget("Exclude view:", self.sliceNodeSelector) # Start button self.applyButton = qt.QPushButton("Start") self.applyButton.objectName = self.__class__.__name__ + 'Start' self.applyButton.setToolTip("Start/Stop autoscrolling (Alt+C)") self.scriptedEffect.addOptionsWidget(self.applyButton) # Set Hotkeys self.hotkey = qt.QShortcut(qt.QKeySequence("Alt+C"), slicer.util.mainWindow()) self.hotkey2 = qt.QShortcut(qt.QKeySequence("Ctrl+Alt+C"), slicer.util.mainWindow()) # Connections self.applyButton.connect('clicked()', self.onApply) self.sliceNodeSelector.connect("currentIndexChanged(int)", self.updateGUIFromMRML) self.hotkey.connect('activated()', self.autoscrollHotkey) self.hotkey2.connect('activated()', self.openSettings) # Initialize variables self.setupVariables()
def setup(self): self.coefficientsSlider = slicer.qMRMLSliderWidget() self.coefficientsSlider.singleStep = 0.01 self.coefficientsSlider.maximum = 2 self.coefficientsSlider.value = self.getDefaultValue('coefficients') self.layout.addRow('Coefficients: ', self.coefficientsSlider) self.orderSpinBox = qt.QSpinBox() self.orderSpinBox.maximum = 6 self.orderSpinBox.value = self.getDefaultValue('order') self.layout.addRow('Polynomial order: ', self.orderSpinBox)
def setup(self): self.numSpikesSpinBox = qt.QSpinBox() self.numSpikesSpinBox.maximum = 10 self.numSpikesSpinBox.value = self.getDefaultValue('num_spikes') self.layout.addRow('Spikes: ', self.numSpikesSpinBox) self.intensitySlider = slicer.qMRMLSliderWidget() self.intensitySlider.singleStep = 0.01 self.intensitySlider.maximum = 5 self.intensitySlider.value = np.mean(self.getDefaultValue('intensity')) self.layout.addRow('Intensity: ', self.intensitySlider)
def setup(self): self.numGhostsSpinBox = qt.QSpinBox() self.numGhostsSpinBox.maximum = 50 default = int(np.mean(self.getDefaultValue('num_ghosts'))) self.numGhostsSpinBox.value = default self.layout.addRow('Ghosts: ', self.numGhostsSpinBox) self.axesLayout, self.axesDict = self.makeAxesLayout() self.layout.addRow('Axes: ', self.axesLayout) self.intensitySlider = slicer.qMRMLSliderWidget() self.intensitySlider.singleStep = 0.01 self.intensitySlider.maximum = 1 self.intensitySlider.value = np.mean(self.getDefaultValue('intensity')) self.layout.addRow('Intensity: ', self.intensitySlider)
def setupOptionsFrame(self): AbstractScriptedSegmentEditorAutoCompleteEffect.setupOptionsFrame(self) # Object scale slider self.objectScaleMmSlider = slicer.qMRMLSliderWidget() self.objectScaleMmSlider.setMRMLScene(slicer.mrmlScene) self.objectScaleMmSlider.quantity = "length" # get unit, precision, etc. from MRML unit node self.objectScaleMmSlider.minimum = 0 self.objectScaleMmSlider.maximum = 10 self.objectScaleMmSlider.value = 2.0 self.objectScaleMmSlider.setToolTip( 'Increasing this value smooths the segmentation and reduces leaks. This is the sigma used for edge detection.' ) self.scriptedEffect.addLabeledOptionsWidget("Object scale:", self.objectScaleMmSlider) self.objectScaleMmSlider.connect('valueChanged(double)', self.updateAlgorithmParameterFromGUI)
def setupOptionsFrame(self): # Object scale slider self.objectScaleMmSlider = slicer.qMRMLSliderWidget() self.objectScaleMmSlider.setMRMLScene(slicer.mrmlScene) self.objectScaleMmSlider.quantity = "length" # get unit, precision, etc. from MRML unit node self.objectScaleMmSlider.minimum = 0 self.objectScaleMmSlider.maximum = 10 self.objectScaleMmSlider.value = 2.0 self.objectScaleMmSlider.setToolTip('Increasing this value smooths the segmentation and reduces leaks. This is the sigma used for edge detection.') self.scriptedEffect.addLabeledOptionsWidget("Object scale:", self.objectScaleMmSlider) self.objectScaleMmSlider.connect('valueChanged(double)', self.updateMRMLFromGUI) # Apply button self.applyButton = qt.QPushButton("Apply") self.applyButton.objectName = self.__class__.__name__ + 'Apply' self.applyButton.setToolTip("Accept previewed result") self.scriptedEffect.addOptionsWidget(self.applyButton) self.applyButton.connect('clicked()', self.onApply)
def setupOptionsFrame(self): # Object scale slider self.objectScaleMmSlider = slicer.qMRMLSliderWidget() self.objectScaleMmSlider.setMRMLScene(slicer.mrmlScene) self.objectScaleMmSlider.quantity = "length" # get unit, precision, etc. from MRML unit node self.objectScaleMmSlider.minimum = 0 self.objectScaleMmSlider.maximum = 10 self.objectScaleMmSlider.value = 2.0 self.objectScaleMmSlider.setToolTip('Increasing this value smooths the segmentation and reduces leaks. This is the sigma used for edge detection.') self.scriptedEffect.addLabeledOptionsWidget("Object scale:", self.objectScaleMmSlider) self.objectScaleMmSlider.connect('valueChanged(double)', self.updateMRMLFromGUI) # Apply button self.applyButton = qt.QPushButton("Apply") self.applyButton.objectName = self.__class__.__name__ + 'Apply' self.applyButton.setToolTip("Accept previewed result") self.scriptedEffect.addOptionsWidget(self.applyButton) self.applyButton.connect('clicked()', self.onApply)
def setupOptionsFrame(self): AbstractScriptedSegmentEditorAutoCompleteEffect.setupOptionsFrame(self) # Object scale slider self.seedLocalityFactorSlider = slicer.qMRMLSliderWidget() self.seedLocalityFactorSlider.setMRMLScene(slicer.mrmlScene) self.seedLocalityFactorSlider.minimum = 0 self.seedLocalityFactorSlider.maximum = 10 self.seedLocalityFactorSlider.value = 0.0 self.seedLocalityFactorSlider.decimals = 1 self.seedLocalityFactorSlider.singleStep = 0.1 self.seedLocalityFactorSlider.pageStep = 1.0 self.seedLocalityFactorSlider.setToolTip( 'Increasing this value makes the effect of seeds more localized,' ' thereby reducing leaks, but requires seed regions to be more evenly distributed in the image.' ' The value is specified as an additional "intensity level difference" per "unit distance."' ) self.scriptedEffect.addLabeledOptionsWidget( "Seed locality:", self.seedLocalityFactorSlider) self.seedLocalityFactorSlider.connect( 'valueChanged(double)', self.updateAlgorithmParameterFromGUI)
def setup(self): # this is the function that implements all GUI ScriptedLoadableModuleWidget.setup(self) # This sets the view being used to the red view only slicer.app.layoutManager().setLayout( slicer.vtkMRMLLayoutNode.SlicerLayoutOneUpRedSliceView) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# #Section 3.2.1: Ultrasound connection ang widgets #the following code provides a GUI to connect to an external ultrasound scanner throught the PlusServer #this section also provides examples of other widgets that can be used #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# ################################################################################################################## #This section creates all the widgets #This is where you will create the type of widget and what it will say ################################################################################################################## #This code block creates a collapsible button #This defines which type of button you are using self.usButton = ctk.ctkCollapsibleButton() #This is what the button will say self.usButton.text = "Ultrasound Connection" #This actually creates that button #This descirbes the type of widget self.inputIPLineEdit = qt.QLineEdit() #This sets a placehoder example of what should be inputted to the line edit self.inputIPLineEdit.setPlaceholderText("127.0.0.1") #This is the help tooltip self.inputIPLineEdit.toolTip = "Put the IP address of your ultrasound device here" #This code block is the exact same as the one above only it asks for the server port self.inputPortLineEdit = qt.QLineEdit() self.inputPortLineEdit.setPlaceholderText("18944") self.inputPortLineEdit.setValidator(qt.QIntValidator()) self.inputPortLineEdit.toolTip = "Put the port ID of the OpenIGTLink here (18944)" #This is a push button self.connectButton = qt.QPushButton() self.connectButton.setDefault(False) #This button says connect self.connectButton.text = "Connect" #help tooltip that explains the funciton self.connectButton.toolTip = "Connects to Ultrasound" #adds the widget to the layout self.freezeButton = qt.QPushButton() self.freezeButton.text = "Freeze" self.freezeButton.toolTip = "Freeze the ultrasound image for fiducial placement" # Combobox for image selection self.imageSelector = slicer.qMRMLNodeComboBox() self.imageSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"] self.imageSelector.selectNodeUponCreation = True self.imageSelector.addEnabled = False self.imageSelector.removeEnabled = False self.imageSelector.noneEnabled = True self.imageSelector.showHidden = False self.imageSelector.showChildNodeTypes = False self.imageSelector.setMRMLScene(slicer.mrmlScene) self.imageSelector.setToolTip("Pick the image to be used.") self.checkBox = qt.QCheckBox() self.checkBox.text = "This is a check box" self.checkBox.toolTip = "This an example check box" #### EXAMPLE: to access the functionality of a check box you can use an if statement #### if self.checkBox.isChecked() == True: self.radioButton = qt.QRadioButton() self.radioButton.text = "This is an example radio button" self.radioButton.toolTip = "This an example radio button" self.sliderWidget = slicer.qMRMLSliderWidget() self.sliderWidget.minimum = 0.00 self.sliderWidget.maximum = 100.00 self.resetButton = qt.QPushButton('Reset') self.resetButton.setDefault(False) self.resetButton.toolTip = "This Button Resets the Module" ################################################################################################################## #This section adds the containers to the parent widget ################################################################################################################## self.layout.addWidget(self.usButton) #This creates a variable that describes layout within this collapsible button self.usLayout = qt.QFormLayout(self.usButton) self.usLayout.addRow("Server IP:", self.inputIPLineEdit) self.usLayout.addRow("Server Port:", self.inputPortLineEdit) self.usLayout.addWidget(self.connectButton) self.usLayout.addRow("US Volume: ", self.imageSelector) self.usLayout.addRow(self.freezeButton) self.shortcut = qt.QShortcut(qt.QKeySequence('f'), slicer.util.mainWindow()) self.usLayout.addRow(self.checkBox) self.usLayout.addRow(self.radioButton) self.usLayout.addRow(self.sliderWidget) # Add vertical spacer self.layout.addStretch(1) ################################################################################################################## #This section connects the widgets to functions ################################################################################################################## self.connectButton.connect('clicked(bool)', self.onConnectButtonClicked) self.freezeButton.connect('clicked(bool)', self.onConnectButtonClicked) self.inputIPLineEdit.connect('textChanged(QString)', self.onInputChanged) self.inputPortLineEdit.connect('textChanged(QString)', self.onInputChanged) self.imageSelector.connect('currentNodeChanged(vtkMRMLNode*)', self.onImageChanged) # Disable buttons until conditions are met self.connectButton.setEnabled(False) self.freezeButton.setEnabled(False)
def createSliderWidget(self, minimum, maximum): slider = slicer.qMRMLSliderWidget() slider.minimum = minimum slider.maximum = maximum return slider
def setup(self): ScriptedLoadableModuleWidget.setup(self) # Instantiate and connect widgets ... # Input file # Text + Button invoking QFileDialog self.inputFileLayout = qt.QHBoxLayout() self.inputFileLabelHeader = qt.QLabel() self.inputFileLabelHeader.text = "Input File: " self.inputFileLabelFile = qt.QLabel() self.inputFileLabelFile.text = "Input header.xml or .m3d" self.inputFileButton = qt.QPushButton() self.inputFileButton.text = "Browse" self.inputFileLayout.addWidget(self.inputFileLabelHeader) self.inputFileLayout.addWidget(self.inputFileLabelFile) self.inputFileLayout.addWidget(self.inputFileButton) self.layout.addLayout(self.inputFileLayout) # # Parameters Area # self.parametersCollapsibleButton = ctk.ctkCollapsibleButton() self.parametersCollapsibleButton.collapsed = True self.parametersCollapsibleButton.text = "Parameters for legacy m3d format" self.layout.addWidget(self.parametersCollapsibleButton) # Layout within the dummy collapsible button parametersFormLayout = qt.QFormLayout(self.parametersCollapsibleButton) # set distance of fold curve from interior points self.distSlider = slicer.qMRMLSliderWidget() self.distSlider.setProperty('maximum', 0.6) self.distSlider.setProperty('minimum', 0.0) self.distSlider.setProperty('singleStep', 0.01) self.distSlider.setToolTip( "Parameter used in transformation from legacy s-rep to new s-rep") parametersFormLayout.addRow("Set distance to expand fold curve", self.distSlider) self.outputFolderLayout = qt.QHBoxLayout() self.outputFolderLabelHeader = qt.QLabel() self.outputFolderLabelHeader.text = "Output folder: " self.outputFolderLabelFile = qt.QLabel() self.outputFolderLabelFile.text = "Folder to save the new xml format" self.outputFolderButton = qt.QPushButton() self.outputFolderButton.text = "Browse" self.outputFolderLayout.addWidget(self.outputFolderLabelHeader) self.outputFolderLayout.addWidget(self.outputFolderLabelFile) self.outputFolderLayout.addWidget(self.outputFolderButton) parametersFormLayout.addRow(self.outputFolderLayout) # # Apply Button # self.applyButton = qt.QPushButton("Visualize s-rep file") self.applyButton.toolTip = "Parse and visualize s-rep." self.layout.addWidget(self.applyButton) # Unused # self.boundarySurfaceRendering = qt.QCheckBox() # self.boundarySurfaceRendering.checked = 0 # self.boundarySurfaceRendering.setToolTip("If checked, set the visibility of the boundary mesh") # self.layout.addWidget(self.boundarySurfaceRendering) # connections self.applyButton.connect('clicked(bool)', self.onApplyButton) self.inputFileButton.connect('clicked(bool)', self.onInputFileButtonClicked) self.outputFolderButton.connect('clicked(bool)', self.onOutputFolderButtonClicked) # Add vertical spacer self.layout.addStretch(1)
def createSliderWidget(self, minimum, maximum): slider = slicer.qMRMLSliderWidget() slider.minimum = minimum slider.maximum = maximum return slider
def setup(self): ScriptedLoadableModuleWidget.setup(self) # Instantiate and connect widgets ... # # Parameters Area # parametersCollapsibleButton = ctk.ctkCollapsibleButton() parametersCollapsibleButton.text = "Parameters" self.layout.addWidget(parametersCollapsibleButton) # Layout within the dummy collapsible button parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton) # # input volume selector # # self.inputSelector = slicer.qMRMLNodeComboBox() # self.inputSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"] # self.inputSelector.selectNodeUponCreation = True # self.inputSelector.addEnabled = False # self.inputSelector.removeEnabled = False # self.inputSelector.noneEnabled = False # self.inputSelector.showHidden = False # self.inputSelector.showChildNodeTypes = False # self.inputSelector.setMRMLScene(slicer.mrmlScene) # self.inputSelector.setToolTip("Pick the input to the algorithm.") # parametersFormLayout.addRow("Input Volume: ", self.inputSelector) # set distance of fold curve from interior points self.distSlider = slicer.qMRMLSliderWidget() # self.distSlider.setMaximum(0.6) # self.distSlider.setMinimum(0.0) self.distSlider.setProperty('maximum', 0.6) self.distSlider.setProperty('minimum', 0.0) self.distSlider.setProperty('singleStep', 0.01) # self.distSlider.setValue(0.02) self.distSlider.setToolTip( "Parameter used in transformation from legacy s-rep to new s-rep") parametersFormLayout.addRow("Set distance to expand fold curve", self.distSlider) # # Apply Button # self.applyButton = qt.QPushButton("Select s-rep file") self.applyButton.toolTip = "Run the algorithm." parametersFormLayout.addRow(self.applyButton) self.boundarySurfaceRendering = qt.QCheckBox() self.boundarySurfaceRendering.checked = 0 self.boundarySurfaceRendering.setToolTip( "If checked, set the visibility of the boundary mesh") parametersFormLayout.addRow("Show Boundary Mesh", self.boundarySurfaceRendering) # connections self.applyButton.connect('clicked(bool)', self.onApplyButton) # Add vertical spacer self.layout.addStretch(1)
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)