diff --git a/QtPyLoT.py b/QtPyLoT.py index 7935eafb..dab59da8 100755 --- a/QtPyLoT.py +++ b/QtPyLoT.py @@ -142,6 +142,9 @@ class MainWindow(QMainWindow): # setup UI self.setupUi() + if settings.value('compclass', None) is None: + settings.setValue('compclass', SetChannelComponents()) + if settings.value("user/FullName", None) is None: fulluser = QInputDialog.getText(self, "Enter Name:", "Full name") settings.setValue("user/FullName", fulluser) diff --git a/pylot/RELEASE-VERSION b/pylot/RELEASE-VERSION index 92ef72a4..d9f17400 100644 --- a/pylot/RELEASE-VERSION +++ b/pylot/RELEASE-VERSION @@ -1 +1 @@ -0430-dirty +0fb6-dirty diff --git a/pylot/core/util/defaults.py b/pylot/core/util/defaults.py index e98ac5cc..68974f65 100644 --- a/pylot/core/util/defaults.py +++ b/pylot/core/util/defaults.py @@ -56,27 +56,55 @@ OUTPUTFORMATS = {'.xml': 'QUAKEML', LOCTOOLS = dict(nll=nll, hyposat=hyposat, velest=velest, hypo71=hypo71, hypodd=hypodd) -class SetChannelComponents: - def getdefaultCompPosition(): +class SetChannelComponents(object): + def __init__(self): + self.setDefaultCompPosition() + + def setDefaultCompPosition(self): # default component order - CompPosition_Map = dict(Z=2, N=1, E=0) - CompPosition_Map['1'] = 1 - CompPosition_Map['2'] = 0 - CompPosition_Map['3'] = 2 - CompName_Map = dict(Z='3', N='1', E='2') - CompName_Map['1'] = str(1) - CompName_Map['2'] = str(2) - CompName_Map['3'] = str(3) - return CompPosition_Map, CompName_Map + self.compPosition_Map = dict(Z=2, N=1, E=0) + self.compName_Map = {'3': 'Z', + '1': 'N', + '2': 'E'} + + def _getCurrentPosition(self, component): + for key, value in self.compName_Map.items(): + if value == component: + return key, value + errMsg = 'getCurrentPosition: Could not find former position of component {}.'.format(component) + raise ValueError(errMsg) - CompPosition_Map, CompName_Map = getdefaultCompPosition() + def _switch(self, component, component_alter): + # Without switching, multiple definitions of the same alter_comp are possible + old_alter_comp, _ = self._getCurrentPosition(component) + old_comp = self.compName_Map[component_alter] + if not old_alter_comp == component_alter and not old_comp == component: + self.compName_Map[old_alter_comp] = old_comp + print('switch: Automatically switched component {} to {}'.format(old_alter_comp, old_comp)) - def setCompPosition(self, component, position): - self.CompPosition_Map[component] = position - self.CompName_Map[component] = str(position) + def setCompPosition(self, component_alter, component, switch=True): + component_alter = str(component_alter) + if not component_alter in self.compName_Map.keys(): + errMsg='setCompPosition: Unrecognized alternative component {}. Expecting one of {}.' + raise ValueError(errMsg.format(component_alter, self.compName_Map.keys())) + if not component in self.compPosition_Map.keys(): + errMsg='setCompPosition: Unrecognized target component {}. Expecting one of {}.' + raise ValueError(errMsg.format(component, self.compPosition_Map.keys())) + print('setCompPosition: set component {} to {}'.format(component_alter, component)) + if switch: + self._switch(component, component_alter) + self.compName_Map[component_alter] = component - def getCompPosition(self, component): - self.comppos = self.CompPosition_Map[component] - self.compname = self.CompName_Map[component] - return self.comppos, self.compname + def getCompPosition(self, component): + return self._getCurrentPosition(component)[0] + + def getPlotPosition(self, component): + component = str(component) + if component in self.compPosition_Map.keys(): + return self.compPosition_Map[component] + elif component in self.compName_Map.keys(): + return self.compPosition_Map[self.compName_Map[component]] + else: + errMsg='getCompPosition: Unrecognized component {}. Expecting one of {} or {}.' + raise ValueError(errMsg.format(component, self.compPosition_Map.keys(), self.compName_Map.keys())) diff --git a/pylot/core/util/widgets.py b/pylot/core/util/widgets.py index fee3d411..5ba3801d 100644 --- a/pylot/core/util/widgets.py +++ b/pylot/core/util/widgets.py @@ -35,8 +35,7 @@ from pylot.core.io.inputs import FilterOptions, AutoPickParameter from pylot.core.pick.utils import getSNR, earllatepicker, getnoisewin, \ getResolutionWindow from pylot.core.pick.compare import Comparison -from pylot.core.util.defaults import OUTPUTFORMATS, FILTERDEFAULTS, LOCTOOLS, \ - SetChannelComponents +from pylot.core.util.defaults import OUTPUTFORMATS, FILTERDEFAULTS, LOCTOOLS from pylot.core.util.utils import prepTimeAxis, full_range, scaleWFData, \ demeanTrace, isSorted, findComboBoxIndex, clims from autoPyLoT import autoPyLoT @@ -437,11 +436,12 @@ class WaveformWidget(FigureCanvas): wfstart, wfend = full_range(wfdata) nmax = 0 - compclass = SetChannelComponents() + settings = QSettings() + compclass = settings.value('compclass') if not component == '*': alter_comp = compclass.getCompPosition(component) - alter_comp = str(alter_comp[0]) + #alter_comp = str(alter_comp[0]) wfdata = wfdata.select(component=component) wfdata += wfdata.select(component=alter_comp) @@ -458,8 +458,8 @@ class WaveformWidget(FigureCanvas): trace = st[0] if mapping: comp = channel[-1] - n = compclass.getCompPosition(str(comp)) - n = n[0] + n = compclass.getPlotPosition(str(comp)) + #n = n[0] if n > nmax: nmax = n msg = 'plotting %s channel of station %s' % (channel, station) @@ -480,7 +480,7 @@ class WaveformWidget(FigureCanvas): if iniPick: ax = self.getAxes() ax.vlines(iniPick, ax.get_ylim()[0], ax.get_ylim()[1], - colors='green', linestyles='dashed', + colors='m', linestyles='dashed', linewidth=2) self.setPlotDict(n, (station, channel, network)) xlabel = 'seconds since {0}'.format(wfstart) @@ -1109,7 +1109,8 @@ class PickDlg(QDialog): stime = self.getStartTime() stime_diff = wfdata[0].stats.starttime-stime - [epp, lpp, spe] = earllatepicker(wfdata, nfac, (TSNR[0], TSNR[1], TSNR[2]), pick-stime_diff, verbosity=2) + [epp, lpp, spe] = earllatepicker(wfdata, nfac, (TSNR[0], TSNR[1], TSNR[2]), + pick-stime_diff, verbosity=1) mpp = stime + pick if epp: @@ -2077,6 +2078,14 @@ class PropertiesDlg(QDialog): if values is not None: self.setValues(values) + def close(self): + self.reset_current() + QDialog.close(self) + + def show(self): + self.keep_current() + QDialog.show(self) + def restore(self): for widint in range(self.tabWidget.count()): curwid = self.tabWidget.widget(widint) @@ -2084,23 +2093,35 @@ class PropertiesDlg(QDialog): if values is not None: self.setValues(values) + def keep_current(self): + self._current_values = [] + for widint in range(self.tabWidget.count()): + curwid = self.tabWidget.widget(widint) + values = curwid.getValues() + if values is not None: + self._current_values.append(values) + + def reset_current(self): + for values in self._current_values(): + self.setValues(values) + @staticmethod def setValues(tabValues): settings = QSettings() - compclass = SetChannelComponents() + compclass = settings.value('compclass') for setting, value in tabValues.items(): settings.setValue(setting, value) if value is not None: if setting.startswith('Channel Z'): component = 'Z' - compclass.setCompPosition(component, value) + compclass.setCompPosition(value, component, False) elif setting.startswith('Channel E'): component = 'E' - compclass.setCompPosition(component, value) + compclass.setCompPosition(value, component, False) elif setting.startswith('Channel N'): component = 'N' - compclass.setCompPosition(component, value) + compclass.setCompPosition(value, component, False) settings.sync() @@ -2254,7 +2275,8 @@ class ChannelOrderTab(PropTab): def __init__(self, parent=None, infile=None): super(ChannelOrderTab, self).__init__(parent) - compclass = SetChannelComponents() + settings = QSettings() + compclass = settings.value('compclass') ChannelOrderLabelZ = QLabel("Channel Z [up/down, default=3]") ChannelOrderLabelN = QLabel("Channel N [north/south, default=1]") @@ -2269,9 +2291,9 @@ class ChannelOrderTab(PropTab): self.ChannelOrderEEdit.setMaxLength(1) self.ChannelOrderEEdit.setFixedSize(20, 20) # get channel order settings - zpos, zcomp = compclass.getCompPosition('Z') - epos, ecomp = compclass.getCompPosition('E') - npos, ncomp = compclass.getCompPosition('N') + zcomp = compclass.getCompPosition('Z') + ecomp = compclass.getCompPosition('E') + ncomp = compclass.getCompPosition('N') self.ChannelOrderZEdit.setText("%s" % zcomp) self.ChannelOrderNEdit.setText("%s" % ecomp) self.ChannelOrderEEdit.setText("%s" % ncomp) @@ -2285,7 +2307,34 @@ class ChannelOrderTab(PropTab): layout.addWidget(self.ChannelOrderEEdit, 2, 1) self.setLayout(layout) + self.connectSignals() + def connectSignals(self): + self.ChannelOrderZEdit.textEdited.connect(self.checkDoubleZ) + self.ChannelOrderNEdit.textEdited.connect(self.checkDoubleN) + self.ChannelOrderEEdit.textEdited.connect(self.checkDoubleE) + + def checkDoubleZ(self, text): + self.checkDouble(text, 'Z') + + def checkDoubleN(self, text): + self.checkDouble(text, 'N') + + def checkDoubleE(self, text): + self.checkDouble(text, 'E') + + def checkDouble(self, text, comp): + channelOrderEdits = { + 'Z': self.ChannelOrderZEdit, + 'N': self.ChannelOrderNEdit, + 'E': self.ChannelOrderEEdit + } + for key in channelOrderEdits.keys(): + if key == comp: + continue + if str(channelOrderEdits[key].text()) == str(text): + channelOrderEdits[key].setText('') + def getValues(self): values = {"Channel Z [up/down, default=3]": int(self.ChannelOrderZEdit.text()), "Channel N [north/south, default=1]": int(self.ChannelOrderNEdit.text()), @@ -2301,10 +2350,11 @@ class ChannelOrderTab(PropTab): "Channel E [east/west, default=2]": self.ChannelOrderEEdit.setText("%d" % Edefault)} return values - def getComponents(self): - - self.CompName = dict(Z='10', N='11', E='12') + # MP MP: No idea why this function exists!? + # def getComponents(self): + # self.CompName = dict(Z='10', N='11', E='12') + class LocalisationTab(PropTab): def __init__(self, parent=None, infile=None): super(LocalisationTab, self).__init__(parent)