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()
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()
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')
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))