def setModules(self, modules): self.ui.moduleList.clear() self._moduleItems = {} for module in modules: item = qt.QListWidgetItem(module.key) item.setFlags(item.flags() | qt.Qt.ItemIsUserCheckable) item.setCheckState(qt.Qt.Checked) self.ui.moduleList.addItem(item) self._moduleItems[item] = module if len(modules) > 1: self.ui.label.text = ( "The following modules can be loaded. " "Would you like to load them now?") elif len(modules) == 1: self.ui.label.text = ( "The following module can be loaded. " "Would you like to load it now?") else: raise ValueError("At least one module must be provided") self.validate()
def _onAddMeasurementButtonClicked(self): # TODO: findings assessment # TODO: add segmentation and enable editor listWidgetItem = qt.QListWidgetItem(self._measurementsListWidget) self._measurementsListWidget.addItem(listWidgetItem) findingsItemWidget = ProstateMeasurementItemWidget() listWidgetItem.setSizeHint(findingsItemWidget.sizeHint) self._findingsListWidget.setItemWidget(listWidgetItem, findingsItemWidget) self._findingsListWidget.selectionModel().clear() model = self._findingsListWidget.model() self._findingsListWidget.selectionModel().setCurrentIndex(model.index(model.rowCount()-1, 0), qt.QItemSelectionModel.Select) self.updateButtons()
def _fillAnnotationTable(self): self._annotationListWidget.clear() for volume in self._volumeNodes: volumeSeriesTypes = VolumeSeriesTypeSceneObserver( ).volumeSeriesTypes if volume in volumeSeriesTypes: seriesType = volumeSeriesTypes[volume] listWidgetItem = qt.QListWidgetItem(self._annotationListWidget) self._annotationListWidget.addItem(listWidgetItem) annotationItemWidget = AnnotationItemWidget( self._finding, seriesType) listWidgetItem.setSizeHint(annotationItemWidget.sizeHint) self._annotationListWidget.setItemWidget( listWidgetItem, annotationItemWidget) else: logging.info( "Could not find matching series type for volume %s" % volume.GetName())
def calculateTargetsDistance(self): self.targetDistanceWidget.clear() if self.targetTablePlugin.currentTargets is not None: numberOfTargets = self.targetTablePlugin.currentTargets.GetNumberOfFiducials( ) for targetIndex_A in range(numberOfTargets): for targetIndex_B in range(targetIndex_A + 1, numberOfTargets): tAName = self.targetTablePlugin.currentTargets.GetNthFiducialLabel( targetIndex_A) tBName = self.targetTablePlugin.currentTargets.GetNthFiducialLabel( targetIndex_B) posA = 3 * [0.0] posB = 3 * [0.0] self.targetTablePlugin.currentTargets.GetNthFiducialPosition( targetIndex_A, posA) self.targetTablePlugin.currentTargets.GetNthFiducialPosition( targetIndex_B, posB) dist = numpy.linalg.norm( numpy.array(posA) - numpy.array(posB)) / 10.0 itemString = str(tAName) + " -> " + str( tBName) + ": " + '%3.1f' % dist + " cm" tmpWidgetItem = qt.QListWidgetItem(itemString) self.targetDistanceWidget.addItem(tmpWidgetItem) pass
def setup(self): ScriptedLoadableModuleWidget.setup(self) self.logic = SegmentationExtractionModuleLogic() # ------ 1. CREACION LAYOUT Y BOTONES ------ self.layoutManager = slicer.app.layoutManager() self.layoutManager.setLayout(0) # # CARGAR IMAGEN # # Creacion layout collapsibleButtonLoad = ctk.ctkCollapsibleButton() collapsibleButtonLoad.text = "Load Files" self.layout.addWidget(collapsibleButtonLoad) formLayout_load = qt.QFormLayout(collapsibleButtonLoad) # Definir botones para cargar DICOM y crop volume # DICOM self.inputDICOM_label = qt.QLabel('DICOM Location: ') self.loadDICOM_button = qt.QPushButton('Search DICOM') self.loadDICOM_button.accessibleDescription = 'DICOM' self.loadDICOM_button.toolTip = "Search DICOM" self.loadDICOM_button.enabled = True formLayout_load.addRow(self.inputDICOM_label, self.loadDICOM_button) # Crop Volume self.inputCropVolume_label = qt.QLabel('Crop Volume location: ') self.loadCropVolume_button = qt.QPushButton('Search Crop Volume ') self.loadCropVolume_button.accessibleDescription = 'Volume' self.loadCropVolume_button.toolTip = "Search Crop Volume" formLayout_load.addRow(self.inputCropVolume_label, self.loadCropVolume_button) # # Cuadro de texto para introducir el directorio de la imagen a cargar # self.inputImage_label = qt.QLabel('Imagen original: ') # self.inputImage_textInput = qt.QLineEdit() # self.inputImage_textInput.text = 'C:/Slicer/Pyramid/Pyramid/Data/inputImage.png' # formLayout_load.addRow(self.inputImage_label, self.inputImage_textInput) # incluimos el cuadro de texto al layout # Boton para cargar imagen self.loadImagesButton = qt.QPushButton("Load Files") self.loadImagesButton.toolTip = "Load files" self.loadImagesButton.enabled = True formLayout_load.addRow( self.loadImagesButton) # incluimos el boton al layout # SEGMENTATIONS TO EXPORT collapsibleButtonSegmentation = ctk.ctkCollapsibleButton() collapsibleButtonSegmentation.text = "Segmentations to Export" self.layout.addWidget(collapsibleButtonSegmentation) formLayout_segmentation = qt.QFormLayout( collapsibleButtonSegmentation) # Layout dentro de la seccion # # create table # # Original Contour Names table # self.segmentationsTable = qt.QTableWidget(5, 1) # self.segmentationsTable.setHorizontalHeaderLabels([" "]) # self.segmentationsTable.setVerticalHeaderLabels(" ") # newItem = qt.QTableWidgetItem(3) # self.segmentationsTable.setItem(1,1, newItem) # formLayout_segmentation.addRow(self.segmentationsTable) # call function to get names of contours # define lists self.contour_names = ['Ojo', 'medula', 'tronco', 'paciente'] self.original_contour_list = qt.QListWidget() # Initiate empty list of exported contours at first (None selected) self.exported_contours_list = qt.QListWidget() # Initiate empty list of exported contours at first (None selected) for contour in self.contour_names: contour_item = qt.QListWidgetItem(contour) self.original_contour_list.addItem(contour_item) # define button layout vertical_layout_buttons = qt.QVBoxLayout() # define forwards button self.move_segments_forwards_button = qt.QPushButton(">") self.move_segments_forwards_button.toolTip = "Copy segmentations" self.move_segments_forwards_button.enabled = True vertical_layout_buttons.addWidget(self.move_segments_forwards_button) vertical_layout_buttons.addStretch() #define backwards button. Set enable = False at the beginning self.move_segments_backwards_button = qt.QPushButton("<") self.move_segments_backwards_button.toolTip = "Eliminate segmentation from exported list" self.move_segments_backwards_button.enabled = True vertical_layout_buttons.addWidget(self.move_segments_backwards_button) vertical_layout_buttons.addStretch() # export button self.export_button = qt.QPushButton('Export Labelmaps') self.export_button.enabled = True #define titles # title_right = qt.QLabel('Original segmentation') # title_right.setAlignment(qt.Qt.AlignRight) # title_left = qt.QLabel('Segmentations to export') # title_left.setAlignment(qt.Qt.AlignLeft) # set layout horizontal_layout = qt.QHBoxLayout() horizontal_layout.addWidget(self.original_contour_list) horizontal_layout.addLayout(vertical_layout_buttons) horizontal_layout.addWidget(self.exported_contours_list) #formLayout_segmentation.addRow(title_right, title_left) formLayout_segmentation.addRow(horizontal_layout) formLayout_segmentation.addRow(self.export_button) # # GUARDAR IMAGEN # # Creacion Layout collapsibleButtonSave = ctk.ctkCollapsibleButton() collapsibleButtonSave.text = "Save Labelmaps" self.layout.addWidget(collapsibleButtonSave) formLayout_save = qt.QFormLayout( collapsibleButtonSave) # Layout dentro de la seccion # Cuadro de texto para indicar el directorio de la imagen de salida (procesada) self.outputImage_label = qt.QLabel('Select folder to save: ') self.folder_to_save = qt.QPushButton( 'Explore') #'C:/Slicer/Pyramid/Pyramid/Data/outputImage.png' formLayout_save.addRow( self.outputImage_label, self.folder_to_save) # incluimos el cuadro de texto al layout # Boton para guardar imagen self.saveImageButton = qt.QPushButton("Save labelmaps") self.saveImageButton.toolTip = "Save labelmaps" self.saveImageButton.enabled = True formLayout_save.addRow( self.saveImageButton) # incluimos el boton al layout # Incluimos un espacio en vertical self.layout.addStretch(1) # ------ 2. CONEXION BOTONES CON FUNCIONES ------ # Conectar cada boton a una funcion self.loadDICOM_button.connect('clicked(bool)', self.config_dialog_dicom) self.loadCropVolume_button.connect('clicked(bool)', self.config_dialog_cropped_volume) self.loadImagesButton.connect('clicked(bool)', self.onLoadImageButton) self.move_segments_forwards_button.connect('clicked(bool)', self.move_segments_forwards) self.move_segments_backwards_button.connect( 'clicked(bool)', self.move_segments_backwards)