""" Füllstandsanzeige Tank 0: "Fuel", 1: "Water", 2: "Gray Water", 3: "Live Well", 4: "Oil", 5: "Black Water", 6: "Fuel Gasoline", 14: "Error", 15: "Unavailable" """ import os import cairo import math from .page import Page import nmea2000.lookup class Fluid(Page): def __init__(self, pageno, cfg, boatdata, fluidtype): super().__init__(pageno, cfg, boatdata) self.fluidtype = int(fluidtype) if self.fluidtype == 0: self.symbol = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "fuelpump.png")) else: self.symbol = None def draw(self, ctx): # Zentrum Instrument cx = 200 cy = 150 # Radius r = 110 # Füllstand von 0 - 100% # 0 = -120°, 100 = +120° level = self.bd.tank[0].volume or 0 angle = -120 + level * 2.4 # Rahmen ctx.set_source_rgb(*self.fgcolor) ctx.set_line_width(3) ctx.arc(cx, cy, r, 0, 2*math.pi) ctx.stroke() # Symbol, sofern vorhanden if self.symbol: ctx.save() ctx.set_source_surface(self.symbol, cx - 8, cy - 50) ctx.paint() ctx.restore() # Fluidtype ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) ctx.set_font_size(24) ctx.move_to(20, 60) ctx.show_text(nmea2000.lookup.fluidtype[self.fluidtype]) ctx.stroke() # Zeigerrahmen im Zentrum ctx.arc(cx, cy, 8, 0, 2*math.pi) ctx.stroke() # Zeiger in Nullposition # Variante 1, einseitig #p = ((cx - 1, cy - (r - 20)), (cx + 1, cy - (r - 20)), (cx + 4, cy), (cx - 4, cy)) # Variante 2, überstehend p = ((cx - 1, cy - (r - 20)), (cx + 1, cy - (r - 20)), (cx + 6, cy + 15), (cx - 6, cy + 15)) # Zeiger für aktuellen Meßwert zeiger = self.rotate((cx, cy), p, angle) # Zeiger zeichnen ctx.move_to(*zeiger[0]) for point in zeiger[1:]: ctx.line_to(*point) ctx.fill() # Lösche das Zentrum heraus ctx.set_source_rgb(*self.bgcolor) ctx.arc(cx, cy, 6, 0, 2*math.pi) ctx.fill() ctx.set_source_rgb(*self.fgcolor) # Simple Skala direkt zeichnen # 50%-Wert oben in der Mitte ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) ctx.set_font_size(16) ctx.move_to(cx, cy -r) ctx.line_to(cx, cy -r + 16) # linker Anschlag 0% self.draw_text_center(ctx, cx, cy - r + 30, "1/2") l = self.rotate((cx, cy), ((cx, cy - r + 16), (cx, cy - r)), -120) ctx.move_to(*l[0]) ctx.line_to(*l[1]) # rechter Anschlag 100% l = self.rotate((cx, cy), ((cx, cy - r + 16), (cx, cy - r)), 120) ctx.move_to(*l[0]) ctx.line_to(*l[1]) # 25% l = self.rotate((cx, cy), ((cx, cy - r + 16), (cx, cy - r)), -60) ctx.move_to(*l[0]) ctx.line_to(*l[1]) tx, ty = self.rotate((cx, cy), ((cx, cy - r + 30),), -60)[0] self.draw_text_center(ctx, tx, ty, "1/4") # 75% l = self.rotate((cx, cy), ((cx, cy - r + 16), (cx, cy - r)), 60) ctx.move_to(*l[0]) ctx.line_to(*l[1]) tx, ty = self.rotate((cx, cy), ((cx, cy - r + 30),), 60)[0] self.draw_text_center(ctx, tx, ty, "3/4") ctx.set_font_size(24) tx, ty = self.rotate((cx, cy), ((cx, cy - r + 30),), -130)[0] self.draw_text_center(ctx, tx, ty, "E") tx, ty = self.rotate((cx, cy), ((cx, cy - r + 30),), 130)[0] self.draw_text_center(ctx, tx, ty, "F") ctx.stroke() self.draw_text_center(ctx, cx, cy + r - 20, f"{level:.0f}%") ctx.stroke() # Skalenpunkte # Alle 5% ein Punkt aber nur da wo noch kein Strich ist for angle in [x for x in range(-120, 120, 12) if x not in (-120, -60, 0, 60, 120)]: x, y = self.rotate((cx, cy), ((cx, cy - r + 10),), angle)[0] ctx.arc(x, y, 2, 0, 2*math.pi) ctx.fill()