diff options
author | Picca Frédéric-Emmanuel <picca@debian.org> | 2017-10-07 07:59:01 +0200 |
---|---|---|
committer | Picca Frédéric-Emmanuel <picca@debian.org> | 2017-10-07 07:59:01 +0200 |
commit | bfa4dba15485b4192f8bbe13345e9658c97ecf76 (patch) | |
tree | fb9c6e5860881fbde902f7cbdbd41dc4a3a9fb5d /silx/gui/plot/MaskToolsWidget.py | |
parent | f7bdc2acff3c13a6d632c28c4569690ab106eed7 (diff) |
New upstream version 0.6.0+dfsg
Diffstat (limited to 'silx/gui/plot/MaskToolsWidget.py')
-rw-r--r-- | silx/gui/plot/MaskToolsWidget.py | 87 |
1 files changed, 60 insertions, 27 deletions
diff --git a/silx/gui/plot/MaskToolsWidget.py b/silx/gui/plot/MaskToolsWidget.py index 6407d44..09c5ca5 100644 --- a/silx/gui/plot/MaskToolsWidget.py +++ b/silx/gui/plot/MaskToolsWidget.py @@ -35,13 +35,14 @@ from __future__ import division __authors__ = ["T. Vincent", "P. Knobel"] __license__ = "MIT" -__date__ = "20/04/2017" +__date__ = "20/06/2017" import os import sys import numpy import logging +import collections from silx.image import shapes @@ -211,17 +212,13 @@ class MaskToolsWidget(BaseMaskToolsWidget): _maxLevelNumber = 255 def __init__(self, parent=None, plot=None): + super(MaskToolsWidget, self).__init__(parent, plot, + mask=ImageMask()) self._origin = (0., 0.) # Mask origin in plot self._scale = (1., 1.) # Mask scale in plot self._z = 1 # Mask layer in plot self._data = numpy.zeros((0, 0), dtype=numpy.uint8) # Store image - self._mask = ImageMask() - - super(MaskToolsWidget, self).__init__(parent, plot) - - self._initWidgets() - def setSelectionMask(self, mask, copy=True): """Set the mask to a new array. @@ -239,6 +236,13 @@ class MaskToolsWidget(BaseMaskToolsWidget): _logger.error('Not an image, shape: %d', len(mask.shape)) return None + # ensure all mask attributes are synchronized with the active image + # and connect listener + activeImage = self.plot.getActiveImage() + if activeImage is not None and activeImage.getLegend() != self._maskName: + self._activeImageChanged() + self.plot.sigActiveImageChanged.connect(self._activeImageChanged) + if self._data.shape[0:2] == (0, 0) or mask.shape == self._data.shape[0:2]: self._mask.setMask(mask, copy=copy) self._mask.commit() @@ -262,12 +266,22 @@ class MaskToolsWidget(BaseMaskToolsWidget): """Update mask image in plot""" mask = self.getSelectionMask(copy=False) if len(mask): - self.plot.addImage(mask, legend=self._maskName, - colormap=self._colormap, - origin=self._origin, - scale=self._scale, - z=self._z, - replace=False, resetzoom=False) + # get the mask from the plot + maskItem = self.plot.getImage(self._maskName) + mustBeAdded = maskItem is None + if mustBeAdded: + maskItem = items.MaskImageData() + maskItem._setLegend(self._maskName) + # update the items + maskItem.setData(mask, copy=False) + maskItem.setColormap(self._colormap) + maskItem.setOrigin(self._origin) + maskItem.setScale(self._scale) + maskItem.setZValue(self._z) + + if mustBeAdded: + self.plot._add(maskItem) + elif self.plot.getImage(self._maskName): self.plot.remove(self._maskName, kind='image') @@ -281,7 +295,11 @@ class MaskToolsWidget(BaseMaskToolsWidget): self.plot.sigActiveImageChanged.connect(self._activeImageChanged) def hideEvent(self, event): - self.plot.sigActiveImageChanged.disconnect(self._activeImageChanged) + try: + self.plot.sigActiveImageChanged.disconnect( + self._activeImageChanged) + except (RuntimeError, TypeError): + pass if not self.browseAction.isChecked(): self.browseAction.trigger() # Disable drawing tool @@ -337,8 +355,9 @@ class MaskToolsWidget(BaseMaskToolsWidget): def _activeImageChanged(self, *args): """Update widget and mask according to active image changes""" activeImage = self.plot.getActiveImage() - if activeImage is None or activeImage.getLegend() == self._maskName: - # No active image or active image is the mask... + if (activeImage is None or activeImage.getLegend() == self._maskName or + activeImage.getData(copy=False).size == 0): + # No active image or active image is the mask or image has no data... self.setEnabled(False) self._data = numpy.zeros((0, 0), dtype=numpy.uint8) @@ -390,6 +409,14 @@ class MaskToolsWidget(BaseMaskToolsWidget): _logger.error("Can't load filename '%s'", filename) _logger.debug("Backtrace", exc_info=True) raise RuntimeError('File "%s" is not a numpy file.', filename) + elif extension in ["tif", "tiff"]: + try: + image = TiffIO(filename, mode="r") + mask = image.getImage(0) + except Exception as e: + _logger.error("Can't load filename %s", filename) + _logger.debug("Backtrace", exc_info=True) + raise e elif extension == "edf": try: mask = EdfFile(filename, access='r').GetData(0) @@ -423,14 +450,21 @@ class MaskToolsWidget(BaseMaskToolsWidget): dialog = qt.QFileDialog(self) dialog.setWindowTitle("Load Mask") dialog.setModal(1) - filters = [ - 'EDF (*.edf)', - 'TIFF (*.tif)', - 'NumPy binary file (*.npy)', - # Fit2D mask is displayed anyway fabio is here or not - # to show to the user that the option exists - 'Fit2D mask (*.msk)', - ] + + extensions = collections.OrderedDict() + extensions["EDF files"] = "*.edf" + extensions["TIFF files"] = "*.tif *.tiff" + extensions["NumPy binary files"] = "*.npy" + # Fit2D mask is displayed anyway fabio is here or not + # to show to the user that the option exists + extensions["Fit2D mask files"] = "*.msk" + + filters = [] + filters.append("All supported files (%s)" % " ".join(extensions.values())) + for name, extension in extensions.items(): + filters.append("%s (%s)" % (name, extension)) + filters.append("All files (*)") + dialog.setNameFilters(filters) dialog.setFileMode(qt.QFileDialog.ExistingFile) dialog.setDirectory(self.maskFileDir) @@ -610,6 +644,5 @@ class MaskToolsDockWidget(BaseMaskToolsDockWidget): :paran str name: The title of this widget """ def __init__(self, parent=None, plot=None, name='Mask'): - super(MaskToolsDockWidget, self).__init__(parent, name) - self.setWidget(MaskToolsWidget(plot=plot)) - self.widget().sigMaskChanged.connect(self._emitSigMaskChanged) + widget = MaskToolsWidget(plot=plot) + super(MaskToolsDockWidget, self).__init__(parent, name, widget) |