Source code for sharppy.viz.watch

import numpy as np
from qtpy import QtGui, QtCore, QtWidgets
import sharppy.sharptab as tab
from sharppy.sharptab.constants import *

## Written by Kelton Halbert - OU School of Meteorology
## and Greg Blumberg - CIMMS


__all__ = ['backgroundWatch', 'plotWatch']

[docs]class backgroundWatch(QtWidgets.QFrame): ''' Draw the background frame and lines for the watch plot frame ''' def __init__(self): super(backgroundWatch, self).__init__() self.initUI()
[docs] def initUI(self): ## window configuration settings, ## sich as padding, width, height, and ## min/max plot axes self.lpad = 0; self.rpad = 0 self.tpad = 0; self.bpad = 20 self.wid = self.size().width() - self.rpad self.hgt = self.size().height() - self.bpad self.tlx = self.rpad; self.tly = self.tpad self.brx = self.wid; self.bry = self.hgt if self.physicalDpiX() > 75: fsize = 10 else: fsize = 12 #fsize = 10 self.font_ratio = 0.0512 self.title_font = QtGui.QFont('Helvetica', round(self.size().height() * self.font_ratio) + 5) self.plot_font = QtGui.QFont('Helvetica', round(self.size().height() * self.font_ratio) + 4) self.title_metrics = QtGui.QFontMetrics( self.title_font ) self.plot_metrics = QtGui.QFontMetrics( self.plot_font ) self.title_height = self.title_metrics.height() self.plot_height = self.plot_metrics.height() self.plotBitMap = QtGui.QPixmap(self.width(), self.height()) self.plotBitMap.fill(self.bg_color) self.plotBackground()
[docs] def resizeEvent(self, e): ''' Handles the event the window is resized ''' self.initUI()
[docs] def draw_frame(self, qp): ''' Draw the background frame. qp: QtGui.QPainter object ''' ## set a new pen to draw with pen = QtGui.QPen(self.fg_color, 2, QtCore.Qt.SolidLine) qp.setPen(pen) qp.setFont(self.title_font) ## draw the borders in white qp.drawLine(self.tlx, self.tly, self.brx, self.tly) qp.drawLine(self.brx, self.tly, self.brx, self.bry) qp.drawLine(self.brx, self.bry, self.tlx, self.bry) qp.drawLine(self.tlx, self.bry, self.tlx, self.tly) y1 = self.bry / 13. pad = self.bry / 100. rect0 = QtCore.QRect(0, pad*4, self.brx, self.title_height) qp.drawText(rect0, QtCore.Qt.TextDontClip | QtCore.Qt.AlignCenter, 'Psbl Haz. Type') pen = QtGui.QPen(self.fg_color, 1, QtCore.Qt.SolidLine) qp.setPen(pen) qp.drawLine(0, pad*4 + (self.title_height + 3), self.brx, pad*4 + (self.title_height + 3))
[docs] def plotBackground(self): qp = QtGui.QPainter() qp.begin(self.plotBitMap) #qp.setRenderHint(qp.Antialiasing) #qp.setRenderHint(qp.TextAntialiasing) ## draw the frame self.draw_frame(qp) qp.end()
[docs]class plotWatch(backgroundWatch): ''' Plot the data on the frame. Inherits the background class that plots the frame. ''' def __init__(self): self.bg_color = QtGui.QColor('#000000') self.fg_color = QtGui.QColor('#ffffff') self.pdstor_color = QtGui.QColor('#ff00ff') self.tor_color = QtGui.QColor('#ff0000') self.svr_color = QtGui.QColor('#ffff00') self.mrglsvr_color = QtGui.QColor('#0099cc') self.flood_color = QtGui.QColor('#5ffb17') self.blizzard_color = QtGui.QColor('#3366ff') self.fire_color = QtGui.QColor('#ff9900') self.heat_color = QtGui.QColor('#c85a17') self.none_color = QtGui.QColor('#ffcc33') self.color_map = { 'PDS TOR': 'pdstor_color', 'TOR': 'tor_color', 'MRGL TOR': 'tor_color', 'SVR': 'svr_color', 'MRGL SVR': 'mrglsvr_color', 'FLASH FLOOD': 'flood_color', 'BLIZZARD': 'blizzard_color', 'WIND CHILL': 'blizzard_color', 'FREEZE': 'blizzard_color', 'FIRE WEATHER': 'fire_color', 'EXCESSIVE HEAT': 'heat_color', 'NONE': 'none_color', } self.use_left = False super(plotWatch, self).__init__() self.prof = None
[docs] def setProf(self, prof): self.prof = prof if self.use_left: self.watch_type = self.prof.left_watch_type else: self.watch_type = self.prof.right_watch_type self.clearData() self.plotBackground() self.plotData() self.update()
[docs] def setPreferences(self, update_gui=True, **prefs): self.bg_color = QtGui.QColor(prefs['bg_color']) self.fg_color = QtGui.QColor(prefs['fg_color']) self.pdstor_color = QtGui.QColor(prefs['watch_pdstor_color']) self.tor_color = QtGui.QColor(prefs['watch_tor_color']) self.svr_color = QtGui.QColor(prefs['watch_svr_color']) self.mrglsvr_color = QtGui.QColor(prefs['watch_mrglsvr_color']) self.flood_color = QtGui.QColor(prefs['watch_flood_color']) self.blizzard_color = QtGui.QColor(prefs['watch_blizzard_color']) self.fire_color = QtGui.QColor(prefs['watch_fire_color']) self.heat_color = QtGui.QColor(prefs['watch_heat_color']) self.none_color = QtGui.QColor(prefs['watch_none_color']) if update_gui: if self.use_left: self.watch_type = self.prof.left_watch_type else: self.watch_type = self.prof.right_watch_type self.clearData() self.plotBackground() self.plotData() self.update()
[docs] def setDeviant(self, deviant): self.use_left = deviant == 'left' if self.use_left: self.watch_type = self.prof.left_watch_type else: self.watch_type = self.prof.right_watch_type self.clearData() self.plotBackground() self.plotData() self.update()
[docs] def resizeEvent(self, e): ''' Handles when the window is resized ''' super(plotWatch, self).resizeEvent(e) self.plotData()
[docs] def paintEvent(self, e): ''' Handles painting on the frame ''' ## this function handles painting the plot super(plotWatch, self).paintEvent(e) ## create a new painter obkect qp = QtGui.QPainter() qp.begin(self) ## end the painter qp.drawPixmap(0,0,self.plotBitMap) qp.end()
[docs] def clearData(self): ''' Handles the clearing of the pixmap in the frame. ''' self.plotBitMap = QtGui.QPixmap(self.width(), self.height()) self.plotBitMap.fill(self.bg_color)
[docs] def plotData(self): if self.prof is None: return watch_type_color = getattr(self, self.color_map[self.watch_type]) qp = QtGui.QPainter() qp.begin(self.plotBitMap) qp.setRenderHint(qp.Antialiasing) qp.setRenderHint(qp.TextAntialiasing) pen = QtGui.QPen(QtGui.QColor(watch_type_color), 1, QtCore.Qt.SolidLine) qp.setPen(pen) qp.setFont(self.plot_font) centery = self.bry / 2. rect0 = QtCore.QRect(0, centery, self.brx, self.title_height) qp.drawText(rect0, QtCore.Qt.TextDontClip | QtCore.Qt.AlignCenter, self.watch_type) qp.end()
if __name__ == '__main__': app_frame = QtGui.QApplication([]) tester = plotWatch() tester.show() app_frame.exec_()