def helpClicked(self): dialog = displayobject.AnObject(QtWidgets.QDialog(), self.help, title='Help for getmap (' + fileVersion() + ')', section='map') dialog.exec_()
def do_zipfile(zip_in, temp_dir): # copy multiple files zf = zipfile.ZipFile(zip_in, 'r') ctr = 0 for zi in zf.infolist(): if zi.filename[:-4] == '.exe': if temp_dir is None: temp_dir = tempfile.gettempdir() + '/' zf.extract(zi, temp_dir) newver = credits.fileVersion(program=temp_dir + zi.filename) if newver != '?': curver = credits.fileVersion(program=zi.filename) if newver > curver or curver == '?': if not self.debug: if os.path.exists(zi.filename + '~'): os.remove(zi.filename + '~') if cur_verson != '?': os.rename(zi.filename, zi_filename + '~') os.rename(temp_dir + zi.filename, zi.filename) ctr += 1 else: newtime = datetime.fromtimestamp( time.mktime(zi.date_time + (0, 0, -1))) try: curtime = datetime.fromtimestamp( int(os.path.getmtime(zi.filename))) except: curtime = 0 if curtime == 0 or newtime > curtime: # print(zi.filename, newtime, curtime) if not self.debug: if os.path.exists(zi.filename + '~'): os.remove(zi.filename + '~') if curtime != 0: os.rename(zi.filename, zi.filename + '~') zf.extract(zi) date_time = time.mktime(zi.date_time + (0, 0, -1)) os.utime(zi.filename, (date_time, date_time)) ctr += 1 if ctr == 0: msg = 'Current is newer' else: msg = f'Updated {ctr} files' return msg
def __init__(self, parent=None): super(GetMany, self).__init__(parent) layout = QtGui.QVBoxLayout(self) layout.addWidget(QtGui.QLabel('Enter Coordinates')) self.text = QtGui.QPlainTextEdit() self.text.setPlainText('Enter list of coordinates separated by spaces or commas. west lat.,' \ + ' north lon., east lat., south lon. ...') layout.addWidget(self.text) # OK and Cancel buttons buttons = QtGui.QDialogButtonBox( QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel, QtCore.Qt.Horizontal, self) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) layout.addWidget(buttons) self.setWindowTitle('SIREN - worldwindow (' + fileVersion() + ") - List of Coordinates") self.setWindowIcon(QtGui.QIcon('sen_icon32.ico'))
def doitClicked(self): host = 'https://sourceforge.net/projects/sensiren/files/' default_suffix = sys.argv[0][sys.argv[0].rfind('.'):] for p in range(len(self.newbox)): if self.newbox[p].checkState() == QtCore.Qt.Checked: self.newbox[p].setCheckState(QtCore.Qt.Unchecked) self.newbox[p].setFlags(self.newbox[p].flags() ^ QtCore.Qt.ItemIsUserCheckable) s = self.newprog[p].rfind('.') if s < len(self.newprog[p]) - 4 and self.newprog[p][s:] != '.html': suffix = default_suffix else: suffix = '' command = 'wget -O %snew%s %s%s%s' % (self.newprog[p], suffix, host, self.newprog[p], suffix) command = command.split(' ') if self.debug: response = '200 OK' else: pid = subprocess.Popen(command, stderr=subprocess.PIPE) response = get_response(pid.communicate()[1]) if response != '200 OK': errmsg = 'Error ' + response self.table.setItem(p, 3, QtGui.QTableWidgetItem(errmsg)) continue if suffix == '.exe' or suffix == '.py': if os.path.exists(self.newprog[p] + 'new' + suffix): version = fileVersion(program=self.newprog[p] + 'new') if version != '?': if version < str(self.table.item(p, 3).text()): if not self.debug: os.rename(self.newprog[p] + 'new' + suffix, self.newprog[p] + '.' + version + suffix) self.table.setItem(p, 3, QtGui.QTableWidgetItem('Current is newer')) continue if not self.debug: if os.path.exists(self.newprog[p] + suffix + '~'): os.remove(self.newprog[p] + suffix + '~') os.rename(self.newprog[p] + suffix, self.newprog[p] + suffix +'~') os.rename(self.newprog[p] + 'new' + suffix, self.newprog[p] + suffix) self.table.setItem(p, 3, QtGui.QTableWidgetItem('Updated')) self.table.resizeColumnsToContents() self.table.setColumnWidth(0, 29)
def get_new_versions(self, versions_file, local=''): versions = open(versions_file) programs = csv.DictReader(versions) for program in programs: version = credits.fileVersion( program=program['Program'].replace('.zip', '.py')) if version != '?' and version != program['Version']: cur = version.split('.') new = program['Version'].split('.') if new[0] == cur[0]: # must be same major release curt = '' newt = '' for b in range(1, len(cur)): curt += cur[b].rjust(4, '0') newt += new[b].rjust(4, '0') if newt > curt or self.debug: self.new_versions.append([ program['Program'], program['Version'] + local, version ]) elif new[0] > cur[0]: self.new_versions.append( [program['Program'], 'New Release' + local, version]) versions.close()
def writetile(self, x, y, zoom): url = self.url if len(self.subs) > 0: self.sub_ctr += 1 if self.sub_ctr >= len(self.subs): self.sub_ctr = 0 url = url.replace('[]', self.subs[self.sub_ctr]) file_name = str(x) + '_' + str(y) + '.png' url_tail = self.url_tail.replace('/zoom', '/' + str(zoom)) url_tail = url_tail.replace('/x', '/' + str(x)) url_tail = url_tail.replace('/y', '/' + str(y)) if 1 == 2: # Google? url_tail = self.url_tail.replace('z=zoom', 'z=' + str(zoom)) url_tail = url_tail.replace('x=x', 'x=' + str(x)) url_tail = url_tail.replace('y=y', 'y=' + str(y)) if self.batch: print(url + url_tail) user_agent = { 'User-agent': 'getmap ' + fileVersion() + ' contact [email protected]' } http = PoolManager(headers=user_agent) if self.batch: print('Retrieving ' + url_tail) response = http.request('GET', url + url_tail) if response.status == 200 and response.reason == 'OK': if self.batch: print(url_tail + ' retrieved') f = open(self.tmp_location + file_name, 'wb') f.write(response.data) f.close() message = 'OK' else: message = url_tail + ' failed\n' + str( response.status) + ' ' + response.reason return message, file_name
def helpClicked(self): dialog = displayobject.AnObject(QtWidgets.QDialog(), self.help, title='Help for makerainfall2 (' + fileVersion() + ')', section='merrar') dialog.exec_()
def initUI(self): self.yearSpin = QtWidgets.QSpinBox() now = datetime.datetime.now() self.yearSpin.setRange(1979, now.year) self.yearSpin.setValue(now.year - 1) self.zoneCombo = QtWidgets.QComboBox() self.zoneCombo.addItem('Auto') for i in range(-12, 13): self.zoneCombo.addItem(str(i)) self.zoneCombo.currentIndexChanged[str].connect(self.zoneChanged) self.zone_lon = QtWidgets.QLabel(('Time zone calculated from MERRA data')) self.grid = QtWidgets.QGridLayout() self.grid.addWidget(QtWidgets.QLabel('Year:'), 0, 0) self.grid.addWidget(self.yearSpin, 0, 1) self.grid.addWidget(QtWidgets.QLabel('Time Zone:'), 1, 0) self.grid.addWidget(self.zoneCombo, 1, 1) self.grid.addWidget(self.zone_lon, 1, 2, 1, 3) self.grid.addWidget(QtWidgets.QLabel('Rainfall File Format:'), 2, 0) self.fmatcombo = QtWidgets.QComboBox(self) self.fmats = ['any', 'flx', 'lnd', 'mld'] for i in range(len(self.fmats)): self.fmatcombo.addItem(self.fmats[i]) self.fmatcombo.setCurrentIndex(0) self.grid.addWidget(self.fmatcombo, 2, 1) self.grid.addWidget(QtWidgets.QLabel('Coordinates:'), 3, 0) self.coords = QtWidgets.QPlainTextEdit() self.grid.addWidget(self.coords, 3, 1, 1, 3) self.grid.addWidget(QtWidgets.QLabel('Copy folder down:'), 4, 0) self.checkbox = QtWidgets.QCheckBox() self.checkbox.setCheckState(QtCore.Qt.Checked) self.grid.addWidget(self.checkbox, 4, 1) self.grid.addWidget(QtWidgets.QLabel('If checked will copy rainfall folder changes down to others'), 4, 3) cur_dir = os.getcwd() self.dir_labels = ['Rainfall Source', 'Target'] self.dirs = [None, None, None] for i in range(2): self.grid.addWidget(QtWidgets.QLabel(self.dir_labels[i] + ' Folder:'), 5 + i, 0) self.dirs[i] = ClickableQLabel() self.dirs[i].setText(cur_dir) self.dirs[i].setStyleSheet("background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;") self.dirs[i].clicked.connect(self.dirChanged) self.grid.addWidget(self.dirs[i], 5 + i, 1, 1, 3) quit = QtWidgets.QPushButton('Quit', self) self.grid.addWidget(quit, 8, 0) quit.clicked.connect(self.quitClicked) QtWidgets.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) dorain = QtWidgets.QPushButton('Produce Rainfall Files', self) wdth = dorain.fontMetrics().boundingRect(dorain.text()).width() + 9 self.grid.addWidget(dorain, 8, 1) dorain.clicked.connect(self.dorainClicked) help = QtWidgets.QPushButton('Help', self) help.setMaximumWidth(wdth) self.grid.addWidget(help, 8, 2) help.clicked.connect(self.helpClicked) QtWidgets.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) info = QtWidgets.QPushButton('File Info', self) info.setMaximumWidth(wdth) self.grid.addWidget(info, 8, 3) info.clicked.connect(self.infoClicked) # self.grid.setColumnStretch(4, 2) frame = QtWidgets.QFrame() frame.setLayout(self.grid) self.scroll = QtWidgets.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(self.scroll) self.setWindowTitle('SIREN - makerainfall2 (' + fileVersion() + ') - Make rainfall files from MERRA data') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.center() self.resize(int(self.sizeHint().width()* 1.07), int(self.sizeHint().height() * 1.07)) self.show()
def __init__(self, ini_file='getfiles.ini', parent=None): QtWidgets.QDialog.__init__(self, parent) self.setWindowTitle('SIREN Update (' + credits.fileVersion() + ') - Check for new versions') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) config = configparser.RawConfigParser() config_file = ini_file config.read(config_file) self.debug = False try: debug = config.get('sirenupd', 'debug') if debug.lower() in ['true', 'yes', 'on']: self.debug = True except: pass self.wget_cmd = 'wget --no-check-certificate -O' try: self.wget_cmd = config.get('sirenupd', 'wget_cmd') except: pass try: self.local = config.get('sirenupd', 'local') self.local = self.local.replace('$USER$', getUser()) except: self.local = '' self.host = 'https://sourceforge.net/projects/sensiren/files/' try: self.host = config.get('sirenupd', 'url') except: pass self.new_versions = [] row = 0 newgrid = QtWidgets.QGridLayout() versions_file = 'siren_versions.csv' if self.local != '': # local location? versions_file = self.local + versions_file if os.path.exists(versions_file): self.get_new_versions(versions_file, local=' (local)') # now remote versions versions_file = 'siren_versions.csv' command = '%s %s %s%s' % (self.wget_cmd, versions_file, self.host, versions_file) command = command.split() if self.debug: response = '200 OK' else: try: pid = subprocess.Popen(command, stderr=subprocess.PIPE) except: command[0] = command[0] + '.exe' pid = subprocess.Popen(command, stderr=subprocess.PIPE) response = get_response(pid.communicate()[1]) if response != '200 OK': newgrid.addWidget(QtWidgets.QLabel('Error encountered accessing siren_versions.csv\n\n' + \ response), 0, 0, 1, 4) row = 1 elif os.path.exists(versions_file): self.get_new_versions(versions_file) else: newgrid.addWidget(QtWidgets.QLabel('No versions file available.'), 0, 0, 1, 4) row = 1 if len(self.new_versions) > 0: self.new_versions.sort() if self.debug: newgrid.addWidget(QtWidgets.QLabel('Debug mode.'), row, 0, 1, 4) else: newgrid.addWidget(QtWidgets.QLabel('New versions are available for the following programs.' + \ '\nChoose those you wish to update.' + \ '\nUpdates can take a while so please be patient.' + \ '\nContact [email protected] with any issues.'), row, 0, 1, 4) self.table = QtWidgets.QTableWidget() self.table.setRowCount(len(self.new_versions)) self.table.setColumnCount(4) hdr_labels = ['', 'Program', 'New Ver.', 'Current / Status'] self.table.setHorizontalHeaderLabels(hdr_labels) self.table.verticalHeader().setVisible(False) self.newbox = [] self.newprog = [] rw = -1 for new_version in self.new_versions: rw += 1 self.newbox.append(QtWidgets.QTableWidgetItem()) self.newprog.append(new_version[0]) if new_version[1][:11] != 'New Release': self.newbox[-1].setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled) self.newbox[-1].setCheckState(QtCore.Qt.Unchecked) self.table.setItem(rw, 0, self.newbox[-1]) self.table.setItem(rw, 1, QtWidgets.QTableWidgetItem(new_version[0])) self.table.setItem(rw, 2, QtWidgets.QTableWidgetItem(new_version[1])) self.table.setItem(rw, 3, QtWidgets.QTableWidgetItem(new_version[2])) self.table.resizeColumnsToContents() newgrid.addWidget(self.table, 1, 0, 1, 4) doit = QtWidgets.QPushButton('Update') doit.clicked.connect(self.doitClicked) newgrid.addWidget(doit, 2, 1) row = 2 else: newgrid.addWidget(QtWidgets.QLabel('No new versions available.'), 0, 0, 1, 4) row = 1 quit = QtWidgets.QPushButton('Quit') quit.clicked.connect(self.quit) QtWidgets.QShortcut(QtGui.QKeySequence('q'), self, self.quit) newgrid.addWidget(quit, row, 0) self.setLayout(newgrid) self.resize(500, int(self.sizeHint().height()))
def __init__(self, help='help.html', ini_file='getfiles.ini', parent=None): super(getMERRA2, self).__init__(parent) self.help = help self.ini_file = ini_file self.get_config() self.ignore = False self.worldwindow = None ok = False if sys.platform == 'win32' or sys.platform == 'cygwin': try: netrc = '~\\.netrc'.replace('~', os.environ['HOME']) except: netrc = '' else: netrc = '~/.netrc'.replace('~', os.path.expanduser('~')) if netrc != '' and os.path.exists(netrc): ok = True if not ok: netrcmsg = '.netrc file missing.\n(' + netrc + ')\nDo you want create one?' if sys.platform == 'win32' or sys.platform == 'cygwin': netrcmsg += '\nYou will need to reinvoke getmerra2.' reply = QtWidgets.QMessageBox.question(self, 'SIREN - getmerra2 - No .netrc file', netrcmsg, QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: self.create_netrc() self.northSpin = QtWidgets.QDoubleSpinBox() self.northSpin.setDecimals(3) self.northSpin.setSingleStep(.5) self.northSpin.setRange(-85.06, 85.06) self.northSpin.setObjectName('north') self.westSpin = QtWidgets.QDoubleSpinBox() self.westSpin.setDecimals(3) self.westSpin.setSingleStep(.5) self.westSpin.setRange(-180, 180) self.westSpin.setObjectName('west') self.southSpin = QtWidgets.QDoubleSpinBox() self.southSpin.setDecimals(3) self.southSpin.setSingleStep(.5) self.southSpin.setRange(-85.06, 85.06) self.southSpin.setObjectName('south') self.eastSpin = QtWidgets.QDoubleSpinBox() self.eastSpin.setDecimals(3) self.eastSpin.setSingleStep(.5) self.eastSpin.setRange(-180, 180) self.eastSpin.setObjectName('east') self.latSpin = QtWidgets.QDoubleSpinBox() self.latSpin.setDecimals(3) self.latSpin.setSingleStep(.5) self.latSpin.setRange(-84.56, 84.56) self.latSpin.setObjectName('lat') self.lonSpin = QtWidgets.QDoubleSpinBox() self.lonSpin.setDecimals(3) self.lonSpin.setSingleStep(.5) self.lonSpin.setRange(-179.687, 179.687) self.lonSpin.setObjectName('lon') self.latwSpin = QtWidgets.QDoubleSpinBox() self.latwSpin.setDecimals(3) self.latwSpin.setSingleStep(.5) self.latwSpin.setRange(0, 170.12) self.latwSpin.setObjectName('latw') self.lonwSpin = QtWidgets.QDoubleSpinBox() self.lonwSpin.setDecimals(3) self.lonwSpin.setSingleStep(.5) self.lonwSpin.setRange(0, 360) self.lonwSpin.setObjectName('lonw') if len(sys.argv) > 1: his_config_file = sys.argv[1] his_config = configparser.RawConfigParser() his_config.read(his_config_file) try: mapp = his_config.get('Map', 'map_choice') except: mapp = '' try: upper_left = his_config.get('Map', 'upper_left' + mapp).split(',') self.northSpin.setValue(float(upper_left[0].strip())) self.westSpin.setValue(float(upper_left[1].strip())) lower_right = his_config.get('Map', 'lower_right' + mapp).split(',') self.southSpin.setValue(float(lower_right[0].strip())) self.eastSpin.setValue(float(lower_right[1].strip())) except: try: lower_left = his_config.get('Map', 'lower_left' + mapp).split(',') upper_right = his_config.get('Map', 'upper_right' + mapp).split(',') self.northSpin.setValue(float(upper_right[0].strip())) self.westSpin.setValue(float(lower_left[1].strip())) self.southSpin.setValue(float(lower_left[0].strip())) self.eastSpin.setValue(float(upper_right[1].strip())) except: pass self.northSpin.valueChanged.connect(self.showArea) self.westSpin.valueChanged.connect(self.showArea) self.southSpin.valueChanged.connect(self.showArea) self.eastSpin.valueChanged.connect(self.showArea) self.latSpin.valueChanged.connect(self.showArea) self.lonSpin.valueChanged.connect(self.showArea) self.latwSpin.valueChanged.connect(self.showArea) self.lonwSpin.valueChanged.connect(self.showArea) self.grid = QtWidgets.QGridLayout() self.grid.addWidget(QtWidgets.QLabel('Area of Interest:'), 0, 0) area = QtWidgets.QPushButton('Choose area via Map', self) self.grid.addWidget(area, 0, 1, 1, 2) area.clicked.connect(self.areaClicked) self.grid.addWidget(QtWidgets.QLabel('Upper left:'), 1, 0, 1, 1) self.grid.itemAt(self.grid.count() - 1).setAlignment(QtCore.Qt.AlignRight) self.grid.addWidget(QtWidgets.QLabel('North'), 2, 0) self.grid.itemAt(self.grid.count() - 1).setAlignment(QtCore.Qt.AlignRight) self.grid.addWidget(self.northSpin, 2, 1) self.grid.addWidget(QtWidgets.QLabel('West'), 3, 0) self.grid.itemAt(self.grid.count() - 1).setAlignment(QtCore.Qt.AlignRight) self.grid.addWidget(self.westSpin, 3, 1) self.grid.addWidget(QtWidgets.QLabel('Lower right:'), 1, 2) self.grid.itemAt(self.grid.count() - 1).setAlignment(QtCore.Qt.AlignRight) self.grid.addWidget(QtWidgets.QLabel('South'), 2, 2) self.grid.itemAt(self.grid.count() - 1).setAlignment(QtCore.Qt.AlignRight) self.grid.addWidget(self.southSpin, 2, 3) self.grid.addWidget(QtWidgets.QLabel('East'), 3, 2) self.grid.itemAt(self.grid.count() - 1).setAlignment(QtCore.Qt.AlignRight) self.grid.addWidget(self.eastSpin, 3, 3) self.grid.addWidget(QtWidgets.QLabel('Centre:'), 1, 4) self.grid.itemAt(self.grid.count() - 1).setAlignment(QtCore.Qt.AlignRight) self.grid.addWidget(QtWidgets.QLabel('Lat.'), 2, 4) self.grid.itemAt(self.grid.count() - 1).setAlignment(QtCore.Qt.AlignRight) self.grid.addWidget(self.latSpin, 2, 5) self.grid.addWidget(QtWidgets.QLabel('Lon.'), 3, 4) self.grid.itemAt(self.grid.count() - 1).setAlignment(QtCore.Qt.AlignRight) self.grid.addWidget(self.lonSpin, 3, 5) self.grid.addWidget(QtWidgets.QLabel('Degrees'), 1, 6) self.grid.addWidget(self.latwSpin, 2, 6) self.grid.addWidget(self.lonwSpin, 3, 6) self.grid.addWidget(QtWidgets.QLabel('Approx. area:'), 4, 0) self.approx_area = QtWidgets.QLabel('') self.grid.addWidget(self.approx_area, 4, 1) self.grid.addWidget(QtWidgets.QLabel('MERRA-2 dimensions:'), 4, 2) self.merra_cells = QtWidgets.QLabel('') self.grid.addWidget(self.merra_cells, 4, 3, 1, 2) self.grid.addWidget(QtWidgets.QLabel('Start date:'), 5, 0) self.strt_date = QtWidgets.QDateEdit(self) self.strt_date.setDate(QtCore.QDate.currentDate().addDays(-self.wait_days)) self.strt_date.setCalendarPopup(True) self.strt_date.setMinimumDate(QtCore.QDate(1980, 1, 1)) self.strt_date.setMaximumDate(QtCore.QDate.currentDate().addDays(-self.wait_days)) self.grid.addWidget(self.strt_date, 5, 1) self.grid.addWidget(QtWidgets.QLabel('End date:'), 6, 0) self.end_date = QtWidgets.QDateEdit(self) self.end_date.setDate(QtCore.QDate.currentDate().addDays(-self.wait_days)) self.end_date.setCalendarPopup(True) self.end_date.setMinimumDate(QtCore.QDate(1980,1,1)) self.end_date.setMaximumDate(QtCore.QDate.currentDate()) self.grid.addWidget(self.end_date, 6, 1) self.grid.addWidget(QtWidgets.QLabel('Copy folder down:'), 7, 0) self.checkbox = QtWidgets.QCheckBox() self.checkbox.setCheckState(QtCore.Qt.Checked) self.grid.addWidget(self.checkbox, 7, 1) self.grid.addWidget(QtWidgets.QLabel('If checked will copy solar folder changes down'), 7, 2, 1, 3) cur_dir = os.getcwd() self.dir_labels = ['Solar', 'Wind'] datasets = [] self.collections = [] for typ in self.dir_labels: datasets.append(self.config.get('getmerra2', typ.lower() + '_collection') + ' (Parameters: ' + \ self.config.get('getmerra2', typ.lower() + '_variables') + ')') self.collections.append(self.config.get('getmerra2', typ.lower() + '_collection')) self.dirs = [None, None, None] for i in range(2): self.grid.addWidget(QtWidgets.QLabel(self.dir_labels[i] + ' files:'), 8 + i * 2, 0) self.grid.addWidget(QtWidgets.QLabel(datasets[i]), 8 + i * 2, 1, 1, 5) self.grid.addWidget(QtWidgets.QLabel(' Target Folder:'), 9 + i * 2, 0) self.dirs[i] = ClickableQLabel() try: self.dirs[i].setText(self.config.get('Files', self.dir_labels[i].lower() + '_files').replace('$USER$', getUser())) except: self.dirs[i].setText(cur_dir) self.dirs[i].setStyleSheet("background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;") self.dirs[i].clicked.connect(self.dirChanged) self.grid.addWidget(self.dirs[i], 9 + i * 2, 1, 1, 8) self.log = QtWidgets.QLabel('') msg_palette = QtGui.QPalette() msg_palette.setColor(QtGui.QPalette.Foreground, QtCore.Qt.red) self.log.setPalette(msg_palette) self.grid.addWidget(self.log, 12, 1, 2, 4) sw = self.northSpin.minimumSizeHint().width() dw = self.strt_date.minimumSizeHint().width() if sw > dw: # fix for wide QDoubleSpinBox width in Windows self.northSpin.setMinimumWidth(self.strt_date.minimumSizeHint().width()) self.westSpin.setMinimumWidth(self.strt_date.minimumSizeHint().width()) self.southSpin.setMinimumWidth(self.strt_date.minimumSizeHint().width()) self.eastSpin.setMinimumWidth(self.strt_date.minimumSizeHint().width()) self.latSpin.setMinimumWidth(self.strt_date.minimumSizeHint().width()) self.lonSpin.setMinimumWidth(self.strt_date.minimumSizeHint().width()) self.latwSpin.setMinimumWidth(self.strt_date.minimumSizeHint().width()) self.lonwSpin.setMinimumWidth(self.strt_date.minimumSizeHint().width()) buttongrid = QtWidgets.QGridLayout() quit = QtWidgets.QPushButton('Done', self) buttongrid.addWidget(quit, 0, 0) quit.clicked.connect(self.quitClicked) QtWidgets.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) QtWidgets.QShortcut(QtGui.QKeySequence('x'), self, self.quitClicked) solar = QtWidgets.QPushButton('Get Solar', self) buttongrid.addWidget(solar, 0, 1) solar.clicked.connect(self.getClicked) wind = QtWidgets.QPushButton('Get Wind', self) buttongrid.addWidget(wind, 0, 2) wind.clicked.connect(self.getClicked) check = QtWidgets.QPushButton('Check Solar', self) buttongrid.addWidget(check, 0, 3) check.clicked.connect(self.checkClicked) check = QtWidgets.QPushButton('Check Wind', self) buttongrid.addWidget(check, 0, 4) check.clicked.connect(self.checkClicked) help = QtWidgets.QPushButton('Help', self) buttongrid.addWidget(help, 0, 5) help.clicked.connect(self.helpClicked) QtWidgets.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) frame = QtWidgets.QFrame() frame.setLayout(self.grid) self.scroll = QtWidgets.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(self.scroll) frame2 = QtWidgets.QFrame() frame2.setLayout(buttongrid) self.layout.addWidget(frame2) self.setWindowTitle('SIREN - getmerra2 (' + fileVersion() + ') - Get MERRA-2 data') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.resize(int(self.sizeHint().width()* 1.5), int(self.sizeHint().height() * 1.07)) self.updated = False self.show()
def initUI(self): config = configparser.RawConfigParser() if len(sys.argv) > 1: config_file = sys.argv[1] else: config_file = getModelFile('SIREN.ini') config.read(config_file) try: self.base_year = config.get('Base', 'year') except: self.base_year = '2012' self.parents = [] try: self.parents = getParents(config.items('Parents')) except: pass try: self.solarfiles = config.get('Files', 'solar_files') for key, value in self.parents: self.solarfiles = self.solarfiles.replace(key, value) self.solarfiles = self.solarfiles.replace('$USER$', getUser()) self.solarfiles = self.solarfiles.replace('$YEAR$', self.base_year) except: self.solarfiles = '' try: self.solarindex = config.get('Files', 'solar_index') for key, value in self.parents: self.solarindex = self.solarindex.replace(key, value) self.solarindex = self.solarindex.replace('$USER$', getUser()) self.solarindex = self.solarindex.replace('$YEAR$', self.base_year) except: self.solarindex = '' if self.solarindex == '': self.solarindex = self.solarfiles + '/solar_index.xls' try: self.windfiles = config.get('Files', 'wind_files') for key, value in self.parents: self.windfiles = self.windfiles.replace(key, value) self.windfiles = self.windfiles.replace('$USER$', getUser()) self.windfiles = self.windfiles.replace('$YEAR$', self.base_year) except: self.windfiles = '' try: self.windindex = config.get('Files', 'wind_index') for key, value in self.parents: self.windindex = self.windindex.replace(key, value) self.windindex = self.windindex.replace('$USER$', getUser()) self.windindex = self.windindex.replace('$YEAR$', self.base_year) except: self.windindex = '' if self.windindex == '': self.windindex = self.windfiles + '/wind_index.xls' self.grid = QtWidgets.QGridLayout() self.grid.addWidget(QtWidgets.QLabel('Solar Folder:'), 1, 0) self.ssource = ClickableQLabel() self.ssource.setText(self.solarfiles) self.ssource.setStyleSheet("background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;") self.ssource.clicked.connect(self.sdirChanged) self.grid.addWidget(self.ssource, 1, 1, 1, 4) self.grid.addWidget(QtWidgets.QLabel('Solar Index:'), 2, 0) self.starget = ClickableQLabel() self.starget.setText(self.solarindex) self.starget.setStyleSheet("background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;") self.starget.clicked.connect(self.stgtChanged) self.grid.addWidget(self.starget, 2, 1, 1, 4) self.grid.addWidget(QtWidgets.QLabel('Wind Folder:'), 3, 0) self.wsource = ClickableQLabel() self.wsource.setText(self.windfiles) self.wsource.setStyleSheet("background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;") self.wsource.clicked.connect(self.wdirChanged) self.grid.addWidget(self.wsource, 3, 1, 1, 4) self.grid.addWidget(QtWidgets.QLabel('Wind Index:'), 4, 0) self.wtarget = ClickableQLabel() self.wtarget.setText(self.windindex) self.wtarget.setStyleSheet("background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;") self.wtarget.clicked.connect(self.wtgtChanged) self.grid.addWidget(self.wtarget, 4, 1, 1, 4) self.grid.addWidget(QtWidgets.QLabel('Properties:'), 5, 0) self.properties = QtWidgets.QLineEdit() self.properties.setReadOnly(True) self.grid.addWidget(self.properties, 5, 1, 1, 4) self.log = QtWidgets.QLabel(' ') self.grid.addWidget(self.log, 6, 1, 1, 4) quit = QtWidgets.QPushButton('Quit', self) self.grid.addWidget(quit, 7, 0) quit.clicked.connect(self.quitClicked) QtWidgets.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) dosolar = QtWidgets.QPushButton('Produce Solar Index', self) wdth = dosolar.fontMetrics().boundingRect(dosolar.text()).width() + 9 dosolar.setMaximumWidth(wdth) self.grid.addWidget(dosolar, 7, 1) dosolar.clicked.connect(self.dosolarClicked) dowind = QtWidgets.QPushButton('Produce Wind Index', self) dowind.setMaximumWidth(wdth) self.grid.addWidget(dowind, 7, 2) dowind.clicked.connect(self.dowindClicked) help = QtWidgets.QPushButton('Help', self) help.setMaximumWidth(wdth) self.grid.addWidget(help, 7, 3) help.clicked.connect(self.helpClicked) QtWidgets.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) self.grid.setColumnStretch(3, 5) frame = QtWidgets.QFrame() frame.setLayout(self.grid) self.scroll = QtWidgets.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(self.scroll) self.setWindowTitle('SIREN - indexweather (' + fileVersion() + ') - Make resource grid file') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.center() self.resize(int(self.sizeHint().width()* 1.07), int(self.sizeHint().height() * 1.07)) self.show()
def initUI(self): config = ConfigParser.RawConfigParser() if len(sys.argv) > 1: config_file = sys.argv[1] else: config_file = 'SIREN.ini' config.read(config_file) try: self.base_year = config.get('Base', 'year') except: self.base_year = '2012' self.yrndx = -1 try: self.years = [] years = config.get('Base', 'years') bits = years.split(',') for i in range(len(bits)): rngs = bits[i].split('-') if len(rngs) > 1: for j in range(int(rngs[0].strip()), int(rngs[1].strip()) + 1): if str(j) == self.base_year: self.yrndx = len(self.years) self.years.append(str(j)) else: if rngs[0].strip() == self.base_year: self.yrndx = len(self.years) self.years.append(rngs[0].strip()) except: self.years = [self.base_year] self.yrndx = 0 if self.yrndx < 0: self.yrndx = len(self.years) self.years.append(self.base_year) self.parents = [] try: self.parents = getParents(config.items('Parents')) except: pass self.do_rain = False try: self.rainfiles = config.get('Files', 'rain_files') for key, value in self.parents: self.rainfiles = self.rainfiles.replace(key, value) self.rainfiles = self.rainfiles.replace('$USER$', getUser()) self.rainfiles = self.rainfiles.replace('$YEAR$', self.base_year) self.do_rain = True except: self.rainfiles = '' try: variable = config.get('View', 'resource_rainfall') if variable.lower() in ['true', 'yes', 'on']: self.do_rain = True except: pass try: self.solarfiles = config.get('Files', 'solar_files') for key, value in self.parents: self.solarfiles = self.solarfiles.replace(key, value) self.solarfiles = self.solarfiles.replace('$USER$', getUser()) self.solarfiles = self.solarfiles.replace('$YEAR$', self.base_year) except: self.solarfiles = '' try: self.windfiles = config.get('Files', 'wind_files') for key, value in self.parents: self.windfiles = self.windfiles.replace(key, value) self.windfiles = self.windfiles.replace('$USER$', getUser()) self.windfiles = self.windfiles.replace('$YEAR$', self.base_year) except: self.windfiles = '' try: self.resource_grid = config.get('Files', 'resource_grid') for key, value in self.parents: self.resource_grid = self.resource_grid.replace(key, value) self.resource_grid = self.resource_grid.replace('$USER$', getUser()) self.resource_grid = self.resource_grid.replace('$YEAR$', self.base_year) except: self.resource_grid = '' if self.resource_grid == '': self.resource_grid = self.solarfiles + '/resource_$YEAR$.xls' self.grid = QtGui.QGridLayout() row = 0 self.grid.addWidget(QtGui.QLabel('Year:'), row, 0) self.yearCombo = QtGui.QComboBox() for i in range(len(self.years)): self.yearCombo.addItem(self.years[i]) self.yearCombo.setCurrentIndex(self.yrndx) self.yearCombo.currentIndexChanged[str].connect(self.yearChanged) self.grid.addWidget(self.yearCombo, row, 1) row += 1 self.grid.addWidget(QtGui.QLabel('Update year:'), row, 0) self.checkbox = QtGui.QCheckBox() self.checkbox.setCheckState(QtCore.Qt.Checked) self.grid.addWidget(self.checkbox, row, 1) self.grid.addWidget(QtGui.QLabel('Update year in solar, wind and resource fields'), row, 2, 1, 2) row += 1 self.grid.addWidget(QtGui.QLabel('Level of Detail:'), row, 0) self.detailCombo = QtGui.QComboBox() details = ['Daily By Month', 'Hourly by Month', 'Hourly by Day'] for detail in details: self.detailCombo.addItem(detail) self.detailCombo.currentIndexChanged[str].connect(self.detailChanged) self.grid.addWidget(self.detailCombo, row, 1) self.msg = QtGui.QLabel('') self.grid.addWidget(self.msg, row, 2, 1, 2) row += 1 self.grid.addWidget(QtGui.QLabel('Non-zero minimum:'), row, 0) self.nonzero = QtGui.QCheckBox() self.nonzero.setCheckState(QtCore.Qt.Unchecked) self.grid.addWidget(self.nonzero, row, 1) self.grid.addWidget(QtGui.QLabel('Set non-zero minimum for all but temperature'), row, 2, 1, 2) row += 1 self.grid.addWidget(QtGui.QLabel('Solar Folder:'), row, 0) self.source = ClickableQLabel() self.source.setText(self.solarfiles) self.source.setFrameStyle(6) self.connect(self.source, QtCore.SIGNAL('clicked()'), self.dirChanged) self.grid.addWidget(self.source, row, 1, 1, 3) row += 1 self.grid.addWidget(QtGui.QLabel('Wind Folder:'), row, 0) self.wsource = ClickableQLabel() self.wsource.setText(self.windfiles) self.wsource.setFrameStyle(6) self.connect(self.wsource, QtCore.SIGNAL('clicked()'), self.wdirChanged) self.grid.addWidget(self.wsource, row, 1, 1, 3) if self.do_rain: row += 1 self.grid.addWidget(QtGui.QLabel('Rain Folder:'), row, 0) self.rsource = ClickableQLabel() self.rsource.setText(self.rainfiles) self.rsource.setFrameStyle(6) self.connect(self.rsource, QtCore.SIGNAL('clicked()'), self.rdirChanged) self.grid.addWidget(self.rsource, row, 1, 1, 3) row += 1 self.grid.addWidget(QtGui.QLabel('Resource File:'), row, 0) self.target = ClickableQLabel() self.target.setText(self.resource_grid) self.target.setFrameStyle(6) self.connect(self.target, QtCore.SIGNAL('clicked()'), self.tgtChanged) self.grid.addWidget(self.target, row, 1, 1, 3) row += 1 self.grid.addWidget(QtGui.QLabel('Properties:'), row, 0) self.properties = QtGui.QPlainTextEdit() self.properties.setMaximumHeight(self.yearCombo.sizeHint().height()) self.properties.setReadOnly(True) self.grid.addWidget(self.properties, row, 1, 1, 3) self.log = QtGui.QLabel(' ') row += 1 self.grid.addWidget(self.log, row, 1, 1, 3) quit = QtGui.QPushButton('Quit', self) row += 1 self.grid.addWidget(quit, row, 0) quit.clicked.connect(self.quitClicked) QtGui.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) dofile = QtGui.QPushButton('Produce Resource File', self) self.grid.addWidget(dofile, row, 1) dofile.clicked.connect(self.dofileClicked) help = QtGui.QPushButton('Help', self) # help.setMaximumWidth(wdth) self.grid.addWidget(help, row, 2) help.clicked.connect(self.helpClicked) QtGui.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) self.grid.setColumnStretch(3, 5) frame = QtGui.QFrame() frame.setLayout(self.grid) self.scroll = QtGui.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtGui.QVBoxLayout(self) self.layout.addWidget(self.scroll) self.setWindowTitle('SIREN - makegrid (' + fileVersion() + ') - Make resource grid file') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.center() self.resize(int(self.sizeHint().width()* 1.07), int(self.sizeHint().height() * 1.07)) self.show()
def helpClicked(self): dialog = displayobject.AnObject(QtGui.QDialog(), self.help, title='Help for makerainfall2 (' + fileVersion() + ')', section='merrar') dialog.exec_()
def initUI(self): self.yearSpin = QtGui.QSpinBox() now = datetime.datetime.now() self.yearSpin.setRange(1979, now.year) self.yearSpin.setValue(now.year - 1) self.zoneCombo = QtGui.QComboBox() self.zoneCombo.addItem('Auto') for i in range(-12, 13): self.zoneCombo.addItem(str(i)) self.zoneCombo.currentIndexChanged[str].connect(self.zoneChanged) self.zone_lon = QtGui.QLabel(('Time zone calculated from MERRA data')) self.grid = QtGui.QGridLayout() self.grid.addWidget(QtGui.QLabel('Year:'), 0, 0) self.grid.addWidget(self.yearSpin, 0, 1) self.grid.addWidget(QtGui.QLabel('Time Zone:'), 1, 0) self.grid.addWidget(self.zoneCombo, 1, 1) self.grid.addWidget(self.zone_lon, 1, 2, 1, 3) self.grid.addWidget(QtGui.QLabel('Rainfall File Format:'), 2, 0) self.fmatcombo = QtGui.QComboBox(self) self.fmats = ['any', 'flx', 'lnd', 'mld'] for i in range(len(self.fmats)): self.fmatcombo.addItem(self.fmats[i]) self.fmatcombo.setCurrentIndex(0) self.grid.addWidget(self.fmatcombo, 2, 1) self.grid.addWidget(QtGui.QLabel('Coordinates:'), 3, 0) self.coords = QtGui.QPlainTextEdit() self.grid.addWidget(self.coords, 3, 1, 1, 3) self.grid.addWidget(QtGui.QLabel('Copy folder down:'), 4, 0) self.checkbox = QtGui.QCheckBox() self.checkbox.setCheckState(QtCore.Qt.Checked) self.grid.addWidget(self.checkbox, 4, 1) self.grid.addWidget(QtGui.QLabel('If checked will copy rainfall folder changes down to others'), 4, 3) cur_dir = os.getcwd() self.dir_labels = ['Rainfall Source', 'Target'] self.dirs = [None, None, None] for i in range(2): self.grid.addWidget(QtGui.QLabel(self.dir_labels[i] + ' Folder:'), 5 + i, 0) self.dirs[i] = ClickableQLabel() self.dirs[i].setText(cur_dir) self.dirs[i].setFrameStyle(6) self.connect(self.dirs[i], QtCore.SIGNAL('clicked()'), self.dirChanged) self.grid.addWidget(self.dirs[i], 5 + i, 1, 1, 3) quit = QtGui.QPushButton('Quit', self) self.grid.addWidget(quit, 8, 0) quit.clicked.connect(self.quitClicked) QtGui.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) dorain = QtGui.QPushButton('Produce Rainfall Files', self) wdth = dorain.fontMetrics().boundingRect(dorain.text()).width() + 9 self.grid.addWidget(dorain, 8, 1) dorain.clicked.connect(self.dorainClicked) help = QtGui.QPushButton('Help', self) help.setMaximumWidth(wdth) self.grid.addWidget(help, 8, 2) help.clicked.connect(self.helpClicked) QtGui.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) info = QtGui.QPushButton('File Info', self) info.setMaximumWidth(wdth) self.grid.addWidget(info, 8, 3) info.clicked.connect(self.infoClicked) # self.grid.setColumnStretch(4, 2) frame = QtGui.QFrame() frame.setLayout(self.grid) self.scroll = QtGui.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtGui.QVBoxLayout(self) self.layout.addWidget(self.scroll) self.setWindowTitle('SIREN - makerainfall2 (' + fileVersion() + ') - Make rainfall files from MERRA data') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.center() self.resize(int(self.sizeHint().width()* 1.07), int(self.sizeHint().height() * 1.07)) self.show()
def helpClicked(self): dialog = displayobject.AnObject(QtGui.QDialog(), self.help, title='Help for updateswis (' + fileVersion() + ')', section='updateswis') dialog.exec_()
def initUI(self): config = ConfigParser.RawConfigParser() if len(sys.argv) > 1: config_file = sys.argv[1] else: config_file = 'SIREN.ini' config.read(config_file) try: self.base_year = config.get('Base', 'year') except: self.base_year = '2012' self.yrndx = -1 this_year = time.strftime('%Y') try: self.years = [] years = config.get('Base', 'years') bits = years.split(',') for i in range(len(bits)): rngs = bits[i].split('-') if len(rngs) > 1: for j in range(int(rngs[0].strip()), int(rngs[1].strip()) + 1): if str(j) == self.base_year: self.yrndx = len(self.years) self.years.append(str(j)) else: if rngs[0].strip() == self.base_year: self.yrndx = len(self.years) self.years.append(rngs[0].strip()) if this_year not in self.years: self.years.append(this_year) except: if self.base_year != this_year: self.years = [self.base_year, this_year] else: self.years = self.base_year self.yrndx = 0 if self.yrndx < 0: self.yrndx = len(self.years) self.years.append(self.base_year) parents = [] try: parents = getParents(config.items('Parents')) except: pass self.grid_stations = '' try: fac_file = config.get('Files', 'grid_stations') for key, value in parents: fac_file = fac_file.replace(key, value) fac_file = fac_file.replace('$USER$', getUser()) fac_file = fac_file.replace('$YEAR$', self.base_year) self.grid_stations = fac_file except: pass self.load_file = '' try: fac_file = config.get('Files', 'load') for key, value in parents: fac_file = fac_file.replace(key, value) fac_file = fac_file.replace('$USER$', getUser()) fac_file = fac_file.replace('$YEAR$', self.base_year) self.load_file = fac_file except: pass my_config = ConfigParser.RawConfigParser() my_config_file = 'getfiles.ini' my_config.read(my_config_file) try: aemo_facilities = my_config.get('updateswis', 'aemo_facilities') except: aemo_facilities = '/datafiles/facilities/facilities.csv' try: aemo_load = my_config.get('updateswis', 'aemo_load') except: aemo_load = '/datafiles/load-summary/load-summary-$YEAR$.csv' aemo_load = aemo_load.replace('$YEAR$', self.base_year) try: aemo_url = my_config.get('updateswis', 'aemo_url') except: aemo_url = 'data.wa.aemo.com.au' self.grid = QtGui.QGridLayout() self.grid.addWidget(QtGui.QLabel('Host site:'), 0, 0) self.host = QtGui.QLineEdit() self.host.setText(aemo_url) self.grid.addWidget(self.host, 0, 1, 1, 2) self.grid.addWidget(QtGui.QLabel('Existing Stations (Facilities)'), 1, 0, 1, 2) self.grid.addWidget(QtGui.QLabel('File location:'), 2, 0) self.url = QtGui.QLineEdit() self.url.setText(aemo_facilities) self.grid.addWidget(self.url, 2, 1, 1, 2) self.grid.addWidget(QtGui.QLabel('Target file:'), 3, 0) self.target = ClickableQLabel() self.target.setText(self.grid_stations) self.target.setFrameStyle(6) self.connect(self.target, QtCore.SIGNAL('clicked()'), self.tgtChanged) self.grid.addWidget(self.target, 3, 1, 1, 4) self.grid.addWidget(QtGui.QLabel('Excel file:'), 4, 0) self.excel = ClickableQLabel() self.excel.setText('') self.excel.setFrameStyle(6) self.connect(self.excel, QtCore.SIGNAL('clicked()'), self.excelChanged) self.grid.addWidget(self.excel, 4, 1, 1, 3) self.grid.addWidget(QtGui.QLabel('Keep deleted:'), 5, 0) self.keepbox = QtGui.QCheckBox() self.keepbox.setCheckState(QtCore.Qt.Checked) self.grid.addWidget(self.keepbox, 5, 1) self.grid.addWidget(QtGui.QLabel('If checked will retain deleted facilities'), 5, 2, 1, 3) self.grid.addWidget(QtGui.QLabel('System Load'), 6, 0) self.grid.addWidget(QtGui.QLabel('Year:'), 7, 0) self.yearCombo = QtGui.QComboBox() for i in range(len(self.years)): self.yearCombo.addItem(self.years[i]) self.yearCombo.setCurrentIndex(self.yrndx) self.yearCombo.currentIndexChanged[str].connect(self.yearChanged) self.grid.addWidget(self.yearCombo, 7, 1) self.grid.addWidget(QtGui.QLabel('Wrap to prior year:'), 8, 0) self.wrapbox = QtGui.QCheckBox() self.wrapbox.setCheckState(QtCore.Qt.Checked) self.grid.addWidget(self.wrapbox, 8, 1) self.grid.addWidget(QtGui.QLabel('If checked will wrap back to prior year'), 8, 2, 1, 3) self.grid.addWidget(QtGui.QLabel('Load file location:'), 9, 0) self.lurl = QtGui.QLineEdit() self.lurl.setText(aemo_load) self.grid.addWidget(self.lurl, 9, 1, 1, 3) self.grid.addWidget(QtGui.QLabel('Target load file:'), 10, 0) self.targetl = ClickableQLabel() self.targetl.setText(self.load_file) self.targetl.setFrameStyle(6) self.connect(self.targetl, QtCore.SIGNAL('clicked()'), self.tgtlChanged) self.grid.addWidget(self.targetl, 10, 1, 1, 4) self.log = QtGui.QLabel(' ') self.grid.addWidget(self.log, 11, 1, 1, 3) quit = QtGui.QPushButton('Quit', self) wdth = quit.fontMetrics().boundingRect(quit.text()).width() + 29 self.grid.addWidget(quit, 12, 0) quit.clicked.connect(self.quitClicked) QtGui.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) dofile = QtGui.QPushButton('Update Existing Stations', self) self.grid.addWidget(dofile, 12, 1) dofile.clicked.connect(self.dofileClicked) dofilel = QtGui.QPushButton('Update Load file', self) self.grid.addWidget(dofilel, 12, 2) dofilel.clicked.connect(self.dofilelClicked) help = QtGui.QPushButton('Help', self) help.setMaximumWidth(wdth) self.grid.addWidget(help, 12, 3) help.clicked.connect(self.helpClicked) QtGui.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) self.grid.setColumnStretch(3, 5) frame = QtGui.QFrame() frame.setLayout(self.grid) self.scroll = QtGui.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtGui.QVBoxLayout(self) self.layout.addWidget(self.scroll) self.setWindowTitle('SIREN - updateswis (' + fileVersion() + ') - Update SWIS Data') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.center() self.resize(int(self.sizeHint().width()* 1.07), int(self.sizeHint().height() * 1.07)) self.show()
def __init__(self, help='help.html'): super(FlexiPlot, self).__init__() self.help = help config = configparser.RawConfigParser() if len(sys.argv) > 1: self.config_file = sys.argv[1] else: self.config_file = getModelFile('flexiplot.ini') config.read(self.config_file) if not config.has_section('Flexiplot'): # new file set windows section self.restorewindows = True else: self.restorewindows = False try: rw = config.get('Windows', 'restorewindows') if rw.lower() in ['true', 'yes', 'on']: self.restorewindows = True except: pass parents = [] self.colours = {} try: parents = getParents(config.items('Parents')) except: pass try: base_year = config.get('Base', 'year') except: base_year = '2012' try: scenario_prefix = config.get('Files', 'scenario_prefix') except: scenario_prefix = '' try: self.scenarios = config.get('Files', 'scenarios') if scenario_prefix != '': self.scenarios += '/' + scenario_prefix for key, value in parents: self.scenarios = self.scenarios.replace(key, value) self.scenarios = self.scenarios.replace('$USER$', getUser()) self.scenarios = self.scenarios.replace('$YEAR$', base_year) self.scenarios = self.scenarios[:self.scenarios.rfind('/') + 1] if self.scenarios[:3] == '../': ups = self.scenarios.split('../') me = os.getcwd().split(os.sep) me = me[:-(len(ups) - 1)] me.append(ups[-1]) self.scenarios = '/'.join(me) except: self.scenarios = '' try: colours = config.items('Plot Colors') for item, colour in colours: itm = item.replace('_', ' ') self.colours[itm] = colour except: pass ifile = '' isheet = '' columns = [] self.setup = [False, False] self.details = True self.book = None self.rows = None self.leapyear = False iper = '<none>' imax = 0 self.alpha = 0.25 self.title_font = 'size=x-large' #'size=15' self.label_font = '' #'size=x-large' self.legend_font = '' #'size=x-large' self.ticks_font = '' #'size=large' self.constrained_layout = False self.series = [] self.xvalues = [] self.palette = True self.history = None self.max_files = 10 ifiles = self.get_flex_config() if len(ifiles) > 0: if self.history is None: self.history = sorted(ifiles.keys(), reverse=True) while ifile == '' and len(self.history) > 0: try: ifile = ifiles[self.history[0]] except: self.history.pop(0) matplotlib.rcParams['savefig.directory'] = os.getcwd() self.grid = QtWidgets.QGridLayout() self.updated = False self.colours_updated = False self.log = QtWidgets.QLabel('') rw = 0 self.grid.addWidget(QtWidgets.QLabel('Recent Files:'), rw, 0) self.files = QtWidgets.QComboBox() if ifile != '': self.popfileslist(ifile, ifiles) self.grid.addWidget(self.files, rw, 1, 1, 5) rw += 1 self.grid.addWidget(QtWidgets.QLabel('File:'), rw, 0) self.file = ClickableQLabel() self.file.setStyleSheet( "background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;" ) self.file.setText('') self.grid.addWidget(self.file, rw, 1, 1, 5) rw += 1 self.grid.addWidget(QtWidgets.QLabel('Sheet:'), rw, 0) self.sheet = QtWidgets.QComboBox() self.grid.addWidget(self.sheet, rw, 1, 1, 2) rw += 1 self.grid.addWidget(QtWidgets.QLabel('Title:'), rw, 0) self.title = QtWidgets.QLineEdit('') self.grid.addWidget(self.title, rw, 1, 1, 2) rw += 1 self.grid.addWidget(QtWidgets.QLabel('Series:'), rw, 0) self.seriesi = CustomCombo() for series in self.series: self.seriesi.addItem(series) self.seriesi.setEditable(True) self.grid.addWidget(self.seriesi, rw, 1, 1, 2) self.grid.addWidget( QtWidgets.QLabel( '(Cells for Series Categories; A1:B2 or r1,c1,r2,c2 format)'), rw, 3, 1, 2) rw += 1 self.grid.addWidget(QtWidgets.QLabel('Series Label:'), rw, 0) self.ylabel = QtWidgets.QLineEdit('') self.grid.addWidget(self.ylabel, rw, 1, 1, 2) rw += 1 self.grid.addWidget(QtWidgets.QLabel('X Values:'), rw, 0) self.xvaluesi = CustomCombo() for xvalues in self.xvalues: self.xvaluesi.addItem(xvalues) self.xvaluesi.setEditable(True) self.grid.addWidget(self.xvaluesi, rw, 1, 1, 2) self.grid.addWidget( QtWidgets.QLabel( '(Cells for X values; A1:B2 or r1,c1,r2,c2 format)'), rw, 3, 1, 2) rw += 1 self.grid.addWidget(QtWidgets.QLabel('X Label:'), rw, 0) self.xlabel = QtWidgets.QLineEdit('') self.grid.addWidget(self.xlabel, rw, 1, 1, 2) rw += 1 self.grid.addWidget(QtWidgets.QLabel('Maximum:'), rw, 0) self.maxSpin = QtWidgets.QSpinBox() self.maxSpin.setRange(0, 100000) self.maxSpin.setSingleStep(500) self.grid.addWidget(self.maxSpin, rw, 1) self.grid.addWidget( QtWidgets.QLabel( '(Handy if you want to produce a series of plots)'), rw, 3, 1, 3) rw += 1 self.grid.addWidget(QtWidgets.QLabel('Type of Plot:'), rw, 0) plots = ['Bar Chart', 'Cumulative', 'Linegraph', 'Step Plot'] self.plottype = QtWidgets.QComboBox() for plot in plots: self.plottype.addItem(plot) self.grid.addWidget(self.plottype, rw, 1) #, 1, 2) self.grid.addWidget( QtWidgets.QLabel('(Type of plot - stacked except for Linegraph)'), rw, 3, 1, 3) rw += 1 self.grid.addWidget(QtWidgets.QLabel('Percentage:'), rw, 0) self.percentage = QtWidgets.QCheckBox() self.percentage.setCheckState(QtCore.Qt.Unchecked) self.grid.addWidget(self.percentage, rw, 1) #, 1, 2) self.grid.addWidget( QtWidgets.QLabel('(Check for percentage distribution)'), rw, 3, 1, 3) rw += 1 self.grid.addWidget(QtWidgets.QLabel('Show Grid:'), rw, 0) grids = ['Both', 'Horizontal', 'Vertical', 'None'] self.gridtype = QtWidgets.QComboBox() for grid in grids: self.gridtype.addItem(grid) self.grid.addWidget(self.gridtype, rw, 1) #, 1, 2) self.grid.addWidget(QtWidgets.QLabel('(Choose gridlines)'), rw, 3, 1, 3) rw += 1 self.grid.addWidget( QtWidgets.QLabel('Column Order:\n(move to right\nto exclude)'), rw, 0) self.order = ListWidget(self) self.grid.addWidget(self.order, rw, 1, 1, 2) self.ignore = ListWidget(self) self.grid.addWidget(self.ignore, rw, 3, 1, 2) self.grid.addWidget(QtWidgets.QLabel(' '), rw, 5) if ifile != '': self.get_file_config(self.history[0]) self.files.currentIndexChanged.connect(self.filesChanged) self.file.clicked.connect(self.fileChanged) # self.seriesi.textChanged.connect(self.seriesChanged) self.seriesi.activated[str].connect(self.seriesChanged) self.seriesi.currentIndexChanged.connect(self.seriesChanged) self.xvaluesi.activated[str].connect(self.xvaluesChanged) self.xvaluesi.currentIndexChanged.connect(self.xvaluesChanged) # self.xvalues.textChanged.connect(self.somethingChanged) self.files.currentIndexChanged.connect(self.seriesChanged) self.sheet.currentIndexChanged.connect(self.sheetChanged) self.title.textChanged.connect(self.somethingChanged) self.maxSpin.valueChanged.connect(self.somethingChanged) self.plottype.currentIndexChanged.connect(self.somethingChanged) self.gridtype.currentIndexChanged.connect(self.somethingChanged) self.percentage.stateChanged.connect(self.somethingChanged) self.order.itemSelectionChanged.connect(self.somethingChanged) rw += 1 msg_palette = QtGui.QPalette() msg_palette.setColor(QtGui.QPalette.Foreground, QtCore.Qt.red) self.log.setPalette(msg_palette) self.grid.addWidget(self.log, rw, 1, 1, 4) rw += 1 done = QtWidgets.QPushButton('Done', self) self.grid.addWidget(done, rw, 0) done.clicked.connect(self.doneClicked) QtWidgets.QShortcut(QtGui.QKeySequence('q'), self, self.doneClicked) pp = QtWidgets.QPushButton('Plot', self) self.grid.addWidget(pp, rw, 1) pp.clicked.connect(self.ppClicked) QtWidgets.QShortcut(QtGui.QKeySequence('p'), self, self.ppClicked) cb = QtWidgets.QPushButton('Colours', self) self.grid.addWidget(cb, rw, 2) cb.clicked.connect(self.editColours) ep = QtWidgets.QPushButton('Preferences', self) self.grid.addWidget(ep, rw, 3) ep.clicked.connect(self.editIniFile) help = QtWidgets.QPushButton('Help', self) self.grid.addWidget(help, rw, 4) help.clicked.connect(self.helpClicked) QtWidgets.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) frame = QtWidgets.QFrame() frame.setLayout(self.grid) self.scroll = QtWidgets.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(self.scroll) self.setWindowTitle('SIREN - flexiplot (' + fileVersion() + ') - FlexiPlot') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) if self.restorewindows: try: rw = config.get('Windows', 'flexiplot_size').split(',') self.resize(int(rw[0]), int(rw[1])) mp = config.get('Windows', 'flexiplot_pos').split(',') self.move(int(mp[0]), int(mp[1])) except: pass else: self.center() self.resize(int(self.sizeHint().width() * 1.2), int(self.sizeHint().height() * 1.2)) self.log.setText('Preferences file: ' + self.config_file) self.show()
def __init__(self, help='help.html'): super(getMap, self).__init__() self.help = help self.ignore = False self.worldwindow = None self.northSpin = QtGui.QDoubleSpinBox() self.northSpin.setDecimals(3) self.northSpin.setSingleStep(.5) self.northSpin.setRange(-85.06, 85.06) self.westSpin = QtGui.QDoubleSpinBox() self.westSpin.setDecimals(3) self.westSpin.setSingleStep(.5) self.westSpin.setRange(-180, 180) self.southSpin = QtGui.QDoubleSpinBox() self.southSpin.setDecimals(3) self.southSpin.setSingleStep(.5) self.southSpin.setRange(-85.06, 85.06) self.eastSpin = QtGui.QDoubleSpinBox() self.eastSpin.setDecimals(3) self.eastSpin.setSingleStep(.5) self.eastSpin.setRange(-180, 180) if len(sys.argv) > 1: his_config_file = sys.argv[1] his_config = ConfigParser.RawConfigParser() his_config.read(his_config_file) try: mapp = his_config.get('Map', 'map_choice') except: mapp = '' try: upper_left = his_config.get('Map', 'upper_left' + mapp).split(',') self.northSpin.setValue(float(upper_left[0].strip())) self.westSpin.setValue(float(upper_left[1].strip())) lower_right = his_config.get('Map', 'lower_right' + mapp).split(',') self.southSpin.setValue(float(lower_right[0].strip())) self.eastSpin.setValue(float(lower_right[1].strip())) except: try: lower_left = his_config.get('Map', 'lower_left' + mapp).split(',') upper_right = his_config.get('Map', 'upper_right' + mapp).split(',') self.northSpin.setValue(float(upper_right[0].strip())) self.westSpin.setValue(float(lower_left[1].strip())) self.southSpin.setValue(float(lower_left[0].strip())) self.eastSpin.setValue(float(upper_right[1].strip())) except: pass self.northSpin.valueChanged.connect(self.showArea) self.westSpin.valueChanged.connect(self.showArea) self.southSpin.valueChanged.connect(self.showArea) self.eastSpin.valueChanged.connect(self.showArea) self.grid = QtGui.QGridLayout() self.grid.addWidget(QtGui.QLabel('Area of Interest:'), 0, 0) area = QtGui.QPushButton('Choose area via Map', self) self.grid.addWidget(area, 0, 1, 1, 2) area.clicked.connect(self.areaClicked) self.grid.addWidget(QtGui.QLabel('Upper left:'), 1, 0) self.grid.addWidget(QtGui.QLabel(' North'), 2, 0) self.grid.addWidget(self.northSpin, 2, 1) self.grid.addWidget(QtGui.QLabel(' West'), 3, 0) self.grid.addWidget(self.westSpin, 3, 1) self.grid.addWidget(QtGui.QLabel('Lower right:'), 1, 2) self.grid.addWidget(QtGui.QLabel(' South'), 2, 2) self.grid.addWidget(self.southSpin, 2, 3) self.grid.addWidget(QtGui.QLabel(' East'), 3, 2) self.grid.addWidget(self.eastSpin, 3, 3) self.grid.addWidget(QtGui.QLabel('Approx. area:'), 4, 0) self.approx_area = QtGui.QLabel('') self.grid.addWidget(self.approx_area, 4, 1) zoom = QtGui.QLabel('Map Scale (Zoom):') self.zoomSpin = QtGui.QSpinBox() self.zoomSpin.setValue(6) config_file = 'getfiles.ini' config = ConfigParser.RawConfigParser() config.read(config_file) try: maxz = int(config.get('getmap', 'max_zoom')) except: maxz = 11 self.zoomSpin.setRange(0, maxz) self.zoomSpin.valueChanged[str].connect(self.zoomChanged) self.zoomScale = QtGui.QLabel('(' + scale[6] + ')') self.grid.addWidget(zoom, 5, 0) self.grid.addWidget(self.zoomSpin, 5, 1) self.grid.addWidget(self.zoomScale, 5, 2) self.grid.addWidget(QtGui.QLabel('URL template:'), 6, 0) self.urltemplate = QtGui.QLineEdit() config_file = 'getfiles.ini' config = ConfigParser.RawConfigParser() config.read(config_file) try: url = his_config.get('getmap', 'url_template') except: url = 'http://[abc].tile.openstreetmap.org/zoom/x/y.png' self.urltemplate.setText(url) self.grid.addWidget(self.urltemplate, 6, 1, 1, 5) self.grid.addWidget(QtGui.QLabel('Image Width:'), 7, 0) self.widthSpin = QtGui.QSpinBox() self.widthSpin.setSingleStep(50) self.widthSpin.setRange(50, 3840) self.widthSpin.setValue(400) self.grid.addWidget(self.widthSpin, 7, 1) hlabel = QtGui.QLabel('Image Height: ') hlabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.grid.addWidget(hlabel, 7, 2) self.heightSpin = QtGui.QSpinBox() self.heightSpin.setSingleStep(50) self.heightSpin.setRange(50, 3840) self.heightSpin.setValue(200) self.grid.addWidget(self.heightSpin, 7, 3) self.grid.addWidget(QtGui.QLabel('Image File name:'), 8, 0) cur_dir = os.getcwd() self.filename = ClickableQLabel() self.filename.setText(cur_dir + '/untitled.png') self.filename.setFrameStyle(6) self.connect(self.filename, QtCore.SIGNAL('clicked()'), self.fileChanged) self.grid.addWidget(self.filename, 8, 1, 1, 5) self.grid.addWidget(QtGui.QLabel('Properties:'), 9, 0) self.properties = QtGui.QPlainTextEdit() self.properties.setMaximumHeight(self.northSpin.sizeHint().height() * 4.5) self.properties.setReadOnly(True) self.grid.addWidget(self.properties, 9, 1, 3, 5) self.log = QtGui.QLabel() self.grid.addWidget(self.log, 14, 1, 3, 5) self.progressbar = QtGui.QProgressBar() self.progressbar.setMinimum(0) self.progressbar.setMaximum(100) self.progressbar.setValue(0) self.progressbar.setStyleSheet('QProgressBar {border: 1px solid grey; border-radius: 2px; text-align: center;}' \ + 'QProgressBar::chunk { background-color: #6891c6;}') self.grid.addWidget(self.progressbar, 17, 1, 1, 5) self.progressbar.setHidden(True) self.progresslabel=QtGui.QLabel('') self.grid.addWidget(self.progresslabel, 17, 1, 1, 2) self.progresslabel.setHidden(True) quit = QtGui.QPushButton('Quit', self) self.grid.addWidget(quit, 18, 0) quit.clicked.connect(self.quitClicked) QtGui.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) query = QtGui.QPushButton('Query Map', self) wdth = query.fontMetrics().boundingRect(query.text()).width() + 9 self.grid.addWidget(query, 18, 1) query.clicked.connect(self.queryClicked) make = QtGui.QPushButton('Get Map', self) make.setMaximumWidth(wdth) self.grid.addWidget(make, 18, 2) make.clicked.connect(self.makeClicked) mapquest = QtGui.QPushButton('MapQuest', self) mapquest.setMaximumWidth(wdth) self.grid.addWidget(mapquest, 18, 3) mapquest.clicked.connect(self.mapquestClicked) help = QtGui.QPushButton('Help', self) help.setMaximumWidth(wdth) self.grid.addWidget(help, 18, 4) help.clicked.connect(self.helpClicked) QtGui.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) frame = QtGui.QFrame() frame.setLayout(self.grid) self.scroll = QtGui.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtGui.QVBoxLayout(self) self.layout.addWidget(self.scroll) # self.resize(self.width() + int(self.world_width * .7), self.height() + int(self.world_height * .7)) self.setWindowTitle('SIREN - getmap (' + fileVersion() + ") - Make Map from OSM or MapQuest") self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.center() self.resize(int(self.sizeHint().width()* 1.27), int(self.sizeHint().height() * 1.1)) self.show()
def initUI(self): label = [] self.edit = [] self.field_type = [] metrics = [] widths = [0, 0] heights = 0 i = -1 grid = QtGui.QGridLayout() if isinstance(self.anobject, str): self.web = QtGui.QTextEdit() if os.path.exists(self.anobject): htf = open(self.anobject, 'r') html = htf.read() htf.close() if self.anobject[-5:].lower() == '.html' or \ self.anobject[-4:].lower() == '.htm' or \ html[:5] == '<html': html = html.replace('[VERSION]', credits.fileVersion()) if self.section is not None: line = html.split('\n') html = '' for i in range(len(line)): html += line[i] + '\n' if line[i].strip() == '<body>': break for i in range(i, len(line)): if line[i][:2] == '<h': if line[i].find('id="' + self.section + '"') > 0: break for i in range(i, len(line)): if line[i].find('Back to top<') > 0: break j = line[i].find(' (see <a href=') if j > 0: k = line[i].find('</a>)', j) line[i] = line[i][:j] + line[i][k + 5:] html += line[i] + '\n' for i in range(i, len(line)): if line[i].strip() == '</body>': break for i in range(i, len(line)): html += line[i] + '\n' self.web.setHtml(QtCore.QString(html)) else: self.web.setPlainText(QtCore.QString(html)) else: html = self.anobject if self.anobject[:5] == '<html': self.anobject = self.anobject.replace('[VERSION]', credits.fileVersion()) self.web.setHtml(QtCore.QString(self.anobject)) else: self.web.setPlainText(QtCore.QString(self.anobject)) metrics.append(self.web.fontMetrics()) try: widths[0] = metrics[0].boundingRect(self.web.text()).width() heights = metrics[0].boundingRect(self.web.text()).height() except: bits = html.split('\n') for lin in bits: if len(lin) > widths[0]: widths[0] = len(lin) heights = len(bits) fnt = self.web.fontMetrics() widths[0] = (widths[0]) * fnt.maxWidth() heights = (heights) * fnt.height() screen = QtGui.QDesktopWidget().availableGeometry() if widths[0] > screen.width() * .67: heights = int(heights / .67) widths[0] = int(screen.width() * .67) if self.readonly: self.web.setReadOnly(True) i = 1 grid.addWidget(self.web, 0, 0) self.set_stuff(grid, widths, heights, i) elif isinstance(self.anobject, dict): if self.textedit: self.keys = [] for key, value in self.anobject.iteritems(): self.field_type.append('str') label.append(QtGui.QLabel(key + ':')) self.keys.append(key) self.edit.append(QtGui.QTextEdit()) self.edit[-1].setPlainText(value) # print '(160)', key, self.edit[-1].document().blockCount() if i < 0: metrics.append(label[-1].fontMetrics()) metrics.append(self.edit[-1].fontMetrics()) bits = value.split('\n') ln = 0 for lin in bits: if len(lin) > ln: ln = len(lin) ln2 = len(bits) ln = (ln + 5) * metrics[0].maxWidth() ln2 = (ln2 + 4) * metrics[0].height() self.edit[-1].resize(ln, ln2) if metrics[0].boundingRect(label[-1].text()).width() > widths[0]: widths[0] = metrics[0].boundingRect(label[-1].text()).width() try: if metrics[1].boundingRect(self.edit[-1].text()).width() > widths[1]: widths[1] = metrics[1].boundingRect(self.edit[-1].text()).width() except: widths[1] = ln for j in range(2): try: if metrics[j].boundingRect(label[-1].text()).height() > heights: heights = metrics[j].boundingRect(label[-1].text()).height() except: heights = ln2 if self.readonly: self.edit[-1].setReadOnly(True) i += 1 grid.addWidget(label[-1], i + 1, 0) grid.addWidget(self.edit[-1], i + 1, 1) else: self.keys = [] for key, value in self.anobject.iteritems(): self.field_type.append('str') label.append(QtGui.QLabel(key + ':')) self.keys.append(key) self.edit.append(QtGui.QLineEdit()) self.edit[-1].setText(value) if i < 0: metrics.append(label[-1].fontMetrics()) metrics.append(self.edit[-1].fontMetrics()) ln = (len(value) + 5) * metrics[0].maxWidth() ln2 = metrics[0].height() self.edit[-1].resize(ln, ln2) if metrics[0].boundingRect(label[-1].text()).width() > widths[0]: widths[0] = metrics[0].boundingRect(label[-1].text()).width() try: if metrics[1].boundingRect(self.edit[-1].text()).width() > widths[1]: widths[1] = metrics[1].boundingRect(self.edit[-1].text()).width() except: widths[1] = ln if self.readonly: self.edit[-1].setReadOnly(True) i += 1 grid.addWidget(label[-1], i, 0) grid.addWidget(self.edit[-1], i, 1) self.set_stuff(grid, widths, heights, i) else: units = {'area': 'sq. Km', 'capacity': 'MW', 'rotor': 'm', 'generation': 'MWh', 'grid_len': 'Km', 'grid_path_len': 'Km'} for prop in dir(self.anobject): if prop[:2] != '__' and prop[-2:] != '__': attr = getattr(self.anobject, prop) if isinstance(attr, int): self.field_type.append('int') elif isinstance(attr, float): self.field_type.append('float') else: self.field_type.append('str') label.append(QtGui.QLabel(prop.title() + ':')) if self.field_type[-1] != "str": self.edit.append(QtGui.QLineEdit(str(attr))) else: self.edit.append(QtGui.QLineEdit(attr)) if i < 0: metrics.append(label[-1].fontMetrics()) metrics.append(self.edit[-1].fontMetrics()) if metrics[0].boundingRect(label[-1].text()).width() > widths[0]: widths[0] = metrics[0].boundingRect(label[-1].text()).width() if metrics[1].boundingRect(self.edit[-1].text()).width() > widths[1]: widths[1] = metrics[1].boundingRect(self.edit[-1].text()).width() for j in range(2): if metrics[j].boundingRect(label[-1].text()).height() > heights: heights = metrics[j].boundingRect(label[-1].text()).height() if self.readonly: self.edit[-1].setReadOnly(True) i += 1 grid.addWidget(label[-1], i + 1, 0) grid.addWidget(self.edit[-1], i + 1, 1) if prop in units.keys(): grid.addWidget(QtGui.QLabel(units[prop]), i + 1, 2) if prop == 'turbine': i += 1 curve = QtGui.QPushButton('Show Power Curve', self) grid.addWidget(curve, i + 1, 1) curve.clicked.connect(self.curveClicked) self.turbine = attr self.set_stuff(grid, widths, heights, i) QtGui.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked)
def helpClicked(self): dialog = displayobject.AnObject(QtGui.QDialog(), self.help, title='Help for makegrid (' + fileVersion() + ')', section='resource') dialog.exec_()
def initUI(self): if sys.platform == 'win32' or sys.platform == 'cygwin': ini_file = 'siren_windows_default.ini' else: ini_file = 'siren_default.ini' if os.path.exists(self.siren_dir + ini_file): ini_file = self.siren_dir + ini_file else: if not os.path.exists(ini_file): return file_sects = ['[Parents]', '[Files]', '[SAM Modules]'] dir_props = ['pow_files', 'sam_sdk', 'scenarios', 'solar_files', 'variable_files', 'wind_files'] field_props = ['scenario_prefix'] inf = open(ini_file, 'r') lines = inf.readlines() inf.close() sections = {} props = [] for line in lines: if line[0] == ';' or line[0] == '#': continue if line[0] == '[': if len(props) > 0: sections[section] = props j = line.find(']') section = line[:j + 1] props = [] else: j = line.find('=') if line[j + 1] == '<' or section == '[Parents]': prop = line[j + 1:].lstrip('<').strip().rstrip('>') props.append([line[:j], prop]) if len(props) > 0: sections[section] = props row = 0 self.fields = [] self.fields.append(['section', 'typ', 'name', 'value', QtGui.QLineEdit()]) self.grid = QtGui.QGridLayout() self.grid.addWidget(QtGui.QLabel('New file name:'), row, 0) self.fields[row][4].setText('siren_new.ini') self.grid.addWidget(self.fields[row][4], row, 1) self.fields[row][4].textChanged.connect(self.filenameChanged) self.msg = QtGui.QLabel('') self.grid.addWidget(self.msg, row, 2, 1, 3) now = datetime.datetime.now() if '[Base]' in sections.keys(): for key, value in sections['[Base]']: row += 1 self.fields.append(['[Base]', 'txt', key, value, QtGui.QLineEdit()]) if key == 'year': self.fields[-1][3] = str((now.year - 1)) if self.fields[row][0] != self.fields[row - 1][0]: self.grid.addWidget(QtGui.QLabel(self.fields[row][0]), row, 0) self.grid.addWidget(QtGui.QLabel(self.fields[row][2]), row, 1) self.fields[row][4].setText(self.fields[row][3]) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) self.parents = {} sections['[Parents]'].append(['$USER$', getUser()]) sections['[Parents]'].append(['$YEAR$', str((now.year - 1))]) if '[Parents]' in sections.keys(): for key, value in sections['[Parents]']: self.parents[key] = value row += 1 self.fields.append(['[Parents]', '?', key, value, '?']) if self.fields[row][0] != self.fields[row - 1][0]: self.grid.addWidget(QtGui.QLabel(self.fields[row][0]), row, 0) self.grid.addWidget(QtGui.QLabel(self.fields[row][2]), row, 1) if key == '$USER$' or key == '$YEAR$': self.fields[row][1] = 'txt' self.fields[row][4] = QtGui.QLabel(self.fields[row][3]) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) else: self.fields[row][1] = 'dir' self.fields[row][4] = ClickableQLabel() self.fields[row][4].setText(self.fields[row][3]) self.fields[row][4].setFrameStyle(6) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) self.connect(self.fields[row][4], QtCore.SIGNAL('clicked()'), self.itemClicked) for section, props in iter(sections.iteritems()): if section == '[Base]' or section == '[Parents]': continue elif section == '[Map]': for prop in props: row += 1 self.fields.append([section, '?', prop[0], prop[1], '?']) if self.fields[row][0] != self.fields[row - 1][0]: self.grid.addWidget(QtGui.QLabel(self.fields[row][0]), row, 0) self.grid.addWidget(QtGui.QLabel(self.fields[row][2]), row, 1) if prop[0] == 'map' or (prop[0][:3] == 'map' and prop[0][3] != '_'): self.fields[row][3] = prop[1] self.fields[row][1] = 'fil' self.fields[row][4] = ClickableQLabel() self.fields[row][4].setFrameStyle(6) self.connect(self.fields[row][4], QtCore.SIGNAL('clicked()'), self.itemClicked) else: self.fields[row][1] = 'txt' self.fields[row][4] = QtGui.QLineEdit() self.fields[row][4].setText(self.fields[row][3]) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) elif section in file_sects: for prop in props: row += 1 self.fields.append([section, '?', prop[0], prop[1], '?']) if self.fields[row][0] != self.fields[row - 1][0]: self.grid.addWidget(QtGui.QLabel(self.fields[row][0]), row, 0) self.grid.addWidget(QtGui.QLabel(self.fields[row][2]), row, 1) self.fields[row][3] = prop[1] if prop[0] in field_props: self.fields[row][1] = 'txt' self.fields[row][4] = QtGui.QLineEdit() self.fields[row][4].setText(self.fields[row][3]) else: if prop[0] in dir_props: self.fields[row][1] = 'dir' else: self.fields[row][1] = 'fil' self.fields[row][4] = ClickableQLabel() self.fields[row][4].setText(self.fields[row][3]) self.fields[row][4].setFrameStyle(6) self.connect(self.fields[row][4], QtCore.SIGNAL('clicked()'), self.itemClicked) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) else: for prop in props: row += 1 self.fields.append([section, 'txt', prop[0], prop[1], QtGui.QLineEdit()]) if self.fields[row][0] != self.fields[row - 1][0]: self.grid.addWidget(QtGui.QLabel(self.fields[row][0]), row, 0) self.grid.addWidget(QtGui.QLabel(self.fields[row][2]), row, 1) self.fields[row][4].setText(self.fields[row][3]) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) row += 1 quit = QtGui.QPushButton('Quit', self) self.grid.addWidget(quit, row, 0) quit.clicked.connect(self.quitClicked) QtGui.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) save = QtGui.QPushButton('Save', self) self.grid.addWidget(save, row, 1) save.clicked.connect(self.saveClicked) launch = QtGui.QPushButton('Save && Open', self) self.grid.addWidget(launch, row, 3) launch.clicked.connect(self.saveLaunch) wdth = save.fontMetrics().boundingRect(launch.text()).width() + 9 launch.setMaximumWidth(wdth) edit = QtGui.QPushButton('Save && Edit', self) self.grid.addWidget(edit, row, 2) edit.clicked.connect(self.saveEdit) edit.setMaximumWidth(wdth) help = QtGui.QPushButton('Help', self) help.setMaximumWidth(wdth) self.grid.addWidget(help, row, 4) help.clicked.connect(self.helpClicked) QtGui.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) self.grid.setColumnStretch(2, 5) frame = QtGui.QFrame() frame.setLayout(self.grid) self.scroll = QtGui.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtGui.QVBoxLayout(self) self.layout.addWidget(self.scroll) utilities = ['getmap', 'getmerra2', 'makeweather2', 'sirenupd'] utilicon = ['map.png', 'download.png', 'weather.png', 'download.png'] spawns = [] icons = [] if sys.platform == 'win32' or sys.platform == 'cygwin': for i in range(len(utilities)): if os.path.exists(utilities[i] + '.exe'): spawns.append(utilities[i] + '.exe') icons.append(utilicon[i]) else: if os.path.exists(utilities[i] + '.py'): spawns.append(utilities[i] + '.py') icons.append(utilicon[i]) else: for i in range(len(utilities)): if os.path.exists(utilities[i] + '.py'): spawns.append(utilities[i] + '.py') icons.append(utilicon[i]) if len(spawns) > 0: spawnitem = [] menubar = QtGui.QMenuBar() spawnMenu = menubar.addMenu('&Tools') for i in range(len(spawns)): if type(spawns[i]) is list: who = spawns[i][0][:spawns[i][0].find('.')] else: who = spawns[i][:spawns[i].find('.')] spawnitem.append(QtGui.QAction(QtGui.QIcon(icons[i]), who, self)) spawnitem[-1].triggered.connect(partial(self.spawn, spawns[i])) spawnMenu.addAction(spawnitem[-1]) self.layout.setMenuBar(menubar) self.setWindowTitle('SIREN (' + fileVersion() + ') - Create Preferences file') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.show()
def __init__(self, parent, scene): super(WorldWindow, self).__init__(parent) self.get_config() # self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.view = WorldView(scene, self.zoom) self.view.scale(1., 1.) self._mv = self.view self.grid_items = None self.setStatusBar(QtGui.QStatusBar()) self.connect(self.view, QtCore.SIGNAL('statusmsg'), self.setStatusText) w = QtGui.QWidget() lay = QtGui.QVBoxLayout(w) lay.addWidget(self.view) self.setCentralWidget(w) self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.popup) menubar = self.menuBar() self.showRuler = QtGui.QAction(QtGui.QIcon('blank.png'), 'Scale Ruler', self) self.showRuler.setShortcut('Ctrl+R') self.showRuler.setStatusTip('Show Scale Ruler') self.showRuler.triggered.connect(self.show_Ruler) self.showGrid = QtGui.QAction(QtGui.QIcon('blank.png'), 'Coordinates Grid', self) self.showGrid.setShortcut('Ctrl+G') self.showGrid.setStatusTip('Show Coordinates Grid') self.showGrid.triggered.connect(self.show_Grid) self.showMGrid = QtGui.QAction(QtGui.QIcon('blank.png'), 'MERRA-2 Grid', self) self.showMGrid.setShortcut('Ctrl+M') self.showMGrid.setStatusTip('Show MERRA-2 Grid') self.showMGrid.triggered.connect(self.show_MGrid) self.saveView = QtGui.QAction(QtGui.QIcon('camera.png'), 'Save View', self) self.saveView.setShortcut('Ctrl+V') self.saveView.triggered.connect(self.save_View) self.showMany = QtGui.QAction(QtGui.QIcon('blank.png'), 'Show many Areas', self) self.showMany.setShortcut('Ctrl+A') self.showMany.setStatusTip('Show many Areas') self.showMany.triggered.connect(self.show_Many) viewMenu = menubar.addMenu('&View') viewMenu.addAction(self.showRuler) viewMenu.addAction(self.showGrid) viewMenu.addAction(self.showMGrid) viewMenu.addAction(self.showMany) viewMenu.addAction(self.saveView) self.editIni = QtGui.QAction(QtGui.QIcon('edit.png'), 'Edit Preferences File', self) self.editIni.setShortcut('Ctrl+E') self.editIni.setStatusTip('Edit Preferences') self.editIni.triggered.connect(self.editIniFile) self.editColour = QtGui.QAction(QtGui.QIcon('rainbow-icon.png'), 'Edit Colours', self) self.editColour.setShortcut('Ctrl+U') self.editColour.setStatusTip('Edit Colours') self.editColour.triggered.connect(self.editColours) self.editSect = QtGui.QAction(QtGui.QIcon('arrow.png'), 'Edit Section', self) self.editSect.setStatusTip('Edit Preferences Section') self.editSect.triggered.connect(self.editSects) editMenu = menubar.addMenu('P&references') editMenu.addAction(self.editIni) editMenu.addAction(self.editColour) editMenu.addAction(self.editSect) help = QtGui.QAction(QtGui.QIcon('help.png'), 'Help', self) help.setShortcut('F1') help.setStatusTip('Help') help.triggered.connect(self.showHelp) helpMenu = menubar.addMenu('&Help') helpMenu.addAction(help) QtGui.QShortcut(QtGui.QKeySequence('q'), self, self.exit) QtGui.QShortcut(QtGui.QKeySequence('x'), self, self.exit) self.config = ConfigParser.RawConfigParser() self.config_file = 'getfiles.ini' self.config.read(self.config_file) parents = [] try: parents = getParents(config.items('Parents')) except: pass try: mapc = self.config.get('Map', 'map_choice') except: mapc = '' try: mapp = self.config.get('Map', 'map' + mapc) for pkey, pvalue in parents: mapp = mapp.replace(pkey, pvalue) mapp = mapp.replace('$USER$', getUser()) if not os.path.exists(mapp): if self.floatstatus is None: self.show_FloatStatus() self.floatstatus.emit(QtCore.SIGNAL('log'), 'Need to check [Map].map%s property. Resolves to %s' % (mapc, mapp)) except: pass self.setWindowTitle('SIREN - worldwindow (' + fileVersion() + ')') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) note = QtCore.QString('Map data ' + unichr(169) + ' OpenStreetMap contributors CC-BY-SA ' + '(http://www.openstreetmap.org/copyright)') self.view.emit(QtCore.SIGNAL('statusmsg'), note) if not self.restorewindows: return screen = QtGui.QApplication.desktop().primaryScreen() scr_right = QtGui.QApplication.desktop().availableGeometry(screen).right() scr_bottom = QtGui.QApplication.desktop().availableGeometry(screen).bottom() win_width = self.sizeHint().width() win_height = self.sizeHint().height() try: rw = self.config.get('Windows', 'main_size').split(',') lst_width = int(rw[0]) lst_height = int(rw[1]) mp = self.config.get('Windows', 'main_pos').split(',') lst_left = int(mp[0]) lst_top = int(mp[1]) lst_right = lst_left + lst_width lst_bottom = lst_top + lst_height screen = QtGui.QApplication.desktop().screenNumber(QtCore.QPoint(lst_left, lst_top)) scr_right = QtGui.QApplication.desktop().availableGeometry(screen).right() scr_left = QtGui.QApplication.desktop().availableGeometry(screen).left() if lst_right < scr_right: if (lst_right - win_width) >= scr_left: scr_right = lst_right else: scr_right = scr_left + win_width scr_bottom = QtGui.QApplication.desktop().availableGeometry(screen).bottom() scr_top = QtGui.QApplication.desktop().availableGeometry(screen).top() if lst_bottom < scr_bottom: if (lst_bottom - win_height) >= scr_top: scr_bottom = lst_bottom else: scr_bottom = scr_top + win_height except: pass win_left = scr_right - win_width win_top = scr_bottom - win_height self.resize(win_width, win_height) self.move(win_left, win_top)
def __init__(self, help='help.html'): super(getMap, self).__init__() self.help = help self.ignore = False self.worldwindow = None self.northSpin = QtWidgets.QDoubleSpinBox() self.northSpin.setDecimals(3) self.northSpin.setSingleStep(.5) self.northSpin.setRange(-85.06, 85.06) self.westSpin = QtWidgets.QDoubleSpinBox() self.westSpin.setDecimals(3) self.westSpin.setSingleStep(.5) self.westSpin.setRange(-180, 180) self.southSpin = QtWidgets.QDoubleSpinBox() self.southSpin.setDecimals(3) self.southSpin.setSingleStep(.5) self.southSpin.setRange(-85.06, 85.06) self.eastSpin = QtWidgets.QDoubleSpinBox() self.eastSpin.setDecimals(3) self.eastSpin.setSingleStep(.5) self.eastSpin.setRange(-180, 180) if len(sys.argv) > 1: his_config_file = sys.argv[1] his_config = configparser.RawConfigParser() his_config.read(his_config_file) try: mapp = his_config.get('Map', 'map_choice') except: mapp = '' try: upper_left = his_config.get('Map', 'upper_left' + mapp).split(',') self.northSpin.setValue(float(upper_left[0].strip())) self.westSpin.setValue(float(upper_left[1].strip())) lower_right = his_config.get('Map', 'lower_right' + mapp).split(',') self.southSpin.setValue(float(lower_right[0].strip())) self.eastSpin.setValue(float(lower_right[1].strip())) except: try: lower_left = his_config.get('Map', 'lower_left' + mapp).split(',') upper_right = his_config.get('Map', 'upper_right' + mapp).split(',') self.northSpin.setValue(float(upper_right[0].strip())) self.westSpin.setValue(float(lower_left[1].strip())) self.southSpin.setValue(float(lower_left[0].strip())) self.eastSpin.setValue(float(upper_right[1].strip())) except: pass self.northSpin.valueChanged.connect(self.showArea) self.westSpin.valueChanged.connect(self.showArea) self.southSpin.valueChanged.connect(self.showArea) self.eastSpin.valueChanged.connect(self.showArea) self.grid = QtWidgets.QGridLayout() self.grid.addWidget(QtWidgets.QLabel('Area of Interest:'), 0, 0) area = QtWidgets.QPushButton('Choose area via Map', self) self.grid.addWidget(area, 0, 1, 1, 2) area.clicked.connect(self.areaClicked) self.grid.addWidget(QtWidgets.QLabel('Upper left:'), 1, 0) self.grid.itemAt(self.grid.count() - 1).setAlignment( QtCore.Qt.AlignRight) self.grid.addWidget(QtWidgets.QLabel(' North'), 2, 0) self.grid.itemAt(self.grid.count() - 1).setAlignment( QtCore.Qt.AlignRight) self.grid.addWidget(self.northSpin, 2, 1) self.grid.addWidget(QtWidgets.QLabel(' West'), 3, 0) self.grid.itemAt(self.grid.count() - 1).setAlignment( QtCore.Qt.AlignRight) self.grid.addWidget(self.westSpin, 3, 1) self.grid.addWidget(QtWidgets.QLabel('Lower right:'), 1, 2) self.grid.itemAt(self.grid.count() - 1).setAlignment( QtCore.Qt.AlignRight) self.grid.addWidget(QtWidgets.QLabel(' South'), 2, 2) self.grid.itemAt(self.grid.count() - 1).setAlignment( QtCore.Qt.AlignRight) self.grid.addWidget(self.southSpin, 2, 3) self.grid.addWidget(QtWidgets.QLabel(' East'), 3, 2) self.grid.itemAt(self.grid.count() - 1).setAlignment( QtCore.Qt.AlignRight) self.grid.addWidget(self.eastSpin, 3, 3) self.grid.addWidget(QtWidgets.QLabel('Approx. area:'), 4, 0) self.approx_area = QtWidgets.QLabel('') self.grid.addWidget(self.approx_area, 4, 1, 1, 2) zoom = QtWidgets.QLabel('Map Scale (Zoom):') self.zoomSpin = QtWidgets.QSpinBox() self.zoomSpin.setValue(6) config_file = 'getfiles.ini' config = configparser.RawConfigParser() config.read(config_file) try: maxz = int(config.get('getmap', 'max_zoom')) except: maxz = 11 self.zoomSpin.setRange(0, maxz) self.zoomSpin.valueChanged[str].connect(self.zoomChanged) self.zoomScale = QtWidgets.QLabel('(' + scale[6] + ')') self.grid.addWidget(zoom, 5, 0) self.grid.addWidget(self.zoomSpin, 5, 1) self.grid.addWidget(self.zoomScale, 5, 2, 1, 2) self.grid.addWidget(QtWidgets.QLabel('URL template:'), 6, 0) self.urltemplate = QtWidgets.QLineEdit() config_file = 'getfiles.ini' config = configparser.RawConfigParser() config.read(config_file) try: url = his_config.get('getmap', 'url_template') except: url = 'https://[abc].tile.openstreetmap.org/zoom/x/y.png' self.urltemplate.setText(url) self.grid.addWidget(self.urltemplate, 6, 1, 1, 5) self.grid.addWidget(QtWidgets.QLabel('Image Width:'), 7, 0) self.widthSpin = QtWidgets.QSpinBox() self.widthSpin.setSingleStep(50) self.widthSpin.setRange(50, 3840) self.widthSpin.setValue(400) self.grid.addWidget(self.widthSpin, 7, 1) hlabel = QtWidgets.QLabel('Image Height: ') hlabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.grid.addWidget(hlabel, 7, 2) self.heightSpin = QtWidgets.QSpinBox() self.heightSpin.setSingleStep(50) self.heightSpin.setRange(50, 3840) self.heightSpin.setValue(200) self.grid.addWidget(self.heightSpin, 7, 3) adate = QtWidgets.QDateEdit() dw = adate.minimumSizeHint().width() sw = self.northSpin.minimumSizeHint().width() if sw > dw: # fix for wide QDoubleSpinBox width in Windows self.northSpin.setMinimumWidth(adate.minimumSizeHint().width()) self.westSpin.setMinimumWidth(adate.minimumSizeHint().width()) self.southSpin.setMinimumWidth(adate.minimumSizeHint().width()) self.eastSpin.setMinimumWidth(adate.minimumSizeHint().width()) sw = self.heightSpin.minimumSizeHint().width() if sw > dw: # fix for wide QSpinBox width in Windows self.zoomSpin.setMinimumWidth(adate.minimumSizeHint().width()) self.widthSpin.setMinimumWidth(adate.minimumSizeHint().width()) self.heightSpin.setMinimumWidth(adate.minimumSizeHint().width()) del adate self.grid.addWidget(QtWidgets.QLabel('Image File name:'), 8, 0) cur_dir = os.getcwd() self.filename = ClickableQLabel() self.filename.setStyleSheet( "background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;" ) self.filename.setText(cur_dir + '/untitled.png') self.filename.clicked.connect(self.fileChanged) self.grid.addWidget(self.filename, 8, 1, 1, 5) self.grid.addWidget(QtWidgets.QLabel('Properties:'), 9, 0) self.properties = QtWidgets.QPlainTextEdit() self.properties.setMaximumHeight( int(self.northSpin.sizeHint().height() * 4.5)) self.properties.setReadOnly(True) self.grid.addWidget(self.properties, 9, 1, 3, 5) self.log = QtWidgets.QLabel() self.grid.addWidget(self.log, 14, 1, 3, 5) self.progressbar = QtWidgets.QProgressBar() self.progressbar.setMinimum(0) self.progressbar.setMaximum(100) self.progressbar.setValue(0) self.progressbar.setStyleSheet('QProgressBar {border: 1px solid grey; border-radius: 2px; text-align: center;}' \ + 'QProgressBar::chunk { background-color: #6891c6;}') self.grid.addWidget(self.progressbar, 17, 1, 1, 5) self.progressbar.setHidden(True) self.progresslabel = QtWidgets.QLabel('') self.grid.addWidget(self.progresslabel, 17, 1, 1, 4) self.progresslabel.setHidden(True) quit = QtWidgets.QPushButton('Quit', self) self.grid.addWidget(quit, 18, 0) quit.clicked.connect(self.quitClicked) QtWidgets.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) query = QtWidgets.QPushButton('Query Map', self) wdth = query.fontMetrics().boundingRect(query.text()).width() + 9 self.grid.addWidget(query, 18, 1) query.clicked.connect(self.queryClicked) make = QtWidgets.QPushButton('Get Map', self) make.setMaximumWidth(wdth) self.grid.addWidget(make, 18, 2) make.clicked.connect(self.makeClicked) mapquest = QtWidgets.QPushButton('MapQuest', self) mapquest.setMaximumWidth(wdth) self.grid.addWidget(mapquest, 18, 3) mapquest.clicked.connect(self.mapquestClicked) help = QtWidgets.QPushButton('Help', self) help.setMaximumWidth(wdth) self.grid.addWidget(help, 18, 4) help.clicked.connect(self.helpClicked) QtWidgets.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) frame = QtWidgets.QFrame() frame.setLayout(self.grid) self.scroll = QtWidgets.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(self.scroll) # self.resize(self.width() + int(self.world_width * .7), self.height() + int(self.world_height * .7)) self.setWindowTitle('SIREN - getmap (' + fileVersion() + ") - Make Map from OSM or MapQuest") self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.center() self.resize(int(self.sizeHint().width() * 1.5), int(self.sizeHint().height() * 1.3)) self.show()
def showHelp(self): dialog = displayobject.AnObject(QtGui.QDialog(), self.help, title='Help for worldwindow (' + fileVersion() + ')', section='worldwindow') dialog.exec_()
def initUI(self): config = configparser.RawConfigParser() if len(sys.argv) > 1: config_file = sys.argv[1] else: config_file = getModelFile('SIREN.ini') config.read(config_file) try: self.base_year = config.get('Base', 'year') except: self.base_year = '2012' self.yrndx = -1 this_year = time.strftime('%Y') try: self.years = [] years = config.get('Base', 'years') bits = years.split(',') for i in range(len(bits)): rngs = bits[i].split('-') if len(rngs) > 1: for j in range(int(rngs[0].strip()), int(rngs[1].strip()) + 1): if str(j) == self.base_year: self.yrndx = len(self.years) self.years.append(str(j)) else: if rngs[0].strip() == self.base_year: self.yrndx = len(self.years) self.years.append(rngs[0].strip()) if this_year not in self.years: self.years.append(this_year) except: if self.base_year != this_year: self.years = [self.base_year, this_year] else: self.years = self.base_year self.yrndx = 0 if self.yrndx < 0: self.yrndx = len(self.years) self.years.append(self.base_year) parents = [] try: parents = getParents(config.items('Parents')) except: pass self.grid_stations = '' try: fac_file = config.get('Files', 'grid_stations') for key, value in parents: fac_file = fac_file.replace(key, value) fac_file = fac_file.replace('$USER$', getUser()) fac_file = fac_file.replace('$YEAR$', self.base_year) self.grid_stations = fac_file except: pass self.load_file = '' try: fac_file = config.get('Files', 'load') for key, value in parents: fac_file = fac_file.replace(key, value) fac_file = fac_file.replace('$USER$', getUser()) fac_file = fac_file.replace('$YEAR$', self.base_year) self.load_file = fac_file except: pass my_config = configparser.RawConfigParser() my_config_file = 'getfiles.ini' my_config.read(my_config_file) try: aemo_facilities = my_config.get('updateswis', 'aemo_facilities') except: aemo_facilities = '/datafiles/facilities/facilities.csv' try: aemo_load = my_config.get('updateswis', 'aemo_load') except: aemo_load = '/datafiles/load-summary/load-summary-$YEAR$.csv' aemo_load = aemo_load.replace('$YEAR$', self.base_year) try: aemo_url = my_config.get('updateswis', 'aemo_url') except: aemo_url = 'data.wa.aemo.com.au' self.grid = QtWidgets.QGridLayout() self.grid.addWidget(QtWidgets.QLabel('Host site:'), 0, 0) self.host = QtWidgets.QLineEdit() self.host.setText(aemo_url) self.grid.addWidget(self.host, 0, 1, 1, 2) self.grid.addWidget(QtWidgets.QLabel('Existing Stations (Facilities)'), 1, 0, 1, 2) self.grid.addWidget(QtWidgets.QLabel('File location:'), 2, 0) self.url = QtWidgets.QLineEdit() self.url.setText(aemo_facilities) self.grid.addWidget(self.url, 2, 1, 1, 2) self.grid.addWidget(QtWidgets.QLabel('Target file:'), 3, 0) self.target = ClickableQLabel() self.target.setText(self.grid_stations) self.target.setStyleSheet( "background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;" ) self.target.clicked.connect(self.tgtChanged) self.grid.addWidget(self.target, 3, 1, 1, 4) self.grid.addWidget(QtWidgets.QLabel('Excel file:'), 4, 0) self.excel = ClickableQLabel() self.excel.setText('') self.excel.setStyleSheet( "background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;" ) self.excel.clicked.connect(self.excelChanged) self.grid.addWidget(self.excel, 4, 1, 1, 3) self.grid.addWidget(QtWidgets.QLabel('Keep deleted:'), 5, 0) self.keepbox = QtWidgets.QCheckBox() self.keepbox.setCheckState(QtCore.Qt.Checked) self.grid.addWidget(self.keepbox, 5, 1) self.grid.addWidget( QtWidgets.QLabel('If checked will retain deleted facilities'), 5, 2, 1, 3) self.grid.addWidget(QtWidgets.QLabel('System Load'), 6, 0) self.grid.addWidget(QtWidgets.QLabel('Year:'), 7, 0) self.yearCombo = QtWidgets.QComboBox() for i in range(len(self.years)): self.yearCombo.addItem(self.years[i]) self.yearCombo.setCurrentIndex(self.yrndx) self.yearCombo.currentIndexChanged[str].connect(self.yearChanged) self.grid.addWidget(self.yearCombo, 7, 1) self.grid.addWidget(QtWidgets.QLabel('Wrap to prior year:'), 8, 0) self.wrapbox = QtWidgets.QCheckBox() self.wrapbox.setCheckState(QtCore.Qt.Checked) self.grid.addWidget(self.wrapbox, 8, 1) self.grid.addWidget( QtWidgets.QLabel('If checked will wrap back to prior year'), 8, 2, 1, 3) self.grid.addWidget(QtWidgets.QLabel('Load file location:'), 9, 0) self.lurl = QtWidgets.QLineEdit() self.lurl.setText(aemo_load) self.grid.addWidget(self.lurl, 9, 1, 1, 3) self.grid.addWidget(QtWidgets.QLabel('Target load file:'), 10, 0) self.targetl = ClickableQLabel() self.targetl.setText(self.load_file) self.targetl.setStyleSheet( "background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;" ) self.targetl.clicked.connect(self.tgtlChanged) self.grid.addWidget(self.targetl, 10, 1, 1, 4) self.log = QtWidgets.QLabel(' ') self.grid.addWidget(self.log, 11, 1, 1, 3) quit = QtWidgets.QPushButton('Quit', self) wdth = quit.fontMetrics().boundingRect(quit.text()).width() + 29 self.grid.addWidget(quit, 12, 0) quit.clicked.connect(self.quitClicked) QtWidgets.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) dofile = QtWidgets.QPushButton('Update Existing Stations', self) self.grid.addWidget(dofile, 12, 1) dofile.clicked.connect(self.dofileClicked) dofilel = QtWidgets.QPushButton('Update Load file', self) self.grid.addWidget(dofilel, 12, 2) dofilel.clicked.connect(self.dofilelClicked) help = QtWidgets.QPushButton('Help', self) help.setMaximumWidth(wdth) self.grid.addWidget(help, 12, 3) help.clicked.connect(self.helpClicked) QtWidgets.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) self.grid.setColumnStretch(3, 5) frame = QtWidgets.QFrame() frame.setLayout(self.grid) self.scroll = QtWidgets.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(self.scroll) self.setWindowTitle('SIREN - updateswis (' + fileVersion() + ') - Update SWIS Data') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.center() self.resize(int(self.sizeHint().width() * 1.07), int(self.sizeHint().height() * 1.07)) self.show()
def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.siren_dir = '.' if len(sys.argv) > 1: if sys.argv[1][-4:] == '.ini': self.invoke(sys.argv[1]) sys.exit() elif os.path.isdir(sys.argv[1]): self.siren_dir = sys.argv[1] if self.siren_dir[-1] != '/': self.siren_dir += '/' self.entries = [] fils = os.listdir(self.siren_dir) self.help = '' self.about = '' self.weather_icon = 'weather.png' config = ConfigParser.RawConfigParser() ignore = ['getfiles.ini', 'siren_default.ini', 'siren_windows_default.ini'] for fil in sorted(fils): if fil[-4:] == '.ini': if fil in ignore: continue try: config.read(self.siren_dir + fil) except: continue try: model_name = config.get('Base', 'name') except: model_name = '' self.entries.append([fil, model_name]) if self.about == '': try: self.about = config.get('Files', 'about') if not os.path.exists(self.about): self.about = '' except: pass if self.help == '': try: self.help = config.get('Files', 'help') if not os.path.exists(self.help): self.help = '' except: pass try: mb = config.get('View', 'menu_background') if mb.lower() != 'b': self.weather_icon = 'weather_b.png' except: pass if len(self.entries) == 0: self.new() # if len(entries) == 1: # self.invoke(entries[0][0]) # sys.exit() self.setWindowTitle('SIREN (' + fileVersion() + ') - Select SIREN Model') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) buttonLayout = QtGui.QHBoxLayout() self.quitButton = QtGui.QPushButton(self.tr('&Quit')) buttonLayout.addWidget(self.quitButton) self.connect(self.quitButton, QtCore.SIGNAL('clicked()'), self.quit) QtGui.QShortcut(QtGui.QKeySequence('q'), self, self.quit) self.newButton = QtGui.QPushButton(self.tr('&New Model')) buttonLayout.addWidget(self.newButton) self.connect(self.newButton, QtCore.SIGNAL('clicked()'), self.new) buttons = QtGui.QFrame() buttons.setLayout(buttonLayout) layout = QtGui.QGridLayout() self.table = QtGui.QTableWidget() self.table.setRowCount(len(self.entries)) self.table.setColumnCount(2) hdr_labels = ['Preference File', 'SIREN Model'] self.table.setHorizontalHeaderLabels(hdr_labels) self.headers = self.table.horizontalHeader() self.headers.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.headers.customContextMenuRequested.connect(self.header_click) self.headers.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) self.table.verticalHeader().setVisible(False) self.table.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) max_row = 30 for rw in range(len(self.entries)): ln = 0 for cl in range(2): self.table.setItem(rw, cl, QtGui.QTableWidgetItem(self.entries[rw][cl])) ln += len(self.entries[rw][cl]) if ln > max_row: max_row = ln self.sort_asc = True self.sort_col = 0 self.table.resizeColumnsToContents() self.table.itemClicked.connect(self.Clicked) fnt = self.table.fontMetrics() ln = max_row * max(9, fnt.averageCharWidth()) ln2 = (len(self.entries) + 8) * (fnt.xHeight() + fnt.lineSpacing()) screen = QtGui.QDesktopWidget().screenGeometry() if ln > screen.width() * .9: ln = int(screen.width() * .9) if ln2 > screen.height() * .9: ln2 = int(screen.height() * .9) layout.addWidget(QtGui.QLabel('Click on row for Desired Model; Right click column header to sort'), 0, 0) layout.addWidget(self.table, 1, 0) layout.addWidget(buttons, 2, 0) menubar = QtGui.QMenuBar() utilities = ['getmap', 'getmerra2', 'makeweather2', 'sirenupd'] utilicon = ['map.png', 'download.png', self.weather_icon, 'download.png'] spawns = [] icons = [] if sys.platform == 'win32' or sys.platform == 'cygwin': for i in range(len(utilities)): if os.path.exists(utilities[i] + '.exe'): spawns.append(utilities[i] + '.exe') icons.append(utilicon[i]) else: if os.path.exists(utilities[i] + '.py'): spawns.append(utilities[i] + '.py') icons.append(utilicon[i]) else: for i in range(len(utilities)): if os.path.exists(utilities[i] + '.py'): spawns.append(utilities[i] + '.py') icons.append(utilicon[i]) if len(spawns) > 0: spawnitem = [] spawnMenu = menubar.addMenu('&Tools') for i in range(len(spawns)): if type(spawns[i]) is list: who = spawns[i][0][:spawns[i][0].find('.')] else: who = spawns[i][:spawns[i].find('.')] spawnitem.append(QtGui.QAction(QtGui.QIcon(icons[i]), who, self)) spawnitem[-1].triggered.connect(partial(self.spawn, spawns[i])) spawnMenu.addAction(spawnitem[-1]) layout.setMenuBar(menubar) help = QtGui.QAction(QtGui.QIcon('help.png'), 'Help', self) help.setShortcut('F1') help.setStatusTip('Help') help.triggered.connect(self.showHelp) about = QtGui.QAction(QtGui.QIcon('about.png'), 'About', self) about.setShortcut('Ctrl+I') about.setStatusTip('About') about.triggered.connect(self.showAbout) helpMenu = menubar.addMenu('&Help') helpMenu.addAction(help) helpMenu.addAction(about) self.setLayout(layout) size = QtCore.QSize(ln, ln2) self.resize(size)
def __init__(self, parent=None): self.debug = False QtGui.QDialog.__init__(self, parent) self.setWindowTitle('SIREN Update (' + fileVersion() + ') - Check for new versions') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) row = 0 newgrid = QtGui.QGridLayout() host = 'https://sourceforge.net/projects/sensiren/files/' versions_file = 'siren_versions.csv' command = 'wget -O %s %s%s' % (versions_file, host, versions_file) command = command.split(' ') if self.debug: response = '200 OK' else: try: pid = subprocess.Popen(command, stderr=subprocess.PIPE) except: command[0] = command[0] + '.exe' pid = subprocess.Popen(command, stderr=subprocess.PIPE) response = get_response(pid.communicate()[1]) if response != '200 OK': newgrid.addWidget(QtGui.QLabel('Error encountered accessing siren_versions.csv\n\n' + \ response), 0, 0, 1, 4) row = 1 elif os.path.exists(versions_file): new_versions = [] versions = open(versions_file) programs = csv.DictReader(versions) for program in programs: version = fileVersion(program=program['Program']) if version != '?' and version != program['Version']: new_versions.append([program['Program'], version, program['Version']]) versions.close() if len(new_versions) > 0: newgrid.addWidget(QtGui.QLabel('New versions are available for the following programs.' + \ '\nChoose those you wish to update.' + \ '\nUpdates can take a while so please be patient.' + \ '\nContact [email protected] with any issues.'), 0, 0, 1, 4) self.table = QtGui.QTableWidget() self.table.setRowCount(len(new_versions)) self.table.setColumnCount(4) hdr_labels = ['', 'Program', 'New Ver.', 'Current / Status'] self.table.setHorizontalHeaderLabels(hdr_labels) self.table.verticalHeader().setVisible(False) self.newbox = [] self.newprog = [] rw = -1 for new_version in new_versions: rw += 1 self.newbox.append(QtGui.QTableWidgetItem()) self.newprog.append(new_version[0]) self.newbox[-1].setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled) self.newbox[-1].setCheckState(QtCore.Qt.Unchecked) self.table.setItem(rw, 0, self.newbox[-1]) self.table.setItem(rw, 1, QtGui.QTableWidgetItem(new_version[0])) self.table.setItem(rw, 2, QtGui.QTableWidgetItem(new_version[2])) self.table.setItem(rw, 3, QtGui.QTableWidgetItem(new_version[1])) self.table.resizeColumnsToContents() self.table.setColumnWidth(0, 29) newgrid.addWidget(self.table, 1, 0, 1, 4) doit = QtGui.QPushButton('Update') doit.clicked.connect(self.doitClicked) newgrid.addWidget(doit, 2, 1) row = 2 else: newgrid.addWidget(QtGui.QLabel('No new versions available.'), 0, 0, 1, 4) row = 1 else: newgrid.addWidget(QtGui.QLabel('No versions file available.'), 0, 0, 1, 4) row = 1 quit = QtGui.QPushButton('Quit') quit.clicked.connect(self.quit) QtGui.QShortcut(QtGui.QKeySequence('q'), self, self.quit) newgrid.addWidget(quit, row, 0) self.setLayout(newgrid)
def __init__(self, upper_lat, upper_lon, lower_lat, lower_lon, output, zoom=None, url=None, width=None, height=None, caller=None): if len(sys.argv) > 1 and sys.argv[1][-4:] != '.ini': self.batch = True else: self.batch = False self.caller = caller self.log = '' self.properties = '' config_file = 'getfiles.ini' config = configparser.RawConfigParser() config.read(config_file) if width != None and height != None: # Mapquest map try: url = config.get('getmap', 'mapquest_url') except: url = 'www.mapquestapi.com' try: tail = config.get('getmap', 'mapquest_tail') except: tail = '/staticmap/v4/getmap?type=sat&margin=0&bestfit=%s,%s,%s,%s&size=%s,%s&imagetype=%s' url_tail = tail % (upper_lat, upper_lon, lower_lat, lower_lon, width, height, output[output.rfind('.') + 1:]) try: url_key = '&key=' + config.get('getmap', 'mapquest_key') except: url_key = '&key=yWspjYHSK6FHtNLzZVcqP3WBxSWSwEo8' if self.batch: print(url + url_tail) user_agent = { 'User-agent': 'getmap ' + fileVersion() + ' contact [email protected]' } http = PoolManager(headers=user_agent) if self.batch: print('Requesting ' + url_tail) response = http.request('GET', url + url_tail + url_key) if response.status == 200 and response.reason == 'OK': if self.batch: print(url_tail + ' retrieved') f = open(output, 'wb') f.write(response.data) f.close() self.log += '\nSaving map to ' + output self.properties = 'map_choice=?' self.properties += '\nmap=%s' % (output) self.properties += '\nupper_left=%1.3f, %1.3f' % (upper_lat, upper_lon) self.properties += '\nlower_right=%1.3f, %1.3f' % (lower_lat, lower_lon) else: if self.batch: print(url_tail + ' failed') print(str(response.status) + ' ' + response.reason) return if url is None: try: self.url = config.get('getmap', 'url_template') except: self.url = 'https://[abc].tile.openstreetmap.org/zoom/x/y.png' else: self.url = url top_left = self.deg2num(upper_lat, upper_lon, zoom) bottom_right = self.deg2num(lower_lat, lower_lon, zoom) height = (bottom_right[1] - top_left[1] + 1) * 256 width = (bottom_right[0] - top_left[0] + 1) * 256 st, wt, nt, et = self.tileEdges(top_left[0], top_left[1], zoom) sb, wb, nb, eb = self.tileEdges(bottom_right[0], bottom_right[1], zoom) if self.batch: print( '(185)', '%d: %d,%d --> %1.3f :: %1.3f, %1.3f :: %1.3f' % (zoom, top_left[0], top_left[1], st, nt, wt, et)) print( '(186)', '%d: %d,%d --> %1.3f :: %1.3f, %1.3f :: %1.3f' % (zoom, bottom_right[0], bottom_right[1], sb, nb, wb, eb)) w = bottom_right[0] - top_left[0] + 1 h = bottom_right[1] - top_left[1] + 1 if self.batch: print(w, h, '=', w * h, 'tiles.', w * 256, 'x', h * 256, 'pixels (approx.', w * 256 * h * 256, 'uncompressed bytes)') print('map_choice=%s' % (zoom)) print('map%s=%s' % (zoom, output)) print('upper_left%d=%1.3f, %1.3f' % (zoom, nt, wt)) print('lower_right%d=%1.3f, %1.3f' % (zoom, sb, eb)) if output == '?' or output == '': sys.exit() else: self.log = '%s x %s = %s tiles. %s x %s pixels (approx. %s uncompressed bytes)' % ( w, h, w * h, '{:,}'.format(w * 256), '{:,}'.format( h * 256), "{:,}".format(w * 256 * h * 256)) self.properties = 'map_choice=%s' % (zoom) self.properties += '\nmap%s=%s' % (zoom, output) self.nt, self.wt, self.sb, self.eb = nt, wt, sb, eb self.properties += '\nupper_left%d=%1.3f, %1.3f' % (zoom, nt, wt) self.properties += '\nlower_right%d=%1.3f, %1.3f' % (zoom, sb, eb) if output == '?' or output == '': return i = self.url.find('//') if i >= 0: self.url = self.url[i + 2:] i = self.url.find('/') self.url_tail = self.url[i:] self.url = self.url[:i] self.subs = [] i = self.url.find('[') if i >= 0: j = self.url.find(']', i) if j > 0: for k in range(i + 1, j): self.subs.append(self.url[k]) if i > 0: self.url = self.url[:i + 1] + self.url[j:] else: self.url = self.url[0] + self.url[j:] self.sub_ctr = -1 self.tmp_location = tempfile.gettempdir() + '/' i = output.rfind('.') if i < 0: fname = output + '.png' else: fname = output outputimg = QtGui.QPixmap(width, height) painter = QtGui.QPainter(outputimg) if self.batch: print('Saving map to ' + fname) else: self.log += '\nSaving map to ' + fname tl = 0 self.caller.progressbar.setMaximum( (bottom_right[0] - top_left[0] + 1) * (bottom_right[1] - top_left[1] + 1) - 1) self.caller.progresslabel.setText('Downloading tiles') for x in range(top_left[0], bottom_right[0] + 1): for y in range(top_left[1], bottom_right[1] + 1): msg, tile = self.writetile(x, y, zoom) if msg != 'OK': if self.batch: print(msg) else: self.log += '\n' + msg painter.end() return foo = QtGui.QImage(self.tmp_location + tile) painter.drawImage( QtCore.QPoint(256 * (x - top_left[0]), 256 * (y - top_left[1])), foo) if not self.batch: tl += 1 self.caller.progressbar.setValue(tl) outputimg.save(fname, fname[i + 1:]) painter.end() if len(sys.argv) == 1: self.log += '\nDone'
def eventFilter(self, source, event): if self.table.selectedIndexes() != []: if event.type() == QtCore.QEvent.MouseButtonRelease and \ event.button() == QtCore.Qt.LeftButton: ent = self.table.item(self.table.currentRow(), 0).text() self.table.viewport().removeEventFilter(self) self.invoke('sirenm', self.siren_dir + ent) self.quit() if (event.type() == QtCore.QEvent.MouseButtonPress or event.type() == QtCore.QEvent.MouseButtonRelease) and \ event.button() == QtCore.Qt.RightButton: ent = self.table.item(self.table.currentRow(), 0).text() index = self.table.indexAt(event.pos()) selectionModel = self.table.selectionModel() selectionModel.select( self.table.model().index(self.table.currentRow(), 0), selectionModel.Deselect | selectionModel.Rows) selectionModel.select(self.table.model().index(index.row(), 0), selectionModel.Rows) menu = QtWidgets.QMenu() actions = [] for i in range(len(self.model_tool)): if self.model_tool[i] == 'updateswis': mdl = self.table.item(self.table.currentRow(), 1).text() if mdl.find('SWIS') < 0: continue actions.append( menu.addAction(QtGui.QIcon(self.model_icon[i]), 'Execute ' + self.model_tool[i])) actions[-1].setIconVisibleInMenu(True) actions.append( menu.addAction(QtGui.QIcon('edit.png'), 'Edit Preferences')) actions[-1].setIconVisibleInMenu(True) actions.append( menu.addAction(QtGui.QIcon('edit.png'), 'Edit File Preferences')) actions[-1].setIconVisibleInMenu(True) action = menu.exec_(self.mapToGlobal(event.pos())) if action is not None: if action.text()[:8] == 'Execute ': if not self.entries[self.table.currentRow()][3]: ok, model_name, errors = self.check_file(ent) if len(errors) > 0: dialog = displayobject.AnObject( QtWidgets.QDialog(), errors, title='SIREN (' + fileVersion() + ') - Preferences file errors') dialog.exec_() return QtCore.QObject.event(source, event) self.invoke(action.text()[8:], self.siren_dir + ent) elif action.text()[-11:] == 'Preferences': i = self.table.item(self.table.currentRow(), 1).text().find('[line ') if i >= 0: j = self.table.item(self.table.currentRow(), 1).text().find(']', i) line = int( self.table.item(self.table.currentRow(), 1).text()[i + 5:j].strip()) - 1 else: line = None if action.text()[-16:] == 'File Preferences': self.editIniFileSects(self.siren_dir + ent) else: self.editIniFile(self.siren_dir + ent, line=line) ok, model_name, errors = self.check_file(ent) if model_name != self.entries[ self.table.currentRow()][1]: self.entries[ self.table.currentRow()][1] = model_name self.table.setItem( self.table.currentRow(), 1, QtWidgets.QTableWidgetItem(model_name)) if len(errors) > 0: self.entries[self.table.currentRow()][3] = False dialog = displayobject.AnObject( QtWidgets.QDialog(), errors, title='SIREN (' + fileVersion() + ') - Preferences file errors') dialog.exec_() return QtCore.QObject.event(source, event) else: self.entries[self.table.currentRow()][3] = True return QtCore.QObject.event(source, event)
def __init__(self, siren_dir=None, help='help.html'): super(makeNew, self).__init__() self.siren_dir = siren_dir self.help = help self.ini_file = '' if sys.platform == 'win32' or sys.platform == 'cygwin': ini_file = 'siren_windows_default.ini' else: ini_file = 'siren_default.ini' if os.path.exists(self.siren_dir + ini_file): ini_file = self.siren_dir + ini_file else: if not os.path.exists(ini_file): return file_sects = ['[Parents]', '[Files]', '[SAM Modules]'] dir_props = [ 'pow_files', 'sam_sdk', 'scenarios', 'solar_files', 'variable_files', 'wind_files' ] field_props = ['scenario_prefix'] inf = open(ini_file, 'r') lines = inf.readlines() inf.close() sections = {} props = [] for line in lines: if line[0] == ';' or line[0] == '#': continue if line[0] == '[': if len(props) > 0: sections[section] = props j = line.find(']') section = line[:j + 1] props = [] else: j = line.find('=') if line[j + 1] == '<' or section == '[Parents]': prop = line[j + 1:].lstrip('<').strip().rstrip('>') props.append([line[:j], prop]) if len(props) > 0: sections[section] = props row = 0 self.fields = [] self.fields.append( ['section', 'typ', 'name', 'value', QtWidgets.QLineEdit()]) self.grid = QtWidgets.QGridLayout() self.grid.addWidget(QtWidgets.QLabel('New file name:'), row, 0) self.fields[row][4].setText('siren_new.ini') self.grid.addWidget(self.fields[row][4], row, 1) self.fields[row][4].textChanged.connect(self.filenameChanged) self.msg = QtWidgets.QLabel('') self.grid.addWidget(self.msg, row, 2, 1, 3) now = datetime.datetime.now() if '[Base]' in list(sections.keys()): for key, value in sections['[Base]']: row += 1 self.fields.append( ['[Base]', 'txt', key, value, QtWidgets.QLineEdit()]) if key == 'year': self.fields[-1][3] = str((now.year - 1)) if self.fields[row][0] != self.fields[row - 1][0]: self.grid.addWidget(QtWidgets.QLabel(self.fields[row][0]), row, 0) self.grid.addWidget(QtWidgets.QLabel(self.fields[row][2]), row, 1) self.fields[row][4].setText(self.fields[row][3]) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) self.parents = {} sections['[Parents]'].append(['$USER$', getUser()]) sections['[Parents]'].append(['$YEAR$', str(now.year - 1)]) if '[Parents]' in list(sections.keys()): for key, value in sections['[Parents]']: self.parents[key] = value row += 1 self.fields.append(['[Parents]', '?', key, value, '?']) if self.fields[row][0] != self.fields[row - 1][0]: self.grid.addWidget(QtWidgets.QLabel(self.fields[row][0]), row, 0) self.grid.addWidget(QtWidgets.QLabel(self.fields[row][2]), row, 1) if key == '$USER$' or key == '$YEAR$': self.fields[row][1] = 'txt' self.fields[row][4] = QtWidgets.QLabel(self.fields[row][3]) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) else: self.fields[row][1] = 'dir' self.fields[row][4] = ClickableQLabel() self.fields[row][4].setText(self.fields[row][3]) self.fields[row][4].setStyleSheet( "background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;" ) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) self.fields[row][4].clicked.connect(self.itemClicked) for section, props in sections.items(): if section == '[Base]' or section == '[Parents]': continue elif section == '[Map]': for prop in props: row += 1 self.fields.append([section, '?', prop[0], prop[1], '?']) if self.fields[row][0] != self.fields[row - 1][0]: self.grid.addWidget( QtWidgets.QLabel(self.fields[row][0]), row, 0) self.grid.addWidget(QtWidgets.QLabel(self.fields[row][2]), row, 1) if prop[0] == 'map' or (prop[0][:3] == 'map' and prop[0][3] != '_'): self.fields[row][3] = prop[1] self.fields[row][1] = 'fil' self.fields[row][4] = ClickableQLabel() self.fields[row][4].setStyleSheet( "background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;" ) self.fields[row][4].clicked.connect(self.itemClicked) else: self.fields[row][1] = 'txt' self.fields[row][4] = QtWidgets.QLineEdit() self.fields[row][4].setText(self.fields[row][3]) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) elif section in file_sects: for prop in props: row += 1 self.fields.append([section, '?', prop[0], prop[1], '?']) if self.fields[row][0] != self.fields[row - 1][0]: self.grid.addWidget( QtWidgets.QLabel(self.fields[row][0]), row, 0) self.grid.addWidget(QtWidgets.QLabel(self.fields[row][2]), row, 1) self.fields[row][3] = prop[1] if prop[0] in field_props: self.fields[row][1] = 'txt' self.fields[row][4] = QtWidgets.QLineEdit() self.fields[row][4].setText(self.fields[row][3]) else: if prop[0] in dir_props: self.fields[row][1] = 'dir' else: self.fields[row][1] = 'fil' self.fields[row][4] = ClickableQLabel() self.fields[row][4].setText(self.fields[row][3]) self.fields[row][4].setStyleSheet( "background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;" ) self.fields[row][4].clicked.connect(self.itemClicked) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) else: for prop in props: row += 1 self.fields.append([ section, 'txt', prop[0], prop[1], QtWidgets.QLineEdit() ]) if self.fields[row][0] != self.fields[row - 1][0]: self.grid.addWidget( QtWidgets.QLabel(self.fields[row][0]), row, 0) self.grid.addWidget(QtWidgets.QLabel(self.fields[row][2]), row, 1) self.fields[row][4].setText(self.fields[row][3]) self.grid.addWidget(self.fields[row][4], row, 2, 1, 3) row += 1 quit = QtWidgets.QPushButton('Quit', self) self.grid.addWidget(quit, row, 0) quit.clicked.connect(self.quitClicked) QtWidgets.QShortcut(QtGui.QKeySequence('q'), self, self.quitClicked) save = QtWidgets.QPushButton('Save', self) self.grid.addWidget(save, row, 1) save.clicked.connect(self.saveClicked) launch = QtWidgets.QPushButton('Save && Open', self) self.grid.addWidget(launch, row, 3) launch.clicked.connect(self.saveLaunch) wdth = save.fontMetrics().boundingRect(launch.text()).width() + 9 launch.setMaximumWidth(wdth) edit = QtWidgets.QPushButton('Save && Edit', self) self.grid.addWidget(edit, row, 2) edit.clicked.connect(self.saveEdit) edit.setMaximumWidth(wdth) help = QtWidgets.QPushButton('Help', self) help.setMaximumWidth(wdth) self.grid.addWidget(help, row, 4) help.clicked.connect(self.helpClicked) QtWidgets.QShortcut(QtGui.QKeySequence('F1'), self, self.helpClicked) self.grid.setColumnStretch(2, 5) frame = QtWidgets.QFrame() frame.setLayout(self.grid) self.scroll = QtWidgets.QScrollArea() self.scroll.setWidgetResizable(True) self.scroll.setWidget(frame) self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(self.scroll) utilities = ['getmap', 'getmerra2', 'makeweatherfiles', 'sirenupd'] utilicon = ['map.png', 'download.png', 'weather.png', 'download.png'] spawns = [] icons = [] if sys.platform == 'win32' or sys.platform == 'cygwin': for i in range(len(utilities)): if os.path.exists(utilities[i] + '.exe'): spawns.append(utilities[i] + '.exe') icons.append(utilicon[i]) else: if os.path.exists(utilities[i] + '.py'): spawns.append(utilities[i] + '.py') icons.append(utilicon[i]) else: for i in range(len(utilities)): if os.path.exists(utilities[i] + '.py'): spawns.append(utilities[i] + '.py') icons.append(utilicon[i]) if len(spawns) > 0: spawnitem = [] menubar = QtWidgets.QMenuBar() spawnMenu = menubar.addMenu('&Tools') for i in range(len(spawns)): if type(spawns[i]) is list: who = spawns[i][0][:spawns[i][0].find('.')] else: who = spawns[i][:spawns[i].find('.')] spawnitem.append( QtWidgets.QAction(QtGui.QIcon(icons[i]), who, self)) spawnitem[-1].triggered.connect(partial(self.spawn, spawns[i])) spawnMenu.addAction(spawnitem[-1]) self.layout.setMenuBar(menubar) self.setWindowTitle('SIREN (' + fileVersion() + ') - Create Preferences file') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) self.show()
def __init__(self, parent=None): QtWidgets.QDialog.__init__(self, parent) self.siren_dir = '.' if len(sys.argv) > 1: if sys.argv[1][-4:] == '.ini': self.invoke('sirenm', sys.argv[1]) sys.exit() elif os.path.isdir(sys.argv[1]): self.siren_dir = sys.argv[1] if sys.platform == 'win32' or sys.platform == 'cygwin': if self.siren_dir[-1] != '\\' and self.siren_dir[-1] != '/': self.siren_dir += '\\' elif self.siren_dir[-1] != '/': self.siren_dir += '/' else: self.siren_dir = getModelFile() self.entries = [] fils = os.listdir(self.siren_dir) self.help = 'help.html' self.about = 'about.html' self.config = configparser.RawConfigParser() ignore = [ 'flexiplot.ini', 'getfiles.ini', 'powerplot.ini', 'siren_default.ini', 'siren_windows_default.ini' ] errors = '' for fil in sorted(fils): if fil[-4:] == '.ini': if fil in ignore: continue mod_time = time.strftime( '%Y-%m-%d %H:%M:%S', time.localtime(os.path.getmtime(self.siren_dir + fil))) ok, model_name, errors = self.check_file(fil, errors) self.entries.append([fil, model_name, mod_time, ok]) if len(errors) > 0: dialog = displayobject.AnObject(QtWidgets.QDialog(), errors, title='SIREN (' + fileVersion() + ') - Preferences file errors') dialog.exec_() if len(self.entries) == 0: self.new() self.setWindowTitle('SIREN (' + fileVersion() + ') - Select SIREN Model') self.setWindowIcon(QtGui.QIcon('sen_icon32.ico')) buttonLayout = QtWidgets.QHBoxLayout() self.quitButton = QtWidgets.QPushButton(self.tr('&Quit')) buttonLayout.addWidget(self.quitButton) self.quitButton.clicked.connect(self.quit) QtWidgets.QShortcut(QtGui.QKeySequence('q'), self, self.quit) self.newButton = QtWidgets.QPushButton(self.tr('&New Model')) buttonLayout.addWidget(self.newButton) self.newButton.clicked.connect(self.new) buttons = QtWidgets.QFrame() buttons.setLayout(buttonLayout) layout = QtWidgets.QGridLayout() self.table = QtWidgets.QTableWidget() self.table.setRowCount(len(self.entries)) self.table.setColumnCount(3) hdr_labels = ['Preference File', 'SIREN Model', 'Date modified'] self.table.setHorizontalHeaderLabels(hdr_labels) self.headers = self.table.horizontalHeader() self.headers.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.headers.customContextMenuRequested.connect(self.header_click) self.headers.setSelectionMode( QtWidgets.QAbstractItemView.SingleSelection) self.table.verticalHeader().setVisible(False) self.table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) max_row = 30 for rw in range(len(self.entries)): ln = 0 for cl in range(3): self.table.setItem( rw, cl, QtWidgets.QTableWidgetItem(self.entries[rw][cl])) ln += len(self.entries[rw][cl]) if ln > max_row: max_row = ln self.sort_desc = False # start in date descending order self.sort_col = 2 self.order(2) self.table.resizeColumnsToContents() self.table.viewport().installEventFilter(self) fnt = self.table.fontMetrics() ln = max_row * max(9, fnt.averageCharWidth()) ln2 = (len(self.entries) + 8) * (fnt.xHeight() + fnt.lineSpacing()) screen = QtWidgets.QDesktopWidget().screenGeometry() if ln > screen.width() * .9: ln = int(screen.width() * .9) if ln2 > screen.height() * .9: ln2 = int(screen.height() * .9) layout.addWidget( QtWidgets.QLabel( 'Left click on row for Desired Model or right click for Tools; Right click column header to sort' ), 0, 0) layout.addWidget(self.table, 1, 0) layout.addWidget(buttons, 2, 0) menubar = QtWidgets.QMenuBar() utilities = [ 'flexiplot', 'getmap', 'getmerra2', 'makeweatherfiles', 'powerplot', 'sirenupd' ] utilicon = [ 'line.png', 'map.png', 'download.png', 'weather.png', 'line.png', 'download.png' ] spawns = [] icons = [] if sys.platform == 'win32' or sys.platform == 'cygwin': for i in range(len(utilities)): if os.path.exists(utilities[i] + '.exe'): spawns.append(utilities[i] + '.exe') icons.append(utilicon[i]) else: if os.path.exists(utilities[i] + '.py'): spawns.append(utilities[i] + '.py') icons.append(utilicon[i]) else: for i in range(len(utilities)): if os.path.exists(utilities[i] + '.py'): spawns.append(utilities[i] + '.py') icons.append(utilicon[i]) if len(spawns) > 0: spawnitem = [] spawnMenu = menubar.addMenu('&Tools') for i in range(len(spawns)): if type(spawns[i]) is list: who = spawns[i][0][:spawns[i][0].find('.')] else: who = spawns[i][:spawns[i].find('.')] spawnitem.append( QtWidgets.QAction(QtGui.QIcon(icons[i]), who, self)) spawnitem[-1].triggered.connect(partial(self.spawn, spawns[i])) spawnMenu.addAction(spawnitem[-1]) layout.setMenuBar(menubar) self.model_tool = [ 'flexiplot', 'getmap', 'indexweather', 'makegrid', 'powermatch', 'powerplot', 'sirenm', 'updateswis' ] self.model_icon = [ 'line.png', 'map.png', 'list.png', 'grid.png', 'power.png', 'line.png', 'sen_icon32.png', 'list.png' ] help = QtWidgets.QAction(QtGui.QIcon('help.png'), 'Help', self) help.setShortcut('F1') help.setStatusTip('Help') help.triggered.connect(self.showHelp) about = QtWidgets.QAction(QtGui.QIcon('about.png'), 'About', self) about.setShortcut('Ctrl+I') about.setStatusTip('About') about.triggered.connect(self.showAbout) helpMenu = menubar.addMenu('&Help') helpMenu.addAction(help) helpMenu.addAction(about) self.setLayout(layout) size = QtCore.QSize(ln, ln2) self.resize(size)
def helpClicked(self): dialog = displayobject.AnObject(QtWidgets.QDialog(), self.help, title='Help for getting MERRA-2 data (' + fileVersion() + ')', section='getmerra2') dialog.exec_()
def doitClicked(self): def do_zipfile(zip_in, temp_dir): # copy multiple files zf = zipfile.ZipFile(zip_in, 'r') ctr = 0 for zi in zf.infolist(): if zi.filename[:-4] == '.exe': if temp_dir is None: temp_dir = tempfile.gettempdir() + '/' zf.extract(zi, temp_dir) newver = credits.fileVersion(program=temp_dir + zi.filename) if newver != '?': curver = credits.fileVersion(program=zi.filename) if newver > curver or curver == '?': if not self.debug: if os.path.exists(zi.filename + '~'): os.remove(zi.filename + '~') if cur_verson != '?': os.rename(zi.filename, zi_filename + '~') os.rename(temp_dir + zi.filename, zi.filename) ctr += 1 else: newtime = datetime.fromtimestamp( time.mktime(zi.date_time + (0, 0, -1))) try: curtime = datetime.fromtimestamp( int(os.path.getmtime(zi.filename))) except: curtime = 0 if curtime == 0 or newtime > curtime: # print(zi.filename, newtime, curtime) if not self.debug: if os.path.exists(zi.filename + '~'): os.remove(zi.filename + '~') if curtime != 0: os.rename(zi.filename, zi.filename + '~') zf.extract(zi) date_time = time.mktime(zi.date_time + (0, 0, -1)) os.utime(zi.filename, (date_time, date_time)) ctr += 1 if ctr == 0: msg = 'Current is newer' else: msg = f'Updated {ctr} files' return msg default_suffix = sys.argv[0][sys.argv[0].rfind('.'):] temp_dir = None for p in range(len(self.newbox)): if self.newbox[p].checkState() == QtCore.Qt.Checked: self.newbox[p].setCheckState(QtCore.Qt.Unchecked) self.newbox[p].setFlags(self.newbox[p].flags() ^ QtCore.Qt.ItemIsUserCheckable) s = self.newprog[p].rfind('.') if s < 0: newprog = self.newprog[p] suffix = default_suffix else: newprog = self.newprog[p][:s] suffix = self.newprog[p][s:] if self.table.item(p, 2).text().find('(local)') > 0: if suffix == '.zip': # copy multiple files msg = do_zipfile(self.local + newprog + suffix, temp_dir) self.table.setItem(p, 3, QtWidgets.QTableWidgetItem(msg)) continue else: curver = credits.fileVersion(program=newprog + suffix) # print(newprog, suffix, curver, self.table.item(p, 2).text()) if curver != '?': if self.table.item(p, 2).text() < curver: self.table.setItem( p, 3, QtWidgets.QTableWidgetItem( 'Current is newer')) continue if not self.debug: if os.path.exists(newprog + suffix + '~'): os.remove(newprog + suffix + '~') os.rename(newprog + suffix, newprog + suffix + '~') copy2(self.local + newprog + suffix, newprog + suffix) self.table.setItem(p, 3, QtWidgets.QTableWidgetItem('Updated')) else: command = '%s %snew%s %s%s%s' % (self.wget_cmd, newprog, suffix, self.host, newprog, suffix) command = command.split() if self.debug: response = '200 OK' else: pid = subprocess.Popen(command, stderr=subprocess.PIPE) response = get_response(pid.communicate()[1]) if response != '200 OK': errmsg = 'Error ' + response self.table.setItem( p, 3, QtWidgets.QTableWidgetItem(errmsg)) continue if suffix == '.zip': # copy multiple files msg = do_zipfile(newprog + 'new' + suffix, temp_dir) self.table.setItem(p, 3, QtWidgets.QTableWidgetItem(msg)) continue else: if os.path.exists(newprog + 'new' + suffix): newver = credits.fileVersion(program=newprog + 'new') if newver != '?': if newver < self.table.item(p, 3).text(): if not self.debug: os.rename( newprog + 'new' + suffix, newprog + '.' + newver + suffix) self.table.setItem( p, 3, QtWidgets.QTableWidgetItem( 'Current is newer')) continue if not self.debug: if os.path.exists(newprog + suffix + '~'): os.remove(newprog + suffix + '~') os.rename(newprog + suffix, newprog + suffix + '~') os.rename(newprog + 'new' + suffix, newprog + suffix) self.table.setItem(p, 3, QtWidgets.QTableWidgetItem('Updated')) self.table.resizeColumnsToContents()