Example #1
0
    def __overlayTypeChanged(self, *a):
        """Called when the :attr:`.Display.overlayType` property of the
        currently selected overlay changes. If the :class:`.DisplayOpts`
        instance associated with the new overlay type is a
        :class:`.LabelOpts`, a listener is addd to its ``lut`` property.
        """

        if self.__selectedOpts is not None:
            self.__selectedOpts.removeListener('lut', self.name)
            self.__selectedOpts = None

        overlay = self.__selectedOverlay
        opts = None

        if overlay is None:
            return

        opts = self.displayCtx.getOpts(overlay)

        if not isinstance(opts, (displayctx.LabelOpts, displayctx.MeshOpts)):

            # If the image is a Melodic image, show
            # the melodic classification lut
            if isinstance(overlay, fslmelimage.MelodicImage):
                self.__setLut(fslcmaps.getLookupTable('melodic-classes'))

            return

        opts.addListener('lut', self.name, self.__lutChanged)

        self.__selectedOpts = opts
        self.__lutChanged()
        self.Layout()
Example #2
0
def genMeshColour(overlay):
    """Called by :meth:`MeshOpts.__init__`. Generates an initial colour for
    the given :class:`.Mesh` overlay.

    If the overlay file name looks like it was generated by the FSL FIRST
    segmentation tool, returns a colour from the ``freesurfercolorlut`` colour
    map. Otherwise returns a random colour.
    """
    filename = str(overlay.dataSource)
    subcorticalCmap = colourmaps.getLookupTable('freesurfercolorlut')

    if 'L_Thal' in filename: return subcorticalCmap.get(10).colour
    elif 'L_Caud' in filename: return subcorticalCmap.get(11).colour
    elif 'L_Puta' in filename: return subcorticalCmap.get(12).colour
    elif 'L_Pall' in filename: return subcorticalCmap.get(13).colour
    elif 'BrStem' in filename: return subcorticalCmap.get(16).colour
    elif 'L_Hipp' in filename: return subcorticalCmap.get(17).colour
    elif 'L_Amyg' in filename: return subcorticalCmap.get(18).colour
    elif 'L_Accu' in filename: return subcorticalCmap.get(26).colour
    elif 'R_Thal' in filename: return subcorticalCmap.get(49).colour
    elif 'R_Caud' in filename: return subcorticalCmap.get(50).colour
    elif 'R_Puta' in filename: return subcorticalCmap.get(51).colour
    elif 'R_Pall' in filename: return subcorticalCmap.get(52).colour
    elif 'R_Hipp' in filename: return subcorticalCmap.get(53).colour
    elif 'R_Amyg' in filename: return subcorticalCmap.get(54).colour
    elif 'R_Accu' in filename: return subcorticalCmap.get(58).colour

    return colourmaps.randomBrightColour()
Example #3
0
def test_register():

    cmap = tw.dedent("""
    0 0 0
    0 0 1
    0 1 1
    1 1 1
    """).strip()

    lut = tw.dedent("""
    1 0 0 0 label 1
    2 0 0 1 label 2
    3 0 1 1 label 3
    4 1 1 1 label 4
    """).strip()

    with mockCmaps() as (assetDir, sdir):
        fslcm.init()

        with open('cmap.txt', 'wt') as f: f.write(cmap)
        with open('lut.txt',  'wt') as f: f.write(lut)

        assert not fslcm.isColourMapRegistered('mycmap')
        fslcm.registerColourMap('cmap.txt', key='mycmap', name='My cmap')
        fslcm.getColourMap('mycmap')
        assert     fslcm.isColourMapRegistered('mycmap')
        assert not fslcm.isColourMapInstalled( 'mycmap')
        assert     fslcm.getColourMapLabel('mycmap') == 'My cmap'
        fslcm.installColourMap('mycmap')
        assert     fslcm.isColourMapInstalled( 'mycmap')

        assert not fslcm.isLookupTableRegistered('mylut')
        fslcm.registerLookupTable('lut.txt', key='mylut', name='My lut')
        assert     fslcm.isLookupTableRegistered('mylut')
        assert not fslcm.isLookupTableInstalled( 'mylut')
        assert     fslcm.getLookupTable('mylut').name == 'My lut'
        fslcm.installLookupTable('mylut')
        assert     fslcm.isLookupTableInstalled( 'mylut')
