import numpy as np
from qtpy import QtGui, QtCore, QtWidgets
import sharppy.sharptab as tab
from sharppy.sharptab.constants import *
## routine written by Kelton Halbert
## keltonhalbert@ou.edu
[docs]def drawFlag(path, shemis=False):
side = -1 if shemis else 1
pos = path.currentPosition()
path.lineTo(pos.x(), pos.y() + side * 10)
path.lineTo(pos.x() - 4, pos.y())
path.moveTo(pos.x() - 6, pos.y())
[docs]def drawFullBarb(path, shemis=False):
side = -1 if shemis else 1
pos = path.currentPosition()
path.lineTo(pos.x(), pos.y() + side * 10)
path.moveTo(pos.x() - 4, pos.y())
[docs]def drawHalfBarb(path, shemis=False):
side = -1 if shemis else 1
pos = path.currentPosition()
path.lineTo(pos.x(), pos.y() + side * 5)
path.moveTo(pos.x() - 4, pos.y())
[docs]def drawBarb(qp, origin_x, origin_y, wdir, wspd, color='#FFFFFF', shemis=False):
pen = QtGui.QPen(QtGui.QColor(color), 1, QtCore.Qt.SolidLine)
pen.setWidthF(1.)
qp.setPen(pen)
qp.setBrush(QtCore.Qt.NoBrush)
try:
wspd = int(round(wspd / 5.) * 5) # Round to the nearest 5
except ValueError:
return
qp.translate(origin_x, origin_y)
if wspd > 0:
qp.rotate(wdir - 90)
path = QtGui.QPainterPath()
path.moveTo(0, 0)
path.lineTo(25, 0)
while wspd >= 50:
drawFlag(path, shemis=shemis)
wspd -= 50
while wspd >= 10:
drawFullBarb(path, shemis=shemis)
wspd -= 10
while wspd >= 5:
drawHalfBarb(path, shemis=shemis)
wspd -= 5
qp.drawPath(path)
qp.rotate(90 - wdir)
else:
qp.drawEllipse(QtCore.QPoint(0, 0), 3, 3)
qp.translate(-origin_x, -origin_y)
[docs]def drawBarb_old( qp, origin_x, origin_y, u, v, color='#FFFFFF' ):
pen = QtGui.QPen(QtGui.QColor(color), 1, QtCore.Qt.SolidLine)
pen.setWidthF(1.)
qp.setPen(pen)
wnd = np.ceil( tab.utils.mag(u, v) )
## check if there are any 50kt triangles needed
if wnd < 5.:
point = QtCore.QPoint( origin_x, origin_y )
qp.drawEllipse(point, 3, 3)
else:
## turn the vector into a normal vector
u_norm = (u / wnd)
v_norm = (v / wnd)
## get the end point of the vector. The scalar multiple is to give it length
end_x = origin_x - u_norm * 25
end_y = origin_y + v_norm * 25
qp.drawLine(origin_x, origin_y, end_x, end_y)
num_flag_barbs = int( wnd / 50. )
num_full_barbs = int( wnd / 10. ) % 5
num_half_barbs = int( wnd / 5. ) % 2
## draw the flag barbs
for i in range(num_flag_barbs):
## use this as a linear offset from the previous barb,
## starting at the end
offset1 = 4. * i
offset2 = 4. * (i+1)
## calculate the u nd v offset
offset_x1 = u_norm * offset1
offset_x2 = u_norm * offset2
offset_y1 = v_norm * offset1
offset_y2 = v_norm * offset2
## starting from the end of the wind barb, work back
## towards the origin in increments of the offset
barbx_start = end_x + offset_x1
flagx_start = end_x + offset_x2
barby_start = end_y - offset_y1
flagy_start = end_y - offset_y2
## then draw outward perpendicular to the wind barb
barbx_end = barbx_start - v_norm * 10
barby_end = barby_start - u_norm * 10
## draw the barb
qp.drawLine(barbx_start, barby_start, barbx_end, barby_end)
qp.drawLine(flagx_start, flagy_start, barbx_end, barby_end)
for i in range(num_full_barbs):
## use this as a linear offset from the previous barb,
## starting at the end
if num_flag_barbs > 0:
offset = 4. * num_flag_barbs + 4 * i + 2
else:
offset = 4. * i
## calculate the u nd v offset
offset_x = u_norm * offset
offset_y = v_norm * offset
## starting from the end of the wind barb, work back
## towards the origin in increments of the offset
barbx_start = end_x + offset_x
barby_start = end_y - offset_y
## then draw outward perpendicular to the wind barb
barbx_end = barbx_start - v_norm * 10
barby_end = barby_start - u_norm * 10
## draw the barb
qp.drawLine(barbx_start, barby_start, barbx_end, barby_end)
## draw the half barbs
for i in range(num_half_barbs):
## this time we want to index from 1 so that we don't
## draw on top of the full barbs
if num_flag_barbs > 0:
i = i + 1
offset = 4. * (num_flag_barbs + 1 + num_full_barbs)
else:
i = i + 1
offset = 4. * (num_full_barbs) * i
## start at the increment after the last full barb
## get the u and v offset
offset_x = u_norm * offset
offset_y = v_norm * offset
## starting from the end of the wind barb, work back
## towards the origin in increments of the offset
barbx_start = end_x + offset_x
barby_start = end_y - offset_y
## then draw outward perpendicular to the wind barb
barbx_end = barbx_start - v_norm * 5
barby_end = barby_start - u_norm * 5
qp.drawLine(barbx_start, barby_start, barbx_end, barby_end)