Erstveröffentlichung Weihnachten 2024
This commit is contained in:
114
pages/keel.py
Normal file
114
pages/keel.py
Normal file
@@ -0,0 +1,114 @@
|
||||
"""
|
||||
|
||||
Rotationssensor AS5600 mit Funktion "Kiel"
|
||||
WIP
|
||||
|
||||
Idee:
|
||||
- Zusätzlich Anzeigemöglichkeit für die Tiefe eines variablen Kiels
|
||||
- Mode-Taste
|
||||
|
||||
"""
|
||||
|
||||
import cairo
|
||||
import math
|
||||
from .page import Page
|
||||
|
||||
class Keel(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
# Wert für Kielrotation
|
||||
self.valref = self.bd.getRef("xdrRotK")
|
||||
|
||||
def draw(self, ctx):
|
||||
|
||||
# Mitte oben Instrument (Halbkreis)
|
||||
cx = 200
|
||||
cy = 150
|
||||
|
||||
# Radius Kielposition
|
||||
r = 110
|
||||
|
||||
# Titel
|
||||
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
|
||||
ctx.set_font_size(32)
|
||||
ctx.move_to(100, 70)
|
||||
ctx.show_text("Keel Position")
|
||||
ctx.set_font_size(24)
|
||||
ctx.move_to(175, 110)
|
||||
ctx.show_text(self.valref.unit)
|
||||
ctx.stroke()
|
||||
|
||||
|
||||
# Halbkreis für Skala
|
||||
ctx.set_source_rgb(*self.fgcolor)
|
||||
ctx.set_line_width(3)
|
||||
ctx.arc(cx, cy, r + 10, 0, math.pi)
|
||||
ctx.stroke()
|
||||
|
||||
# Skala mit Strichen, Punkten und Beschriftung
|
||||
char = {
|
||||
90: "45",
|
||||
120: "30",
|
||||
150: "15",
|
||||
180: "0",
|
||||
210: "15",
|
||||
240: "30",
|
||||
270: "45"
|
||||
}
|
||||
# Zeichnen in 10°-Schritten
|
||||
ctx.set_font_size(16)
|
||||
for i in range(90, 271, 10):
|
||||
fx = math.sin(i / 180 * math.pi)
|
||||
fy = math.cos(i / 180 * math.pi)
|
||||
if i in char:
|
||||
x = cx + (r - 30) * fx
|
||||
y = cy - (r - 30) * fy
|
||||
self.draw_text_center(ctx, x, y, char[i])
|
||||
ctx.stroke()
|
||||
if i % 30 == 0:
|
||||
ctx.move_to(cx + (r - 10) * fx, cy - (r - 10) * fy)
|
||||
ctx.line_to(cx + (r + 10) * fx, cy - (r + 10) * fy)
|
||||
ctx.stroke()
|
||||
else:
|
||||
x = cx + r * fx
|
||||
y = cy - r * fy
|
||||
ctx.arc(x, y, 2, 0, 2*math.pi)
|
||||
ctx.fill()
|
||||
|
||||
# Boot und Wasserlinie
|
||||
ctx.arc(cx, cy - 10, 28, 0, math.pi)
|
||||
ctx.fill()
|
||||
ctx.set_line_width(4)
|
||||
ctx.move_to(150, cy)
|
||||
ctx.line_to(250, cy)
|
||||
ctx.stroke()
|
||||
|
||||
#ctx.arc(200, 150, r + 10, 0, 2*math.pi)
|
||||
#ctx.fill()
|
||||
#ctx.set_source_rgb(*self.bgcolor)
|
||||
#ctx.arc(200, 150, r + 7, 0, 2* math.pi)
|
||||
#ctx.rectangle(0, 30, 299, 122)
|
||||
#ctx.fill()
|
||||
|
||||
angle = -15
|
||||
#angle = self.valref.value
|
||||
#TODO Angle limits to +/-45°
|
||||
if angle < -45:
|
||||
angle = -45
|
||||
elif angle > 45:
|
||||
angle = 45
|
||||
angle *= 2 # stretched scale
|
||||
|
||||
# Kiel
|
||||
p = ((cx - 6, cy), (cx + 6, cy), (cx + 2, cy + r - 50), (cx - 2, cy + r - 50))
|
||||
keel = self.rotate((cx, cy), p, angle)
|
||||
ctx.move_to(*keel[0])
|
||||
for point in keel[1:]:
|
||||
ctx.line_to(*point)
|
||||
ctx.fill()
|
||||
|
||||
# Kiel-Bombe
|
||||
x, y = self.rotate((cx, cy), ((cx, cy + r -50),), angle)[0]
|
||||
ctx.arc(x, y, 5, 0, 2*math.pi)
|
||||
ctx.fill()
|
||||
Reference in New Issue
Block a user