def getFreeColorRange(colormap): """ Returns a list of 10 colors in range not covered by colormap. :rtype: List[qt.QColor] """ name = colormap['name'] colormap = Colormap(name) # extract all hues from colormap colors = colormap.getNColors() hues = [] for c in colors: c = qt.QColor.fromRgb(c[0], c[1], c[2]) hues.append(c.hueF()) # search the bigger empty hue range current = (0, 0.0, 0.2) hues = filter(lambda x: x >= 0, set(hues)) hues = list(sorted(hues)) if len(hues) > 1: for i in range(len(hues)): h1 = hues[i] h2 = hues[(i + 1) % len(hues)] if h2 < h1: h2 = h2 + 1.0 diff = h2 - h1 if diff > 0.5: diff = 1.0 - diff if diff > current[0]: current = diff, h1, h2 elif len(hues) == 1: h = (hues[0] + 0.5) % 1.0 current = (0, h - 0.1, h + 0.1) else: pass h1, h2 = current[1:] delta = (h2 - h1) / 6.0 # move the range from the colormap h1, h2 = h1 + delta, h2 - delta hmin = (h1 + h2) / 2.0 # generate colors with 3 hsv control points # (h1, 1, 1), (hmid, 1, 0.5), (h2, 1, 1) colors = [] for i in range(5): h = h1 + (hmin - h1) * (i / 5.0) v = 0.5 + 0.1 * (5 - i) c = qt.QColor.fromHsvF(h % 1.0, 1.0, v) colors.append(c) for i in range(5): h = hmin + (h2 - hmin) * (i / 5.0) v = 0.5 + 0.1 * (i) c = qt.QColor.fromHsvF(h % 1.0, 1.0, v) colors.append(c) return colors
def getFreeColorRange(colormap): name = colormap['name'] colormap = Colormap(name) # extract all hues from colormap colors = colormap.getNColors() hues = [] for c in colors: c = qt.QColor.fromRgb(c[0], c[1], c[2]) hues.append(c.hueF()) # search the bigger empty hue range current = (0, 0.0, 0.2) hues = filter(lambda x: x >= 0, set(hues)) hues = list(sorted(hues)) if len(hues) > 1: for i in range(len(hues)): h1 = hues[i] h2 = hues[(i + 1) % len(hues)] if h2 < h1: h2 = h2 + 1.0 diff = h2 - h1 if diff > 0.5: diff = 1.0 - diff if diff > current[0]: current = diff, h1, h2 elif len(hues) == 1: h = (hues[0] + 0.5) % 1.0 current = (0, h - 0.1, h + 0.1) else: pass h1, h2 = current[1:] delta = (h2 - h1) / 6.0 # move the range from the colormap h1, h2 = h1 + delta, h2 - delta hmin = (h1 + h2) / 2.0 # generate colors with 3 hsv control points # (h1, 1, 1), (hmid, 1, 0.5), (h2, 1, 1) colors = [] for i in range(5): h = h1 + (hmin - h1) * (i / 5.0) v = 0.5 + 0.1 * (5 - i) c = qt.QColor.fromHsvF(h % 1.0, 1.0, v) colors.append(c) for i in range(5): h = hmin + (h2 - hmin) * (i / 5.0) v = 0.5 + 0.1 * (i) c = qt.QColor.fromHsvF(h % 1.0, 1.0, v) colors.append(c) return colors
def testGetNColors(self): """Test getNColors method""" # specific LUT colormap = Colormap(name=None, colors=((0., 0., 0.), (1., 1., 1.)), vmin=1000, vmax=2000) colors = colormap.getNColors() self.assertTrue(numpy.all(numpy.equal( colors, ((0, 0, 0, 255), (255, 255, 255, 255)))))
def testGetNColors(self): """Test getNColors method""" # specific LUT colormap = Colormap(name=None, colors=((0., 0., 0.), (1., 1., 1.)), vmin=1000, vmax=2000) colors = colormap.getNColors() self.assertTrue(numpy.all(numpy.equal( colors, ((0, 0, 0, 255), (255, 255, 255, 255)))))
def testLut(self): colormap = Colormap("test_8") colors = colormap.getNColors(8) self.assertEqual(len(colors), 8)
def testLut(self): colormap = Colormap("test_8") colors = colormap.getNColors(8) self.assertEquals(len(colors), 8)
class CalibrationContext(ApplicationContext): __instance = None @staticmethod def _releaseSingleton(): ApplicationContext._releaseSingleton() CalibrationContext.__instance = None @staticmethod def instance(): """ :rtype: CalibrationContext """ assert(CalibrationContext.__instance is not None) return CalibrationContext.__instance def __init__(self, settings=None): super(CalibrationContext, self).__init__(settings=settings) assert(CalibrationContext.__instance is None) self.__defaultColormapDialog = None CalibrationContext.__instance = self self.__calibrationModel = None self.__rawColormap = Colormap("inferno", normalization=Colormap.LOGARITHM) self.__settings = settings self.__angleUnit = DataModel() self.__angleUnit.setValue(units.Unit.RADIAN) self.__lengthUnit = DataModel() self.__lengthUnit.setValue(units.Unit.METER) self.__wavelengthUnit = DataModel() self.__wavelengthUnit.setValue(units.Unit.ANGSTROM) self.__markerColors = {} self.sigStyleChanged = self.__rawColormap.sigChanged def __restoreColormap(self, groupName, colormap): settings = self.__settings if settings is None: _logger.debug("Settings not set") return settings.beginGroup(groupName) byteArray = settings.value("default", None) if byteArray is not None: try: colormap.restoreState(byteArray) except Exception: _logger.debug("Backtrace", exc_info=True) settings.endGroup() def __saveColormap(self, groupName, colormap): settings = self.__settings if settings is None: _logger.debug("Settings not set") return if colormap is None: return settings.beginGroup(groupName) settings.setValue("default", colormap.saveState()) settings.endGroup() def __restoreUnit(self, unitModel, settings, fieldName, defaultUnit): unitName = settings.value(fieldName, None) unit = None if unitName is not None: try: unit = getattr(units.Unit, unitName) if not isinstance(unit, units.Unit): unit = None except Exception: _logger.error("Unit name '%s' is not an unit", unitName) unit = None if unit is None: unit = defaultUnit unitModel.setValue(unit) def restoreSettings(self): """Restore the settings of all the application""" settings = self.__settings if settings is None: _logger.debug("Settings not set") return self.__restoreColormap("raw-colormap", self.__rawColormap) settings.beginGroup("units") self.__restoreUnit(self.__angleUnit, settings, "angle-unit", units.Unit.RADIAN) self.__restoreUnit(self.__lengthUnit, settings, "length-unit", units.Unit.METER) self.__restoreUnit(self.__wavelengthUnit, settings, "wavelength-unit", units.Unit.ANGSTROM) settings.endGroup() def saveSettings(self): """Save the settings of all the application""" settings = self.__settings if settings is None: _logger.debug("Settings not set") return self.__saveColormap("raw-colormap", self.__rawColormap) settings.beginGroup("units") settings.setValue("angle-unit", self.__angleUnit.value().name) settings.setValue("length-unit", self.__lengthUnit.value().name) settings.setValue("wavelength-unit", self.__wavelengthUnit.value().name) settings.endGroup() # Synchronize the file storage super(CalibrationContext, self).saveSettings() def getCalibrationModel(self): if self.__calibrationModel is None: self.__calibrationModel = CalibrationModel() return self.__calibrationModel def getRawColormap(self): """Returns the user preference colormap used to display raw data images :rtype: Colormap """ return self.__rawColormap def getColormapDialog(self): """Returns a shared color dialog. :rtype: ColorDialog """ if self.__defaultColormapDialog is None: parent = self.parent() if parent is None: return None dialog = ColormapDialog(parent=parent) dialog.setModal(False) def dialogShown(): dialog = self.__defaultColormapDialog self.restoreWindowLocationSettings("colormap-dialog", dialog) # Sync with the raw image data = self.getCalibrationModel().experimentSettingsModel().image().value() dialog.setData(data) def dialogHidden(): dialog = self.__defaultColormapDialog self.saveWindowLocationSettings("colormap-dialog", dialog) eventutils.createShowSignal(dialog) eventutils.createHideSignal(dialog) dialog.sigShown.connect(dialogShown) dialog.sigHidden.connect(dialogHidden) self.__defaultColormapDialog = dialog return self.__defaultColormapDialog def getAngleUnit(self): return self.__angleUnit def getLengthUnit(self): return self.__lengthUnit def getWavelengthUnit(self): return self.__wavelengthUnit def getMarkerColor(self, index, mode="qt"): colors = self.markerColorList() color = colors[index % len(colors)] if mode == "html": return "#%02X%02X%02X" % (color.red(), color.green(), color.blue()) elif mode == "numpy": return numpy.array([color.redF(), color.greenF(), color.blueF()]) elif mode == "qt": return color else: raise ValueError("Mode '%s' not expected" % mode) def getLabelColor(self): """Returns the Qt color used to display text label :rtype: qt.QColor """ markers = self.markerColorList() color = markers[0] return color def getMaskedColor(self): """Returns the Qt color used to display masked pixels :rtype: qt.QColor """ return qt.QColor(255, 0, 255) def getBackgroundColor(self): """Returns the Qt color used to display part of the diagram outside of the data. :rtype: qt.QColor """ colors = self.__rawColormap.getNColors() color = colors[0] color = 255 - ((255 - color) // 2) color = int(color.mean()) color = [color, color, color] return qt.QColor(color[0], color[1], color[2]) def getHtmlMarkerColor(self, index): colors = self.markerColorList() color = colors[index % len(colors)] "#%02X%02X%02X" % (color.red(), color.green(), color.blue()) def markerColorList(self): colormap = self.getRawColormap() name = colormap['name'] if name not in self.__markerColors: colors = self.createMarkerColors() self.__markerColors[name] = colors else: colors = self.__markerColors[name] return colors def createMarkerColors(self): colormap = self.getRawColormap() return colorutils.getFreeColorRange(colormap)