def open(self): # main dialog self.dialog = qt.QDialog(slicer.util.mainWindow()) self.dialog.setWindowTitle('Send DICOM Study') self.dialog.setWindowModality(1) layout = qt.QVBoxLayout() self.dialog.setLayout(layout) self.studyLabel = qt.QLabel('Send %d items to destination' % len(self.files)) layout.addWidget(self.studyLabel) # Send Parameters self.dicomFrame = qt.QFrame(self.dialog) self.dicomFormLayout = qt.QFormLayout() self.dicomFrame.setLayout(self.dicomFormLayout) self.dicomEntries = {} self.dicomParameters = { "Destination Address": self.sendAddress, "Destination Port": self.sendPort } for label in self.dicomParameters.keys(): self.dicomEntries[label] = qt.QLineEdit() self.dicomEntries[label].text = self.dicomParameters[label] self.dicomFormLayout.addRow(label+": ", self.dicomEntries[label]) layout.addWidget(self.dicomFrame) # button box bbox = qt.QDialogButtonBox(self.dialog) bbox.addButton(bbox.Ok) bbox.addButton(bbox.Cancel) bbox.connect('accepted()', self.onOk) bbox.connect('rejected()', self.onCancel) layout.addWidget(bbox) self.dialog.open()
def __init__(self, parent): vLayout = qt.QVBoxLayout(parent) hLayout = qt.QHBoxLayout() self.icon = qt.QLabel() self.icon.setPixmap(_dialogIcon(qt.QStyle.SP_MessageBoxQuestion)) hLayout.addWidget(self.icon, 0) self.label = qt.QLabel() self.label.wordWrap = True hLayout.addWidget(self.label, 1) vLayout.addLayout(hLayout) self.moduleList = qt.QListWidget() self.moduleList.selectionMode = qt.QAbstractItemView.NoSelection vLayout.addWidget(self.moduleList) self.addToSearchPaths = qt.QCheckBox() vLayout.addWidget(self.addToSearchPaths) self.enableDeveloperMode = qt.QCheckBox() self.enableDeveloperMode.text = "Enable developer mode" self.enableDeveloperMode.toolTip = "Sets the 'Developer mode' application option to enabled. Enabling developer mode is recommended while developing scripted modules, as it makes the Reload and Testing section displayed in the module user interface." self.enableDeveloperMode.checked = True vLayout.addWidget(self.enableDeveloperMode) self.buttonBox = qt.QDialogButtonBox() self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Yes | qt.QDialogButtonBox.No) vLayout.addWidget(self.buttonBox)
def open(self): self.studyLabel = qt.QLabel('Send %d items to destination' % len(self.files)) self.layout().addWidget(self.studyLabel) # Send Parameters self.dicomFrame = qt.QFrame(self) self.dicomFormLayout = qt.QFormLayout() self.dicomFrame.setLayout(self.dicomFormLayout) self.dicomEntries = {} self.dicomParameters = { "Destination Address": self.sendAddress, "Destination Port": self.sendPort } for label in self.dicomParameters.keys(): self.dicomEntries[label] = qt.QLineEdit() self.dicomEntries[label].text = self.dicomParameters[label] self.dicomFormLayout.addRow(label + ": ", self.dicomEntries[label]) self.layout().addWidget(self.dicomFrame) # button box bbox = qt.QDialogButtonBox(self) bbox.addButton(bbox.Ok) bbox.addButton(bbox.Cancel) bbox.accepted.connect(self.onOk) bbox.rejected.connect(self.onCancel) self.layout().addWidget(bbox) qt.QDialog.open(self)
def __init__(self, parent): vLayout = qt.QVBoxLayout(parent) formLayout = qt.QFormLayout() self.nameEdit = qt.QLineEdit() formLayout.addRow("Name:", self.nameEdit) self.categoryEdit = qt.QLineEdit() formLayout.addRow("Category:", self.categoryEdit) self.descriptionEdit = qt.QTextEdit() self.descriptionEdit.acceptRichText = False formLayout.addRow("Description:", self.descriptionEdit) self.contributorsList = EditableTreeWidget() self.contributorsList.rootIsDecorated = False self.contributorsList.selectionBehavior = qt.QAbstractItemView.SelectRows self.contributorsList.selectionMode = qt.QAbstractItemView.ExtendedSelection self.contributorsList.setHeaderLabels(["Name", "Organization"]) formLayout.addRow("Contributors:", self.contributorsList) vLayout.addLayout(formLayout) vLayout.addStretch(1) self.buttonBox = qt.QDialogButtonBox() self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Ok | qt.QDialogButtonBox.Cancel) vLayout.addWidget(self.buttonBox)
def __init__(self, parent): self.vLayout = qt.QVBoxLayout(parent) self.formLayout = qt.QFormLayout() self.componentName = qt.QLineEdit() self.formLayout.addRow("Name:", self.componentName) self.componentNameValidator = qt.QRegExpValidator( qt.QRegExp(r"^[a-zA-Z_][a-zA-Z0-9_]*$")) self.componentName.setValidator(self.componentNameValidator) self.componentType = qt.QComboBox() self.formLayout.addRow("Type:", self.componentType) self.destination = ctk.ctkPathLineEdit() self.destination.filters = ctk.ctkPathLineEdit.Dirs self.formLayout.addRow("Destination:", self.destination) self.vLayout.addLayout(self.formLayout) self.vLayout.addStretch(1) self.buttonBox = qt.QDialogButtonBox() self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Ok | qt.QDialogButtonBox.Cancel) self.vLayout.addWidget(self.buttonBox)
def setupUi(self): logging.debug('OkDialog.setupUi') layout = qt.QVBoxLayout() self.infoLabel = qt.QLabel('') layout.addWidget(self.infoLabel) self.buttonBox = qt.QDialogButtonBox() self.okButton = self.buttonBox.addButton(qt.QDialogButtonBox.Ok) self.okButton.setStyleSheet('padding: 0px 40px 0px 40px;') layout.addWidget(self.buttonBox) self.setLayout(layout) self.setWindowModality(qt.Qt.ApplicationModal)
def open(self): self.studyLabel = qt.QLabel('Send %d items to destination' % len(self.files)) self.layout().addWidget(self.studyLabel) # Send Parameters self.dicomFrame = qt.QFrame(self) self.dicomFormLayout = qt.QFormLayout() self.dicomFrame.setLayout(self.dicomFormLayout) self.settings = qt.QSettings() self.protocolSelectorCombobox = qt.QComboBox() self.protocolSelectorCombobox.addItems(["DIMSE", "DICOMweb"]) self.protocolSelectorCombobox.setCurrentText( self.settings.value('DICOM/Send/Protocol', 'DIMSE')) self.protocolSelectorCombobox.currentIndexChanged.connect( self.onProtocolSelectorChange) self.dicomFormLayout.addRow("Protocol: ", self.protocolSelectorCombobox) self.serverAETitleEdit = qt.QLineEdit() self.serverAETitleEdit.setToolTip("AE Title") self.serverAETitleEdit.text = self.settings.value( 'DICOM/Send/AETitle', 'CTK') self.dicomFormLayout.addRow("AE Title: ", self.serverAETitleEdit) # Enable AET only for DIMSE self.serverAETitleEdit.enabled = self.protocolSelectorCombobox.currentText == 'DIMSE' self.serverAddressLineEdit = qt.QLineEdit() self.serverAddressLineEdit.setToolTip( "Address includes hostname and port number in standard URL format (hostname:port)." ) self.serverAddressLineEdit.text = self.settings.value( 'DICOM/Send/URL', '') self.dicomFormLayout.addRow("Destination Address: ", self.serverAddressLineEdit) self.layout().addWidget(self.dicomFrame) # button box self.bbox = qt.QDialogButtonBox(self) self.bbox.addButton(self.bbox.Ok) self.bbox.addButton(self.bbox.Cancel) self.bbox.accepted.connect(self.onOk) self.bbox.rejected.connect(self.onCancel) self.layout().addWidget(self.bbox) self.progressBar = qt.QProgressBar(self.parent().window()) self.progressBar.hide() self.dicomFormLayout.addRow(self.progressBar) qt.QDialog.open(self)
def onCreatePresetPressed(self): if self.registrationPresetSelector.currentIndex != self.newPresetIndex: return self.newPresetBox = qt.QDialog() self.customPresetLayout = qt.QVBoxLayout() self.addParameterFile() addPresetButton = qt.QPushButton("Add more presets...") addPresetButton.connect("clicked(bool)", self.addParameterFile) self.customPresetLayout.addWidget(addPresetButton) self.newPresetBox.setLayout(self.customPresetLayout) # Add fields to specify descriptions, etc... for that preset (to be included in the XML file) groupBox = qt.QGroupBox() formLayout = qt.QFormLayout() self.contentBox = qt.QLineEdit() formLayout.addRow("Content: ", self.contentBox) self.descriptionBox = qt.QLineEdit() formLayout.addRow("Description: ", self.descriptionBox) self.idBox = qt.QLineEdit() formLayout.addRow("Id: ", self.idBox) self.modalityBox = qt.QLineEdit() formLayout.addRow("Modality: ", self.modalityBox) self.publicationsBox = qt.QPlainTextEdit() formLayout.addRow("Publications: ", self.publicationsBox) groupBox.setLayout(formLayout) self.customPresetLayout.addWidget(groupBox) # Add Ok/Cancel buttons and connect them to the main dialog buttonBox = qt.QDialogButtonBox() buttonBox.setStandardButtons(qt.QDialogButtonBox.Ok | qt.QDialogButtonBox.Cancel) buttonBox.setCenterButtons(True) buttonBox.connect("accepted()", self.newPresetBox.accept) buttonBox.connect("rejected()", self.newPresetBox.reject) self.customPresetLayout.addWidget(buttonBox) response = self.newPresetBox.exec_() if response: self.createPreset()
def __init__(self, parent): qt.QDialog.__init__(self, parent) layout = qt.QVBoxLayout() self.setLayout(layout) self.setWindowTitle("User Statistics") self.settingsUserPanel = slicer.qSlicerSettingsUserInformationPanel() self.settingsUserPanel.setUserInformation(slicer.app.applicationLogic().GetUserInformation()) layout.addWidget(self.settingsUserPanel) self.dialogButtons = qt.QDialogButtonBox() self.dialogButtons.addButton("Confirm user information", qt.QDialogButtonBox.AcceptRole) self.dialogButtons.addButton("Disable user statistics", qt.QDialogButtonBox.RejectRole) self.dialogButtons.accepted.connect(self.accept) self.dialogButtons.rejected.connect(self.reject) layout.addWidget(self.dialogButtons)
def onEdit(self, action): dialog = qt.QDialog(slicer.util.mainWindow()) layout = qt.QFormLayout(dialog) label = qt.QLabel(action['name']) layout.addRow("Edit properties of:", label ) self.actionInstance = slicer.modules.animatorActionPlugins[action['class']]() self.actionInstance.gui(action, layout) buttonBox = qt.QDialogButtonBox() buttonBox.setStandardButtons(qt.QDialogButtonBox.Ok | qt.QDialogButtonBox.Cancel) layout.addRow(buttonBox) buttonBox.button(qt.QDialogButtonBox.Ok).setToolTip("Use currently selected color node.") buttonBox.button(qt.QDialogButtonBox.Cancel).setToolTip("Cancel current operation.") buttonBox.connect("accepted()", lambda action=action : self.accept(dialog, action)) buttonBox.connect("rejected()", dialog, "reject()") dialog.exec_()
def __init__(self, parent): vLayout = qt.QVBoxLayout(parent) self.colorPromptLabel = qt.QLabel() vLayout.addWidget(self.colorPromptLabel) self.colorSelectorFrame = qt.QFrame() self.colorSelectorFrame.objectName = 'ColorSelectorFrame' self.colorSelectorFrame.setLayout(qt.QHBoxLayout()) vLayout.addWidget(self.colorSelectorFrame) self.colorSelectorLabel = qt.QLabel() self.colorSelectorFrame.layout().addWidget(self.colorSelectorLabel) self.colorSelector = slicer.qMRMLColorTableComboBox() self.colorSelector.nodeTypes = ["vtkMRMLColorNode"] self.colorSelector.hideChildNodeTypes = ( "vtkMRMLDiffusionTensorDisplayPropertiesNode", "vtkMRMLProceduralColorNode", "") self.colorSelector.addEnabled = False self.colorSelector.removeEnabled = False self.colorSelector.noneEnabled = False self.colorSelector.selectNodeUponCreation = True self.colorSelector.showHidden = True self.colorSelector.showChildNodeTypes = True self.colorSelector.setMRMLScene(slicer.mrmlScene) self.colorSelector.setToolTip( "Pick the table of structures you wish to edit") vLayout.addWidget(self.colorSelector) self.buttonBox = qt.QDialogButtonBox() self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Ok | qt.QDialogButtonBox.Cancel) vLayout.addWidget(self.buttonBox) self.buttonBox.button(qt.QDialogButtonBox.Ok).setToolTip( "Use currently selected color node.") self.buttonBox.button( qt.QDialogButtonBox.Cancel).setToolTip("Cancel current operation.")
def setup(self): ScriptedLoadableModuleWidget.setup(self) # check if the SlicerVmtk module is installed properly # self.__vmtkInstalled = SlicerVmtkCommonLib.Helper.CheckIfVmtkIsInstalled() # Helper.Debug("VMTK found: " + self.__vmtkInstalled) # # the I/O panel # ioCollapsibleButton = ctk.ctkCollapsibleButton() ioCollapsibleButton.text = "Input/Output" self.layout.addWidget(ioCollapsibleButton) ioFormLayout = qt.QFormLayout(ioCollapsibleButton) # inputVolume selector self.__inputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__inputVolumeNodeSelector.objectName = 'inputVolumeNodeSelector' self.__inputVolumeNodeSelector.toolTip = "Select the input volume." self.__inputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.__inputVolumeNodeSelector.noneEnabled = False self.__inputVolumeNodeSelector.addEnabled = False self.__inputVolumeNodeSelector.removeEnabled = False ioFormLayout.addRow("Input Volume:", self.__inputVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__inputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__inputVolumeNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onInputVolumeChanged) # seed selector self.__seedFiducialsNodeSelector = slicer.qMRMLNodeComboBox() self.__seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.__seedFiducialsNodeSelector.toolTip = "Select a fiducial to use as a Seed to detect the maximal diameter." self.__seedFiducialsNodeSelector.nodeTypes = [ 'vtkMRMLMarkupsFiducialNode' ] self.__seedFiducialsNodeSelector.baseName = "DiameterSeed" self.__seedFiducialsNodeSelector.noneEnabled = False self.__seedFiducialsNodeSelector.addEnabled = False self.__seedFiducialsNodeSelector.removeEnabled = False ioFormLayout.addRow("Seed in largest Vessel:", self.__seedFiducialsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__seedFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__seedFiducialsNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onSeedChanged) self.__ioAdvancedToggle = qt.QCheckBox("Show Advanced Properties") self.__ioAdvancedToggle.setChecked(False) ioFormLayout.addRow(self.__ioAdvancedToggle) # # I/O advanced panel # self.__ioAdvancedPanel = qt.QFrame(ioCollapsibleButton) self.__ioAdvancedPanel.hide() self.__ioAdvancedPanel.setFrameStyle(6) ioFormLayout.addRow(self.__ioAdvancedPanel) self.__ioAdvancedToggle.connect("clicked()", self.onIOAdvancedToggle) ioAdvancedFormLayout = qt.QFormLayout(self.__ioAdvancedPanel) # lock button self.__detectPushButton = qt.QPushButton() self.__detectPushButton.text = "Detect parameters automatically" self.__detectPushButton.checkable = True self.__detectPushButton.checked = True # self.__unLockPushButton.connect("clicked()", self.calculateParameters()) ioAdvancedFormLayout.addRow(self.__detectPushButton) # outputVolume selector self.__outputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__outputVolumeNodeSelector.toolTip = "Select the output labelmap." self.__outputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.__outputVolumeNodeSelector.baseName = "VesselnessFiltered" self.__outputVolumeNodeSelector.noneEnabled = False self.__outputVolumeNodeSelector.addEnabled = True self.__outputVolumeNodeSelector.selectNodeUponCreation = True self.__outputVolumeNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow("Output Volume:", self.__outputVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__outputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # previewVolume selector self.__previewVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__previewVolumeNodeSelector.toolTip = "Select the preview volume." self.__previewVolumeNodeSelector.nodeTypes = [ 'vtkMRMLScalarVolumeNode' ] self.__previewVolumeNodeSelector.baseName = "VesselnessPreview" self.__previewVolumeNodeSelector.noneEnabled = False self.__previewVolumeNodeSelector.addEnabled = True self.__previewVolumeNodeSelector.selectNodeUponCreation = True self.__previewVolumeNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow("Preview Volume:", self.__previewVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__previewVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__minimumDiameterSpinBox = qt.QSpinBox() self.__minimumDiameterSpinBox.minimum = 0 self.__minimumDiameterSpinBox.maximum = 1000 self.__minimumDiameterSpinBox.singleStep = 1 self.__minimumDiameterSpinBox.toolTip = "Specify the minimum Diameter manually." ioAdvancedFormLayout.addRow("Minimum Diameter [vx]:", self.__minimumDiameterSpinBox) self.__maximumDiameterSpinBox = qt.QSpinBox() self.__maximumDiameterSpinBox.minimum = 0 self.__maximumDiameterSpinBox.maximum = 1000 self.__maximumDiameterSpinBox.singleStep = 1 self.__maximumDiameterSpinBox.toolTip = "Specify the maximum Diameter manually." ioAdvancedFormLayout.addRow("Maximum Diameter [vx]:", self.__maximumDiameterSpinBox) # add empty row ioAdvancedFormLayout.addRow("", qt.QWidget()) # alpha slider alphaLabel = qt.QLabel() alphaLabel.text = "more Tubes <-> more Plates" + SlicerVmtkCommonLib.Helper.CreateSpace( 16) alphaLabel.setAlignment(4) alphaLabel.toolTip = "A lower value detects tubes rather than plate-like structures." ioAdvancedFormLayout.addRow(alphaLabel) self.__alphaSlider = ctk.ctkSliderWidget() self.__alphaSlider.decimals = 1 self.__alphaSlider.minimum = 0.1 self.__alphaSlider.maximum = 500 self.__alphaSlider.singleStep = 0.1 self.__alphaSlider.toolTip = alphaLabel.toolTip ioAdvancedFormLayout.addRow(self.__alphaSlider) # beta slider betaLabel = qt.QLabel() betaLabel.text = "more Blobs <-> more Tubes" + SlicerVmtkCommonLib.Helper.CreateSpace( 16) betaLabel.setAlignment(4) betaLabel.toolTip = "A higher value detects tubes rather than blobs." ioAdvancedFormLayout.addRow(betaLabel) self.__betaSlider = ctk.ctkSliderWidget() self.__betaSlider.decimals = 1 self.__betaSlider.minimum = 0.1 self.__betaSlider.maximum = 500 self.__betaSlider.singleStep = 0.1 self.__betaSlider.toolTip = betaLabel.toolTip ioAdvancedFormLayout.addRow(self.__betaSlider) # contrast slider contrastLabel = qt.QLabel() contrastLabel.text = "low Input Contrast <-> high Input Contrast" + SlicerVmtkCommonLib.Helper.CreateSpace( 14) contrastLabel.setAlignment(4) contrastLabel.toolTip = "If the intensity contrast in the input image between vessel and background is high, choose a high value else choose a low value." ioAdvancedFormLayout.addRow(contrastLabel) self.__contrastSlider = ctk.ctkSliderWidget() self.__contrastSlider.decimals = 0 self.__contrastSlider.minimum = 0 self.__contrastSlider.maximum = 500 self.__contrastSlider.singleStep = 10 self.__contrastSlider.toolTip = contrastLabel.toolTip ioAdvancedFormLayout.addRow(self.__contrastSlider) # # Reset, preview and apply buttons # self.__buttonBox = qt.QDialogButtonBox() self.__resetButton = self.__buttonBox.addButton( self.__buttonBox.RestoreDefaults) self.__resetButton.toolTip = "Click to reset all input elements to default." self.__previewButton = self.__buttonBox.addButton( self.__buttonBox.Discard) self.__previewButton.setIcon(qt.QIcon()) self.__previewButton.text = "Preview.." self.__previewButton.toolTip = "Click to refresh the preview." self.__startButton = self.__buttonBox.addButton(self.__buttonBox.Apply) self.__startButton.setIcon(qt.QIcon()) self.__startButton.text = "Start!" self.__startButton.enabled = False self.__startButton.toolTip = "Click to start the filtering." self.layout.addWidget(self.__buttonBox) self.__resetButton.connect("clicked()", self.restoreDefaults) self.__previewButton.connect("clicked()", self.onRefreshButtonClicked) self.__startButton.connect("clicked()", self.onStartButtonClicked) self.__inputVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.__seedFiducialsNodeSelector.setMRMLScene(slicer.mrmlScene) self.__outputVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.__previewVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) # be ready for events self.__updating = 0 # set default values self.restoreDefaults() # compress the layout self.layout.addStretch(1)
def setup(self): ScriptedLoadableModuleWidget.setup(self) # check if the SlicerVmtk module is installed properly # self.__vmtkInstalled = SlicerVmtkCommonLib.Helper.CheckIfVmtkIsInstalled() # Helper.Debug("VMTK found: " + self.__vmtkInstalled) # # the I/O panel # ioCollapsibleButton = ctk.ctkCollapsibleButton() ioCollapsibleButton.text = "Input/Output" self.layout.addWidget(ioCollapsibleButton) ioFormLayout = qt.QFormLayout(ioCollapsibleButton) # inputVolume selector self.__inputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__inputVolumeNodeSelector.objectName = 'inputVolumeNodeSelector' self.__inputVolumeNodeSelector.toolTip = "Select the input volume. This should always be the original image and not a vesselness image, if possible." self.__inputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.__inputVolumeNodeSelector.noneEnabled = False self.__inputVolumeNodeSelector.addEnabled = False self.__inputVolumeNodeSelector.removeEnabled = False ioFormLayout.addRow("Input Volume:", self.__inputVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__inputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__inputVolumeNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onInputVolumeChanged) self.__inputVolumeNodeSelector.connect('nodeActivated(vtkMRMLNode*)', self.onInputVolumeChanged) # seed selector self.__seedFiducialsNodeSelector = slicer.qMRMLNodeComboBox() self.__seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.__seedFiducialsNodeSelector.toolTip = "Select a hierarchy containing the fiducials to use as Seeds." self.__seedFiducialsNodeSelector.nodeTypes = [ 'vtkMRMLMarkupsFiducialNode' ] self.__seedFiducialsNodeSelector.baseName = "Seeds" self.__seedFiducialsNodeSelector.noneEnabled = False self.__seedFiducialsNodeSelector.addEnabled = False self.__seedFiducialsNodeSelector.removeEnabled = False ioFormLayout.addRow("Seeds:", self.__seedFiducialsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__seedFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__ioAdvancedToggle = qt.QCheckBox("Show Advanced I/O Properties") self.__ioAdvancedToggle.setChecked(False) ioFormLayout.addRow(self.__ioAdvancedToggle) # # I/O advanced panel # self.__ioAdvancedPanel = qt.QFrame(ioCollapsibleButton) self.__ioAdvancedPanel.hide() self.__ioAdvancedPanel.setFrameStyle(6) ioFormLayout.addRow(self.__ioAdvancedPanel) self.__ioAdvancedToggle.connect("clicked()", self.onIOAdvancedToggle) ioAdvancedFormLayout = qt.QFormLayout(self.__ioAdvancedPanel) # inputVolume selector self.__vesselnessVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__vesselnessVolumeNodeSelector.objectName = 'vesselnessVolumeNodeSelector' self.__vesselnessVolumeNodeSelector.toolTip = "Select the input vesselness volume. This is optional input." self.__vesselnessVolumeNodeSelector.nodeTypes = [ 'vtkMRMLScalarVolumeNode' ] self.__vesselnessVolumeNodeSelector.noneEnabled = True self.__vesselnessVolumeNodeSelector.addEnabled = False self.__vesselnessVolumeNodeSelector.removeEnabled = False ioAdvancedFormLayout.addRow("Vesselness Volume:", self.__vesselnessVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__vesselnessVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__vesselnessVolumeNodeSelector.setCurrentNode(None) # stopper selector self.__stopperFiducialsNodeSelector = slicer.qMRMLNodeComboBox() self.__stopperFiducialsNodeSelector.objectName = 'stopperFiducialsNodeSelector' self.__stopperFiducialsNodeSelector.toolTip = "Select a hierarchy containing the fiducials to use as Stoppers. Whenever one stopper is reached, the segmentation stops." self.__stopperFiducialsNodeSelector.nodeTypes = [ 'vtkMRMLMarkupsFiducialNode' ] self.__stopperFiducialsNodeSelector.baseName = "Stoppers" self.__stopperFiducialsNodeSelector.noneEnabled = False self.__stopperFiducialsNodeSelector.addEnabled = True self.__stopperFiducialsNodeSelector.removeEnabled = False ioAdvancedFormLayout.addRow("Stoppers:", self.__stopperFiducialsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__stopperFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # outputVolume selector self.__outputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__outputVolumeNodeSelector.toolTip = "Select the output labelmap." self.__outputVolumeNodeSelector.nodeTypes = [ 'vtkMRMLLabelMapVolumeNode' ] self.__outputVolumeNodeSelector.baseName = "LevelSetSegmentation" self.__outputVolumeNodeSelector.noneEnabled = False self.__outputVolumeNodeSelector.addEnabled = True self.__outputVolumeNodeSelector.selectNodeUponCreation = True self.__outputVolumeNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow("Output Labelmap:", self.__outputVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__outputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # outputModel selector self.__outputModelNodeSelector = slicer.qMRMLNodeComboBox() self.__outputModelNodeSelector.objectName = 'outputModelNodeSelector' self.__outputModelNodeSelector.toolTip = "Select the output model." self.__outputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.__outputModelNodeSelector.baseName = "LevelSetSegmentationModel" self.__outputModelNodeSelector.hideChildNodeTypes = [ 'vtkMRMLMarkupsFiducialNode' ] # hide all annotation nodes self.__outputModelNodeSelector.noneEnabled = False self.__outputModelNodeSelector.addEnabled = True self.__outputModelNodeSelector.selectNodeUponCreation = True self.__outputModelNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow("Output Model:", self.__outputModelNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__outputModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # # the segmentation panel # segmentationCollapsibleButton = ctk.ctkCollapsibleButton() segmentationCollapsibleButton.text = "Segmentation" self.layout.addWidget(segmentationCollapsibleButton) segmentationFormLayout = qt.QFormLayout(segmentationCollapsibleButton) # Threshold slider thresholdLabel = qt.QLabel() thresholdLabel.text = "Thresholding" + SlicerVmtkCommonLib.Helper.CreateSpace( 7) thresholdLabel.toolTip = "Choose the intensity range to segment." thresholdLabel.setAlignment(4) segmentationFormLayout.addRow(thresholdLabel) self.__thresholdSlider = slicer.qMRMLRangeWidget() segmentationFormLayout.addRow(self.__thresholdSlider) self.__thresholdSlider.connect('valuesChanged(double,double)', self.onThresholdSliderChanged) self.__segmentationAdvancedToggle = qt.QCheckBox( "Show Advanced Segmentation Properties") self.__segmentationAdvancedToggle.setChecked(False) segmentationFormLayout.addRow(self.__segmentationAdvancedToggle) # # segmentation advanced panel # self.__segmentationAdvancedPanel = qt.QFrame( segmentationCollapsibleButton) self.__segmentationAdvancedPanel.hide() self.__segmentationAdvancedPanel.setFrameStyle(6) segmentationFormLayout.addRow(self.__segmentationAdvancedPanel) self.__segmentationAdvancedToggle.connect( "clicked()", self.onSegmentationAdvancedToggle) segmentationAdvancedFormLayout = qt.QFormLayout( self.__segmentationAdvancedPanel) # inflation slider inflationLabel = qt.QLabel() inflationLabel.text = "less inflation <-> more inflation" + SlicerVmtkCommonLib.Helper.CreateSpace( 14) inflationLabel.setAlignment(4) inflationLabel.toolTip = "Define how fast the segmentation expands." segmentationAdvancedFormLayout.addRow(inflationLabel) self.__inflationSlider = ctk.ctkSliderWidget() self.__inflationSlider.decimals = 0 self.__inflationSlider.minimum = -100 self.__inflationSlider.maximum = 100 self.__inflationSlider.singleStep = 10 self.__inflationSlider.toolTip = inflationLabel.toolTip segmentationAdvancedFormLayout.addRow(self.__inflationSlider) # curvature slider curvatureLabel = qt.QLabel() curvatureLabel.text = "less curvature <-> more curvature" + SlicerVmtkCommonLib.Helper.CreateSpace( 14) curvatureLabel.setAlignment(4) curvatureLabel.toolTip = "Choose a high curvature to generate a smooth segmentation." segmentationAdvancedFormLayout.addRow(curvatureLabel) self.__curvatureSlider = ctk.ctkSliderWidget() self.__curvatureSlider.decimals = 0 self.__curvatureSlider.minimum = -100 self.__curvatureSlider.maximum = 100 self.__curvatureSlider.singleStep = 10 self.__curvatureSlider.toolTip = curvatureLabel.toolTip segmentationAdvancedFormLayout.addRow(self.__curvatureSlider) # attraction slider attractionLabel = qt.QLabel() attractionLabel.text = "less attraction to gradient <-> more attraction to gradient" + SlicerVmtkCommonLib.Helper.CreateSpace( 14) attractionLabel.setAlignment(4) attractionLabel.toolTip = "Configure how the segmentation travels towards gradient ridges (vessel lumen wall)." segmentationAdvancedFormLayout.addRow(attractionLabel) self.__attractionSlider = ctk.ctkSliderWidget() self.__attractionSlider.decimals = 0 self.__attractionSlider.minimum = -100 self.__attractionSlider.maximum = 100 self.__attractionSlider.singleStep = 10 self.__attractionSlider.toolTip = attractionLabel.toolTip segmentationAdvancedFormLayout.addRow(self.__attractionSlider) # iteration spinbox self.__iterationSpinBox = qt.QSpinBox() self.__iterationSpinBox.minimum = 0 self.__iterationSpinBox.maximum = 5000 self.__iterationSpinBox.singleStep = 10 self.__iterationSpinBox.toolTip = "Choose the number of evolution iterations." segmentationAdvancedFormLayout.addRow( SlicerVmtkCommonLib.Helper.CreateSpace(100) + "Iterations:", self.__iterationSpinBox) # # Reset, preview and apply buttons # self.__buttonBox = qt.QDialogButtonBox() self.__resetButton = self.__buttonBox.addButton( self.__buttonBox.RestoreDefaults) self.__resetButton.toolTip = "Click to reset all input elements to default." self.__previewButton = self.__buttonBox.addButton( self.__buttonBox.Discard) self.__previewButton.setIcon(qt.QIcon()) self.__previewButton.text = "Preview.." self.__previewButton.toolTip = "Click to refresh the preview." self.__startButton = self.__buttonBox.addButton(self.__buttonBox.Apply) self.__startButton.setIcon(qt.QIcon()) self.__startButton.text = "Start!" self.__startButton.enabled = False self.__startButton.toolTip = "Click to start the filtering." self.layout.addWidget(self.__buttonBox) self.__resetButton.connect("clicked()", self.restoreDefaults) self.__previewButton.connect("clicked()", self.onRefreshButtonClicked) self.__startButton.connect("clicked()", self.onStartButtonClicked) self.__inputVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.__seedFiducialsNodeSelector.setMRMLScene(slicer.mrmlScene) self.__vesselnessVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.__outputVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.__outputModelNodeSelector.setMRMLScene(slicer.mrmlScene) self.__stopperFiducialsNodeSelector.setMRMLScene(slicer.mrmlScene) # be ready for events self.__updating = 0 # set default values self.restoreDefaults() # compress the layout self.layout.addStretch(1)
def setup(self): ScriptedLoadableModuleWidget.setup(self) try: import vtkvmtkSegmentationPython as vtkvmtkSegmentation except ImportError: self.layout.addWidget(qt.QLabel("Failed to load VMTK libraries")) return # # the I/O panel # ioCollapsibleButton = ctk.ctkCollapsibleButton() ioCollapsibleButton.text = "Input/Output" self.layout.addWidget(ioCollapsibleButton) ioFormLayout = qt.QFormLayout(ioCollapsibleButton) # inputVolume selector self.inputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.inputVolumeNodeSelector.objectName = 'inputVolumeNodeSelector' self.inputVolumeNodeSelector.toolTip = "Select the input volume." self.inputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.inputVolumeNodeSelector.noneEnabled = False self.inputVolumeNodeSelector.addEnabled = False self.inputVolumeNodeSelector.removeEnabled = False ioFormLayout.addRow("Input Volume:", self.inputVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.inputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # seed selector self.seedFiducialsNodeSelector = slicer.qSlicerSimpleMarkupsWidget() self.seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.seedFiducialsNodeSelector = slicer.qSlicerSimpleMarkupsWidget() self.seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.seedFiducialsNodeSelector.toolTip = "Select a point in the largest vessel. Preview will be shown around this point. This is point is also used for determining maximum vessel diameter if automatic filtering parameters computation is enabled." self.seedFiducialsNodeSelector.setNodeBaseName("DiameterSeed") self.seedFiducialsNodeSelector.tableWidget().hide() self.seedFiducialsNodeSelector.defaultNodeColor = qt.QColor(255, 0, 0) # red self.seedFiducialsNodeSelector.markupsSelectorComboBox( ).noneEnabled = False self.seedFiducialsNodeSelector.markupsPlaceWidget( ).placeMultipleMarkups = slicer.qSlicerMarkupsPlaceWidget.ForcePlaceSingleMarkup ioFormLayout.addRow("Seed point:", self.seedFiducialsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.seedFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # outputVolume selector self.outputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.outputVolumeNodeSelector.toolTip = "Select the output labelmap." self.outputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.outputVolumeNodeSelector.baseName = "VesselnessFiltered" self.outputVolumeNodeSelector.noneEnabled = True self.outputVolumeNodeSelector.noneDisplay = "Create new volume" self.outputVolumeNodeSelector.addEnabled = True self.outputVolumeNodeSelector.selectNodeUponCreation = True self.outputVolumeNodeSelector.removeEnabled = True ioFormLayout.addRow("Output Volume:", self.outputVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.outputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # # Advanced area # self.advancedCollapsibleButton = ctk.ctkCollapsibleButton() self.advancedCollapsibleButton.text = "Advanced" self.advancedCollapsibleButton.collapsed = True self.layout.addWidget(self.advancedCollapsibleButton) advancedFormLayout = qt.QFormLayout(self.advancedCollapsibleButton) # previewVolume selector self.previewVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.previewVolumeNodeSelector.toolTip = "Select the preview volume." self.previewVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.previewVolumeNodeSelector.baseName = "VesselnessPreview" self.previewVolumeNodeSelector.noneEnabled = True self.previewVolumeNodeSelector.noneDisplay = "Create new volume" self.previewVolumeNodeSelector.addEnabled = True self.previewVolumeNodeSelector.selectNodeUponCreation = True self.previewVolumeNodeSelector.removeEnabled = True advancedFormLayout.addRow("Preview volume:", self.previewVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.previewVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.displayThresholdSlider = ctk.ctkSliderWidget() self.displayThresholdSlider.decimals = 2 self.displayThresholdSlider.minimum = 0 self.displayThresholdSlider.maximum = 1.0 self.displayThresholdSlider.singleStep = 0.01 self.displayThresholdSlider.toolTip = "Voxels below this vesselness value will be hidden. It does not change the voxel values, only how the vesselness volume is displayed." advancedFormLayout.addRow("Display threshold:", self.displayThresholdSlider) self.displayThresholdSlider.connect('valueChanged(double)', self.onDisplayThresholdChanged) self.previewVolumeDiameterVoxelSlider = ctk.ctkSliderWidget() self.previewVolumeDiameterVoxelSlider.decimals = 0 self.previewVolumeDiameterVoxelSlider.minimum = 10 self.previewVolumeDiameterVoxelSlider.maximum = 200 self.previewVolumeDiameterVoxelSlider.singleStep = 5 self.previewVolumeDiameterVoxelSlider.suffix = " voxels" self.previewVolumeDiameterVoxelSlider.toolTip = "Diameter of the preview area in voxels." advancedFormLayout.addRow("Preview volume size:", self.previewVolumeDiameterVoxelSlider) # detect filterint parameters self.detectPushButton = qt.QPushButton() self.detectPushButton.text = "Compute vessel diameters and contrast from seed point" self.detectPushButton.checkable = True self.detectPushButton.checked = True advancedFormLayout.addRow(self.detectPushButton) self.detectPushButton.connect("clicked()", self.onNodeSelectionChanged) self.minimumDiameterSpinBox = qt.QSpinBox() self.minimumDiameterSpinBox.minimum = 1 self.minimumDiameterSpinBox.maximum = 1000 self.minimumDiameterSpinBox.singleStep = 1 self.minimumDiameterSpinBox.suffix = " voxels" self.minimumDiameterSpinBox.enabled = False self.minimumDiameterSpinBox.toolTip = "Tubular structures that have minimum this diameter will be enhanced." advancedFormLayout.addRow("Minimum vessel diameter:", self.minimumDiameterSpinBox) self.detectPushButton.connect("toggled(bool)", self.minimumDiameterSpinBox.setDisabled) self.maximumDiameterSpinBox = qt.QSpinBox() self.maximumDiameterSpinBox.minimum = 0 self.maximumDiameterSpinBox.maximum = 1000 self.maximumDiameterSpinBox.singleStep = 1 self.maximumDiameterSpinBox.suffix = " voxels" self.maximumDiameterSpinBox.enabled = False self.maximumDiameterSpinBox.toolTip = "Tubular structures that have maximum this diameter will be enhanced." advancedFormLayout.addRow("Maximum vessel diameter:", self.maximumDiameterSpinBox) self.detectPushButton.connect("toggled(bool)", self.maximumDiameterSpinBox.setDisabled) self.contrastSlider = ctk.ctkSliderWidget() self.contrastSlider.decimals = 0 self.contrastSlider.minimum = 0 self.contrastSlider.maximum = 500 self.contrastSlider.singleStep = 10 self.contrastSlider.enabled = False self.contrastSlider.toolTip = "If the intensity contrast in the input image between vessel and background is high, choose a high value else choose a low value." advancedFormLayout.addRow("Vessel contrast:", self.contrastSlider) self.detectPushButton.connect("toggled(bool)", self.contrastSlider.setDisabled) self.suppressPlatesSlider = ctk.ctkSliderWidget() self.suppressPlatesSlider.decimals = 0 self.suppressPlatesSlider.minimum = 0 self.suppressPlatesSlider.maximum = 100 self.suppressPlatesSlider.singleStep = 1 self.suppressPlatesSlider.suffix = " %" self.suppressPlatesSlider.toolTip = "A higher value filters out more plate-like structures." advancedFormLayout.addRow("Suppress plates:", self.suppressPlatesSlider) self.suppressBlobsSlider = ctk.ctkSliderWidget() self.suppressBlobsSlider.decimals = 0 self.suppressBlobsSlider.minimum = 0 self.suppressBlobsSlider.maximum = 100 self.suppressBlobsSlider.singleStep = 1 self.suppressBlobsSlider.suffix = " %" self.suppressBlobsSlider.toolTip = "A higher value filters out more blob-like structures." advancedFormLayout.addRow("Suppress blobs:", self.suppressBlobsSlider) # # Reset, preview and apply buttons # self.buttonBox = qt.QDialogButtonBox() self.resetButton = self.buttonBox.addButton( self.buttonBox.RestoreDefaults) self.resetButton.toolTip = "Click to reset all input elements to default." self.previewButton = self.buttonBox.addButton(self.buttonBox.Discard) self.previewButton.setIcon(qt.QIcon()) self.previewButton.text = "Preview" self.startButton = self.buttonBox.addButton(self.buttonBox.Apply) self.startButton.setIcon(qt.QIcon()) self.startButton.text = "Start" self.startButton.enabled = False self.layout.addWidget(self.buttonBox) self.resetButton.connect("clicked()", self.restoreDefaults) self.previewButton.connect("clicked()", self.onPreviewButtonClicked) self.startButton.connect("clicked()", self.onStartButtonClicked) self.inputVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.seedFiducialsNodeSelector.setMRMLScene(slicer.mrmlScene) self.outputVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.previewVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.inputVolumeNodeSelector.connect( "currentNodeChanged(vtkMRMLNode*)", self.onNodeSelectionChanged) self.seedFiducialsNodeSelector.markupsSelectorComboBox().connect( "currentNodeChanged(vtkMRMLNode*)", self.onNodeSelectionChanged) self.seedFiducialsNodeSelector.connect("updateFinished()", self.onNodeSelectionChanged) # set default values self.restoreDefaults() self.onNodeSelectionChanged() # compress the layout self.layout.addStretch(1)
def setup( self ): ScriptedLoadableModuleWidget.setup(self) # check if the SlicerVmtk module is installed properly # self.__vmtkInstalled = SlicerVmtkCommonLib.Helper.CheckIfVmtkIsInstalled() # Helper.Debug("VMTK found: " + self.__vmtkInstalled) # # the I/O panel # ioCollapsibleButton = ctk.ctkCollapsibleButton() ioCollapsibleButton.text = "Input/Output" self.layout.addWidget( ioCollapsibleButton ) ioFormLayout = qt.QFormLayout( ioCollapsibleButton ) # inputVolume selector self.__inputModelNodeSelector = slicer.qMRMLNodeComboBox() self.__inputModelNodeSelector.objectName = 'inputModelNodeSelector' self.__inputModelNodeSelector.toolTip = "Select the input model." self.__inputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.__inputModelNodeSelector.hideChildNodeTypes = ['vtkMRMLAnnotationNode'] # hide all annotation nodes self.__inputModelNodeSelector.noneEnabled = False self.__inputModelNodeSelector.addEnabled = False self.__inputModelNodeSelector.removeEnabled = False ioFormLayout.addRow( "Input Model:", self.__inputModelNodeSelector ) self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)', self.__inputModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)' ) self.__inputModelNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onInputModelChanged ) # seed selector self.__seedFiducialsNodeSelector = slicer.qMRMLNodeComboBox() self.__seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.__seedFiducialsNodeSelector.toolTip = "Select a fiducial to use as the origin of the Centerline." self.__seedFiducialsNodeSelector.nodeTypes = ['vtkMRMLMarkupsFiducialNode'] self.__seedFiducialsNodeSelector.baseName = "OriginSeed" self.__seedFiducialsNodeSelector.noneEnabled = False self.__seedFiducialsNodeSelector.addEnabled = False self.__seedFiducialsNodeSelector.removeEnabled = False ioFormLayout.addRow( "Start Point:", self.__seedFiducialsNodeSelector ) self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)', self.__seedFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)' ) self.__seedFiducialsNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onSeedChanged ) self.__ioAdvancedToggle = qt.QCheckBox( "Show Advanced Properties" ) self.__ioAdvancedToggle.setChecked( False ) ioFormLayout.addRow( self.__ioAdvancedToggle ) # # I/O advanced panel # self.__ioAdvancedPanel = qt.QFrame( ioCollapsibleButton ) self.__ioAdvancedPanel.hide() self.__ioAdvancedPanel.setFrameStyle( 6 ) ioFormLayout.addRow( self.__ioAdvancedPanel ) self.__ioAdvancedToggle.connect( "clicked()", self.onIOAdvancedToggle ) ioAdvancedFormLayout = qt.QFormLayout( self.__ioAdvancedPanel ) # outputModel selector self.__outputModelNodeSelector = slicer.qMRMLNodeComboBox() self.__outputModelNodeSelector.objectName = 'outputModelNodeSelector' self.__outputModelNodeSelector.toolTip = "Select the output model for the Centerlines." self.__outputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.__outputModelNodeSelector.baseName = "CenterlineComputationModel" self.__outputModelNodeSelector.hideChildNodeTypes = ['vtkMRMLAnnotationNode'] # hide all annotation nodes self.__outputModelNodeSelector.noneEnabled = False self.__outputModelNodeSelector.addEnabled = True self.__outputModelNodeSelector.selectNodeUponCreation = True self.__outputModelNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow( "Output Centerline Model:", self.__outputModelNodeSelector ) self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)', self.__outputModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)' ) # voronoiModel selector self.__voronoiModelNodeSelector = slicer.qMRMLNodeComboBox() self.__voronoiModelNodeSelector.objectName = 'voronoiModelNodeSelector' self.__voronoiModelNodeSelector.toolTip = "Select the output model for the Voronoi Diagram." self.__voronoiModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.__voronoiModelNodeSelector.baseName = "VoronoiModel" self.__voronoiModelNodeSelector.hideChildNodeTypes = ['vtkMRMLAnnotationNode'] # hide all annotation nodes self.__voronoiModelNodeSelector.noneEnabled = False self.__voronoiModelNodeSelector.addEnabled = True self.__voronoiModelNodeSelector.selectNodeUponCreation = True self.__voronoiModelNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow( "Output Voronoi Model:", self.__voronoiModelNodeSelector ) self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)', self.__voronoiModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)' ) # # Reset, preview and apply buttons # self.__buttonBox = qt.QDialogButtonBox() self.__resetButton = self.__buttonBox.addButton( self.__buttonBox.RestoreDefaults ) self.__resetButton.toolTip = "Click to reset all input elements to default." self.__previewButton = self.__buttonBox.addButton( self.__buttonBox.Discard ) self.__previewButton.setIcon( qt.QIcon() ) self.__previewButton.text = "Preview.." self.__previewButton.toolTip = "Click to refresh the preview." self.__startButton = self.__buttonBox.addButton( self.__buttonBox.Apply ) self.__startButton.setIcon( qt.QIcon() ) self.__startButton.text = "Start!" self.__startButton.enabled = False self.__startButton.toolTip = "Click to start the filtering." self.layout.addWidget( self.__buttonBox ) self.__resetButton.connect( "clicked()", self.restoreDefaults ) self.__previewButton.connect( "clicked()", self.onRefreshButtonClicked ) self.__startButton.connect( "clicked()", self.onStartButtonClicked ) self.__inputModelNodeSelector.setMRMLScene( slicer.mrmlScene ) self.__seedFiducialsNodeSelector.setMRMLScene( slicer.mrmlScene ) self.__outputModelNodeSelector.setMRMLScene( slicer.mrmlScene ) self.__voronoiModelNodeSelector.setMRMLScene( slicer.mrmlScene ) # be ready for events self.__updating = 0 # set default values self.restoreDefaults() # compress the layout self.layout.addStretch( 1 )
def setup(self): ScriptedLoadableModuleWidget.setup(self) # # the I/O panel # inputsCollapsibleButton = ctk.ctkCollapsibleButton() inputsCollapsibleButton.text = "Inputs" self.layout.addWidget(inputsCollapsibleButton) inputsFormLayout = qt.QFormLayout(inputsCollapsibleButton) # inputVolume selector self.inputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.inputVolumeNodeSelector.objectName = 'inputVolumeNodeSelector' self.inputVolumeNodeSelector.toolTip = "Select the input volume. This should always be the original image and not a vesselness image, if possible." self.inputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.inputVolumeNodeSelector.noneEnabled = False self.inputVolumeNodeSelector.addEnabled = False self.inputVolumeNodeSelector.removeEnabled = False inputsFormLayout.addRow("Input Volume:", self.inputVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.inputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.inputVolumeNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onInputVolumeChanged) # vesselnessVolume selector self.vesselnessVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.vesselnessVolumeNodeSelector.objectName = 'vesselnessVolumeNodeSelector' self.vesselnessVolumeNodeSelector.toolTip = "Select the input vesselness volume." self.vesselnessVolumeNodeSelector.nodeTypes = [ 'vtkMRMLScalarVolumeNode' ] self.vesselnessVolumeNodeSelector.noneEnabled = True self.vesselnessVolumeNodeSelector.addEnabled = False self.vesselnessVolumeNodeSelector.removeEnabled = False inputsFormLayout.addRow("Vesselness Volume:", self.vesselnessVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.vesselnessVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.vesselnessVolumeNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onVesselnessVolumeChanged) self.vesselnessVolumeNodeSelector.setCurrentNode(None) # seed selector self.seedFiducialsNodeSelector = slicer.qSlicerSimpleMarkupsWidget() self.seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.seedFiducialsNodeSelector.toolTip = "Select start and end point of the vessel branch. Only the first and last point in the list are used." self.seedFiducialsNodeSelector.defaultNodeColor = qt.QColor( 0, 0, 255) # blue self.seedFiducialsNodeSelector.jumpToSliceEnabled = True self.seedFiducialsNodeSelector.markupsPlaceWidget( ).placeMultipleMarkups = slicer.qSlicerMarkupsPlaceWidget.ForcePlaceMultipleMarkups self.seedFiducialsNodeSelector.setNodeBaseName("seeds") self.seedFiducialsNodeSelector.markupsSelectorComboBox( ).baseName = "Seeds" self.seedFiducialsNodeSelector.markupsSelectorComboBox( ).noneEnabled = False self.seedFiducialsNodeSelector.markupsSelectorComboBox( ).removeEnabled = True inputsFormLayout.addRow("Seeds:", self.seedFiducialsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.seedFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # stopper selector self.stopperFiducialsNodeSelector = slicer.qSlicerSimpleMarkupsWidget() self.stopperFiducialsNodeSelector.objectName = 'stopperFiducialsNodeSelector' self.stopperFiducialsNodeSelector.toolTip = "(Optional) Select a hierarchy containing the fiducials to use as Stoppers. Whenever one stopper is reached, the segmentation stops." self.stopperFiducialsNodeSelector.defaultNodeColor = qt.QColor( 0, 0, 255) # blue self.stopperFiducialsNodeSelector.setNodeBaseName("seeds") self.stopperFiducialsNodeSelector.tableWidget().hide() self.stopperFiducialsNodeSelector.markupsSelectorComboBox( ).baseName = "Stoppers" self.stopperFiducialsNodeSelector.markupsSelectorComboBox( ).noneEnabled = True self.stopperFiducialsNodeSelector.markupsSelectorComboBox( ).removeEnabled = True inputsFormLayout.addRow("Stoppers:", self.stopperFiducialsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.stopperFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # # Outputs # outputsCollapsibleButton = ctk.ctkCollapsibleButton() outputsCollapsibleButton.text = "Outputs" self.layout.addWidget(outputsCollapsibleButton) outputsFormLayout = qt.QFormLayout(outputsCollapsibleButton) # outputVolume selector self.outputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.outputVolumeNodeSelector.toolTip = "Select the output labelmap." self.outputVolumeNodeSelector.nodeTypes = ['vtkMRMLLabelMapVolumeNode'] self.outputVolumeNodeSelector.baseName = "LevelSetSegmentation" self.outputVolumeNodeSelector.noneEnabled = False self.outputVolumeNodeSelector.addEnabled = True self.outputVolumeNodeSelector.selectNodeUponCreation = True self.outputVolumeNodeSelector.removeEnabled = True outputsFormLayout.addRow("Output Labelmap:", self.outputVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.outputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # outputModel selector self.outputModelNodeSelector = slicer.qMRMLNodeComboBox() self.outputModelNodeSelector.objectName = 'outputModelNodeSelector' self.outputModelNodeSelector.toolTip = "Select the output model." self.outputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.outputModelNodeSelector.hideChildNodeTypes = [ 'vtkMRMLAnnotationNode' ] # hide all annotation nodes self.outputModelNodeSelector.baseName = "LevelSetSegmentationModel" self.outputModelNodeSelector.noneEnabled = False self.outputModelNodeSelector.addEnabled = True self.outputModelNodeSelector.selectNodeUponCreation = True self.outputModelNodeSelector.removeEnabled = True outputsFormLayout.addRow("Output Model:", self.outputModelNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.outputModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # # the segmentation panel # segmentationCollapsibleButton = ctk.ctkCollapsibleButton() segmentationCollapsibleButton.text = "Segmentation" self.layout.addWidget(segmentationCollapsibleButton) segmentationFormLayout = qt.QFormLayout(segmentationCollapsibleButton) # Threshold slider thresholdLabel = qt.QLabel() thresholdLabel.text = "Thresholding" + (' ' * 7) thresholdLabel.toolTip = "Choose the intensity range to segment." thresholdLabel.setAlignment(4) segmentationFormLayout.addRow(thresholdLabel) self.thresholdSlider = slicer.qMRMLRangeWidget() segmentationFormLayout.addRow(self.thresholdSlider) self.thresholdSlider.connect('valuesChanged(double,double)', self.onThresholdSliderChanged) self.segmentationAdvancedToggle = qt.QCheckBox( "Show Advanced Segmentation Properties") self.segmentationAdvancedToggle.setChecked(False) segmentationFormLayout.addRow(self.segmentationAdvancedToggle) # # segmentation advanced panel # self.segmentationAdvancedPanel = qt.QFrame( segmentationCollapsibleButton) self.segmentationAdvancedPanel.hide() self.segmentationAdvancedPanel.setFrameStyle(6) segmentationFormLayout.addRow(self.segmentationAdvancedPanel) self.segmentationAdvancedToggle.connect( "clicked()", self.onSegmentationAdvancedToggle) segmentationAdvancedFormLayout = qt.QFormLayout( self.segmentationAdvancedPanel) # inflation slider inflationLabel = qt.QLabel() inflationLabel.text = "less inflation <-> more inflation" + (' ' * 14) inflationLabel.setAlignment(4) inflationLabel.toolTip = "Define how fast the segmentation expands." segmentationAdvancedFormLayout.addRow(inflationLabel) self.inflationSlider = ctk.ctkSliderWidget() self.inflationSlider.decimals = 0 self.inflationSlider.minimum = -100 self.inflationSlider.maximum = 100 self.inflationSlider.singleStep = 10 self.inflationSlider.toolTip = inflationLabel.toolTip segmentationAdvancedFormLayout.addRow(self.inflationSlider) # curvature slider curvatureLabel = qt.QLabel() curvatureLabel.text = "less curvature <-> more curvature" + (' ' * 14) curvatureLabel.setAlignment(4) curvatureLabel.toolTip = "Choose a high curvature to generate a smooth segmentation." segmentationAdvancedFormLayout.addRow(curvatureLabel) self.curvatureSlider = ctk.ctkSliderWidget() self.curvatureSlider.decimals = 0 self.curvatureSlider.minimum = -100 self.curvatureSlider.maximum = 100 self.curvatureSlider.singleStep = 10 self.curvatureSlider.toolTip = curvatureLabel.toolTip segmentationAdvancedFormLayout.addRow(self.curvatureSlider) # attraction slider attractionLabel = qt.QLabel() attractionLabel.text = "less attraction to gradient <-> more attraction to gradient" + ( ' ' * 14) attractionLabel.setAlignment(4) attractionLabel.toolTip = "Configure how the segmentation travels towards gradient ridges (vessel lumen wall)." segmentationAdvancedFormLayout.addRow(attractionLabel) self.attractionSlider = ctk.ctkSliderWidget() self.attractionSlider.decimals = 0 self.attractionSlider.minimum = -100 self.attractionSlider.maximum = 100 self.attractionSlider.singleStep = 10 self.attractionSlider.toolTip = attractionLabel.toolTip segmentationAdvancedFormLayout.addRow(self.attractionSlider) # iteration spinbox self.iterationSpinBox = qt.QSpinBox() self.iterationSpinBox.minimum = 0 self.iterationSpinBox.maximum = 5000 self.iterationSpinBox.singleStep = 10 self.iterationSpinBox.toolTip = "Choose the number of evolution iterations." segmentationAdvancedFormLayout.addRow((' ' * 100) + "Iterations:", self.iterationSpinBox) # # Reset, preview and apply buttons # self.buttonBox = qt.QDialogButtonBox() self.resetButton = self.buttonBox.addButton( self.buttonBox.RestoreDefaults) self.resetButton.toolTip = "Click to reset all input elements to default." self.previewButton = self.buttonBox.addButton(self.buttonBox.Discard) self.previewButton.setIcon(qt.QIcon()) self.previewButton.text = "Preview" self.previewButton.toolTip = "Click to refresh the preview." self.startButton = self.buttonBox.addButton(self.buttonBox.Apply) self.startButton.setIcon(qt.QIcon()) self.startButton.text = "Start" self.startButton.enabled = False self.startButton.toolTip = "Click to start the filtering." self.layout.addWidget(self.buttonBox) self.resetButton.connect("clicked()", self.restoreDefaults) self.previewButton.connect("clicked()", self.onPreviewButtonClicked) self.startButton.connect("clicked()", self.onStartButtonClicked) self.inputVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.seedFiducialsNodeSelector.setMRMLScene(slicer.mrmlScene) self.vesselnessVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.outputVolumeNodeSelector.setMRMLScene(slicer.mrmlScene) self.outputModelNodeSelector.setMRMLScene(slicer.mrmlScene) self.stopperFiducialsNodeSelector.setMRMLScene(slicer.mrmlScene) # set default values self.restoreDefaults() self.onInputVolumeChanged() # compress the layout self.layout.addStretch(1)
def setup(self): ScriptedLoadableModuleWidget.setup(self) # # Inputs # inputsCollapsibleButton = ctk.ctkCollapsibleButton() inputsCollapsibleButton.text = "Inputs" self.layout.addWidget(inputsCollapsibleButton) inputsFormLayout = qt.QFormLayout(inputsCollapsibleButton) # inputVolume selector self.inputModelNodeSelector = slicer.qMRMLNodeComboBox() self.inputModelNodeSelector.objectName = 'inputModelNodeSelector' self.inputModelNodeSelector.toolTip = "Select the input model." self.inputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.inputModelNodeSelector.hideChildNodeTypes = ['vtkMRMLAnnotationNode'] # hide all annotation nodes self.inputModelNodeSelector.noneEnabled = False self.inputModelNodeSelector.addEnabled = False self.inputModelNodeSelector.removeEnabled = False inputsFormLayout.addRow("Vessel tree model:", self.inputModelNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.inputModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # seed selector self.seedFiducialsNodeSelector = slicer.qSlicerSimpleMarkupsWidget() self.seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.seedFiducialsNodeSelector = slicer.qSlicerSimpleMarkupsWidget() self.seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.seedFiducialsNodeSelector.toolTip = "Select a fiducial to use as the origin of the Centerline." self.seedFiducialsNodeSelector.setNodeBaseName("OriginSeed") self.seedFiducialsNodeSelector.defaultNodeColor = qt.QColor(0,255,0) self.seedFiducialsNodeSelector.tableWidget().hide() self.seedFiducialsNodeSelector.markupsSelectorComboBox().noneEnabled = False self.seedFiducialsNodeSelector.markupsPlaceWidget().placeMultipleMarkups = slicer.qSlicerMarkupsPlaceWidget.ForcePlaceSingleMarkup inputsFormLayout.addRow("Start point:", self.seedFiducialsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.seedFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # # Outputs # outputsCollapsibleButton = ctk.ctkCollapsibleButton() outputsCollapsibleButton.text = "Outputs" self.layout.addWidget(outputsCollapsibleButton) outputsFormLayout = qt.QFormLayout(outputsCollapsibleButton) # outputModel selector self.outputModelNodeSelector = slicer.qMRMLNodeComboBox() self.outputModelNodeSelector.objectName = 'outputModelNodeSelector' self.outputModelNodeSelector.toolTip = "Select the output model for the Centerlines." self.outputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.outputModelNodeSelector.baseName = "CenterlineComputationModel" self.outputModelNodeSelector.hideChildNodeTypes = ['vtkMRMLAnnotationNode'] # hide all annotation nodes self.outputModelNodeSelector.noneEnabled = True self.outputModelNodeSelector.noneDisplay = "Create new model" self.outputModelNodeSelector.addEnabled = True self.outputModelNodeSelector.selectNodeUponCreation = True self.outputModelNodeSelector.removeEnabled = True outputsFormLayout.addRow("Centerline model:", self.outputModelNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.outputModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.outputEndPointsNodeSelector = slicer.qMRMLNodeComboBox() self.outputEndPointsNodeSelector.objectName = 'outputEndPointsNodeSelector' self.outputEndPointsNodeSelector.toolTip = "Select the output model for the Centerlines." self.outputEndPointsNodeSelector.nodeTypes = ['vtkMRMLMarkupsFiducialNode'] self.outputEndPointsNodeSelector.baseName = "Centerline endpoints" self.outputEndPointsNodeSelector.noneEnabled = True self.outputEndPointsNodeSelector.noneDisplay = "Create new markups fiducial" self.outputEndPointsNodeSelector.addEnabled = True self.outputEndPointsNodeSelector.selectNodeUponCreation = True self.outputEndPointsNodeSelector.removeEnabled = True outputsFormLayout.addRow("Centerline endpoints:", self.outputEndPointsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.outputEndPointsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # voronoiModel selector self.voronoiModelNodeSelector = slicer.qMRMLNodeComboBox() self.voronoiModelNodeSelector.objectName = 'voronoiModelNodeSelector' self.voronoiModelNodeSelector.toolTip = "Select the output model for the Voronoi Diagram." self.voronoiModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.voronoiModelNodeSelector.baseName = "VoronoiModel" self.voronoiModelNodeSelector.hideChildNodeTypes = ['vtkMRMLAnnotationNode'] # hide all annotation nodes self.voronoiModelNodeSelector.noneEnabled = True self.voronoiModelNodeSelector.addEnabled = True self.voronoiModelNodeSelector.selectNodeUponCreation = True self.voronoiModelNodeSelector.removeEnabled = True outputsFormLayout.addRow("Voronoi Model:", self.voronoiModelNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.voronoiModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # # Reset, preview and apply buttons # self.buttonBox = qt.QDialogButtonBox() self.previewButton = self.buttonBox.addButton(self.buttonBox.Discard) self.previewButton.setIcon(qt.QIcon()) self.previewButton.text = "Preview" self.previewButton.toolTip = "Click to refresh the preview." self.startButton = self.buttonBox.addButton(self.buttonBox.Apply) self.startButton.setIcon(qt.QIcon()) self.startButton.text = "Start" self.startButton.enabled = False self.startButton.toolTip = "Click to start the filtering." self.layout.addWidget(self.buttonBox) self.previewButton.connect("clicked()", self.onPreviewButtonClicked) self.startButton.connect("clicked()", self.onStartButtonClicked) self.inputModelNodeSelector.setMRMLScene(slicer.mrmlScene) self.seedFiducialsNodeSelector.setMRMLScene(slicer.mrmlScene) self.outputModelNodeSelector.setMRMLScene(slicer.mrmlScene) self.outputEndPointsNodeSelector.setMRMLScene(slicer.mrmlScene) self.voronoiModelNodeSelector.setMRMLScene(slicer.mrmlScene) # compress the layout self.layout.addStretch(1)