Example #4
0
    def __init__(self, parent, overlayList, displayCtx, frame, canvasPanel):
        """Create a ``MelodicClassificationPanel``.

        :arg parent:      The :mod:`wx` parent object.

        :arg overlayList: The :class:`.OverlayList`.

        :arg displayCtx:  The :class:`.DisplayContext` instance.

        :arg canvasPanel: The :class:`.CanvasPanel` that owns this
                          classification panel.
        """
        ctrlpanel.ControlPanel.__init__(
            self, parent, overlayList, displayCtx, frame)

        self.__disabledText = wx.StaticText(
            self,
            style=(wx.ALIGN_CENTRE_HORIZONTAL |
                   wx.ALIGN_CENTRE_VERTICAL))

        self.__overlay       = None
        self.__canvasPanel   = canvasPanel
        self.__lut           = fslcm.getLookupTable('melodic-classes')

        # If this classification panel has been
        # added to a LightBoxPanel, we add a text
        # annotation to said lightbox panel, to
        # display the labels associated with the
        # currently displayed component.
        self.__textAnnotation = None
        from fsleyes.views.lightboxpanel import LightBoxPanel

        if isinstance(canvasPanel, LightBoxPanel):
            annot = canvasPanel.getCanvas().getAnnotations()
            self.__textAnnotation = annot.text(
                '',
                0.5, 1.0,
                fontSize=30,
                halign='centre',
                valign='top',
                hold=True)

        self.__notebook      = notebook.Notebook(self)
        self.__componentGrid = componentgrid.ComponentGrid(
            self.__notebook,
            overlayList,
            displayCtx,
            frame,
            self.__lut)

        self.__labelGrid     = labelgrid.LabelGrid(
            self.__notebook,
            overlayList,
            displayCtx,
            frame,
            self.__lut)

        self.__loadButton  = wx.Button(self)
        self.__saveButton  = wx.Button(self)
        self.__clearButton = wx.Button(self)

        self.__notebook.AddPage(self.__componentGrid,
                                strings.labels[self, 'componentTab'])
        self.__notebook.AddPage(self.__labelGrid,
                                strings.labels[self, 'labelTab'])

        self.__loadButton .SetLabel(strings.labels[self, 'loadButton'])
        self.__saveButton .SetLabel(strings.labels[self, 'saveButton'])
        self.__clearButton.SetLabel(strings.labels[self, 'clearButton'])

        # Things which you don't want shown when
        # a melodic image is not selected should
        # be added to __mainSizer. Things which
        # you always want displayed should be
        # added to __sizer (but need to be laid
        # out w.r.t. __disabledText/__mainSizer)

        self.__mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.__btnSizer  = wx.BoxSizer(wx.HORIZONTAL)
        self.__sizer     = wx.BoxSizer(wx.VERTICAL)

        self.__btnSizer .Add(self.__loadButton,   flag=wx.EXPAND, proportion=1)
        self.__btnSizer .Add(self.__saveButton,   flag=wx.EXPAND, proportion=1)
        self.__btnSizer .Add(self.__clearButton,  flag=wx.EXPAND, proportion=1)

        self.__mainSizer.Add(self.__notebook,     flag=wx.EXPAND, proportion=1)

        self.__sizer    .Add(self.__disabledText, flag=wx.EXPAND, proportion=1)
        self.__sizer    .Add(self.__mainSizer,    flag=wx.EXPAND, proportion=1)
        self.__sizer    .Add(self.__btnSizer,     flag=wx.EXPAND)

        self.SetSizer(self.__sizer)

        self.__loadButton .Bind(wx.EVT_BUTTON, self.__onLoadButton)
        self.__saveButton .Bind(wx.EVT_BUTTON, self.__onSaveButton)
        self.__clearButton.Bind(wx.EVT_BUTTON, self.__onClearButton)

        overlayList.addListener('overlays',
                                self.name,
                                self.__selectedOverlayChanged)
        displayCtx .addListener('selectedOverlay',
                                self.name,
                                self.__selectedOverlayChanged)

        self.__selectedOverlayChanged()

        self.SetMinSize((400, 100))