def applyTextStyle(self, mode): """ Applies a stylistic change to text depending on the 'mode' argument specified. Empty searchLines are italicized. """ if mode == 'empty': self.searchLine.setFont(self.MODULE.GLOBALS.LABEL_FONT_ITALIC) palette = qt.QPalette() color = qt.QColor(150, 150, 150) palette.setColor(6, color) self.searchLine.setPalette(palette) self.searchLine.update() self.searchLine.setFont(self.MODULE.GLOBALS.LABEL_FONT_ITALIC) self.searchLine.setObjectName("searchLine") self.searchLine.setStyleSheet( "#searchLine {color: lightgray; border: none}") elif mode == 'not empty': self.searchLine.setStyleSheet( "#searchLine {color: rgb(20,40, 200); border: none}") self.searchLine.setFont(self.MODULE.GLOBALS.LABEL_FONT) palette = qt.QPalette() color = qt.QColor(0, 0, 0) palette.setColor(6, color) self.searchLine.setPalette(palette)
def onFillButtonClicked(self): print "Llenado" #Defino modelo para agregar al widget de tabla self.modelo = qt.QStandardItemModel() genMod = self.modelo self.items = [] #Agrego modelo a widget self.vista.setModel(self.modelo) fila = 0 for i in range(1, 8): #objeto item a agregar item = qt.QStandardItem() color = qt.QColor() color.setRgb(0, 250, 0) item.setData(color, 1) #agrego item a modelo fila, columna, item self.modelo.setItem(fila, 0, item) self.items.append(item) columna = 0 for k in range(1, 8): item = qt.QStandardItem() item.setText('Texto') color.setRgb(random.randrange(0, 255), random.randrange(0, 255), random.randrange(0, 255)) item.setData(color, 1) self.modelo.setItem(fila, columna, item) self.items.append(item) columna += 1 fila += 1 #Hago visible el widget y deshabilito el boton self.vista.visible = True self.fillTable.enabled = False
def addRow(self, c): name = self.colorNode.GetColorName(c) lut = self.colorNode.GetLookupTable() rgb = lut.GetTableValue(c) brush = qt.QBrush() self.brushes.append(brush) color = qt.QColor() color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) brush.setColor(color) # index item = qt.QStandardItem() item.setText(str(c)) self.model.setItem(self.row, 0, item) self.items.append(item) # color item = qt.QStandardItem() item.setData(color, 1) self.model.setItem(self.row, 1, item) self.items.append(item) # name item = qt.QStandardItem() item.setText(self.colorNode.GetColorName(c)) self.model.setItem(self.row, 2, item) self.items.append(item) self.row += 1
def RGBtoHex(r,g,b, satMod = 1.0): col = qt.QColor(r,g,b) sat = col.saturation() * satMod col.setHsv(col.hue(),sat,col.value()) return col.name()
def _newItemPlaceholderItem(parent): palette = parent.palette color = qt.QColor(palette.text().color()) color.setAlphaF(0.5) item = qt.QTreeWidgetItem() item.setText(0, "(New item)") item.setForeground(0, qt.QBrush(color)) return item
def makeLoginButton(LoginMenu): """ Connects the login to the first treeView call """ plt = qt.QPalette() plt.setColor(qt.QPalette().Button, qt.QColor(255, 255, 255)) loginButton = qt.QPushButton("Login") loginButton.setFont(LoginMenu.LABEL_FONT) loginButton.toolTip = "Login to selected Xnat host" loginButton.setFixedSize(48, 24) return loginButton
def populateStats(self): if not self.logic: return displayNode = self.labelNode.GetDisplayNode() colorNode = displayNode.GetColorNode() lut = colorNode.GetLookupTable() self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 for i in self.logic.labelStats["Labels"]: col = 0 color = qt.QColor() rgb = lut.GetTableValue(i) color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, qt.Qt.DecorationRole) item.setToolTip(colorNode.GetColorName(i)) item.setEditable(False) self.model.setItem(row, col, item) self.items.append(item) col += 1 item = qt.QStandardItem() item.setData(colorNode.GetColorName(i), qt.Qt.DisplayRole) item.setEditable(False) self.model.setItem(row, col, item) self.items.append(item) col += 1 for k in self.logic.keys: item = qt.QStandardItem() # set data as float with Qt::DisplayRole item.setData(float(self.logic.labelStats[i, k]), qt.Qt.DisplayRole) item.setToolTip(colorNode.GetColorName(i)) item.setEditable(False) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 self.view.setColumnWidth(0, 30) self.model.setHeaderData(0, 1, " ") self.model.setHeaderData(1, 1, "Type") col = 2 for k in self.logic.keys: self.view.setColumnWidth(col, 15 * len(k)) self.model.setHeaderData(col, 1, k) col += 1
def createUserInterface(self): from Editor import EditorWidget self.__layout = self.__parent.createUserInterface() #endoSegmentButton = qt.QPushButton('Open Slicer Editor tool') #self.__layout.addRow(endoSegmentButton) #endoSegmentButton.connect('clicked()', self.startEditor) #TODO: Create label map and set it for editing by user? #volumesLogic = slicer.modules.volumes.logic() #headLabel = volumesLogic.CreateLabelVolume( slicer.mrmlScene, head, head.GetName() + '-segmentation' ) #selectionNode = slicer.app.applicationLogic().GetSelectionNode() #selectionNode.SetReferenceActiveVolumeID( head.GetID() ) #selectionNode.SetReferenceActiveLabelVolumeID( headLabel.GetID() ) #slicer.app.applicationLogic().PropagateVolumeSelection(0) self.updateParameters(self.parameterNode()) editorFrame = qt.QFrame() editorFrame.setLayout(qt.QVBoxLayout()) palette = editorFrame.palette bgColor = 230 palette.setColor(qt.QPalette.Background, qt.QColor(bgColor, bgColor, bgColor)) editorFrame.setPalette(palette) editorFrame.setAutoFillBackground(True) self.__layout.addRow(editorFrame) self.editorFrame = editorFrame global editorWidget self.editorWidget = EditorWidget(parent=self.editorFrame, showVolumesFrame=True) self.editorWidget.setup() self.editorWidget.enter() ##TODO: How to set the required merge node? wallCleanupSegLabel = qt.QLabel('Final Wall Segmentation Image:') self.__wallCleanupSegSelector = slicer.qMRMLNodeComboBox() self.__wallCleanupSegSelector.toolTip = "Choose the final wall segmentation label image." self.__wallCleanupSegSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.__wallCleanupSegSelector.setMRMLScene(slicer.mrmlScene) self.__wallCleanupSegSelector.addEnabled = 0 self.__layout.addRow(wallCleanupSegLabel, self.__wallCleanupSegSelector) # Hide unnecessary button findChildren(text='AutomaticLeft*')[0].hide()
def __init__(self, parent=None, width=400, height=400, showWidget=False, scale=False): super(LayerReveal, self).__init__() self.width = width self.height = height self.showWidget = showWidget self.scale = scale self.renderer = None # utility Qt instances for use in methods self.gray = qt.QColor() self.gray.setRedF(0.5) self.gray.setGreenF(0.5) self.gray.setBlueF(0.5) # a painter to use for various jobs self.painter = qt.QPainter() # make a qwidget display if self.showWidget: self.frame = qt.QFrame(parent) mw = slicer.util.mainWindow() self.frame.setGeometry(mw.x, mw.y, self.width, self.height) self.frameLayout = qt.QVBoxLayout(self.frame) self.label = qt.QLabel() self.frameLayout.addWidget(self.label) self.frame.show() # make an image actor in the slice view self.vtkImage = vtk.vtkImageData() self.mrmlUtils = slicer.qMRMLUtils() self.imageMapper = vtk.vtkImageMapper() self.imageMapper.SetColorLevel(128) self.imageMapper.SetColorWindow(255) if vtk.VTK_MAJOR_VERSION <= 5: self.imageMapper.SetInput(self.vtkImage) else: self.imageMapper.SetInputData(self.vtkImage) self.actor2D = vtk.vtkActor2D() self.actor2D.SetMapper(self.imageMapper)
def __init__(self): self.inputFiberModel = None self.glyphSpace=20 self.glyphScale=2000 self.tubeScale=5 self.lineNum=1 self.lineSpace=10 self.showLines=True self.showTensor1=True self.showTensor2=True self.showTubes=False self.sactorCreated=False self.sactor=None; self.actor=None; self.ren=None; self.renWin=None self.mapper=None; self.onlyOneLine=False self.bodRFlag=0 self.bodGFlag=0 self.bodBFlag=0 self.bodAFlag=0 self.bodRValue=0 self.bodGValue=0 self.bodBValue=0 self.bodAValue=0 self.bodRName="" self.bodGName="" self.bodBName="" self.bodAName="" self.tubeFixedColor=qt.QColor(128,128,128,255) self.tubeMappedToName="" self.tubeFixedSize=1 self.tubeColorFlag=0 self.tubeSizeFlag=0
def populateStats(self): if not self.logic: return displayNode = self.labelNode.GetDisplayNode() colorNode = displayNode.GetColorNode() lut = colorNode.GetLookupTable() self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 for i in self.logic.labelStats["Labels"]: color = qt.QColor() rgb = lut.GetTableValue(i) color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, 1) item.setToolTip(colorNode.GetColorName(i)) self.model.setItem(row, 0, item) self.items.append(item) col = 1 for k in self.logic.keys: item = qt.QStandardItem() if col == 1: item.setText(self.logic.labelStats[i, k]) else: item.setText("%.3f" % self.logic.labelStats[i, k]) item.setToolTip(colorNode.GetColorName(i)) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 self.view.setColumnWidth(0, 30) self.model.setHeaderData(0, 1, " ") col = 1 for k in self.logic.keys: self.view.setColumnWidth(col, 15 * len(k)) self.model.setHeaderData(col, 1, k) col += 1
def populateStats(self): """This Logic is copied from the Label Statistics Module -Steve Pieper (Isomics)""" # Populate the table with SegmentCAD label map statistics if not (self.logic and self.statisticsLogic): return displayNode = self.nodeSegmentCAD.GetDisplayNode() colorNode = displayNode.GetColorNode() lut = colorNode.GetLookupTable() self.items = [] self.model = qt.QStandardItemModel() self.labelStatisticsTableView.setModel(self.model) self.labelStatisticsTableView.verticalHeader().visible = False row = 0 for i in self.statisticsLogic.labelStats["Labels"]: color = qt.QColor() rgb = lut.GetTableValue(i) color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, 1) item.setToolTip(colorNode.GetColorName(i)) self.model.setItem(row, 0, item) self.items.append(item) col = 1 for k in self.statisticsLogic.keys: item = qt.QStandardItem() item.setText(str(self.statisticsLogic.labelStats[i, k])) item.setToolTip(colorNode.GetColorName(i)) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 self.labelStatisticsTableView.setColumnWidth(0, 30) self.model.setHeaderData(0, 1, " ") col = 1 for k in self.statisticsLogic.keys: self.labelStatisticsTableView.setColumnWidth(col, 15 * len(k)) self.model.setHeaderData(col, 1, k) col += 1
def createUserInterface(self): from Editor import EditorWidget self.__layout = self.__parent.createUserInterface() #TODO: Create label map and set it for editing by user? #volumesLogic = slicer.modules.volumes.logic() #headLabel = volumesLogic.CreateLabelVolume( slicer.mrmlScene, head, head.GetName() + '-segmentation' ) #selectionNode = slicer.app.applicationLogic().GetSelectionNode() #selectionNode.SetReferenceActiveVolumeID( head.GetID() ) #selectionNode.SetReferenceActiveLabelVolumeID( headLabel.GetID() ) #slicer.app.applicationLogic().PropagateVolumeSelection(0) editorFrame = qt.QFrame() editorFrame.setLayout(qt.QVBoxLayout()) palette = editorFrame.palette bgColor = 230 palette.setColor(qt.QPalette.Background, qt.QColor(bgColor, bgColor, bgColor)) editorFrame.setPalette(palette) editorFrame.setAutoFillBackground(True) self.__layout.addRow(editorFrame) self.editorFrame = editorFrame global editorWidget self.editorWidget = EditorWidget(parent=self.editorFrame, showVolumesFrame=True) self.editorWidget.setup() self.editorWidget.enter() endoSegLabel = qt.QLabel('Endo Segmentation Image:') self.__endoSegSelector = slicer.qMRMLNodeComboBox() self.__endoSegSelector.toolTip = "Choose the endo segmentation label image." self.__endoSegSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.__endoSegSelector.setMRMLScene(slicer.mrmlScene) self.__endoSegSelector.addEnabled = 0 self.__layout.addRow(endoSegLabel, self.__endoSegSelector)
def setup(self): self.developerMode = False ScriptedLoadableModuleWidget.setup(self) annotationsCollapsibleButton = ctk.ctkCollapsibleButton() annotationsCollapsibleButton.text = "Astro Annotations" self.layout.addWidget(annotationsCollapsibleButton) # Layout within the dummy collapsible button annotationsFormLayout = qt.QVBoxLayout(annotationsCollapsibleButton) # Color horizontalLayout_1 = qt.QHBoxLayout() horizontalLayout_1.setObjectName("horizontalLayout_1") self.colorLabel = qt.QLabel() self.colorLabel.setText("Annotations color:") self.colorLabel.setFixedSize(qt.QSize(120, 30)) horizontalLayout_1.addWidget(self.colorLabel) self.colorSelector = ctk.ctkColorPickerButton() self.colorSelector.setObjectName("ColorPickerButton") sizePolicy = qt.QSizePolicy() sizePolicy.setHorizontalPolicy(qt.QSizePolicy.Expanding) sizePolicy.setVerticalPolicy(qt.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.colorSelector.sizePolicy.hasHeightForWidth()) self.colorSelector.setSizePolicy(sizePolicy) self.colorSelector.setMinimumSize(qt.QSize(0, 30)) self.colorSelector.setIconSize(qt.QSize(32, 32)) self.colorSelector.setColor(qt.QColor(255, 187, 20)) self.colorSelector.setDisplayColorName(0) horizontalLayout_1.addWidget(self.colorSelector) annotationsFormLayout.addLayout(horizontalLayout_1) # Font Style horizontalLayout_2 = qt.QHBoxLayout() horizontalLayout_2.setObjectName("horizontalLayout_2") self.fontStyleLabel = qt.QLabel() self.fontStyleLabel.setText("Font style:") self.fontStyleLabel.setFixedSize(qt.QSize(120, 30)) horizontalLayout_2.addWidget(self.fontStyleLabel) self.styleComboBox = qt.QComboBox() self.styleComboBox.addItem("Arial") self.styleComboBox.addItem("Courier") self.styleComboBox.addItem("Times") sizePolicy.setHeightForWidth( self.styleComboBox.sizePolicy.hasHeightForWidth()) self.styleComboBox.setMinimumSize(qt.QSize(0, 30)) horizontalLayout_2.addWidget(self.styleComboBox) annotationsFormLayout.addLayout(horizontalLayout_2) # Font size horizontalLayout_3 = qt.QHBoxLayout() horizontalLayout_3.setObjectName("horizontalLayout_3") self.fontSizeLabel = qt.QLabel() self.fontSizeLabel.setText("Font size:") self.fontSizeLabel.setFixedSize(qt.QSize(120, 30)) horizontalLayout_3.addWidget(self.fontSizeLabel) self.sizeSpinBox = qt.QSpinBox() sizePolicy.setHeightForWidth( self.sizeSpinBox.sizePolicy.hasHeightForWidth()) self.sizeSpinBox.setMinimumSize(qt.QSize(0, 30)) self.sizeSpinBox.minimum = 1 self.sizeSpinBox.maximum = 30 self.sizeSpinBox.setValue(12) self.sizeSpinBox.setToolTip( "This value is multiplied for 1.5 if the ruler is set to thick.") horizontalLayout_3.addWidget(self.sizeSpinBox) annotationsFormLayout.addLayout(horizontalLayout_3) verticalSpacer = qt.QSpacerItem(200, 200, qt.QSizePolicy.Minimum, qt.QSizePolicy.Expanding) self.layout.addItem(verticalSpacer) # Connections self.colorSelector.connect('colorChanged(QColor)', self.onAnnotationsColorChanged) self.styleComboBox.connect('currentTextChanged(QString)', self.onAnnotationsFontStyleChanged) self.sizeSpinBox.connect('valueChanged(int)', self.onAnnotationsFontSizeChanged)
def createWindows(self): self.stereoMode = self.stereoCheckBox.isChecked() # Create widgets to hold windows self.leftWidgets = qt.QWidget() self.leftWidgets.setWindowTitle("SlicerCubeMap - Left") leftWidgetsLayout = qt.QHBoxLayout() leftWidgetsLayout.setSpacing(0) leftWidgetsLayout.setContentsMargins(0,0,0,0) self.leftWidgets.setLayout(leftWidgetsLayout) self.rightWidgets = qt.QWidget() self.rightWidgets.setWindowTitle("SlicerCubeMap - Right") rightWidgetsLayout = qt.QHBoxLayout() rightWidgetsLayout.setSpacing(0) rightWidgetsLayout.setContentsMargins(0,0,0,0) self.rightWidgets.setLayout(rightWidgetsLayout) # Per cube face per eye leftFaces = ["lpx", "lnz", "lnx", "lpz", "lpy", "lny"] rightFaces = ["rpx", "rnz", "rnx", "rpz", "rpy", "rny"] slicer.mrmlScene.AddNode(slicer.vtkMRMLViewNode()) # There's some wonky behaviour with the first view node created (ViewNode2?), so this terrible thing exists for now for face in leftFaces: # Initialize View Nodes view = slicer.vtkMRMLViewNode() slicer.mrmlScene.AddNode(view) self.cubeFaceViewNodes.append(view) # Initialize ThreeD Widgets threeDWidget = slicer.qMRMLThreeDWidget() threeDWidget.setFixedSize(qt.QSize(600, 600)) threeDWidget.setMRMLViewNode(view) threeDWidget.setMRMLScene(slicer.mrmlScene) threeDWidget.setWindowTitle("SlicerCubeMap - " + face) threeDWidget.children()[1].hide() # Hide widget controller bar; TODO: maybe a bit more robust self.cubeFaceThreeDWidgets[face] = threeDWidget # Set Stereo settings if (self.stereoCheckBox.isChecked()): threeDWidget.threeDView().renderWindow().StereoRenderOn() threeDWidget.threeDView().renderWindow().SetStereoTypeToLeft() threeDWidget.threeDView().renderWindow().Render() # Add to Left eye cubemap widget self.leftWidgets.layout().addWidget(threeDWidget) if (self.stereoMode is True): for face in rightFaces: # Initialize View Nodes view = slicer.vtkMRMLViewNode() slicer.mrmlScene.AddNode(view) self.cubeFaceViewNodes.append(view) # Initialize ThreeD Widgets threeDWidget = slicer.qMRMLThreeDWidget() threeDWidget.setFixedSize(qt.QSize(600, 600)) threeDWidget.setMRMLViewNode(view) threeDWidget.setMRMLScene(slicer.mrmlScene) threeDWidget.setWindowTitle("SlicerCubeMap - " + face) threeDWidget.children()[1].hide() # Hide widget controller bar; TODO: maybe a bit more robust self.cubeFaceThreeDWidgets[face] = threeDWidget # Set Stereo settings threeDWidget.threeDView().renderWindow().StereoRenderOn() threeDWidget.threeDView().renderWindow().SetStereoTypeToRight() threeDWidget.threeDView().renderWindow().Render() # Add to Right eye cubemap widget self.rightWidgets.layout().addWidget(threeDWidget) # Set background colors depending on face # Front, Left, Right, and Back retain default color gradient # Top and Bottom have opposite sides of the gradient self.cubeFaceThreeDWidgets["lny"].threeDView().setBackgroundColor(qt.QColor(193, 195, 232)) self.cubeFaceThreeDWidgets["lny"].threeDView().setBackgroundColor2(qt.QColor(193, 195, 232)) self.cubeFaceThreeDWidgets["lpy"].threeDView().setBackgroundColor(qt.QColor(116, 120, 190)) self.cubeFaceThreeDWidgets["lpy"].threeDView().setBackgroundColor2(qt.QColor(116, 120, 190)) if (self.stereoMode is True): self.cubeFaceThreeDWidgets["rny"].threeDView().setBackgroundColor(qt.QColor(193, 195, 232)) self.cubeFaceThreeDWidgets["rny"].threeDView().setBackgroundColor2(qt.QColor(193, 195, 232)) self.cubeFaceThreeDWidgets["rpy"].threeDView().setBackgroundColor(qt.QColor(116, 120, 190)) self.cubeFaceThreeDWidgets["rpy"].threeDView().setBackgroundColor2(qt.QColor(116, 120, 190))
def updateStructures(self, caller=None, event=None): """re-build the Structures frame - optional caller and event ignored (for use as vtk observer callback) """ if self.setMergeButton.destroyed(): """ TODO: here the python class still exists but the Qt widgets are gone - need to figure out when to remove observers and free python code - probably the destroyed() signal. """ self.cleanup() return self.setMergeButton.setDisabled(not self.master) # reset to a fresh model self.brushes = [] self.items = [] self.structures = qt.QStandardItemModel() self.structuresView.setModel(self.structures) # if no merge volume exists, disable everything - else enable merge = self.mergeVolume() self.addStructureButton.setDisabled(not merge) self.deleteStructuresButton.setDisabled(not merge) self.mergeButton.setDisabled(not merge) self.splitButton.setDisabled(not merge) self.mergeAndBuildButton.setDisabled(not merge) self.replaceModels.setDisabled(not merge) if self.mergeValidCommand: # will be passed current self.mergeValidCommand(merge) if not merge: return colorNode = merge.GetDisplayNode().GetColorNode() lut = colorNode.GetLookupTable() masterName = self.master.GetName() slicer.mrmlScene.InitTraversal() vNode = slicer.mrmlScene.GetNextNodeByClass("vtkMRMLScalarVolumeNode") self.row = 0 while vNode: vName = vNode.GetName() # match something like "CT-lung-label1" regexp = "%s-.*-label" % masterName if re.match(regexp, vName): # figure out what name it is # - account for the fact that sometimes a number will be added to the end of the name start = 1 + len(masterName) end = vName.rfind("-label") structureName = vName[start:end] structureIndex = colorNode.GetColorIndexByName(structureName) structureColor = lut.GetTableValue(structureIndex)[0:3] brush = qt.QBrush() self.brushes.append(brush) color = qt.QColor() color.setRgb(structureColor[0] * 255, structureColor[1] * 255, structureColor[2] * 255) brush.setColor(color) # label index item = qt.QStandardItem() item.setEditable(False) item.setText(str(structureIndex)) self.structures.setItem(self.row, 0, item) self.items.append(item) # label color item = qt.QStandardItem() item.setEditable(False) item.setData(color, 1) self.structures.setItem(self.row, 1, item) self.items.append(item) # structure name item = qt.QStandardItem() item.setEditable(False) item.setText(structureName) self.structures.setItem(self.row, 2, item) self.items.append(item) # volumeName name item = qt.QStandardItem() item.setEditable(False) item.setText(vName) self.structures.setItem(self.row, 3, item) self.items.append(item) # sort order item = qt.QStandardItem() item.setEditable(True) item.setText("") self.structures.setItem(self.row, 4, item) self.items.append(item) self.row += 1 vNode = slicer.mrmlScene.GetNextNodeByClass( "vtkMRMLScalarVolumeNode") self.structuresView.setColumnWidth(0, 70) self.structuresView.setColumnWidth(1, 50) self.structuresView.setColumnWidth(2, 60) self.structuresView.setColumnWidth(3, 100) self.structuresView.setColumnWidth(4, 10) self.structures.setHeaderData(0, 1, "Number") self.structures.setHeaderData(1, 1, "Color") self.structures.setHeaderData(2, 1, "Name") self.structures.setHeaderData(3, 1, "Label Volume") self.structures.setHeaderData(4, 1, "Order") self.structuresView.setModel(self.structures)
def updateStructures(self,caller=None, event=None): """re-build the Structures frame - optional caller and event ignored (for use as vtk observer callback) """ if slicer.mrmlScene.IsBatchProcessing(): return if self.setMergeButton.destroyed(): """ TODO: here the python class still exists but the Qt widgets are gone - need to figure out when to remove observers and free python code - probably the destroyed() signal. """ self.cleanup() return self.setMergeButton.setDisabled(not self.master) # reset to a fresh model self.brushes = [] self.items = [] self.structures = qt.QStandardItemModel() self.structuresView.setModel(self.structures) # if no merge volume exists, disable everything - else enable merge = self.mergeVolume() self.addStructureButton.setDisabled(not merge) self.deleteStructuresButton.setDisabled(not merge) self.mergeButton.setDisabled(not merge) self.splitButton.setDisabled(not merge) self.mergeAndBuildButton.setDisabled(not merge) self.replaceModels.setDisabled(not merge) if self.mergeValidCommand: # will be passed current self.mergeValidCommand(merge) if not merge: return colorNode = merge.GetDisplayNode().GetColorNode() lut = colorNode.GetLookupTable() masterName = self.master.GetName() volumeNodes = self.structureVolumes() for vNode in volumeNodes: vName = vNode.GetName() # figure out what name it is # - account for the fact that sometimes a number will be added to the end of the name start = 1+len(masterName) end = vName.rfind("-label") structureName = vName[start:end] structureIndex = colorNode.GetColorIndexByName( structureName ) structureColor = lut.GetTableValue(structureIndex)[0:3] brush = qt.QBrush() self.brushes.append(brush) color = qt.QColor() color.setRgb(structureColor[0]*255,structureColor[1]*255,structureColor[2]*255) brush.setColor(color) # label index item = qt.QStandardItem() item.setEditable(False) item.setText( "%03d"%int(structureIndex) ) self.structures.setItem(self.row,0,item) self.items.append(item) # label color item = qt.QStandardItem() item.setEditable(False) item.setData(color,1) self.structures.setItem(self.row,1,item) self.items.append(item) # structure name item = qt.QStandardItem() item.setEditable(False) item.setText(structureName) self.structures.setItem(self.row,2,item) self.items.append(item) # volumeName name item = qt.QStandardItem() item.setEditable(False) item.setText(vName) self.structures.setItem(self.row,3,item) self.items.append(item) # sort order item = qt.QStandardItem() item.setEditable(True) item.setText("") self.structures.setItem(self.row,4,item) self.items.append(item) self.row += 1 for i in range(5): self.structuresView.resizeColumnToContents(i) self.structures.setHeaderData(0,1,"Number") self.structures.setHeaderData(1,1,"Color") self.structures.setHeaderData(2,1,"Name") self.structures.setHeaderData(3,1,"Label Volume") self.structures.setHeaderData(4,1,"Order") self.structuresView.setModel(self.structures) self.structuresView.connect("activated(QModelIndex)", self.onStructuresClicked) self.structuresView.setProperty('SH_ItemView_ActivateItemOnSingleClick', 1) self.structureLabelNames = [] rows = self.structures.rowCount() for row in xrange(rows): self.structureLabelNames.append(self.structures.item(row,2).text())
def setup(self): # Instantiate and connect widgets ... # # Reload and Test area # reloadCollapsibleButton = ctk.ctkCollapsibleButton() reloadCollapsibleButton.text = "Reload && Test" #self.layout.addWidget(reloadCollapsibleButton) reloadFormLayout = qt.QFormLayout(reloadCollapsibleButton) # reload button # (use this during development, but remove it when delivering # your module to users) self.reloadButton = qt.QPushButton("Reload") self.reloadButton.toolTip = "Reload this module." self.reloadButton.name = "CornerAnnotation Reload" #reloadFormLayout.addWidget(self.reloadButton) self.reloadButton.connect('clicked()', self.onReload) # reload and test button # (use this during development, but remove it when delivering # your module to users) self.reloadAndTestButton = qt.QPushButton("Reload and Test") self.reloadAndTestButton.toolTip = "Reload this module and then run the self tests." #reloadFormLayout.addWidget(self.reloadAndTestButton) self.reloadAndTestButton.connect('clicked()', self.onReloadAndTest) # # Module Area # annotationCollapsibleButton = ctk.ctkCollapsibleButton() annotationCollapsibleButton.text = "Annotations" annotationCollapsibleButton.collapsed = False self.annotationList = annotationCollapsibleButton self.layout.addWidget(annotationCollapsibleButton) # Layout within the collapsible button annotationFormLayout = qt.QFormLayout(annotationCollapsibleButton) # # Transform matrix for left bottom annotation (vtkMRMLLinearTransformNode) # self.node1Selector = slicer.qMRMLNodeComboBox() #self.node1Selector.nodeTypes = ( ("vtkMRMLLinearTransformNode"), "" ) self.node1Selector.nodeTypes = [ 'vtkMRMLLinearTransformNode', 'vtkMRMLAnnotationTextNode' ] self.node1Selector.addEnabled = False self.node1Selector.removeEnabled = False self.node1Selector.noneEnabled = True self.node1Selector.showHidden = False self.node1Selector.showChildNodeTypes = False self.node1Selector.setMRMLScene(slicer.mrmlScene) # # Transform matrix for left upper annotation (vtkMRMLLinearTransformNode) # self.node2Selector = slicer.qMRMLNodeComboBox() self.node2Selector.nodeTypes = [ 'vtkMRMLLinearTransformNode', 'vtkMRMLAnnotationTextNode' ] self.node2Selector.addEnabled = False self.node2Selector.removeEnabled = False self.node2Selector.noneEnabled = True self.node2Selector.showHidden = False self.node2Selector.showChildNodeTypes = False self.node2Selector.setMRMLScene(slicer.mrmlScene) # # Transform matrix for left upper annotation (vtkMRMLLinearTransformNode) # self.node3Selector = slicer.qMRMLNodeComboBox() self.node3Selector.nodeTypes = [ 'vtkMRMLLinearTransformNode', 'vtkMRMLAnnotationTextNode' ] self.node3Selector.addEnabled = False self.node3Selector.removeEnabled = False self.node3Selector.noneEnabled = True self.node3Selector.showHidden = False self.node3Selector.showChildNodeTypes = False self.node3Selector.setMRMLScene(slicer.mrmlScene) # # Transform matrix for right upper annotation (vtkMRMLLinearTransformNode) # self.node4Selector = slicer.qMRMLNodeComboBox() self.node4Selector.nodeTypes = [ 'vtkMRMLLinearTransformNode', 'vtkMRMLAnnotationTextNode' ] self.node4Selector.addEnabled = False self.node4Selector.removeEnabled = False self.node4Selector.noneEnabled = True self.node4Selector.showHidden = False self.node4Selector.showChildNodeTypes = False self.node4Selector.setMRMLScene(slicer.mrmlScene) # # Check box for left bottom annotation # self.leftBottomCheckBox = ctk.ctkCheckBox() self.leftBottomCheckBox.text = "Enable" self.leftBottomCheckBox.enabled = True self.leftBottomCheckBox.checked = False # # Check box for displaying right upper annotation # self.leftBottomTextBox = qt.QLineEdit() self.leftBottomTextBox.enabled = True # # Check box for displaying left upper annotation # self.leftUpperCheckBox = ctk.ctkCheckBox() self.leftUpperCheckBox.text = "Enable" self.leftUpperCheckBox.enabled = True self.leftUpperCheckBox.checked = False # # Check box for displaying right upper annotation # self.leftUpperTextBox = qt.QLineEdit() self.leftUpperTextBox.enabled = True # # Check box for displaying right bottom annotation # self.rightBottomCheckBox = ctk.ctkCheckBox() self.rightBottomCheckBox.text = "Enable" self.rightBottomCheckBox.enabled = True self.rightBottomCheckBox.checked = False # # Check box for displaying right upper annotation # self.rightBottomTextBox = qt.QLineEdit() self.rightBottomTextBox.enabled = True # # Check box for displaying right upper annotation # self.rightUpperCheckBox = ctk.ctkCheckBox() self.rightUpperCheckBox.text = "Enable" self.rightUpperCheckBox.enabled = True self.rightUpperCheckBox.checked = False # # Check box for displaying right upper annotation # self.rightUpperTextBox = qt.QLineEdit() self.rightUpperTextBox.enabled = True self.textLable1 = qt.QLabel() self.textLable1.setText("Text:") self.textLable2 = qt.QLabel() self.textLable2.setText("Text:") self.textLable3 = qt.QLabel() self.textLable3.setText("Text:") self.textLable4 = qt.QLabel() self.textLable4.setText("Text:") self.leftUpperFrame = qt.QFrame() self.leftUpperLayout = qt.QHBoxLayout() self.leftUpperFrame.setLayout(self.leftUpperLayout) annotationFormLayout.addRow("Left Upper:", self.leftUpperFrame) self.leftBottomFrame = qt.QFrame() self.leftBottomLayout = qt.QHBoxLayout() self.leftBottomFrame.setLayout(self.leftBottomLayout) annotationFormLayout.addRow("Left Bottom:", self.leftBottomFrame) self.rightUpperFrame = qt.QFrame() self.rightUpperLayout = qt.QHBoxLayout() self.rightUpperFrame.setLayout(self.rightUpperLayout) annotationFormLayout.addRow("Right Upper:", self.rightUpperFrame) self.rightBottomFrame = qt.QFrame() self.rightBottomLayout = qt.QHBoxLayout() self.rightBottomFrame.setLayout(self.rightBottomLayout) annotationFormLayout.addRow("Right Bottom:", self.rightBottomFrame) self.leftUpperFrame.layout().addWidget(self.leftUpperCheckBox) self.leftUpperFrame.layout().addWidget(self.textLable2) self.leftUpperFrame.layout().addWidget(self.leftUpperTextBox) self.leftBottomFrame.layout().addWidget(self.leftBottomCheckBox) self.leftBottomFrame.layout().addWidget(self.textLable1) self.leftBottomFrame.layout().addWidget(self.leftBottomTextBox) self.rightUpperFrame.layout().addWidget(self.rightUpperCheckBox) self.rightUpperFrame.layout().addWidget(self.textLable4) self.rightUpperFrame.layout().addWidget(self.rightUpperTextBox) self.rightBottomFrame.layout().addWidget(self.rightBottomCheckBox) self.rightBottomFrame.layout().addWidget(self.textLable3) self.rightBottomFrame.layout().addWidget(self.rightBottomTextBox) # # Configuration Area # configurationCollapsibleButton = ctk.ctkCollapsibleButton() configurationCollapsibleButton.text = "Configurations" configurationCollapsibleButton.collapsed = False self.annotationList = configurationCollapsibleButton self.layout.addWidget(configurationCollapsibleButton) # Layout within the collapsible button configurationFormLayout = qt.QFormLayout( configurationCollapsibleButton) self.threeDViewCheckBox = ctk.ctkCheckBox() self.threeDViewCheckBox.text = "3D" self.threeDViewCheckBox.enabled = True self.threeDViewCheckBox.checked = True self.redViewCheckBox = ctk.ctkCheckBox() self.redViewCheckBox.text = "Red" self.redViewCheckBox.enabled = True self.redViewCheckBox.checked = False self.yellowViewCheckBox = ctk.ctkCheckBox() self.yellowViewCheckBox.text = "Yellow" self.yellowViewCheckBox.enabled = True self.yellowViewCheckBox.checked = False self.greenViewCheckBox = ctk.ctkCheckBox() self.greenViewCheckBox.text = "Green" self.greenViewCheckBox.enabled = True self.greenViewCheckBox.checked = False # view frame self.viewFrame = qt.QFrame(configurationCollapsibleButton) self.viewLayout = qt.QHBoxLayout() self.viewFrame.setLayout(self.viewLayout) configurationFormLayout.addRow("Display Panels:", self.viewFrame) self.viewFrame.layout().addWidget(self.threeDViewCheckBox) self.viewFrame.layout().addWidget(self.redViewCheckBox) self.viewFrame.layout().addWidget(self.yellowViewCheckBox) self.viewFrame.layout().addWidget(self.greenViewCheckBox) self.fontSizeLable = qt.QLabel() self.fontSizeLable.setText("Size:") # # Bold font check box for displaying right upper annotation # self.rightUpperBoldCheckBox = ctk.ctkCheckBox() self.rightUpperBoldCheckBox.text = "Bold" self.rightUpperBoldCheckBox.enabled = True self.rightUpperBoldCheckBox.checked = False # # Italic fong check box for displaying right upper annotation # self.rightUpperItalicCheckBox = ctk.ctkCheckBox() self.rightUpperItalicCheckBox.text = "Italic" self.rightUpperItalicCheckBox.enabled = True self.rightUpperItalicCheckBox.checked = False # # Shadow font check box for displaying right upper annotation # self.rightUpperShadowCheckBox = ctk.ctkCheckBox() self.rightUpperShadowCheckBox.text = "Shadow" self.rightUpperShadowCheckBox.enabled = True self.rightUpperShadowCheckBox.checked = False # # Font size slider # self.fontSizeSlider = ctk.ctkSliderWidget() self.fontSizeSlider.decimals = 0 self.fontSizeSlider.maximum = 200 self.fontSizeSlider.minimum = 0 self.fontSizeSlider.value = 20 self.fontSizeSlider.enabled = True self.fontBox = qt.QComboBox() self.fontBox.insertItem(0, "Arial", "Arial") self.fontBox.insertItem(1, "Courier", "Courier") self.fontBox.insertItem(2, "Times", "Times") self.fontBox.enabled = True configurationFormLayout.addRow("Font Family:", self.fontBox) self.rightUpperColorBox = ctk.ctkColorPickerButton() self.rightUpperColorBox.enabled = True self.rightUpperColorBox.setColor(qt.QColor(255, 0, 0)) configurationFormLayout.addRow("Font Color:", self.rightUpperColorBox) self.fontOpacitySlider = ctk.ctkSliderWidget() self.fontOpacitySlider.decimals = 0 self.fontOpacitySlider.maximum = 100 self.fontOpacitySlider.minimum = 0 self.fontOpacitySlider.value = 100 self.fontOpacitySlider.enabled = True configurationFormLayout.addRow("Font Opacity:", self.fontOpacitySlider) self.fontStyleFrame = qt.QFrame() self.fonstStyleLayout = qt.QHBoxLayout() self.fontStyleFrame.setLayout(self.fonstStyleLayout) configurationFormLayout.addRow("Font Style:", self.fontStyleFrame) self.fontStyleFrame.layout().addWidget(self.rightUpperBoldCheckBox) self.fontStyleFrame.layout().addWidget(self.rightUpperItalicCheckBox) self.fontStyleFrame.layout().addWidget(self.rightUpperShadowCheckBox) self.fontStyleFrame.layout().addWidget(self.fontSizeLable) self.fontStyleFrame.layout().addWidget(self.fontSizeSlider) # Timer start button self.timerStartButton = qt.QPushButton("Start") self.timerStartButton.toolTip = "Start timer" self.timerStartButton.name = "Start timer" # Timer stop button self.timerStopButton = qt.QPushButton("Stop") self.timerStopButton.toolTip = "Stop timer" self.timerStopButton.name = "Stop timer" # Timer reset button self.timerResetButton = qt.QPushButton("Reset") self.timerResetButton.toolTip = "Reset timer" self.timerResetButton.name = "Reset timer" self.timerFrame = qt.QFrame(configurationCollapsibleButton) self.timerLayout = qt.QHBoxLayout() self.timerFrame.setLayout(self.timerLayout) configurationFormLayout.addRow("Timer:", self.timerFrame) self.timerFrame.layout().addWidget(self.timerStartButton) self.timerFrame.layout().addWidget(self.timerStopButton) self.timerFrame.layout().addWidget(self.timerResetButton) configurationFormLayout.addRow("Node1: ", self.node1Selector) configurationFormLayout.addRow("Node2: ", self.node2Selector) configurationFormLayout.addRow("Node3: ", self.node3Selector) configurationFormLayout.addRow("Node4: ", self.node4Selector) self.timerStartButton.connect('clicked(bool)', self.onStartButton) self.timerStopButton.connect('clicked(bool)', self.onStopButton) self.timerResetButton.connect('clicked(bool)', self.onResetButton) self.fontOpacitySlider.connect('valueChanged(double)', self.fontOpacitySliderValueChanged) self.fontSizeSlider.connect('valueChanged(double)', self.fontSizeSliderValueChanged) self.rightUpperBoldCheckBox.connect('clicked(bool)', self.boldChanged) self.rightUpperItalicCheckBox.connect('clicked(bool)', self.italicChanged) self.rightUpperShadowCheckBox.connect('clicked(bool)', self.shadowChanged) self.rightUpperColorBox.connect('colorChanged(QColor)', self.fontColorChanged) self.rightUpperCheckBox.connect('clicked(bool)', self.onRightUpperCheckBox) self.rightBottomCheckBox.connect('clicked(bool)', self.onRightBottomCheckBox) self.leftUpperCheckBox.connect('clicked(bool)', self.onLeftUpperCheckBox) self.leftBottomCheckBox.connect('clicked(bool)', self.onLeftBottomCheckBox) self.rightUpperTextBox.connect('textEdited(QString)', self.editedRightUpperTextBox) self.rightBottomTextBox.connect('textEdited(QString)', self.editedRightBottomTextBox) self.leftUpperTextBox.connect('textEdited(QString)', self.editedLeftUpperTextBox) self.leftBottomTextBox.connect('textEdited(QString)', self.editedLeftBottomTextBox) self.threeDViewCheckBox.connect('clicked(bool)', self.onThreeDViewCheckBox) self.redViewCheckBox.connect('clicked(bool)', self.onRedViewCheckBox) self.yellowViewCheckBox.connect('clicked(bool)', self.onYellowViewCheckBox) self.greenViewCheckBox.connect('clicked(bool)', self.onGreenViewCheckBox) self.fontBox.connect('currentIndexChanged(int)', self.fontChanged) # Text property for corner annotation self.textProperty = vtk.vtkTextProperty() # Corner annotation function self.cornerAnnotationDisplay = vtk.vtkCornerAnnotation() self.cornerAnnotationDisplay.SetLinearFontScaleFactor(2) self.cornerAnnotationDisplay.SetNonlinearFontScaleFactor(1) self.cornerAnnotationDisplay.SetMaximumFontSize(20) self.cornerAnnotationDisplay.GetTextProperty().SetColor(1, 0, 0) # Addition of corner annotation function to three D render window layout = slicer.app.layoutManager() if layout != None: self.threeDRenderer = layout.activeThreeDRenderer() self.threeDRenderer.AddViewProp(self.cornerAnnotationDisplay) self.threeDRenderWindow = self.threeDRenderer.GetRenderWindow() self.threeDRenderWindow.Render() self.redRenderer = layout.sliceWidget('Red').sliceView( ).renderWindow().GetRenderers().GetFirstRenderer() self.redRenderWindow = self.redRenderer.GetRenderWindow() self.redRenderWindow.Render() self.yellowRenderer = layout.sliceWidget('Yellow').sliceView( ).renderWindow().GetRenderers().GetFirstRenderer() self.yellowRenderWindow = self.yellowRenderer.GetRenderWindow() self.yellowRenderWindow.Render() self.greenRenderer = layout.sliceWidget('Green').sliceView( ).renderWindow().GetRenderers().GetFirstRenderer() self.greenRenderWindow = self.greenRenderer.GetRenderWindow() self.greenRenderWindow.Render() # QTimer self.t = qt.QTimer() self.t.connect('timeout()', self.tCount) self.freq = 50 self.stopWatchTimer = qt.QTimer() self.stopWatchTimer.connect('timeout()', self.stopWatchTimerCount) self.timerCount = 0 self.timerFreq = 100 # Flags for displaying annotations self.rightUpperFlag = 0 self.rightBottomFlag = 0 self.leftUpperFlag = 0 self.leftBottomFlag = 0 self.timerStopFlag = 0 self.colorR = 0 self.colorG = 0 self.colorB = 0 self.rightUpperMessage = "" self.rightBottomMessage = "" self.leftUpperMessage = "" self.leftBottomMessage = "" self.rightUpperSource = "" self.rightBottomSource = "" self.leftUpperSource = "" self.leftBottomSource = "" import numpy self.row2 = numpy.zeros([10]) self.column2 = numpy.zeros([10]) self.stopWatchTimerStartFlag = 0 # Add vertical spacer self.layout.addStretch(1)
def __init__(self,parent=None,width=400,height=400,showWidget=False,scale=False): super(ROIManager,self).__init__() self.width = width self.height = height self.showWidget = showWidget self.scale = scale self.renderer = None self.ROIRadius = 20.0 self.minValueBG=0 self.maxValueBG=0 self.minValueFG=0 self.maxValueFG=0 self.probeWidget = None self.drawOverlay = 0 # utility Qt instances for use in methods self.gray = qt.QColor() self.gray.setRedF(0.5) self.gray.setGreenF(0.5) self.gray.setBlueF(0.5) # a painter to use for various jobs self.painter = qt.QPainter() # make a qwidget display if self.showWidget: self.frame = qt.QFrame(parent) mw = slicer.util.mainWindow() self.frame.setGeometry(mw.x, mw.y, self.width, self.height) self.frameLayout = qt.QVBoxLayout(self.frame) self.label = qt.QLabel() self.frameLayout.addWidget(self.label) self.frame.show() # make an image actor in the slice view self.vtkImage = vtk.vtkImageData() self.mrmlUtils = slicer.qMRMLUtils() self.imageMapper = vtk.vtkImageMapper() self.imageMapper.SetColorLevel(128) self.imageMapper.SetColorWindow(255) if vtk.VTK_MAJOR_VERSION <= 5: self.imageMapper.SetInput(self.vtkImage) else: self.imageMapper.SetInputData(self.vtkImage) self.actor2D = vtk.vtkActor2D() self.actor2D.SetMapper(self.imageMapper) # make a circle actor self.circle = vtk.vtkRegularPolygonSource() self.circle.SetNumberOfSides(50) self.circle.SetRadius(5) self.circle.SetCenter(0,0,0) self.circle.GeneratePolylineOn() self.circle.GeneratePolygonOff() self.circle.Update() self.mapper = vtk.vtkPolyDataMapper2D() self.actor = vtk.vtkActor2D() if vtk.VTK_MAJOR_VERSION <= 5: self.mapper.SetInput(self.circle.GetOutput()) else: self.mapper.SetInputConnection(self.circle.GetOutputPort()) self.actor.SetMapper(self.mapper) property_ = self.actor.GetProperty() property_.SetColor(1,1,0) property_.SetLineWidth(1)
def setup(self): # make an instance of the logic self.logic = TwoTensorModelVizLogic() # # Model Selection Area # modelCollapsibleButton = ctk.ctkCollapsibleButton() modelCollapsibleButton.text = "Basic" self.layout.addWidget(modelCollapsibleButton) modelFormLayout = qt.QFormLayout(modelCollapsibleButton) # ============Fiber model selector=================== self.modelSelector = slicer.qMRMLNodeComboBox() self.modelSelector.nodeTypes = ( ("vtkMRMLFiberBundleNode"), "" ) self.modelSelector.selectNodeUponCreation = True self.modelSelector.addEnabled = False self.modelSelector.removeEnabled = False self.modelSelector.noneEnabled = False self.modelSelector.showHidden = False self.modelSelector.showChildNodeTypes = False self.modelSelector.setMRMLScene( slicer.mrmlScene ) self.modelSelector.setToolTip( "Pick a bundle of fibers." ) modelFormLayout.addRow("Fiber bundles: ", self.modelSelector) self.modelSelector.connect('currentNodeChanged(vtkMRMLNode*)', \ self.onModelSelect) # ============Glyph Space scroller================= self.sliderGlyphSpace = ctk.ctkSliderWidget() self.sliderGlyphSpace.decimals = 0 self.sliderGlyphSpace.minimum=1 self.sliderGlyphSpace.maximum=100 self.sliderGlyphSpace.value=10 self.sliderGlyphSpace.enabled = False modelFormLayout.addRow("Glyph Space:", self.sliderGlyphSpace) self.sliderGlyphSpace.connect('valueChanged(double)', \ self.onGlyphSpaceChanged) # ============Glyph Scale scroller================= self.sliderGlyphScale = ctk.ctkSliderWidget() self.sliderGlyphScale.decimals = 0 self.sliderGlyphScale.minimum=1 self.sliderGlyphScale.maximum=10000 self.sliderGlyphScale.value=2000 self.sliderGlyphScale.enabled = False modelFormLayout.addRow("Glyph Scale:", self.sliderGlyphScale) self.sliderGlyphScale.connect('valueChanged(double)', \ self.onGlyphScaleChanged) modelGridLayout=qt.QGridLayout() modelFormLayout.addRow("View Items:",modelGridLayout) # ============Check Box for showing lines============== self.checkboxLines=qt.QCheckBox("Lines") self.checkboxLines.toolTip="When checked, fiber lines are shown." self.checkboxLines.checked=True self.checkboxLines.enabled=False #modelFormLayout.addRow(self.checkboxLines) modelGridLayout.addWidget(self.checkboxLines,0,0) # ============Check Box for showing tensor 1============== self.checkboxTensor1=qt.QCheckBox("Tensor 1") self.checkboxTensor1.toolTip="When checked, cylinder glyphs are shown for tensor 1." self.checkboxTensor1.checked=True self.checkboxTensor1.enabled=False modelGridLayout.addWidget(self.checkboxTensor1,0,1) # ============Check Box for showing tensor 2============== self.checkboxTensor2=qt.QCheckBox("Tensor 2") self.checkboxTensor2.toolTip="When checked, cylinder glyphs are shown for tensor 2." self.checkboxTensor2.checked=True self.checkboxTensor2.enabled=False modelGridLayout.addWidget(self.checkboxTensor2,0,2) # ============Check Box for showing tube============== self.checkboxTubes=qt.QCheckBox("Tubes") self.checkboxTubes.toolTip="When checked, tubes will be shown." self.checkboxTubes.checked=True self.checkboxTubes.enabled=False modelGridLayout.addWidget(self.checkboxTubes,0,3) # # Fiber Filter Area # filterCollapsibleButton = ctk.ctkCollapsibleButton() filterCollapsibleButton.text = "Fiber Filter" self.layout.addWidget(filterCollapsibleButton) filterFormLayout = qt.QFormLayout(filterCollapsibleButton) # ============Line Space scroller================= self.sliderLineSpace = ctk.ctkSliderWidget() self.sliderLineSpace.decimals = 0 self.sliderLineSpace.minimum=1 self.sliderLineSpace.maximum=100 self.sliderLineSpace.value=10 self.sliderLineSpace.enabled = False filterFormLayout.addRow("One of n Fibers:", self.sliderLineSpace) self.sliderLineSpace.connect('valueChanged(double)', \ self.onLineSpaceChanged) # ============Line Num scroller================= self.sliderLineNum = ctk.ctkSliderWidget() self.sliderLineNum.decimals = 0 self.sliderLineNum.minimum=1 self.sliderLineNum.maximum=100 self.sliderLineNum.value=1 self.sliderLineNum.enabled = False filterFormLayout.addRow("Specific Fiber No:", self.sliderLineNum) self.sliderLineNum.connect('valueChanged(double)', \ self.onLineNumChanged) # ============Check Box for showing one fiber============== self.checkboxOnlyOneLine=qt.QCheckBox("Only show the specific fiber") self.checkboxOnlyOneLine.toolTip="When checked, only the specified fiber is shown." self.checkboxOnlyOneLine.checked=False self.checkboxOnlyOneLine.enabled=False filterFormLayout.addWidget(self.checkboxOnlyOneLine) # # Cylinder Color Mapping Area # cylinderColorCollapsibleButton = ctk.ctkCollapsibleButton() cylinderColorCollapsibleButton.text = "Cylinder Boby Color" self.layout.addWidget(cylinderColorCollapsibleButton) cylinderVBoxLayOut = qt.QVBoxLayout(cylinderColorCollapsibleButton) # Add a TabWidget cylinderTabWidget=qt.QTabWidget() cylinderVBoxLayOut.addWidget(cylinderTabWidget) # Create four pages and the GridLayOut redPage=qt.QWidget() redGrid=qt.QGridLayout(redPage) cylinderTabWidget.addTab(redPage,'Red') greenPage=qt.QWidget() greenGrid=qt.QGridLayout(greenPage) cylinderTabWidget.addTab(greenPage,'Green') bluePage=qt.QWidget() blueGrid=qt.QGridLayout(bluePage) cylinderTabWidget.addTab(bluePage,'Blue') alphaPage=qt.QWidget() alphaGrid=qt.QGridLayout(alphaPage) cylinderTabWidget.addTab(alphaPage,'Alpha') #========= Set the Red page ============== groupBox=qt.QGroupBox() grid = qt.QGridLayout(groupBox) redGrid.addWidget(groupBox,0,1) self.bodRadioR1=qt.QRadioButton("Fixed to:") self.bodRadioR2=qt.QRadioButton("Mapped to:") self.bodRadioR1.checked=True self.bodSliderR = ctk.ctkSliderWidget() self.bodSliderR.decimals = 0 self.bodSliderR.minimum=0 self.bodSliderR.maximum=255 self.bodSliderR.value=1 self.bodSliderR.enabled = True self.bodComboR = qt.QComboBox() self.bodComboR.duplicatesEnabled= False grid.addWidget(self.bodRadioR1,0,0) grid.addWidget(self.bodRadioR2,1,0) grid.addWidget(self.bodSliderR,0,1) grid.addWidget(self.bodComboR,1,1) #========= Set the Green page ============== groupBox=qt.QGroupBox() grid = qt.QGridLayout(groupBox) greenGrid.addWidget(groupBox,0,1) self.bodRadioG1=qt.QRadioButton("Fixed to:") self.bodRadioG2=qt.QRadioButton("Mapped to:") self.bodRadioG1.checked=True self.bodSliderG = ctk.ctkSliderWidget() self.bodSliderG.decimals = 0 self.bodSliderG.minimum=0 self.bodSliderG.maximum=255 self.bodSliderG.value=1 self.bodSliderG.enabled = True self.bodComboG = qt.QComboBox() self.bodComboG.duplicatesEnabled= False grid.addWidget(self.bodRadioG1,0,0) grid.addWidget(self.bodRadioG2,1,0) grid.addWidget(self.bodSliderG,0,1) grid.addWidget(self.bodComboG,1,1) #========= Set the Blue page ============== groupBox=qt.QGroupBox() grid = qt.QGridLayout(groupBox) blueGrid.addWidget(groupBox,0,1) self.bodRadioB1=qt.QRadioButton("Fixed to:") self.bodRadioB2=qt.QRadioButton("Mapped to:") self.bodRadioB1.checked=True self.bodSliderB = ctk.ctkSliderWidget() self.bodSliderB.decimals = 0 self.bodSliderB.minimum=0 self.bodSliderB.maximum=255 self.bodSliderB.value=1 self.bodSliderB.enabled = True self.bodComboB = qt.QComboBox() self.bodComboB.duplicatesEnabled= False grid.addWidget(self.bodRadioB1,0,0) grid.addWidget(self.bodRadioB2,1,0) grid.addWidget(self.bodSliderB,0,1) grid.addWidget(self.bodComboB,1,1) #========= Set the Alpha page ============== groupBox=qt.QGroupBox() grid = qt.QGridLayout(groupBox) alphaGrid.addWidget(groupBox,0,1) self.bodRadioA1=qt.QRadioButton("Fixed to:") self.bodRadioA2=qt.QRadioButton("Mapped to:") self.bodRadioA1.checked=True self.bodSliderA = ctk.ctkSliderWidget() self.bodSliderA.decimals = 0 self.bodSliderA.minimum=0 self.bodSliderA.maximum=255 self.bodSliderA.value=1 self.bodSliderA.enabled = True self.bodComboA = qt.QComboBox() self.bodComboA.duplicatesEnabled= False grid.addWidget(self.bodRadioA1,0,0) grid.addWidget(self.bodRadioA2,1,0) grid.addWidget(self.bodSliderA,0,1) grid.addWidget(self.bodComboA,1,1) # # Tube Mapping Area # tubeColorCollapsibleButton = ctk.ctkCollapsibleButton() tubeColorCollapsibleButton.text = "Tube Mapping" self.layout.addWidget(tubeColorCollapsibleButton) tubeVboxLayOut = qt.QVBoxLayout(tubeColorCollapsibleButton) # Add a TabWidget tubeTabWidget=qt.QTabWidget() tubeVboxLayOut.addWidget(tubeTabWidget) # Create three pages and the GridLayOut tubeColorPage=qt.QWidget() tubeColorGrid=qt.QGridLayout(tubeColorPage) tubeTabWidget.addTab(tubeColorPage,'Color') tubeSizePage=qt.QWidget() tubeSizeGrid=qt.QGridLayout(tubeSizePage) tubeTabWidget.addTab(tubeSizePage,'Size') #========= Set the color page ============== groupBox=qt.QGroupBox() grid = qt.QGridLayout(groupBox) tubeColorGrid.addWidget(groupBox,0,0) self.tubeRadioFixedTo=qt.QRadioButton("Fixed to") self.tubeRadioByOrientation=qt.QRadioButton("Color by orientation") self.tubeRadioSameAsCylinderBody=qt.QRadioButton("Same as Cylinder Body") self.tubeRadioByOrientation.checked=True grid.addWidget(self.tubeRadioFixedTo,0,0) grid.addWidget(self.tubeRadioByOrientation,1,0) grid.addWidget(self.tubeRadioSameAsCylinderBody,2,0) self.tubeColorButton=qt.QPushButton('Specifying Color') self.tubeColorButton.setAutoFillBackground(True) grid.addWidget(self.tubeColorButton,0,1) self.tubeColorButton.connect('clicked()', \ self.onTubeFixedColor) #========= Set the size page ============== self.tubeSizeRadio1=qt.QRadioButton("Fixed to:") self.tubeSizeRadio2=qt.QRadioButton("Mapped to:") self.tubeSizeRadio1.checked=True self.tubeSizeSlider = ctk.ctkSliderWidget() self.tubeSizeSlider.decimals = 2 self.tubeSizeSlider.minimum=0.0 self.tubeSizeSlider.maximum=5.0 self.tubeSizeSlider.value=0.1 self.tubeSizeSlider.enabled = True self.tubeComboBox = qt.QComboBox() self.tubeComboBox.duplicatesEnabled= False tubeSizeGrid.addWidget(self.tubeSizeRadio1,0,0) tubeSizeGrid.addWidget(self.tubeSizeRadio2,1,0) tubeSizeGrid.addWidget(self.tubeSizeSlider,0,1) tubeSizeGrid.addWidget(self.tubeComboBox,1,1) # ============Scale scroller================= label=qt.QLabel('Tube Scale:') self.sliderTubeScale = ctk.ctkSliderWidget() self.sliderTubeScale.decimals = 0 self.sliderTubeScale.minimum=1 self.sliderTubeScale.maximum=100 self.sliderTubeScale.value=5 self.sliderTubeScale.enabled = False tubeSizeGrid.addWidget(label,2,0) tubeSizeGrid.addWidget(self.sliderTubeScale,2,1) self.sliderTubeScale.connect('valueChanged(double)', \ self.onTubeScaleChanged) # # ============Apply button================= # self.applyButton = qt.QPushButton("Apply") self.applyButton.toolTip = "Apply the visualization." self.applyButton.enabled = False self.applyButton.setPalette(qt.QPalette(qt.QColor(128,255,128))) self.parent.layout().addWidget(self.applyButton) self.applyButton.connect('clicked()', \ self.onApply) # # ============Clear button================= # self.clearButton = qt.QPushButton("Clear") self.clearButton.toolTip = "Clear objects rendered in 3D view windows." self.clearButton.enabled = False self.clearButton.setPalette(qt.QPalette(qt.QColor(255,128,128))) self.parent.layout().addWidget(self.clearButton) self.clearButton.connect('clicked()', \ self.onClear) # ===========Finally, Add vertical spacer================ self.layout.addStretch(2)
def populateStats(self): if not self.logic: return displayNode = self.insplabelNode.GetDisplayNode() colorNode = displayNode.GetColorNode() lut = colorNode.GetLookupTable() self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 cycle = ['insp'] for i in cycle: for regionTag, regionValue in zip(self.logic.regionTags, self.logic.regionValues): color = qt.QColor() rgb = lut.GetTableValue(regionValue[0]) color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, 1) item.setText(str(regionTag)) item.setData(regionTag, 1) item.setToolTip(regionTag) self.model.setItem(row, 0, item) self.items.append(item) col = 1 for k in self.logic.keys: item = qt.QStandardItem() item.setText("%.3f" % self.logic.labelStats[i, k, regionTag]) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 self.view.setColumnWidth(0, 30) self.model.setHeaderData(0, 1, "INSP") col = 1 for k in self.logic.keys: self.view.setColumnWidth(col, 15 * len(k)) self.model.setHeaderData(col, 1, k) col += 1 self.itemsexp = [] self.modelexp = qt.QStandardItemModel() self.viewexp.setModel(self.modelexp) self.viewexp.verticalHeader().visible = False row = 0 cycle = ['exp'] for i in cycle: for regionTag, regionValue in zip(self.logic.regionTags, self.logic.regionValues): color = qt.QColor() rgb = lut.GetTableValue(regionValue[0]) color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, 1) item.setText(str(regionTag)) item.setData(regionTag, 1) item.setToolTip(regionTag) self.modelexp.setItem(row, 0, item) self.itemsexp.append(item) col = 1 for k in self.logic.keys: item = qt.QStandardItem() item.setText("%.3f" % self.logic.labelStats[i, k, regionTag]) self.modelexp.setItem(row, col, item) self.itemsexp.append(item) col += 1 row += 1 self.viewexp.setColumnWidth(0, 30) self.modelexp.setHeaderData(0, 1, "EXP") col = 1 for k in self.logic.keys: self.viewexp.setColumnWidth(col, 15 * len(k)) self.modelexp.setHeaderData(col, 1, k) col += 1
def test_BreachWarningSelfTest1(self): """Ideally you should have several levels of tests. At the lowest level tests sould exercise the functionality of the logic with different inputs (both valid and invalid). At higher levels your tests should emulate the way the user would interact with your code and confirm that it still works the way you intended. One of the most important features of the tests is that it should alert other developers when their changes will have an impact on the behavior of your module. For example, if a developer removes a feature that you depend on, your test should break so they know that the feature is needed. """ self.delayDisplay("Starting the test") self.delayDisplay("Create models") modelNodes = [] createModelsLogic = slicer.modules.createmodels.logic() sphereRadius = 10.0 sphereModel = createModelsLogic.CreateSphere( sphereRadius) # watched model toolModel = createModelsLogic.CreateNeedle(50.0, 1.5, 0.0, False) self.delayDisplay("Set up module GUI") mainWindow = slicer.util.mainWindow() mainWindow.moduleSelector().selectModule('BreachWarning') bwWidget = slicer.modules.breachwarning.widgetRepresentation() bwColorPickerButton = slicer.util.findChildren( widget=bwWidget, className='ctkColorPickerButton', name='ColorPickerButton')[0] bwModelNodeCombobox = slicer.util.findChildren( widget=bwWidget, name='ModelNodeComboBox')[0] bwToolNodeCombobox = slicer.util.findChildren(widget=bwWidget, name='ToolComboBox')[0] bwModelNodeCombobox.setCurrentNodeID(sphereModel.GetID()) warningColor = (1.0, 0.0, 0.0) color = qt.QColor(warningColor[0] * 255, warningColor[1] * 255, warningColor[2] * 255, 1) bwColorPickerButton.setColor(color) # Transform the sphere somewhere sphereTransform = slicer.vtkMRMLLinearTransformNode() sphereTransformMatrix = vtk.vtkMatrix4x4() sphereTransformMatrix.SetElement(0, 3, 80) sphereTransformMatrix.SetElement(1, 3, 40) sphereTransformMatrix.SetElement(2, 3, 30) sphereTransform.SetMatrixTransformToParent(sphereTransformMatrix) slicer.mrmlScene.AddNode(sphereTransform) sphereModel.SetAndObserveTransformNodeID(sphereTransform.GetID()) # Create transforms node hierarchy for the tool transforms = [] numberOfTransforms = 3 for i in range(numberOfTransforms): transforms.append(slicer.vtkMRMLLinearTransformNode()) transformName = "Tool_" + str(i) transforms[i].SetName( slicer.mrmlScene.GenerateUniqueName(transformName)) slicer.mrmlScene.AddNode(transforms[i]) if i > 0: transforms[i].SetAndObserveTransformNodeID( transforms[i - 1].GetID()) # Tool transform is the one at the bottom of the transform hierarchy # (to make sure transform changes in the middle of the transform hierarchy are used correctly) toolModel.SetAndObserveTransformNodeID(transforms[-1].GetID()) bwToolNodeCombobox.setCurrentNodeID(transforms[-1].GetID()) # Pick a transform in the middle of the transform hierarchy that we change to simulate tool motion, # leave the rest of the transforms unchanged toolToWorldTransform = transforms[1] transformMatrixOutside = vtk.vtkMatrix4x4() transformMatrixOutside.DeepCopy(sphereTransformMatrix) transformMatrixOutside.SetElement( 0, 3, transformMatrixOutside.GetElement(0, 3) + sphereRadius * 2.1) transformMatrixOutside.SetElement( 1, 3, transformMatrixOutside.GetElement(1, 3) + sphereRadius * 1.3) transformMatrixOutside.SetElement( 2, 3, transformMatrixOutside.GetElement(2, 3) + sphereRadius * 3.2) transformMatrixInside = vtk.vtkMatrix4x4() transformMatrixInside.DeepCopy(sphereTransformMatrix) transformMatrixInside.SetElement( 0, 3, transformMatrixInside.GetElement(0, 3) + sphereRadius * 0.1) transformMatrixInside.SetElement( 1, 3, transformMatrixInside.GetElement(1, 3) + sphereRadius * 0.3) transformMatrixInside.SetElement( 2, 3, transformMatrixInside.GetElement(2, 3) + sphereRadius * 0.2) # Start breach warning checks self.delayDisplay('Tool is outside the sphere') toolToWorldTransform.SetMatrixTransformToParent(transformMatrixOutside) sphereColor = sphereModel.GetDisplayNode().GetColor() self.assertNotEqual(sphereColor, warningColor) self.delayDisplay('Tool is inside the sphere') toolToWorldTransform.SetMatrixTransformToParent(transformMatrixInside) sphereColor = sphereModel.GetDisplayNode().GetColor() self.assertEqual(sphereColor, warningColor) self.delayDisplay('Tool is outside the sphere') toolToWorldTransform.SetMatrixTransformToParent(transformMatrixOutside) sphereColor = sphereModel.GetDisplayNode().GetColor() self.assertNotEqual(sphereColor, warningColor) self.delayDisplay('Test passed!')
def revealPixmap(self, xy): """fill a pixmap with an image that has a reveal pattern at xy with the fg drawn over the bg""" # Get QImages for the two layers bgVTKImage = self.layerLogics['B'].GetImageData() fgVTKImage = self.layerLogics['F'].GetImageData() bgQImage = qt.QImage() fgQImage = qt.QImage() slicer.qMRMLUtils().vtkImageDataToQImage(bgVTKImage, bgQImage) slicer.qMRMLUtils().vtkImageDataToQImage(fgVTKImage, fgQImage) # get the geometry of the focal point (xy) and images # noting that vtk has the origin at the bottom left and qt has # it at the top left. yy is the flipped version of y imageWidth = bgQImage.width() imageHeight = bgQImage.height() x, y = xy yy = imageHeight - y # # make a generally transparent image, # then fill quadrants with the fg image # overlayImage = qt.QImage(imageWidth, imageHeight, qt.QImage().Format_ARGB32) overlayImage.fill(0) halfWidth = imageWidth / 2 halfHeight = imageHeight / 2 topLeft = qt.QRect(0, 0, x, yy) bottomRight = qt.QRect(x, yy, imageWidth - x - 1, imageHeight - yy - 1) self.painter.begin(overlayImage) self.painter.drawImage(topLeft, fgQImage, topLeft) self.painter.drawImage(bottomRight, fgQImage, bottomRight) self.painter.end() # draw the bg and fg on top of gray background compositePixmap = qt.QPixmap(self.width, self.height) compositePixmap.fill(self.gray) self.painter.begin(compositePixmap) self.painter.drawImage(-1 * (x - self.width / 2), -1 * (yy - self.height / 2), bgQImage) self.painter.drawImage(-1 * (x - self.width / 2), -1 * (yy - self.height / 2), overlayImage) self.painter.end() if self.scale: compositePixmap = self.scalePixmap(compositePixmap) # draw a border around the pixmap self.painter.begin(compositePixmap) self.pen = qt.QPen() self.color = qt.QColor("#FF0") self.color.setAlphaF(0.3) self.pen.setColor(self.color) self.pen.setWidth(5) self.pen.setStyle(3) # dotted line (Qt::DotLine) self.painter.setPen(self.pen) rect = qt.QRect(1, 1, self.width - 2, self.height - 2) self.painter.drawRect(rect) self.painter.end() return compositePixmap