Erstveröffentlichung Weihnachten 2024
This commit is contained in:
137
pages/fluid.py
Normal file
137
pages/fluid.py
Normal file
@@ -0,0 +1,137 @@
|
||||
"""
|
||||
|
||||
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()
|
||||
Reference in New Issue
Block a user