138 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
| """
 | |
| 
 | |
| 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, appdata, boatdata, fluidtype):
 | |
|         super().__init__(pageno, cfg, appdata, 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()
 |