Minor changes to adjust to python 3. Temporary Fix for file exporting not working properly. WIP spectrogram view.
This commit is contained in:
commit
e4e7afa996
84
PyLoT.py
84
PyLoT.py
@ -117,17 +117,19 @@ class MainWindow(QMainWindow):
|
||||
if not infile:
|
||||
infile = os.path.join(os.path.expanduser('~'), '.pylot', 'pylot.in')
|
||||
print('Using default input file {}'.format(infile))
|
||||
if os.path.isfile(infile) == False:
|
||||
infile = QFileDialog().getOpenFileName(caption='Choose PyLoT-input file')
|
||||
if os.path.isfile(infile) is False:
|
||||
infile = QFileDialog().getOpenFileName(caption='Choose PyLoT-input file')[0]
|
||||
|
||||
if not os.path.exists(infile[0]):
|
||||
if not os.path.exists(infile):
|
||||
QMessageBox.warning(self, "PyLoT Warning",
|
||||
"No PyLoT-input file declared!")
|
||||
sys.exit(0)
|
||||
self.infile = infile[0]
|
||||
else:
|
||||
self.infile = infile
|
||||
"No PyLoT-input file declared! Using default parameters!")
|
||||
infile = None
|
||||
|
||||
self._inputs = PylotParameter(infile)
|
||||
if not infile:
|
||||
self._inputs.reset_defaults()
|
||||
|
||||
self.infile = infile
|
||||
self._props = None
|
||||
|
||||
self.gain = 1.
|
||||
@ -481,7 +483,7 @@ class MainWindow(QMainWindow):
|
||||
"automatic pick "
|
||||
"data.", False)
|
||||
self.compare_action.setEnabled(False)
|
||||
self.qualities_action = self.createAction(parent=self, text='Show pick qualitites...',
|
||||
self.qualities_action = self.createAction(parent=self, text='Show pick qualities...',
|
||||
slot=self.pickQualities, shortcut='Alt+Q',
|
||||
icon=qualities_icon, tip='Histogram of pick qualities')
|
||||
self.qualities_action.setEnabled(False)
|
||||
@ -732,18 +734,15 @@ class MainWindow(QMainWindow):
|
||||
_widget.setLayout(self._main_layout)
|
||||
_widget.showFullScreen()
|
||||
|
||||
self.logwidget = LogWidget(parent=None)
|
||||
if use_logwidget:
|
||||
self.logwidget = LogWidget(parent=None)
|
||||
self.logwidget.show()
|
||||
self.stdout = self.logwidget.stdout
|
||||
self.stderr = self.logwidget.stderr
|
||||
|
||||
self.stdout = self.stdout
|
||||
self.stderr = self.stderr
|
||||
|
||||
# Not sure why but the lines above kept messing with the Ouput even with use_logwidget disabled
|
||||
sys.stdout = sys.__stdout__
|
||||
sys.stderr = sys.__stderr__
|
||||
sys.stdout = self.stdout
|
||||
sys.stderr = self.stderr
|
||||
|
||||
self.setCentralWidget(_widget)
|
||||
|
||||
@ -1181,7 +1180,7 @@ class MainWindow(QMainWindow):
|
||||
'''
|
||||
if not self.project:
|
||||
self.createNewProject()
|
||||
ed = getExistingDirectories(self, 'Select event directories...')
|
||||
ed = GetExistingDirectories(self, 'Select event directories...')
|
||||
if ed.exec_():
|
||||
eventlist = [event for event in ed.selectedFiles() if not event.endswith('EVENTS-INFO')]
|
||||
basepath = eventlist[0].split(os.path.basename(eventlist[0]))[0]
|
||||
@ -2517,13 +2516,9 @@ class MainWindow(QMainWindow):
|
||||
self.dataPlot.draw()
|
||||
|
||||
def pickOnStation(self, gui_event):
|
||||
sys.stdout = sys.__stdout__
|
||||
|
||||
print ( "xxxxxxxxxxx" )
|
||||
|
||||
if self.pg:
|
||||
button = gui_event.button()
|
||||
if not button in [1,2, 4]:
|
||||
if not button in [1, 4]:
|
||||
return
|
||||
else:
|
||||
button = gui_event.button
|
||||
@ -2543,25 +2538,8 @@ class MainWindow(QMainWindow):
|
||||
station = self.getStationName(wfID)
|
||||
location = self.getLocationName(wfID)
|
||||
seed_id = self.getTraceID(wfID)
|
||||
if button == 2:
|
||||
if button == 1:
|
||||
self.pickDialog(wfID, seed_id)
|
||||
elif button == 1:
|
||||
print ( " XXX " )
|
||||
stations = []
|
||||
names = []
|
||||
traces = {}
|
||||
|
||||
for tr in self.get_data().wfdata.traces:
|
||||
if not tr.stats.station in stations:
|
||||
stations.append(tr.stats.station)
|
||||
names.append(tr.stats.network + '.' + tr.stats.station)
|
||||
for station in stations:
|
||||
traces[station] = {}
|
||||
for ch in ['Z', 'N', 'E']:
|
||||
for tr in self.get_data().wfdata.select(component=ch).traces:
|
||||
traces[tr.stats.station][ch] = tr
|
||||
print ( traces[station]['Z'] )
|
||||
print ( "XXXXXXXXXXXXXXXXXXXXXXXXXXX" )
|
||||
elif button == 4:
|
||||
self.toggle_station_color(wfID, network, station, location)
|
||||
|
||||
@ -2919,7 +2897,9 @@ class MainWindow(QMainWindow):
|
||||
self.log_deleted_picks([deleted_pick])
|
||||
|
||||
def log_deleted_picks(self, deleted_picks, event_path=None):
|
||||
''' Log deleted picks to list self.deleted_picks '''
|
||||
'''
|
||||
Log deleted picks to list self.deleted_picks
|
||||
'''
|
||||
if not event_path:
|
||||
event_path = self.get_current_event_path()
|
||||
for deleted_pick in deleted_picks:
|
||||
@ -2933,7 +2913,9 @@ class MainWindow(QMainWindow):
|
||||
self.deleted_picks[event_path].append(deleted_pick)
|
||||
|
||||
def dump_deleted_picks(self, event_path):
|
||||
''' Save deleted picks to json file for event in event_path. Load old file before and merge'''
|
||||
'''
|
||||
Save deleted picks to json file for event in event_path. Load old file before and merge
|
||||
'''
|
||||
try:
|
||||
deleted_picks_from_file = self.load_deleted_picks(event_path)
|
||||
except Exception as e:
|
||||
@ -3843,7 +3825,7 @@ class MainWindow(QMainWindow):
|
||||
def helpHelp(self):
|
||||
if checkurl():
|
||||
form = HelpForm(self,
|
||||
'https://ariadne.geophysik.ruhr-uni-bochum.de/trac/PyLoT/wiki')
|
||||
'https://github.com/seismology-RUB/PyLoT')
|
||||
else:
|
||||
form = HelpForm(self, ':/help.html')
|
||||
form.show()
|
||||
@ -4023,13 +4005,13 @@ class Project(object):
|
||||
return project
|
||||
|
||||
|
||||
class getExistingDirectories(QFileDialog):
|
||||
class GetExistingDirectories(QFileDialog):
|
||||
'''
|
||||
File dialog with possibility to select multiple folders.
|
||||
'''
|
||||
|
||||
def __init__(self, *args):
|
||||
super(getExistingDirectories, self).__init__(*args)
|
||||
super(GetExistingDirectories, self).__init__(*args)
|
||||
self.setOption(self.DontUseNativeDialog, True)
|
||||
self.setOption(self.ReadOnly, True)
|
||||
self.setFileMode(self.Directory)
|
||||
@ -4055,16 +4037,7 @@ def create_window():
|
||||
return app, app_created
|
||||
|
||||
|
||||
def main(args=None):
|
||||
project_filename = None
|
||||
# args.project_filename = 'C:/Shared/AlpArray/alparray_data/project_alparray_test.plp'
|
||||
pylot_infile = None
|
||||
if args:
|
||||
if args.project_filename:
|
||||
project_filename = args.project_filename
|
||||
if args.input_filename:
|
||||
pylot_infile = args.input_filename
|
||||
reset_qsettings = args.reset_qsettings
|
||||
def main(project_filename=None, pylot_infile=None, reset_qsettings=False):
|
||||
|
||||
# create the Qt application
|
||||
pylot_app, app_created = create_window()
|
||||
@ -4113,4 +4086,5 @@ if __name__ == "__main__":
|
||||
parser.add_argument('--reset_qsettings', default=False, action='store_true',
|
||||
help='reset qsettings (debug option)')
|
||||
args = parser.parse_args()
|
||||
sys.exit(main(args))
|
||||
sys.exit(main(project_filename=args.project_filename, pylot_infile=args.input_filename,
|
||||
reset_qsettings=args.reset_qsettings))
|
||||
|
@ -260,6 +260,10 @@ class Data(object):
|
||||
can be a str or a list of strings of ['manual', 'auto', 'origin', 'magnitude']
|
||||
"""
|
||||
from pylot.core.util.defaults import OUTPUTFORMATS
|
||||
import sys
|
||||
|
||||
sys.stdout = sys.__stdout__
|
||||
print ( fnext )
|
||||
|
||||
if not type(fcheck) == list:
|
||||
fcheck = [fcheck]
|
||||
@ -327,20 +331,31 @@ class Data(object):
|
||||
for j in range(len(picks)):
|
||||
for i in range(len(picks_copy)):
|
||||
if picks_copy[i].phase_hint[0] == 'P':
|
||||
if (picks_copy[i].time_errors['upper_uncertainty'] >= upperErrors[0]) or \
|
||||
(picks_copy[i].time_errors['uncertainty'] is None):
|
||||
print(picks_copy[i].time_errors)
|
||||
|
||||
# Testing if exporting works without upper_uncertatinty
|
||||
if picks_copy[i].time_errors['upper_uncertainty'] is None:
|
||||
break
|
||||
|
||||
if (picks_copy[i].time_errors['uncertainty'] is None) or \
|
||||
(picks_copy[i].time_errors['upper_uncertainty'] >= upperErrors[0]):
|
||||
print("Uncertainty exceeds or equal adjusted upper time error!")
|
||||
print("Adjusted uncertainty: {}".format(upperErrors[0]))
|
||||
print("Pick uncertainty: {}".format(picks_copy[i].time_errors['uncertainty']))
|
||||
print("{1} P-Pick of station {0} will not be saved in outputfile".format(
|
||||
picks_copy[i].waveform_id.station_code,
|
||||
picks_copy[i].method_id))
|
||||
print("#")
|
||||
print("#######")
|
||||
del picks_copy[i]
|
||||
break
|
||||
if picks_copy[i].phase_hint[0] == 'S':
|
||||
if (picks_copy[i].time_errors['upper_uncertainty'] >= upperErrors[1]) or \
|
||||
(picks_copy[i].time_errors['uncertainty'] is None):
|
||||
|
||||
# Testing if exporting works without upper_uncertatinty
|
||||
if picks_copy[i].time_errors['upper_uncertainty'] is None:
|
||||
break
|
||||
|
||||
if (picks_copy[i].time_errors['uncertainty'] is None) or \
|
||||
(picks_copy[i].time_errors['upper_uncertainty'] >= upperErrors[1]):
|
||||
print("Uncertainty exceeds or equal adjusted upper time error!")
|
||||
print("Adjusted uncertainty: {}".format(upperErrors[1]))
|
||||
print("Pick uncertainty: {}".format(picks_copy[i].time_errors['uncertainty']))
|
||||
@ -773,9 +788,12 @@ class GenericDataStructure(object):
|
||||
"""
|
||||
expandList = []
|
||||
for item in self.getExpandFields():
|
||||
print ( item )
|
||||
expandList.append(self.getFieldValue(item))
|
||||
if self.hasSuffix():
|
||||
expandList.append('*%s' % self.getFieldValue('suffix'))
|
||||
print ( expandList )
|
||||
print ( self.getFields() )
|
||||
return os.path.join(*expandList)
|
||||
|
||||
def getCatalogName(self):
|
||||
|
@ -517,7 +517,7 @@ def writephases(arrivals, fformat, filename, parameter=None, eventinfo=None):
|
||||
arrivals = chooseArrivals(arrivals) # MP MP what is chooseArrivals? It is not defined anywhere
|
||||
for key in arrivals:
|
||||
# P onsets
|
||||
if arrivals[key].has_key('P'):
|
||||
if 'P' in arrivals[key]:
|
||||
try:
|
||||
fm = arrivals[key]['P']['fm']
|
||||
except KeyError as e:
|
||||
@ -551,7 +551,7 @@ def writephases(arrivals, fformat, filename, parameter=None, eventinfo=None):
|
||||
ss_ms,
|
||||
pweight))
|
||||
# S onsets
|
||||
if arrivals[key].has_key('S') and arrivals[key]['S']['mpp'] is not None:
|
||||
if 'S' in arrivals[key] and arrivals[key]['S']['mpp'] is not None:
|
||||
fm = '?'
|
||||
onset = arrivals[key]['S']['mpp']
|
||||
year = onset.year
|
||||
@ -670,7 +670,7 @@ def writephases(arrivals, fformat, filename, parameter=None, eventinfo=None):
|
||||
arrivals = chooseArrivals(arrivals) # MP MP what is chooseArrivals? It is not defined anywhere
|
||||
for key in arrivals:
|
||||
# P onsets
|
||||
if arrivals[key].has_key('P') and arrivals[key]['P']['mpp'] is not None:
|
||||
if 'P' in arrivals[key] and arrivals[key]['P']['mpp'] is not None:
|
||||
if arrivals[key]['P']['weight'] < 4:
|
||||
Ponset = arrivals[key]['P']['mpp']
|
||||
pyear = Ponset.year
|
||||
@ -699,7 +699,7 @@ def writephases(arrivals, fformat, filename, parameter=None, eventinfo=None):
|
||||
fid.write('%-5s P1 %4.0f %02d %02d %02d %02d %05.02f %5.3f -999. 0.00 -999. 0.00\n'
|
||||
% (key, pyear, pmonth, pday, phh, pmm, Pss, pstd))
|
||||
# S onsets
|
||||
if arrivals[key].has_key('S') and arrivals[key]['S']['mpp'] is not None:
|
||||
if 'S' in arrivals[key] and arrivals[key]['S']['mpp'] is not None:
|
||||
if arrivals[key]['S']['weight'] < 4:
|
||||
Sonset = arrivals[key]['S']['mpp']
|
||||
syear = Sonset.year
|
||||
@ -768,7 +768,7 @@ def writephases(arrivals, fformat, filename, parameter=None, eventinfo=None):
|
||||
usedarrivals = chooseArrivals(arrivals)
|
||||
for key in usedarrivals:
|
||||
# P onsets
|
||||
if usedarrivals[key].has_key('P'):
|
||||
if 'P' in usedarrivals[key]:
|
||||
if usedarrivals[key]['P']['weight'] < 4:
|
||||
n += 1
|
||||
stat = key
|
||||
@ -782,7 +782,7 @@ def writephases(arrivals, fformat, filename, parameter=None, eventinfo=None):
|
||||
else:
|
||||
fid.write('%-4sP%d%6.2f\n' % (stat, Pweight, Prt))
|
||||
# S onsets
|
||||
if usedarrivals[key].has_key('S'):
|
||||
if 'S' in usedarrivals[key]:
|
||||
if usedarrivals[key]['S']['weight'] < 4:
|
||||
n += 1
|
||||
stat = key
|
||||
@ -828,13 +828,13 @@ def writephases(arrivals, fformat, filename, parameter=None, eventinfo=None):
|
||||
# prefer manual picks
|
||||
usedarrivals = chooseArrivals(arrivals)
|
||||
for key in usedarrivals:
|
||||
if usedarrivals[key].has_key('P'):
|
||||
if 'P' in usedarrivals[key]:
|
||||
# P onsets
|
||||
if usedarrivals[key]['P']['weight'] < 4:
|
||||
Ponset = usedarrivals[key]['P']['mpp']
|
||||
Prt = Ponset - stime # onset time relative to source time
|
||||
fid.write('%s %6.3f 1 P\n' % (key, Prt))
|
||||
if usedarrivals[key].has_key('S'):
|
||||
if 'S' in usedarrivals[key]:
|
||||
# S onsets
|
||||
if usedarrivals[key]['S']['weight'] < 4:
|
||||
Sonset = usedarrivals[key]['S']['mpp']
|
||||
@ -879,7 +879,7 @@ def writephases(arrivals, fformat, filename, parameter=None, eventinfo=None):
|
||||
# prefer manual picks
|
||||
usedarrivals = chooseArrivals(arrivals)
|
||||
for key in usedarrivals:
|
||||
if usedarrivals[key].has_key('P'):
|
||||
if 'P' in usedarrivals[key]:
|
||||
if usedarrivals[key]['P']['weight'] < 4 and usedarrivals[key]['P']['fm'] is not None:
|
||||
stat = key
|
||||
for i in range(len(picks)):
|
||||
@ -961,7 +961,7 @@ def writephases(arrivals, fformat, filename, parameter=None, eventinfo=None):
|
||||
arrivals = chooseArrivals(arrivals) # MP MP what is chooseArrivals? It is not defined anywhere
|
||||
# write phase lines
|
||||
for key in arrivals:
|
||||
if arrivals[key].has_key('P'):
|
||||
if 'P' in arrivals[key]:
|
||||
if arrivals[key]['P']['weight'] < 4 and arrivals[key]['P']['fm'] is not None:
|
||||
stat = key
|
||||
ccode = arrivals[key]['P']['channel']
|
||||
|
@ -26,9 +26,7 @@ elif system_name == "Windows":
|
||||
# suffix for phase name if not phase identified by last letter (P, p, etc.)
|
||||
ALTSUFFIX = ['diff', 'n', 'g', '1', '2', '3']
|
||||
|
||||
FILTERDEFAULTS = readDefaultFilterInformation(os.path.join(os.path.expanduser('~'),
|
||||
'.pylot',
|
||||
'pylot.in'))
|
||||
FILTERDEFAULTS = readDefaultFilterInformation()
|
||||
|
||||
TIMEERROR_DEFAULTS = os.path.join(os.path.expanduser('~'),
|
||||
'.pylot',
|
||||
|
@ -37,15 +37,14 @@ def getAutoFilteroptions(phase, parameter):
|
||||
return filteroptions
|
||||
|
||||
|
||||
def readDefaultFilterInformation(fname):
|
||||
def readDefaultFilterInformation():
|
||||
"""
|
||||
Read default filter information from pylot.in file
|
||||
:param fname: path to pylot.in file
|
||||
:type fname: str
|
||||
:return: dictionary containing the defailt filter information
|
||||
:rtype: dict
|
||||
"""
|
||||
pparam = PylotParameter(fname)
|
||||
pparam = PylotParameter()
|
||||
pparam.reset_defaults()
|
||||
return readFilterInformation(pparam)
|
||||
|
||||
|
||||
|
@ -5663,9 +5663,49 @@ class ChooseWaveFormWindow(QWidget):
|
||||
def submit(self):
|
||||
matplotlib.pyplot.close(self.currentSpectro)
|
||||
t = self.chooseBoxTraces.currentText() + " " + self.chooseBoxComponent.currentText()
|
||||
self.currentSpectro = self.traces[
|
||||
self.chooseBoxTraces.currentText()[3:]][self.chooseBoxComponent.currentText()].spectrogram(show=False, title=t)
|
||||
self.currentSpectro.show()
|
||||
#self.currentSpectro = self.traces[
|
||||
# self.chooseBoxTraces.currentText()[3:]][self.chooseBoxComponent.currentText()].spectrogram(show=False, title=t)
|
||||
#self.currentSpectro.show()
|
||||
applyFFT()
|
||||
|
||||
def applyFFT(self, trace):
|
||||
sys.stdout = sys.__stdout__
|
||||
tra = self.traces[self.chooseBoxTraces.currentText()[3:]]['Z']
|
||||
transformed = abs(np.fft.rfft(tra.data))
|
||||
print ( transformed )
|
||||
matplotlib.pyplot.plot ( transformed )
|
||||
matplotlib.pyplot.show()
|
||||
|
||||
def applyFFTs(self, tra):
|
||||
sys.stdout = sys.__stdout__
|
||||
transformed = abs(np.fft.rfft(tra.data))
|
||||
print ( transformed )
|
||||
matplotlib.pyplot.plot ( transformed )
|
||||
matplotlib.pyplot.show()
|
||||
|
||||
|
||||
def applyFFT2(self, trace):
|
||||
sys.stdout = sys.__stdout__
|
||||
tra = self.traces[self.chooseBoxTraces.currentText()[3:]]['Z']
|
||||
from pylot.core.pick.utils import select_for_phase
|
||||
zdat = select_for_phase(tra, "P")
|
||||
freq = zdat[0].stats.sampling_rate
|
||||
# fft
|
||||
fny = freq / 2
|
||||
# l = len(xdat) / freq
|
||||
# number of fft bins after Bath
|
||||
# n = freq * l
|
||||
# find next power of 2 of data length
|
||||
m = pow(2, np.ceil(np.log(len(zdat)) / np.log(2)))
|
||||
N = min(int(np.power(m, 2)), 16384)
|
||||
# N = int(np.power(m, 2))
|
||||
y = dt * np.fft.fft(zdat, N)
|
||||
Y = abs(y[: int(N / 2)])
|
||||
#L = (N - 1) / freq
|
||||
#f = np.arange(0, fny, 1 / L)
|
||||
|
||||
matplotlib.pyplot.plot (Y)
|
||||
matplotlib.pyplot.show()
|
||||
|
||||
def submitN(self):
|
||||
matplotlib.pyplot.close(self.currentSpectro)
|
||||
@ -5674,19 +5714,53 @@ class ChooseWaveFormWindow(QWidget):
|
||||
self.chooseBoxTraces.currentText()[3:]]['N'].spectrogram(show=False, title=t)
|
||||
self.currentSpectro.show()
|
||||
|
||||
def submitE(self):
|
||||
def submitE2(self):
|
||||
matplotlib.pyplot.close(self.currentSpectro)
|
||||
t = self.chooseBoxTraces.currentText() + " " + self.chooseBoxComponent.currentText()
|
||||
self.currentSpectro = self.traces[
|
||||
self.chooseBoxTraces.currentText()[3:]]['E'].spectrogram(show=False, title=t)
|
||||
self.currentSpectro.show()
|
||||
|
||||
def submitE(self):
|
||||
sys.stdout = sys.__stdout__
|
||||
matplotlib.pyplot.close(self.currentSpectro)
|
||||
#t = self.chooseBoxTraces.currentText() + " " + self.chooseBoxComponent.currentText()
|
||||
#self.currentSpectro = self.traces[
|
||||
# self.chooseBoxTraces.currentText()[3:]]['Z'].spectrogram(show=False, title=t)
|
||||
#self.currentSpectro.show()
|
||||
#self.applyFFT('s')
|
||||
i = 0
|
||||
|
||||
figure, axis = matplotlib.pyplot.subplots(len(self.traces), sharex=True)
|
||||
for t in self.traces:
|
||||
tra = self.traces[t]['Z']
|
||||
transformed = abs(np.fft.rfft(tra.data))
|
||||
axis[i].plot(transformed, label = t)
|
||||
#axis[i].tick_params(labelbottom=False)
|
||||
axis[i].spines['top'].set_visible(False)
|
||||
axis[i].spines['right'].set_visible(False)
|
||||
axis[i].spines['left'].set_visible(False)
|
||||
if not (len(self.traces) == i - 1) :
|
||||
axis[i].spines['bottom'].set_visible(False)
|
||||
axis[i].set_yticks([])
|
||||
axis[i].set_ylabel(t,loc='center', rotation='horizontal')
|
||||
#axis[i].axis('off')
|
||||
i += 1
|
||||
#self.applyFFTs(t)
|
||||
|
||||
matplotlib.pyplot.margins(0)
|
||||
return FigureCanvas(figure)
|
||||
#return figure, axis
|
||||
matplotlib.pyplot.show()
|
||||
|
||||
def submitZ(self):
|
||||
matplotlib.pyplot.close(self.currentSpectro)
|
||||
t = self.chooseBoxTraces.currentText() + " " + self.chooseBoxComponent.currentText()
|
||||
self.currentSpectro = self.traces[
|
||||
self.chooseBoxTraces.currentText()[3:]]['Z'].spectrogram(show=False, title=t)
|
||||
self.currentSpectro.show()
|
||||
#t = self.chooseBoxTraces.currentText() + " " + self.chooseBoxComponent.currentText()
|
||||
#self.currentSpectro = self.traces[
|
||||
# self.chooseBoxTraces.currentText()[3:]]['Z'].spectrogram(show=False, title=t)
|
||||
#self.currentSpectro.show()
|
||||
self.applyFFT2('s')
|
||||
|
||||
|
||||
# Creates a QComboBox and adds all traces provided
|
||||
def createComboBoxTraces(self):
|
||||
@ -5717,4 +5791,4 @@ class ChooseWaveFormWindow(QWidget):
|
||||
if __name__ == '__main__':
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
||||
doctest.testmod()
|
||||
|
Loading…
Reference in New Issue
Block a user