Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • software_public/passoft/sohstationviewer
1 result
Show changes
Commits on Source (8)
......@@ -109,7 +109,7 @@ class DataTypeModel():
'read': file has been read or not - bool
}]
}
'read_data': {
'readData': {
chan_id - str: {
'samplerate': Sample rate of the data - float
'tracesInfo': [{
......
......@@ -397,11 +397,10 @@ def sort_data(data_dict: Dict) -> None:
Sort data in 'traces_info' in 'startTmEpoch' order
:param data_dict: DataTypeModel.__init__.waveform_data
"""
for sta_id in data_dict:
for chan_id in data_dict[sta_id]['readData']:
traces_info = data_dict[sta_id]['readData'][chan_id]['tracesInfo']
traces_info = sorted(
traces_info, key=lambda i: i['startTmEpoch'])
for chan_id in data_dict:
traces_info = data_dict[chan_id]['tracesInfo']
data_dict[chan_id]['tracesInfo'] = sorted(
traces_info, key=lambda i: i['startTmEpoch'])
def squash_gaps(gaps: List[List[float]]) -> List[List[float]]:
......
......@@ -6,7 +6,7 @@ from struct import unpack
class ReadBlocketteError(Exception):
def __init__(self, errno, msg):
def __init__(self, msg):
self.msg = msg
......@@ -29,7 +29,7 @@ def read_next_blkt(b_no, data_bytes, byte_order):
try:
# readBlkt will skip first 4 bytes (HH) as they are already read
info = eval("readBlkt%s(%s, %s, '%s')"
info = eval("read_blkt_%s(%s, %s, '%s')"
% (blockette_type, b_no, data_bytes, byte_order))
except NameError:
raise ReadBlocketteError(f"Function to read blockette {blockette_type}"
......
......@@ -309,4 +309,4 @@ class MSeed(DataTypeModel):
self.track_info(
f'Read {count} waveform files', LogType.INFO)
sort_data(self.waveform_data)
sort_data(self.waveformData[sta_id]['readData'])
......@@ -135,7 +135,7 @@ class RT130(DataTypeModel):
if count % 50 == 0:
self.track_info(
f'Read {count} waveform files', LogType.INFO)
sort_data(self.waveform_data)
sort_data(self.waveformData[key]['readData'])
def add_log(self, chan_pkt, log_info):
if chan_pkt not in self.log_data[self.cur_key].keys():
......
......@@ -3,12 +3,12 @@ import pathlib
import shutil
import traceback
from datetime import datetime
from typing import List
from copy import deepcopy
from pathlib import Path
from PySide2 import QtCore, QtWidgets, QtGui
from sohstationviewer.controller.util import display_tracking_info
from sohstationviewer.model.data_loader import DataLoader
from sohstationviewer.model.data_type_model import DataTypeModel
......@@ -31,6 +31,7 @@ from sohstationviewer.view.util.enums import LogType
from sohstationviewer.view.channel_prefer_dialog import ChannelPreferDialog
from sohstationviewer.controller.processing import detect_data_type
from sohstationviewer.controller.util import display_tracking_info
from sohstationviewer.database.process_db import execute_db_dict, execute_db
......@@ -55,6 +56,10 @@ class MainWindow(QtWidgets.QMainWindow, UIMainWindow):
self.data_loader = DataLoader()
self.data_loader.finished.connect(self.replot_loaded_data)
"""
forms_in_forms_menu: List of forms in forms_menu
"""
self.forms_in_forms_menu: List[QtWidgets.QWidget] = []
"""
req_soh_chans: [str,] - list of State-Of-Health channels to read data
from. For Reftek, the list of channels is fixed => may not need
......@@ -221,7 +226,7 @@ class MainWindow(QtWidgets.QMainWindow, UIMainWindow):
self.curr_soh_ids_name_line_edit.setText('')
@QtCore.Slot()
def set_date_format(self, display_format):
def set_date_format(self, display_format: str):
"""
Sets the calendar format used by the QDateEdit text boxes.
:param display_format: str - A valid display format to be used for date
......@@ -232,7 +237,7 @@ class MainWindow(QtWidgets.QMainWindow, UIMainWindow):
self.date_format = display_format
@QtCore.Slot()
def open_files_list_item_double_clicked(self, item):
def open_files_list_item_double_clicked(self, item: FileListItem):
"""
Handles the double-click event emitted when a user double-clicks on an
item contained within openFilesList
......@@ -275,6 +280,7 @@ class MainWindow(QtWidgets.QMainWindow, UIMainWindow):
try:
del self.data_object
self.clear_actions_from_forms_menu()
except AttributeError:
pass
......@@ -449,6 +455,7 @@ class MainWindow(QtWidgets.QMainWindow, UIMainWindow):
self.start_tm, self.end_tm, sel_key,
do.data_time[sel_key],
wf_data)
self.add_action_to_forms_menu('TPS Plot', self.tps_dlg)
else:
self.tps_dlg.hide()
......@@ -463,6 +470,7 @@ class MainWindow(QtWidgets.QMainWindow, UIMainWindow):
self.start_tm, self.end_tm, sel_key,
do.data_time[sel_key], time_tick_total,
wf_data, mp_data)
self.add_action_to_forms_menu('Raw Data Plot', self.waveform_dlg)
else:
self.waveform_dlg.hide()
......@@ -478,6 +486,8 @@ class MainWindow(QtWidgets.QMainWindow, UIMainWindow):
self.search_message_dialog.setup_logview(
sel_key, do.log_data, processing_log)
self.search_message_dialog.show()
self.add_action_to_forms_menu('Search Messages',
self.search_message_dialog)
@QtCore.Slot()
def reset_flags(self):
......@@ -492,7 +502,7 @@ class MainWindow(QtWidgets.QMainWindow, UIMainWindow):
self.is_plotting_tps = False
self.is_stopping = False
def set_current_directory(self, path=''):
def set_current_directory(self, path: str = '') -> None:
"""
Update currentDirectory with path in DB table PersistentData.
Set all directories under current directory to self.open_files_list.
......@@ -565,7 +575,11 @@ class MainWindow(QtWidgets.QMainWindow, UIMainWindow):
self.data_loader.thread.quit()
self.data_loader.thread.wait()
def delete_old_temp_data_folder(self):
def delete_old_temp_data_folder(self) -> None:
"""
Delete temp_data_folder which is used for keeping memmap files in case
SOHView wasn't closed correctly.
"""
rows = execute_db(
'SELECT FieldValue FROM PersistentData '
'WHERE FieldName="tempDataDirectory"')
......@@ -578,3 +592,44 @@ class MainWindow(QtWidgets.QMainWindow, UIMainWindow):
)
except (FileNotFoundError, TypeError):
pass
def add_action_to_forms_menu(
self, form_name: str, form: QtWidgets.QWidget) -> None:
"""
Creating and adding an action to forms_menu, connect to function
raise_form() to help opening and raising the form on top of
others when triggering the action.
Adding the form into forms_in_forms_menu to handle closing it when
loading new data set.
:param form_name: name of form that will be shown in forms_menu
:type form_name: str
:param form: QtWidget
:type form: QtWidgets.QWidget
"""
if not isinstance(form, QtWidgets.QWidget):
print(f"DEVELOPING ERROR: Type of form must be 'QWidget' instead "
f"of '{form.__class__.__name__}'")
if form not in self.forms_in_forms_menu:
action = QtWidgets.QAction(form_name, self)
self.forms_menu.addAction(action)
action.triggered.connect(lambda: self.raise_form(form))
self.forms_in_forms_menu.append(form)
self.forms_menu.removeAction(self.no_forms_action)
def clear_actions_from_forms_menu(self) -> None:
"""
Remove all actions from forms_menu.
Close all forms related to forms_menu.
Add no_forms_action to let user know that there are no forms available.
"""
self.forms_menu.clear() # remove all actions
for i in range(len(self.forms_in_forms_menu) - 1, -1, -1):
form = self.forms_in_forms_menu.pop(i)
form.close()
self.forms_menu.addAction(self.no_forms_action)
@QtCore.Slot(QtWidgets.QWidget)
def raise_form(self, form: QtWidgets.QWidget) -> None:
form.show() # in case form has been closed
form.raise_() # to raise form on top of others
......@@ -309,15 +309,22 @@ class PlottingWidget(QtWidgets.QScrollArea):
When click mouse on the current plottingWidget, SOHView will loop
through different plottingWidgets to do the same task for
interaction:
+ shift+click: call on_shift_click() to do zooming
+ shift+click: call on_shift_click() to do zooming. This is
disregarded in TimePowerSquareWidget because it isn't subjected
to be zoomed in.
+ ctrl+click or cmd+click in mac: call on_ctrl_cmd_click() to show
ruler
:param event: button_press_event - mouse click event
"""
modifiers = event.guiEvent.modifiers()
if (modifiers == QtCore.Qt.ShiftModifier and
self.name == "timepowersquaredwidget"):
# not start zooming from TimePowerSquareWidget
return
try:
# on_pick() take place after on_pick_on_artist where
# on_button_press_event() take place after on_pick_event where
# tps_t was assigned in TimePowerSquareWidget
xdata = self.tps_t
except AttributeError:
......
......@@ -188,11 +188,16 @@ class UIMainWindow(object):
self.info_list_widget = None
# ========================= Menus =============================
"""
form_menu: QMenu - to show all of the current open windows so that
user can select to put a window on top of all others when need to
look for that.
forms_menu: QMenu - to show all of the current available dialogs so
that user can select a dialog to put it on top of others to even
if the dialog has been closed by user.
"""
self.form_menu = None
self.forms_menu = None
"""
no_forms_action: QAction - to show in forms_menu when there are no
dialogs available to let user know about that
"""
self.no_forms_action = None
"""
exit_action: QAction - to exit SOHView
"""
......@@ -519,8 +524,9 @@ class UIMainWindow(object):
file_menu = main_menu.addMenu("File")
command_menu = main_menu.addMenu("Commands")
option_menu = main_menu.addMenu("Options")
self.form_menu = main_menu.addMenu("Forms")
database_menu = main_menu.addMenu("Database")
self.forms_menu = main_menu.addMenu("Forms")
help_menu = main_menu.addMenu("Help")
# exitAction = QtWidgets.QAction(QtGui.QIcon('exit.png'), "Exit", self)
......@@ -528,8 +534,8 @@ class UIMainWindow(object):
self.create_file_menu(main_window, file_menu)
self.create_command_menu(main_window, command_menu)
self.create_option_menu(main_window, option_menu)
self.create_database_menu(main_window, database_menu)
self.create_forms_menu(main_window, self.forms_menu)
self.create_help_menu(main_window, help_menu)
def create_file_menu(self, main_window, menu):
......@@ -638,6 +644,12 @@ class UIMainWindow(object):
self.doc_action = QtWidgets.QAction('Documentation', main_window)
menu.addAction(self.doc_action)
def create_forms_menu(self, main_window, menu):
self.no_forms_action = QtWidgets.QAction(
"No Forms Are Open", main_window)
menu.addAction(self.no_forms_action)
self.no_forms_action.setEnabled(False)
def connect_signals(self, main_window):
"""
Connect widgets what they do
......@@ -685,7 +697,7 @@ class UIMainWindow(object):
# Help
self.calendar_action.triggered.connect(main_window.open_calendar)
self.doc_action.triggered.connect(self.open_help_browser)
self.doc_action.triggered.connect(main_window.open_help_browser)
def connect_widget_signals(self, main_window):
main_window.current_directory_changed.connect(
......
from unittest import TestCase
from sohstationviewer.model.handling_data import (
sort_data
)
class TestSortData(TestCase):
def setUp(self) -> None:
self.data_dict = {'CH1': {'tracesInfo': [{'startTmEpoch': 7},
{'startTmEpoch': 1},
{'startTmEpoch': 5},
{'startTmEpoch': 3}]},
'CH2': {'tracesInfo': [{'startTmEpoch': 2},
{'startTmEpoch': 8},
{'startTmEpoch': 6},
{'startTmEpoch': 4}]}
}
def test_sort_data(self):
sort_data(self.data_dict)
self.assertEqual(
self.data_dict,
{'CH1': {'tracesInfo': [{'startTmEpoch': 1}, {'startTmEpoch': 3},
{'startTmEpoch': 5}, {'startTmEpoch': 7}]},
'CH2': {'tracesInfo': [{'startTmEpoch': 2}, {'startTmEpoch': 4},
{'startTmEpoch': 6}, {'startTmEpoch': 8}]}}
)