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)
Exemple #2
0
 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
Exemple #3
0
    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
Exemple #6
0
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
Exemple #7
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"]:
            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
Exemple #8
0
    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()
Exemple #9
0
    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
Exemple #11
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
Exemple #12
0
    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
Exemple #13
0
    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)
Exemple #14
0
    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)
Exemple #15
0
 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))
Exemple #16
0
    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)
Exemple #17
0
  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())
Exemple #18
0
    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)
Exemple #19
0
  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)
Exemple #21
0
    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
Exemple #22
0
    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!')
Exemple #23
0
    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