120 lines
3.1 KiB
Python
120 lines
3.1 KiB
Python
"""
|
|
|
|
Windrose und Windroseflex
|
|
Benötigt 6 Werte
|
|
Hauptwerte: AWA, AWS, TWD, TWS
|
|
Nebenwerte: DBT, STW, oder COG, SOG
|
|
|
|
"""
|
|
|
|
import cairo
|
|
import math
|
|
from .page import Page
|
|
|
|
class WindRose(Page):
|
|
|
|
def draw(self, ctx):
|
|
|
|
# Rahmen
|
|
cx = 200
|
|
cy = 150
|
|
r = 110
|
|
|
|
ctx.set_line_width(3)
|
|
ctx.arc(cx, cy, r + 9, 0, 2*math.pi)
|
|
ctx.stroke()
|
|
ctx.arc(cx, cy, r - 11, 0, 2*math.pi)
|
|
ctx.stroke()
|
|
|
|
for angle in range(0, 360, 10):
|
|
if angle % 30 != 0:
|
|
x, y = self.rotate((cx, cy), ((cx, cy - r),), angle)[0]
|
|
ctx.arc(x, y, 2, 0, 2*math.pi)
|
|
ctx.fill()
|
|
else:
|
|
p = ((cx, cy - r + 10), (cx, cy - r - 10), (cx, cy - r + 30))
|
|
pr = self.rotate((cx, cy), p, angle)
|
|
ctx.move_to(*pr[0])
|
|
ctx.line_to(*pr[1])
|
|
ctx.stroke()
|
|
self.draw_text_center(ctx, *pr[2], str(angle))
|
|
|
|
|
|
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
|
|
|
|
# Namen
|
|
ctx.set_font_size(24)
|
|
ctx.move_to(10, 95) # links oben
|
|
ctx.show_text("AWA")
|
|
ctx.move_to(335, 95) # rechts oben
|
|
ctx.show_text("TWD")
|
|
ctx.move_to(10, 220) # links unten
|
|
ctx.show_text("AWS")
|
|
ctx.move_to(335, 220) # rechts unten
|
|
ctx.show_text("TWS")
|
|
|
|
# Units
|
|
ctx.set_font_size(16)
|
|
ctx.move_to(10, 115) # links oben
|
|
ctx.show_text("Deg")
|
|
ctx.move_to(335, 115) # rechts oben
|
|
ctx.show_text("Deg")
|
|
ctx.move_to(10, 190) # links unten
|
|
ctx.show_text("kn")
|
|
ctx.move_to(335, 190) # rechts unten
|
|
ctx.show_text("kn")
|
|
|
|
# Horiz. Trennlinien
|
|
#ctx.rectangle(0, 149, 60, 3)
|
|
#ctx.fill()
|
|
ctx.set_line_width(3)
|
|
# links
|
|
ctx.move_to(0, 149)
|
|
ctx.line_to(60, 149)
|
|
# rechts
|
|
ctx.move_to(340, 149)
|
|
ctx.line_to(400, 149)
|
|
ctx.stroke()
|
|
|
|
# Meßwerte
|
|
ctx.select_font_face("DSEG7 Classic")
|
|
ctx.set_font_size(40)
|
|
# links oben
|
|
ctx.move_to(10, 65)
|
|
ctx.show_text("148")
|
|
# rechts oben
|
|
ctx.move_to(295, 65)
|
|
ctx.show_text("---")
|
|
# links unten
|
|
ctx.move_to(10, 270)
|
|
ctx.show_text("46.7")
|
|
# rechts unten
|
|
ctx.move_to(295, 270)
|
|
ctx.show_text("77.8")
|
|
|
|
ctx.set_font_size(32)
|
|
# innen oben
|
|
ctx.move_to(160, 130)
|
|
ctx.show_text("38.9")
|
|
# innen unten
|
|
ctx.move_to(160, 200)
|
|
ctx.show_text("19.9")
|
|
ctx.stroke()
|
|
|
|
|
|
# Zeiger
|
|
angle = 148
|
|
p = ((cx - 1, cy - (r - 15)), (cx + 1, cy - (r - 15)), (cx + 4, cy), (cx - 4, cy))
|
|
zeiger = self.rotate((cx, cy), p, angle)
|
|
ctx.move_to(*zeiger[0])
|
|
for point in zeiger[1:]:
|
|
ctx.line_to(*point)
|
|
ctx.fill()
|
|
|
|
ctx.set_source_rgb(*self.bgcolor)
|
|
ctx.arc(cx, cy, 8, 0, 2*math.pi)
|
|
ctx.fill()
|
|
ctx.set_source_rgb(*self.fgcolor)
|
|
ctx.arc(cx, cy, 7, 0, 2*math.pi)
|
|
ctx.fill()
|