Former-commit-id:5c19f14f0e
[formerly 7746c8ce24f444d0d9b480e756d092b482e7428a] Former-commit-id:9fb3b29048
This commit is contained in:
commit
f77e0ff965
2 changed files with 910 additions and 364 deletions
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,225 @@
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# This software is in the public domain, furnished "as is", without technical
|
||||||
|
# support, and with no warranty, express or implied, as to its usefulness for
|
||||||
|
# any purpose.
|
||||||
|
#
|
||||||
|
# DefineMaxWindGUI
|
||||||
|
#
|
||||||
|
# Author:
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
try: # See if this is the AWIPS I environment
|
||||||
|
from Numeric import *
|
||||||
|
import AFPS
|
||||||
|
AWIPS_ENVIRON = "AWIPS1"
|
||||||
|
except: # Must be the AWIPS II environment
|
||||||
|
from numpy import *
|
||||||
|
import AbsTime
|
||||||
|
import TimeRange
|
||||||
|
AWIPS_ENVIRON = "AWIPS2"
|
||||||
|
|
||||||
|
import SmartScript
|
||||||
|
import Tkinter
|
||||||
|
import tkFont
|
||||||
|
|
||||||
|
|
||||||
|
class DefineMaxWindGUI(SmartScript.SmartScript):
|
||||||
|
|
||||||
|
def __init__(self, dbss, eaMgr=None):
|
||||||
|
SmartScript.SmartScript.__init__(self, dbss)
|
||||||
|
|
||||||
|
if AWIPS_ENVIRON == "AWIPS1":
|
||||||
|
self.setUp(eaMgr)
|
||||||
|
|
||||||
|
def reportQuadError(self):
|
||||||
|
self.statusBarMsg("Only three quadants at a time may be reduced.\n" + \
|
||||||
|
"...Please toggle another quadrant off first.","S")
|
||||||
|
return
|
||||||
|
|
||||||
|
def toggleButton(self, buttonLabel):
|
||||||
|
b = self._buttonLabels.index(buttonLabel)
|
||||||
|
if self._buttonState[b]: # button was on
|
||||||
|
self._buttonState[b] = False
|
||||||
|
self._buttonList[b].configure(background="gray", activebackground="gray")
|
||||||
|
else: # button was off
|
||||||
|
if sum(self._buttonState) > 2: # only three at a time allowed
|
||||||
|
self.reportQuadError()
|
||||||
|
return
|
||||||
|
self._buttonState[b] = True
|
||||||
|
self._buttonList[b].configure(background="green", activebackground="green")
|
||||||
|
|
||||||
|
|
||||||
|
def NEClick(self):
|
||||||
|
self.toggleButton("NE")
|
||||||
|
return
|
||||||
|
|
||||||
|
def SEClick(self):
|
||||||
|
self.toggleButton("SE")
|
||||||
|
return
|
||||||
|
|
||||||
|
def SWClick(self):
|
||||||
|
self.toggleButton("SW")
|
||||||
|
return
|
||||||
|
|
||||||
|
def NWClick(self):
|
||||||
|
self.toggleButton("NW")
|
||||||
|
return
|
||||||
|
|
||||||
|
def makeLabel(self, frame):
|
||||||
|
|
||||||
|
label = Tkinter.Label(frame, fg="red", font=self._boldFont,
|
||||||
|
text="Max winds will be reduced by\n 20% in selected quadrants")
|
||||||
|
label.grid(row=0)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def makeBottomButtons(self, frame):
|
||||||
|
# Create the Execute/Cancel buttons
|
||||||
|
self._doneButton = Tkinter.Button(frame, text="Done",
|
||||||
|
command=self.doneCommand)
|
||||||
|
self._doneButton.grid(row=3, column=0, padx=20, pady=5, sticky=Tkinter.W)
|
||||||
|
|
||||||
|
self._cancelButton = Tkinter.Button(frame, text="Cancel",
|
||||||
|
command=self.cancelCommand)
|
||||||
|
self._cancelButton.grid(row=3, column=2, padx=20, pady=5, sticky=Tkinter.E)
|
||||||
|
|
||||||
|
frame.grid(columnspan=3, sticky=Tkinter.EW)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def makeQuadButtons(self, frame):
|
||||||
|
# Create the quadrant buttons
|
||||||
|
commandList = [self.NWClick, self.SWClick, self.SEClick, self.NEClick]
|
||||||
|
self._buttonLabels = ["NW", "SW", "SE", "NE"]
|
||||||
|
|
||||||
|
# define the button position in geometric order
|
||||||
|
buttonPos = [(0, 0), (1, 0), (1, 1), (0, 1)]
|
||||||
|
for b in range(len(self._buttonLabels)):
|
||||||
|
label = self._buttonLabels[b]
|
||||||
|
|
||||||
|
self._buttonList[b] = Tkinter.Button(frame, text=label,
|
||||||
|
command=commandList[b],
|
||||||
|
font=self._bigFont, width=3)
|
||||||
|
rowPos, colPos = buttonPos[b]
|
||||||
|
self._buttonList[b].grid(row=rowPos, column=colPos, padx=30, pady=10)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def setUpUI(self):
|
||||||
|
|
||||||
|
self._labelFrame = Tkinter.Frame(self._master)
|
||||||
|
|
||||||
|
self._labelFrame.grid(row=0)
|
||||||
|
|
||||||
|
|
||||||
|
self._buttonFrame = Tkinter.Frame(self._master, borderwidth=3,
|
||||||
|
relief=Tkinter.RIDGE, bd=2, pady=5)
|
||||||
|
self._buttonFrame.grid(row=1, column=0,padx=25,
|
||||||
|
sticky=Tkinter.E+Tkinter.W, pady=5)
|
||||||
|
|
||||||
|
|
||||||
|
self._bottomFrame = Tkinter.Frame(self._master, borderwidth=3,
|
||||||
|
relief=Tkinter.RIDGE, bd=2)
|
||||||
|
self._bottomFrame.grid(row=2, column=0, columnspan=2, padx=25)
|
||||||
|
|
||||||
|
self._master.title("Reduce Max Wind by Quadrant")
|
||||||
|
|
||||||
|
self.makeLabel(self._labelFrame)
|
||||||
|
|
||||||
|
self.makeQuadButtons(self._buttonFrame)
|
||||||
|
|
||||||
|
self.makeBottomButtons(self._bottomFrame)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def doneCommand(self):
|
||||||
|
self._master.quit()
|
||||||
|
|
||||||
|
quadCount = 4
|
||||||
|
reducePct = 0.80
|
||||||
|
|
||||||
|
# Gather up the maxWind info to return to the main tool
|
||||||
|
self._maxWindDict = {}
|
||||||
|
for h in range(len(self._hourList)):
|
||||||
|
windList = []
|
||||||
|
for quad in range(quadCount):
|
||||||
|
|
||||||
|
# Reduce the value if that quadrant was selected
|
||||||
|
if self._buttonState[quad]:
|
||||||
|
windValue = self._maxWind[quad][h] * self._allTimeMaxWind * reducePct
|
||||||
|
else:
|
||||||
|
windValue = self._maxWind[quad][h] * self._allTimeMaxWind
|
||||||
|
|
||||||
|
windList.append(windValue)
|
||||||
|
|
||||||
|
windList.reverse()
|
||||||
|
self._maxWindDict[self._hourList[h]] = windList
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def cancelCommand(self):
|
||||||
|
self._master.destroy()
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def displayGUI(self, windDict):
|
||||||
|
|
||||||
|
self._windDict = windDict
|
||||||
|
self._maxWindDict = None
|
||||||
|
self._quadCount = 4
|
||||||
|
|
||||||
|
hourKeys = self._windDict.keys()
|
||||||
|
hourKeys.sort()
|
||||||
|
self._hourList = hourKeys
|
||||||
|
self._initialMinWind = []
|
||||||
|
self._initialMaxWind = []
|
||||||
|
for hour in hourKeys:
|
||||||
|
minWind, maxWind = windDict[hour]
|
||||||
|
self._initialMinWind.append(minWind)
|
||||||
|
self._initialMaxWind.append(maxWind)
|
||||||
|
|
||||||
|
self._hourCount = len(hourKeys)
|
||||||
|
|
||||||
|
if AWIPS_ENVIRON == "AWIPS1":
|
||||||
|
self._allTimeMaxWind = max(self._initialMaxWind)
|
||||||
|
else: # numpy uses "amax"
|
||||||
|
self._allTimeMaxWind = amax(self._initialMaxWind)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Make the topLevel window - different for A1 and A2
|
||||||
|
if AWIPS_ENVIRON == 'AWIPS1':
|
||||||
|
self._master = Tkinter.Toplevel(self.eaMgr().root())
|
||||||
|
self._master.transient(self.eaMgr().root()) # always draw on top of GFE
|
||||||
|
else:
|
||||||
|
self._tkmaster = Tkinter.Tk()
|
||||||
|
self._master = Tkinter.Toplevel(self._tkmaster)
|
||||||
|
self._tkmaster.withdraw()
|
||||||
|
|
||||||
|
self._buttonLabels = ["NW", "SW", "SE", "NE"]
|
||||||
|
|
||||||
|
self._buttonState = [False, False, False, False]
|
||||||
|
self._buttonList = [None, None, None, None]
|
||||||
|
|
||||||
|
self._boldFont = tkFont.Font(family="Helvetica", size=12, weight="bold")
|
||||||
|
self._bigFont = tkFont.Font(family="Helvetica", size=16)
|
||||||
|
|
||||||
|
self.setUpUI()
|
||||||
|
|
||||||
|
self._maxWind = zeros((self._quadCount, self._hourCount)) * 1.0
|
||||||
|
|
||||||
|
for hour in range(len(hourKeys)):
|
||||||
|
for quad in range(self._quadCount):
|
||||||
|
minWind, maxWind = self._windDict[hourKeys[hour]]
|
||||||
|
self._maxWind[quad][hour] = maxWind / self._allTimeMaxWind
|
||||||
|
|
||||||
|
|
||||||
|
#self.updateDisplay() # Draws everything
|
||||||
|
|
||||||
|
|
||||||
|
self._master.mainloop()
|
||||||
|
|
||||||
|
self._master.withdraw()
|
||||||
|
self._master.destroy()
|
||||||
|
|
||||||
|
return self._maxWindDict
|
Loading…
Add table
Reference in a new issue