def setVMin(self, vmin): """Set the minimal value of the colormap :param float vmin: Lower bound of the colormap or None for autoscale (default) value) """ if self.isEditable() is False: raise NotEditableError('Colormap is not editable') if vmin is not None: if self._vmax is not None and vmin > self._vmax: err = "Can't set vmin because vmin >= vmax. " \ "vmin = %s, vmax = %s" % (vmin, self._vmax) raise ValueError(err) self._vmin = vmin self.sigChanged.emit()
def _setFromDict(self, dic): """Set values to the colormap from a dictionary :param dict dic: the colormap as a dictionary """ if self.isEditable() is False: raise NotEditableError('Colormap is not editable') name = dic['name'] if 'name' in dic else None colors = dic['colors'] if 'colors' in dic else None if name is not None and colors is not None: if isinstance(colors, int): # Filter out argument which was supported but never used _logger.info( "Unused 'colors' from colormap dictionary filterer.") colors = None vmin = dic['vmin'] if 'vmin' in dic else None vmax = dic['vmax'] if 'vmax' in dic else None if 'normalization' in dic: normalization = dic['normalization'] else: warn = 'Normalization not given in the dictionary, ' warn += 'set by default to ' + Colormap.LINEAR _logger.warning(warn) normalization = Colormap.LINEAR if name is None and colors is None: err = 'The colormap should have a name defined or a tuple of colors' raise ValueError(err) if normalization not in Colormap.NORMALIZATIONS: err = 'Given normalization is not recoginized (%s)' % normalization raise ValueError(err) # If autoscale, then set boundaries to None if dic.get('autoscale', False): vmin, vmax = None, None if name is not None: self.setName(name) else: self.setColormapLUT(colors) self._vmin = vmin self._vmax = vmax self._autoscale = True if (vmin is None and vmax is None) else False self._normalization = normalization self.sigChanged.emit()
def setColormapLUT(self, colors): """Set the colors of the colormap. :param numpy.ndarray colors: the colors of the LUT. If float, it is converted from [0, 1] to uint8 range. Otherwise it is casted to uint8. .. warning: this will set the value of name to None """ if self.isEditable() is False: raise NotEditableError('Colormap is not editable') self._setColors(colors) if len(colors) is 0: self._colors = None self._name = None self.sigChanged.emit()
def restoreState(self, byteArray): """ Read the colormap state from a QByteArray. :param qt.QByteArray byteArray: Stream containing the state :return: True if the restoration sussseed :rtype: bool """ if self.isEditable() is False: raise NotEditableError('Colormap is not editable') stream = qt.QDataStream(byteArray, qt.QIODevice.ReadOnly) className = stream.readQString() if className != self.__class__.__name__: _logger.warning("Classname mismatch. Found %s." % className) return False version = stream.readUInt32() if version != self._SERIAL_VERSION: _logger.warning("Serial version mismatch. Found %d." % version) return False name = stream.readQString() isNull = stream.readBool() if not isNull: vmin = stream.readQVariant() else: vmin = None isNull = stream.readBool() if not isNull: vmax = stream.readQVariant() else: vmax = None normalization = stream.readQString() # emit change event only once old = self.blockSignals(True) try: self.setName(name) self.setNormalization(normalization) self.setVRange(vmin, vmax) finally: self.blockSignals(old) self.sigChanged.emit() return True
def setName(self, name): """Set the name of the colormap to use. :param str name: The name of the colormap. At least the following names are supported: 'gray', 'reversed gray', 'temperature', 'red', 'green', 'blue', 'jet', 'viridis', 'magma', 'inferno', 'plasma'. """ name = str(name) if self._name == name: return if self.isEditable() is False: raise NotEditableError('Colormap is not editable') if name not in self.getSupportedColormaps(): raise ValueError("Colormap name '%s' is not supported" % name) self._name = name self._colors = _getColormap(self._name) self.sigChanged.emit()
def setVMax(self, vmax): """Set the maximal value of the colormap :param float vmax: Upper bounds of the colormap or None for autoscale (default) """ if self.isEditable() is False: raise NotEditableError('Colormap is not editable') if vmax is not None: if self._vmin is not None and vmax < self._vmin: err = "Can't set vmax because vmax <= vmin. " \ "vmin = %s, vmax = %s" % (self._vmin, vmax) raise ValueError(err) if vmax != self._vmax: self._vmax = vmax self.__warnBadVmax = True self.sigChanged.emit()
def setFromColormap(self, other): """Set this colormap using information from the `other` colormap. :param Colormap other: Colormap to use as reference. """ if not self.isEditable(): raise NotEditableError('Colormap is not editable') if self == other: return old = self.blockSignals(True) name = other.getName() if name is not None: self.setName(name) else: self.setColormapLUT(other.getColormapLUT()) self.setNormalization(other.getNormalization()) self.setVRange(other.getVMin(), other.getVMax()) self.blockSignals(old) self.sigChanged.emit()
def setVRange(self, vmin, vmax): """Set the bounds of the colormap :param vmin: Lower bound of the colormap or None for autoscale (default) :param vmax: Upper bounds of the colormap or None for autoscale (default) """ if self.isEditable() is False: raise NotEditableError('Colormap is not editable') if vmin is not None and vmax is not None: if vmin > vmax: err = "Can't set vmin and vmax because vmin >= vmax " \ "vmin = %s, vmax = %s" % (vmin, vmax) raise ValueError(err) if self._vmin == vmin and self._vmax == vmax: return self._vmin = vmin self._vmax = vmax self.sigChanged.emit()
def setColormapLUT(self, colors): """Set the colors of the colormap. :param numpy.ndarray colors: the colors of the LUT. If float, it is converted from [0, 1] to uint8 range. Otherwise it is casted to uint8. .. warning: this will set the value of name to None """ if self.isEditable() is False: raise NotEditableError('Colormap is not editable') assert colors is not None colors = numpy.array(colors, copy=False) if colors.shape == (): raise TypeError("An array is expected for 'colors' argument. '%s' was found." % type(colors)) assert len(colors) != 0 assert colors.ndim >= 2 colors.shape = -1, colors.shape[-1] self._colors = _colormap.array_to_rgba8888(colors) self._name = None self.sigChanged.emit()
def _setFromDict(self, dic): """Set values to the colormap from a dictionary :param dict dic: the colormap as a dictionary """ if self.isEditable() is False: raise NotEditableError('Colormap is not editable') name = dic['name'] if 'name' in dic else None colors = dic['colors'] if 'colors' in dic else None vmin = dic['vmin'] if 'vmin' in dic else None vmax = dic['vmax'] if 'vmax' in dic else None if 'normalization' in dic: normalization = dic['normalization'] else: warn = 'Normalization not given in the dictionary, ' warn += 'set by default to ' + Colormap.LINEAR _logger.warning(warn) normalization = Colormap.LINEAR if name is None and colors is None: err = 'The colormap should have a name defined or a tuple of colors' raise ValueError(err) if normalization not in Colormap.NORMALIZATIONS: err = 'Given normalization is not recoginized (%s)' % normalization raise ValueError(err) # If autoscale, then set boundaries to None if dic.get('autoscale', False): vmin, vmax = None, None self._name = name self._colors = colors self._vmin = vmin self._vmax = vmax self._autoscale = True if (vmin is None and vmax is None) else False self._normalization = normalization self.sigChanged.emit()
def setFromColormap(self, other): """Set this colormap using information from the `other` colormap. :param ~silx.gui.colors.Colormap other: Colormap to use as reference. """ if not self.isEditable(): raise NotEditableError('Colormap is not editable') if self == other: return with blockSignals(self): name = other.getName() if name is not None: self.setName(name) else: self.setColormapLUT(other.getColormapLUT()) self.setNaNColor(other.getNaNColor()) self.setNormalization(other.getNormalization()) self.setGammaNormalizationParameter( other.getGammaNormalizationParameter()) self.setAutoscaleMode(other.getAutoscaleMode()) self.setVRange(*other.getVRange()) self.setEditable(other.isEditable()) self.sigChanged.emit()
def restoreState(self, byteArray): """ Read the colormap state from a QByteArray. :param qt.QByteArray byteArray: Stream containing the state :return: True if the restoration sussseed :rtype: bool """ if self.isEditable() is False: raise NotEditableError('Colormap is not editable') stream = qt.QDataStream(byteArray, qt.QIODevice.ReadOnly) className = stream.readQString() if className != self.__class__.__name__: _logger.warning("Classname mismatch. Found %s." % className) return False version = stream.readUInt32() if version not in numpy.arange(1, self._SERIAL_VERSION+1): _logger.warning("Serial version mismatch. Found %d." % version) return False name = stream.readQString() isNull = stream.readBool() if not isNull: vmin = stream.readQVariant() else: vmin = None isNull = stream.readBool() if not isNull: vmax = stream.readQVariant() else: vmax = None normalization = stream.readQString() if normalization == Colormap.GAMMA: gamma = stream.readFloat() else: gamma = None if version == 1: autoscaleMode = Colormap.MINMAX else: autoscaleMode = stream.readQString() if version <= 2: nanColor = self._DEFAULT_NAN_COLOR else: nanColor = stream.readInt32(), stream.readInt32(), stream.readInt32(), stream.readInt32() # emit change event only once old = self.blockSignals(True) try: self.setName(name) self.setNormalization(normalization) self.setAutoscaleMode(autoscaleMode) self.setVRange(vmin, vmax) if gamma is not None: self.setGammaNormalizationParameter(gamma) self.setNaNColor(nanColor) finally: self.blockSignals(old) self.sigChanged.emit() return True