114 lines
6.4 KiB
Python
114 lines
6.4 KiB
Python
def assign_colors_to_curves(blocks):
|
|
"""
|
|
Assign a color to each curve contained in the blocks
|
|
|
|
Parameters :
|
|
|
|
blocks (["tag":(str),"unit":(str), "curves":[{"name":(str), "label":(str), "color":(str)}]]) : a list of dictionnaries, each one representing
|
|
a block of curves with their name, their label and their color to display (can be empty if not defined before), grouped by their category if given or unit (in tag).
|
|
|
|
Returns :
|
|
["tag":(str),"unit":(str), "curves":[{"name":(str), "label":(str), "color":(str)}]] : the same object as the "blocks" parameter, with the color value
|
|
updated depending on its availability in the ColorMap
|
|
"""
|
|
|
|
# get last value only
|
|
for block in blocks:
|
|
color_set = set()
|
|
auto_curves = []
|
|
for curve in block["curves"]:
|
|
|
|
col = curve.get("color", "").strip()
|
|
c = ColorMap.to_code(col)
|
|
if c < 0:
|
|
valid = ColorMap.check_hex(col)
|
|
if valid:
|
|
curve["color"] = valid
|
|
else:
|
|
auto_curves.append(curve)
|
|
else:
|
|
color_set.add(c)
|
|
curve["color"] = ColorMap.to_hex(c)
|
|
c = 1 # omit white
|
|
for curve in auto_curves:
|
|
while c in color_set: c += 1 # find unused color
|
|
curve["color"] = ColorMap.to_hex(c)
|
|
c += 1
|
|
|
|
class ColorMap(object):
|
|
'''
|
|
ColorMap is using official CSS color names, with the exception of Green, as this
|
|
is defined differently with X11 colors than in SEA, and used heavily in config files.
|
|
Here Green is an alias to Lime (#00FF00) and MidGreen is #008000, which is called Green in CSS.
|
|
The function to_code is case insensitive and accepts also names with underscores.
|
|
The order is choosen by M. Zolliker for the SEA client, originally only the first 16 were used.
|
|
'''
|
|
hex_name = (("#FFFFFF","White"), ("#FF0000","Red"), ("#00FF00","Lime"), ("#0000FF","Blue"), ("#FF00FF","Magenta"),
|
|
("#FFFF00","Yellow"), ("#00FFFF","Cyan"), ("#000000","Black"), ("#FFA500","Orange"), ("#006400","DarkGreen"),
|
|
("#9400D3","DarkViolet"), ("#A52A2A","Brown"), ("#87CEEB","SkyBlue"), ("#808080","Gray"), ("#FF69B4","HotPink"),
|
|
("#FFFFE0","LightYellow"), ("#00FF7F","SpringGreen"), ("#000080","Navy"), ("#1E90FF","DodgerBlue"),
|
|
("#9ACD32","YellowGreen"), ("#008B8B","DarkCyan"), ("#808000","Olive"), ("#DEB887","BurlyWood"),
|
|
("#7B68EE","MediumSlateBlue"), ("#483D8B","DarkSlateBlue"), ("#98FB98","PaleGreen"), ("#FF1493","DeepPink"),
|
|
("#FF6347","Tomato"), ("#32CD32","LimeGreen"), ("#DDA0DD","Plum"), ("#7FFF00","Chartreuse"), ("#800080","Purple"),
|
|
("#00CED1","DarkTurquoise"), ("#8FBC8F","DarkSeaGreen"), ("#4682B4","SteelBlue"), ("#800000","Maroon"),
|
|
("#3CB371","MediumSeaGreen"), ("#FF4500","OrangeRed"), ("#BA55D3","MediumOrchid"), ("#2F4F4F","DarkSlateGray"),
|
|
("#CD853F","Peru"), ("#228B22","ForestGreen"), ("#48D1CC","MediumTurquoise"), ("#DC143C","Crimson"),
|
|
("#D3D3D3","LightGray"), ("#ADFF2F","GreenYellow"), ("#7FFFD4","Aquamarine"), ("#BC8F8F","RosyBrown"),
|
|
("#20B2AA","LightSeaGreen"), ("#C71585","MediumVioletRed"), ("#F0E68C","Khaki"), ("#6495ED","CornflowerBlue"),
|
|
("#556B2F","DarkOliveGreen"), ("#CD5C5C","IndianRed "), ("#2E8B57","SeaGreen"), ("#F08080","LightCoral"),
|
|
("#8A2BE2","BlueViolet"), ("#AFEEEE","PaleTurquoise"), ("#4169E1","RoyalBlue"), ("#0000CD","MediumBlue"),
|
|
("#B8860B","DarkGoldenRod"), ("#00BFFF","DeepSkyBlue"), ("#FFC0CB","Pink"), ("#4B0082","Indigo "), ("#A0522D","Sienna"),
|
|
("#FFD700","Gold"), ("#F4A460","SandyBrown"), ("#DAA520","GoldenRod"), ("#DA70D6","Orchid"), ("#E6E6FA","Lavender"),
|
|
("#5F9EA0","CadetBlue"), ("#D2691E","Chocolate"), ("#66CDAA","MediumAquaMarine"), ("#6B8E23","OliveDrab"),
|
|
("#A9A9A9","DarkGray"), ("#BDB76B","DarkKhaki"), ("#696969","DimGray"), ("#B0C4DE","LightSteelBlue"),
|
|
("#191970","MidnightBlue"), ("#FFE4C4","Bisque"), ("#6A5ACD","SlateBlue"), ("#EE82EE","Violet"),
|
|
("#8B4513","SaddleBrown"), ("#FF7F50","Coral"), ("#008000","MidGreen"), ("#DB7093","PaleVioletRed"), ("#C0C0C0","Silver"),
|
|
("#E0FFFF","LightCyan"), ("#9370DB","MediumPurple"), ("#FF8C00","DarkOrange"), ("#00FA9A","MediumSpringGreen"),
|
|
("#E9967A","DarkSalmon"), ("#778899","LightSlateGray"), ("#9932CC","DarkOrchid"), ("#EEE8AA","PaleGoldenRod"),
|
|
("#F8F8FF","GhostWhite"), ("#FFA07A","LightSalmon"), ("#ADD8E6","LightBlue"), ("#D8BFD8","Thistle"),
|
|
("#FFE4E1","MistyRose"), ("#FFDEAD","NavajoWhite"), ("#40E0D0","Turquoise"), ("#90EE90","LightGreen"),
|
|
("#B22222","FireBrick"), ("#008080","Teal"), ("#F0FFF0","HoneyDew"), ("#FFFACD","LemonChiffon"), ("#FFF5EE","SeaShell"),
|
|
("#F5F5DC","Beige"), ("#DCDCDC","Gainsboro"), ("#FA8072","Salmon"), ("#8B008B","DarkMagenta"), ("#FFB6C1","LightPink"),
|
|
("#708090","SlateGray"), ("#87CEFA","LightSkyBlue"), ("#FFEFD5","PapayaWhip"), ("#D2B48C","Tan"), ("#FFFFF0","Ivory"),
|
|
("#F0FFFF","Azure"), ("#F5DEB3","Wheat"), ("#00008B","DarkBlue"), ("#FFDAB9","PeachPuff"), ("#8B0000","DarkRed"),
|
|
("#FAF0E6","Linen"), ("#B0E0E6","PowderBlue"), ("#FFE4B5","Moccasin"), ("#F5F5F5","WhiteSmoke"), ("#FFF8DC","Cornsilk"),
|
|
("#FFFAFA","Snow"), ("#FFF0F5","LavenderBlush"), ("#FFEBCD","BlanchedAlmond"), ("#F0F8FF","AliceBlue"),
|
|
("#FAEBD7","AntiqueWhite"), ("#FDF5E6","OldLace"), ("#FAFAD2","LightGoldenRodYellow"), ("#F5FFFA","MintCream"),
|
|
("#FFFAF0","FloralWhite"), ("#7CFC00","LawnGreen"), ("#663399","RebeccaPurple"))
|
|
codes = {}
|
|
for i, pair in enumerate(hex_name):
|
|
codes[pair[0]] = i
|
|
low = pair[1].lower()
|
|
codes[low] = i
|
|
codes[low.replace("gray","grey")] = i
|
|
codes["green"] = 2
|
|
codes["fuchsia"] = 4
|
|
codes["aqua"] = 6
|
|
|
|
@staticmethod
|
|
def to_code(colortext):
|
|
try:
|
|
return int(colortext)
|
|
except ValueError:
|
|
return ColorMap.codes.get(colortext.lower().replace("_",""),-1)
|
|
|
|
@staticmethod
|
|
def check_hex(code):
|
|
if not code.startswith("#"):
|
|
return None
|
|
if len(code) == 4: # convert short code to long code
|
|
code = code[0:2] + code[1:3] + code[2:4] + code[3]
|
|
if len(code) != 7:
|
|
return None
|
|
try:
|
|
int(code[1:], 16) # we have a valid hex color code
|
|
return code
|
|
except ValueError:
|
|
return None
|
|
|
|
@staticmethod
|
|
def to_hex(code):
|
|
try:
|
|
return ColorMap.hex_name[code][0]
|
|
except IndexError:
|
|
return -1 |